在Windows上,是否有一种方法可以从通过USB读卡器连接的SD卡读取原始字节?SD卡是从嵌入式系统编写的,完全不使用文件系统,所以我不能使用标准的文件访问例程。这与unix实用程序的功能类似,但我需要将其集成到.NET应用程序中。
发布于 2010-04-08 09:23:38
我不确定这是否有用,但假设即使是未格式化的磁盘也在Win32设备名称空间中获得物理驱动器号(我认为这是必须的),您可能能够扩展显示的这里代码,以标识驱动器号并从设备上的任何位置读取原始字节。
update:原始链接已关闭。互联网档案馆的密码。有关上下文,请参阅原始博客文章(上文链接)的Internet Archive副本:
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();
}
}
}
}发布于 2011-05-05 01:55:10
下载十六进制工作坊它会做你想要做的事情
https://stackoverflow.com/questions/2598418
复制相似问题