阅读:1231回复:8
大侠们救我,很简单的MDL问题,送30分
其实我到现在都没彻底搞明白MDL的含义是什么。
但我知道它能够加快数据传输的速度,所以我用它。 我现在有一个可有的USB客户驱动程序,他的读写是基于BUFFER方式的,我现在想把它改成MDL的方式。 以下是我的主要代码: NTSTATUS EbskUsb_Read( IN PDEVICE_OBJECT DeviceObject , IN PUCHAR InputData, IN ULONG TranLen, IN ULONG *pRealdataLen , IN UCHAR ReadType ) { 1 // // Alloc and initialize URB //...urb里面填了读的长度,管道Handle,MDL和Buffer没填。 2 nextStack->Parameters.Others.Argument1 = urb; nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL; nextStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB; mdl = IoAllocateMdl(InputData, TranLen, FALSE, TRUE, Irp); MmBuildMdlForNonPagedPool(mdl); urb->UrbBulkOrInterruptTransfer.TransferBufferMDL = mdl; 3 IoSetCompletionRoutine(Irp,EbskUsb_Read_Complete,IrpCon,TRUE,TRUE, TRUE); status = IoCallDriver(deviceExtension->NextLowerDriver, Irp ); return status; } 上面函数的InputData是我在驱动中ExAllocatePool出来的一段缓冲区 NTSTATUS EbskUsb_Read_Complete( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ) { .... IoFreeMdl(IrpCon->mdl); EBSKUSB_ExFreePool (urb); EBSKUSB_ExFreePool (Context); } 但是我上面带mdl的IRP发下去就在也没到EbskUsb_Read_Complete里面来,我怀疑是我没用对。 大侠们帮我看看MDL是不是咋用的?救命阿! |
|
沙发#
发布于:2002-11-19 15:23
我读上来的数据需要在驱动中做处理,不是立即就交给上层应用程序的。直接做转发的USB MDL驱动我已经有了。我现在想把在驱动中申请一块缓冲区通过MDL方式能写到USBD中,把USBD中的数据读到这个缓冲区里面来。
|
|
板凳#
发布于:2002-11-19 15:30
你指定了设备读写的缓冲方式吗?在AddDevice函数的设备对象中指定为DO_DIRECT_IO方式。
|
|
|
地板#
发布于:2002-11-19 16:05
其实我都没明白驱动里面设DO_DIRECT_IO
是指明自己接收的IRP是DIRECT方式,还是自己发出的IRP是DIRECT方式。大侠顺便也说说。 你提的我马上去试。成功了立即给你分。 |
|
地下室#
发布于:2002-11-19 16:26
可是我都试了,现象还是一样的。
IRP下去了就是没反应阿。 |
|
5楼#
发布于:2002-11-19 16:56
这位大侠,Walter Oney 的WDM编程这个电子文档我有。
你说的我也都看过,就是还不太理解。 “MDL你最可能做的事是把它作为参数传递给其它函数”,这样的驱动我也做好了,现在我需要做的是在驱动里面和USBD进行MDL交互。 因为BUFFER的方式一次最多读上来34X字节,我希望能一次读上来700多字节的包。可是怎么试也不行。 MDL你编过类似的程序吗? |
|
6楼#
发布于:2002-11-19 20:39
有没有人会阿!!!!!!!
|
|
7楼#
发布于:2002-11-20 09:11
大侠快来看看!
|
|
8楼#
发布于:2002-11-21 10:59
有没有人会阿!?
|
|