線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4866
推到 Plurk!
推到 Facebook!

DeviceIoControl 永遠都 return FALSE !!

答題得分者是:ahkuan
cknight
一般會員


發表:2
回覆:3
積分:1
註冊:2004-06-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-11-16 14:46:18 IP:220.130.xxx.xxx 訂閱
網上各位先知大大:
小弟最近正在做一各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< sprintf(szDrvName,"%c:\\",'A' drive);
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-11-17 15:32:14 IP:210.68.xxx.xxx 訂閱
既然可以執行到GetDisksProperty(),表示有抓到Device,否則CreateFile早就失敗。
而DeiceIoControl Failed的話,應該是你DeviceIoControl的參數pDevDesc...等有問題,SCSI Command還沒發下去。

我沒用過IOCTL_STORAGE_GET_DEVICE_NUMBER,所以可能參數沒辦法幫了!
cknight
一般會員


發表:2
回覆:3
積分:1
註冊:2004-06-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-11-17 18:11:35 IP:220.130.xxx.xxx 訂閱
謝謝 Harrypp 大大的指教,程式確實有抓到 device 的 handle。
小弟剛剛在看了一下程式,"IOCTL_STORAGE_GET_DEVICE_NUMBER" 是小弟我測試用的,這個可以讀到資料,
但"IOCTL_STORAGE_QUERY_PROPERTY" 則永遠都是回傳 false,這才是小弟的問題所在~
麻煩大大們再幫幫小弟啊~~


ahkuan
一般會員


發表:2
回覆:7
積分:6
註冊:2007-05-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-07-13 14:28:18 IP:60.250.xxx.xxx 訂閱

===================引 用 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-07-13 17:31:06 IP:220.130.xxx.xxx 訂閱

===================引 用 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-07-13 17:47:28 IP:60.250.xxx.xxx 訂閱

===================引 用 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-07-14 13:50:35 IP:220.132.xxx.xxx 訂閱
我是都沒勾過那個選項,有可能很多型態我都從新定義過Byte,Word....,
比較不會發生這類問題。
另外IOCTL_XXX討厭的是參數很難try,所以我除非要查USB上層的節點關係,
否則若只需要查USB Device的話,我會直接下 IOCTL_SCSI_PASS_THROUGH
cknight
一般會員


發表:2
回覆:3
積分:1
註冊:2004-06-14

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-07-16 09:41:09 IP:220.130.xxx.xxx 訂閱
Dear ahkuan & harrypp 大大,


謝謝兩位的幫忙,真的很難取捨誰得分,ahkuan 大大先解決了小弟的問題,所以.....


但是,還是非常感謝兩位大大~

網路上還是溫暖的~
ahkuan
一般會員


發表:2
回覆:7
積分:6
註冊:2007-05-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-07-16 11:05:41 IP:60.250.xxx.xxx 訂閱
你太客氣了,我也是剛好有這方面的需求,在網路上有找到相關的解決方法,自已試過,可以解決後,就把我試後的結果post出來
harrypp
中階會員


發表:7
回覆:124
積分:61
註冊:2006-08-31

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-07-16 12:43:29 IP:210.68.xxx.xxx 訂閱
不錯...我也多學了一招。感謝分享!
系統時間:2024-04-18 14:20:57
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!