为什么 DeviceIoControl 有时不工作(错误=2)?

use*_*627 0 c++ windows winapi visual-c++

DISK_PERFORMANCE DiskPerformance = {0};

DWORD dwDiskInfoSize = 0;

for (int i = 0; i < 10; i++)
{

    std::printf("Try %d th Open \\\\.\\c:\n", i);

    HANDLE hDevice = CreateFile(L"\\\\.\\c:",
                                0,
                                FILE_SHARE_READ | FILE_SHARE_WRITE,
                                //SYNCHRONIZE | FILE_READ_ATTRIBUTES,
                                NULL,
                                OPEN_EXISTING,
                                0,
                                NULL);
    std::printf("hDevice = %p\n", hDevice);

    if (hDevice == INVALID_HANDLE_VALUE)
    {
        std::printf("CreateFile failed  = %d \n", GetLastError());

        continue;
    }

    if (!DeviceIoControl(hDevice,
                         IOCTL_DISK_PERFORMANCE,
                         NULL,
                         0,
                         &DiskPerformance,
                         sizeof(DiskPerformance),
                         &dwDiskInfoSize,
                         NULL))
    {

        CloseHandle(hDevice);

        std::printf("DeviceIoControl failed  = %d \n", GetLastError());

        continue;
    }

    std::printf("QuDeviceIoControlery Success\n");

    CloseHandle(hDevice);

    Sleep(1000);

    std::printf("\n\n");
}
Run Code Online (Sandbox Code Playgroud)

我重新启动程序,大约 95% DeviceIoControl 将得到error 2,5% 得到正确结果......

我无法在另一台机器上重现该错误,因为此代码在我的笔记本电脑 (win10) 上 100% 有效。

我的目标操作系统是 Windows Server 2016。

Str*_*Sun 6

Windows Server 2016 中的磁盘性能计数器默认处于关闭状态。

您可以以管理员身份运行CMD并输入diskperf -Y以启用任务管理器的磁盘计数器。

在此输入图像描述