管理者以外のプログラムから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 を出力します。