阅读:1903回复:3
重新构建Irp去磁盘读数据块在驱动的读回调里面停住了, 请有经验的大侠指点
我写了一个从磁盘读取数据的函数, 这个函数在DeviceIoControl里面读取磁盘数据没问题, 但是在Read回调里面读的时候就会hung, 不知道怎么回事? 我在网上看有人遇到类似的问题, 但是好像没有解决...
程序会hung在KeWaitForSingleObject 那里, 偶尔能成功那么一回, 但是多读几次必然hung 我看了read 回调的irql是 APC_LEVEL 级别的. 请大侠们指点一下, 先谢了. 下面是代码 NTSTATUS RawReadDisk( IN PDEVICE_OBJECT DeviceObject, OUT CHAR *pBuffer, IN ULONGLONG Offset, IN ULONG ToReadLen, OUT ULONG* pReadedLen ) { KEVENT Event; NTSTATUS status; PIRP irp; IO_STATUS_BLOCK ioStatusBlock; PIO_STACK_LOCATION irpStack; PDEVICE_RELATIONS deviceRelations; LARGE_INTEGER StartOffset; StartOffset.QuadPart = Offset; KeInitializeEvent( &Event, NotificationEvent, FALSE ); irp = IoBuildSynchronousFsdRequest( IRP_MJ_READ, DeviceObject, pBuffer, ToReadLen, &StartOffset, &Event, &ioStatusBlock ); if (irp == NULL) { status = STATUS_INSUFFICIENT_RESOURCES; goto End; } irp->IoStatus.Status = STATUS_SUCCESS ; status = IoCallDriver( DeviceObject, irp ); if (status == STATUS_PENDING) { KeWaitForSingleObject( &Event, Executive, KernelMode, FALSE, NULL ); status = ioStatusBlock.Status; } *pReadedLen = ioStatusBlock.Information; End: return status; } |
|
|
沙发#
发布于:2013-01-10 10:09
IRP_MJ_CREATE时会创建FileObject, 直接读写还没有创建FileObject
|
|
板凳#
发布于:2013-01-10 15:44
回 co63oc 的帖子
co63oc:IRP_MJ_CREATE时会创建FileObject, 直接读写还没有创建FileObject (2013-01-10 10:09) 谢谢回复. 在这里能有一个回复不容易. 这个问题已经解决了. 原来这个是irql的问题, deviceiocontrol一般是PASSIVE_LEVEL 而读写回调一般都是APC_LEVEL. irql级别高了, 导致irp 在队列里面受阻, 无法下发 因此我这个问题在deviceioctrol里面没问题, 但是读写回调就hung了 解决办法就是判断当前irql, 如果比passive高, 就调低到passive,完了再恢复回去. 我看国内好几个帖子都遇到这个问题而没法解决, 希望我这个帖子对别人能有点用处 |
|
|
地板#
发布于:2013-01-10 15:45
这个问题我是在微软的论坛上得到回复的
|
|
|