XMM_SAVE_AREA32 Structure
The XMM_SAVE_AREA32 structure defines the layout of the 128‑bit SSE registers for a 32‑bit context. It is used as part of the CONTEXT structure when the CONTEXT_XSTATE flag is set.
Syntax
typedef struct _XMM_SAVE_AREA32 {
DWORD ControlWord;
DWORD StatusWord;
BYTE TagWord;
BYTE Reserved1;
WORD ErrorOpcode;
DWORD ErrorOffset;
WORD ErrorSelector;
WORD Reserved2;
DWORD DataOffset;
WORD DataSelector;
WORD Reserved3;
DWORD MXCSR;
DWORD MXCSR_Mask;
M128A FloatRegisters[8];
M128A XmmRegisters[16];
BYTE Reserved4[96];
} XMM_SAVE_AREA32, *PXMM_SAVE_AREA32;
Members
| Member | Type | Offset (bytes) | Description |
|---|---|---|---|
| ControlWord | DWORD | 0 | The x87 FPU control word. |
| StatusWord | DWORD | 4 | The x87 FPU status word. |
| TagWord | BYTE | 8 | Tag word for the FPU registers. |
| Reserved1 | BYTE | 9 | Reserved. |
| ErrorOpcode | WORD | 10 | Opcode of the last x87 instruction that generated an exception. |
| ErrorOffset | DWORD | 12 | Instruction pointer for the exception. |
| ErrorSelector | WORD | 16 | Code segment selector for the exception. |
| Reserved2 | WORD | 18 | Reserved. |
| DataOffset | DWORD | 20 | Data pointer for the exception. |
| DataSelector | WORD | 24 | Data segment selector for the exception. |
| Reserved3 | WORD | 26 | Reserved. |
| MXCSR | DWORD | 28 | Current MXCSR register value. |
| MXCSR_Mask | DWORD | 32 | Mask of supported MXCSR bits. |
| FloatRegisters[8] | M128A[8] | 36 | Legacy x87 FP registers (ST0‑ST7). |
| XmmRegisters[16] | M128A[16] | 164 | SSE XMM registers (XMM0‑XMM15). |
| Reserved4[96] | BYTE[96] | 420 | Reserved for future use. |
Example
#include <windows.h>
#include <stdio.h>
void PrintXmmSaveArea(const XMM_SAVE_AREA32* pXmm)
{
printf("MXCSR = 0x%08X\n", pXmm->MXCSR);
for (int i = 0; i < 16; ++i) {
printf("XMM%02d = %016llX%016llX\n",
i,
pXmm->XmmRegisters[i].High,
pXmm->XmmRegisters[i].Low);
}
}
int main()
{
CONTEXT ctx = {0};
ctx.ContextFlags = CONTEXT_FULL | CONTEXT_FLOATING_POINT;
if (GetThreadContext(GetCurrentThread(), &ctx)) {
PrintXmmSaveArea(&ctx.XmmSaveArea32);
}
return 0;
}