我认为你所拥有的应该可以工作 - 我自己使用可启动软盘映像尝试过这一点(使用安装为虚拟驱动器)ImDisk http://www.ltr-data.se/opencode.html/#ImDisk)并且生成的文件与原始图像是相同的二进制文件。
为了完整起见,这里是我使用的代码(完整):
using System;
using System.IO;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;
namespace ConsoleApplication1
{
public class Program
{
const int FILE_ATTRIBUTE_SYSTEM = 0x4;
const int FILE_FLAG_SEQUENTIAL_SCAN = 0x8;
[DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern SafeFileHandle CreateFile(string fileName, [MarshalAs(UnmanagedType.U4)] FileAccess fileAccess, [MarshalAs(UnmanagedType.U4)] FileShare fileShare, IntPtr securityAttributes, [MarshalAs(UnmanagedType.U4)] FileMode creationDisposition, int flags, IntPtr template);
[STAThread]
static void Main()
{
using (SafeFileHandle device = CreateFile(@"\\.\E:", FileAccess.Read, FileShare.Write | FileShare.Read | FileShare.Delete, IntPtr.Zero, FileMode.Open, FILE_ATTRIBUTE_SYSTEM | FILE_FLAG_SEQUENTIAL_SCAN, IntPtr.Zero))
{
if (device.IsInvalid)
{
throw new IOException("Unable to access drive. Win32 Error Code " + Marshal.GetLastWin32Error());
}
using (FileStream dest = File.Open("TempFile.bin", FileMode.Create))
{
using (FileStream src = new FileStream(device, FileAccess.Read))
{
src.CopyTo(dest);
}
}
}
}
}
}
如果这不起作用,那么似乎表明:
- 原图有问题。
- 问题出在使用您刚刚编写的磁盘映像的任何内容上。
- 在处理您正在访问的特定设备方面存在一些细微的差异(尽管我想不出是什么)
最有可能的罪魁祸首是步骤 2。您对生成的磁盘映像到底做了什么?
Update:这是写在评论中的,但为了完整起见,我想我应该将其添加到我的答案中 - 看起来发生的情况是正在写入磁盘第一个分区的内容,而需要的是整个磁盘。
当您查看第二个十六进制字符串(由示例代码生成的字符串)时,类似于HxD http://mh-nexus.de/en/hxd/我们看到这个:
ëv.MSDOS5.0..........øò.?.ÿ.?...aÈ..€.)zè!.NO NAME FAT16 ..
........................................................é..´.S3Û
Í.[Ê.<.t.èîÿCëôÃ.No BPB: Can't boot using CHS functions.P°.è¼ÿX
3ÛŽ.ä.ö.Ü..uBö.Ü..u.€>è.€r4SSRP.SUj.‹ôRPŠ.è.¸.BùÍ.ŠìXZ.d.r.€ý.u.
.ŃÒ.û‘.èxÿôëýƒ>...tðRP‹Í÷6..‹ò.Ñ;...v.‹...+Î3Ò÷6..ˆ.é.‹ø‹×QŠÁ.
L.Àæ..Ίê‹.è.´.Í.Ys.€ü.u.IëÞŠÄ.0è.ÿ´.Í.ëÑXZ.ÁƒÒ.+ét.Áá..Ùë”Ã....
úüè..^.î…..‹„ä.ŽØŽÀŽÐ.Ç„|.¯..‰„~.¹..¿..ó.¥.ÿ¬|ÿ¼..û€>è.ÿu.ˆ.è.ƒ.
ä. ¡à.‹.â.½..èéþPRët............Ó ...0€.ÿ.hA.@.ÿ@Z¬...¬.......Uª
在我看来这就像FAT16 分区的引导扇区 http://support.microsoft.com/kb/140418- 开头附近出现的字符串“MSDOS5.0”、“NO NAME”和“FAT16”是一个致命的泄露。
将其与第一个十六进制字符串(由 dd 生成的字符串)的输出进行比较:
3ÀúŽØŽÐ¼.|‰æ.WŽÀûü¿..¹..ó¥ê....RR´A»ªU1É0öùÍ.r..ûUªu.Ñés.fÇ...´B
ë.Z´.Í.ƒá?Q.¶Æ@÷áRPf1Àf™èf.è!.Missing operating system...f`f1Ò».
|fRfP.Sj.j.‰æf÷6ô{Àä.ˆáˆÅ’ö6ø{ˆÆ.áA¸..Š.ú{Í..d.faÃèÄÿ¾¾}¿¾.¹ .ó¥
Ãf`‰å»¾.¹..1ÀSQö.€t.@‰ÞƒÃ.âóHt[y9Y[ŠG.<.t.$.<.u"f‹G.f‹V.f.Ðf!Òu.
f‰Âè¬ÿr.è¶ÿf‹F.è ÿƒÃ.âÌfaÃèb.Multiple active partitions...f‹D.f.
F.f‰D.è0ÿr..>þ}Uª.….ÿ¼ú{Z_.úÿäè..Operating system load error...^
¬´.Š>b.³.Í.<.uñÍ.ôëý......................................Ÿ)..€.
...þ?.?...aÈ..................................................Uª
我们看到的东西在我看来很像主引导记录 http://en.wikipedia.org/wiki/Master_boot_record。为什么?因为在 MBR 中,所有前 440 个字节都是引导代码,与包含独特 BIOS 参数块的 FAT 引导扇区不同(上面看起来像垃圾,但如果你将其通过反汇编程序,你会得到看起来像有效 16 位的东西代码)。
此外,这两个看起来都是有效且完全不同的引导扇区(带有错误消息)。编程错误不可能“破坏”一个看起来像另一个——它一定只是读取了错误的内容。
为了得到CreateFile
要返回磁盘而不是分区,看起来您只需要向其传递一个不同的字符串,例如@"\\.\PhysicalDrive0"
打开第一个物理磁盘。
See:
- 低级磁盘访问 http://social.msdn.microsoft.com/Forums/en-GB/vcgeneral/thread/0115e999-95bc-4ae8-83e6-4ad5688e095f
- 信息:Win32 下的直接驱动器访问 http://support.microsoft.com/kb/100027