Windows设备驱动程序:原始分区上的FSCTL_LOCK_VOLUME - 访问被拒绝

时间:2012-01-21 21:27:48

标签: windows driver device

我目前正在编写一个与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,但我无法找到解决方案。如果   内核模式驱动程序需要什么样的驱动程序呢?

     

有人知道问题的解决方案,请帮助我

此线程终止,但没有结论。有人可以帮我看看发生了什么事吗?任何可能的解决方案提示?

数百万的谢谢。几天我一直在刮我的头发: - ((。(

0 个答案:

没有答案