#pragma once
#include "kull_m_rpc.h"
#include "../kull_m_samlib.h"

#define PACINFO_TYPE_LOGON_INFO				0x00000001
#define PACINFO_TYPE_CREDENTIALS_INFO		0x00000002
#define PACINFO_TYPE_CHECKSUM_SRV			0x00000006
#define PACINFO_TYPE_CHECKSUM_KDC			0x00000007
#define PACINFO_TYPE_CNAME_TINFO			0x0000000a
#define PACINFO_TYPE_DELEGATION_INFO		0x0000000b
#define PACINFO_TYPE_UPN_DNS				0x0000000c
#define PACINFO_TYPE_CLIENT_CLAIMS			0x0000000d
#define PACINFO_TYPE_DEVICE_INFO			0x0000000e
#define PACINFO_TYPE_DEVICE_CLAIMS			0x0000000f

typedef struct _PAC_INFO_BUFFER {
	ULONG ulType;
	ULONG cbBufferSize;
	ULONG64 Offset;
} PAC_INFO_BUFFER, *PPAC_INFO_BUFFER;

typedef struct _PACTYPE {
	ULONG cBuffers;
	ULONG Version;
	PAC_INFO_BUFFER Buffers[ANYSIZE_ARRAY];
} PACTYPE, *PPACTYPE;

typedef struct _PAC_CLIENT_INFO {
	FILETIME ClientId;
	USHORT NameLength;
	WCHAR Name[ANYSIZE_ARRAY];
} PAC_CLIENT_INFO, *PPAC_CLIENT_INFO;

typedef struct _PAC_CREDENTIAL_INFO {
	ULONG Version;
	ULONG EncryptionType;
	UCHAR SerializedData[ANYSIZE_ARRAY];
} PAC_CREDENTIAL_INFO, *PPAC_CREDENTIAL_INFO;

#ifndef _NTSECPKG_
typedef struct _SECPKG_SUPPLEMENTAL_CRED {
	RPC_UNICODE_STRING PackageName;
	ULONG CredentialSize;
	PUCHAR Credentials;
} SECPKG_SUPPLEMENTAL_CRED, *PSECPKG_SUPPLEMENTAL_CRED;
#endif

typedef struct _PAC_CREDENTIAL_DATA {
	ULONG CredentialCount;
	SECPKG_SUPPLEMENTAL_CRED Credentials[ANYSIZE_ARRAY];
} PAC_CREDENTIAL_DATA, *PPAC_CREDENTIAL_DATA;

typedef struct _NTLM_SUPPLEMENTAL_CREDENTIAL {
	ULONG Version;
	ULONG Flags;
	UCHAR LmPassword[LM_NTLM_HASH_LENGTH];
	UCHAR NtPassword[LM_NTLM_HASH_LENGTH];
} NTLM_SUPPLEMENTAL_CREDENTIAL, *PNTLM_SUPPLEMENTAL_CREDENTIAL;

typedef struct _UPN_DNS_INFO {
	USHORT UpnLength;
	USHORT UpnOffset;
	USHORT DnsDomainNameLength;
	USHORT DnsDomainNameOffset;
	ULONG Flags;
} UPN_DNS_INFO, *PUPN_DNS_INFO;

typedef struct _S4U_DELEGATION_INFO {
	RPC_UNICODE_STRING S4U2proxyTarget;
	ULONG TransitedListSize;
	RPC_UNICODE_STRING S4UTransitedServices[ANYSIZE_ARRAY];
} S4U_DELEGATION_INFO, *PS4U_DELEGATION_INFO;

typedef struct _KERB_SID_AND_ATTRIBUTES {
	PISID Sid;
	ULONG Attributes;
} KERB_SID_AND_ATTRIBUTES, *PKERB_SID_AND_ATTRIBUTES;

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] */ 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 SubAuthStatus;
	FILETIME LastSuccessfulILogon;
	FILETIME LastFailedILogon;
	ULONG FailedILogonCount;
	ULONG Reserved3;
	ULONG SidCount;
	/* [size_is] */ PKERB_SID_AND_ATTRIBUTES ExtraSids;
	PISID ResourceGroupDomainSid;
	ULONG ResourceGroupCount;
	/* [size_is] */ PGROUP_MEMBERSHIP ResourceGroupIds;
} KERB_VALIDATION_INFO, *PKERB_VALIDATION_INFO;

void PPAC_CREDENTIAL_DATA_Decode(handle_t _MidlEsHandle, PPAC_CREDENTIAL_DATA * _pType);
void PPAC_CREDENTIAL_DATA_Free(handle_t _MidlEsHandle, PPAC_CREDENTIAL_DATA * _pType);

size_t PKERB_VALIDATION_INFO_AlignSize(handle_t _MidlEsHandle, PKERB_VALIDATION_INFO * _pType);
void PKERB_VALIDATION_INFO_Encode(handle_t _MidlEsHandle, PKERB_VALIDATION_INFO * _pType);
void PKERB_VALIDATION_INFO_Decode(handle_t _MidlEsHandle, PKERB_VALIDATION_INFO * _pType);
void PKERB_VALIDATION_INFO_Free(handle_t _MidlEsHandle, PKERB_VALIDATION_INFO * _pType);

#define kull_m_pac_DecodeCredential(/*PVOID */data, /*DWORD */size, /*PPAC_CREDENTIAL_DATA **/pObject) kull_m_rpc_Generic_Decode(data, size, pObject, (PGENERIC_RPC_DECODE) PPAC_CREDENTIAL_DATA_Decode)
#define kull_m_pac_FreeCredential(/*PPAC_CREDENTIAL_DATA **/pObject) kull_m_rpc_Generic_Free(pObject, (PGENERIC_RPC_FREE) PPAC_CREDENTIAL_DATA_Free)

#define kull_m_pac_DecodeValidationInformation(/*PVOID */data, /*DWORD */size, /*PKERB_VALIDATION_INFO **/pObject) kull_m_rpc_Generic_Decode(data, size, pObject, (PGENERIC_RPC_DECODE) PKERB_VALIDATION_INFO_Decode)
#define kull_m_pac_FreeValidationInformation(/*PKERB_VALIDATION_INFO **/pObject) kull_m_rpc_Generic_Free(pObject, (PGENERIC_RPC_FREE) PKERB_VALIDATION_INFO_Free)
#define kull_m_pac_EncodeValidationInformation(/*PKERB_VALIDATION_INFO **/pObject, /*PVOID **/data, /*DWORD **/size) kull_m_rpc_Generic_Encode(pObject, data, size, (PGENERIC_RPC_ENCODE) PKERB_VALIDATION_INFO_Encode, (PGENERIC_RPC_ALIGNSIZE) PKERB_VALIDATION_INFO_AlignSize)