繁体   English   中英

查找分区的起始偏移量

[英]Find starting offset of a partition

假设我有一个带有两个分区 e:、f: 的 USB 驱动器。 我如何知道分区 e: 或 f: 从哪个偏移量开始,以便我可以从该偏移量开始写入原始数据。 我找不到任何可以为我提供 C++ 偏移量的函数。 在 Dos 中,我可以使用wmic partition get Index, Name, StartingOffset轻松获得此信息。

要获取物理驱动器中分区的StartingOffset IOCTL_DISK_GET_DRIVE_LAYOUT_EX (例如\\\\\\\\.\\\\PhysicalDrive1 ),您可以使用IOCTL_DISK_GET_DRIVE_LAYOUT_EX来获取每个分区的PARTITION_INFORMATION_EX数组:

#include <windows.h>
#include <stdio.h>

#define wszDrive L"\\\\.\\PhysicalDrive1"

int wmain(int argc, wchar_t* argv[])
{

    HANDLE hDevice = INVALID_HANDLE_VALUE;  // handle to the drive to be examined 
    BOOL bResult = FALSE;                 // results flag
    DWORD junk = 0;                     // discard results
    DWORD error;

    DWORD szNewLayout = sizeof(DRIVE_LAYOUT_INFORMATION_EX) + sizeof(PARTITION_INFORMATION_EX) * 4 * 25;
    
    
    hDevice = CreateFileW(wszDrive,          // drive to open
        GENERIC_READ,                // no access to the drive
        FILE_SHARE_READ,
        NULL,             // default security attributes
        OPEN_EXISTING,    // disposition
        0,                // file attributes
        0);            // do not copy file attributes
    if (hDevice == INVALID_HANDLE_VALUE)    // cannot open the drive
    {
        error = GetLastError();
        printf("CreateFileW error: %d\n", error);
        return -1;
    }

    DRIVE_LAYOUT_INFORMATION_EX* pdg = (DRIVE_LAYOUT_INFORMATION_EX*)malloc(szNewLayout);
    if (pdg == NULL)
    {
        error = GetLastError();
        printf("malloc error: %d\n", error);
        CloseHandle(hDevice);
        return -1;
    }
    ZeroMemory(pdg, szNewLayout);

    bResult = DeviceIoControl(hDevice,                       // device to be queried
        IOCTL_DISK_GET_DRIVE_LAYOUT_EX, // operation to perform
        NULL, 0,                       // no input buffer
        pdg, szNewLayout,// sizeof(*pdg)*2,            // output buffer
        &junk,                         // # bytes returned
        (LPOVERLAPPED)NULL);          // synchronous I/O
    if (!bResult)
    {
        error = GetLastError();
        printf("DeviceIoControl error: %d\n", error);
        free(pdg);
        CloseHandle(hDevice);
        return -1;
    }
    for (int i = 0; i < pdg->PartitionCount; i++) {
        printf("partition %d: %lld\n", i, pdg->PartitionEntry[i].StartingOffset.QuadPart);
    }

    free(pdg);
    CloseHandle(hDevice);
    return 0;
}

要获取指定分区的StartingOffset IOCTL_DISK_GET_PARTITION_INFO_EX (例如\\\\\\\\.\\\\E: ),您可以使用IOCTL_DISK_GET_PARTITION_INFO_EX

#include <windows.h>
#include <stdio.h>

#define wszDrive L"\\\\.\\E:"

int wmain(int argc, wchar_t* argv[])
{
    HANDLE hDevice = INVALID_HANDLE_VALUE;  // handle to the drive to be examined 
    BOOL bResult = FALSE;                 // results flag
    DWORD junk = 0;                     // discard results
    DWORD error;

    PARTITION_INFORMATION_EX piex;
    ZeroMemory(&piex, sizeof(PARTITION_INFORMATION_EX));
    hDevice = CreateFileW(wszDrive,          // drive to open
        GENERIC_READ,                // no access to the drive
        FILE_SHARE_READ,
        NULL,             // default security attributes
        OPEN_EXISTING,    // disposition
        0,                // file attributes
        0);            // do not copy file attributes
    if (hDevice == INVALID_HANDLE_VALUE)    // cannot open the drive
    {
        error = GetLastError();
        printf("CreateFileW error: %d\n", error);
        return -1;
    }

    bResult = DeviceIoControl(hDevice,
        IOCTL_DISK_GET_PARTITION_INFO_EX,
        NULL, 0,
        &piex, sizeof(PARTITION_INFORMATION_EX),
        &junk,                         
        (LPOVERLAPPED)NULL);
    if (!bResult)
    {
        error = GetLastError();
        printf("DeviceIoControl error: %d\n", error);
        CloseHandle(hDevice);
        return -1;
    }
    wprintf(L"%s StartingOffset: %lld\n", wszDrive, piex.StartingOffset.QuadPart);

    CloseHandle(hDevice);
    return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM