オフライン ハイブに含まれるレジストリ キーから値を取得しようとしています。コードはコンパイルされますが、「System.AccessViolationException」が発生するか、プログラムが閉じます。
プログラムは、割り当てられていないメモリへの読み取りまたは書き込みを試みていると思います。ただし、stringbuilder を使用して myValue にメモリを割り当てようとしました。
pcbData を 66 未満の値に設定すると、戻り値 234 が返されます。これは、指定されたバッファー サイズがデータを保持するのに十分な大きさではないことを意味します。
戻り値が 0 になるので、OROpenHive は機能しているようです。
ORGetValue の構文 ( http://msdn.microsoft.com/en-us/library/ee210767(v=vs.85).aspx )
DWORD ORGetValue(
_In_ ORHKEY Handle,
_In_opt_ PCWSTR lpSubKey,
_In_opt_ PCWSTR lpValue,
_Out_opt_ PDWORD pdwType,
_Out_opt_ PVOID pvData,
_Inout_opt_ PDWORD pcbData
);
これが私のコードです:
[DllImport("offreg.dll", CharSet = CharSet.Auto, EntryPoint = "ORGetValue", SetLastError = true, CallingConvention = CallingConvention.StdCall)]
public static extern uint ORGetValue(
IntPtr Handle,
string lpSubKey,
string lpValue,
out uint pdwType,
out StringBuilder pvData,
ref uint pcbData);
[DllImport("offreg.dll", CharSet = CharSet.Auto)]
public static extern uint OROpenHive(
String lpHivePath,
out IntPtr phkResult);
private void button2_Click(object sender, EventArgs e)
{
IntPtr myHive;
String filepath = @"C:\Users\JON\Desktop\NTUSER.DAT";
StringBuilder myValue = new StringBuilder("", 256);
uint pdwtype;
uint pcbdata = 66;
uint ret2 = OROpenHive(filepath, out myHive);
this.textBox1.Text = ret2.ToString();
uint ret3 = ORGetValue(myHive, "Environment", "TEMP", out pdwtype, out myValue, ref pcbdata);
this.textBox1.Text = ret3.ToString();
}