因為完全沒有基礎
所以只能自學並在網上東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的详细信息是什么?
2. BSOD的详细信息是什么?
#3
的確是有不少USB driver filter的例子
但是大部份都是WDM式的驅動
安裝都需要用到inf檔
我想要做的是不需要用到inf檔的USB filter
可以直接寫一個app就可以安裝及解除
我做這個的功能主要是當USB隨身碟第一次插入電腦時
會先出現槽位然後消失之後再出現
我想做的事情是當USB Mass Storage插入時
先取得VIP、PID、序號之類的資訊
然後先填進register裡
這樣OS就會以為這個USB Mass Storage之前已經插過了
就不會重認
但是大部份都是WDM式的驅動
安裝都需要用到inf檔
我想要做的是不需要用到inf檔的USB filter
可以直接寫一個app就可以安裝及解除
我做這個的功能主要是當USB隨身碟第一次插入電腦時
會先出現槽位然後消失之後再出現
我想做的事情是當USB Mass Storage插入時
先取得VIP、PID、序號之類的資訊
然後先填進register裡
這樣OS就會以為這個USB Mass Storage之前已經插過了
就不會重認
#4
to topplayers
不好意思
我的基礎不好
能否請您再說得詳細一點
to Huntercao
我要做的事已經補充在上面了
另外請問
BSOD是什麼呢??
不好意思
我的基礎不好
能否請您再說得詳細一點
to Huntercao
我要做的事已經補充在上面了
另外請問
BSOD是什麼呢??
#5
1. 是否用INF安装驱动是另外一个问题。和参考什么例子关系不大。ctrl2cap也是需要安装的吧?
2. 你做的这件事比较奇怪!U-Disk的这些反应都是正常的,我不明白你为什么这么在意。
3. 如果仅仅为了解决U-disk插入不会重新寻找驱动的过程,在U-disk的描述符里面加Serial Number方是正解。
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插入電腦,會造成有些電腦會當機重開
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驱动。相对来说更加难。
-> “我的理解是需要用到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有什麼不妥需要改進的地方嗎??
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识别设备进行的一些最基本的操作。
即使你写了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來玩看看
詳細的BSOD晚點我再貼上來
到時候再麻煩您幫忙看一下
謝謝
另外這樣做的確是有用的
因為我有看過有人這樣做過
當您插入新的U-Disk時
OS會當做這個U-Disk之前已經插入過了
完全不會做認槽位的動作
整時間時提升了很多
不過他用的是DDK內的WDM範例去做修改
故需要使用inf檔來安裝
我只是想做學看看
做個NT式的Filter來玩看看
#12
他的做法有对应的产品在用么?什么地方能下载,可以分析一下具体做法。万一他不是做Filter驱动呢?
另外需要指出的是,有WDM驱动,但是好像没有叫NT式驱动的。
#13
NT式驅動這個名詞是由"Windows驅動開發技術詳解"此書看來的
#14
請問還有人可以補充的嗎??
#15
对FILTER有点困惑,能否实现数据的扩展,如加入自定义的内容数据,如自定义协议信息
#16
回libraqq
数据的扩展,如加入自定义的内容数据,如自定义协议信息不是只要在device_extension裡自定義就好了嗎?
数据的扩展,如加入自定义的内容数据,如自定义协议信息不是只要在device_extension裡自定義就好了嗎?
#17
兄台这个程式是用在量产的场合吗?一次在电脑上插十多只u碟还真是壮观:P
Huntercao兄的建议是没有错啦, remove前需要确保所有你处理的IO都结束或cancel掉了. 一般你需要在extension中保存某些引用计数和pending io的队列.这样在你处理remove的时候有机会判断是否已经完成了所有io并能cancel掉它.
不过我还是蛮好奇你是要添加注册表项为什么要dispatchread呢?
对于蓝屏你不贴log上来没法帮到你...
Huntercao兄的建议是没有错啦, remove前需要确保所有你处理的IO都结束或cancel掉了. 一般你需要在extension中保存某些引用计数和pending io的队列.这样在你处理remove的时候有机会判断是否已经完成了所有io并能cancel掉它.
不过我还是蛮好奇你是要添加注册表项为什么要dispatchread呢?
对于蓝屏你不贴log上来没法帮到你...
#18
楼主你好!
我最近要做一个usb的过滤驱动,主要是监视主机移动存储设备的使用,U盘、移动硬盘之类的存储设备的连接以及拷贝了那些文件,还要可以实时禁止写入等等,需要和用户层控制程序交换信息...
我也是一个新手,呵呵,以前从没接触过,啃了一星期的书,大概明白点,wdm模型的特点和结构明白了,但就是细节不清楚
1.过滤驱动的加载位置,在注册表那个位置添加,怎样区分出事usb的存储设备,而不是本地硬盘抑或其他usb设备,而且要过滤任意usb的存储设备,主要是不知道如何添加到注册表 以及位置 和内容 也可以说是inf文件的内容吧 呵呵
2.在驱动中怎样识别设备类型 即设备描述 比如厂商 类型 名字 大小 之类的 还有就是 怎样获取用户向设备里写入的文件或者读出的文件的 内容 不用具体数据 只要文件名称 大小 类型 之类的就行
我还是新手,所以很菜,呵呵。。
希望楼主不吝赐教,先谢谢了..
我最近要做一个usb的过滤驱动,主要是监视主机移动存储设备的使用,U盘、移动硬盘之类的存储设备的连接以及拷贝了那些文件,还要可以实时禁止写入等等,需要和用户层控制程序交换信息...
我也是一个新手,呵呵,以前从没接触过,啃了一星期的书,大概明白点,wdm模型的特点和结构明白了,但就是细节不清楚
1.过滤驱动的加载位置,在注册表那个位置添加,怎样区分出事usb的存储设备,而不是本地硬盘抑或其他usb设备,而且要过滤任意usb的存储设备,主要是不知道如何添加到注册表 以及位置 和内容 也可以说是inf文件的内容吧 呵呵
2.在驱动中怎样识别设备类型 即设备描述 比如厂商 类型 名字 大小 之类的 还有就是 怎样获取用户向设备里写入的文件或者读出的文件的 内容 不用具体数据 只要文件名称 大小 类型 之类的就行
我还是新手,所以很菜,呵呵。。
希望楼主不吝赐教,先谢谢了..
#19
的確是用於量產的場合XD
dispatchread只是原本程式的code
我並沒有注意多加修改
其實這個filter的用意就只是修改插入的PD的序號
讓電腦不用認那麼久
不知兄台有沒有什麼見解可以說一下呢?
#20
#1
处理 surprise_remove的时候先把你下发的read请求全部cancle掉
#2
1. 你想做什么事?Ctrl2cap Filter驱动是给Keyboard用的。用在USB MassStorage上面的Filter驱动最好早USB设备类的Filter驱动。我相信有不少关于USB driver filter的例子,特别是Lower level的。
2. BSOD的详细信息是什么?
2. BSOD的详细信息是什么?
#3
的確是有不少USB driver filter的例子
但是大部份都是WDM式的驅動
安裝都需要用到inf檔
我想要做的是不需要用到inf檔的USB filter
可以直接寫一個app就可以安裝及解除
我做這個的功能主要是當USB隨身碟第一次插入電腦時
會先出現槽位然後消失之後再出現
我想做的事情是當USB Mass Storage插入時
先取得VIP、PID、序號之類的資訊
然後先填進register裡
這樣OS就會以為這個USB Mass Storage之前已經插過了
就不會重認
但是大部份都是WDM式的驅動
安裝都需要用到inf檔
我想要做的是不需要用到inf檔的USB filter
可以直接寫一個app就可以安裝及解除
我做這個的功能主要是當USB隨身碟第一次插入電腦時
會先出現槽位然後消失之後再出現
我想做的事情是當USB Mass Storage插入時
先取得VIP、PID、序號之類的資訊
然後先填進register裡
這樣OS就會以為這個USB Mass Storage之前已經插過了
就不會重認
#4
to topplayers
不好意思
我的基礎不好
能否請您再說得詳細一點
to Huntercao
我要做的事已經補充在上面了
另外請問
BSOD是什麼呢??
不好意思
我的基礎不好
能否請您再說得詳細一點
to Huntercao
我要做的事已經補充在上面了
另外請問
BSOD是什麼呢??
#5
1. 是否用INF安装驱动是另外一个问题。和参考什么例子关系不大。ctrl2cap也是需要安装的吧?
2. 你做的这件事比较奇怪!U-Disk的这些反应都是正常的,我不明白你为什么这么在意。
3. 如果仅仅为了解决U-disk插入不会重新寻找驱动的过程,在U-disk的描述符里面加Serial Number方是正解。
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插入電腦,會造成有些電腦會當機重開
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驱动。相对来说更加难。
-> “我的理解是需要用到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有什麼不妥需要改進的地方嗎??
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识别设备进行的一些最基本的操作。
即使你写了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來玩看看
詳細的BSOD晚點我再貼上來
到時候再麻煩您幫忙看一下
謝謝
另外這樣做的確是有用的
因為我有看過有人這樣做過
當您插入新的U-Disk時
OS會當做這個U-Disk之前已經插入過了
完全不會做認槽位的動作
整時間時提升了很多
不過他用的是DDK內的WDM範例去做修改
故需要使用inf檔來安裝
我只是想做學看看
做個NT式的Filter來玩看看
#12
他的做法有对应的产品在用么?什么地方能下载,可以分析一下具体做法。万一他不是做Filter驱动呢?
另外需要指出的是,有WDM驱动,但是好像没有叫NT式驱动的。
#13
NT式驅動這個名詞是由"Windows驅動開發技術詳解"此書看來的
#14
請問還有人可以補充的嗎??
#15
对FILTER有点困惑,能否实现数据的扩展,如加入自定义的内容数据,如自定义协议信息
#16
回libraqq
数据的扩展,如加入自定义的内容数据,如自定义协议信息不是只要在device_extension裡自定義就好了嗎?
数据的扩展,如加入自定义的内容数据,如自定义协议信息不是只要在device_extension裡自定義就好了嗎?
#17
兄台这个程式是用在量产的场合吗?一次在电脑上插十多只u碟还真是壮观:P
Huntercao兄的建议是没有错啦, remove前需要确保所有你处理的IO都结束或cancel掉了. 一般你需要在extension中保存某些引用计数和pending io的队列.这样在你处理remove的时候有机会判断是否已经完成了所有io并能cancel掉它.
不过我还是蛮好奇你是要添加注册表项为什么要dispatchread呢?
对于蓝屏你不贴log上来没法帮到你...
Huntercao兄的建议是没有错啦, remove前需要确保所有你处理的IO都结束或cancel掉了. 一般你需要在extension中保存某些引用计数和pending io的队列.这样在你处理remove的时候有机会判断是否已经完成了所有io并能cancel掉它.
不过我还是蛮好奇你是要添加注册表项为什么要dispatchread呢?
对于蓝屏你不贴log上来没法帮到你...
#18
楼主你好!
我最近要做一个usb的过滤驱动,主要是监视主机移动存储设备的使用,U盘、移动硬盘之类的存储设备的连接以及拷贝了那些文件,还要可以实时禁止写入等等,需要和用户层控制程序交换信息...
我也是一个新手,呵呵,以前从没接触过,啃了一星期的书,大概明白点,wdm模型的特点和结构明白了,但就是细节不清楚
1.过滤驱动的加载位置,在注册表那个位置添加,怎样区分出事usb的存储设备,而不是本地硬盘抑或其他usb设备,而且要过滤任意usb的存储设备,主要是不知道如何添加到注册表 以及位置 和内容 也可以说是inf文件的内容吧 呵呵
2.在驱动中怎样识别设备类型 即设备描述 比如厂商 类型 名字 大小 之类的 还有就是 怎样获取用户向设备里写入的文件或者读出的文件的 内容 不用具体数据 只要文件名称 大小 类型 之类的就行
我还是新手,所以很菜,呵呵。。
希望楼主不吝赐教,先谢谢了..
我最近要做一个usb的过滤驱动,主要是监视主机移动存储设备的使用,U盘、移动硬盘之类的存储设备的连接以及拷贝了那些文件,还要可以实时禁止写入等等,需要和用户层控制程序交换信息...
我也是一个新手,呵呵,以前从没接触过,啃了一星期的书,大概明白点,wdm模型的特点和结构明白了,但就是细节不清楚
1.过滤驱动的加载位置,在注册表那个位置添加,怎样区分出事usb的存储设备,而不是本地硬盘抑或其他usb设备,而且要过滤任意usb的存储设备,主要是不知道如何添加到注册表 以及位置 和内容 也可以说是inf文件的内容吧 呵呵
2.在驱动中怎样识别设备类型 即设备描述 比如厂商 类型 名字 大小 之类的 还有就是 怎样获取用户向设备里写入的文件或者读出的文件的 内容 不用具体数据 只要文件名称 大小 类型 之类的就行
我还是新手,所以很菜,呵呵。。
希望楼主不吝赐教,先谢谢了..
#19
的確是用於量產的場合XD
dispatchread只是原本程式的code
我並沒有注意多加修改
其實這個filter的用意就只是修改插入的PD的序號
讓電腦不用認那麼久
不知兄台有沒有什麼見解可以說一下呢?