在Windows PC上,有没有一种方法可以通过USB读卡器读取SD卡的原始字节?SD卡是由嵌入式系统写入的,根本没有使用文件系统,因此我无法使用标准文件访问例程。这类似于Unix dd实用程序的功能,但我需要将其集成到.NET应用程序中。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.Win32.SafeHandles;
using System.Runtime.InteropServices;
using System.IO;
namespace RawDump
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public enum EMoveMethod : uint
{
Begin = 0,
Current = 1,
End = 2
}
[DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern uint SetFilePointer(
[In] SafeFileHandle hFile,
[In] int lDistanceToMove,
[Out] out int lpDistanceToMoveHigh,
[In] EMoveMethod dwMoveMethod);
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
static extern SafeFileHandle CreateFile(string lpFileName, uint dwDesiredAccess,
uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition,
uint dwFlagsAndAttributes, IntPtr hTemplateFile);
[DllImport("kernel32", SetLastError = true)]
internal extern static int ReadFile(SafeFileHandle handle, byte[] bytes,
int numBytesToRead, out int numBytesRead, IntPtr overlapped_MustBeZero);
private void buttonDump_Click(object sender, EventArgs e)
{
short FILE_ATTRIBUTE_NORMAL = 0x80;
short INVALID_HANDLE_VALUE = -1;
uint GENERIC_READ = 0x80000000;
uint GENERIC_WRITE = 0x40000000;
uint CREATE_NEW = 1;
uint CREATE_ALWAYS = 2;
uint OPEN_EXISTING = 3;
SaveFileDialog mySFD = new SaveFileDialog();
mySFD.FileName = "dump.bin";
mySFD.InitialDirectory = Path.GetDirectoryName(Application.StartupPath);
if(mySFD.ShowDialog() == DialogResult.OK)
{
SafeFileHandle handleValue = CreateFile(textBoxPath.Text, GENERIC_READ, 0, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
if (handleValue.IsInvalid)
{
Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
}
int offset = int.Parse(textBoxOffset.Text, System.Globalization.NumberStyles.HexNumber);
int size = int.Parse(textBoxSize.Text, System.Globalization.NumberStyles.HexNumber);
byte[] buf = new byte[size];
int read = 0;
int moveToHigh;
SetFilePointer(handleValue, offset, out moveToHigh, EMoveMethod.Begin);
ReadFile(handleValue, buf, size, out read, IntPtr.Zero);
FileStream myStream = File.OpenWrite(mySFD.FileName);
myStream.Write(buf, 0, size);
myStream.Flush();
myStream.Close();
handleValue.Close();
}
}
}
}
下载Hex Workshop,它将完全满足您的需求。