0

C ++のCONTEXT構造体のフィールドに関する情報がどこにあるか知っている人はいますか?

4

3 に答える 3

4

@bcsanchesが述べているように、これはWindowsAPIです。完全にプロセッサに依存します。独自のヘッダーで構造を検索します。

私のヘッダーでは、次のように表示されます。

//
// Context Frame
//
//  This frame has a several purposes: 1) it is used as an argument to
//  NtContinue, 2) is is used to constuct a call frame for APC delivery,
//  and 3) it is used in the user level thread creation routines.
//
//
// The flags field within this record controls the contents of a CONTEXT
// record.
//
// If the context record is used as an input parameter, then for each
// portion of the context record controlled by a flag whose value is
// set, it is assumed that that portion of the context record contains
// valid context. If the context record is being used to modify a threads
// context, then only that portion of the threads context is modified.
//
// If the context record is used as an output parameter to capture the
// context of a thread, then only those portions of the thread's context
// corresponding to set flags will be returned.
//
// CONTEXT_CONTROL specifies SegSs, Rsp, SegCs, Rip, and EFlags.
//
// CONTEXT_INTEGER specifies Rax, Rcx, Rdx, Rbx, Rbp, Rsi, Rdi, and R8-R15.
//
// CONTEXT_SEGMENTS specifies SegDs, SegEs, SegFs, and SegGs.
//
// CONTEXT_DEBUG_REGISTERS specifies Dr0-Dr3 and Dr6-Dr7.
//
// CONTEXT_MMX_REGISTERS specifies the floating point and extended registers
//     Mm0/St0-Mm7/St7 and Xmm0-Xmm15).
//

typedef struct DECLSPEC_ALIGN(16) _CONTEXT {

    //
    // Register parameter home addresses.
    //
    // N.B. These fields are for convience - they could be used to extend the
    //      context record in the future.
    //

    DWORD64 P1Home;
    DWORD64 P2Home;
    DWORD64 P3Home;
    DWORD64 P4Home;
    DWORD64 P5Home;
    DWORD64 P6Home;

    //
    // Control flags.
    //

    DWORD ContextFlags;
    DWORD MxCsr;

    //
    // Segment Registers and processor flags.
    //

    WORD   SegCs;
    WORD   SegDs;
    WORD   SegEs;
    WORD   SegFs;
    WORD   SegGs;
    WORD   SegSs;
    DWORD EFlags;

    //
    // Debug registers
    //

    DWORD64 Dr0;
    DWORD64 Dr1;
    DWORD64 Dr2;
    DWORD64 Dr3;
    DWORD64 Dr6;
    DWORD64 Dr7;

    //
    // Integer registers.
    //

    DWORD64 Rax;
    DWORD64 Rcx;
    DWORD64 Rdx;
    DWORD64 Rbx;
    DWORD64 Rsp;
    DWORD64 Rbp;
    DWORD64 Rsi;
    DWORD64 Rdi;
    DWORD64 R8;
    DWORD64 R9;
    DWORD64 R10;
    DWORD64 R11;
    DWORD64 R12;
    DWORD64 R13;
    DWORD64 R14;
    DWORD64 R15;

    //
    // Program counter.
    //

    DWORD64 Rip;

    //
    // Floating point state.
    //

    union {
        XMM_SAVE_AREA32 FltSave;
        struct {
            M128A Header[2];
            M128A Legacy[8];
            M128A Xmm0;
            M128A Xmm1;
            M128A Xmm2;
            M128A Xmm3;
            M128A Xmm4;
            M128A Xmm5;
            M128A Xmm6;
            M128A Xmm7;
            M128A Xmm8;
            M128A Xmm9;
            M128A Xmm10;
            M128A Xmm11;
            M128A Xmm12;
            M128A Xmm13;
            M128A Xmm14;
            M128A Xmm15;
        };
    };

    //
    // Vector registers.
    //

    M128A VectorRegister[26];
    DWORD64 VectorControl;

    //
    // Special debug control registers.
    //

    DWORD64 DebugControl;
    DWORD64 LastBranchToRip;
    DWORD64 LastBranchFromRip;
    DWORD64 LastExceptionToRip;
    DWORD64 LastExceptionFromRip;
} CONTEXT, *PCONTEXT;

ただし、プラットフォームによって異なる場合があります。CONTEXT構造体の特定のバージョンに依存するコードを作成する場合、x64コードからx86用にビルドしようとしたり、その逆を試みたりするなど、別のプラットフォームをターゲットにした場合、コードはコンパイルされないことに注意してください。

そうしないと本当に良い(注:ほとんどの理由は本当に良くない)理由がない限り、この構造を不透明なオブジェクトとして扱う必要があります。このようなものは、コードではなく、、、およびの腸hal.dll内に含まれているはずです。ntoskrnl.exentdll.dll

于 2010-12-15T19:53:48.723 に答える
3

それはドキュメントに正しく書かれています:

プロセッサ固有のレジスタデータが含まれています。システムはCONTEXT構造体を使用して、さまざまな内部操作を実行します。各プロセッサアーキテクチャのこの構造の定義については、ヘッダーファイルWinNT.hを参照してください

したがって、プラットフォームを確認する必要があります。WinNT.h内で定義を見つけます。

于 2010-12-15T19:50:46.537 に答える
-1

アセンブリ言語でコードを記述していて、アセンブリ言語で例外ハンドラーを記述したい場合を除いて、CONTEXT構造体の内容に関する情報を使用したり、必要としたりする必要はありません。

アセンブリコードでロジックを記述し、それをC ++から呼び出したい場合、および例外処理を使用したい場合(ゼロによる除算やSSE例外をキャッチするなど、データ検証などのスキームで防止する必要があります)、その場合は、アセンブリ言語プロシージャを呼び出しているC++コードに例外処理を任せたほうがよいでしょう。

例外処理に関するC++コードの機能に煩わされる必要がないため、これははるかに面倒ではありません。アセンブリコードロジックを機能させる方がはるかに簡単で簡単なので、例外がスローされるのを防ぐことができます。それに加えて、問題の処理方法においてコードを大幅に効率的かつ優雅にする必要があります。

念のために言っておきますが、例外処理メカニズムは、セーフティネットとして機能し、奇妙で予期しないことが起こったときにソフトウェアが単にクラッシュして贅沢に燃えるのを防ぐための最後の手段として考案されました。例外をスローすることは、ルールではなく例外である必要があるため、「例外」と呼ばれます。

于 2016-05-10T05:15:26.510 に答える