windows的磁碟操作之四——根據邏輯分區號獲得物理磁碟號

來源:互聯網
上載者:User
原創作品,允許轉載,轉載時請務必以超連結形式標明文章
原始出處 、作者資訊和本聲明。否則將追究法律責任。http://cutebunny.blog.51cto.com/301216/624379

第一節中http://cutebunny.blog.51cto.com/301216/624027我們談到了磁碟裝置名稱的兩種形式:

對於物理磁碟機x,形式為 \\.\PhysicalDriveX,編號從0開始,例如

名稱 含義
\\.\PhysicalDrive0 開啟第一個物理磁碟機
\\.\PhysicalDrive2 開啟第三個物理磁碟機
對於邏輯分區(卷),形式為 \\.\X:
,例如

名稱 含義
\\.\A: 開啟A盤(軟碟機)
\\.\C: 開啟C盤(磁碟邏輯分區)
 那麼如何找出物理磁碟機代號 0,1,2……
和邏輯分區號 C, D, E……之間的關係呢?本節討論通過邏輯分區號擷取所在物理磁碟機代號的方法,下一節討論通過物理磁碟機代號找出其所包含的邏輯分區號的方法。當然,必定會存在其他思路實現同樣的功能,歡迎大家補充。首先我們要明確,物理磁碟機代號和邏輯分區號應該是一對多的關係。例如disk0可能包含C, D, E三個分區。所以下面討論的函數GetPhysicalDriveFromPartitionLetter返回一個單獨的整型數。DeviceIoControl提供作業碼IOCTL_STORAGE_GET_DEVICE_NUMBER,可以非常方便的獲得開啟裝置的裝置類型和裝置號。代碼如下/******************************************************************************* Function: get disk's physical number from its drive letter*           e.g. C-->0 (C: is on disk0)* input: letter, drive letter* output: N/A* return: Succeed, disk number*         Fail, -1******************************************************************************/DWORD GetPhysicalDriveFromPartitionLetter(CHAR letter){    HANDLE hDevice;               // handle to the drive to be examined    BOOL result;                 // results flag    DWORD readed;                   // discard results    STORAGE_DEVICE_NUMBER number;   //use this to get disk numbers     CHAR path[DISK_PATH_LEN];    sprintf(path, "\\\\.\\%c:", letter);    hDevice = CreateFile(path, // drive to open                         GENERIC_READ | GENERIC_WRITE,    // access to the drive                         FILE_SHARE_READ | FILE_SHARE_WRITE,    //share mode                         NULL,             // default security attributes                         OPEN_EXISTING,    // disposition                         0,                // file attributes                         NULL);            // do not copy file attribute    if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive    {        fprintf(stderr, "CreateFile() Error: %ld\n", GetLastError());        return DWORD(-1);    }     result = DeviceIoControl(                hDevice,                // handle to device                IOCTL_STORAGE_GET_DEVICE_NUMBER, // dwIoControlCode                NULL,                            // lpInBuffer                0,                               // nInBufferSize                &number,           // output buffer                sizeof(number),         // size of output buffer                &readed,       // number of bytes returned                NULL      // OVERLAPPED structure            );    if (!result) // fail    {        fprintf(stderr, "IOCTL_STORAGE_GET_DEVICE_NUMBER Error: %ld\n", GetLastError());        (void)CloseHandle(hDevice);        return (DWORD)-1;    }    //printf("%d %d %d\n\n", number.DeviceType, number.DeviceNumber, number.PartitionNumber);     (void)CloseHandle(hDevice);    return number.DeviceNumber;} 程式碼分析:1. 根據分區號產生裝置名稱。2. 調用CreateFile開啟裝置並獲得裝置控制代碼。3. 叫用作業碼為IOCTL_STORAGE_GET_DEVICE_NUMBER的DeviceIoControl函數,輸出為結構體變數STORAGE_DEVICE_NUMBER
number。結構體STORAGE_DEVICE_NUMBER定義為typedef struct _STORAGE_DEVICE_NUMBER {DEVICE_TYPE  DeviceType;ULONG  DeviceNumber;ULONG  PartitionNumber;} STORAGE_DEVICE_NUMBER, *PSTORAGE_DEVICE_NUMBER;       其中DeviceNumber就是我們需要的物理磁碟號。4. 返回DeviceNumber。 

本文出自 “bunny技術坊” 部落格,請務必保留此出處http://cutebunny.blog.51cto.com/301216/624379

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.