获取有关分区的信息 我从MSDN中获得C++代码的例子,在这里我尝试获取关于我的分区的信息,但是在这个代码中,我的DeVICIOORE METROM返回0,结束错误代码3。如何修复此错误

获取有关分区的信息 我从MSDN中获得C++代码的例子,在这里我尝试获取关于我的分区的信息,但是在这个代码中,我的DeVICIOORE METROM返回0,结束错误代码3。如何修复此错误,c++,windows,C++,Windows,代码如下: #define WINVER 0x0500 #include <windows.h> #include <winioctl.h> #include <iostream> #include <stdio.h> void DisplayVolumeInfo(CHAR *volume) { HANDLE hDevice = CreateFileA( volume, GENERIC_R

代码如下:

#define WINVER 0x0500

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

void DisplayVolumeInfo(CHAR *volume)
{
    HANDLE hDevice = CreateFileA(
            volume,
            GENERIC_READ | GENERIC_WRITE,
            FILE_SHARE_WRITE | FILE_SHARE_READ,
            NULL,
            OPEN_EXISTING,
            FILE_ATTRIBUTE_SYSTEM,
            NULL);

if (hDevice != INVALID_HANDLE_VALUE)
{
    PARTITION_INFORMATION partInfo;
    DWORD retcount = 0;

    BOOL res = DeviceIoControl(
                hDevice,
                IOCTL_DISK_GET_PARTITION_INFO,
                (LPVOID)NULL,
                (DWORD)0,
                (LPVOID)&partInfo,
                sizeof(partInfo),
                &retcount,
                (LPOVERLAPPED)NULL);

    if (res)
        std::cout << "Volume size = " << partInfo.PartitionLength.QuadPart << " bytes (" << (unsigned long long)(partInfo.PartitionLength.QuadPart / 1024 / 1024) << "Mb)" << std::endl;
    else
        std::cout << "Can't do IOCTL_DISK_GET_PARTITION_INFO (error code=" << GetLastError() << ")" << std::endl;

    DISK_GEOMETRY diskGeometry;
    retcount = 0;
    res = DeviceIoControl(
                hDevice,
                IOCTL_DISK_GET_DRIVE_GEOMETRY,
                NULL, 0,
                &diskGeometry, sizeof(diskGeometry),
                &retcount,
                (LPOVERLAPPED)NULL);

    if (res)
    {
        std::cout << "Cylinders = " << diskGeometry.Cylinders.QuadPart << std::endl;
        std::cout << "Tracks/cylinder = " << diskGeometry.TracksPerCylinder << std::endl;
        std::cout << "Sectors/track = " << diskGeometry.SectorsPerTrack << std::endl;
        std::cout << "Bytes/sector = " << diskGeometry.BytesPerSector << std::endl;
    }
    else
        std::cout << "Can't do IOCTL_DISK_GET_DRIVE_GEOMETRY (error code=" << GetLastError() << ")" << std::endl;

    CloseHandle(hDevice);
}
else
    std::cout << "Error opening volume " << volume << " (error code=" << GetLastError() << ")" << std::endl;
}


int main()
{
    DWORD  CharCount            = 0;
    char   DeviceName[MAX_PATH] = "";
    DWORD  Error                = ERROR_SUCCESS;
    HANDLE FindHandle           = INVALID_HANDLE_VALUE;
    BOOL   Found                = FALSE;
    size_t Index                = 0;
    BOOL   Success              = FALSE;
    char   VolumeName[MAX_PATH] = "";
    //
    //  Enumerate all volumes in the system.
    FindHandle = FindFirstVolumeA(VolumeName, MAX_PATH);

if (FindHandle == INVALID_HANDLE_VALUE)
{
    Error = GetLastError();
    printf("FindFirstVolume failed with error code %d\n", Error);
    return 0;
}

for (;;)
{
    //
    //  Skip the \\?\ prefix and remove the trailing backslash.

    Index = strlen(VolumeName) - 1;

    if (VolumeName[0]     != '\\' ||
        VolumeName[1]     != '\\' ||
        VolumeName[2]     != '?'  ||
        VolumeName[3]     != '\\' ||
        VolumeName[Index] != '\\')
    {
        Error = ERROR_BAD_PATHNAME;
        printf("FindFirstVolume/FindNextVolume returned a bad path: %s\n", VolumeName);
        break;
    }

    //
    //  QueryDosDeviceW does not allow a trailing backslash,
    //  so temporarily remove it.
    VolumeName[Index] = '\0';

    CharCount = QueryDosDeviceA(&VolumeName[4], DeviceName, MAX_PATH);

    VolumeName[Index] = '\\';

    if ( CharCount == 0 )
    {
        Error = GetLastError();
        printf("QueryDosDevice failed with error code %d\n", Error);
        break;
    }

    printf("\nFound a device:\n %s", DeviceName);
    printf("\nVolume name: %s", VolumeName);
    printf("\n");

    DisplayVolumeInfo(VolumeName);

    //
    //  Move on to the next volume.
    Success = FindNextVolumeA(FindHandle, VolumeName, MAX_PATH);

    if ( !Success )
    {
        Error = GetLastError();

        if (Error != ERROR_NO_MORE_FILES)
        {
            printf("FindNextVolumeW failed with error code %d\n", Error);
            break;
        }

        //
        //  Finished iterating
        //  through all the volumes.
        Error = ERROR_SUCCESS;
        break;
    }
}

FindVolumeClose(FindHandle);
FindHandle = INVALID_HANDLE_VALUE;

return 0;
}
#定义WINVER 0x0500
#包括
#包括
#包括
#包括
void DisplayVolumeInfo(字符*卷)
{
HANDLE hDevice=CreateFileA(
卷,
一般的读,一般的写,
文件共享写入文件共享读取,
无效的
开放式,
文件属性系统,
无效);
if(hDevice!=无效的句柄值)
{
分区信息partInfo;
DWORD retcount=0;
BOOL res=设备控制(
hDevice,
IOCTL\u磁盘\u获取分区\u信息,
(LPVOID)无效,
(德沃德)0,
(LPVOID)和partInfo,
sizeof(partInfo),
&重新计算,
(重叠)空);
如果(res)

std::cout哪个调用失败了?哦,我犯了一个错误,我在调用CreateFileA后得到了一个句柄hDevice,这是无效的,所以我的if(hDevice!=无效的句柄值)不起作用。找到了正常创建文件的方法a,我在这个方法中使用了文件标志备份语义,所以我遇到了另一个问题,现在函数DeviceIoControl返回0,GetLastError返回87-这意味着有一个无效参数,可能它不能使用我的HANDLE hDevice,可能它不能与其他参数一起工作。