阅读:1636回复:3
NTDDK中的usb例子代码里有个问题我百思不得其解,不知道是我的问题还是ms的错误,大家来看看吧。
里面有个叫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] |
|
|
沙发#
发布于:2003-07-18 12:06
typedef struct _URB {不好意思,我看帮助的时候没注意到它是联合,呵呵,谢谢你! |
|
|
板凳#
发布于:2003-07-18 11:56
楼上说的是。
|
|
地板#
发布于:2003-07-18 11:35
typedef struct _URB {
union { ...... } }URB, *PURB ; 请参考联合体用法 |
|
|