我想从非管理员程序发出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,顺便说一句。