windows C++ & 上下文结构

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/4454120/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-15 15:48:20  来源:igfitidea点击:

c++ & Context structure

c++windowsdbghelp

提问by Idov

Does anybody know where I can find some information about the fields of the CONTEXT structure in C++?

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

回答by Billy ONeal

As @bcsanches states, this is a Windows API. It's going to be completely processor dependent. Look up the structure in your own headers.

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

On my headers it shows as:

在我的标题上它显示为:

//
// 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;

but it may be different for your platform. Note that if you write code that depends on any particular version of the CONTEXT structure, your code won't compile when you target another platform, such as attempting to build for x86 from x64 code or vice versa.

但您的平台可能会有所不同。请注意,如果您编写的代码依赖于任何特定版本的 CONTEXT 结构,那么当您以另一个平台为目标时,您的代码将无法编译,例如尝试从 x64 代码构建 x86,反之亦然。

You should really treat this structure as an opaque object unless you have a really good(Note: Most reasons aren't really good) reason to do otherwise. This stuff's supposed to be contained within the bowels of hal.dll, ntoskrnl.exe, and ntdll.dll, not your code.

你真的应该把这个结构当作一个不透明的对象,除非你有一个很好的(注意:大多数原因都不是很好)的理由不这样做。这东西是应该包含的肠子内hal.dllntoskrnl.exentdll.dll,而不是你的代码。

回答by John Dibling

It says right in the documentation:

它在文档中说得对:

Contains processor-specific register data. The system uses CONTEXT structures to perform various internal operations. Refer to the header file WinNT.h for definitions of this structure for each processor architecture.

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

So you need to check your platform. Find the definition within WinNT.h.

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

回答by Jorge Gonzalez

Unless you are writing code in assembly language and then want to write an exception handler in assembly language, you should have no use or need for information about CONTEXTstructure contents.

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

If you do want to write logic in assembly code and want to call it from C++, and you want to use exception handling (such as to catch divisions by zero or SSE exceptions, which probably should be prevented through schemes like data validation anyway), then you're probably better off leaving the exception handling to the C++ code that is calling your assembly language procedure.

如果您确实想在汇编代码中编写逻辑并想从 C++ 中调用它,并且您想使用异常处理(例如捕捉被零除或 SSE 异常,这可能应该通过数据验证等方案来防止),那么最好将异常处理留给调用汇编语言过程的 C++ 代码。

That'll be far less messy because then you won't have to fuss with what the C++ code does for its part concerning exception handling. It is far easier and simpler to just make your assembly code logic work so it prevents exceptions from being thrown. Besides that, it should make your code significantly more efficient and graceful in how it handles problems.

这将不会那么混乱,因为这样您就不必为 C++ 代码在其有关异常处理的部分所做的事情大惊小怪。让你的汇编代码逻辑工作更容易和更简单,这样可以防止抛出异常。除此之外,它应该使您的代码在处理问题的方式上更加高效和优雅。

Mind you, exception handling mechanisms were invented to serve as a safety net and as a measure of last resort to save software from simply crashing and burning extravagantly when something weird and unexpected happens. Throwing exceptions should be the exception rather than the rule, hence them being named "exceptions".

请注意,异常处理机制的发明是为了作为一个安全网,并作为最后的手段来防止软件在发生奇怪和意外的事情时简单地崩溃和过度烧毁。抛出异常应该是例外而不是规则,因此它们被命名为“异常”。