天天看點

DeviceIoControl擷取max transfer長度

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