| /* cyglsa.h: Header file for Cygwin LSA authentication |
| |
| Written by Corinna Vinschen <corinna@vinschen.de> |
| |
| This file is part of Cygwin. |
| |
| This software is a copyrighted work licensed under the terms of the |
| Cygwin license. Please consult the file "CYGWIN_LICENSE" for details. */ |
| |
| #ifndef _CYGLSA_H |
| #define _CYGLSA_H |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| #define CYG_LSA_PKGNAME "CygwinLsa" |
| |
| #define CYG_LSA_MAGIC_OLD1 0x0379f014LU |
| /* First change to cyglsa_t. |
| - Username and domain are now of type WCHAR instead of char. |
| - domain is MAX_DOMAIN_NAME_LEN instead of INTERNET_MAX_HOST_NAME_LENGTH. */ |
| #define CYG_LSA_MAGIC 0x0379f115LU |
| |
| /* Datastructures not defined in w32api. */ |
| typedef PVOID *PLSA_CLIENT_REQUEST; |
| |
| typedef UNICODE_STRING SECURITY_STRING, *PSECURITY_STRING; |
| |
| typedef struct _SECPKG_CLIENT_INFO |
| { |
| LUID LogonId; |
| ULONG ProcessID; |
| ULONG ThreadID; |
| BOOLEAN HasTcbPrivilege; |
| BOOLEAN Impersonating; |
| BOOLEAN Restricted; |
| } SECPKG_CLIENT_INFO, *PSECPKG_CLIENT_INFO; |
| |
| typedef enum _SECPKG_NAME_TYPE |
| { |
| SecNameSamCompatible, |
| SecNameAlternateId, |
| SecNameFlat, |
| SecNameDN, |
| SecNameSPN |
| } SECPKG_NAME_TYPE, *PSECPKG_NAME_TYPE; |
| |
| typedef struct _SECPKG_CALL_INFO |
| { |
| ULONG ProcessId; |
| ULONG ThreadId; |
| ULONG Attributes; |
| ULONG CallCount; |
| } SECPKG_CALL_INFO, *PSECPKG_CALL_INFO; |
| |
| /* The table returned by LsaApInitializePackage is actually a |
| LSA_SECPKG_FUNCTION_TABLE even though that's not documented. |
| We need only a subset of this table, basically the LSA_DISPATCH_TABLE |
| plus the pointer to the GetClientInfo function. */ |
| typedef struct _LSA_SECPKG_FUNCS |
| { |
| NTSTATUS (NTAPI *CreateLogonSession)(PLUID); |
| NTSTATUS (NTAPI *DeleteLogonSession)(PLUID); |
| NTSTATUS (NTAPI *AddCredentials)(PLUID, ULONG, PLSA_STRING, PLSA_STRING); |
| NTSTATUS (NTAPI *GetCredentials)(PVOID); /* wrong prototype, unused */ |
| NTSTATUS (NTAPI *DeleteCredentials)(PVOID); /* wrong prototype, unused */ |
| PVOID (NTAPI *AllocateLsaHeap)(ULONG); |
| VOID (NTAPI *FreeLsaHeap)(PVOID); |
| NTSTATUS (NTAPI *AllocateClientBuffer)(PLSA_CLIENT_REQUEST, ULONG, PVOID *); |
| NTSTATUS (NTAPI *FreeClientBuffer)(PLSA_CLIENT_REQUEST, PVOID); |
| NTSTATUS (NTAPI *CopyToClientBuffer)(PLSA_CLIENT_REQUEST, ULONG, |
| PVOID, PVOID); |
| NTSTATUS (NTAPI *CopyFromClientBuffer)(PLSA_CLIENT_REQUEST, ULONG, |
| PVOID, PVOID); |
| NTSTATUS (NTAPI *ImpersonateClient)(VOID); |
| NTSTATUS (NTAPI *UnloadPackage)(VOID); |
| NTSTATUS (NTAPI *DuplicateHandle)(HANDLE, PHANDLE); |
| NTSTATUS (NTAPI *SaveSupplementalCredentials)(VOID); |
| NTSTATUS (NTAPI *CreateThread)(PVOID); /* wrong prototype, unused */ |
| NTSTATUS (NTAPI *GetClientInfo)(PSECPKG_CLIENT_INFO); |
| NTSTATUS (NTAPI *RegisterNotification)(PVOID); /* wrong prototype, unused */ |
| NTSTATUS (NTAPI *CancelNotification)(PVOID); /* wrong prototype, unused */ |
| NTSTATUS (NTAPI *MapBuffer)(PVOID); /* wrong prototype, unused */ |
| NTSTATUS (NTAPI *CreateToken)(PVOID); /* wrong prototype, unused */ |
| NTSTATUS (NTAPI *AuditLogon)(PVOID); /* wrong prototype, unused */ |
| NTSTATUS (NTAPI *CallPackage)(PVOID); /* wrong prototype, unused */ |
| NTSTATUS (NTAPI *FreeReturnBuffer)(PVOID); /* wrong prototype, unused */ |
| BOOLEAN (NTAPI *GetCallInfo)(PSECPKG_CALL_INFO); |
| NTSTATUS (NTAPI *CallPackageEx)(PVOID); /* wrong prototype, unused */ |
| NTSTATUS (NTAPI *CreateSharedMemory)(PVOID); /* wrong prototype, unused */ |
| NTSTATUS (NTAPI *AllocateSharedMemory)(PVOID); /* wrong prototype, unused */ |
| NTSTATUS (NTAPI *FreeSharedMemory)(PVOID); /* wrong prototype, unused */ |
| NTSTATUS (NTAPI *DeleteSharedMemory)(PVOID); /* wrong prototype, unused */ |
| NTSTATUS (NTAPI *OpenSamUser)(PSECURITY_STRING, SECPKG_NAME_TYPE, |
| PSECURITY_STRING, BOOLEAN, ULONG, PVOID *); |
| NTSTATUS (NTAPI *GetUserCredentials)(PVOID, PVOID, PULONG, PVOID *, PULONG); |
| NTSTATUS (NTAPI *GetUserAuthData)(PVOID, PUCHAR *, PULONG); |
| NTSTATUS (NTAPI *CloseSamUser)(PVOID); |
| NTSTATUS (NTAPI *ConvertAuthDataToToken)(PVOID, ULONG, |
| SECURITY_IMPERSONATION_LEVEL, |
| PTOKEN_SOURCE, SECURITY_LOGON_TYPE, |
| PUNICODE_STRING, PHANDLE, PLUID, |
| PUNICODE_STRING, PNTSTATUS); |
| NTSTATUS (NTAPI *ClientCallback)(PVOID); /* wrong prototype, unused */ |
| NTSTATUS (NTAPI *UpdateCredentials)(PVOID); /* wrong prototype, unused */ |
| NTSTATUS (NTAPI *GetAuthDataForUser)(PSECURITY_STRING, SECPKG_NAME_TYPE, |
| PSECURITY_STRING, PUCHAR *, PULONG, |
| PUNICODE_STRING); |
| NTSTATUS (NTAPI *CrackSingleName)(PVOID); /* wrong prototype, unused */ |
| NTSTATUS (NTAPI *AuditAccountLogon)(PVOID); /* wrong prototype, unused */ |
| NTSTATUS (NTAPI *CallPackagePassthrough)(PVOID); /* wrong prototype, unused */ |
| } LSA_SECPKG_FUNCS, *PLSA_SECPKG_FUNCS; |
| |
| typedef enum _LSA_TOKEN_INFORMATION_TYPE |
| { |
| LsaTokenInformationNull, |
| LsaTokenInformationV1, |
| LsaTokenInformationV2 |
| } LSA_TOKEN_INFORMATION_TYPE, *PLSA_TOKEN_INFORMATION_TYPE; |
| |
| typedef struct _LSA_TOKEN_INFORMATION_V2 |
| { |
| LARGE_INTEGER ExpirationTime; |
| TOKEN_USER User; |
| PTOKEN_GROUPS Groups; |
| TOKEN_PRIMARY_GROUP PrimaryGroup; |
| PTOKEN_PRIVILEGES Privileges; |
| TOKEN_OWNER Owner; |
| TOKEN_DEFAULT_DACL DefaultDacl; |
| } LSA_TOKEN_INFORMATION_V2, *PLSA_TOKEN_INFORMATION_V2; |
| |
| /* These structures are eqivalent to the appropriate Windows structures, |
| using 32 bit offsets instead of pointers. These datastructures are |
| used to transfer the logon information to the LSA authentication package. |
| We can't use the LSA_TOKEN_INFORMATION_V2 structure directly, because |
| its size differs between 32 bit and 64 bit Windows. */ |
| |
| typedef DWORD OFFSET; |
| |
| typedef struct _CYG_SID_AND_ATTRIBUTES |
| { |
| OFFSET Sid; |
| DWORD Attributes; |
| } CYG_SID_AND_ATTRIBUTES, *PCYG_SID_AND_ATTRIBUTES; |
| |
| typedef struct _CYG_TOKEN_USER |
| { |
| CYG_SID_AND_ATTRIBUTES User; |
| } CYG_TOKEN_USER, *PCYG_TOKEN_USER; |
| |
| typedef struct _CYG_TOKEN_GROUPS |
| { |
| DWORD GroupCount; |
| CYG_SID_AND_ATTRIBUTES Groups[ANYSIZE_ARRAY]; |
| } CYG_TOKEN_GROUPS, *PCYG_TOKEN_GROUPS; |
| |
| typedef struct _CYG_TOKEN_PRIMARY_GROUP |
| { |
| OFFSET PrimaryGroup; |
| } CYG_TOKEN_PRIMARY_GROUP, *PCYG_TOKEN_PRIMARY_GROUP; |
| |
| typedef struct _CYG_TOKEN_OWNER |
| { |
| OFFSET Owner; |
| } CYG_TOKEN_OWNER, *PCYG_TOKEN_OWNER; |
| |
| typedef struct _CYG_TOKEN_DEFAULT_DACL |
| { |
| OFFSET DefaultDacl; |
| } CYG_TOKEN_DEFAULT_DACL, *PCYG_TOKEN_DEFAULT_DACL; |
| |
| typedef struct _CYG_LSA_TOKEN_INFORMATION |
| { |
| LARGE_INTEGER ExpirationTime; |
| CYG_TOKEN_USER User; |
| OFFSET Groups; |
| CYG_TOKEN_PRIMARY_GROUP PrimaryGroup; |
| OFFSET Privileges; |
| CYG_TOKEN_OWNER Owner; |
| CYG_TOKEN_DEFAULT_DACL DefaultDacl; |
| } CYG_LSA_TOKEN_INFORMATION, *PCYG_LSA_TOKEN_INFORMATION; |
| |
| /* This is the structure created by security.cc:lsaauth(), which is given to |
| LsaApLogonUser to create the token information returned to the LSA. */ |
| typedef struct |
| { |
| DWORD magic; |
| DWORD checksum; |
| WCHAR username[UNLEN + 1]; |
| WCHAR domain[MAX_DOMAIN_NAME_LEN + 1]; |
| ULONG inf_size; |
| CYG_LSA_TOKEN_INFORMATION inf; |
| BYTE data[1]; |
| } cyglsa_t; |
| |
| typedef struct |
| { |
| DWORD magic_pre; |
| HANDLE token; |
| DWORD magic_post; |
| } cygprf_t; |
| |
| #define MAGIC_PRE 0x12345678UL |
| #define MAGIC_POST 0x87654321UL |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif /* _CYGLSA_H */ |