關於USB filter的問題

时间:2021-12-20 16:05:08
小弟目前正在研究如何寫一個USB Filter的一個小驅動
因為完全沒有基礎
所以只能自學並在網上東copy西copy的
並以Ctrl2cap這個範例改成了下列的code
安裝完成後
只要USB的Mass storage被拔除整個電腦就會出現藍屏
還請有經驗的各位幫忙看看那裡有錯

PS:因為是用Ctrl2cap改的  所以有點亂請見諒


NTSTATUS DriverEntry(
    IN PDRIVER_OBJECT  DriverObject,
    IN PUNICODE_STRING RegistryPath 
    )
{
    ULONG i;

    DbgPrint (("Ctrl2cap.SYS: entering DriverEntry\n"));


    for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) {

        DriverObject->MajorFunction[i] = Ctrl2capDispatchGeneral;
    }



#if WIN2K

    DriverObject->MajorFunction [IRP_MJ_POWER]  = Ctrl2capPower;

    DriverObject->MajorFunction [IRP_MJ_PNP]  = Ctrl2capPnP;

    DriverObject->DriverUnload = Ctrl2capUnload;
    DriverObject->DriverExtension->AddDevice = Ctrl2capAddDevice;

    return STATUS_SUCCESS;

#else  // WIN2K

    //
    // Under NT 4 we go out and hook the keyboard class device for 
    // keyboard 0.
    //
    return Ctrl2capInit( DriverObject );
#endif // WIN2K
}


NTSTATUS Ctrl2capInit( 
    IN PDRIVER_OBJECT DriverObject 
    )
{
    CCHAR       ntNameBuffer[64];
    STRING       ntNameString;
    UNICODE_STRING    ntUnicodeString;
    PDEVICE_OBJECT    device;
    NTSTATUS          status;
    PDEVICE_EXTENSION devExt;
    WCHAR             messageBuffer[]  = L"Ctrl2cap Initialized\n";
    UNICODE_STRING    messageUnicodeString;
PDRIVER_OBJECT    usbDriver;
    PDEVICE_OBJECT    usbDevice;
    PDEVICE_OBJECT    pfltDevice;
PDEVICE_OBJECT    pLowerDevice;

    //
    // Only hook onto the first keyboard's chain.
    //

#if DBG
__debugbreak();
#endif

    sprintf( ntNameBuffer, "\\Driver\\USBSTOR" );
    RtlInitAnsiString( &ntNameString, ntNameBuffer );
    RtlAnsiStringToUnicodeString( &ntUnicodeString, &ntNameString, TRUE );
    
     status = ObReferenceObjectByName(&ntUnicodeString, OBJ_CASE_INSENSITIVE,
                                         NULL, GENERIC_READ | GENERIC_WRITE, IoDriverObjectType,
                                         KernelMode, NULL, (PVOID*)&usbDriver);

 if(!NT_SUCCESS(status))
     {
 
         DbgPrint(("Couldn't get usb driver\n"));
         return status;
     }

  usbDevice = usbDriver->DeviceObject;


       status = IoCreateDevice( DriverObject,
                                sizeof(DEVICE_EXTENSION),
                                NULL,
usbDevice->DeviceType,
usbDevice->Characteristics,
                                FALSE,
                                &device );

    if( !NT_SUCCESS(status) ) {

        DbgPrint(("Ctrl2cap: Keyboard hook failed to create device!\n"));

        RtlFreeUnicodeString( &ntUnicodeString );
        return STATUS_SUCCESS;
    }

    RtlZeroMemory(device->DeviceExtension, sizeof(DEVICE_EXTENSION));

    devExt = (PDEVICE_EXTENSION) device->DeviceExtension;
   

    device->Flags |= DO_BUFFERED_IO;
    device->Flags &= ~DO_DEVICE_INITIALIZING;


pLowerDevice = IoAttachDeviceToDeviceStack(device, usbDevice);



if(NULL == pLowerDevice)
{
ObDereferenceObject(usbDriver);
DbgPrint(("attach usb device error!\n"));
IoDeleteDevice(device);
device = NULL;
return STATUS_UNSUCCESSFUL;
    }


    RtlFreeUnicodeString( &ntUnicodeString );
    DbgPrint(("Ctrl2cap: Successfully connected to keyboard device\n"));


    RtlInitUnicodeString (&messageUnicodeString,
                          messageBuffer );
ObDereferenceObject(usbDriver);
    ZwDisplayString( &messageUnicodeString );
    return STATUS_SUCCESS;
}


#if WIN2K

NTSTATUS
Ctrl2capAddDevice(
    IN PDRIVER_OBJECT   Driver,
    IN PDEVICE_OBJECT   PDO
    )
{
    PDEVICE_EXTENSION        devExt;
    IO_ERROR_LOG_PACKET      errorLogEntry;
    PDEVICE_OBJECT           device;
    NTSTATUS                 status = STATUS_SUCCESS;

    DbgPrint(("Ctrl2capAddDevice\n"));
    status = IoCreateDevice(Driver,                   
                            sizeof(DEVICE_EXTENSION), 
                            NULL,                    
                            FILE_DEVICE_KEYBOARD,   
                            0,                     
                            FALSE,                
                            &device              
                            );

    if (!NT_SUCCESS(status)) {

        return (status);
    }

    RtlZeroMemory(device->DeviceExtension, sizeof(DEVICE_EXTENSION));

    devExt = (PDEVICE_EXTENSION) device->DeviceExtension;
    devExt->TopOfStack = IoAttachDeviceToDeviceStack(device, PDO);

    ASSERT(devExt->TopOfStack);

    device->Flags |= (DO_BUFFERED_IO | DO_POWER_PAGABLE);
    device->Flags &= ~DO_DEVICE_INITIALIZING;
    return status;
}

NTSTATUS Ctrl2capPnP(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP           Irp 
    )
{
    PDEVICE_EXTENSION           devExt; 
    PIO_STACK_LOCATION          irpStack;
    NTSTATUS                    status = STATUS_SUCCESS;
    KIRQL                       oldIrql;
    KEVENT                      event;        

    devExt = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
    irpStack = IoGetCurrentIrpStackLocation(Irp);

    switch (irpStack->MinorFunction) {
    case IRP_MN_REMOVE_DEVICE:
        
        //
        // Detach from the target device after passing the IRP
        // down the devnode stack.
        //
        IoSkipCurrentIrpStackLocation(Irp);
        IoCallDriver(devExt->TopOfStack, Irp);

        IoDetachDevice(devExt->TopOfStack); 
        IoDeleteDevice(DeviceObject);

        status = STATUS_SUCCESS;
        break;

    case IRP_MN_SURPRISE_REMOVAL:

        //
        // Same as a remove device, but don't call IoDetach or IoDeleteDevice.
        //
        IoSkipCurrentIrpStackLocation(Irp);
        status = IoCallDriver(devExt->TopOfStack, Irp);
        break;

    case IRP_MN_START_DEVICE: 
    case IRP_MN_QUERY_REMOVE_DEVICE:
    case IRP_MN_QUERY_STOP_DEVICE:
    case IRP_MN_CANCEL_REMOVE_DEVICE:
    case IRP_MN_CANCEL_STOP_DEVICE:
    case IRP_MN_FILTER_RESOURCE_REQUIREMENTS: 
    case IRP_MN_STOP_DEVICE:
    case IRP_MN_QUERY_DEVICE_RELATIONS:
    case IRP_MN_QUERY_INTERFACE:
    case IRP_MN_QUERY_CAPABILITIES:
    case IRP_MN_QUERY_DEVICE_TEXT:
    case IRP_MN_QUERY_RESOURCES:
    case IRP_MN_QUERY_RESOURCE_REQUIREMENTS:
    case IRP_MN_READ_CONFIG:
    case IRP_MN_WRITE_CONFIG:
    case IRP_MN_EJECT:
    case IRP_MN_SET_LOCK:
    case IRP_MN_QUERY_ID:
    case IRP_MN_QUERY_PNP_DEVICE_STATE:
    default:
        //
        // Pass these through untouched
        //
        IoSkipCurrentIrpStackLocation(Irp);
        status = IoCallDriver(devExt->TopOfStack, Irp);
        break;
    }

    return status;
}

NTSTATUS Ctrl2capPower(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP           Irp 
    )
{
    PDEVICE_EXTENSION   devExt;
    
    devExt = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;

    //
    // Let the next power IRP out of the gate
    // 
    PoStartNextPowerIrp( Irp );
    
    //
    // Pass this power IRP to the keyboard class driver
    //
    IoSkipCurrentIrpStackLocation( Irp );
    
    return PoCallDriver( devExt->TopOfStack, Irp );
}

VOID
Ctrl2capUnload(
   IN PDRIVER_OBJECT Driver
   )
{
#if DBG
__debugbreak();
#endif
    UNREFERENCED_PARAMETER(Driver);
IoDeleteDevice(device);

    ASSERT(NULL == Driver->DeviceObject);
}
#endif // WIN2K

NTSTATUS Ctrl2capReadComplete( 
    IN PDEVICE_OBJECT DeviceObject, 
    IN PIRP Irp,
    IN PVOID Context 
    )
{
    PIO_STACK_LOCATION        IrpSp;
    PKEYBOARD_INPUT_DATA      KeyData;
    int                       numKeys, i;

    IrpSp = IoGetCurrentIrpStackLocation( Irp );
    if( NT_SUCCESS( Irp->IoStatus.Status ) ) {

        KeyData = Irp->AssociatedIrp.SystemBuffer;
        numKeys = Irp->IoStatus.Information / sizeof(KEYBOARD_INPUT_DATA);

        for( i = 0; i < numKeys; i++ ) {

            DbgPrint(("ScanCode: %x ", KeyData[i].MakeCode ));
            DbgPrint(("%s\n", KeyData[i].Flags ? "Up" : "Down" ));

            if( KeyData[i].MakeCode == CAPS_LOCK) {

                KeyData[i].MakeCode = LCONTROL;
            } 
        }
    }

    if( Irp->PendingReturned ) {

        IoMarkIrpPending( Irp );
    }
    return Irp->IoStatus.Status;
}

NTSTATUS Ctrl2capDispatchRead( 
    IN PDEVICE_OBJECT DeviceObject, 
    IN PIRP Irp )
{
    PDEVICE_EXTENSION   devExt;
    PIO_STACK_LOCATION  currentIrpStack;
    PIO_STACK_LOCATION  nextIrpStack;

    devExt = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
    currentIrpStack = IoGetCurrentIrpStackLocation(Irp);
    nextIrpStack = IoGetNextIrpStackLocation(Irp);    

    *nextIrpStack = *currentIrpStack;
   
    IoSetCompletionRoutine( Irp, Ctrl2capReadComplete, 
                            DeviceObject, TRUE, TRUE, TRUE );

    return IoCallDriver( devExt->TopOfStack, Irp );
}

NTSTATUS Ctrl2capDispatchGeneral(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP           Irp 
    )
{

#if WIN2K
    IoSkipCurrentIrpStackLocation(Irp);
#else // WIN2K

    Irp->CurrentLocation++;
    Irp->Tail.Overlay.CurrentStackLocation++;
#endif // WIN2K
    return IoCallDriver(((PDEVICE_EXTENSION) DeviceObject->DeviceExtension)->TopOfStack, Irp);
}

19 个解决方案

#1


处理 surprise_remove的时候先把你下发的read请求全部cancle掉

#2


1. 你想做什么事?Ctrl2cap Filter驱动是给Keyboard用的。用在USB MassStorage上面的Filter驱动最好早USB设备类的Filter驱动。我相信有不少关于USB driver filter的例子,特别是Lower level的。
2. BSOD的详细信息是什么?

#3


的確是有不少USB driver filter的例子
但是大部份都是WDM式的驅動
安裝都需要用到inf檔
我想要做的是不需要用到inf檔的USB filter
可以直接寫一個app就可以安裝及解除

我做這個的功能主要是當USB隨身碟第一次插入電腦時
會先出現槽位然後消失之後再出現
我想做的事情是當USB Mass Storage插入時
先取得VIP、PID、序號之類的資訊
然後先填進register裡
這樣OS就會以為這個USB Mass Storage之前已經插過了
就不會重認

#4


to topplayers

不好意思
我的基礎不好
能否請您再說得詳細一點

to Huntercao
我要做的事已經補充在上面了
另外請問
BSOD是什麼呢??

#5


1. 是否用INF安装驱动是另外一个问题。和参考什么例子关系不大。ctrl2cap也是需要安装的吧?
2. 你做的这件事比较奇怪!U-Disk的这些反应都是正常的,我不明白你为什么这么在意。
3. 如果仅仅为了解决U-disk插入不会重新寻找驱动的过程,在U-disk的描述符里面加Serial Number方是正解。

#6


to Huntercao

1.ctrl2cap的確是需要安裝沒錯,但是卻不用inf檔來安裝,我看Windows驅動開發技術詳解之後,我的理解是需要用到inf檔的都算是WDM式驅動程式,而不需要用到inf檔的都算是NT式驅動程式。

2.這部份是因為當一個新的U-Disk插入電腦時每次都要認一段時間,而我想做的就是縮短這個時間,我現在想到的方法就是利用filter去做。

3.我不對能去修改U-disk的Serial Number,因為我要是修改了之後,如果兩隻同Serial Number的U-Disk插入電腦,會造成有些電腦會當機重開

#7


1.ctrl2cap的確是需要安裝沒錯,但是卻不用inf檔來安裝,我看Windows驅動開發技術詳解之後,我的理解是需要用到inf檔的都算是WDM式驅動程式,而不需要用到inf檔的都算是NT式驅動程式。
-> “我的理解是需要用到inf檔的都算是WDM式驅動程式,而不需要用到inf檔的都算是NT式驅動程式。”这个理解当然不对。
2.這部份是因為當一個新的U-Disk插入電腦時每次都要認一段時間,而我想做的就是縮短這個時間,我現在想到的方法就是利用filter去做。
->彻底晕倒。你写Filter驱动只会让这个识别过程加长,而不是缩短。你需要明白这个过程不是你能够控制的。也许提升你的U-Disk设计,让你的设备响应相关Request的时候快一些才是正解。

个人认为,没有很多的驱动研发经验最好不要写Filter驱动。相对来说更加难。

#8


to Huntercao:

1.WDM和NI式的差別在於IoCreateDevice的地方是嗎?? WDM式是寫在DriverObject->DriverExtension->AddDevice裡,而NT式則是寫在任何地方都可以是嗎?? 還是差別在於PNP呢? 就我所知是PNP式的都需要inf檔對吧??

2.如果您有試過1次插上數十隻的U-Disk您就會知道OS認device的時間有多久了@_@
  OS的行為是認完一支再認下一支,一支認個2秒,15支就得等上30秒,這也就是為什麼我會想要filter的原因了

小弟的確是沒有驱动研发经验,只是業餘想要自己練練,還請您幫忙看一下上面的code有什麼不妥需要改進的地方嗎??

#9


这个问题你写Filter驱动解决不了的。每个设备需要时间是因为系统要从每个设备读取对应的信息,然后为没个设备分配资源造成的。

即使你写了Filter驱动,也阻拦不了USB MassStorage驱动去Request每个设备的Descriptor,更阻拦不了USB Host Controller/Hub识别设备进行的一些最基本的操作。

#10


BTW:BSOD = Blue Screen of Death.就是蓝屏。

#11


to Huntercao:

詳細的BSOD晚點我再貼上來
到時候再麻煩您幫忙看一下
謝謝

另外這樣做的確是有用的
因為我有看過有人這樣做過
當您插入新的U-Disk時
OS會當做這個U-Disk之前已經插入過了
完全不會做認槽位的動作
整時間時提升了很多
不過他用的是DDK內的WDM範例去做修改
故需要使用inf檔來安裝
我只是想做學看看
做個NT式的Filter來玩看看

#12


引用 11 楼 guessle 的回复:
另外這樣做的確是有用的
因為我有看過有人這樣做過
當您插入新的U-Disk時
OS會當做這個U-Disk之前已經插入過了
完全不會做認槽位的動作
整時間時提升了很多
不過他用的是DDK內的WDM範例去做修改
故需要使用inf檔來安裝


他的做法有对应的产品在用么?什么地方能下载,可以分析一下具体做法。万一他不是做Filter驱动呢?

另外需要指出的是,有WDM驱动,但是好像没有叫NT式驱动的。

#13


NT式驅動這個名詞是由"Windows驅動開發技術詳解"此書看來的

#14


請問還有人可以補充的嗎??

#15


对FILTER有点困惑,能否实现数据的扩展,如加入自定义的内容数据,如自定义协议信息

#16


回libraqq

数据的扩展,如加入自定义的内容数据,如自定义协议信息不是只要在device_extension裡自定義就好了嗎?

#17


兄台这个程式是用在量产的场合吗?一次在电脑上插十多只u碟还真是壮观:P

Huntercao兄的建议是没有错啦, remove前需要确保所有你处理的IO都结束或cancel掉了. 一般你需要在extension中保存某些引用计数和pending io的队列.这样在你处理remove的时候有机会判断是否已经完成了所有io并能cancel掉它.
不过我还是蛮好奇你是要添加注册表项为什么要dispatchread呢?
对于蓝屏你不贴log上来没法帮到你...

#18


楼主你好!
我最近要做一个usb的过滤驱动,主要是监视主机移动存储设备的使用,U盘、移动硬盘之类的存储设备的连接以及拷贝了那些文件,还要可以实时禁止写入等等,需要和用户层控制程序交换信息...

我也是一个新手,呵呵,以前从没接触过,啃了一星期的书,大概明白点,wdm模型的特点和结构明白了,但就是细节不清楚
1.过滤驱动的加载位置,在注册表那个位置添加,怎样区分出事usb的存储设备,而不是本地硬盘抑或其他usb设备,而且要过滤任意usb的存储设备,主要是不知道如何添加到注册表 以及位置 和内容 也可以说是inf文件的内容吧 呵呵

2.在驱动中怎样识别设备类型 即设备描述 比如厂商 类型 名字 大小 之类的 还有就是 怎样获取用户向设备里写入的文件或者读出的文件的 内容 不用具体数据 只要文件名称 大小 类型 之类的就行

我还是新手,所以很菜,呵呵。。
希望楼主不吝赐教,先谢谢了.. 

#19


引用 17 楼 dwdali 的回复:
兄台这个程式是用在量产的场合吗?一次在电脑上插十多只u碟还真是壮观:P


的確是用於量產的場合XD
dispatchread只是原本程式的code
我並沒有注意多加修改

其實這個filter的用意就只是修改插入的PD的序號
讓電腦不用認那麼久

不知兄台有沒有什麼見解可以說一下呢?

#1


处理 surprise_remove的时候先把你下发的read请求全部cancle掉

#2


1. 你想做什么事?Ctrl2cap Filter驱动是给Keyboard用的。用在USB MassStorage上面的Filter驱动最好早USB设备类的Filter驱动。我相信有不少关于USB driver filter的例子,特别是Lower level的。
2. BSOD的详细信息是什么?

#3


的確是有不少USB driver filter的例子
但是大部份都是WDM式的驅動
安裝都需要用到inf檔
我想要做的是不需要用到inf檔的USB filter
可以直接寫一個app就可以安裝及解除

我做這個的功能主要是當USB隨身碟第一次插入電腦時
會先出現槽位然後消失之後再出現
我想做的事情是當USB Mass Storage插入時
先取得VIP、PID、序號之類的資訊
然後先填進register裡
這樣OS就會以為這個USB Mass Storage之前已經插過了
就不會重認

#4


to topplayers

不好意思
我的基礎不好
能否請您再說得詳細一點

to Huntercao
我要做的事已經補充在上面了
另外請問
BSOD是什麼呢??

#5


1. 是否用INF安装驱动是另外一个问题。和参考什么例子关系不大。ctrl2cap也是需要安装的吧?
2. 你做的这件事比较奇怪!U-Disk的这些反应都是正常的,我不明白你为什么这么在意。
3. 如果仅仅为了解决U-disk插入不会重新寻找驱动的过程,在U-disk的描述符里面加Serial Number方是正解。

#6


to Huntercao

1.ctrl2cap的確是需要安裝沒錯,但是卻不用inf檔來安裝,我看Windows驅動開發技術詳解之後,我的理解是需要用到inf檔的都算是WDM式驅動程式,而不需要用到inf檔的都算是NT式驅動程式。

2.這部份是因為當一個新的U-Disk插入電腦時每次都要認一段時間,而我想做的就是縮短這個時間,我現在想到的方法就是利用filter去做。

3.我不對能去修改U-disk的Serial Number,因為我要是修改了之後,如果兩隻同Serial Number的U-Disk插入電腦,會造成有些電腦會當機重開

#7


1.ctrl2cap的確是需要安裝沒錯,但是卻不用inf檔來安裝,我看Windows驅動開發技術詳解之後,我的理解是需要用到inf檔的都算是WDM式驅動程式,而不需要用到inf檔的都算是NT式驅動程式。
-> “我的理解是需要用到inf檔的都算是WDM式驅動程式,而不需要用到inf檔的都算是NT式驅動程式。”这个理解当然不对。
2.這部份是因為當一個新的U-Disk插入電腦時每次都要認一段時間,而我想做的就是縮短這個時間,我現在想到的方法就是利用filter去做。
->彻底晕倒。你写Filter驱动只会让这个识别过程加长,而不是缩短。你需要明白这个过程不是你能够控制的。也许提升你的U-Disk设计,让你的设备响应相关Request的时候快一些才是正解。

个人认为,没有很多的驱动研发经验最好不要写Filter驱动。相对来说更加难。

#8


to Huntercao:

1.WDM和NI式的差別在於IoCreateDevice的地方是嗎?? WDM式是寫在DriverObject->DriverExtension->AddDevice裡,而NT式則是寫在任何地方都可以是嗎?? 還是差別在於PNP呢? 就我所知是PNP式的都需要inf檔對吧??

2.如果您有試過1次插上數十隻的U-Disk您就會知道OS認device的時間有多久了@_@
  OS的行為是認完一支再認下一支,一支認個2秒,15支就得等上30秒,這也就是為什麼我會想要filter的原因了

小弟的確是沒有驱动研发经验,只是業餘想要自己練練,還請您幫忙看一下上面的code有什麼不妥需要改進的地方嗎??

#9


这个问题你写Filter驱动解决不了的。每个设备需要时间是因为系统要从每个设备读取对应的信息,然后为没个设备分配资源造成的。

即使你写了Filter驱动,也阻拦不了USB MassStorage驱动去Request每个设备的Descriptor,更阻拦不了USB Host Controller/Hub识别设备进行的一些最基本的操作。

#10


BTW:BSOD = Blue Screen of Death.就是蓝屏。

#11


to Huntercao:

詳細的BSOD晚點我再貼上來
到時候再麻煩您幫忙看一下
謝謝

另外這樣做的確是有用的
因為我有看過有人這樣做過
當您插入新的U-Disk時
OS會當做這個U-Disk之前已經插入過了
完全不會做認槽位的動作
整時間時提升了很多
不過他用的是DDK內的WDM範例去做修改
故需要使用inf檔來安裝
我只是想做學看看
做個NT式的Filter來玩看看

#12


引用 11 楼 guessle 的回复:
另外這樣做的確是有用的
因為我有看過有人這樣做過
當您插入新的U-Disk時
OS會當做這個U-Disk之前已經插入過了
完全不會做認槽位的動作
整時間時提升了很多
不過他用的是DDK內的WDM範例去做修改
故需要使用inf檔來安裝


他的做法有对应的产品在用么?什么地方能下载,可以分析一下具体做法。万一他不是做Filter驱动呢?

另外需要指出的是,有WDM驱动,但是好像没有叫NT式驱动的。

#13


NT式驅動這個名詞是由"Windows驅動開發技術詳解"此書看來的

#14


請問還有人可以補充的嗎??

#15


对FILTER有点困惑,能否实现数据的扩展,如加入自定义的内容数据,如自定义协议信息

#16


回libraqq

数据的扩展,如加入自定义的内容数据,如自定义协议信息不是只要在device_extension裡自定義就好了嗎?

#17


兄台这个程式是用在量产的场合吗?一次在电脑上插十多只u碟还真是壮观:P

Huntercao兄的建议是没有错啦, remove前需要确保所有你处理的IO都结束或cancel掉了. 一般你需要在extension中保存某些引用计数和pending io的队列.这样在你处理remove的时候有机会判断是否已经完成了所有io并能cancel掉它.
不过我还是蛮好奇你是要添加注册表项为什么要dispatchread呢?
对于蓝屏你不贴log上来没法帮到你...

#18


楼主你好!
我最近要做一个usb的过滤驱动,主要是监视主机移动存储设备的使用,U盘、移动硬盘之类的存储设备的连接以及拷贝了那些文件,还要可以实时禁止写入等等,需要和用户层控制程序交换信息...

我也是一个新手,呵呵,以前从没接触过,啃了一星期的书,大概明白点,wdm模型的特点和结构明白了,但就是细节不清楚
1.过滤驱动的加载位置,在注册表那个位置添加,怎样区分出事usb的存储设备,而不是本地硬盘抑或其他usb设备,而且要过滤任意usb的存储设备,主要是不知道如何添加到注册表 以及位置 和内容 也可以说是inf文件的内容吧 呵呵

2.在驱动中怎样识别设备类型 即设备描述 比如厂商 类型 名字 大小 之类的 还有就是 怎样获取用户向设备里写入的文件或者读出的文件的 内容 不用具体数据 只要文件名称 大小 类型 之类的就行

我还是新手,所以很菜,呵呵。。
希望楼主不吝赐教,先谢谢了.. 

#19


引用 17 楼 dwdali 的回复:
兄台这个程式是用在量产的场合吗?一次在电脑上插十多只u碟还真是壮观:P


的確是用於量產的場合XD
dispatchread只是原本程式的code
我並沒有注意多加修改

其實這個filter的用意就只是修改插入的PD的序號
讓電腦不用認那麼久

不知兄台有沒有什麼見解可以說一下呢?

#20