Кто-нибудь знает, где я могу найти некоторую информацию о полях структуры CONTEXT в C++?C++ & Контекстная структура
ответ
Как указано в @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, ваш код не будет компилироваться, когда вы нацеливаете другую платформу, например, пытаетесь построить для x86 с кодом x64 или наоборот.
Вы должны действительно рассматривать эту структуру как непрозрачный объект, если у вас есть действительно хороший (Примечание: Большинство причины не действительно хорошо) причины сделать иначе. Этот материал должен содержаться в недрах hal.dll
, ntoskrnl.exe
и ntdll.dll
, а не ваш код.
Это хороший ответ Билли. – user1232138
Он говорит прямо в документации:
Содержит данные регистров процессора конкретным. Система использует структуры CONTEXT для выполнения различных внутренних операций. Обратитесь к файлу заголовка WinNT.h для определения этой структуры для каждой архитектуры процессора.
Поэтому вам нужно проверить свою платформу. Найдите определение в WinNT.h.
Если вы не пишете код на языке ассемблера, а затем хотите написать обработчик исключений на языке ассемблера, вы не должны использовать или не нуждаться в информации о содержании структуры CONTEXT
.
Если вы хотите написать логику в коде сборки и хотите вызвать ее из C++, и вы хотите использовать обработку исключений (например, чтобы уловить деления на ноль или исключения из SSE, которые, вероятно, следует предотвращать с помощью таких схем, как данные валидация в любом случае), тогда вам, вероятно, лучше оставить обработку исключений для кода C++, который вызывает вашу процедуру языка ассемблера.
Это будет гораздо менее беспорядочно, потому что тогда вам не придется беспокоиться о том, что делает код на C++ в отношении обработки исключений. Гораздо проще и проще просто сделать свою логику кода сборки, чтобы она не исключала исключения. Кроме того, это должно сделать ваш код значительно более эффективным и изящным в том, как он справляется с проблемами.
Имейте в виду, что механизмы обработки исключений были изобретены в качестве защитной сетки и в качестве крайней меры для спасения программного обеспечения от простого сбоя и сжигания экстравагантно, когда случается что-то странное и неожиданное. Отбрасывание исключений должно быть скорее исключением, чем правилом, поэтому их называют «исключениями».
Вы говорите об этом: http://msdn.microsoft.com/en-us/library/ms679284(VS.85).aspx. Если да, обратите внимание, что это не совсем C++, а Windows API. Как указано в документе msdn, проверьте winnt.h – bcsanches
да, но я не видел никаких подробностей о его полях ... – Idov
поля соответствуют регистрам процессора, поэтому вам нужно уточнить у своего поставщика процессора дополнительную информацию, если вы хотите знать, например, что такое регистр MMX, или как интерпретировать регистры сегментов. Для большинства разумных конфигураций, http://www.intel.com/products/processor/manuals/должен помочь вам, если вы не используете Itanium или что-то странное. – dsolimano