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

請問如何取得已插入USB裝置的磁碟代號?

缺席
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-03-10 15:45:28 IP:61.220.xxx.xxx 訂閱
請問如何取得已插入USB裝置的磁碟代號?
這篇的程式執行後雖然可以偵測出USB裝置的插拔
但是無法偵測出已經插入的
[所有][發表] 偵測USB儲存裝置的插拔和磁碟代號(含SourceCode)
http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=91493
下面這篇研究中..
請問如何用 Registry 取得 USB 隨身碟的磁碟代號?
http://delphi.ktop.com.tw/board.php?cid=30&fid=73&tid=92400
還有其他方法嗎?
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
編輯記錄
pcboy 重新編輯於 2008-03-12 16:39:22, 註解 無‧
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-03-12 15:45:38 IP:61.220.xxx.xxx 訂閱
研究了點心得
[code cpp]
procedure TForm1.Button3Click(Sender: TObject);
var
r: LongWord;
Drives: array[0..128] of char;
pDrive: pchar;
i: Integer;
DriverName: String;
nDriveType: Integer;
lpVolName: array [0..200] of Char;
lpFSNameBuff: array [0..50] of Char;
dwVolSer, lpMaxComLen, lpFSFlags: DWORD;
begin
Memo1.Lines.Clear;
r := GetLogicalDriveStrings(sizeof(Drives), Drives);
if r = 0 then exit;
if r > sizeof(Drives) then
raise Exception.Create(SysErrorMessage(ERROR_OUTOFMEMORY));
pDrive := Drives; // Point to the first drive
for i:=0 to (r div 4)-1 do
begin
case GetDriveType(pDrive) of
0 : Memo1.Lines.Add(pDrive ' : The drive type cannot be determined.');
1 : Memo1.Lines.Add(pDrive ' : The root directory does not exist.');
DRIVE_REMOVABLE : Memo1.Lines.Add(pDrive ' : DRIVE_REMOVABLE');
DRIVE_FIXED : Memo1.Lines.Add(pDrive ' : DRIVE_FIXED');
DRIVE_REMOTE : Memo1.Lines.Add(pDrive ' : DRIVE_REMOTE');
DRIVE_CDROM : Memo1.Lines.Add(pDrive ' : DRIVE_CDROM');
DRIVE_RAMDISK : Memo1.Lines.Add(pDrive ' : DRIVE_RAMDISK');
else
Memo1.Lines.Add(pDrive ' : UNKNOWN');
end;
DriverName := pDrive;
if GetVolumeInformationA(PChar(DriverName), lpVolName, 200, @dwVolSer,
lpMaxComLen, lpFSFlags, lpFSNameBuff, 50) then
begin
if dwVolSer = 0 then
Memo1.Lines.Add('Volume Serial Number : 0')
else
Memo1.Lines.Add('Volume Serial Number : ' InttoHex(dwVolSer,8));
Memo1.Lines.Add('Volume Name : ' lpVolName);
Memo1.Lines.Add('FileSystem Name Buffer : ' lpFSNameBuff);
end
else begin
Memo1.Lines.Add('Volume Serial Number : N/A');
Memo1.Lines.Add('Volume Name : no Volume Available');
Memo1.Lines.Add('FileSystem Name Buffer : No Disk')
end;
// GetSpecifyDiskInfor(DriverName);
Memo1.Lines.Add('');
inc(pDrive, 4); // Point to the next drive
end;
end;
[/code]
問題來了
A:\ : DRIVE_REMOVABLE
C:\ : DRIVE_FIXED
D:\ : DRIVE_FIXED
E:\ : DRIVE_FIXED
F:\ : DRIVE_CDROM
G:\ : DRIVE_CDROM 這台是 酒精 模擬的光碟
I:\ : DRIVE_REMOVABLE
J:\ : DRIVE_REMOVABLE
K:\ : DRIVE_FIXED
L:\ : DRIVE_REMOVABLE
A 是軟碟
I, J, K 其實是 數位相簿(外接 USB HD), 店家用 Partition Magic 做出 120 GB FAT32 (K碟), I, J其實是完全沒有內容的
L 是 USB 隨身碟
要如何判斷 DRIVE_REMOVABLE 是 Floppy 或 USB 隨身碟 or USB HD ?
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
編輯記錄
pcboy 重新編輯於 2008-03-12 16:49:47, 註解 無‧

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-03-12 16:16:42 IP:60.249.xxx.xxx 未訂閱
讀的到產品的 ID code 的話, 應該就知道插入了什麼. 就像安裝 driver 時會知道裝了什麼硬體. ( 品牌-產品名稱 ).

FYI.

===================引 用 pcboy 文 章===================
要如何判斷 DRIVE_REMOVABLE 是 Floppy 或 USB 隨身碟 or USB HD ?
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-03-12 16:53:29 IP:61.220.xxx.xxx 訂閱
請教一下, 要用甚麼 Function 去查 ID ?
小弟後來發現 GetVolumeInformationA 可以查出進一步資訊 (上面程式碼更新了)
但是取得的資訊不包含 ID

------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-03-12 21:40:00 IP:202.132.xxx.xxx 未訂閱
詳細的我不清楚, 低階一點的協定文件應該會有提到. 
USB 存取裝置應有一標準的協定, 只要滿足協定內容, Device就可以使用.

FYI.
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-03-12 21:43:31 IP:202.132.xxx.xxx 未訂閱
請問您得到的資訊有那些?
===================引 用 pcboy 文 章===================
請教一下, 要用甚麼 Function 去查 ID ?
小弟後來發現 GetVolumeInformationA 可以查出進一步資訊 (上面程式碼更新了)
但是取得的資訊不包含 ID

------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-03-12 23:00:22 IP:202.132.xxx.xxx 未訂閱
View 了一些文件. 事實上你接了USB device 到電腦時, 其實它所有描述  data 已經 scan 到電腦裡了, 只是你沒有把它讀出來.



上面是我電腦用 USB Device View 所看到的, 程式是M$ 1999 開發時用的吧, 我沒有 source code.
從上面就可以清楚的看到我接了2個 USB device. (無線滑鼠 無線網卡) 而且知道接在那一個Host controller 的那一個 port
右邊就可以看到它是什麼Device, 什麼廠牌, 速度, 資料長度............等.
安裝 driver 只是提供user一個function去存取這個device.(你有閒的話這段自己寫就不用裝driver)

FYI.
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
編輯記錄
 重新編輯於 2008-03-12 23:05:52, 註解 無‧
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-03-13 09:14:43 IP:61.220.xxx.xxx 訂閱
感謝 ㊣ PM 給小弟的訊息 :
*******************************************************************
for usb
您可以找一下有無GetDeforbiddenor 或 GetDeviceDesc 的相關function.
*******************************************************************
Google "GetDeforbiddenor" 居然只有一篇, API 名稱正確???
Delphi.ktop討論區- 如何知道USB2.0裝置被判為插入USB1.1 Hub
http://delphi.ktop.com.tw/board.php?cid=168&fid=917&tid=62960
Google "GetDeviceDesc" 雖然有些資料
但 Google "GetDeviceDesc site:microsoft.com" 沒有半篇, API 名稱正確???

------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-03-13 09:18:50 IP:61.220.xxx.xxx 訂閱
http://msdn2.microsoft.com/en-us/library/aa364993(VS.85).aspx
BOOL WINAPI GetVolumeInformation(
__in_opt LPCTSTR lpRootPathName,
__out LPTSTR lpVolumeNameBuffer,
__in DWORD nVolumeNameSize,
__out_opt LPDWORD lpVolumeSerialNumber,
__out_opt LPDWORD lpMaximumComponentLength,
__out_opt LPDWORD lpFileSystemFlags,
__out LPTSTR lpFileSystemNameBuffer,
__in DWORD nFileSystemNameSize
);

正在研究這個Source Code
http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=38548

其實從 Registry 是可以查到某些資訊, 但是問題是以 GetLogicalDriveStrings 和從 Registry 得到的資訊該如何對應起來





===================引 用 文 章===================
請問您得到的資訊有那些?
===================引 用 pcboy 文 章===================
請教一下, 要用甚麼 Function 去查 ID ?
小弟後來發現 GetVolumeInformationA 可以查出進一步資訊 (上面程式碼更新了)
但是取得的資訊不包含 ID
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
編輯記錄
pcboy 重新編輯於 2008-03-13 09:22:25, 註解 無‧
pcboy 重新編輯於 2008-03-13 09:22:25, 註解 無‧
pcboy 重新編輯於 2008-03-13 09:22:47, 註解 無‧
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-03-13 09:24:15 IP:61.220.xxx.xxx 訂閱
這個很像從 Registry 撈出來的資料, 但是沒有包含 磁碟代號


===================引 用 文 章===================
View 了一些文件. 事實上你接了USB device 到電腦時, 其實它所有描述 data 已經 scan 到電腦裡了, 只是你沒有把它讀出來.


上面是我電腦用 USB Device View 所看到的, 程式是M$ 1999 開發時用的吧, 我沒有 source code.
從上面就可以清楚的看到我接了2個 USB device. (無線滑鼠 無線網卡) 而且知道接在那一個Host controller 的那一個 port
右邊就可以看到它是什麼Device, 什麼廠牌, 速度, 資料長度............等.
安裝 driver 只是提供user一個function去存取這個device.(你有閒的話這段自己寫就不用裝driver)

FYI.
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#11 引用回覆 回覆 發表時間:2008-03-13 11:21:44 IP:61.220.xxx.xxx 訂閱
Google 下面資訊中....

HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices 下你可以找到
磁碟機 名稱 及他屬於那一個儲存媒體的資訊(內含GUID)
GetVolumeNameForVolumeMountPoint
GetVolumePathNamesForVolumeName
SetupDiGetInterfaceDeviceDetail
DeviceIoControl
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\USBSTOR\之下就是有usb的裝置HardwareID
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
dt520
一般會員


發表:11
回覆:61
積分:14
註冊:2003-05-13

發送簡訊給我
#12 引用回覆 回覆 發表時間:2008-04-23 09:38:00 IP:116.62.xxx.xxx 訂閱
我也想知道!
找了很久,找到一个,不是DELPHI语言的,应该可行。
同时希望能译成DELPHI语言的。
在Win NT/2000/XP下, 可以用下面的方法(nHD从0开始):
void GetHDPartition(int nHD)
{
char buf0[33];
char buf1[128];
char buf2[2048];
DWORD dwNum;
HANDLE hDevice;
PARTITION_INFORMATION pi;
DRIVE_LAYOUT_INFORMATION* pdli;

wsprintf(buf0, "\\\\.\\PHYSICALDRIVE%d", nHD);
hDevice = CreateFile(buf0, GENERIC_READ, 0,
NULL, OPEN_EXISTING, 0, NULL);
if (hDevice==(HANDLE)-1) {
ShowMessage(SysErrorMessage(GetLastError()));
return;
}
pdli = (DRIVE_LAYOUT_INFORMATION*)buf2;
memset(buf2, 0, sizeof(buf2));
DeviceIoControl(hDevice, IOCTL_DISK_GET_DRIVE_LAYOUT,
NULL, 0, buf2, sizeof(buf2), &dwNum, NULL);
CloseHandle(hDevice);

GetLogicalDriveStrings(sizeof(buf1), buf1);
for(char* s=buf1; *s!=0; s =strlen(s) 1) {
if (GetDriveType(s)!=DRIVE_FIXED)
continue;
wsprintf(buf0, "\\\\.\\%c:", *s);
hDevice = CreateFile(buf0, GENERIC_READ,
FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
0, NULL);
if (hDevice==(HANDLE)-1) continue;
if (!DeviceIoControl(hDevice, IOCTL_DISK_GET_PARTITION_INFO,
NULL, 0, &pi, sizeof(pi), &dwNum, NULL)) {
CloseHandle(hDevice); continue;
}
for(int n=0; nPartitionCount; n ) {
if (memcmp(pdli->PartitionEntry n,&pi,
2*sizeof(LARGE_INTEGER))==0) {
MessageBox(0, s, "是指定硬盘上的一个分区",
MB_OK);
break;
}
}
CloseHandle(hDevice);
}
}

系統時間:2024-03-28 22:17:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!