pastroal
驱动牛犊
驱动牛犊
  • 注册日期2002-03-06
  • 最后登录2005-09-30
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1231回复:8

大侠们救我,很简单的MDL问题,送30分

楼主#
更多 发布于:2002-11-19 15:16
其实我到现在都没彻底搞明白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是不是咋用的?救命阿!
pastroal
驱动牛犊
驱动牛犊
  • 注册日期2002-03-06
  • 最后登录2005-09-30
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-19 15:23
我读上来的数据需要在驱动中做处理,不是立即就交给上层应用程序的。直接做转发的USB MDL驱动我已经有了。我现在想把在驱动中申请一块缓冲区通过MDL方式能写到USBD中,把USBD中的数据读到这个缓冲区里面来。
ydyuse
驱动老牛
驱动老牛
  • 注册日期2002-07-25
  • 最后登录2005-03-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-19 15:30
你指定了设备读写的缓冲方式吗?在AddDevice函数的设备对象中指定为DO_DIRECT_IO方式。
生命驱动,活力无限!
pastroal
驱动牛犊
驱动牛犊
  • 注册日期2002-03-06
  • 最后登录2005-09-30
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-11-19 16:05
其实我都没明白驱动里面设DO_DIRECT_IO
是指明自己接收的IRP是DIRECT方式,还是自己发出的IRP是DIRECT方式。大侠顺便也说说。
你提的我马上去试。成功了立即给你分。
pastroal
驱动牛犊
驱动牛犊
  • 注册日期2002-03-06
  • 最后登录2005-09-30
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-11-19 16:26
可是我都试了,现象还是一样的。
IRP下去了就是没反应阿。
pastroal
驱动牛犊
驱动牛犊
  • 注册日期2002-03-06
  • 最后登录2005-09-30
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-11-19 16:56
这位大侠,Walter Oney 的WDM编程这个电子文档我有。
你说的我也都看过,就是还不太理解。
“MDL你最可能做的事是把它作为参数传递给其它函数”,这样的驱动我也做好了,现在我需要做的是在驱动里面和USBD进行MDL交互。
因为BUFFER的方式一次最多读上来34X字节,我希望能一次读上来700多字节的包。可是怎么试也不行。
MDL你编过类似的程序吗?


pastroal
驱动牛犊
驱动牛犊
  • 注册日期2002-03-06
  • 最后登录2005-09-30
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-11-19 20:39
有没有人会阿!!!!!!!
pastroal
驱动牛犊
驱动牛犊
  • 注册日期2002-03-06
  • 最后登录2005-09-30
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-11-20 09:11
大侠快来看看!
pastroal
驱动牛犊
驱动牛犊
  • 注册日期2002-03-06
  • 最后登录2005-09-30
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-11-21 10:59
有没有人会阿!?
游客

返回顶部