Alfred
驱动牛犊
驱动牛犊
  • 注册日期2001-07-12
  • 最后登录2002-01-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2172回复:8

怎样从FIRMWARE中取得短的数据???

楼主#
更多 发布于:2001-10-30 21:28
我想从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

我不知道是哪里出了问题,以至于我的应用程序不能得到正确的数据

我想可能是类型不能匹配的问题,但是我又不知道该怎么处理?

哪位高手能帮我解决一下,我将不胜感激!多谢!!!
尽管我不喜欢做驱动程序,但是我还是不得不做,既然做了,就要做好!
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2001-11-05 09:52
ntStatus = IsoUsb_CallUSBD(DeviceObject, urb);
以后,你要看一下urb->UrbControlVendorClassRequest.TransferBufferLength是否是你要读取的数据的长度.另外,到softice里面设置断点,看看buffer里面的数据是否是你要的,有时候因为没有把结构对齐,也会出现问题.
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
mushy
驱动牛犊
驱动牛犊
  • 注册日期2001-07-30
  • 最后登录2004-06-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2001-11-04 09:30
[QUOTE]原本由 Alfred 发表
[B]这几天我又试了好多种方法来得到我的数据,但是都失败了。
斑竹有没有什么现成的好程序来得到这样的数据(0或者1)
真的是很奇怪,怎么会得不到呢??

还请斑竹帮帮我!!! [/B][/QUOTE]

斑竹不是已经提示你了吗?虽然具体什么意思我也看不懂,现在还暂时不需要做驱动!所以还没学
共同学习,一块进步 勤学,多问,善于思考
Alfred
驱动牛犊
驱动牛犊
  • 注册日期2001-07-12
  • 最后登录2002-01-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2001-11-03 22:07
这几天我又试了好多种方法来得到我的数据,但是都失败了。
斑竹有没有什么现成的好程序来得到这样的数据(0或者1)
真的是很奇怪,怎么会得不到呢??

还请斑竹帮帮我!!!
尽管我不喜欢做驱动程序,但是我还是不得不做,既然做了,就要做好!
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2001-11-02 13:31
IsoUsb_GetzlInfor里面,你没有判断urb实际读到的数据的长度.如果usbd.sys根本没有收到任何数据,你根本不知道.
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
Alfred
驱动牛犊
驱动牛犊
  • 注册日期2001-07-12
  • 最后登录2002-01-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2001-10-31 15:39
我按照你们所说的错误有改动了一些东西,测试了一个上午加中午,还是得不到正确的数据。

我是参考WDMBOOK上的USBKBD例子中的GETSTATUS来做的,我自己定义了一个DEVICEIOCTL,用厂商自定义的控制传输。

斑竹老人家可否提出建议,看看是哪里出了问题?我好去找出问题所在,真是急死我了!
尽管我不喜欢做驱动程序,但是我还是不得不做,既然做了,就要做好!
Alfred
驱动牛犊
驱动牛犊
  • 注册日期2001-07-12
  • 最后登录2002-01-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2001-10-31 12:08
**********************************************************
那个success所等于的数值应该放在大括号{}内,而不是小括号(),
**********************************************************

怎么放在大括号里面,我觉得我那样使用是没有问题的,因为我成功的得到了各种描述符,而且我看了很多例子程序,都是那样写的,应该没有问题的。
mushy,那么你说应该怎么改写?
尽管我不喜欢做驱动程序,但是我还是不得不做,既然做了,就要做好!
mushy
驱动牛犊
驱动牛犊
  • 注册日期2001-07-30
  • 最后登录2004-06-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2001-10-31 10:04
在你的应用程序中,你调用inctl的格式好象不太对!~:(
那个success所等于的数值应该放在大括号{}内,而不是小括号(),
编程很死板,我们必须按照规定的格式去书写,否则就可能会出错!不知道是不是这个原因!调试后结果正确了别忘了告诉我们结果!
祝你好运!~:)
共同学习,一块进步 勤学,多问,善于思考
singwoo
驱动牛犊
驱动牛犊
  • 注册日期2001-09-10
  • 最后登录2002-02-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于: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);







singwoo
游客

返回顶部