USB过滤驱动:在OnStartDevice中构造IRP读U盘0扇区的问题

时间:2022-02-25 18:26:20
开发U盘过滤驱动,在OnStartDevice中构造IRP,功能号为IRP_MJ_READ,然后发送此IRP包,读取U盘的0扇区,但是读不到。 

代码: 
    /* 
    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; 


不知问题出在哪里?请高手指点

20 个解决方案

#1


ding

#2


友情up

#3


谢谢!

#4


   看不出问题,可能是读的时机不对,,,
   你是在哪判断是u盘的?

#5


我不需要判断U盘,直接挂usb过滤驱动,在注册表里。
我也不知道哪里不对,可是就是读不出来啊,怎么回事呢?

#6


12r1r1r1r121r

#7


dnfhbrthrerhre

#8


seghergwervwebger

#9


关注中……

#10


帮顶。。

#11


谢谢

#12


帮顶

#13


帮顶

#14


IoCallDriver返回值是什么?
但我怀疑在Start_PNP时,是不能对接受READ请求的

#15


   只能在Read中处理。
   LZ是哪里人?

#16


see see

#17


好久了阿,怎么没大侠解答?不知道楼主解决了没?

#18


通过别的方式解决了,但是没有主动构造irp读好。
而且现在有问题,插入u盘的时候,电脑有时会重启的。不知什么原因。

#19


关注

#20


USB设备的数据读写和控制是基于URB的吧!!!???另外你的过滤驱动是挂在哪里的阿?

#1


ding

#2


友情up

#3


谢谢!

#4


   看不出问题,可能是读的时机不对,,,
   你是在哪判断是u盘的?

#5


我不需要判断U盘,直接挂usb过滤驱动,在注册表里。
我也不知道哪里不对,可是就是读不出来啊,怎么回事呢?

#6


12r1r1r1r121r

#7


dnfhbrthrerhre

#8


seghergwervwebger

#9


关注中……

#10


帮顶。。

#11


谢谢

#12


帮顶

#13


帮顶

#14


IoCallDriver返回值是什么?
但我怀疑在Start_PNP时,是不能对接受READ请求的

#15


   只能在Read中处理。
   LZ是哪里人?

#16


see see

#17


好久了阿,怎么没大侠解答?不知道楼主解决了没?

#18


通过别的方式解决了,但是没有主动构造irp读好。
而且现在有问题,插入u盘的时候,电脑有时会重启的。不知什么原因。

#19


关注

#20


USB设备的数据读写和控制是基于URB的吧!!!???另外你的过滤驱动是挂在哪里的阿?

#21