DeviceIoControl 永遠都 return FALSE !! |
答題得分者是:ahkuan
|
cknight
一般會員 發表:2 回覆:3 積分:1 註冊:2004-06-14 發送簡訊給我 |
網上各位先知大大:
小弟最近正在做一各USB相關的工具,爬了網站上許多篇文章,仍找不到解決的方式,特地將程式貼上來,請各位先知們指教一下小弟該如何解決此問題。 小弟的問題在此程式的最後面 "GetDisksProperty" 這個副程式的地方,result 的值永遠都是 false,why ? 整個程式編譯都沒有錯誤,但執行起來就是抓不到UDISK。我確定UDISK已經接到電腦上,且檔案總管也已經辨識到這個裝置。 這程式是網路上看到的,小弟將他抓下來小小的修改了一下。 麻煩哪為好新的大大們指導一下小弟~~謝謝! //--------------------------------------------------------------------------- #include #pragma hdrstop #include #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { int k = 0; DWORD MaxDriveSet, CurDriveSet; DWORD drive, drivetype; TCHAR szBuf[300]; TCHAR szMoveDiskName[33]; TCHAR szDrvName[33]; HANDLE hDevice; PSTORAGE_DEVICE_DESCRIPTOR pDevDesc; char* p; AnsiString astrStr; for(k=0; k<26; k ) szMoveDiskName[k] = '\0'; k = 1; MaxDriveSet = GetLogicalDrives(); CurDriveSet = MaxDriveSet; for ( drive = 2; drive < 32; drive ) { if ( MaxDriveSet & (1 << drive) ) { DWORD temp = 1< if(GetDriveType( szDrvName )== DRIVE_REMOVABLE) { drivetype = DRVREMOVE; sprintf(szBuf, "\\\\.\\%c:", 'A' drive); hDevice = CreateFile(szBuf, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL); if (hDevice != INVALID_HANDLE_VALUE) { pDevDesc = (PSTORAGE_DEVICE_DESCRIPTOR)new BYTE[ sizeof( STORAGE_DEVICE_DESCRIPTOR) 512 - 1]; pDevDesc->Size = sizeof( STORAGE_DEVICE_DESCRIPTOR) 512 - 1; if(GetDisksProperty(hDevice, pDevDesc)) { szMoveDiskName[k] = fBit2DriverName(temp); szMoveDiskName[0]=k; k ; p= (char*)pDevDesc; astrStr = (pDevDesc->VendorIdOffset ? &p[pDevDesc-> VendorIdOffset]:"(NULL)"); } delete pDevDesc; CloseHandle(hDevice); } } } }//end of for(drive); if(szMoveDiskName[0]==0) { astrStr="\r\nThere is no U-DISK on your system.\r\n"; } } //--------------------------------------------------------------------------- BOOL __fastcall TForm1::GetDisksProperty(HANDLE hDevice, PSTORAGE_DEVICE_DESCRIPTOR pDevDesc) { STORAGE_PROPERTY_QUERY Query; DWORD dwOutBytes; BOOL bResult; Query.PropertyId = StorageDeviceProperty; Query.QueryType = PropertyStandardQuery; bResult = DeviceIoControl(hDevice, IOCTL_STORAGE_QUERY_PROPERTY, &Query, sizeof(STORAGE_PROPERTY_QUERY), pDevDesc, pDevDesc->Size, &dwOutBytes, (LPOVERLAPPED)NULL); return bResult; } //--------------------------------------------------------------------------- char __fastcall TForm1::fBit2DriverName(unsigned long drive) { //TODO: Add your source code here char i; for (i = 0; i < 26; i) { if (drive & 0x1) break; drive = drive >> 1; } return (i 'A'); } |
harrypp
中階會員 發表:7 回覆:124 積分:61 註冊:2006-08-31 發送簡訊給我 |
|
cknight
一般會員 發表:2 回覆:3 積分:1 註冊:2004-06-14 發送簡訊給我 |
|
ahkuan
一般會員 發表:2 回覆:7 積分:6 註冊:2007-05-15 發送簡訊給我 |
===================引 用 cknight 文 章=================== 謝謝 Harrypp 大大的指教,程式確實有抓到 device 的 handle。 小弟剛剛在看了一下程式,"IOCTL_STORAGE_GET_DEVICE_NUMBER" 是小弟我測試用的,這個可以讀到資料, 但"IOCTL_STORAGE_QUERY_PROPERTY" 則永遠都是回傳 false,這才是小弟的問題所在~ 麻煩大大們再幫幫小弟啊~~ 解决方法: Project→Options→Compiler, 需要选中Compiling 里面的Treat enum type as ints. |
cknight
一般會員 發表:2 回覆:3 積分:1 註冊:2004-06-14 發送簡訊給我 |
===================引 用 ahkuan 文 章=================== ===================引 用 cknight 文 章=================== 謝謝 Harrypp 大大的指教,程式確實有抓到 device 的 handle。 小弟剛剛在看了一下程式,"IOCTL_STORAGE_GET_DEVICE_NUMBER" 是小弟我測試用的,這個可以讀到資料, 但"IOCTL_STORAGE_QUERY_PROPERTY" 則永遠都是回傳 false,這才是小弟的問題所在~ 麻煩大大們再幫幫小弟啊~~ 解决方法: ? Project→Options→Compiler, ? 需要选中Compiling ? 里面的Treat ? enum ? type ? as ? ints. Dear ahkuan 大大, 謝謝您的解答,小弟的問題經由您的幫忙已經解決了, 但這個選項是啥意思啊? |
ahkuan
一般會員 發表:2 回覆:7 積分:6 註冊:2007-05-15 發送簡訊給我 |
===================引 用 cknight 文 章=================== ===================引 用 ahkuan 文 章=================== ===================引 用 cknight 文 章=================== 謝謝 Harrypp 大大的指教,程式確實有抓到 device 的 handle。 小弟剛剛在看了一下程式,"IOCTL_STORAGE_GET_DEVICE_NUMBER" 是小弟我測試用的,這個可以讀到資料, 但"IOCTL_STORAGE_QUERY_PROPERTY" 則永遠都是回傳 false,這才是小弟的問題所在~ 麻煩大大們再幫幫小弟啊~~ 解决方法: ? Project→Options→Compiler, ? 需要选中Compiling ? 里面的Treat ? enum ? type ? as ? ints. Dearahkuan 大大, 謝謝您的解答,小弟的問題經由您的幫忙已經解決了, 但這個選項是啥意思啊? 就是把 enum 所定義的值,都是 int 會型態來定義囉,這樣的話長度或是一至的 |
harrypp
中階會員 發表:7 回覆:124 積分:61 註冊:2006-08-31 發送簡訊給我 |
我是都沒勾過那個選項,有可能很多型態我都從新定義過Byte,Word....,
比較不會發生這類問題。 另外IOCTL_XXX討厭的是參數很難try,所以我除非要查USB上層的節點關係, 否則若只需要查USB Device的話,我會直接下 IOCTL_SCSI_PASS_THROUGH。 |
cknight
一般會員 發表:2 回覆:3 積分:1 註冊:2004-06-14 發送簡訊給我 |
|
ahkuan
一般會員 發表:2 回覆:7 積分:6 註冊:2007-05-15 發送簡訊給我 |
|
harrypp
中階會員 發表:7 回覆:124 積分:61 註冊:2006-08-31 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |