阅读:1366回复:5
在AddDevice中构造IRP读取U盘0扇区的问题
问题背景:修改diskperf,开发U盘过滤驱动,想在AddDevice中构造IRP,功能号为IRP_MJ_READ,然后发送此IRP包,读取U盘的0扇区.
问题现象:1.没有蓝屏,但是也得不到想要的结果.读到的数据长度为0(IO_STATUS_BLOCK中information为0). 2.如果在readwrite中发送此IRP包,则可以得到想要的数据. 问题:为甚么会出现这样的现象? 代码: /* Buffer : 存放读取数据的缓冲区. Length : 需要读取的长度.(单位?) */ NTSTATUS TyReadSectorZero(PDEVICE_OBJECT DeviceObject, PVOID Buffer,ULONG Length) { KEVENT event; NTSTATUS ntstatus = STATUS_SUCCESS; //初始化事件 KeInitializeEvent(&event, NotificationEvent, FALSE); //取得中断级别,判断是否可用IoBuildSynchronousFsdRequest if(KeGetCurrentIrql() <= APC_LEVEL) { PIRP pReadIrp; LARGE_INTEGER lioffset = {0}; IO_STATUS_BLOCK ioblock = {0}; //调用IoBuildSynchronousFsdRequest构造IRP包,返回值即为指向IRP的指针. pReadIrp = IoBuildSynchronousFsdRequest(IRP_MJ_READ, DeviceObject, Buffer, Length, &lioffset, &event, &ioblock); //构造IRP包失败 if(0 == pReadIrp) { KdPrint(("IoBuildSynchronousFsdRequest fail! \n")); goto _end; } //发送IRP ntstatus = IoCallDriver(DeviceObject, pReadIrp); //等待事件 if(STATUS_PENDING == ntstatus) { KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, 0); } if(ioblock.Information == 0) { KdPrint(("ioblock.Information == 0 \n")); goto _end; } KdPrint(("ioblock.Information == 0x%x \n", ioblock.Information)); //函数返回 } _end: return ntstatus; } 大家帮忙看看 多谢! |
|
沙发#
发布于:2008-06-19 16:11
用户被禁言,该主题自动屏蔽! |
|
板凳#
发布于:2008-06-19 16:23
哦 你的意思是AddDevice之后才能读?
|
|
地板#
发布于:2008-06-19 16:32
但是我在AddDevice的最后,清除DO_DEVICE_INITIALIZING标志之后,再读0扇区,还是相同的问题.请大侠指教.多谢了
|
|
地下室#
发布于:2008-06-21 12:32
堆栈 没构造完成,资源还没有分配,肯定不成功的
|
|
|
5楼#
发布于:2008-06-21 14:30
也就是说 必须要AddDevice返回之后,才能发IRP?
|
|