Добрый вечер уважаемые господа.
Возникла задача написать драйвер фильтр для запоминающих устройств , с фильтрами имею дело в первый раз. Ознакомившийся с исходниками filemon и примеров из wdk написал простой фильтр который цепляется к флешке. Все бы вроде хорошо отлавливаю все irp , но при копировании файла на флешку синий экран.При просмотре крэш дампа в отладчике говорится , что ошибка произошла с NtWriteFile .
FAULTING_IP:
nt!NtWriteFile+321
8057970f ff530c call dword ptr [ebx+0Ch]
если надо дамп выложить могу.
Исходный код драйвера.
#include<ntddk.h>
typedef struct _DEVICE_EXTENSION
{
PDEVICE_OBJECT LowerDeviceObject;
} DEVICE_EXTENSION , *PDEVICE_EXTENSION;
NTSTATUS DispatchAny( IN PDEVICE_OBJECT DeviceObject , IN PIRP Irp );
NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject , IN PUNICODE_STRING RegistryPath )
{
HANDLE hDisk;
OBJECT_ATTRIBUTES oa;
PDEVICE_EXTENSION pdx;
PDEVICE_OBJECT pFilter;
PDEVICE_OBJECT pDisk;
PDEVICE_OBJECT fdo;
PFILE_OBJECT pFileObject;
UNICODE_STRING usDisk;
UNICODE_STRING usFilter;
IO_STATUS_BLOCK iosb;
NTSTATUS ns;
int i;
RtlInitUnicodeString( &usDisk , L"\\DosDevices\\E:\\" );
RtlInitUnicodeString( &usFilter , L"\\Device\\sav_filter" );
for( i=0; i<IRP_MJ_MAXIMUM_FUNCTION; i++ )
{
DriverObject->MajorFunction[i] = DispatchAny;
}
InitializeObjectAttributes( &oa , &usDisk , OBJ_CASE_INSENSITIVE , NULL , NULL );
ns = ZwCreateFile( &hDisk ,
SYNCHRONIZE | FILE_ANY_ACCESS ,
&oa ,
&iosb ,
NULL ,
0,
FILE_SHARE_READ | FILE_SHARE_WRITE ,
FILE_OPEN ,
FILE_SYNCHRONOUS_IO_NONALERT | FILE_DIRECTORY_FILE ,
NULL ,
0 );
if( !NT_SUCCESS(ns) )
{
KdPrint((" ZwCreateFile failed with status : %08X\n" , ns ));
return ns;
}
ns = ObReferenceObjectByHandle( hDisk , FILE_READ_DATA , NULL , KernelMode , &pFileObject , NULL );
if( !NT_SUCCESS(ns) )
{
KdPrint(("ObReferenceObjectByHandle failed with status : %08X\n" , ns ));
ZwClose( hDisk );
return ns;
}
pDisk = IoGetRelatedDeviceObject( pFileObject );
if( !pDisk )
{
KdPrint((" IoGetRelatedDeviceObject failed with status : %08X\n" , ns ));
ObDereferenceObject( pFileObject );
ZwClose( hDisk );
return ns;
}
KdPrint((" pDisk object : %08X\n" , pDisk ));
ns = IoCreateDevice( DriverObject , sizeof(*pdx) , &usFilter , FILE_DEVICE_UNKNOWN , 0 , FALSE , &pFilter );
if( !NT_SUCCESS(ns) )
{
KdPrint(("IoCreateDevice failed with status : %08X\n" , ns ));
ObDereferenceObject( pFileObject );
ZwClose( hDisk );
return ns;
}
pdx = (PDEVICE_EXTENSION)pFilter->DeviceExtension;
fdo = IoAttachDeviceToDeviceStack( pFilter , pDisk );
if( !fdo )
{
KdPrint((" IoAttachDeviceToDeviceStack failed with status : %08X\n" , ns ));
ObDereferenceObject( pFileObject );
ZwClose( hDisk );
return STATUS_UNSUCCESSFUL;
}
KdPrint((" fdo object : %08X\n" , fdo ));
pFilter->Flags &= ~DO_DEVICE_INITIALIZING;
pdx->LowerDeviceObject = fdo;
ObDereferenceObject( pFileObject );
ZwClose( hDisk );
return STATUS_SUCCESS;
}
NTSTATUS DispatchAny( IN PDEVICE_OBJECT DeviceObject , IN PIRP Irp )
{
PDEVICE_EXTENSION pdx;
PIO_STACK_LOCATION pStack;
pdx = DeviceObject->DeviceExtension;
pStack = IoGetCurrentIrpStackLocation( Irp );
KdPrint((" In DispatchAny : Irp Type : %X \n" , pStack->MajorFunction));
IoSkipCurrentIrpStackLocation( Irp );
return IoCallDriver( pdx->LowerDeviceObject , Irp );
}
Про сушествовании фаст ио знаю , но пока бы так разобраться.
Заранее спасибо , с уважанием Антон.