2.16 Formal MIDL Definition

The Microsoft Interface Definition Language (MIDL) description of the PAC is as follows.

 import "ms-adts-claims.idl";
  
 typedef struct _RPC_SID *PISID;
  
 typedef struct _KERB_SID_AND_ATTRIBUTES{
     PISID Sid;
     ULONG Attributes;
 } KERB_SID_AND_ATTRIBUTES, *PKERB_SID_AND_ATTRIBUTES;
  
 typedef struct _GROUP_MEMBERSHIP {
     ULONG RelativeId;
     ULONG Attributes;
 } GROUP_MEMBERSHIP, *PGROUP_MEMBERSHIP;
  
 typedef struct DOMAIN_GROUP_MEMBERSHIP {
     PISID DomainId;
     ULONG GroupCount;
     [size_is(GroupCount)] PGROUP_MEMBERSHIP GroupIds;
 } DOMAIN_GROUP_MEMBERSHIP, *PDOMAIN_GROUP_MEMBERSHIP;
  
 typedef struct _PACTYPE {
     ULONG cBuffers;
     ULONG Version;
     PAC_INFO_BUFFER Buffers[1];
 } PACTYPE, *PPACTYPE;
  
 typedef struct _PAC_INFO_BUFFER {
     ULONG ulType;
     ULONG cbBufferSize;
     ULONG64 Offset;
 } PAC_INFO_BUFFER, *PPAC_INFO_BUFFER;
  
 typedef struct _CYPHER_BLOCK {
     CHAR data[8];
 }CYPHER_BLOCK;
  
 typedef struct _USER_SESSION_KEY {
     CYPHER_BLOCK data[2];
 }USER_SESSION_KEY;
  
 typedef struct _KERB_VALIDATION_INFO {
     FILETIME LogonTime;            
     FILETIME LogoffTime;
     FILETIME KickOffTime;
     FILETIME PasswordLastSet;
     FILETIME PasswordCanChange;
     FILETIME PasswordMustChange;   
     RPC_UNICODE_STRING EffectiveName;
     RPC_UNICODE_STRING FullName;
     RPC_UNICODE_STRING LogonScript;
     RPC_UNICODE_STRING ProfilePath;
     RPC_UNICODE_STRING HomeDirectory;
     RPC_UNICODE_STRING HomeDirectoryDrive;
     USHORT LogonCount;
     USHORT BadPasswordCount;
     ULONG UserId;
     ULONG PrimaryGroupId;
     ULONG GroupCount;
     [size_is(GroupCount)]
     PGROUP_MEMBERSHIP GroupIds;
     ULONG UserFlags;
     USER_SESSION_KEY UserSessionKey;
     RPC_UNICODE_STRING LogonServer;
     RPC_UNICODE_STRING LogonDomainName;
     PISID LogonDomainId;
     ULONG Reserved1[2];
     ULONG UserAccountControl;
     ULONG Reserved3[7];
     ULONG SidCount;
     [size_is(SidCount)]
     PKERB_SID_AND_ATTRIBUTES ExtraSids;
     PISID ResourceGroupDomainSid;
     ULONG ResourceGroupCount;
     [size_is(ResourceGroupCount)]
     PGROUP_MEMBERSHIP ResourceGroupIds;
 } KERB_VALIDATION_INFO, *PKERB_VALIDATION_INFO;
  
 typedef struct _PAC_CREDENTIAL_INFO {
     ULONG Version;
     ULONG EncryptionType;
     UCHAR SerializedData[1];
 } PAC_CREDENTIAL_INFO, *PPAC_CREDENTIAL_INFO;
  
 typedef struct _PAC_CREDENTIAL_DATA {
     ULONG CredentialCount;
     [size_is(CredentialCount)] 
          SECPKG_SUPPLEMENTAL_CRED Credentials[*];
 } PAC_CREDENTIAL_DATA, *PPAC_CREDENTIAL_DATA;
  
 typedef struct _SECPKG_SUPPLEMENTAL_CRED {
     RPC_UNICODE_STRING PackageName;
     ULONG CredentialSize;
     [size_is(CredentialSize)]
     PUCHAR Credentials;
 } SECPKG_SUPPLEMENTAL_CRED, *PSECPKG_SUPPLEMENTAL_CRED;
  
 typedef struct _NTLM_SUPPLEMENTAL_CREDENTIAL {
     ULONG Version;
     ULONG Flags;
     UCHAR LmPassword[16];
     UCHAR NtPassword[16];
 } NTLM_SUPPLEMENTAL_CREDENTIAL, *PNTLM_SUPPLEMENTAL_CREDENTIAL;
  
 typedef struct _PAC_CLIENT_INFO {
     FILETIME ClientId;
     USHORT NameLength;
     WCHAR Name[1];
 } PAC_CLIENT_INFO, *PPAC_CLIENT_INFO;
  
 typedef struct _PAC_SIGNATURE_DATA {
     ULONG SignatureType;
     UCHAR Signature[ANYSIZE_ARRAY];     // size is from the PAC_INFO_BUFFER - sizeof(ULONG)
 } PAC_SIGNATURE_DATA, *PPAC_SIGNATURE_DATA;
  
 typedef struct _S4U_DELEGATION_INFO {
     RPC_UNICODE_STRING S4U2proxyTarget;
     ULONG TransitedListSize;
     [size_is( TransitedListSize )]
     PRPC_UNICODE_STRING S4UTransitedServices;
 } S4U_DELEGATION_INFO, *PS4U_DELEGATION_INFO;
  
 typedef struct _UPN_DNS_INFO {
     USHORT UpnLength;
     USHORT UpnOffset;
     USHORT DnsDomainNameLength;
     USHORT DnsDomainNameOffset;
     ULONG Flags;
 } UPN_DNS_INFO, *PUPN_DNS_INFO;
  
 typedef struct _PAC_CLIENT_CLAIMS_INFO {
     PCLAIMS_SET_METADATA Claims;
 } PAC_CLIENT_CLAIMS_INFO, *PPAC_CLIENT_CLAIMS_INFO;
  
 typedef struct _PAC_DEVICE_INFO {
     ULONG UserId;
     ULONG PrimaryGroupId;
     PISID AccountDomainId;
     ULONG AccountGroupCount;
     [size_is(AccountGroupCount)] PGROUP_MEMBERSHIP AccountGroupIds;
     ULONG SidCount;
     [size_is(SidCount)] PKERB_SID_AND_ATTRIBUTES ExtraSids;
     ULONG DomainGroupCount;
     [size_is(DomainGroupCount)] PDOMAIN_GROUP_MEMBERSHIP DomainGroup;  
 } PAC_DEVICE_INFO, *PPAC_DEVICE_INFO;
  
 typedef struct _PAC_DEVICE_CLAIMS_INFO {
     PCLAIMS_SET_METADATA Claims;
 } PAC_DEVICE_CLAIMS_INFO, *PPAC_DEVICE_CLAIMS_INFO;
  
 typedef struct _PAC_ATTRIBUTES_INFO {
     ULONG FlagsLength;                  // specified in bits
     ULONG Flags[ANYSIZE_ARRAY];
 } PAC_ATTRIBUTES_INFO, *PPAC_ATTRIBUTES_INFO;