最近在調試一個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);
}