阅读:1866回复:7
在应用程序中接收驱动(.sys)返回的数据--关于函数BuildVendorRequest()和BuildBulkTransfer()的困惑
驱动中,m_Lower.BuildVendorRequest()发送的vendor请求接收到设备返回的数据(标示状态的一个字节),此数据在驱动中可通过I.IoctlBuffer()访问到
!!!请问在应用程序中怎么访问到这个数据? 是否一定要用m_Lower.BuildBulkTransfer()函数,才能通过DeviceIoControl()的lpOutBuffer参数访问到设备的返回数据? |
|
最新喜欢:![]() |
沙发#
发布于:2004-08-17 12:12
返回数据在你的deviceiocontrol函数的参数里,vendor request的数据传输和bulk传输一样,没什么区别。你用bulk传输是从那里获得数据,vendor传输的数据也是从那里获得的。
|
|
板凳#
发布于: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 ); |
|
地板#
发布于:2004-08-17 15:05
刚才看了一下,函数DeviceIoControl的参数lpBytesReturned值居然是0,可我的设备明明返回了数据。在bushound里也可以看到host发出vender请求,设备返回数据。
??? 另:感谢jinghuiren一直以来给我的帮助,放分! |
|
地下室#
发布于:2004-08-17 15:27
搞定,感谢 :D
|
|
5楼#
发布于:2004-08-18 14:18
搞定了把结果贴出来啊
我的设备用vendor通讯是成功的,而且返回数据也能正确接收到 不过唯一的权限就是函数返回值是0!用getlasterror看说是操作成功执行! 后来因为不影响使用和时间关系没有做深究,也许你的问题恰恰是我当初遇到的问题呢 来,说来听听,要是能解决我的问题,回100分给你! :D |
|
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 |
|
7楼#
发布于:2004-08-18 16:40
呵呵,我立马去看看,也许就是这个原因
因为当初写驱动的时候返回值是1的,可是后来改着改着就一直是0了。 呵呵,到灌水板来,给你200,偶从不食言 :D |
|