我目前正在编写一个与Linux dd类似的Windows实用程序。但是这个实用程序只复制USED块而不是逐块克隆整个磁盘。
我写的方式是 * (1)将MBR从包含三个分区的磁盘A复制到磁盘B. (2)在步骤A之后。我可以从磁盘管理GUI中看到三个原始分区。 (没有驱动器号,没有文件系统)。 (3)将每个分区从A复制到B循环。*
我遇到的问题是: 在我从OpenDevice获取文件句柄后的步骤(3)中,我尝试使用该句柄来锁定原始分区,我得到拒绝访问(错误5)并且我100%确定我的程序没有意外地将锁保存在某个地方其他。我的开发和测试环境是Windows 2003服务器,我的实用程序作为管理员权限执行。
以下是代码段:
...
shareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
fHandle= OpenDevice(shareMode);
res = DeviceIoControl(fHandle, FSCTL_LOCK_VOLUME, NULL, 0, NULL, 0, &dummy, NULL);
if (res == 0)
{
DismountAndLockVolume();
}
...
在我正在使用的OpenDevice函数中:
DWORD access = (fOpenMode==forWriting) ? (GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE) : GENERIC_READ| SYNCHRONIZE;
NTOpen(&fHandle, fName.c_str(), access, FILE_ATTRIBUTE_NORMAL, shareMode, FILE_OPEN,FILE_SYNCHRONOUS_IO_NONALERT|FILE_RANDOM_ACCESS|FILE_NON_DIRECTORY_FILE);
获取文件句柄(fHandle)。
在DismountAndLockVolume函数中,我尝试卸载此卷并再次锁定它。
DeviceIoControl(fHandle, FSCTL_DISMOUNT_VOLUME, NULL, 0, NULL, 0, &dummy, NULL);
DWORD shareMode = FILE_SHARE_DELETE | FILE_SHARE_WRITE | FILE_SHARE_READ;
ntStatus = OpenDevice(shareMode);
res = DeviceIoControl(fHandle, FSCTL_LOCK_VOLUME, NULL, 0, NULL, 0, &dummy, NULL);
问题是,当我的代码尝试卸载此卷时,由于访问被拒绝而抛出异常。
然后我浏览了互联网并得到以下讨论主题:QUOTE
如果卷未安装卷,则卷句上的写入将成功 文件系统,或者如果满足下列条件之一: 1.要写入的扇区是引导扇区。 2.要写入的扇区驻留在文件系统空间之外。 3.您已使用明确锁定或卸下卷 FSCTL_LOCK_VOLUME或FSCTL_DISMOUNT_VOLUME。 4。该卷没有文件系统。 (换句话说,它已被安装 作为RAW卷。)
如果满足下列条件之一,则磁盘句柄上的写入将成功 是真的: 1.要写入的扇区不在一个卷的范围内。 2.要写入的扇区属于已安装的卷,但是你 已使用FSCTL_LOCK_VOLUME显式锁定或卸除了卷 或FSCTL_DISMOUNT_VOLUME。 3.要写入的扇区属于未安装的卷 或者没有文件系统。
某些磁盘部件的修改,如引导扇区(最多16个),是 仍然允许。但我的实用程序依赖于对磁盘的原始写入访问权限。我是 无法通过FSCTL_LOCK_VOLUME锁定音量。结果是ACCESS DENIED。而 通过网络搜索我才知道内核模式驱动程序是唯一的 解。但是在这个小组中我才知道司机并不需要。我继续努力 服务并通过SCSI,但我无法找到解决方案。如果 内核模式驱动程序需要什么样的驱动程序呢?
有人知道问题的解决方案,请帮助我
此线程终止,但没有结论。有人可以帮我看看发生了什么事吗?任何可能的解决方案提示?
数百万的谢谢。几天我一直在刮我的头发: - ((。(