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

[SDK]從PhysicalDrive列舉Logical Disk

 
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-05-12 18:35:40 IP:59.124.xxx.xxx 訂閱
利用以下程式碼可以取得單一Physical Drive所有mounted drive letter。
Handle則是PhysicalDrive Handle:CreateFileA(""\\\\.\\PHYSICALDRIVE%d"...%d為PhysicalDrive的編號
此程式碼可在VS2005 SP2編譯成功,取用者請自行翻成BCB、Delphi或其它語言版本。
使用場景主要是在使用USBBulk或3 party lib得到Drive Handle之後,部份lib無法提供drive letter或無法提供未經格式化的drive letter。
此法最主要是取得Physical Drive的DiskNumber,再取得目前本機上已經mount的disk letter,依次對各disk letter查詢其disk number。

程式碼適用平台:Win2k - Vista,IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS在舊版MSDN裡標示適用NT4,VS2005的MSDN則適用XP above,目前沒有NT4無法測試。

如有錯誤煩請指教。

[code cpp]
//#include "winioctl.h"
BOOL GetDiskLetterFromDeviceHandle(HANDLE hDevice, char* pLetterList, DWORD &pLetterCount)//compare disk number of each logical drive to the disk number of specified handle, we only process removable or fixed disk
{
STORAGE_DEVICE_NUMBER _sdn;
memset(&_sdn, 0, sizeof(STORAGE_DEVICE_NUMBER));
DWORD dwRetSize;
if(!::DeviceIoControl(hDevice, IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL, 0, &_sdn, sizeof(STORAGE_DEVICE_NUMBER), &dwRetSize, NULL))
{
pLetterCount = -1;
return FALSE;
}
int DiskNumber = _sdn.DeviceNumber;

const int LETTER_BUFFER_COUNT = SUPPORT_MAX_DRVE_LETTER*4 1;
char szAllLogicalDrive[LETTER_BUFFER_COUNT];
int LetterCnt = ::GetLogicalDriveStringsA(LETTER_BUFFER_COUNT, szAllLogicalDrive);
char sLetter[4];//string will be formed as "C:\\\0", so we need 4 bytes to store the disk letter
char dPath[7] = "\\\\.\\A:";
VOLUME_DISK_EXTENTS pVDX;
pLetterCount = 0;
for(int idx =0;idx*4 {
memset(sLetter, 0, 4);
memcpy(sLetter, &szAllLogicalDrive[idx*4], 4);
if((sLetter[0] == 'A') || (sLetter[0] == 'B')) continue;//A or B is reserved for floopy
switch(GetDriveTypeA(sLetter))
{
case DRIVE_REMOVABLE:
case DRIVE_FIXED:
{
dPath[4] = sLetter[0];
HANDLE hDevice = CreateFileA(dPath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(hDevice!=INVALID_HANDLE_VALUE)
{
memset(&pVDX, 0, sizeof(VOLUME_DISK_EXTENTS));
if(::DeviceIoControl(hDevice, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, NULL, 0, &pVDX, sizeof(VOLUME_DISK_EXTENTS), &dwRetSize, NULL))
if(pVDX.Extents[0].DiskNumber==DiskNumber) pLetterList[pLetterCount ]=sLetter[0];
CloseHandle(hDevice);
}
break;
}
default:
{
//do nothing
break;
}
}
}
return TRUE;
}
[/code]
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
編輯記錄
Coffee 重新編輯於 2009-05-12 18:37:35, 註解 無‧
Coffee 重新編輯於 2009-05-12 18:57:55, 註解 無‧
Coffee 重新編輯於 2010-01-14 17:29:28, 註解 無‧
MeowMeow
一般會員


發表:0
回覆:1
積分:0
註冊:2007-07-05

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-01-14 09:19:14 IP:219.87.xxx.xxx 訂閱
你好,想請教
hDevice,pLetterList,pLetterCount 各要餵入甚麼數值呢?
目前
hDevice = CreateFile(HardDisk.c_str(),
GENERIC_READ |GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,
OPEN_EXISTING,0,NULL);
pLetterList 我覺得是Drive Letter
pLetterCount 小弟就不太懂了,請指教!
小弟駑鈍,試了好久都弄不出來!謝謝!
編輯記錄
MeowMeow 重新編輯於 2010-01-14 10:30:02, 註解 無‧
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-01-14 11:18:30 IP:59.124.xxx.xxx 訂閱
[in]hDevice敘述如前,需為一個PhysicalDrive,[out]pLetterList傳出符合的DiskLetter,[out]pLetterCount傳出符合的Disk Letter數量,[out]函式回傳值只說明此函式執行成功或失敗
請描述你如何使用及遇到的狀況
===================引 用 MeowMeow 文 章===================
你好,想請教
hDevice,pLetterList,pLetterCount 各要餵入甚麼數值呢?
目前
hDevice = CreateFile(HardDisk.c_str(),
GENERIC_READ |GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,
OPEN_EXISTING,0,NULL);
pLetterList 我覺得是Drive Letter
pLetterCount 小弟就不太懂了,請指教!
小弟駑鈍,試了好久都弄不出來!謝謝!
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-02-11 00:16:44 IP:114.43.xxx.xxx 訂閱
此片段已確認可在Windows 7/Windows 2003上運行無誤。
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
系統時間:2024-05-08 9:52:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!