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

FILE_READ_ATTRIBUTES の代わりに、マクロ GENERIC_READ|GENERIC_WRITE を使用してください。CreateFile関数の dwDesiredAccess および dwFlagsAndAttributes パラメータのドキュメントを参照してください。これら2つのパラメータを誤解していると思います。

于 2013-05-25T07:00:10.143 に答える