// Licensed under the Apache License, Version 2.0 // or the MIT license // , at your option. // All files in the project carrying such notice may not be copied, modified, or distributed // except according to those terms. use shared::basetsd::{SIZE_T, ULONG_PTR}; use shared::guiddef::GUID; use shared::minwindef::{PUCHAR, PULONG, UCHAR, ULONG, USHORT}; use shared::ntdef::{NTSTATUS, PNTSTATUS}; use um::lsalookup::{ LSA_TRUST_INFORMATION, LSA_UNICODE_STRING, PLSA_OBJECT_ATTRIBUTES, PLSA_REFERENCED_DOMAIN_LIST, PLSA_STRING, PLSA_TRANSLATED_NAME, PLSA_TRANSLATED_SID2, PLSA_TRUST_INFORMATION, PLSA_UNICODE_STRING, }; use um::ntsecapi::PLSA_HANDLE; use um::subauth::{PUNICODE_STRING, UNICODE_STRING}; use um::winnt::{ ACCESS_MASK, ANYSIZE_ARRAY, BOOLEAN, HANDLE, LARGE_INTEGER, LONG, LUID, PBOOLEAN, PCLAIMS_BLOB, PHANDLE, PLARGE_INTEGER, PLUID, PPRIVILEGE_SET, PQUOTA_LIMITS, PSECURITY_DESCRIPTOR, PSHORT, PSID, PTOKEN_GROUPS, PTOKEN_PRIVILEGES, PTOKEN_SOURCE, PVOID, PWSTR, QUOTA_LIMITS, SECURITY_INFORMATION, SID_NAME_USE, STANDARD_RIGHTS_EXECUTE, STANDARD_RIGHTS_READ, STANDARD_RIGHTS_REQUIRED, STANDARD_RIGHTS_WRITE, TOKEN_DEFAULT_DACL, TOKEN_DEVICE_CLAIMS, TOKEN_OWNER, TOKEN_PRIMARY_GROUP, TOKEN_USER, TOKEN_USER_CLAIMS, }; pub type LSA_OPERATIONAL_MODE = ULONG; pub type PLSA_OPERATIONAL_MODE = *mut LSA_OPERATIONAL_MODE; pub const LSA_MODE_PASSWORD_PROTECTED: ULONG = 0x00000001; pub const LSA_MODE_INDIVIDUAL_ACCOUNTS: ULONG = 0x00000002; pub const LSA_MODE_MANDATORY_ACCESS: ULONG = 0x00000004; pub const LSA_MODE_LOG_FULL: ULONG = 0x00000008; pub const LSA_MAXIMUM_SID_COUNT: SIZE_T = 0x00000100; pub const LSA_MAXIMUM_ENUMERATION_LENGTH: SIZE_T = 32000; pub const LSA_CALL_LICENSE_SERVER: ULONG = 0x80000000; ENUM!{enum SECURITY_LOGON_TYPE { UndefinedLogonType = 0, Interactive = 2, Network, Batch, Service, Proxy, Unlock, NetworkCleartext, NewCredentials, RemoteInteractive, CachedInteractive, CachedRemoteInteractive, CachedUnlock, }} pub type PSECURITY_LOGON_TYPE = *mut SECURITY_LOGON_TYPE; pub const SECURITY_ACCESS_INTERACTIVE_LOGON: ULONG = 0x00000001; pub const SECURITY_ACCESS_NETWORK_LOGON: ULONG = 0x00000002; pub const SECURITY_ACCESS_BATCH_LOGON: ULONG = 0x00000004; pub const SECURITY_ACCESS_SERVICE_LOGON: ULONG = 0x00000010; pub const SECURITY_ACCESS_PROXY_LOGON: ULONG = 0x00000020; pub const SECURITY_ACCESS_DENY_INTERACTIVE_LOGON: ULONG = 0x00000040; pub const SECURITY_ACCESS_DENY_NETWORK_LOGON: ULONG = 0x00000080; pub const SECURITY_ACCESS_DENY_BATCH_LOGON: ULONG = 0x00000100; pub const SECURITY_ACCESS_DENY_SERVICE_LOGON: ULONG = 0x00000200; pub const SECURITY_ACCESS_REMOTE_INTERACTIVE_LOGON: ULONG = 0x00000400; pub const SECURITY_ACCESS_DENY_REMOTE_INTERACTIVE_LOGON: ULONG = 0x00000800; ENUM!{enum SE_ADT_PARAMETER_TYPE { SeAdtParmTypeNone = 0, SeAdtParmTypeString, SeAdtParmTypeFileSpec, SeAdtParmTypeUlong, SeAdtParmTypeSid, SeAdtParmTypeLogonId, SeAdtParmTypeNoLogonId, SeAdtParmTypeAccessMask, SeAdtParmTypePrivs, SeAdtParmTypeObjectTypes, SeAdtParmTypeHexUlong, SeAdtParmTypePtr, SeAdtParmTypeTime, SeAdtParmTypeGuid, SeAdtParmTypeLuid, SeAdtParmTypeHexInt64, SeAdtParmTypeStringList, SeAdtParmTypeSidList, SeAdtParmTypeDuration, SeAdtParmTypeUserAccountControl, SeAdtParmTypeNoUac, SeAdtParmTypeMessage, SeAdtParmTypeDateTime, SeAdtParmTypeSockAddr, SeAdtParmTypeSD, SeAdtParmTypeLogonHours, SeAdtParmTypeLogonIdNoSid, SeAdtParmTypeUlongNoConv, SeAdtParmTypeSockAddrNoPort, SeAdtParmTypeAccessReason, SeAdtParmTypeStagingReason, SeAdtParmTypeResourceAttribute, SeAdtParmTypeClaims, SeAdtParmTypeLogonIdAsSid, SeAdtParmTypeMultiSzString, SeAdtParmTypeLogonIdEx, }} pub type PSE_ADT_PARAMETER_TYPE = *mut SE_ADT_PARAMETER_TYPE; pub const SE_ADT_OBJECT_ONLY: USHORT = 0x1; STRUCT!{struct SE_ADT_OBJECT_TYPE { ObjectType: GUID, Flags: USHORT, Level: USHORT, AccessMask: ACCESS_MASK, }} pub type PSE_ADT_OBJECT_TYPE = *mut SE_ADT_OBJECT_TYPE; STRUCT!{struct SE_ADT_PARAMETER_ARRAY_ENTRY { Type: SE_ADT_PARAMETER_TYPE, Length: ULONG, Data: [ULONG_PTR; 2], Address: PVOID, }} pub type PSE_ADT_PARAMETER_ARRAY_ENTRY = *mut SE_ADT_PARAMETER_ARRAY_ENTRY; STRUCT!{struct SE_ADT_ACCESS_REASON { AccessMask: ACCESS_MASK, AccessReasons: [ULONG; 32], ObjectTypeIndex: ULONG, AccessGranted: ULONG, SecurityDescriptor: PSECURITY_DESCRIPTOR, }} pub type PSE_ADT_ACCESS_REASON = *mut SE_ADT_ACCESS_REASON; STRUCT!{struct SE_ADT_CLAIMS { Length: ULONG, Claims: PCLAIMS_BLOB, }} pub type PSE_ADT_CLAIMS = *mut SE_ADT_CLAIMS; pub const SE_MAX_AUDIT_PARAMETERS: SIZE_T = 32; pub const SE_MAX_GENERIC_AUDIT_PARAMETERS: SIZE_T = 28; STRUCT!{struct SE_ADT_PARAMETER_ARRAY { CategoryId: ULONG, AuditId: ULONG, ParameterCount: ULONG, Length: ULONG, FlatSubCategoryId: USHORT, Type: USHORT, Flags: ULONG, Parameters: [SE_ADT_PARAMETER_ARRAY_ENTRY; SE_MAX_AUDIT_PARAMETERS], }} pub type PSE_ADT_PARAMETER_ARRAY = *mut SE_ADT_PARAMETER_ARRAY; STRUCT!{struct SE_ADT_PARAMETER_ARRAY_EX { CategoryId: ULONG, AuditId: ULONG, Version: ULONG, ParameterCount: ULONG, Length: ULONG, FlatSubCategoryId: USHORT, Type: USHORT, Flags: ULONG, Parameters: [SE_ADT_PARAMETER_ARRAY_ENTRY; SE_MAX_AUDIT_PARAMETERS], }} pub type PSE_ADT_PARAMETER_ARRAY_EX = *mut SE_ADT_PARAMETER_ARRAY_EX; pub const SE_ADT_PARAMETERS_SELF_RELATIVE: ULONG = 0x00000001; pub const SE_ADT_PARAMETERS_SEND_TO_LSA: ULONG = 0x00000002; pub const SE_ADT_PARAMETER_EXTENSIBLE_AUDIT: ULONG = 0x00000004; pub const SE_ADT_PARAMETER_GENERIC_AUDIT: ULONG = 0x00000008; pub const SE_ADT_PARAMETER_WRITE_SYNCHRONOUS: ULONG = 0x00000010; #[cfg(target_pointer_width = "32")] #[inline] pub fn LSAP_SE_ADT_PARAMETER_ARRAY_TRUE_SIZE( AuditParameters: SE_ADT_PARAMETER_ARRAY, ) -> SIZE_T { 664 // FIXME: sizeof::() - (20 // FIXME: sizeof::() * (SE_MAX_AUDIT_PARAMETERS - AuditParameters.ParameterCount as SIZE_T)) } #[cfg(target_pointer_width = "64")] #[inline] pub fn LSAP_SE_ADT_PARAMETER_ARRAY_TRUE_SIZE( AuditParameters: SE_ADT_PARAMETER_ARRAY, ) -> SIZE_T { 1048 // FIXME: sizeof::() - (32 // FIXME: sizeof::() * (SE_MAX_AUDIT_PARAMETERS - AuditParameters.ParameterCount as SIZE_T)) } STRUCT!{struct LSA_ADT_STRING_LIST_ENTRY { Flags: ULONG, String: UNICODE_STRING, }} pub type PLSA_ADT_STRING_LIST_ENTRY = *mut LSA_ADT_STRING_LIST_ENTRY; STRUCT!{struct LSA_ADT_STRING_LIST { cStrings: ULONG, String: PLSA_ADT_STRING_LIST_ENTRY, }} pub type PLSA_ADT_STRING_LIST = *mut LSA_ADT_STRING_LIST; STRUCT!{struct LSA_ADT_SID_LIST_ENTRY { Flags: ULONG, Sid: PSID, }} pub type PLSA_ADT_SID_LIST_ENTRY = *mut LSA_ADT_SID_LIST_ENTRY; STRUCT!{struct LSA_ADT_SID_LIST { cSids: ULONG, Sid: PLSA_ADT_SID_LIST_ENTRY, }} pub type PLSA_ADT_SID_LIST = *mut LSA_ADT_SID_LIST; pub const LSA_ADT_SECURITY_SOURCE_NAME: &'static str = "Microsoft-Windows-Security-Auditing"; pub const LSA_ADT_LEGACY_SECURITY_SOURCE_NAME: &'static str = "Security"; pub const SE_ADT_POLICY_AUDIT_EVENT_TYPE_EX_BEGIN: ULONG = 100; ENUM!{enum POLICY_AUDIT_EVENT_TYPE_EX { iSystem_SecurityStateChange = SE_ADT_POLICY_AUDIT_EVENT_TYPE_EX_BEGIN, iSystem_SecuritySubsystemExtension, iSystem_Integrity, iSystem_IPSecDriverEvents, iSystem_Others, iLogon_Logon, iLogon_Logoff, iLogon_AccountLockout, iLogon_IPSecMainMode, iLogon_SpecialLogon, iLogon_IPSecQuickMode, iLogon_IPSecUsermode, iLogon_Others, iLogon_NPS, iLogon_Claims, iLogon_Groups, iObjectAccess_FileSystem, iObjectAccess_Registry, iObjectAccess_Kernel, iObjectAccess_Sam, iObjectAccess_Other, iObjectAccess_CertificationAuthority, iObjectAccess_ApplicationGenerated, iObjectAccess_HandleBasedAudits, iObjectAccess_Share, iObjectAccess_FirewallPacketDrops, iObjectAccess_FirewallConnection, iObjectAccess_DetailedFileShare, iObjectAccess_RemovableStorage, iObjectAccess_CbacStaging, iPrivilegeUse_Sensitive, iPrivilegeUse_NonSensitive, iPrivilegeUse_Others, iDetailedTracking_ProcessCreation, iDetailedTracking_ProcessTermination, iDetailedTracking_DpapiActivity, iDetailedTracking_RpcCall, iDetailedTracking_PnpActivity, iDetailedTracking_TokenRightAdjusted, iPolicyChange_AuditPolicy, iPolicyChange_AuthenticationPolicy, iPolicyChange_AuthorizationPolicy, iPolicyChange_MpsscvRulePolicy, iPolicyChange_WfpIPSecPolicy, iPolicyChange_Others, iAccountManagement_UserAccount, iAccountManagement_ComputerAccount, iAccountManagement_SecurityGroup, iAccountManagement_DistributionGroup, iAccountManagement_ApplicationGroup, iAccountManagement_Others, iDSAccess_DSAccess, iDSAccess_AdAuditChanges, iDS_Replication, iDS_DetailedReplication, iAccountLogon_CredentialValidation, iAccountLogon_Kerberos, iAccountLogon_Others, iAccountLogon_KerbCredentialValidation, iUnknownSubCategory = 999, }} pub type PPOLICY_AUDIT_EVENT_TYPE_EX = *mut POLICY_AUDIT_EVENT_TYPE_EX; ENUM!{enum POLICY_AUDIT_EVENT_TYPE { AuditCategorySystem = 0, AuditCategoryLogon, AuditCategoryObjectAccess, AuditCategoryPrivilegeUse, AuditCategoryDetailedTracking, AuditCategoryPolicyChange, AuditCategoryAccountManagement, AuditCategoryDirectoryServiceAccess, AuditCategoryAccountLogon, }} pub type PPOLICY_AUDIT_EVENT_TYPE = *mut POLICY_AUDIT_EVENT_TYPE; pub const POLICY_AUDIT_EVENT_UNCHANGED: ULONG = 0x00000000; pub const POLICY_AUDIT_EVENT_SUCCESS: ULONG = 0x00000001; pub const POLICY_AUDIT_EVENT_FAILURE: ULONG = 0x00000002; pub const POLICY_AUDIT_EVENT_NONE: ULONG = 0x00000004; pub const POLICY_AUDIT_EVENT_MASK: ULONG = POLICY_AUDIT_EVENT_SUCCESS | POLICY_AUDIT_EVENT_FAILURE | POLICY_AUDIT_EVENT_UNCHANGED | POLICY_AUDIT_EVENT_NONE; #[inline] pub fn LSA_SUCCESS(Error: NTSTATUS) -> bool { (Error as LONG) >= 0 } extern "system" { pub fn LsaRegisterLogonProcess( LogonProcessName: PLSA_STRING, LsaHandle: PHANDLE, SecurityMode: PLSA_OPERATIONAL_MODE, ) -> NTSTATUS; pub fn LsaLogonUser( LsaHandle: HANDLE, OriginName: PLSA_STRING, LogonType: SECURITY_LOGON_TYPE, AuthenticationPackage: ULONG, AuthenticationInformation: PVOID, AuthenticationInformationLength: ULONG, LocalGroups: PTOKEN_GROUPS, SourceContext: PTOKEN_SOURCE, ProfileBuffer: *mut PVOID, ProfileBufferLength: PULONG, LogonId: PLUID, Token: PHANDLE, Quotas: PQUOTA_LIMITS, SubStatus: PNTSTATUS, ) -> NTSTATUS; pub fn LsaLookupAuthenticationPackage( LsaHandle: HANDLE, PackageName: PLSA_STRING, AuthenticationPackage: PULONG, ) -> NTSTATUS; pub fn LsaFreeReturnBuffer( Buffer: PVOID, ) -> NTSTATUS; pub fn LsaCallAuthenticationPackage( LsaHandle: HANDLE, AuthenticationPackage: ULONG, ProtocolSubmitBuffer: PVOID, SubmitBufferLength: ULONG, ProtocolReturnBuffer: *mut PVOID, ReturnBufferLength: PULONG, ProtocolStatus: PNTSTATUS, ) -> NTSTATUS; pub fn LsaDeregisterLogonProcess( LsaHandle: HANDLE, ) -> NTSTATUS; pub fn LsaConnectUntrusted( LsaHandle: PHANDLE, ) -> NTSTATUS; } extern "C" { pub fn LsaInsertProtectedProcessAddress( BufferAddress: PVOID, BufferSize: ULONG, ) -> NTSTATUS; pub fn LsaRemoveProtectedProcessAddress( BufferAddress: PVOID, BufferSize: ULONG, ) -> NTSTATUS; } FN!{stdcall PFN_LSA_CALL_AUTH_PKG( LsaHandle: HANDLE, AuthenticationPackage: ULONG, ProtocolSubmitBuffer: PVOID, SubmitBufferLength: ULONG, ProtocolReturnBuffer: *mut PVOID, ReturnBufferLength: PULONG, ProtocolStatus: PNTSTATUS, ) -> NTSTATUS} FN!{stdcall PFN_LSA_DEREGISTER_PROC( LsaHandle: HANDLE, ) -> NTSTATUS} FN!{stdcall PFN_LSA_FREE_BUFFER( Buffer: PVOID, ) -> NTSTATUS} FN!{stdcall PFN_LSA_LOGON_USER( LsaHandle: HANDLE, OriginName: PLSA_STRING, LogonType: SECURITY_LOGON_TYPE, AuthenticationPackage: ULONG, AuthenticationInformation: PVOID, AuthenticationInformationLength: ULONG, LocalGroups: PTOKEN_GROUPS, SourceContext: PTOKEN_SOURCE, ProfileBuffer: *mut PVOID, ProfileBufferLength: PULONG, LogonId: PLUID, Token: PHANDLE, Quotas: PQUOTA_LIMITS, SubStatus: PNTSTATUS, ) -> NTSTATUS} FN!{stdcall PFN_LOOKUP_AUTH_PKG( LsaHandle: HANDLE, PackageName: PLSA_STRING, AuthenticationPackage: PULONG, ) -> NTSTATUS} FN!{stdcall PFN_LSA_REGISTER_PROC( LogonProcessName: PLSA_STRING, LsaHandle: PHANDLE, SecurityMode: PLSA_OPERATIONAL_MODE, ) -> NTSTATUS} STRUCT!{struct LSA_AUTH_CALLBACKS { LsaCallAuthPkgFn: PFN_LSA_CALL_AUTH_PKG, LsaDeregisterProcFn: PFN_LSA_DEREGISTER_PROC, LsaFreeReturnBufferFn: PFN_LSA_FREE_BUFFER, LsaLogonUserFn: PFN_LSA_LOGON_USER, LsaLookupAuthPkgFn: PFN_LOOKUP_AUTH_PKG, LsaRegisterProcFn: PFN_LSA_REGISTER_PROC, }} pub type PLSA_AUTH_CALLBACKS = *mut LSA_AUTH_CALLBACKS; pub type PCLSA_AUTH_CALLBACKS = *const LSA_AUTH_CALLBACKS; pub type PLSA_CLIENT_REQUEST = *mut PVOID; ENUM!{enum LSA_TOKEN_INFORMATION_TYPE { LsaTokenInformationNull, LsaTokenInformationV1, LsaTokenInformationV2, LsaTokenInformationV3, }} pub type PLSA_TOKEN_INFORMATION_TYPE = *mut LSA_TOKEN_INFORMATION_TYPE; STRUCT!{struct LSA_TOKEN_INFORMATION_NULL { ExpirationTime: LARGE_INTEGER, Groups: PTOKEN_GROUPS, }} pub type PLSA_TOKEN_INFORMATION_NULL = *mut LSA_TOKEN_INFORMATION_NULL; STRUCT!{struct LSA_TOKEN_INFORMATION_V1 { ExpirationTime: LARGE_INTEGER, User: TOKEN_USER, Groups: PTOKEN_GROUPS, PrimaryGroup: TOKEN_PRIMARY_GROUP, Privileges: PTOKEN_PRIVILEGES, Owner: TOKEN_OWNER, DefaultDacl: TOKEN_DEFAULT_DACL, }} pub type PLSA_TOKEN_INFORMATION_V1 = *mut LSA_TOKEN_INFORMATION_V1; pub type LSA_TOKEN_INFORMATION_V2 = LSA_TOKEN_INFORMATION_V1; pub type PLSA_TOKEN_INFORMATION_V2 = *mut LSA_TOKEN_INFORMATION_V2; STRUCT!{struct LSA_TOKEN_INFORMATION_V3 { ExpirationTime: LARGE_INTEGER, User: TOKEN_USER, Groups: PTOKEN_GROUPS, PrimaryGroup: TOKEN_PRIMARY_GROUP, Privileges: PTOKEN_PRIVILEGES, Owner: TOKEN_OWNER, DefaultDacl: TOKEN_DEFAULT_DACL, UserClaims: TOKEN_USER_CLAIMS, DeviceClaims: TOKEN_DEVICE_CLAIMS, DeviceGroups: PTOKEN_GROUPS, }} pub type PLSA_TOKEN_INFORMATION_V3 = *mut LSA_TOKEN_INFORMATION_V3; FN!{stdcall PLSA_CREATE_LOGON_SESSION( LogonId: PLUID, ) -> NTSTATUS} FN!{stdcall PLSA_DELETE_LOGON_SESSION( LogonId: PLUID, ) -> NTSTATUS} FN!{stdcall PLSA_ADD_CREDENTIAL( LogonId: PLUID, AuthenticationPackage: ULONG, PrimaryKeyValue: PLSA_STRING, Credentials: PLSA_STRING, ) -> NTSTATUS} FN!{stdcall PLSA_GET_CREDENTIALS( LogonId: PLUID, AuthenticationPackage: ULONG, QueryContext: PULONG, RetrieveAllCredentials: BOOLEAN, PrimaryKeyValue: PLSA_STRING, PrimaryKeyLength: PULONG, Credentials: PLSA_STRING, ) -> NTSTATUS} FN!{stdcall PLSA_DELETE_CREDENTIAL( LogonId: PLUID, AuthenticationPackage: ULONG, PrimaryKeyValue: PLSA_STRING, ) -> NTSTATUS} FN!{stdcall PLSA_ALLOCATE_LSA_HEAP( Length: ULONG, ) -> PVOID} FN!{stdcall PLSA_FREE_LSA_HEAP( Base: PVOID, ) -> ()} FN!{stdcall PLSA_ALLOCATE_PRIVATE_HEAP( Length: SIZE_T, ) -> PVOID} FN!{stdcall PLSA_FREE_PRIVATE_HEAP( Base: PVOID, ) -> ()} FN!{stdcall PLSA_ALLOCATE_CLIENT_BUFFER( ClientRequest: PLSA_CLIENT_REQUEST, LengthRequired: ULONG, ClientBaseAddress: *mut PVOID, ) -> NTSTATUS} FN!{stdcall PLSA_FREE_CLIENT_BUFFER( ClientRequest: PLSA_CLIENT_REQUEST, ClientBaseAddress: PVOID, ) -> NTSTATUS} FN!{stdcall PLSA_COPY_TO_CLIENT_BUFFER( ClientRequest: PLSA_CLIENT_REQUEST, Length: ULONG, ClientBaseAddress: PVOID, BufferToCopy: PVOID, ) -> NTSTATUS} FN!{stdcall PLSA_COPY_FROM_CLIENT_BUFFER( ClientRequest: PLSA_CLIENT_REQUEST, Length: ULONG, BufferToCopy: PVOID, ClientBaseAddress: PVOID, ) -> NTSTATUS} STRUCT!{struct LSA_DISPATCH_TABLE { CreateLogonSession: PLSA_CREATE_LOGON_SESSION, DeleteLogonSession: PLSA_DELETE_LOGON_SESSION, AddCredential: PLSA_ADD_CREDENTIAL, GetCredentials: PLSA_GET_CREDENTIALS, DeleteCredential: PLSA_DELETE_CREDENTIAL, AllocateLsaHeap: PLSA_ALLOCATE_LSA_HEAP, FreeLsaHeap: PLSA_FREE_LSA_HEAP, AllocateClientBuffer: PLSA_ALLOCATE_CLIENT_BUFFER, FreeClientBuffer: PLSA_FREE_CLIENT_BUFFER, CopyToClientBuffer: PLSA_COPY_TO_CLIENT_BUFFER, CopyFromClientBuffer: PLSA_COPY_FROM_CLIENT_BUFFER, }} pub type PLSA_DISPATCH_TABLE = *mut LSA_DISPATCH_TABLE; pub const LSA_AP_NAME_INITIALIZE_PACKAGE: &'static str = "LsaApInitializePackage"; pub const LSA_AP_NAME_LOGON_USER: &'static str = "LsaApLogonUser"; pub const LSA_AP_NAME_LOGON_USER_EX: &'static str = "LsaApLogonUserEx"; pub const LSA_AP_NAME_CALL_PACKAGE: &'static str = "LsaApCallPackage"; pub const LSA_AP_NAME_LOGON_TERMINATED: &'static str = "LsaApLogonTerminated"; pub const LSA_AP_NAME_CALL_PACKAGE_UNTRUSTED: &'static str = "LsaApCallPackageUntrusted"; pub const LSA_AP_NAME_CALL_PACKAGE_PASSTHROUGH: &'static str = "LsaApCallPackagePassthrough"; FN!{stdcall PLSA_AP_INITIALIZE_PACKAGE( AuthenticationPackageId: ULONG, LsaDispatchTable: PLSA_DISPATCH_TABLE, Database: PLSA_STRING, Confidentiality: PLSA_STRING, AuthenticationPackageName: *mut PLSA_STRING, ) -> NTSTATUS} FN!{stdcall PLSA_AP_LOGON_USER( ClientRequest: PLSA_CLIENT_REQUEST, LogonType: SECURITY_LOGON_TYPE, AuthenticationInformation: PVOID, ClientAuthentication: PVOID, AuthenticationInformationLength: ULONG, ProfileBuffer: *mut PVOID, ProfileBufferLength: PULONG, LogonId: PLUID, SubStatus: PNTSTATUS, TokenInformationType: PLSA_TOKEN_INFORMATION_TYPE, TokenInformation: *mut PVOID, AccountName: *mut PLSA_UNICODE_STRING, AuthenticatingAutority: *mut PLSA_UNICODE_STRING, ) -> NTSTATUS} FN!{stdcall PLSA_AP_LOGON_USER_EX( ClientRequest: PLSA_CLIENT_REQUEST, LogonType: SECURITY_LOGON_TYPE, AuthenticationInformation: PVOID, ClientAuthentication: PVOID, AuthenticationInformationLength: ULONG, ProfileBuffer: *mut PVOID, ProfileBufferLength: PULONG, LogonId: PLUID, SubStatus: PNTSTATUS, TokenInformationType: PLSA_TOKEN_INFORMATION_TYPE, TokenInformation: *mut PVOID, AccountName: *mut PLSA_UNICODE_STRING, AuthenticatingAutority: *mut PLSA_UNICODE_STRING, MachineName: *mut PUNICODE_STRING, ) -> NTSTATUS} FN!{stdcall PLSA_AP_CALL_PACKAGE( ClientRequest: PLSA_CLIENT_REQUEST, ProtocolSubmitBuffer: PVOID, ClientBufferBase: PVOID, SubmitBufferLength: ULONG, ProtocolReturnBuffer: *mut PVOID, ReturnBufferLength: PULONG, ProtocolStatus: PNTSTATUS, ) -> NTSTATUS} FN!{stdcall PLSA_AP_CALL_PACKAGE_PASSTHROUGH( ClientRequest: PLSA_CLIENT_REQUEST, ProtocolSubmitBuffer: PVOID, ClientBufferBase: PVOID, SubmitBufferLength: ULONG, ProtocolReturnBuffer: *mut PVOID, ReturnBufferLength: PULONG, ProtocolStatus: PNTSTATUS, ) -> NTSTATUS} FN!{stdcall PLSA_AP_LOGON_TERMINATED( LogonId: PLUID, ) -> ()} pub const POLICY_VIEW_LOCAL_INFORMATION: ULONG = 0x00000001; pub const POLICY_VIEW_AUDIT_INFORMATION: ULONG = 0x00000002; pub const POLICY_GET_PRIVATE_INFORMATION: ULONG = 0x00000004; pub const POLICY_TRUST_ADMIN: ULONG = 0x00000008; pub const POLICY_CREATE_ACCOUNT: ULONG = 0x00000010; pub const POLICY_CREATE_SECRET: ULONG = 0x00000020; pub const POLICY_CREATE_PRIVILEGE: ULONG = 0x00000040; pub const POLICY_SET_DEFAULT_QUOTA_LIMITS: ULONG = 0x00000080; pub const POLICY_SET_AUDIT_REQUIREMENTS: ULONG = 0x00000100; pub const POLICY_AUDIT_LOG_ADMIN: ULONG = 0x00000200; pub const POLICY_SERVER_ADMIN: ULONG = 0x00000400; pub const POLICY_LOOKUP_NAMES: ULONG = 0x00000800; pub const POLICY_NOTIFICATION: ULONG = 0x00001000; pub const POLICY_ALL_ACCESS: ULONG = STANDARD_RIGHTS_REQUIRED | POLICY_VIEW_LOCAL_INFORMATION | POLICY_VIEW_AUDIT_INFORMATION | POLICY_GET_PRIVATE_INFORMATION | POLICY_TRUST_ADMIN | POLICY_CREATE_ACCOUNT | POLICY_CREATE_SECRET | POLICY_CREATE_PRIVILEGE | POLICY_SET_DEFAULT_QUOTA_LIMITS | POLICY_SET_AUDIT_REQUIREMENTS | POLICY_AUDIT_LOG_ADMIN | POLICY_SERVER_ADMIN | POLICY_LOOKUP_NAMES; pub const POLICY_READ: ULONG = STANDARD_RIGHTS_READ | POLICY_VIEW_AUDIT_INFORMATION | POLICY_GET_PRIVATE_INFORMATION; pub const POLICY_WRITE: ULONG = STANDARD_RIGHTS_WRITE | POLICY_TRUST_ADMIN | POLICY_CREATE_ACCOUNT | POLICY_CREATE_SECRET | POLICY_CREATE_PRIVILEGE | POLICY_SET_DEFAULT_QUOTA_LIMITS | POLICY_SET_AUDIT_REQUIREMENTS | POLICY_AUDIT_LOG_ADMIN | POLICY_SERVER_ADMIN; pub const POLICY_EXECUTE: ULONG = STANDARD_RIGHTS_EXECUTE | POLICY_VIEW_LOCAL_INFORMATION | POLICY_LOOKUP_NAMES; STRUCT!{struct LSA_TRANSLATED_SID { Use: SID_NAME_USE, RelativeId: ULONG, DomainIndex: LONG, }} pub type PLSA_TRANSLATED_SID = *mut LSA_TRANSLATED_SID; pub type POLICY_SYSTEM_ACCESS_MODE = ULONG; pub type PPOLICY_SYSTEM_ACCESS_MODE = *mut POLICY_SYSTEM_ACCESS_MODE; pub const POLICY_MODE_INTERACTIVE: ULONG = SECURITY_ACCESS_INTERACTIVE_LOGON; pub const POLICY_MODE_NETWORK: ULONG = SECURITY_ACCESS_NETWORK_LOGON; pub const POLICY_MODE_BATCH: ULONG = SECURITY_ACCESS_BATCH_LOGON; pub const POLICY_MODE_SERVICE: ULONG = SECURITY_ACCESS_SERVICE_LOGON; pub const POLICY_MODE_PROXY: ULONG = SECURITY_ACCESS_PROXY_LOGON; pub const POLICY_MODE_DENY_INTERACTIVE: ULONG = SECURITY_ACCESS_DENY_INTERACTIVE_LOGON; pub const POLICY_MODE_DENY_NETWORK: ULONG = SECURITY_ACCESS_DENY_NETWORK_LOGON; pub const POLICY_MODE_DENY_BATCH: ULONG = SECURITY_ACCESS_DENY_BATCH_LOGON; pub const POLICY_MODE_DENY_SERVICE: ULONG = SECURITY_ACCESS_DENY_SERVICE_LOGON; pub const POLICY_MODE_REMOTE_INTERACTIVE: ULONG = SECURITY_ACCESS_REMOTE_INTERACTIVE_LOGON; pub const POLICY_MODE_DENY_REMOTE_INTERACTIVE: ULONG = SECURITY_ACCESS_DENY_REMOTE_INTERACTIVE_LOGON; pub const POLICY_MODE_ALL: ULONG = POLICY_MODE_INTERACTIVE | POLICY_MODE_NETWORK | POLICY_MODE_BATCH | POLICY_MODE_SERVICE | POLICY_MODE_PROXY | POLICY_MODE_DENY_INTERACTIVE | POLICY_MODE_DENY_NETWORK | SECURITY_ACCESS_DENY_BATCH_LOGON | SECURITY_ACCESS_DENY_SERVICE_LOGON | POLICY_MODE_REMOTE_INTERACTIVE | POLICY_MODE_DENY_REMOTE_INTERACTIVE ; pub const POLICY_MODE_ALL_NT4: ULONG = POLICY_MODE_INTERACTIVE | POLICY_MODE_NETWORK | POLICY_MODE_BATCH | POLICY_MODE_SERVICE; ENUM!{enum POLICY_LSA_SERVER_ROLE { PolicyServerRoleBackup = 2, PolicyServerRolePrimary, }} pub type PPOLICY_LSA_SERVER_ROLE = *mut POLICY_LSA_SERVER_ROLE; ENUM!{enum POLICY_SERVER_ENABLE_STATE { PolicyServerEnabled = 2, PolicyServerDisabled, }} pub type PPOLICY_SERVER_ENABLE_STATE = *mut POLICY_SERVER_ENABLE_STATE; pub type POLICY_AUDIT_EVENT_OPTIONS = ULONG; pub type PPOLICY_AUDIT_EVENT_OPTIONS = *mut POLICY_AUDIT_EVENT_OPTIONS; STRUCT!{struct POLICY_PRIVILEGE_DEFINITION { Name: LSA_UNICODE_STRING, LocalValue: LUID, }} pub type PPOLICY_PRIVILEGE_DEFINITION = *mut POLICY_PRIVILEGE_DEFINITION; pub const LSA_LOOKUP_ISOLATED_AS_LOCAL: ULONG = 0x80000000; pub const LSA_LOOKUP_DISALLOW_CONNECTED_ACCOUNT_INTERNET_SID: ULONG = 0x80000000; pub const LSA_LOOKUP_PREFER_INTERNET_NAMES: ULONG = 0x40000000; ENUM!{enum POLICY_INFORMATION_CLASS { PolicyAuditLogInformation = 1, PolicyAuditEventsInformation, PolicyPrimaryDomainInformation, PolicyPdAccountInformation, PolicyAccountDomainInformation, PolicyLsaServerRoleInformation, PolicyReplicaSourceInformation, PolicyDefaultQuotaInformation, PolicyModificationInformation, PolicyAuditFullSetInformation, PolicyAuditFullQueryInformation, PolicyDnsDomainInformation, PolicyDnsDomainInformationInt, PolicyLocalAccountDomainInformation, PolicyLastEntry, }} pub type PPOLICY_INFORMATION_CLASS = *mut POLICY_INFORMATION_CLASS; STRUCT!{struct POLICY_AUDIT_LOG_INFO { AuditLogPercentFull: ULONG, MaximumLogSize: ULONG, AuditRetentionPeriod: LARGE_INTEGER, AuditLogFullShutdownInProgress: BOOLEAN, TimeToShutdown: LARGE_INTEGER, NextAuditRecordId: ULONG, }} pub type PPOLICY_AUDIT_LOG_INFO = *mut POLICY_AUDIT_LOG_INFO; STRUCT!{struct POLICY_AUDIT_EVENTS_INFO { AuditingMode: BOOLEAN, EventAuditingOptions: PPOLICY_AUDIT_EVENT_OPTIONS, MaximumAuditEventCount: ULONG, }} pub type PPOLICY_AUDIT_EVENTS_INFO = *mut POLICY_AUDIT_EVENTS_INFO; STRUCT!{struct POLICY_AUDIT_SUBCATEGORIES_INFO { MaximumSubCategoryCount: ULONG, EventAuditingOptions: PPOLICY_AUDIT_EVENT_OPTIONS, }} pub type PPOLICY_AUDIT_SUBCATEGORIES_INFO = *mut POLICY_AUDIT_SUBCATEGORIES_INFO; STRUCT!{struct POLICY_AUDIT_CATEGORIES_INFO { MaximumCategoryCount: ULONG, SubCategoriesInfo: PPOLICY_AUDIT_SUBCATEGORIES_INFO, }} pub type PPOLICY_AUDIT_CATEGORIES_INFO = *mut POLICY_AUDIT_CATEGORIES_INFO; pub const PER_USER_POLICY_UNCHANGED: UCHAR = 0x00; pub const PER_USER_AUDIT_SUCCESS_INCLUDE: UCHAR = 0x01; pub const PER_USER_AUDIT_SUCCESS_EXCLUDE: UCHAR = 0x02; pub const PER_USER_AUDIT_FAILURE_INCLUDE: UCHAR = 0x04; pub const PER_USER_AUDIT_FAILURE_EXCLUDE: UCHAR = 0x08; pub const PER_USER_AUDIT_NONE: UCHAR = 0x10; pub const VALID_PER_USER_AUDIT_POLICY_FLAG: UCHAR = PER_USER_AUDIT_SUCCESS_INCLUDE | PER_USER_AUDIT_SUCCESS_EXCLUDE | PER_USER_AUDIT_FAILURE_INCLUDE | PER_USER_AUDIT_FAILURE_EXCLUDE | PER_USER_AUDIT_NONE; STRUCT!{struct POLICY_PRIMARY_DOMAIN_INFO { Name: LSA_UNICODE_STRING, Sid: PSID, }} pub type PPOLICY_PRIMARY_DOMAIN_INFO = *mut POLICY_PRIMARY_DOMAIN_INFO; STRUCT!{struct POLICY_PD_ACCOUNT_INFO { Name: LSA_UNICODE_STRING, }} pub type PPOLICY_PD_ACCOUNT_INFO = *mut POLICY_PD_ACCOUNT_INFO; STRUCT!{struct POLICY_LSA_SERVER_ROLE_INFO { LsaServerRole: POLICY_LSA_SERVER_ROLE, }} pub type PPOLICY_LSA_SERVER_ROLE_INFO = *mut POLICY_LSA_SERVER_ROLE_INFO; STRUCT!{struct POLICY_REPLICA_SOURCE_INFO { ReplicaSource: LSA_UNICODE_STRING, ReplicaAccountName: LSA_UNICODE_STRING, }} pub type PPOLICY_REPLICA_SOURCE_INFO = *mut POLICY_REPLICA_SOURCE_INFO; STRUCT!{struct POLICY_DEFAULT_QUOTA_INFO { QuotaLimits: QUOTA_LIMITS, }} pub type PPOLICY_DEFAULT_QUOTA_INFO = *mut POLICY_DEFAULT_QUOTA_INFO; STRUCT!{struct POLICY_MODIFICATION_INFO { ModifiedId: LARGE_INTEGER, DatabaseCreationTime: LARGE_INTEGER, }} pub type PPOLICY_MODIFICATION_INFO = *mut POLICY_MODIFICATION_INFO; STRUCT!{struct POLICY_AUDIT_FULL_SET_INFO { ShutDownOnFull: BOOLEAN, }} pub type PPOLICY_AUDIT_FULL_SET_INFO = *mut POLICY_AUDIT_FULL_SET_INFO; STRUCT!{struct POLICY_AUDIT_FULL_QUERY_INFO { ShutDownOnFull: BOOLEAN, LogIsFull: BOOLEAN, }} pub type PPOLICY_AUDIT_FULL_QUERY_INFO = *mut POLICY_AUDIT_FULL_QUERY_INFO; ENUM!{enum POLICY_DOMAIN_INFORMATION_CLASS { PolicyDomainEfsInformation = 2, PolicyDomainKerberosTicketInformation, }} pub type PPOLICY_DOMAIN_INFORMATION_CLASS = *mut POLICY_DOMAIN_INFORMATION_CLASS; pub const POLICY_QOS_SCHANNEL_REQUIRED: ULONG = 0x00000001; pub const POLICY_QOS_OUTBOUND_INTEGRITY: ULONG = 0x00000002; pub const POLICY_QOS_OUTBOUND_CONFIDENTIALITY: ULONG = 0x00000004; pub const POLICY_QOS_INBOUND_INTEGRITY: ULONG = 0x00000008; pub const POLICY_QOS_INBOUND_CONFIDENTIALITY: ULONG = 0x00000010; pub const POLICY_QOS_ALLOW_LOCAL_ROOT_CERT_STORE: ULONG = 0x00000020; pub const POLICY_QOS_RAS_SERVER_ALLOWED: ULONG = 0x00000040; pub const POLICY_QOS_DHCP_SERVER_ALLOWED: ULONG = 0x00000080; STRUCT!{struct POLICY_DOMAIN_EFS_INFO { InfoLength: ULONG, EfsBlob: PUCHAR, }} pub type PPOLICY_DOMAIN_EFS_INFO = *mut POLICY_DOMAIN_EFS_INFO; pub const POLICY_KERBEROS_VALIDATE_CLIENT: ULONG = 0x00000080; STRUCT!{struct POLICY_DOMAIN_KERBEROS_TICKET_INFO { AuthenticationOptions: ULONG, MaxServiceTicketAge: LARGE_INTEGER, MaxTicketAge: LARGE_INTEGER, MaxRenewAge: LARGE_INTEGER, MaxClockSkew: LARGE_INTEGER, Reserved: LARGE_INTEGER, }} pub type PPOLICY_DOMAIN_KERBEROS_TICKET_INFO = *mut POLICY_DOMAIN_KERBEROS_TICKET_INFO; ENUM!{enum POLICY_NOTIFICATION_INFORMATION_CLASS { PolicyNotifyAuditEventsInformation = 1, PolicyNotifyAccountDomainInformation, PolicyNotifyServerRoleInformation, PolicyNotifyDnsDomainInformation, PolicyNotifyDomainEfsInformation, PolicyNotifyDomainKerberosTicketInformation, PolicyNotifyMachineAccountPasswordInformation, PolicyNotifyGlobalSaclInformation, PolicyNotifyMax, }} pub type PPOLICY_NOTIFICATION_INFORMATION_CLASS = *mut POLICY_NOTIFICATION_INFORMATION_CLASS; pub const ACCOUNT_VIEW: ULONG = 0x00000001; pub const ACCOUNT_ADJUST_PRIVILEGES: ULONG = 0x00000002; pub const ACCOUNT_ADJUST_QUOTAS: ULONG = 0x00000004; pub const ACCOUNT_ADJUST_SYSTEM_ACCESS: ULONG = 0x00000008; pub const ACCOUNT_ALL_ACCESS: ULONG = STANDARD_RIGHTS_REQUIRED | ACCOUNT_VIEW | ACCOUNT_ADJUST_PRIVILEGES | ACCOUNT_ADJUST_QUOTAS | ACCOUNT_ADJUST_SYSTEM_ACCESS; pub const ACCOUNT_READ: ULONG = STANDARD_RIGHTS_READ | ACCOUNT_VIEW; pub const ACCOUNT_WRITE: ULONG = STANDARD_RIGHTS_WRITE | ACCOUNT_ADJUST_PRIVILEGES | ACCOUNT_ADJUST_QUOTAS | ACCOUNT_ADJUST_SYSTEM_ACCESS; pub const ACCOUNT_EXECUTE: ULONG = STANDARD_RIGHTS_EXECUTE; DECLARE_HANDLE!{LSA_HANDLE, __LSA_HANDLE} pub const TRUSTED_QUERY_DOMAIN_NAME: ULONG = 0x00000001; pub const TRUSTED_QUERY_CONTROLLERS: ULONG = 0x00000002; pub const TRUSTED_SET_CONTROLLERS: ULONG = 0x00000004; pub const TRUSTED_QUERY_POSIX: ULONG = 0x00000008; pub const TRUSTED_SET_POSIX: ULONG = 0x00000010; pub const TRUSTED_SET_AUTH: ULONG = 0x00000020; pub const TRUSTED_QUERY_AUTH: ULONG = 0x00000040; pub const TRUSTED_ALL_ACCESS: ULONG = STANDARD_RIGHTS_REQUIRED | TRUSTED_QUERY_DOMAIN_NAME | TRUSTED_QUERY_CONTROLLERS | TRUSTED_SET_CONTROLLERS | TRUSTED_QUERY_POSIX | TRUSTED_SET_POSIX | TRUSTED_SET_AUTH | TRUSTED_QUERY_AUTH; pub const TRUSTED_READ: ULONG = STANDARD_RIGHTS_READ | TRUSTED_QUERY_DOMAIN_NAME; pub const TRUSTED_WRITE: ULONG = STANDARD_RIGHTS_WRITE | TRUSTED_SET_CONTROLLERS | TRUSTED_SET_POSIX | TRUSTED_SET_AUTH; pub const TRUSTED_EXECUTE: ULONG = STANDARD_RIGHTS_EXECUTE | TRUSTED_QUERY_CONTROLLERS | TRUSTED_QUERY_POSIX; ENUM!{enum TRUSTED_INFORMATION_CLASS { TrustedDomainNameInformation = 1, TrustedControllersInformation, TrustedPosixOffsetInformation, TrustedPasswordInformation, TrustedDomainInformationBasic, TrustedDomainInformationEx, TrustedDomainAuthInformation, TrustedDomainFullInformation, TrustedDomainAuthInformationInternal, TrustedDomainFullInformationInternal, TrustedDomainInformationEx2Internal, TrustedDomainFullInformation2Internal, TrustedDomainSupportedEncryptionTypes, }} pub type PTRUSTED_INFORMATION_CLASS = *mut TRUSTED_INFORMATION_CLASS; STRUCT!{struct TRUSTED_DOMAIN_NAME_INFO { Name: LSA_UNICODE_STRING, }} pub type PTRUSTED_DOMAIN_NAME_INFO = *mut TRUSTED_DOMAIN_NAME_INFO; STRUCT!{struct TRUSTED_CONTROLLERS_INFO { Entries: ULONG, Names: PLSA_UNICODE_STRING, }} pub type PTRUSTED_CONTROLLERS_INFO = *mut TRUSTED_CONTROLLERS_INFO; STRUCT!{struct TRUSTED_POSIX_OFFSET_INFO { Offset: ULONG, }} pub type PTRUSTED_POSIX_OFFSET_INFO = *mut TRUSTED_POSIX_OFFSET_INFO; STRUCT!{struct TRUSTED_PASSWORD_INFO { Password: LSA_UNICODE_STRING, OldPassword: LSA_UNICODE_STRING, }} pub type PTRUSTED_PASSWORD_INFO = *mut TRUSTED_PASSWORD_INFO; pub type TRUSTED_DOMAIN_INFORMATION_BASIC = LSA_TRUST_INFORMATION; pub type PTRUSTED_DOMAIN_INFORMATION_BASIC = PLSA_TRUST_INFORMATION; // NOTE: Ignoring Win XP constants pub const TRUST_DIRECTION_DISABLED: ULONG = 0x00000000; pub const TRUST_DIRECTION_INBOUND: ULONG = 0x00000001; pub const TRUST_DIRECTION_OUTBOUND: ULONG = 0x00000002; pub const TRUST_DIRECTION_BIDIRECTIONAL: ULONG = TRUST_DIRECTION_INBOUND | TRUST_DIRECTION_OUTBOUND; pub const TRUST_TYPE_DOWNLEVEL: ULONG = 0x00000001; pub const TRUST_TYPE_UPLEVEL: ULONG = 0x00000002; pub const TRUST_TYPE_MIT: ULONG = 0x00000003; pub const TRUST_ATTRIBUTE_NON_TRANSITIVE: ULONG = 0x00000001; pub const TRUST_ATTRIBUTE_UPLEVEL_ONLY: ULONG = 0x00000002; pub const TRUST_ATTRIBUTE_QUARANTINED_DOMAIN: ULONG = 0x00000004; pub const TRUST_ATTRIBUTE_FOREST_TRANSITIVE: ULONG = 0x00000008; pub const TRUST_ATTRIBUTE_CROSS_ORGANIZATION: ULONG = 0x00000010; pub const TRUST_ATTRIBUTE_WITHIN_FOREST: ULONG = 0x00000020; pub const TRUST_ATTRIBUTE_TREAT_AS_EXTERNAL: ULONG = 0x00000040; pub const TRUST_ATTRIBUTE_TRUST_USES_RC4_ENCRYPTION: ULONG = 0x00000080; pub const TRUST_ATTRIBUTE_TRUST_USES_AES_KEYS: ULONG = 0x00000100; pub const TRUST_ATTRIBUTE_CROSS_ORGANIZATION_NO_TGT_DELEGATION: ULONG = 0x00000200; pub const TRUST_ATTRIBUTE_PIM_TRUST: ULONG = 0x00000400; pub const TRUST_ATTRIBUTES_VALID: ULONG = 0xFF03FFFF; pub const TRUST_ATTRIBUTES_USER: ULONG = 0xFF000000; STRUCT!{struct TRUSTED_DOMAIN_INFORMATION_EX { Name: LSA_UNICODE_STRING, FlatName: LSA_UNICODE_STRING, Sid: PSID, TrustDirection: ULONG, TrustType: ULONG, TrustAttributes: ULONG, }} pub type PTRUSTED_DOMAIN_INFORMATION_EX = *mut TRUSTED_DOMAIN_INFORMATION_EX; STRUCT!{struct TRUSTED_DOMAIN_INFORMATION_EX2 { Name: LSA_UNICODE_STRING, FlatName: LSA_UNICODE_STRING, Sid: PSID, TrustDirection: ULONG, TrustType: ULONG, TrustAttributes: ULONG, ForestTrustLength: ULONG, ForestTrustInfo: PUCHAR, }} pub type PTRUSTED_DOMAIN_INFORMATION_EX2 = *mut TRUSTED_DOMAIN_INFORMATION_EX2; pub const TRUST_AUTH_TYPE_NONE: ULONG = 0; pub const TRUST_AUTH_TYPE_NT4OWF: ULONG = 1; pub const TRUST_AUTH_TYPE_CLEAR: ULONG = 2; pub const TRUST_AUTH_TYPE_VERSION: ULONG = 3; STRUCT!{struct LSA_AUTH_INFORMATION { LastUpdateTime: LARGE_INTEGER, AuthType: ULONG, AuthInfoLength: ULONG, AuthInfo: PUCHAR, }} pub type PLSA_AUTH_INFORMATION = *mut LSA_AUTH_INFORMATION; STRUCT!{struct TRUSTED_DOMAIN_AUTH_INFORMATION { IncomingAuthInfos: ULONG, IncomingAuthenticationInformation: PLSA_AUTH_INFORMATION, IncomingPreviousAuthenticationInformation: PLSA_AUTH_INFORMATION, OutgoingAuthInfos: ULONG, OutgoingAuthenticationInformation: PLSA_AUTH_INFORMATION, OutgoingPreviousAuthenticationInformation: PLSA_AUTH_INFORMATION, }} pub type PTRUSTED_DOMAIN_AUTH_INFORMATION = *mut TRUSTED_DOMAIN_AUTH_INFORMATION; STRUCT!{struct TRUSTED_DOMAIN_FULL_INFORMATION { Information: TRUSTED_DOMAIN_INFORMATION_EX, PosixOffset: TRUSTED_POSIX_OFFSET_INFO, AuthInformation: TRUSTED_DOMAIN_AUTH_INFORMATION, }} pub type PTRUSTED_DOMAIN_FULL_INFORMATION = *mut TRUSTED_DOMAIN_FULL_INFORMATION; STRUCT!{struct TRUSTED_DOMAIN_FULL_INFORMATION2 { Information: TRUSTED_DOMAIN_INFORMATION_EX2, PosixOffset: TRUSTED_POSIX_OFFSET_INFO, AuthInformation: TRUSTED_DOMAIN_AUTH_INFORMATION, }} pub type PTRUSTED_DOMAIN_FULL_INFORMATION2 = *mut TRUSTED_DOMAIN_FULL_INFORMATION2; STRUCT!{struct TRUSTED_DOMAIN_SUPPORTED_ENCRYPTION_TYPES { SupportedEncryptionTypes: ULONG, }} pub type PTRUSTED_DOMAIN_SUPPORTED_ENCRYPTION_TYPES = *mut TRUSTED_DOMAIN_SUPPORTED_ENCRYPTION_TYPES; ENUM!{enum LSA_FOREST_TRUST_RECORD_TYPE { ForestTrustTopLevelName, ForestTrustTopLevelNameEx, ForestTrustDomainInfo, ForestTrustRecordTypeLast = ForestTrustDomainInfo, }} pub const LSA_FTRECORD_DISABLED_REASONS: ULONG = 0x0000FFFF; pub const LSA_TLN_DISABLED_NEW: ULONG = 0x00000001; pub const LSA_TLN_DISABLED_ADMIN: ULONG = 0x00000002; pub const LSA_TLN_DISABLED_CONFLICT: ULONG = 0x00000004; pub const LSA_SID_DISABLED_ADMIN: ULONG = 0x00000001; pub const LSA_SID_DISABLED_CONFLICT: ULONG = 0x00000002; pub const LSA_NB_DISABLED_ADMIN: ULONG = 0x00000004; pub const LSA_NB_DISABLED_CONFLICT: ULONG = 0x00000008; STRUCT!{struct LSA_FOREST_TRUST_DOMAIN_INFO { Sid: PSID, DnsName: LSA_UNICODE_STRING, NetbiosName: LSA_UNICODE_STRING, }} pub type PLSA_FOREST_TRUST_DOMAIN_INFO = *mut LSA_FOREST_TRUST_DOMAIN_INFO; pub const MAX_FOREST_TRUST_BINARY_DATA_SIZE: SIZE_T = 128 * 1024; STRUCT!{struct LSA_FOREST_TRUST_BINARY_DATA { Length: ULONG, Buffer: PUCHAR, }} pub type PLSA_FOREST_TRUST_BINARY_DATA = *mut LSA_FOREST_TRUST_BINARY_DATA; UNION!{union LSA_FOREST_TRUST_RECORD_FORESTTRUSTDATA { [u32; 5] [u64; 5], TopLevelName TopLevelName_mut: LSA_UNICODE_STRING, DomainInfo DomainInfo_mut: LSA_FOREST_TRUST_DOMAIN_INFO, Data Data_mut: LSA_FOREST_TRUST_BINARY_DATA, }} STRUCT!{struct LSA_FOREST_TRUST_RECORD { Flags: ULONG, ForestTrustType: LSA_FOREST_TRUST_RECORD_TYPE, Time: LARGE_INTEGER, ForestTrustData: LSA_FOREST_TRUST_RECORD_FORESTTRUSTDATA, }} pub type PLSA_FOREST_TRUST_RECORD = *mut LSA_FOREST_TRUST_RECORD; pub const MAX_RECORDS_IN_FOREST_TRUST_INFO: SIZE_T = 4000; STRUCT!{struct LSA_FOREST_TRUST_INFORMATION { RecordCount: ULONG, Entries: *mut PLSA_FOREST_TRUST_RECORD, }} pub type PLSA_FOREST_TRUST_INFORMATION = LSA_FOREST_TRUST_INFORMATION; ENUM!{enum LSA_FOREST_TRUST_COLLISION_RECORD_TYPE { CollisionTdo, CollisionXref, CollisionOther, }} STRUCT!{struct LSA_FOREST_TRUST_COLLISION_RECORD { Index: ULONG, Type: LSA_FOREST_TRUST_COLLISION_RECORD_TYPE, Flags: ULONG, Name: LSA_UNICODE_STRING, }} pub type PLSA_FOREST_TRUST_COLLISION_RECORD = *mut LSA_FOREST_TRUST_COLLISION_RECORD; STRUCT!{struct LSA_FOREST_TRUST_COLLISION_INFORMATION { RecordCount: ULONG, Entries: *mut PLSA_FOREST_TRUST_COLLISION_RECORD, }} pub type PLSA_FOREST_TRUST_COLLISION_INFORMATION = *mut LSA_FOREST_TRUST_COLLISION_INFORMATION; pub const SECRET_SET_VALUE: ULONG = 0x00000001; pub const SECRET_QUERY_VALUE: ULONG = 0x00000002; pub const SECRET_ALL_ACCESS: ULONG = STANDARD_RIGHTS_REQUIRED | SECRET_SET_VALUE | SECRET_QUERY_VALUE; pub const SECRET_READ: ULONG = STANDARD_RIGHTS_READ | SECRET_QUERY_VALUE; pub const SECRET_WRITE: ULONG = STANDARD_RIGHTS_WRITE | SECRET_SET_VALUE; pub const SECRET_EXECUTE: ULONG = STANDARD_RIGHTS_EXECUTE; pub const LSA_GLOBAL_SECRET_PREFIX: &'static str = "G$"; pub const LSA_GLOBAL_SECRET_PREFIX_LENGTH: SIZE_T = 2; pub const LSA_LOCAL_SECRET_PREFIX: &'static str = "L$"; pub const LSA_LOCAL_SECRET_PREFIX_LENGTH: SIZE_T = 2; pub const LSA_MACHINE_SECRET_PREFIX: &'static str = "M$"; pub const LSA_MACHINE_SECRET_PREFIX_LENGTH: SIZE_T = 2; pub const LSA_SECRET_MAXIMUM_COUNT: SIZE_T = 0x00001000; pub const LSA_SECRET_MAXIMUM_LENGTH: SIZE_T = 0x00000200; DECLARE_HANDLE!{LSA_ENUMERATION_HANDLE, __LSA_ENUMERATION_HANDLE} pub type PLSA_ENUMERATION_HANDLE = *mut LSA_ENUMERATION_HANDLE; STRUCT!{struct LSA_ENUMERATION_INFORMATION { Sid: PSID, }} pub type PLSA_ENUMERATION_INFORMATION = *mut LSA_ENUMERATION_INFORMATION; extern "system" { pub fn LsaFreeMemory( Buffer: PVOID, ) -> NTSTATUS; pub fn LsaClose( ObjectHandle: LSA_HANDLE, ) -> NTSTATUS; pub fn LsaDelete( ObjectHandle: LSA_HANDLE, ) -> NTSTATUS; pub fn LsaQuerySecurityObject( ObjectHandle: LSA_HANDLE, SecurityInformation: SECURITY_INFORMATION, SecurityDescriptor: *mut PSECURITY_DESCRIPTOR, ) -> NTSTATUS; pub fn LsaSetSecurityObject( ObjectHandle: LSA_HANDLE, SecurityInformation: SECURITY_INFORMATION, SecurityDescriptor: PSECURITY_DESCRIPTOR, ) -> NTSTATUS; pub fn LsaChangePassword( ServerName: PLSA_UNICODE_STRING, DomainName: PLSA_UNICODE_STRING, AccountName: PLSA_UNICODE_STRING, OldPassword: PLSA_UNICODE_STRING, NewPassword: PLSA_UNICODE_STRING, ) -> NTSTATUS; } STRUCT!{struct LSA_LAST_INTER_LOGON_INFO { LastSuccessfulLogon: LARGE_INTEGER, LastFailedLogon: LARGE_INTEGER, FailedAttemptCountSinceLastSuccessfulLogon: ULONG, }} pub type PLSA_LAST_INTER_LOGON_INFO = *mut LSA_LAST_INTER_LOGON_INFO; STRUCT!{struct SECURITY_LOGON_SESSION_DATA { Size: ULONG, LogonId: LUID, UserName: LSA_UNICODE_STRING, LogonDomain: LSA_UNICODE_STRING, AuthenticationPackage: LSA_UNICODE_STRING, LogonType: ULONG, Session: ULONG, Sid: PSID, LogonTime: LARGE_INTEGER, LogonServer: LSA_UNICODE_STRING, DnsDomainName: LSA_UNICODE_STRING, Upn: LSA_UNICODE_STRING, UserFlags: ULONG, LastLogonInfo: LSA_LAST_INTER_LOGON_INFO, LogonScript: LSA_UNICODE_STRING, ProfilePath: LSA_UNICODE_STRING, HomeDirectory: LSA_UNICODE_STRING, HomeDirectoryDrive: LSA_UNICODE_STRING, LogoffTime: LARGE_INTEGER, KickOffTime: LARGE_INTEGER, PasswordLastSet: LARGE_INTEGER, PasswordCanChange: LARGE_INTEGER, PasswordMustChange: LARGE_INTEGER, }} pub type PSECURITY_LOGON_SESSION_DATA = *mut SECURITY_LOGON_SESSION_DATA; extern "system" { pub fn LsaEnumerateLogonSessions( LogonSessionCount: PULONG, LogonSessionList: *mut PLUID, ) -> NTSTATUS; pub fn LsaGetLogonSessionData( LogonId: PLUID, ppLogonSessionData: *mut PSECURITY_LOGON_SESSION_DATA, ) -> NTSTATUS; pub fn LsaOpenPolicy( SystemName: PLSA_UNICODE_STRING, ObjectAttributes: PLSA_OBJECT_ATTRIBUTES, DesiredAccess: ACCESS_MASK, PolicyHandle: PLSA_HANDLE, ) -> NTSTATUS; pub fn LsaOpenPolicySce( SystemName: PLSA_UNICODE_STRING, ObjectAttributes: PLSA_OBJECT_ATTRIBUTES, DesiredAccess: ACCESS_MASK, PolicyHandle: PLSA_HANDLE, ) -> NTSTATUS; } pub const MAXIMUM_CAPES_PER_CAP: SIZE_T = 0x7F; pub const CENTRAL_ACCESS_POLICY_OWNER_RIGHTS_PRESENT_FLAG: ULONG = 0x00000001; pub const CENTRAL_ACCESS_POLICY_STAGED_OWNER_RIGHTS_PRESENT_FLAG: ULONG = 0x00000100; #[inline] pub fn STAGING_FLAG(Effective: ULONG) -> ULONG { (Effective & 0xF) << 8 } pub const CENTRAL_ACCESS_POLICY_STAGED_FLAG: ULONG = 0x00010000; pub const CENTRAL_ACCESS_POLICY_VALID_FLAG_MASK: ULONG = CENTRAL_ACCESS_POLICY_OWNER_RIGHTS_PRESENT_FLAG | CENTRAL_ACCESS_POLICY_STAGED_OWNER_RIGHTS_PRESENT_FLAG | CENTRAL_ACCESS_POLICY_STAGED_FLAG; pub const LSASETCAPS_RELOAD_FLAG: ULONG = 0x00000001; pub const LSASETCAPS_VALID_FLAG_MASK: ULONG = LSASETCAPS_RELOAD_FLAG; STRUCT!{struct CENTRAL_ACCESS_POLICY_ENTRY { Name: LSA_UNICODE_STRING, Description: LSA_UNICODE_STRING, ChangeId: LSA_UNICODE_STRING, LengthAppliesTo: ULONG, AppliesTo: PUCHAR, LengthSD: ULONG, SD: PSECURITY_DESCRIPTOR, LengthStagedSD: ULONG, StagedSD: PSECURITY_DESCRIPTOR, Flags: ULONG, }} pub type PCENTRAL_ACCESS_POLICY_ENTRY = *mut CENTRAL_ACCESS_POLICY_ENTRY; pub type PCCENTRAL_ACCESS_POLICY_ENTRY = *const CENTRAL_ACCESS_POLICY_ENTRY; STRUCT!{struct CENTRAL_ACCESS_POLICY { CAPID: PSID, Name: LSA_UNICODE_STRING, Description: LSA_UNICODE_STRING, ChangeId: LSA_UNICODE_STRING, Flags: ULONG, CAPECount: ULONG, CAPEs: *mut PCENTRAL_ACCESS_POLICY_ENTRY, }} pub type PCENTRAL_ACCESS_POLICY = *mut CENTRAL_ACCESS_POLICY; pub type PCCENTRAL_ACCESS_POLICY = *const CENTRAL_ACCESS_POLICY; extern "system" { pub fn LsaSetCAPs( CAPDNs: PLSA_UNICODE_STRING, CAPDNCount: ULONG, Flags: ULONG, ) -> NTSTATUS; pub fn LsaGetAppliedCAPIDs( SystemName: PLSA_UNICODE_STRING, CAPIDs: *mut *mut PSID, CAPIDCount: PULONG, ) -> NTSTATUS; pub fn LsaQueryCAPs( CAPIDs: *mut PSID, CAPIDCount: ULONG, CAPs: *mut PCENTRAL_ACCESS_POLICY, CAPCount: PULONG, ) -> NTSTATUS; pub fn LsaQueryInformationPolicy( PolicyHandle: LSA_HANDLE, InformationClass: POLICY_INFORMATION_CLASS, Buffer: *mut PVOID, ) -> NTSTATUS; pub fn LsaSetInformationPolicy( PolicyHandle: LSA_HANDLE, InformationClass: POLICY_INFORMATION_CLASS, Buffer: PVOID, ) -> NTSTATUS; pub fn LsaQueryDomainInformationPolicy( PolicyHandle: LSA_HANDLE, InformationClass: POLICY_DOMAIN_INFORMATION_CLASS, Buffer: *mut PVOID, ) -> NTSTATUS; pub fn LsaSetDomainInformationPolicy( PolicyHandle: LSA_HANDLE, InformationClass: POLICY_DOMAIN_INFORMATION_CLASS, Buffer: PVOID, ) -> NTSTATUS; pub fn LsaRegisterPolicyChangeNotification( InformationClass: POLICY_NOTIFICATION_INFORMATION_CLASS, NotifcationEventHandle: HANDLE, ) -> NTSTATUS; pub fn LsaUnregisterPolicyChangeNotification( InformationClass: POLICY_NOTIFICATION_INFORMATION_CLASS, NotifcationEventHandle: HANDLE, ) -> NTSTATUS; pub fn LsaClearAuditLog( PolicyHandle: LSA_HANDLE, ) -> NTSTATUS; pub fn LsaCreateAccount( PolicyHandle: LSA_HANDLE, AccountSid: PSID, DesiredAccess: ACCESS_MASK, AccountHandle: PLSA_HANDLE, ) -> NTSTATUS; pub fn LsaEnumerateAccounts( PolicyHandle: LSA_HANDLE, EnumerationContext: PLSA_ENUMERATION_HANDLE, Buffer: *mut PVOID, PreferredMaximumLength: ULONG, CountReturned: PULONG, ) -> NTSTATUS; pub fn LsaCreateTrustedDomain( PolicyHandle: LSA_HANDLE, TrustedDomainInformation: PLSA_TRUST_INFORMATION, DesiredAccess: ACCESS_MASK, TrustedDomainHandle: PLSA_HANDLE, ) -> NTSTATUS; pub fn LsaEnumerateTrustedDomains( PolicyHandle: LSA_HANDLE, EnumerationContext: PLSA_ENUMERATION_HANDLE, Buffer: *mut PVOID, PreferredMaximumLength: ULONG, CountReturned: PULONG, ) -> NTSTATUS; pub fn LsaEnumeratePrivileges( PolicyHandle: LSA_HANDLE, EnumerationContext: PLSA_ENUMERATION_HANDLE, Buffer: *mut PVOID, PreferredMaximumLength: ULONG, CountReturned: PULONG, ) -> NTSTATUS; pub fn LsaLookupNames( PolicyHandle: LSA_HANDLE, Count: ULONG, Names: PLSA_UNICODE_STRING, ReferencedDomains: *mut PLSA_REFERENCED_DOMAIN_LIST, Sids: *mut PLSA_TRANSLATED_SID, ) -> NTSTATUS; pub fn LsaLookupNames2( PolicyHandle: LSA_HANDLE, Flags: ULONG, Count: ULONG, Names: PLSA_UNICODE_STRING, ReferencedDomains: *mut PLSA_REFERENCED_DOMAIN_LIST, Sids: *mut PLSA_TRANSLATED_SID2, ) -> NTSTATUS; pub fn LsaLookupSids( PolicyHandle: LSA_HANDLE, Count: ULONG, Sids: *mut PSID, ReferencedDomains: *mut PLSA_REFERENCED_DOMAIN_LIST, Names: *mut PLSA_TRANSLATED_NAME, ) -> NTSTATUS; pub fn LsaLookupSids2( PolicyHandle: LSA_HANDLE, LookupOptions: ULONG, Count: ULONG, Sids: *mut PSID, ReferencedDomains: *mut PLSA_REFERENCED_DOMAIN_LIST, Names: *mut PLSA_TRANSLATED_NAME, ) -> NTSTATUS; pub fn LsaCreateSecret( PolicyHandle: LSA_HANDLE, SecretName: PLSA_UNICODE_STRING, DesiredAccess: ACCESS_MASK, SecretHandle: PLSA_HANDLE, ) -> NTSTATUS; pub fn LsaOpenAccount( PolicyHandle: LSA_HANDLE, AccountSid: PSID, DesiredAccess: ACCESS_MASK, AccountHandle: PLSA_HANDLE, ) -> NTSTATUS; pub fn LsaEnumeratePrivilegesOfAccount( AccountHandle: LSA_HANDLE, Privileges: *mut PPRIVILEGE_SET, ) -> NTSTATUS; pub fn LsaAddPrivilegesToAccount( AccountHandle: LSA_HANDLE, Privileges: PPRIVILEGE_SET, ) -> NTSTATUS; pub fn LsaRemovePrivilegesFromAccount( AccountHandle: LSA_HANDLE, AllPrivileges: BOOLEAN, Privileges: PPRIVILEGE_SET, ) -> NTSTATUS; pub fn LsaGetQuotasForAccount( AccountHandle: LSA_HANDLE, QuotaLimits: PQUOTA_LIMITS, ) -> NTSTATUS; pub fn LsaSetQuotasForAccount( AccountHandle: LSA_HANDLE, QuotaLimits: PQUOTA_LIMITS, ) -> NTSTATUS; pub fn LsaGetSystemAccessAccount( AccountHandle: LSA_HANDLE, SystemAccess: PULONG, ) -> NTSTATUS; pub fn LsaSetSystemAccessAccount( AccountHandle: LSA_HANDLE, SystemAccess: ULONG, ) -> NTSTATUS; pub fn LsaOpenTrustedDomain( PolicyHandle: LSA_HANDLE, TrustedDomainSid: PSID, DesiredAccess: ACCESS_MASK, TrustedDomainHandle: PLSA_HANDLE, ) -> NTSTATUS; pub fn LsaQueryInfoTrustedDomain( TrustedDomainHandle: LSA_HANDLE, InformationClass: TRUSTED_INFORMATION_CLASS, Buffer: *mut PVOID, ) -> NTSTATUS; pub fn LsaSetInformationTrustedDomain( TrustedDomainHandle: LSA_HANDLE, InformationClass: TRUSTED_INFORMATION_CLASS, Buffer: PVOID, ) -> NTSTATUS; pub fn LsaOpenSecret( PolicyHandle: LSA_HANDLE, SecretName: PLSA_UNICODE_STRING, DesiredAccess: ACCESS_MASK, SecretHandle: PLSA_HANDLE, ) -> NTSTATUS; pub fn LsaSetSecret( SecretHandle: LSA_HANDLE, CurrentValue: PLSA_UNICODE_STRING, OldValue: PLSA_UNICODE_STRING, ) -> NTSTATUS; pub fn LsaQuerySecret( SecretHandle: LSA_HANDLE, CurrentValue: *mut PLSA_UNICODE_STRING, CurrentValueSetTime: PLARGE_INTEGER, OldValue: *mut PLSA_UNICODE_STRING, OldValueSetTime: PLARGE_INTEGER, ) -> NTSTATUS; pub fn LsaLookupPrivilegeValue( PolicyHandle: LSA_HANDLE, Name: PLSA_UNICODE_STRING, Value: PLUID, ) -> NTSTATUS; pub fn LsaLookupPrivilegeName( PolicyHandle: LSA_HANDLE, Value: PLUID, Name: *mut PLSA_UNICODE_STRING, ) -> NTSTATUS; pub fn LsaLookupPrivilegeDisplayName( PolicyHandle: LSA_HANDLE, Name: PLSA_UNICODE_STRING, DisplayName: *mut PLSA_UNICODE_STRING, LanguageReturned: PSHORT, ) -> NTSTATUS; } extern "C" { pub fn LsaGetUserName( UserName: *mut PLSA_UNICODE_STRING, DomainName: *mut PLSA_UNICODE_STRING, ) -> NTSTATUS; pub fn LsaGetRemoteUserName( SystemName: PLSA_UNICODE_STRING, UserName: *mut PLSA_UNICODE_STRING, DomainName: *mut PLSA_UNICODE_STRING, ) -> NTSTATUS; } pub const SE_INTERACTIVE_LOGON_NAME: &'static str = "SeInteractiveLogonRight"; pub const SE_NETWORK_LOGON_NAME: &'static str = "SeNetworkLogonRight"; pub const SE_BATCH_LOGON_NAME: &'static str = "SeBatchLogonRight"; pub const SE_SERVICE_LOGON_NAME: &'static str = "SeServiceLogonRight"; pub const SE_DENY_INTERACTIVE_LOGON_NAME: &'static str = "SeDenyInteractiveLogonRight"; pub const SE_DENY_NETWORK_LOGON_NAME: &'static str = "SeDenyNetworkLogonRight"; pub const SE_DENY_BATCH_LOGON_NAME: &'static str = "SeDenyBatchLogonRight"; pub const SE_DENY_SERVICE_LOGON_NAME: &'static str = "SeDenyServiceLogonRight"; pub const SE_REMOTE_INTERACTIVE_LOGON_NAME: &'static str = "SeRemoteInteractiveLogonRight"; pub const SE_DENY_REMOTE_INTERACTIVE_LOGON_NAME: &'static str = "SeDenyRemoteInteractiveLogonRight"; extern "system" { pub fn LsaEnumerateAccountsWithUserRight( PolictHandle: LSA_HANDLE, UserRights: PLSA_UNICODE_STRING, EnumerationBuffer: *mut PVOID, CountReturned: PULONG, ) -> NTSTATUS; pub fn LsaEnumerateAccountRights( PolicyHandle: LSA_HANDLE, AccountSid: PSID, UserRights: *mut PLSA_UNICODE_STRING, CountOfRights: PULONG, ) -> NTSTATUS; pub fn LsaAddAccountRights( PolicyHandle: LSA_HANDLE, AccountSid: PSID, UserRights: PLSA_UNICODE_STRING, CountOfRights: ULONG, ) -> NTSTATUS; pub fn LsaRemoveAccountRights( PolicyHandle: LSA_HANDLE, AccountSid: PSID, AllRights: BOOLEAN, UserRights: PLSA_UNICODE_STRING, CountOfRights: ULONG, ) -> NTSTATUS; pub fn LsaOpenTrustedDomainByName( PolicyHandle: LSA_HANDLE, TrustedDomainName: PLSA_UNICODE_STRING, DesiredAccess: ACCESS_MASK, TrustedDomainHandle: PLSA_HANDLE, ) -> NTSTATUS; pub fn LsaQueryTrustedDomainInfo( PolicyHandle: LSA_HANDLE, TrustedDomainSid: PSID, InformationClass: TRUSTED_INFORMATION_CLASS, Buffer: *mut PVOID, ) -> NTSTATUS; pub fn LsaSetTrustedDomainInformation( PolicyHandle: LSA_HANDLE, TrustedDomainSid: PSID, InformationClass: TRUSTED_INFORMATION_CLASS, Buffer: PVOID, ) -> NTSTATUS; pub fn LsaDeleteTrustedDomain( PolicyHandle: LSA_HANDLE, TrustedDomainSid: PSID, ) -> NTSTATUS; pub fn LsaQueryTrustedDomainInfoByName( PolicyHandle: LSA_HANDLE, TrustedDomainName: PLSA_UNICODE_STRING, InformationClass: TRUSTED_INFORMATION_CLASS, Buffer: *mut PVOID, ) -> NTSTATUS; pub fn LsaSetTrustedDomainInfoByName( PolicyHandle: LSA_HANDLE, TrustedDomainName: PLSA_UNICODE_STRING, InformationClass: TRUSTED_INFORMATION_CLASS, Buffer: PVOID, ) -> NTSTATUS; pub fn LsaEnumerateTrustedDomainsEx( PolicyHandle: LSA_HANDLE, EnumerationContext: PLSA_ENUMERATION_HANDLE, Buffer: *mut PVOID, PreferredMaximumLength: ULONG, CountReturned: PULONG, ) -> NTSTATUS; pub fn LsaCreateTrustedDomainEx( PolicyHandle: LSA_HANDLE, TrustedDomainInformation: PTRUSTED_DOMAIN_INFORMATION_EX, AuthenticationInformation: PTRUSTED_DOMAIN_AUTH_INFORMATION, DesiredAccess: ACCESS_MASK, TrustedDomainHandle: PLSA_HANDLE, ) -> NTSTATUS; pub fn LsaQueryForestTrustInformation( PolicyHandle: LSA_HANDLE, TrustedDomainName: PLSA_UNICODE_STRING, ForestTrustInfo: *mut PLSA_FOREST_TRUST_INFORMATION, ) -> NTSTATUS; pub fn LsaSetForestTrustInformation( PolicyHandle: LSA_HANDLE, TrustedDomainName: PLSA_UNICODE_STRING, ForestTrustInfo: PLSA_FOREST_TRUST_INFORMATION, CheckOnly: BOOLEAN, CollisionInfo: *mut PLSA_FOREST_TRUST_COLLISION_INFORMATION, ) -> NTSTATUS; pub fn LsaForestTrustFindMatch( PolicyHandle: LSA_HANDLE, Type: ULONG, Name: PLSA_UNICODE_STRING, Match: *mut PLSA_UNICODE_STRING, ) -> NTSTATUS; pub fn LsaStorePrivateData( PolicyHandle: LSA_HANDLE, KeyName: PLSA_UNICODE_STRING, PrivateData: PLSA_UNICODE_STRING, ) -> NTSTATUS; pub fn LsaRetrievePrivateData( PolicyHandle: LSA_HANDLE, KeyName: PLSA_UNICODE_STRING, PrivateData: *mut PLSA_UNICODE_STRING, ) -> NTSTATUS; pub fn LsaNtStatusToWinError( Status: NTSTATUS, ) -> ULONG; } ENUM!{enum NEGOTIATE_MESSAGES { NegEnumPackagePrefixes = 0, NegGetCallerName = 1, NegTransferCredentials = 2, NegEnumPackageNames = 3, NegCallPackageMax, }} pub const NEGOTIATE_MAX_PREFIX: SIZE_T = 32; STRUCT!{struct NEGOTIATE_PACKAGE_PREFIX { PackageId: ULONG_PTR, PackageDataA: PVOID, PackageDataW: PVOID, PrefixLen: ULONG_PTR, Prefix: [UCHAR; NEGOTIATE_MAX_PREFIX], }} pub type PNEGOTIATE_PACKAGE_PREFIX = *mut NEGOTIATE_PACKAGE_PREFIX; STRUCT!{struct NEGOTIATE_PACKAGE_PREFIXES { MessageType: ULONG, PrefixCount: ULONG, Offset: ULONG, Pad: ULONG, }} pub type PNEGOTIATE_PACKAGE_PREFIXES = *mut NEGOTIATE_PACKAGE_PREFIXES; STRUCT!{struct NEGOTIATE_CALLER_NAME_REQUEST { MessageType: ULONG, LogonId: LUID, }} pub type PNEGOTIATE_CALLER_NAME_REQUEST = *mut NEGOTIATE_CALLER_NAME_REQUEST; STRUCT!{struct NEGOTIATE_CALLER_NAME_RESPONSE { Messagetype: ULONG, CallerName: PWSTR, }} pub type PNEGOTIATE_CALLER_NAME_RESPONSE = *mut NEGOTIATE_CALLER_NAME_RESPONSE; STRUCT!{struct NEGOTIATE_PACKAGE_NAMES { NamesCount: ULONG, Names: [UNICODE_STRING; ANYSIZE_ARRAY], }} pub type PNEGOTIATE_PACKAGE_NAMES = *mut NEGOTIATE_PACKAGE_NAMES; pub const NEGOTIATE_ALLOW_NTLM: ULONG = 0x10000000; pub const NEGOTIATE_NEG_NTLM: ULONG = 0x20000000; STRUCT!{struct NEGOTIATE_PACKAGE_PREFIX_WOW { PackageId: ULONG, PackageDataA: ULONG, PackageDataW: ULONG, PrefixLen: ULONG, Prefix: [UCHAR; NEGOTIATE_MAX_PREFIX], }} pub type PNEGOTIATE_PACKAGE_PREFIX_WOW = *mut NEGOTIATE_PACKAGE_PREFIX_WOW; STRUCT!{struct NEGOTIATE_CALLER_NAME_RESPONSE_WOW { MessageType: ULONG, CallerName: ULONG, }} pub type PNEGOTIATE_CALLER_NAME_RESPONSE_WOW = *mut NEGOTIATE_CALLER_NAME_RESPONSE_WOW; extern "system" { pub fn LsaSetPolicyReplicationHandle( PolicyHandle: PLSA_HANDLE, ) -> NTSTATUS; } pub const MAX_USER_RECORDS: SIZE_T = 1000; STRUCT!{struct LSA_USER_REGISTRATION_INFO { Sid: LSA_UNICODE_STRING, DeviceId: LSA_UNICODE_STRING, Username: LSA_UNICODE_STRING, Thumbprint: LSA_UNICODE_STRING, RegistrationTime: LARGE_INTEGER, }} pub type PLSA_USER_REGISTRATION_INFO = *mut LSA_USER_REGISTRATION_INFO; STRUCT!{struct LSA_REGISTRATION_INFO { RegisteredCount: ULONG, UserRegistrationInfo: *mut PLSA_USER_REGISTRATION_INFO, }} pub type PLSA_REGISTRATION_INFO = *mut LSA_REGISTRATION_INFO; extern "system" { pub fn LsaGetDeviceRegistrationInfo( RegistrationInfo: *mut PLSA_REGISTRATION_INFO, ) -> NTSTATUS; } ENUM!{enum LSA_CREDENTIAL_KEY_SOURCE_TYPE { eFromPrecomputed = 1, eFromClearPassword, eFromNtOwf, }} pub type PLSA_CREDENTIAL_KEY_SOURCE_TYPE = *mut LSA_CREDENTIAL_KEY_SOURCE_TYPE; extern "C" { pub fn SeciIsProtectedUser( ProtectedUser: PBOOLEAN, ) -> NTSTATUS; }