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

如何取得實體硬碟對應的磁碟代號

尚未結案
ura
一般會員


發表:2
回覆:9
積分:2
註冊:2002-08-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-02-23 17:33:53 IP:61.221.xxx.xxx 未訂閱
參考到此篇文章~ http://delphi.ktop.com.tw/topic.php?topic_id=38394 從登錄檔獲取磁碟機資訊[HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices]~ 不過只能對應到隨身碟或光碟~ 如果遇到硬碟或外接式USB硬碟就不適用了~    參考至此~也不是完全沒辦法~ http://www.goodells.net/multiboot/partsigs.htm 只要能取得實體硬碟的 DiskID 就能拿來跟前四個位元組比較~    而如何取得 DiskID 就是我想問的問題~ 最好能使用 DeviceIoControl 取得,如此一來才能對應到一些資訊~ 或者是還有其他對應的方法?    ps.WMI可以用,不過掃 Win32_LogicalDiskToPartition 軟碟機會很吵(這是問題的根源)~
juneo
高階會員


發表:103
回覆:190
積分:118
註冊:2004-05-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-02-25 17:26:21 IP:211.20.xxx.xxx 未訂閱
procedure TDiskInfoForm.GetSpecifyDiskInfor(DriverName: String);
var
   dwSectPerClust, dwBytePerClust, dwFreeClust, dwClust: DWORD;
begin
   if GetDiskFreeSpace(PChar(DriverName), dwSectPerClust,
                       dwBytePerClust, dwFreeClust, dwClust) then
   begin
     Gauge1.MaxValue:= dwClust;
      Gauge1.Progress:= dwClust - dwFreeClust;
   end
   else Gauge1.Progress:= 0;
   Label12.Caption:=InttoStr(dwClust * dwSectPerClust * dwBytePerClust div 1024) 'KB';
   Label14.Caption:=InttoStr(dwFreeClust * dwSectPerClust * dwBytePerClust div 1024) 'KB';
end;    procedure TDiskInfoForm.GetFullDriveInfor(DriverName: String);
var
   nDriveType: Integer;
   lpVolName: array [0..200] of Char;
   lpFSNameBuff: array [0..50] of Char;
   dwVolSer, lpMaxComLen, lpFSFlags: DWORD;
begin
   nDriveType:= GetDriveType(PChar(DriverName));
   Case nDriveTYpe of
        0: Label3.Caption:= '不知道';
        1: Label3.Caption:= '路徑未知';
        DRIVE_REMOVABLE: Label3.Caption:= '軟碟機';
        DRIVE_FIXED: Label3.Caption:= '硬碟機';
        DRIVE_REMOTE: Label3.Caption:= '網路磁碟機';
        DRIVE_CDROM: Label3.Caption:= '光碟機';
        DRIVE_RAMDISK: Label3.Caption:= '虛擬磁碟機';
   else Label3.Caption:= '不知道';
   end;
   if GetVolumeInformationA(PChar(DriverName), lpVolName, 200, @dwVolSer,
                         lpMaxComLen, lpFSFlags, lpFSNameBuff, 50) then
   begin
      if dwVolSer = 0 then
         Label5.Caption:= ''
      else
         Label5.Caption:= InttoHex(dwVolSer,8);
      Label7.Caption:= lpVolName;
      Label9.Caption:= lpFSNameBuff;
   end
   else begin
         Label5.Caption:= '';
         Label7.Caption:= 'no Volume Available';
         Label9.Caption:= 'no Disk'
   end;
   GetSpecifyDiskInfor(DriverName);
end;    procedure TDiskInfoForm.FormCreate(Sender: TObject);
var
   lp: array[0..100] of Char;
   i: Integer;
begin
   GetLogicalDriveStrings(100, lp);
   i:= 0;
   while (True) do
   begin
      if lp[i] = #0 then Break;
      ComboBox1.Items.Add(UpperCase(lp i));
      i:= i 4;
   end;
   ComboBox1.Text:= 'C:\';
   GetFullDriveInfor(ComboBox1.Text);
end;    procedure TDiskInfoForm.ComboBox1Change(Sender: TObject);
begin
   GetFullDriveInfor(ComboBox1.Text);
end;    procedure TDiskInfoForm.Timer1Timer(Sender: TObject);
begin
     if (ComboBox1.Text <> 'A:\') or (ComboBox1.Text <> 'B:\') then
        GetSpecifyDiskInfor(ComboBox1.Text);
end;    procedure TDiskInfoForm.Button1Click(Sender: TObject);
begin
close;
end;    end.
 
自然就是寫程式最好的方式, 分享比獲得更快樂--Juneo 發表人 - juneo 於 2005/02/25 17:36:30
ura
一般會員


發表:2
回覆:9
積分:2
註冊:2002-08-01

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-02-26 15:49:04 IP:218.164.xxx.xxx 未訂閱
謝謝回應~ 不過範例只看到磁碟區資訊~ 我想要的是「實體硬碟對應到的磁碟區」~ 而實體硬碟的資訊我是由 DeviceIoControl 或 WMI 取得~ 希望能有辦法知道相對應的磁碟區(C:\,D:\,E:\...)~
conundrum
尊榮會員


發表:893
回覆:1272
積分:643
註冊:2004-01-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-02-26 17:59:41 IP:218.175.xxx.xxx 未訂閱
用比較另類的想法 在cmd.exe下使用這個老指令 MOUNTVOL 應該是全都露啦 要判斷就利用 MOUNTVOL /L >c:\1234找硬碟嗎先找OS系統下的help.txt 發表人 - conundrum 於 2005/02/26 18:11:34
cashyy
高階會員


發表:117
回覆:322
積分:212
註冊:2004-04-30

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-02-28 01:19:33 IP:59.104.xxx.xxx 未訂閱
GetVolumeInformation為取得所有硬碟名稱、序號及格式 看看是不是你要的!
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//清除ListBox1所有文字
ListBox1->Clear();
//取得現在運行的邏輯磁碟
DWORD Drives = ::GetLogicalDrives();
for(int x = 0; x < 32;   x)
    if(Drives & (1 << x))
       {
       String fs;
       String Drive = AnsiString(char('A'   x))   ":\\";
       DWORD sn, fsf;
       char Volume[80], snb[80], fsfb[80];
       //取得指定磁碟序號&格式
       if(::GetVolumeInformation(Drive.c_str(),
                                 Volume, sizeof(Volume),
                                 &sn, 0,
                                 &fsf,
                                 fsfb, sizeof(fsfb)))
          {
          sprintf(snb, "%X", sn);
          Drive  = " "   AnsiString(Volume)   ", 磁碟序號:"  
                   String(snb)  ", 磁碟格式:"   String(fsfb);
          }
      //將結果顯示在ListBox1上
      ListBox1->Items->Add(Drive);
      }
}
//---------------------------------------------------------------------------
ura
一般會員


發表:2
回覆:9
積分:2
註冊:2002-08-01

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-02-28 19:55:28 IP:220.143.xxx.xxx 未訂閱
to conundrum: 這個指令列出來的是 \\?\Volume{xxx...} 和登錄檔中的一樣~不曉得這資訊該怎麼用? = =b to cashyy: GetVolumeInformation 的用法 juneo兄 已經寫在第二篇回應~ 這個 API 看不出來實體硬碟的資訊啊@@~
conundrum
尊榮會員


發表:893
回覆:1272
積分:643
註冊:2004-01-06

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-03-01 00:50:49 IP:218.175.xxx.xxx 未訂閱
引言:登錄檔中的一樣~不曉得這資訊該怎麼用
那個{xxx...}如一樣的代表是同一顆的hdd下分割的 邏輯磁區 如C: D: 所以光前4瑪只能判斷 是否同一顆 請問一下你使用 MOUNTVOL 是否都是正確的 我可以這樣說 登錄檔中的資料會殘留 所以光讀reg那機碼 是會誤判的 1 參考Windows DDK的sample 2 WDM Driver 3 SMBus ACPI 要不透過 OS 系統資料就得靠 SMBus 這類玩意 基本上 SMBus 沒啥人開放windows的資料可查Linux上就有 查看一下此bcb老版主的資料 應該是有意外收獲 不過那個只for xp 2k不行有bug http://delphi.ktop.com.tw/pop_profile.asp?mode=display&id=2079 基本上 我已說 另類想法 所以幫不上了 哈哈 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=62793
ura
一般會員


發表:2
回覆:9
積分:2
註冊:2002-08-01

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-03-01 10:21:25 IP:61.221.xxx.xxx 未訂閱
引言: 那個{xxx...}如一樣的代表是同一顆的hdd下分割的 邏輯磁區 如C: D:
登錄檔中的資料的確會殘留,用 MOUNTVOL 是比較正確~ 不過 {xxx...}(應該是GUID) 並不會相同,仔細看的話~ GUID第一組是流水號喔~ 很感謝 conundrum 提供資訊~ 我會這些方向去研究(雖然不曉得會不會有成果^^;)~ 另外不曉得你是指版主的哪篇文章?
conundrum
尊榮會員


發表:893
回覆:1272
積分:643
註冊:2004-01-06

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-03-01 22:08:57 IP:218.175.xxx.xxx 未訂閱
引言: 另外不曉得你是指版主的哪篇文章?
大哥 幫幫忙 除非你連查看的能力都沒有 不然問我這你的勞動問題 = 是侮辱庵喔 就算是幾百篇中的一篇 也是有機可尋 你還要庵查給你嗎? 不然可以去
ura
一般會員


發表:2
回覆:9
積分:2
註冊:2002-08-01

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-03-01 22:56:40 IP:218.164.xxx.xxx 未訂閱
引言: 大哥 幫幫忙 除非你連查看的能力都沒有 不然問我這你的勞動問題 = 是侮辱庵喔 就算是幾百篇中的一篇 也是有機可尋 你還要庵查給你嗎? 不然可以去>< face="Verdana, Arial, Helvetica"> 真是不好意思~ 侮辱到你了~ 因為你有提到「不過那個只for xp 2k不行有bug」~ 還以為有特定文章~ 如果真那麼容易找到我也不會發問了啊~ 發表人 - ura 於 2005/03/01 22:59:34
conundrum
尊榮會員


發表:893
回覆:1272
積分:643
註冊:2004-01-06

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-03-01 23:14:11 IP:218.175.xxx.xxx 未訂閱
喔    是阿 http://delphi.ktop.com.tw/quicksearch.exe/quicksearch?SearchStr=%B0%D1%A6%D2Windows+DDK%AA%BAsample 2選一    真正侮辱我
ura
一般會員


發表:2
回覆:9
積分:2
註冊:2002-08-01

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-03-01 23:37:25 IP:218.164.xxx.xxx 未訂閱
其中一篇就是本篇~ 另一篇用的是 SetupDixxx 這組 API,我真的也試過了~ 取到的東西也對應不起來,無計可施之下才來求助的~ 並不是真的想侮辱你~ 誤會~誤會~ 請息怒~ m(_ _)m
conundrum
尊榮會員


發表:893
回覆:1272
積分:643
註冊:2004-01-06

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-03-01 23:48:19 IP:218.175.xxx.xxx 未訂閱
http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q264203 再給你看看 自己再查把 一樣的轉放於KTOP http://delphi.ktop.com.tw/topic.php?TOPIC_ID=65998 發表人 - conundrum 於 2005/03/01 23:56:47
ura
一般會員


發表:2
回覆:9
積分:2
註冊:2002-08-01

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-03-02 10:21:00 IP:61.221.xxx.xxx 未訂閱
之所以說試過 SetupDixxx 是因為我上個問題的解決方式就是用 EnumCD~ http://delphi.ktop.com.tw/topic.php?TOPIC_ID=64838 而 EnumDisk 和 EnumCD 程式碼如出一轍~    剛剛看了一下發現 Product Revision 大不同~ 很像我要的 DiskID~可惜比對之後不是~ 再次感謝
conundrum
尊榮會員


發表:893
回覆:1272
積分:643
註冊:2004-01-06

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-03-02 23:04:03 IP:218.175.xxx.xxx 未訂閱
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=66072 下載解壓有個cmd目錄 用CompInfo.exe試看看
ura
一般會員


發表:2
回覆:9
積分:2
註冊:2002-08-01

發送簡訊給我
#16 引用回覆 回覆 發表時間:2005-03-03 11:34:01 IP:61.221.xxx.xxx 未訂閱
其他資訊不說~ 看起來像是 EnumDisk EnumCD juneo兄的程式碼~ 殘念~沒有我想要的東西~ 不過其他資訊很豐富,要花點時間看~ 有個方向也比較好研究^^~ 暫時就先用WMI頂著了~ 謝謝 conundrum ~ 來去研究資料~
系統時間:2024-05-04 20:26:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!