2

こんにちは、システム上の 64 ビット プロセスのスレッド コンテキストを取得しようとしています。正しい機能を備えた 32 ビットと 64 ビットの両方のソリューションを使用してみました。しかし、私はいつもエラー「0x57」、無効なパラメータで終わります。64 ビット コードの短いサンプル。

// open a handle to the thread
HANDLE hThread = OpenThread(THREAD_GET_CONTEXT | THREAD_SET_CONTEXT | 
THREAD_SUSPEND_RESUME | THREAD_QUERY_INFORMATION, FALSE,
        atoi(argv[1]));
if(hThread  == NULL) {
    printf("Error opening thread handle.. 0x%08x\n", GetLastError());
    return 0;
}

// suspend the thread
if(Wow64SuspendThread(hThread ) == -1) {
    printf("Error suspending thread.. 0x%08x\n", GetLastError());
    CloseHandle(hThread );
    return 0;
}

// get the thread context
WOW64_CONTEXT orig_ctx = {WOW64_CONTEXT_FULL };
if(GetThreadContext(hThread , &orig_ctx) == FALSE) {
    printf("Error  0x%08x\n", GetLastError());
    CloseHandle(hThread );
    return 0;
}

ハンドルが間違っているとは思えませんが、コードは 32 ビット プロセスで正しく動作していました。助けやアドバイスをいただければ幸いです。前もって感謝します!

4

1 に答える 1

1

次のコードは、64 ビット アプリケーションとしてコンパイルされると、64 ビット スレッドのスレッド コンテキストを正常に取得します。

// threadcontext.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <Windows.h>
#include <tchar.h>


int _tmain(int argc, _TCHAR* argv[])
{
    // open a handle to the thread
    HANDLE hThread = OpenThread(THREAD_GET_CONTEXT | THREAD_SET_CONTEXT | 
    THREAD_SUSPEND_RESUME | THREAD_QUERY_INFORMATION, FALSE, _ttoi(argv[1]));

    if(hThread  == NULL) {
        printf("Error opening thread handle.. 0x%08x\n", GetLastError());
        return 0;
    }   

    // suspend the thread
    if(SuspendThread(hThread ) == -1) {
        printf("Error suspending thread.. 0x%08x\n", GetLastError());
        CloseHandle(hThread );
        return 0;
    }

    // get the thread context
    CONTEXT orig_ctx = { 0 };
    orig_ctx.ContextFlags = CONTEXT_FULL;
    if(GetThreadContext(hThread , &orig_ctx) == FALSE) {
        printf("Error  0x%08x\n", GetLastError());
        CloseHandle(hThread );
        return 0;
    }

    return 0;
}

注意すべきことの 1 つは、通常の呼び出しと Wow64 呼び出しが混在していないことです。Wow64 呼び出しは、64 ビット システムで実行されている 32 ビット プロセスに関する情報を取得するためのものです。

もう 1 つの修正は、ContextFlags メンバーの設定です。初期化中に設定しようとしましたが、ContextFlags メンバーは構造体の最初のメンバーではありません。

于 2012-07-11T19:51:55.723 に答える