//  --------------------------------------------------------------------------
//  Module Name: CInteractiveLogon.h
//
//  Copyright (c) 2000, Microsoft Corporation
//
//  File that implements encapsulation of interactive logon information.
//
//  History:    2000-12-07  vtan        created
//  --------------------------------------------------------------------------

#ifndef     _CInteractiveLogon_
#define     _CInteractiveLogon_

EXTERN_C    BOOL    WINAPI  InitiateInteractiveLogon (const WCHAR *pszUsername, WCHAR *pszPassword, DWORD dwTimeout);

//  --------------------------------------------------------------------------
//  CInteractiveLogon
//
//  Purpose:    This class encapsulates interactive logon implementation.
//
//  History:    2000-12-07  vtan        created
//  --------------------------------------------------------------------------

class   CInteractiveLogon
{
    private:
        static  const int       MAGIC_NUMBER    =   48517;

        class   CRequestData
        {
            public:
                                    CRequestData (void);
                                    ~CRequestData (void);

                void                Set (const WCHAR *pszUsername, const WCHAR *pszDomain, WCHAR *pszPassword);
                DWORD               Get (WCHAR *pszUsername, WCHAR *pszDomain, WCHAR *pszPassword)  const;
                void                SetErrorCode (DWORD dwErrorCode);
                DWORD               GetErrorCode (void)     const;
                HANDLE              OpenEventReply (void)   const;
            private:
                unsigned long       _ulMagicNumber;
                DWORD               _dwErrorCode;
                WCHAR               _szEventReplyName[64];
                WCHAR               _szUsername[UNLEN + sizeof('\0')];
                WCHAR               _szDomain[DNLEN + sizeof('\0')];
                unsigned char       _ucSeed;
                int                 _iPasswordLength;
                WCHAR               _szPassword[PWLEN + sizeof('\0')];
        };

    public:
                                    CInteractiveLogon (void);
                                    ~CInteractiveLogon (void);

                void                Start (void);
                void                Stop (void);

                void                SetHostWindow (HWND hwndUIHost);

        static  DWORD               Initiate (const WCHAR *pszUsername, const WCHAR *pszDomain, WCHAR *pszPassword, DWORD dwTimeout);
    private:
        static  DWORD               CheckInteractiveLogonAllowed (DWORD dwTimeout);
        static  DWORD               CheckShutdown (void);
        static  DWORD               CheckMutex (DWORD dwTimeout);
        static  bool                FoundUserSessionID (HANDLE hToken, DWORD *pdwSessionID);
        static  DWORD               SendRequest (const WCHAR *pszUsername, const WCHAR *pszDomain, WCHAR *pszPassword);
        static  void                FormulateObjectBasePath (DWORD dwSessionID, WCHAR *pszObjectPath);
        static  HANDLE              CreateSessionNamedReplyEvent (DWORD dwSessionID);
        static  HANDLE              OpenSessionNamedSignalEvent (DWORD dwSessionID);
        static  HANDLE              CreateSessionNamedSection (DWORD dwSessionID);

                void                WaitForInteractiveLogonRequest (void);

        static  DWORD   WINAPI      CB_ThreadProc (void *pParameter);
        static  void    CALLBACK    CB_APCProc (ULONG_PTR dwParam);
    private:
                HANDLE              _hThread;
                bool                _fContinue;
                HWND                _hwndHost;

        static  const TCHAR         s_szEventReplyName[];
        static  const TCHAR         s_szEventSignalName[];
        static  const TCHAR         s_szSectionName[];
};

#endif  /*  _CInteractiveLogon_     */