为什么我拒绝访问16区及以上的扇区?

时间:2019-07-20 07:34:26

标签: winapi io

我正在使用CreateFile,ReadFile和WriteFile直接访问磁盘的扇区。看来我可以读取所需的任何扇区,但是在写入时,对于16或以上的扇区,我得到ERROR_ACCESS_DENIED。我很茫然地解释为什么我可以写前15个扇区,而不能写其他扇区。

这是在Windows 10上。

请注意,我并未尝试对16以上的每个扇区进行随机抽样,它们似乎都失败了。

int wmain(int argc, WCHAR *argv[])
    {
    HANDLE hDisk = NULL;
    hDisk = CreateFile(
                L"\\\\.\\Q:",
                GENERIC_READ | GENERIC_WRITE,
                FILE_SHARE_READ | FILE_SHARE_WRITE,
                NULL,
                OPEN_EXISTING,
                0,
                NULL);

    char *rgb = (char *) malloc(512);
    BOOL b = FALSE;
    DWORD dw = 0;
    LONG lo = 0;
    LONG hi = 0;

    for(int i=0; i<20; i++)
        {
        hi = 0;
        lo = i * 512;

        dw = SetFilePointer(hDisk, lo, &hi, FILE_BEGIN);
        b = ReadFile(hDisk, rgb, 512, &dw, NULL);
        if (b == FALSE)
            printf("Cannot read sector %d\r\n", i);

        hi = 0;
        lo = i * 512;

        dw = SetFilePointer(hDisk, lo, &hi, FILE_BEGIN);
        b = WriteFile(hDisk, rgb, 512, &dw, NULL);
        if (b == FALSE)
            printf("Cannot write sector %d\r\n", i);
        }

    return 0;
    }

上面的代码输出:

Cannot write sector 16
Cannot write sector 17
Cannot write sector 18
Cannot write sector 19

为了使内容简短,我省略了错误处理代码。

1 个答案:

答案 0 :(得分:0)

我发现了问题。 因为我使用FILE_SHARE_READ打开了驱动器| FILE_SHARE_WRITE,我被拒绝访问磁盘中包含正在使用的卷的部分。 至少那是我的有根据的猜测。

一旦我删除了SHARE标志,并确保我拥有对该驱动器的唯一访问权,就可以读写任何扇区。