// -------------------------------------------------------------------------- // Module Name: CredentialTransfer.h // // Copyright (c) 2001, Microsoft Corporation // // Classes to handle credential transfer from one winlogon to another. // // History: 2001-01-11 vtan created // -------------------------------------------------------------------------- #ifndef _CredentialTransfer_ #define _CredentialTransfer_ #include #include "Thread.h" // -------------------------------------------------------------------------- // CCredentials // // Purpose: Class to manage marshalling of credentials into a block of // memory that can be used in a named pipe. // // History: 2001-01-12 vtan created // -------------------------------------------------------------------------- class CCredentials { private: typedef struct _CREDENTIALS { DWORD dwSize; unsigned char ucPasswordSeed; UNICODE_STRING username; UNICODE_STRING domain; UNICODE_STRING password; } CREDENTIALS, *PCREDENTIALS; private: CCredentials (void); ~CCredentials (void); public: static NTSTATUS OpenConduit (HANDLE *phPipe); static NTSTATUS CreateConduit (LPSECURITY_ATTRIBUTES pSecurityAttributes, HANDLE *phPipe); static NTSTATUS ClearConduit (void); static NTSTATUS Pack (LOGONIPC_CREDENTIALS *pLogonIPCCredentials, void* *ppvData, DWORD *pdwDataSize); static NTSTATUS Unpack (void *pvData, LOGONIPC_CREDENTIALS *pLogonIPCCredentials); static NTSTATUS StaticInitialize (bool fCreate); static NTSTATUS StaticTerminate (void); private: static NTSTATUS GetConduitName (TCHAR *pszName, DWORD dwNameSize); static NTSTATUS SetConduitName (const TCHAR *pszName); static NTSTATUS ClearConduitName (void); static NTSTATUS CreateConduitName (DWORD dwNumber, TCHAR *pszName); private: static HKEY s_hKeyCredentials; static const TCHAR s_szCredentialKeyName[]; static const TCHAR s_szCredentialValueName[]; }; // -------------------------------------------------------------------------- // CCredentialServer // // Purpose: Class to manage the server side of handing credentials from // one winlogon to another. // // History: 2001-01-11 vtan created // -------------------------------------------------------------------------- class CCredentialServer : public CThread { private: CCredentialServer (void); CCredentialServer (DWORD dwTimeout, LOGONIPC_CREDENTIALS *pLogonIPCCredentials); virtual ~CCredentialServer (void); public: bool IsReady (void) const; static NTSTATUS Start (LOGONIPC_CREDENTIALS *pLogonIPCCredentials, DWORD dwWaitTime); static NTSTATUS Start (const WCHAR *pszUsername, const WCHAR *pszDomain, WCHAR *pszPassword, DWORD dwWaitTime); protected: virtual DWORD Entry (void); private: void ExecutePrematureTermination (void); static void CALLBACK CB_APCProc (ULONG_PTR dwParam); static void CALLBACK CB_FileIOCompletionRoutine (DWORD dwErrorCode, DWORD dwNumberOfBytesTransferred, LPOVERLAPPED lpOverlapped); private: DWORD _dwTimeout; bool _fTerminate; HANDLE _hPipe; OVERLAPPED _overlapped; void* _pvData; DWORD _dwSize; }; // -------------------------------------------------------------------------- // CCredentialClient // // Purpose: Class to manage the client side of handing credentials from // one winlogon to another. // // History: 2001-01-11 vtan created // -------------------------------------------------------------------------- class CCredentialClient { private: CCredentialClient (void); ~CCredentialClient (void); public: static NTSTATUS Get (LOGONIPC_CREDENTIALS *pLogonIPCCredentials); }; #endif /* _CredentialTransfer_ */