1

我需要清除我一直试图在 WPF/C# 应用程序中清除的可移动媒体设备(自定义 USB 存储设备)的扇区 0。我的第一次尝试是使用DD,但我遇到了问题。在设备制造过程中,在扇区 0 创建 MBR,卷(逻辑?)从扇区 40 开始。当我发出以下命令时,它会清除扇区 40 而不是扇区 0: 我在这里

dd bs=512 count=1 if=/dev/zero of=\.\E:

找到了另一个版本的 DD ,其中包括擦拭实用程序。我试过这个版本,我看到了同样的行为。我正在使用 HxD 和 Runtime 的 DiskExplorer,正在清除扇区 40 而不是扇区 0。我可以使用 HxD 或 Runtime 的 DiskExplorer,但这需要是可编写脚本的。

有谁知道在 Windows XP SP2 中清除(填充)扇区 0 的任何其他方法?任何帮助将不胜感激。谢谢。

标记

解决方案:我的解决方案使用 WMI 根据逻辑驱动器号查找物理驱动器。首先,查询 Win32_LogicalDiskToPartition 类以找到我要查找的逻辑驱动器。这提供了包含类似'...DeviceID="Disk #X, Partition #Y"'的Antecedent 字段。接下来,我查询 Win32_DiskDriveToDiskPartition 类,同时搜索 Dependent 字段以查找 Win32_LogicalDiskToPartition 类中的 Antecedent 字段的匹配项。一旦找到,Win32_LogicalDiskToPartition 中的 Antecedent 字段将产生物理驱动器。我选择了 atzz,因为它与我的解决方案很接近。我想使用 Eugene 的建议,但我只有几个小时来实现这个,所以我选择了两者中更容易的一个。不过,我需要稍后再谈。

4

2 回答 2

2

从 Windows 的角度来看,有两种方法可以格式化 USB 驱动器:

  • 作为软盘。在这种情况下,整个 USB 驱动器包含一个文件系统,其引导记录位于扇区 0。

  • 作为硬盘。在这种情况下,扇区 0 包含带有分区表的MBR 。带有各自引导记录的实际文件系统位于驱动器的更远位置。

我认为您正在观察第二种情况。使用 \.\E: 来识别设备,您最终会访问文件系统的引导记录而不是 MBR。

以下是访问 USB 驱动器扇区 0 的方法。

  1. 从这里加载 WinObj 。
  2. 在 WinObj 中的 下GLOBAL??,找到 E:。这将是一个指向类似\Device\Harddisk2\DP(1)0-0+30.
  3. 在 下GLOBAL??,找到一个 PhysicalDrive# 符号链接,该符号链接指向您在步骤 2 中找到的同一个 Harddisk#。它很可能具有与 Harddisk# 相同的数字后缀。例如: SymbolicLinkPhysicalDrive2指的是\Device\Harddisk2\DR47.
  4. 使用您在 DD 命令中找到的 PhysicalDrive#:

    dd bs=512 count=1 if=\\.\PhysicalDrive2 of=mbr.dat

于 2010-09-24T06:09:58.843 回答
1

您正在尝试清除逻辑设备 E: 而不是物理设备。尝试执行以下操作:

调用CreateFile() WinAPI 函数打开 "\\.\PhysicalDriveX" 其中 X 是设备编号(有关如何正确打开物理设备的信息,请参见 CreateFile 函数说明中的备注)。然后使用 WriteFile API 函数在打开的设备的偏移量 0 处写入 512 个字节。

如果您在打开设备进行写入时出现权限被拒绝错误,您可以使用我们的RawDisk产品(试用版对您来说可以正常工作),它可以绕过 Windows 的这一安全措施。

upd:至于从 C# 调用 CreateFile,请参阅PInvoke.net

于 2010-09-24T05:59:12.253 回答