//+----------------------------------------------------------------------- // // Microsoft Windows // // Copyright (c) Microsoft Corporation 1992 - 1996 // // File: logonses.h // // Contents: prototypes and structures for the logon session list // // // History: 16-April-1996 Created MikeSw // //------------------------------------------------------------------------ #ifndef __LOGONSES_H__ #define __LOGONSES_H__ // // All global variables declared as EXTERN will be allocated in the file // that defines LOGONSES_ALLOCATE // #ifdef EXTERN #undef EXTERN #endif #ifdef LOGONSES_ALLOCATE #define EXTERN #else #define EXTERN extern #endif EXTERN KERBEROS_LIST KerbLogonSessionList; EXTERN BOOLEAN KerberosLogonSessionsInitialized; // // Keep track a list of session keys for network service in ISC. These keys are // used in ASC to detect whether a kerb logon session is from ISC called by the // local network serivce (the client) // EXTERN LIST_ENTRY KerbNetworkServiceSKeyList; EXTERN RTL_RESOURCE KerbNetworkServiceSKeyLock; // // the number of entries is only used in debugger spew of checked builds // #if DBG EXTERN volatile LONG KerbcSKeyEntries; #endif // // timer used to clean up the session key list above // EXTERN HANDLE KerbhSKeyTimerQueue; // // NOTICE: The logon session resource, credential resource, and context // resource must all be acquired carefully to prevent deadlock. They // can only be acquired in this order: // // 1. Logon Sessions // 2. Credentials // 3. Contexts // #if DBG #ifdef WIN32_CHICAGO #define KerbWriteLockLogonSessions(_X_) \ { \ DebugLog((DEB_TRACE_LOCKS,"Write locking LogonSessions\n")); \ DsysAssert(KerbGlobalContextsLocked != GetCurrentThreadId()); \ EnterCriticalSection(&(_X_)->Lock); \ } #define KerbReadLockLogonSessions(_X_) \ { \ DebugLog((DEB_TRACE_LOCKS,"Read locking LogonSessions\n")); \ DsysAssert(KerbGlobalContextsLocked != GetCurrentThreadId()); \ EnterCriticalSection(&(_X_)->Lock); \ } #define KerbUnlockLogonSessions(_X_) \ { \ DebugLog((DEB_TRACE_LOCKS,"Unlocking LogonSessions\n")); \ LeaveCriticalSection(&(_X_)->Lock); \ } #else // WIN32_CHICAGO #define KerbWriteLockLogonSessions(_X_) \ { \ DebugLog((DEB_TRACE_LOCKS,"Write locking LogonSession %p\n",(_X_))); \ DsysAssert(KerbGlobalContextsLocked != GetCurrentThreadId()); \ RtlEnterCriticalSection(&(_X_)->Lock); \ } #define KerbReadLockLogonSessions(_X_) \ { \ DebugLog((DEB_TRACE_LOCKS,"Read locking LogonSession %p\n",(_X_))); \ DsysAssert(KerbGlobalContextsLocked != GetCurrentThreadId()); \ RtlEnterCriticalSection(&(_X_)->Lock); \ } #define KerbUnlockLogonSessions(_X_) \ { \ DebugLog((DEB_TRACE_LOCKS,"Unlocking LogonSessions\n")); \ RtlLeaveCriticalSection(&(_X_)->Lock); \ } #endif // WIN32_CHICAGO #else #ifdef WIN32_CHICAGO #define KerbWriteLockLogonSessions(_X_) \ EnterCriticalSection(&(_X_)->Lock) #define KerbReadLockLogonSessions(_X_) \ EnterCriticalSection(&(_X_)->Lock) #define KerbUnlockLogonSessions(_X_) \ LeaveCriticalSection(&(_X_)->Lock) #else // WIN32_CHICAGO #define KerbWriteLockLogonSessions(_X_) \ RtlEnterCriticalSection(&(_X_)->Lock); #define KerbReadLockLogonSessions(_X_) \ RtlEnterCriticalSection(&(_X_)->Lock); #define KerbUnlockLogonSessions(_X_) \ RtlLeaveCriticalSection(&(_X_)->Lock); #endif // WIN32_CHICAGO #endif // // Helper routines for Logon Sessions // NTSTATUS KerbInitLogonSessionList( VOID ); NTSTATUS KerbInitNetworkServiceLoopbackDetection( VOID ); VOID KerbFreeNetworkServiceSKeyListAndLock( VOID ); VOID KerbFreeLogonSessionList( VOID ); NTSTATUS KerbAllocateLogonSession( PKERB_LOGON_SESSION * NewLogonSession ); NTSTATUS KerbInsertLogonSession( IN PKERB_LOGON_SESSION LogonSession ); PKERB_LOGON_SESSION KerbReferenceLogonSession( IN PLUID LogonId, IN BOOLEAN RemoveFromList ); VOID KerbReferenceLogonSessionByPointer( IN PKERB_LOGON_SESSION LogonSession, IN BOOLEAN RemoveFromList ); VOID KerbDereferenceLogonSession( IN PKERB_LOGON_SESSION LogonSession ); NTSTATUS KerbCreateLogonSession( IN PLUID LogonId, IN PUNICODE_STRING AccountName, IN PUNICODE_STRING DomainName, IN OPTIONAL PUNICODE_STRING Password, IN OPTIONAL PUNICODE_STRING OldPassword, IN ULONG PasswordFlags, IN SECURITY_LOGON_TYPE LogonType, OUT PKERB_LOGON_SESSION * NewLogonSession ); VOID KerbFreeLogonSession( IN PKERB_LOGON_SESSION LogonSession ); NTSTATUS KerbCreateLogonSessionFromKerbCred( IN OPTIONAL PLUID LogonId, IN PKERB_ENCRYPTED_TICKET Ticket, IN PKERB_CRED KerbCred, IN PKERB_ENCRYPTED_CRED EncryptedCred, IN OUT PKERB_LOGON_SESSION *OldLogonSession ); NTSTATUS KerbBuildPasswordList( IN PUNICODE_STRING Password, IN PUNICODE_STRING UserName, IN PUNICODE_STRING DomainName, IN PKERB_ETYPE_INFO SuppliedSalt, IN PKERB_STORED_CREDENTIAL OldPasswords, IN OPTIONAL PUNICODE_STRING PrincipalName, IN KERB_ACCOUNT_TYPE AccountType, IN ULONG PasswordFlags, OUT PKERB_STORED_CREDENTIAL * PasswordList ); VOID KerbFreeStoredCred( IN PKERB_STORED_CREDENTIAL StoredCred ); NTSTATUS KerbChangeCredentialsPassword( IN PKERB_PRIMARY_CREDENTIAL PrimaryCredentials, IN OPTIONAL PUNICODE_STRING NewPassword, IN OPTIONAL PKERB_ETYPE_INFO EtypeInfo, IN KERB_ACCOUNT_TYPE AccountType, IN ULONG PasswordFlags ); // // Flags for logon sessions // #define KERB_LOGON_DEFERRED 0x1 #define KERB_LOGON_NO_PASSWORD 0x2 #define KERB_LOGON_LOCAL_ONLY 0x4 #define KERB_LOGON_DELEGATED 0x8 #define KERB_LOGON_SMARTCARD 0x10 #define KERB_LOGON_MIT_REALM 0x20 #define KERB_LOGON_S4U_SESSION 0x4000 // make sure we don't collide w/ other flags #define KERB_LOGON_CREDMAN_INITIALIZED 0x80000000 #endif // __LOGONSES_H__