2

我想从非管理员程序发出FSCTL_GET_NTFS_VOLUME_DATA控制代码。文档说“打开卷时,FILE_READ_ATTRIBUTES 或 FILE_WRITE_ATTRIBUTES 访问就足够了”,所以我相信这应该是可能的。我尝试了路径和卷路径: "\.\C:" "\?\Volume{4f26a671-c36e-11e2-913d-806e6f6e6963}" 虽然我可以打开它们,但对 DeviceIOControl 的调用仅适用于GENERIC_READ | GENERIC_WRITE. 这是代码:

int main(){
    char *mount = "\\\\.\\C:";
    HANDLE hHandle = CreateFile(mount
                                    , FILE_READ_ATTRIBUTES
                                    , FILE_SHARE_READ
                                    , NULL
                                    , OPEN_EXISTING
                                    , FILE_ATTRIBUTE_NORMAL
                                    , NULL);
                                    //*/
    if (hHandle != INVALID_HANDLE_VALUE){
        DWORD dwBytesReturned;
        NTFS_VOLUME_DATA_BUFFER volume_data;
        int bResult = DeviceIoControl(hHandle
                                        , FSCTL_GET_NTFS_VOLUME_DATA
                                        , NULL
                                        , 0
                                        , &volume_data
                                        , sizeof(volume_data)
                                        , &dwBytesReturned
                                        , NULL);
        if (bResult){
            printf("Success!\n");
        } else {
            printf("Last Error = %d (%s)\n", GetLastError(), mount);
        }
        CloseHandle(hHandle);
    } else {
        printf("Error invalid handle: %s\n", mount);
    }
}

最后一个错误打印出 1,顺便说一句。

4

2 回答 2

2

在我的系统上,FILE_READ_ATTRIBUTES它不起作用,但FILE_EXECUTE可以在没有管理员权限的情况下使用。

我确实还需要将共享选项更改为

FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE

让它完全发挥作用。

于 2013-05-27T21:18:05.457 回答
0

使用宏 GENERIC_READ|GENERIC_WRITE 而不是 FILE_READ_ATTRIBUTES。请查看CreateFile函数的 dwDesiredAccess 和 dwFlagsAndAttributes 参数的文档。我想你误解了这两个参数。

于 2013-05-25T07:00:10.143 回答