program Test_Alignment; {$ModeSwitch AdvancedRecords}
uses
SysUtils;
type
u8 = System . Byte;
u16 = System . Word;
u32 = System .DWord;
u64 = System .QWord;
u128 = SysUtils.Int128Rec;
const
//...
Bit24 = u32(1 SHL 24); Bits24 = u32(Bit24 - 1);
//...
type
//...
u24 = 0..Bits24;
//...
TALPC_Completion_List_State = bitpacked record // https://www.vergiliusproject.com/kernels/x64/windows-11/25h2/_ALPC_COMPLETION_LIST_STATE
case u8 of
0: (Head, Tail : u24; ActiveThreadCount : u16);
1: (Value : u64);
end;
TRTL_SRWLOCK = record // https://www.pilotlogic.com/codetyphon/webhelp/pl_win_api/pl_win_api/win.synchapi/trtl_srwlock.html
Ptr : pointer;
end;
// _ALPC_COMPLETION_LIST_HEADER 128 alignment required
// https://nodocpage
// hfile://ntlpcapi.h systeminformer
// https://www.vergiliusproject.com/kernels/x86/windows-10/22h2/_ALPC_COMPLETION_LIST_HEADER
// https://www.vergiliusproject.com/kernels/x64/windows-11/25h2/_ALPC_COMPLETION_LIST_HEADER
pALPC_Completion_List_Header = ^TALPC_Completion_List_Header;
TALPC_Completion_List_Header = packed record
StartMagic : u64; // 0 8
TotalSize : u32; // 8 4
ListOffset : u32; // 12 4
ListSize : u32; // 16 4
BitmapOffset : u32; // 20 4
BitmapSize : u32; // 24 4
DataOffset : u32; // 28 4
DataSize : u32; // 32 4
AttributeFlags : u32; // 36 4
AttributeSize : u32; // 40 4
__padding_1__ : packed array[0..pred(20)] of byte; // 44 20
State : TALPC_COMPLETION_LIST_STATE; // 64 8
LastMessageId : u32; // 72 4
LastCallbackId : u32; // 76 4
__padding_2__ : packed array[0..pred(48)] of byte; // 80 48
PostCount : u32; // 128 4
__padding_3__ : packed array[0..pred(60)] of byte; // 132 60
ReturnCount : u32; // 192 4
__padding_4__ : packed array[0..pred(60)] of byte; // 196 60
LogSequenceNumber : u32; // 256 4
__padding_5__ : packed array[0..pred(60)] of byte; // 260 60
UserLock : TRTL_SRWLOCK; // 320 8
EndMagic : u64; // 328 8
__padding_6__ : packed array[0..pred(48)] of byte; // 336 48 // 384 total
end;
{$if SizeOf(TALPC_COMPLETION_LIST_HEADER) <> 384}
{$FATAL sizeof TALPC_COMPLETION_LIST_HEADER does not equal 384}
{$endif}
TALPC_Completion_List_Header_v2 = record
private const _Size = 384; // may be an odd size
private const _PaddedSize = ((_Size + 15) div 16) * 16; // padded to 128 bits
private var _ : packed record
var
case u8 of
0: (_8 : array[0..(_PaddedSize div 1) - 1] of u8 );
1: (_16 : array[0..(_PaddedSize div 2) - 1] of u16 );
2: (_32 : array[0..(_PaddedSize div 4) - 1] of u32 );
3: (_64 : array[0..(_PaddedSize div 8) - 1] of u64 );
4: (_128 : array[0..(_PaddedSize div 16) - 1] of u128);
end;
public property StartMagic : u64 read _._64[0];
//...
end;
begin
WriteLn(SizeOf(pALPC_Completion_List_Header(NIL)^));
WriteLn(SizeOf(TALPC_Completion_List_Header_v2 ));
ReadLn;
end.