阅读:2164回复:19
KeWaitForSingleObject
NTSTATUS SfReadCompletion(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp, IN PVOID Context) { PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp); UNREFERENCED_PARAMETER( Context ); UNREFERENCED_PARAMETER( DeviceObject ); ASSERT(IS_MY_DEVICE_OBJECT( DeviceObject )); KeSetEvent((PKEVENT)Context, IO_NO_INCREMENT, FALSE); return STATUS_MORE_PROCESSING_REQUIRED; //如果换成 return STATUS_SUCCESS;在输入密码完成后,进如系统时重起 }; NTSTATUS SfRead(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { PIO_STACK_LOCATION irpsp = IoGetCurrentIrpStackLocation(Irp); PFILE_OBJECT file_object = irpsp->FileObject; PSFILTER_DEVICE_EXTENSION devExt = DeviceObject->DeviceExtension; NTSTATUS Status = STATUS_SUCCESS; ULONG IsFile = 0; KEVENT waitEvent; PAGED_CODE(); // 对控制设备的操作,返回成功? if (IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject)) { Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; IoCompleteRequest( Irp, IO_NO_INCREMENT ); return STATUS_SUCCESS;; } // 对文件系统其他设备的操作,passthru. if (!devExt->StorageStackDeviceObject) { IoSkipCurrentIrpStackLocation(Irp); return IoCallDriver(devExt->AttachedToDeviceObject, Irp); } if (!(Irp->Flags & (IRP_NOCACHE | IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO))) { IoSkipCurrentIrpStackLocation(Irp); return IoCallDriver(devExt->AttachedToDeviceObject, Irp); } KeInitializeEvent( &waitEvent, NotificationEvent, FALSE ); IoCopyCurrentIrpStackLocationToNext ( Irp ); IoSetCompletionRoutine( Irp, SfReadCompletion, &waitEvent , TRUE, TRUE, TRUE ); Status = IoCallDriver( devExt->AttachedToDeviceObject, Irp ); if (STATUS_PENDING == Status) { Status = KeWaitForSingleObject( &waitEvent, Executive, KernelMode, FALSE, NULL ); ASSERT( STATUS_SUCCESS == Status ); } return Status; }; 编译环境:Windows IFS Kit and DDK 3790 Windows 2000 Free Build Environment 运行环境:Win2000 Professional Sp4 症状:在登陆截面的时候,就是出现Win2k的画面时,进度条走到大概3/4的时候就停了,一直不动了 但这个在xp下又没有问题 请问是怎么回事啊? 先谢谢大家啦! |
|
沙发#
发布于:2007-07-04 13:20
用了IoSetCompletionRoutine这个,还需要设置completerequest么?
|
|
板凳#
发布于:2007-07-04 13:52
不对吧,加了之后,BugChk
MULTIPLE_IRP_COMPLETE_REQUEST |
|
地板#
发布于:2007-07-04 14:07
NTSTATUS SfRead(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{ PIO_STACK_LOCATION irpsp = IoGetCurrentIrpStackLocation(Irp); PFILE_OBJECT file_object = irpsp->FileObject; PSFILTER_DEVICE_EXTENSION devExt = DeviceObject->DeviceExtension; NTSTATUS Status = STATUS_SUCCESS; ULONG IsFile = 0; KEVENT waitEvent; PAGED_CODE(); // 对控制设备的操作,返回成功? if (IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject)) { Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; IoCompleteRequest( Irp, IO_NO_INCREMENT ); return STATUS_SUCCESS;; } // 对文件系统其他设备的操作,passthru. if (!devExt->StorageStackDeviceObject) { IoSkipCurrentIrpStackLocation(Irp); return IoCallDriver(devExt->AttachedToDeviceObject, Irp); } if (!(Irp->Flags & (IRP_NOCACHE | IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO))) { IoSkipCurrentIrpStackLocation(Irp); return IoCallDriver(devExt->AttachedToDeviceObject, Irp); } KeInitializeEvent( &waitEvent, NotificationEvent, FALSE ); IoCopyCurrentIrpStackLocationToNext ( Irp ); IoSetCompletionRoutine( Irp, SfReadCompletion, &waitEvent , TRUE, TRUE, TRUE ); Status = IoCallDriver( devExt->AttachedToDeviceObject, Irp ); if (STATUS_PENDING == Status) { Status = KeWaitForSingleObject( &waitEvent, Executive, KernelMode, FALSE, NULL ); ASSERT( STATUS_SUCCESS == Status ); } //加了3句话 Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; IoCompleteRequest( Irp, IO_NO_INCREMENT ); return Status; }; |
|
地下室#
发布于:2007-07-04 14:09
我用sfilter改的
|
|
5楼#
发布于:2007-07-04 14:28
没有效果....同样在输入密码完成后,系统重起
NTSTATUS SfReadCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context) { PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp); UNREFERENCED_PARAMETER( DeviceObject ); ASSERT(IS_MY_DEVICE_OBJECT( DeviceObject )); if(Context) KeSetEvent((PKEVENT)Context, IO_NO_INCREMENT, FALSE); return STATUS_SUCCESS; }; NTSTATUS SfRead(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { PIO_STACK_LOCATION irpsp = IoGetCurrentIrpStackLocation(Irp); PFILE_OBJECT file_object = irpsp->FileObject; PSFILTER_DEVICE_EXTENSION devExt = DeviceObject->DeviceExtension; NTSTATUS Status = STATUS_SUCCESS; ULONG IsFile = 0; KEVENT waitEvent; PAGED_CODE(); // 对控制设备的操作,返回成功? if (IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject)) { Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; IoCompleteRequest( Irp, IO_NO_INCREMENT ); return STATUS_SUCCESS;; } // 对文件系统其他设备的操作,passthru. if (!devExt->StorageStackDeviceObject) { IoSkipCurrentIrpStackLocation(Irp); return IoCallDriver(devExt->AttachedToDeviceObject, Irp); } if (!(Irp->Flags & (IRP_NOCACHE | IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO))) { IoSkipCurrentIrpStackLocation(Irp); return IoCallDriver(devExt->AttachedToDeviceObject, Irp); } KeInitializeEvent( &waitEvent, NotificationEvent, FALSE ); IoCopyCurrentIrpStackLocationToNext ( Irp ); IoSetCompletionRoutine( Irp, SfReadCompletion, &waitEvent , TRUE, TRUE, TRUE ); Status = IoCallDriver( devExt->AttachedToDeviceObject, Irp ); if (STATUS_PENDING == Status) { Status = KeWaitForSingleObject( &waitEvent, Executive, KernelMode, FALSE, NULL ); ASSERT( STATUS_SUCCESS == Status ); } return Status; }; |
|
6楼#
发布于:2007-07-04 14:42
安全模式下,又冒似没有问题,驱动正常
|
|
7楼#
发布于:2007-07-05 10:55
大哥些,进来看下嘛
|
|