leadphone
驱动牛犊
驱动牛犊
  • 注册日期2002-11-28
  • 最后登录2008-09-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1865回复:7

在应用程序中接收驱动(.sys)返回的数据--关于函数BuildVendorRequest()和BuildBulkTransfer()的困惑

楼主#
更多 发布于:2004-08-17 10:59
驱动中,m_Lower.BuildVendorRequest()发送的vendor请求接收到设备返回的数据(标示状态的一个字节),此数据在驱动中可通过I.IoctlBuffer()访问到
!!!请问在应用程序中怎么访问到这个数据?

是否一定要用m_Lower.BuildBulkTransfer()函数,才能通过DeviceIoControl()的lpOutBuffer参数访问到设备的返回数据?
 

最新喜欢:

icedogicedog
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-08-17 12:12
返回数据在你的deviceiocontrol函数的参数里,vendor request的数据传输和bulk传输一样,没什么区别。你用bulk传输是从那里获得数据,vendor传输的数据也是从那里获得的。
leadphone
驱动牛犊
驱动牛犊
  • 注册日期2002-11-28
  • 最后登录2008-09-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-08-17 14:31
这就奇怪了,我每个参数显示过去,发现都不是我device的返回值。
(已经验证device正确返回,host驱动也正确收到)

能明指是哪一个参数吗?
BOOL DeviceIoControl(
  HANDLE hDevice,
  DWORD dwIoControlCode,
  LPVOID lpInBuffer,
  DWORD nInBufferSize,
  LPVOID lpOutBuffer,
  DWORD nOutBufferSize,
  LPDWORD lpBytesReturned,
  LPOVERLAPPED lpOverlapped
);
leadphone
驱动牛犊
驱动牛犊
  • 注册日期2002-11-28
  • 最后登录2008-09-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-08-17 15:05
刚才看了一下,函数DeviceIoControl的参数lpBytesReturned值居然是0,可我的设备明明返回了数据。在bushound里也可以看到host发出vender请求,设备返回数据。

???

另:感谢jinghuiren一直以来给我的帮助,放分!
leadphone
驱动牛犊
驱动牛犊
  • 注册日期2002-11-28
  • 最后登录2008-09-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-08-17 15:27
搞定,感谢 :D
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-08-18 14:18
搞定了把结果贴出来啊
我的设备用vendor通讯是成功的,而且返回数据也能正确接收到
不过唯一的权限就是函数返回值是0!用getlasterror看说是操作成功执行!
后来因为不影响使用和时间关系没有做深究,也许你的问题恰恰是我当初遇到的问题呢
来,说来听听,要是能解决我的问题,回100分给你! :D
leadphone
驱动牛犊
驱动牛犊
  • 注册日期2002-11-28
  • 最后登录2008-09-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-08-18 15:00
NTSTATUS TestDevice::TEST_IOCTL_STATUS_Handler(KIrp I)
{
NTSTATUS status = STATUS_SUCCESS;
ULONG ulReturned = 0;
t << "Entering TestDevice::TEST_IOCTL_STATUS_Handler, " << I << EOL;


PURB pUrb = m_Lower.BuildVendorRequest(
(unsigned char*)I.IoctlBuffer(), // transfer buffer
I.IoctlInputBufferSize(), // transfer buffer size
0, // request reserved bits
(UCHAR)GET_STATUS, // request
0, // Value
TRUE, // bIn
TRUE, // bShortOk
NULL, // Link
0 // Index
);
//transmit
status = m_Lower.SubmitUrb(pUrb,NULL,NULL,1500L);

ulReturned = pUrb->UrbControlTransfer.TransferBufferLength;
t << "ulReturned " <<ulReturned << EOL;

if(NT_SUCCESS(status))
{
t << "NT_SUCCESS " << I << EOL;
    }
   
{

I.Information() = ulReturned;
I.Status() = status;
}

return status;
}
这是我的io_ctl_xxx。
我加入了:
ulReturned = pUrb->UrbControlTransfer.TransferBufferLength;
然后把:
I.Information() = ulReturned;

这样在应用程序的deviceiocontrol()的pOutput参数就指向设备返回值得起始地址了。

而开始对I.Information() = 0;的时候,deviceiocontrol()的poutput则无结果。

希望对你有帮助 :D
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-08-18 16:40
呵呵,我立马去看看,也许就是这个原因
因为当初写驱动的时候返回值是1的,可是后来改着改着就一直是0了。
呵呵,到灌水板来,给你200,偶从不食言 :D
游客

返回顶部