[SDK]從PhysicalDrive列舉Logical Disk |
|
Coffee
版主 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
利用以下程式碼可以取得單一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]
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。 為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。 在引述到我的文時自然會儘量替各位想辦法,謝謝大家! |
MeowMeow
一般會員 發表:0 回覆:1 積分:0 註冊:2007-07-05 發送簡訊給我 |
你好,想請教
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 發送簡訊給我 |
[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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |