c ++&上下文结构

时间:2010-12-15 19:42:34

标签: c++ windows dbghelp

有谁知道我在哪里可以找到有关C ++中CONTEXT结构字段的一些信息?

3 个答案:

答案 0 :(得分:4)

正如@bcsanches所说,这是一个Windows API。它将完全取决于处理器。在您自己的标题中查找结构。

在我的标题上显示为:

//
// 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.dllntoskrnl.exentdll.dll的内容中,而不是您的代码。

答案 1 :(得分:3)

它在文档中说:

  

包含特定于处理器的寄存器数据。系统使用CONTEXT结构执行各种内部操作。 有关每种处理器架构的结构定义,请参阅头文件WinNT.h

所以你需要检查你的平台。在WinNT.h中找到定义。

答案 2 :(得分:-1)

除非您使用汇编语言编写代码,然后想用汇编语言编写异常处理程序,否则您不应该使用或需要有关CONTEXT结构内容的信息。

如果你想在汇编代码中编写逻辑并希望从C ++调用它,并且你想使用异常处理(例如通过零或SSE异常捕获分区,这可能应该通过数据验证等方案来防止无论如何),那么你最好将异常处理留给调用汇编语言程序的C ++代码。

这样就不那么混乱了,因为那时你不必大惊小怪C ++代码在异常处理方面的作用。使汇编代码逻辑工作变得容易和简单,以防止异常被抛出。除此之外,它应该使您的代码在处理问题方面更加高效和优雅。

请注意,异常处理机制是作为一种安全网而发明的,并且作为最后的手段,可以避免软件在发生奇怪和意外情况时简单地崩溃和焚烧。抛出异常应该是例外而不是规则,因此它们被命名为"例外"。