阅读:2170回复:8
怎样从FIRMWARE中取得短的数据???
我想从FIRMWARE中得到设备的一个信息(就是得到0或1就行了),我在驱动程序中这样定义:
NTSTATUS IsoUsb_GetzlInfor( IN PDEVICE_OBJECT DeviceObject, OUT PUCHAR ZLStatus ) { USHORT UrbSize = sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST); NTSTATUS ntStatus; PURB urb = (PURB)ExAllocatePool(NonPagedPool, UrbSize); if( urb ==NULL) { return STATUS_INSUFFICIENT_RESOURCES; } UsbBuildVendorRequest(urb, URB_FUNCTION_VENDOR_DEVICE, UrbSize, USBD_TRANSFER_DIRECTION_IN, 0, COMMAND_ZL, 0x0000, 0, &ZLStatus, NULL, 1, NULL); ntStatus = IsoUsb_CallUSBD(DeviceObject, urb); if(!NT_SUCCESS(ntStatus)||!USBD_SUCCESS(urb->UrbHeader.Status)) { ntStatus = STATUS_UNSUCCESSFUL; } ExFreePool(urb); return ntStatus; } 然后我在Dispatch里这样写: case IOCTL_ISOUSB_GET_ZL_INFOR: pst = (PUCHAR) ioBuffer; ntStatus = IsoUsb_GetzlInfor(DeviceObject, zlstatus); //get zhenling information and transmit it to Application if( NT_SUCCESS(ntStatus)) { RtlCopyMemory(pst,zlstatus,sizeof(zlstatus)); } break; 我想这个数据是不是就放在zlstatus里头 最后,我在应用程序里边定义了一个deviceiocontrol()想得到这个数据并显示出来,我的程序是: ULONG success; DWORD nBytes1; char zlstatus[16]; success = DeviceIoControl(IsoUsb, IOCTL_ISOUSB_GET_ZL_INFOR, NULL, 0, zlstatus, sizeof(zlstatus), &nBytes1, NULL); printf("\nsuccess = %d\n", success); if(success) { printf("\nzlstatus = %d\n", zlstatus[16]); printf("\nzlstatus = %d\n", *zlstatus); printf("\nzlstatus = %d\n", zlstatus); } else{ printf("\ncan't get zhenling information.\n"); } 但是一运行,不管设备发上来的数据是0还是1,我得到的总是 success = 1 zlstatus = 0 zlstatus = -52 zlstatus = 12454024 我不知道是哪里出了问题,以至于我的应用程序不能得到正确的数据 我想可能是类型不能匹配的问题,但是我又不知道该怎么处理? 哪位高手能帮我解决一下,我将不胜感激!多谢!!! |
|
|
沙发#
发布于:2001-10-31 09:03
windows 下的驱动程序没有编过。我仅从c语言的角度来看一下。
1。 printf("\nzlstatus = %d\n", zlstatus[16]); 当然总是为0,初始化后没有变过。 printf("\nzlstatus = %d\n", zlstatus); 打印的是地址值,当然也不变。 2。 UsbBuildVendorRequest声明如下: VOID UsbBuildVendorRequest( IN PURB Urb, IN USHORT Function, IN USHORT Length, IN ULONG TransferFlags, IN UCHAR ReservedBits, IN UCHAR Request, IN USHORT Value, IN USHORT Index, IN PVOID TransferBuffer, / OPTIONAL / IN PMDL TransferBufferMDL, / OPTIONAL / IN ULONG TransferBufferLength, IN PURB Link / OPTIONAL / ); 其中TransferBuffer是PVOID.而你传送的是: UsbBuildVendorRequest(urb, URB_FUNCTION_VENDOR_DEVICE, UrbSize, USBD_TRANSFER_DIRECTION_IN, 0, COMMAND_ZL, 0x0000, 0, &ZLStatus, //是否应将之改为:(PVOID)ZLStatus呢? NULL, 1, NULL); |
|
|
板凳#
发布于:2001-10-31 10:04
在你的应用程序中,你调用inctl的格式好象不太对!~:(
那个success所等于的数值应该放在大括号{}内,而不是小括号(), 编程很死板,我们必须按照规定的格式去书写,否则就可能会出错!不知道是不是这个原因!调试后结果正确了别忘了告诉我们结果! 祝你好运!~:) |
|
|
地板#
发布于:2001-10-31 12:08
**********************************************************
那个success所等于的数值应该放在大括号{}内,而不是小括号(), ********************************************************** 怎么放在大括号里面,我觉得我那样使用是没有问题的,因为我成功的得到了各种描述符,而且我看了很多例子程序,都是那样写的,应该没有问题的。 mushy,那么你说应该怎么改写? |
|
|
地下室#
发布于:2001-10-31 15:39
我按照你们所说的错误有改动了一些东西,测试了一个上午加中午,还是得不到正确的数据。
我是参考WDMBOOK上的USBKBD例子中的GETSTATUS来做的,我自己定义了一个DEVICEIOCTL,用厂商自定义的控制传输。 斑竹老人家可否提出建议,看看是哪里出了问题?我好去找出问题所在,真是急死我了! |
|
|
5楼#
发布于:2001-11-02 13:31
IsoUsb_GetzlInfor里面,你没有判断urb实际读到的数据的长度.如果usbd.sys根本没有收到任何数据,你根本不知道.
|
|
|
6楼#
发布于:2001-11-03 22:07
这几天我又试了好多种方法来得到我的数据,但是都失败了。
斑竹有没有什么现成的好程序来得到这样的数据(0或者1) 真的是很奇怪,怎么会得不到呢?? 还请斑竹帮帮我!!! |
|
|
7楼#
发布于:2001-11-04 09:30
[QUOTE]原本由 Alfred 发表
[B]这几天我又试了好多种方法来得到我的数据,但是都失败了。 斑竹有没有什么现成的好程序来得到这样的数据(0或者1) 真的是很奇怪,怎么会得不到呢?? 还请斑竹帮帮我!!! [/B][/QUOTE] 斑竹不是已经提示你了吗?虽然具体什么意思我也看不懂,现在还暂时不需要做驱动!所以还没学 |
|
|
8楼#
发布于:2001-11-05 09:52
ntStatus = IsoUsb_CallUSBD(DeviceObject, urb);
以后,你要看一下urb->UrbControlVendorClassRequest.TransferBufferLength是否是你要读取的数据的长度.另外,到softice里面设置断点,看看buffer里面的数据是否是你要的,有时候因为没有把结构对齐,也会出现问题. |
|
|