2010-12-15 1 views
0

Кто-нибудь знает, где я могу найти некоторую информацию о полях структуры CONTEXT в C++?C++ & Контекстная структура

+0

Вы говорите об этом: http://msdn.microsoft.com/en-us/library/ms679284(VS.85).aspx. Если да, обратите внимание, что это не совсем C++, а Windows API. Как указано в документе msdn, проверьте winnt.h – bcsanches

+1

да, но я не видел никаких подробностей о его полях ... – Idov

+0

поля соответствуют регистрам процессора, поэтому вам нужно уточнить у своего поставщика процессора дополнительную информацию, если вы хотите знать, например, что такое регистр MMX, или как интерпретировать регистры сегментов. Для большинства разумных конфигураций, http://www.intel.com/products/processor/manuals/должен помочь вам, если вы не используете Itanium или что-то странное. – dsolimano

ответ

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, ваш код не будет компилироваться, когда вы нацеливаете другую платформу, например, пытаетесь построить для x86 с кодом x64 или наоборот.

Вы должны действительно рассматривать эту структуру как непрозрачный объект, если у вас есть действительно хороший (Примечание: Большинство причины не действительно хорошо) причины сделать иначе. Этот материал должен содержаться в недрах hal.dll, ntoskrnl.exe и ntdll.dll, а не ваш код.

+0

Это хороший ответ Билли. – user1232138

3

Он говорит прямо в документации:

Содержит данные регистров процессора конкретным. Система использует структуры CONTEXT для выполнения различных внутренних операций. Обратитесь к файлу заголовка WinNT.h для определения этой структуры для каждой архитектуры процессора.

Поэтому вам нужно проверить свою платформу. Найдите определение в WinNT.h.

-1

Если вы не пишете код на языке ассемблера, а затем хотите написать обработчик исключений на языке ассемблера, вы не должны использовать или не нуждаться в информации о содержании структуры CONTEXT.

Если вы хотите написать логику в коде сборки и хотите вызвать ее из C++, и вы хотите использовать обработку исключений (например, чтобы уловить деления на ноль или исключения из SSE, которые, вероятно, следует предотвращать с помощью таких схем, как данные валидация в любом случае), тогда вам, вероятно, лучше оставить обработку исключений для кода C++, который вызывает вашу процедуру языка ассемблера.

Это будет гораздо менее беспорядочно, потому что тогда вам не придется беспокоиться о том, что делает код на C++ в отношении обработки исключений. Гораздо проще и проще просто сделать свою логику кода сборки, чтобы она не исключала исключения. Кроме того, это должно сделать ваш код значительно более эффективным и изящным в том, как он справляется с проблемами.

Имейте в виду, что механизмы обработки исключений были изобретены в качестве защитной сетки и в качестве крайней меры для спасения программного обеспечения от простого сбоя и сжигания экстравагантно, когда случается что-то странное и неожиданное. Отбрасывание исключений должно быть скорее исключением, чем правилом, поэтому их называют «исключениями».