HANDLE
文件*,而不会阻止用户弹出设备?我尝试使用我能想到的最自由的访问权限调用CreateFile
(甚至是NtCreateFile
) - 即FILE_READ_ATTRIBUTES
用于访问,FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE
用于共享权限,但它仍然无效。
(FileTest是一个很好的测试工具,无需编写程序。)
我真的喜欢解决方案,以便处理卷或驱动器(不仅仅是文件) - 我的意思是例如\\.\D:
或\\.\PhysicalDrive0
。但如果没有这样的解决方案,那么处理文件也会很有用。
答案 0 :(得分:2)
应该很清楚,在安装卷时获取文件句柄是微不足道的。
强行卸下音量会发生什么?所有文件句柄都无效。尝试使用它们会返回错误。
这些代码段强行卸载卷,以便后续代码可以对其进行直接i / o操作。这是我几年前写的磁盘清洁工具(大众消费产品)的摘录。
char fn [20];
sprintf (fn, "\\\\.\\%s:", vol -> GetVolName ());
vol_lock_handle = CreateFile (fn, GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
OPEN_EXISTING,
FILE_FLAG_NO_BUFFERING | FILE_FLAG_RANDOM_ACCESS,
NULL);
fprintf (stderr,
"Warning: volume dismount will disrupt or kill all processes with open files!\n"
"Before confirming, verify no critical processes have open files on volume %s:\n"
" Are you sure you want to dismount this volume? ('YES' to proceed)? ",
g_vol -> GetVolName ());
char buf [30];
if (!fgets (buf, sizeof buf, stdin) || stricmp (buf, "yes\n"))
{
fprintf (stderr, " Volume dismount not confirmed--canceled.\n");
continue;
}
DWORD status;
if (!DeviceIoControl (vol_lock_handle, FSCTL_DISMOUNT_VOLUME,
NULL, 0, NULL, 0, &status, NULL))
{
DWORD err = GetLastError ();
fprintf (stderr, "Error %d attempting to dismount volume: %s\n",
err, w32errtxt (err));
}
我完全清楚这段代码的错误。获取GENERIC_READ句柄,用于卸载,然后获取卷锁,然后写入。它有效!
答案 1 :(得分:2)