最近在调试一个PC操作USB Massstorage设备的工具,通过DeviceIoControl()函数读取约1-2M的数据,但是传入数据长度以后函数返回错误,原因是长度超过了规定的transfer len。从网上找了半天,在国外论坛发现一个类似的问题解决,即:用IOCTL_STORAGE_QUERY_PROPERTY 命令得到一个Max transfer length,然后根据实际情况解决,没有具体说明。我自己定的方向是,将数据分段连续接收,所以需要动态地知道Max transfer length,话不多说,直接上方法:
通过IOCTL_STORAGE_QUERY_PROPERTY 读取一个STORAGE_ADAPTER_DESCRIPTOR的结构,这个结构中的MaximumTransferLength就是要Transfer length的限值。
<p>
</p><p> int MaxTransferLen = 0;</p> STORAGE_PROPERTY_QUERY Query;
DWORD dwOutBytes;
Query.PropertyId = StorageAdapterProperty;
Query.QueryType = PropertyStandardQuery;
STORAGE_ADAPTER_DESCRIPTOR AdapterDesc;
AdapterDesc.Size = sizeof(STORAGE_ADAPTER_DESCRIPTOR) + 512 - 1;
status = DeviceIoControl(fileHandle, //设备句柄 ---自己定
IOCTL_STORAGE_QUERY_PROPERTY,
&Query, sizeof(STORAGE_PROPERTY_QUERY),
&AdapterDesc, AdapterDesc.Size,
&dwOutBytes,
(LPOVERLAPPED)NULL);
if (status)
{
MaxTransferLen = AdapterDesc.MaximumTransferLength;
// CString sDis; /// --
// sDis.Format("max transfer len :%d", adapter_desc.MaximumTransferLength);
// AfxMessageBox(sDis);
}