2010-12-15 12 views
0

誰でもC++のCONTEXT構造体のフィールドについての情報をどこから見つけることができますか?C++&Context structure

+0

あなたはこれについて話していますか:http://msdn.microsoft.com/en-us/library/ms679284(VS.85).aspxはいの場合、これは正確にC++ではなく、Windows APIであることに注意してください。 msdn docに関連して、winnt.h – bcsanches

+1

はいを​​チェックしますが、そのフィールドについての詳細は表示されませんでした... – Idov

+0

フィールドはプロセッサレジスタに対応していますので、詳細はプロセッサベンダーに確認する必要がありますたとえば、MMXレジスタとは何か、またはセグメントレジスタをどのように解釈するかを知りたがっています。ほとんどの設定では、http://www.intel。あなたがItaniumや何か見知らぬ人でない限り、com/products/processor/manuals /はあなたを助けます。 – 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構造体に依存するコードを記述すると、x64コードからx86を構築しようとするなど、別のプラットフォームをターゲットにしてもコードはコンパイルされません。

あなたが本当に良いていない限り、あなたは本当に不透明なオブジェクトとしてこのような構造を扱うべきである(注:ほとんどの理由は本当に良いではない)場合に実行する理由。あなたのコードではなく、hal.dllntoskrnl.exe、およびntdll.dllの腸内に含まれているはずです。

+0

これは素晴らしい答えです。 – user1232138

3

それは右の文書で述べている:

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

プラットフォームを確認する必要があります。 WinNT.h内の定義を探します。

-1

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

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

これは、例外処理に関するC++コードの役割を騒がす必要がないため、はるかに面倒ではありません。アセンブリコードロジックを機能させるだけで、例外がスローされるのを防ぐことがはるかに簡単で簡単です。それだけでなく、問題をどのように処理するのか、コードをはるかに効率的かつ優雅にする必要があります。

セーフティネットとして機能し、奇妙で予期せぬことが起こったときに、ソフトウェアを救うための最後の手段として、例外処理メカニズムが発明されました。例外をスローすることは、ルールではなく例外でなければならないため、「例外」と呼ばれます。