Добрый вечер уважаемые господа.
Возникла задача написать драйвер фильтр для запоминающих устройств , с фильтрами имею дело в первый раз. Ознакомившийся с исходниками 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 );
}
Про сушествовании фаст ио знаю , но пока бы так разобраться.
Заранее спасибо , с уважанием Антон.