ハードディスクの FAT32 エントリの読み取りに取り組んでおり、これまでのところ、CreateFile
、ReadFile
、およびSetFilePointer
API を使用してエントリの読み取りに成功しています。これまでのところ、私のコード (C# で記述) は次のとおりです。
---DLLのインポート-----
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr CreateFile(string lpFileName, Int32 dwDesiredAccess,
Int32 dwShareMode, Int32 lpSecurityAttributes, Int32 dwCreationDisposition,
Int32 dwFlagsAndAttributes, IntPtr hTemplateFile);
[DllImport("kernel32.dll")]
static extern bool ReadFile(IntPtr hFile, byte[] lpBuffer,
uint nNumberOfBytesToRead, out uint lpNumberOfBytesRead, uint lpOverlapped);
[DllImport("kernel32.dll")]
extern static int SetFilePointer(IntPtr hFile, int lDistanceToMove, int lpDistanceToMoveHigh, uint dwMoveMethod);
[DllImport("kernel32.dll")]
extern static Boolean CloseHandle(IntPtr hObject);
------コード----任意の .NET アプリケーションで動作します---------
int ret, nread;
IntPtr handle;
int s = 512;
byte[] readbuffer = new byte[512];
IntPtr ptr = CreateFile(@"\\.\F:", -1073741824, 3, 0, 3, 128, IntPtr.Zero);
if (ptr != System.IntPtr.Zero)
{
int i = 100;
int ret = SetFilePointer(ptr, 0, 0, 0);
ret = SetFilePointer(ptr, 4194304, 0, 1);
while (true)
{
byte[] inp = new byte[512];
uint read = 0;
if (ret != -1)
{
ReadFile(ptr, inp, 512, out read, 0);
for (int k = 0; k < 16; k++)
{
string s = ASCIIEncoding.ASCII.GetString(inp, k*32, 11);
if (inp[k*32] == 0xE5)
{
MessageBox.Show(s);
}
}
//ret = SetFilePointer(ptr, 512, 0, 1);
}
}
}
上記のコードはF:\
ドライブを読み取ります。試行目的で、最初のファイル ディレクトリ クラスターを読み取り、各ファイル エントリをクエリして、ファイルが削除されている場合はファイル名を表示するようにしました。
ただし、バイト配列を頻繁に使用し、FAT32 仕様に従って指定されたデータ構造にマップする必要がある本格的なアプリケーションにしたいと考えています。
データを読み取るバイト配列を効率的に使用するにはどうすればよいですか? filestream と binaryreader を使用して同じコードを試してみましたが、動作しますが、次のような C 構造があるとします。
struct bios_data
{
byte id[3];
char name[11];
byte sectorpercluster[2];
...
}
C# で同様のデータ構造を持ちたいのですが、データをバイト配列に読み取るときに、それを構造にマップしたいと考えています。多くのオプションを試しましたが、完全な解決策は得られませんでした。クラスを作成してシリアル化も試みましたが、それも機能しませんでした。FAT エントリからデータを読み取るときに使用する、これらのような構造があと 3 つほどあります。どうすれば望ましい結果を得ることができますか?