1

オフライン ハイブに含まれるレジストリ キーから値を取得しようとしています。コードはコンパイルされますが、「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();
    }
4

1 に答える 1

0

あなたは結果を間違って受け止めています。pcbdataバッファのサイズで渡される必要があり、関数が戻った後に実際に読み取られた文字数が含まれます。

Winapi 関数はバッファーのサイズを認識しないため、256 バイトを割り当てているORGetValue場合でも、66 バイトしか割り当てていないことを示しています... 66 バイト以上を必要とするキーを読み取っている場合は、返されます234(またはERROR_MORE_DATA)。

通常は次のようにします。

StringBuilder myValue = new StringBuilder("", 256);
uint pcbdata = myValue.Capacity;
//...
uint ret3 = ORGetValue(myHive, "Environment", "TEMP", out pdwtype, out myValue,  ref pcbdata);
this.textBox1.Text = "Read " + pcbdata.ToString() + " bytes - returned: " + ret3.ToString();

キーが 66 バイトの場合、次のようになります。Read 66 bytes - returned: 0

于 2012-10-12T07:29:30.570 に答える