-4

関数を使用して、実行中のプロセスへのハンドルを取得しようとしていOpenProcessます。ただし、エラー コードを確認すると、エラー コード 6 (ERROR_INVALID_HANDLE) が表示されます。

以下は縮小されたサンプルです。

using System;
using System.Runtime.InteropServices;
using System.Diagnostics;

namespace Test
{
    class TestClass
    {
        [DllImport("kernel32.dll")]
        static extern uint GetLastError();

        [DllImport("kernel32.dll")]
        public static extern IntPtr OpenProcess(int dwDesiredAccess,
               bool bInheritHandle, int dwProcessId);

        [DllImport("kernel32.dll", SetLastError = true)]
        static extern bool WriteProcessMemory(int hProcess, int lpBaseAddress,
              byte[] lpBuffer, int dwSize, ref int lpNumberOfBytesWritten);

        static void Main() 
        {
            var process = Process.GetProcessesByName("Sample")[0];
            var processHandle = OpenProcess(0x001F0FFF, false, process.Id);    
            Console.WriteLine(GetLastError());

            int bytesRead = 0;
            byte[] buffer = BitConverter.GetBytes(1095090201);

            WriteProcessMemory(
                (int)processHandle,
                0x21F3CAAC,
                buffer,
                buffer.Length, 
                ref bytesRead);

            Console.ReadKey();
        }
    }
}
}

なぜうまくいかないのか、よくわかりません。エラー コード 6 が返されるだけです。

アクセスしているプログラムが原因であると感じていますが、他のすべては正常に実行されており、他のエラーは返されません。

4

1 に答える 1

1

エラーチェックを改善する必要があります。OpenProcess最後のエラーを要求する前に、戻りコードが nullであるかどうかを最初に確認する必要があります。これを正しく機能させるには、 を true に設定する必要があり、DllImport使用しないでくださいSetLastErrorGetLastError

[DllImport("kernel32.dll", SetLastError=true)]
public static extern IntPtr OpenProcess(int dwDesiredAccess,
       bool bInheritHandle, int dwProcessId);

processHandle = OpenProcess(0x001F0FFF, false, process.Id); 
if (processHandle == IntPtr.Zero)
{
    Console.WriteLine(Marshal.GetLastWin32Error());
}

理想的には、ネイティブ エラー コードからマネージ例外を作成します。これには、標準の .NET 例外処理を使用できるという利点があり、エラー コードとテキストの説明が例外に適切にまとめられていることがわかります。

processHandle = OpenProcess(0x001F0FFF, false, process.Id); 
if (processHandle == IntPtr.Zero)
{
    // calls Marhal.GetLastWin32Error and GetErrorMessage under the hood
    throw new Win32Exception();
}

そしてもちろん、終わったら電話することを忘れないでくださいCloseHandle

于 2015-12-08T12:42:16.897 に答える