The structure (external) alignment is only one of the potential problems. For the compiled structure to work correctly its internal layout must be precisely as the Microsoft compilers would lay it out. No problem for a good compiler, but…
Below is the output for this source:
#include <windows.h>
#include <stdio.h>
#include <stddef.h>
int __cdecl main(void)
{
CONTEXT context;
printf("sizeof(CONTEXT) \t%I64d\n", sizeof(CONTEXT));
printf("__alignof(context) \t%I64d\n\n", __alignof(context));
printf("offsetof(p1Home) \t%I64d\n", offsetof(CONTEXT,P1Home));
printf("offsetof(p2Home) \t%I64d\n", offsetof(CONTEXT,P2Home));
printf("offsetof(p3Home) \t%I64d\n", offsetof(CONTEXT,P3Home));
printf("offsetof(p4Home) \t%I64d\n", offsetof(CONTEXT,P4Home));
printf("offsetof(p5Home) \t%I64d\n", offsetof(CONTEXT,P5Home));
printf("offsetof(p6Home) \t%I64d\n", offsetof(CONTEXT,P6Home));
printf("offsetof(p6Home) \t%I64d\n", offsetof(CONTEXT,P6Home));
printf("offsetof(ContextFlags) \t%I64d\n", offsetof(CONTEXT,ContextFlags));
printf("offsetof(MxCsr) \t%I64d\n", offsetof(CONTEXT,MxCsr));
printf("offsetof(SegCs) \t%I64d\n", offsetof(CONTEXT,SegCs));
printf("offsetof(SegDs) \t%I64d\n", offsetof(CONTEXT,SegDs));
printf("offsetof(SegEs) \t%I64d\n", offsetof(CONTEXT,SegEs));
printf("offsetof(SegFs) \t%I64d\n", offsetof(CONTEXT,SegFs));
printf("offsetof(SegGs) \t%I64d\n", offsetof(CONTEXT,SegGs));
printf("offsetof(SegSs) \t%I64d\n", offsetof(CONTEXT,SegSs));
printf("offsetof(EFlag)s \t%I64d\n", offsetof(CONTEXT,EFlags));
printf("offsetof(Dr0) \t%I64d\n", offsetof(CONTEXT,Dr0));
printf("offsetof(Dr1) \t%I64d\n", offsetof(CONTEXT,Dr1));
printf("offsetof(Dr2) \t%I64d\n", offsetof(CONTEXT,Dr2));
printf("offsetof(Dr3) \t%I64d\n", offsetof(CONTEXT,Dr3));
printf("offsetof(Dr6) \t%I64d\n", offsetof(CONTEXT,Dr6));
printf("offsetof(Dr7) \t%I64d\n", offsetof(CONTEXT,Dr7));
printf("offsetof(Rax) \t%I64d\n", offsetof(CONTEXT,Rax));
printf("offsetof(Rcx) \t%I64d\n", offsetof(CONTEXT,Rcx));
printf("offsetof(Rdx) \t%I64d\n", offsetof(CONTEXT,Rdx));
printf("offsetof(Rbx) \t%I64d\n", offsetof(CONTEXT,Rbx));
printf("offsetof(Rsp) \t%I64d\n", offsetof(CONTEXT,Rsp));
printf("offsetof(Rbp) \t%I64d\n", offsetof(CONTEXT,Rbp));
printf("offsetof(Rsi) \t%I64d\n", offsetof(CONTEXT,Rsi));
printf("offsetof(Rdi) \t%I64d\n", offsetof(CONTEXT,Rdi));
printf("offsetof(R8) \t%I64d\n", offsetof(CONTEXT,R8));
printf("offsetof(R9) \t%I64d\n", offsetof(CONTEXT,R9));
printf("offsetof(R10) \t%I64d\n", offsetof(CONTEXT,R10));
printf("offsetof(R11) \t%I64d\n", offsetof(CONTEXT,R11));
printf("offsetof(R12) \t%I64d\n", offsetof(CONTEXT,R12));
printf("offsetof(R13) \t%I64d\n", offsetof(CONTEXT,R13));
printf("offsetof(R14) \t%I64d\n", offsetof(CONTEXT,R14));
printf("offsetof(R15) \t%I64d\n", offsetof(CONTEXT,R15));
printf("offsetof(Rip) \t%I64d\n\n", offsetof(CONTEXT,Rip));
printf("sizeof(M128A) \t%I64d\n", sizeof(M128A));
printf("__alignof(FltSave) \t%I64d\n", __alignof(context.FltSave));
printf("sizeof(FltSave) \t%I64d\n", sizeof(context.FltSave));
printf("sizeof(DUMMYSTRUCTNAME) \t%I64d\n\n", sizeof(context.Header) +
sizeof(context.Legacy) +
sizeof(context.Xmm0) +
sizeof(context.Xmm1) +
sizeof(context.Xmm2) +
sizeof(context.Xmm3) +
sizeof(context.Xmm4) +
sizeof(context.Xmm5) +
sizeof(context.Xmm6) +
sizeof(context.Xmm7) +
sizeof(context.Xmm8) +
sizeof(context.Xmm9) +
sizeof(context.Xmm10) +
sizeof(context.Xmm11) +
sizeof(context.Xmm12) +
sizeof(context.Xmm13) +
sizeof(context.Xmm14) +
sizeof(context.Xmm15));
printf("offsetof(FltSave) \t%I64d\n", offsetof(CONTEXT,FltSave));
printf("offsetof(Header[2]) \t%I64d\n", offsetof(CONTEXT,Header));
printf("offsetof(Legacy[8]) \t%I64d\n", offsetof(CONTEXT,Legacy));
printf("offsetof(Xmm0) \t%I64d\n", offsetof(CONTEXT,Xmm0));
printf("offsetof(Xmm1) \t%I64d\n", offsetof(CONTEXT,Xmm1));
printf("offsetof(Xmm2) \t%I64d\n", offsetof(CONTEXT,Xmm2));
printf("...\n");
printf("offsetof(Xmm15) \t%I64d\n", offsetof(CONTEXT,Xmm15));
printf("offsetof(VectorRegister) \t%I64d\n", offsetof(CONTEXT,VectorRegister));
printf("offsetof(VectorControl) \t%I64d\n", offsetof(CONTEXT,VectorControl));
printf("...\n");
printf("offsetof(LastExceptionFromRip) \t%I64d\n\n", offsetof(CONTEXT,LastExceptionFromRip));
return 0;
}
/* THESE FROM WINNT.H:
typedef struct DECLSPEC_ALIGN(16) _M128A {
ULONGLONG Low;
LONGLONG High;
} M128A, *PM128A;
typedef struct DECLSPEC_ALIGN(16) _XSAVE_FORMAT {
WORD ControlWord;
WORD 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];
#ifdef _WIN64
M128A XmmRegisters[16];
BYTE Reserved4[96];
#else
M128A XmmRegisters[8];
BYTE Reserved4[192];
DWORD StackControl[7];
DWORD Cr0NpxState;
#endif
} XSAVE_FORMAT, *PXSAVE_FORMAT;
typedef struct DECLSPEC_ALIGN (16) _CONTEXT {
DWORD64 P1Home;
DWORD64 P2Home;
DWORD64 P3Home;
DWORD64 P4Home;
DWORD64 P5Home;
DWORD64 P6Home;
DWORD ContextFlags;
DWORD MxCsr;
WORD SegCs;
WORD SegDs;
WORD SegEs;
WORD SegFs;
WORD SegGs;
WORD SegSs;
DWORD EFlags;
DWORD64 Dr0;
DWORD64 Dr1;
DWORD64 Dr2;
DWORD64 Dr3;
DWORD64 Dr6;
DWORD64 Dr7;
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;
DWORD64 Rip;
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;
} DUMMYSTRUCTNAME;
} DUMMYUNIONNAME;
M128A VectorRegister[26];
DWORD64 VectorControl;
DWORD64 DebugControl;
DWORD64 LastBranchToRip;
DWORD64 LastBranchFromRip;
DWORD64 LastExceptionToRip;
DWORD64 LastExceptionFromRip;
} CONTEXT, *PCONTEXT;
*/
Compiled to a 64-bit app with Pelles C Version 8.00.33 Release Candidate #7 (Win64):
sizeof(CONTEXT) 1232
__alignof(context) 16
offsetof(p1Home) 0
offsetof(p2Home) 8
offsetof(p3Home) 16
offsetof(p4Home) 24
offsetof(p5Home) 32
offsetof(p6Home) 40
offsetof(p6Home) 40
offsetof(ContextFlags) 48
offsetof(MxCsr) 52
offsetof(SegCs) 56
offsetof(SegDs) 58
offsetof(SegEs) 60
offsetof(SegFs) 62
offsetof(SegGs) 64
offsetof(SegSs) 66
offsetof(EFlag)s 68
offsetof(Dr0) 72
offsetof(Dr1) 80
offsetof(Dr2) 88
offsetof(Dr3) 96
offsetof(Dr6) 104
offsetof(Dr7) 112
offsetof(Rax) 120
offsetof(Rcx) 128
offsetof(Rdx) 136
offsetof(Rbx) 144
offsetof(Rsp) 152
offsetof(Rbp) 160
offsetof(Rsi) 168
offsetof(Rdi) 176
offsetof(R8) 184
offsetof(R9) 192
offsetof(R10) 200
offsetof(R11) 208
offsetof(R12) 216
offsetof(R13) 224
offsetof(R14) 232
offsetof(R15) 240
offsetof(Rip) 248
sizeof(M128A) 16
__alignof(FltSave) 16
sizeof(FltSave) 512
sizeof(DUMMYSTRUCTNAME) 416
offsetof(FltSave) 256
offsetof(Header[2]) 256
offsetof(Legacy[8]) 288
offsetof(Xmm0) 416
offsetof(Xmm1) 432
offsetof(Xmm2) 448
...
offsetof(Xmm15) 656
offsetof(VectorRegister) 768
offsetof(VectorControl) 1184
...
offsetof(LastExceptionFromRip) 1224