chrys
驱动小牛
驱动小牛
  • 注册日期2002-05-30
  • 最后登录2008-07-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1634回复:3

NTDDK中的usb例子代码里有个问题我百思不得其解,不知道是我的问题还是ms的错误,大家来看看吧。

楼主#
更多 发布于:2003-07-18 11:19
里面有个叫BuildAsyncRequest()的构造URB的函数,代码如下:

ULONG siz;
ULONG length = 0;
PURB urb = NULL;
if (Irp->MdlAddress) // could be NULL for 0-len request
{
length = MmGetMdlByteCount(Irp->MdlAddress);
}
siz = sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER);
urb = ExAllocatePool(NonPagedPool, siz);
DbgPrint(\"Enter zjHMCFUsb_BuildAsyncRequest() len = 0x%x decimal %d \\n siz = 0x%x urb 0x%x\\n Pipehandle 0x%x\", length, length, siz, urb, PipeHandle);
if (urb)
{
RtlZeroMemory(urb, siz);
urb->UrbBulkOrInterruptTransfer.Hdr.Length = (USHORT) siz;
urb->UrbBulkOrInterruptTransfer.Hdr.Function = URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER;
urb->UrbBulkOrInterruptTransfer.PipeHandle = PipeHandle->PipeHandle;
urb->UrbBulkOrInterruptTransfer.TransferFlags = Read ? USBD_TRANSFER_DIRECTION_IN : 0;
// short packet is not treated as an error.
urb->UrbBulkOrInterruptTransfer.TransferFlags |= USBD_SHORT_TRANSFER_OK;
// not using linked urb\'s
urb->UrbBulkOrInterruptTransfer.UrbLink = NULL;
urb->UrbBulkOrInterruptTransfer.TransferBufferMDL = Irp->MdlAddress;
urb->UrbBulkOrInterruptTransfer.TransferBufferLength = length;

其中这两句:siz = sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER);
urb = ExAllocatePool(NonPagedPool, siz);
是计算urb需要的长度然后再根据这个长度来申请空间,并用urb指向这个申请的空间,供后面使用。我觉得这个计算长度的应该是
siz = sizeof(URB);
才对,我们申请的空间长度应该是结构体URB的长度,因为我们是用PURB指针类型来访问这块内存的。再说UrbBulkOrInterruptTransfer是URB的第8个成员,UrbBulkOrInterruptTransfer并不是在我们申请地址的第一位,而是若干位以后去了,如果按照前面的做法,如:
urb->UrbBulkOrInterruptTransfer.TransferBufferLength = length;
很可能将内存污染。不知道我的说法是否正确,我在vc++里做试验证实我是想法是对的。各位高手说呢?

[编辑 -  7/18/03 by  chrys]
天才来自勤奋 知识要靠学习 [url= http://ndxz.126.com]――欢迎来我家做客――[/url]
kilroy_guo
驱动大牛
驱动大牛
  • 注册日期2002-10-29
  • 最后登录2005-11-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-07-18 11:35
typedef struct _URB {
  union {
......
}
}URB, *PURB ;

请参考联合体用法
二姑家的猫想......
gjltce
驱动小牛
驱动小牛
  • 注册日期2003-07-05
  • 最后登录2011-12-10
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望59点
  • 贡献值0点
  • 好评度25点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-07-18 11:56
楼上说的是。
chrys
驱动小牛
驱动小牛
  • 注册日期2002-05-30
  • 最后登录2008-07-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-07-18 12:06
typedef struct _URB {
  union {
......
}
}URB, *PURB ;

请参考联合体用法
不好意思,我看帮助的时候没注意到它是联合,呵呵,谢谢你!
天才来自勤奋 知识要靠学习 [url= http://ndxz.126.com]――欢迎来我家做客――[/url]
游客

返回顶部