C# を使用してディスクから直接読み取り、kernel32 ReadFile メソッドをピンボークしています。より大きな読み取り (現在は単一のチャンクでのみ読み取り) では、バッファー サイズが範囲外であることに気付きました。
ここで読み取りバッファの最大サイズを知っている人はいますか?
もしそうなら、読み込みたい余剰メモリがあるときにバッファサイズを制限する目的は何ですか? バッファリングと小さなメモリ フットプリントの維持の概念は理解していますが、なぜ小さいサイズが強制されるのですか? おそらく、古い Win32 API の単なる人工物でしょうか?
編集: から受け取ったエラーは、Marshal.GetLastWin32Error()
「値が期待される範囲内にありません」です。
このエラーが表示されるまでの上限は 8192 バイト (8KB であるため、混乱しています)。
using System;
using System.IO;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;
namespace DiskRead
{
class Program
{
public const uint GenericRead = 0x80000000;
public const uint FileShareRead = 1;
public const uint FileShareWrite = 2;
public const uint OpenExisting = 3;
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
private static extern IntPtr CreateFile(string lpFileName, uint dwDesiredAccess,
uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition,
uint dwFlagsAndAttributes, IntPtr hTemplateFile);
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool ReadFile(IntPtr hFile, [Out] byte[] lpBuffer,
uint nNumberOfBytesToRead, out uint lpNumberOfBytesRead, IntPtr lpOverlapped);
static void Main(string[] args)
{
string path = @"\\.\PhysicalDrive0";
IntPtr ptr = CreateFile(path, GenericRead, FileShareRead | FileShareWrite, IntPtr.Zero, OpenExisting, 0, IntPtr.Zero);
SafeFileHandle handleValue = new SafeFileHandle(ptr, true);
FileStream fileStream = new FileStream(handleValue, FileAccess.Read);
const uint numberOfBytesToRead = 8193;
uint bytesRead;
byte[] buffer = new byte[numberOfBytesToRead];
if (!ReadFile(handleValue.DangerousGetHandle(), buffer, numberOfBytesToRead, out bytesRead, IntPtr.Zero))
{
Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
}
}
}
}
前もって感謝します。