Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

327 lines
9.2 KiB

//#define DBCS
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#include <regstr.h>
#define WIN31
#include "pwlapi.h"
#include <string.h>
#include <netlib.h>
#ifdef DEBUG
#define SAVE_DEBUG
#undef DEBUG
#endif
#include <npstring.h>
#include <npdefs.h>
#define _COMCTL32_ // We delay-load Comctl32
#include <prsht.h>
#ifdef SAVE_DEBUG
#define DEBUG
#endif
#include <ole2.h>
#include "msluguid.h"
#include "msluapi.h"
void Netlib_EnterCriticalSection(void);
void Netlib_LeaveCriticalSection(void);
#ifdef DEBUG
extern BOOL g_fCritical;
#endif
#define ENTERCRITICAL Netlib_EnterCriticalSection();
#define LEAVECRITICAL Netlib_LeaveCriticalSection();
#define ASSERTCRITICAL ASSERT(g_fCritical);
#define ARRAYSIZE(a) (sizeof(a)/sizeof(a[0]))
extern "C" {
HRESULT VerifySupervisorPassword(LPCSTR pszPassword);
HRESULT ChangeSupervisorPassword(LPCSTR pszOldPassword, LPCSTR pszNewPassword);
};
const UINT cchMaxUsername = 128;
extern UINT g_cRefThisDll;
extern UINT g_cLocks;
extern void LockThisDLL(BOOL fLock);
extern void RefThisDLL(BOOL fRef);
extern void UnloadShellEntrypoint(void);
extern void CleanupWinINet(void);
UINT NPSCopyNLS (NLS_STR FAR *pnlsSourceString, LPVOID lpDestBuffer, LPDWORD lpBufferSize);
extern APIERR MakeSupervisor(HPWL hPWL, LPCSTR pszSupervisorPassword);
HRESULT GetSystemCurrentUser(NLS_STR *pnlsCurrentUser);
HRESULT GetUserPasswordCache(LPCSTR pszUsername, LPCSTR pszPassword, LPHANDLE phOut, BOOL fCreate);
typedef void (*PFNSELNOTIFY)(HWND hwndLB, int iSel);
HRESULT FillUserList(HWND hwndLB, IUserDatabase *pDB, LPCSTR pszDefaultSelection,
BOOL fIncludeGuest, PFNSELNOTIFY pfnSelNotify);
void DestroyUserList(HWND hwndLB);
void AddPage(LPPROPSHEETHEADER ppsh, UINT id, DLGPROC pfn, LPVOID pwd);
void InitWizDataPtr(HWND hDlg, LPARAM lParam);
void InsertControlText(HWND hDlg, UINT idCtrl, const NLS_STR *pnlsInsert);
HRESULT GetControlText(HWND hDlg, UINT idCtrl, NLS_STR *pnls);
HRESULT DoAddUserWizard(HWND hwndParent, IUserDatabase *pDB,
BOOL fPickUserPage, IUser *pUserToClone);
BOOL InstallLogonDialog(void);
void DeinstallLogonDialog(void);
HRESULT DoUserDialog(HWND hwndOwner, DWORD dwFlags, IUser **ppOut);
void CacheLogonCredentials(LPCSTR pszUsername, LPCSTR pszPassword);
void ReportUserError(HWND hwndOwner, HRESULT hres);
void SetErrorFocus(HWND hDlg, UINT idCtrl, BOOL fClear = TRUE);
class CLUClassFactory : public IClassFactory
{
public:
STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
STDMETHODIMP CreateInstance(
/* [unique][in] */ IUnknown __RPC_FAR *pUnkOuter,
/* [in] */ REFIID riid,
/* [out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
STDMETHODIMP LockServer(
/* [in] */ BOOL fLock);
};
HRESULT CreateUserDatabase(REFIID riid, void **ppOut);
class CLUUser;
class BUFFER;
class CLUDatabase : public IUserDatabase
{
//friend class CLUClassFactory;
friend HRESULT CreateUserDatabase(REFIID riid, void **ppOut);
private:
ULONG m_cRef;
CLUUser *m_CurrentUser;
CLUDatabase();
~CLUDatabase();
STDMETHODIMP CreateUser(LPCSTR pszName, IUser *pCloneFrom,
BOOL fFixInstallStubs, IUserProfileInit *pInit);
public:
// *** IUnknown methods ***
STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
STDMETHODIMP Install(LPCSTR pszSupervisorName, LPCSTR pszSupervisorPassword,
LPCSTR pszRatingsPassword, IUserProfileInit *pInit);
STDMETHODIMP AddUser(LPCSTR pszName, IUser *pSourceUser,
IUserProfileInit *pInit, IUser **ppOut);
STDMETHODIMP GetUser(LPCSTR pszName, IUser **ppOut);
STDMETHODIMP GetSpecialUser(DWORD nSpecialUserCode, IUser **ppOut);
STDMETHODIMP GetCurrentUser(IUser **ppOut);
STDMETHODIMP SetCurrentUser(IUser *pUser);
STDMETHODIMP DeleteUser(LPCSTR pszName);
STDMETHODIMP RenameUser(LPCSTR pszOldName, LPCSTR pszNewName);
STDMETHODIMP EnumUsers(IEnumUnknown **ppOut);
STDMETHODIMP Authenticate(HWND hwndOwner, DWORD dwFlags,
LPCSTR pszName, LPCSTR pszPassword,
IUser **ppOut);
STDMETHODIMP InstallComponent(REFCLSID clsidComponent, LPCSTR pszName,
DWORD dwFlags);
STDMETHODIMP RemoveComponent(REFCLSID clsidComponent, LPCSTR pszName);
STDMETHODIMP InstallWizard(HWND hwndParent);
STDMETHODIMP AddUserWizard(HWND hwndParent);
STDMETHODIMP UserCPL(HWND hwndParent);
};
class CLUUser : public IUser
{
friend class CLUDatabase;
friend class CLUEnum;
private:
NLS_STR m_nlsUsername;
NLS_STR m_nlsDir;
NLS_STR m_nlsPassword;
BOOL m_fAuthenticated;
BOOL m_fTempSupervisor;
HKEY m_hkeyDB;
HKEY m_hkeyUser;
BOOL m_fUserExists;
BOOL m_fAppearsSupervisor;
BOOL m_fLoadedProfile;
ULONG m_cRef;
CLUDatabase *m_pDB;
CLUUser(CLUDatabase *m_pDB);
~CLUUser();
HRESULT Init(LPCSTR pszUsername);
BOOL Exists() { return m_fUserExists; }
HRESULT GetSupervisorPassword(BUFFER *pbufPCE);
BOOL IsSystemCurrentUser(void);
public:
// *** IUnknown methods ***
STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
STDMETHODIMP GetName(LPSTR pbBuffer, LPDWORD pcbBuffer);
STDMETHODIMP GetProfileDirectory(LPSTR pbBuffer, LPDWORD pcbBuffer);
STDMETHODIMP IsSupervisor(void);
STDMETHODIMP SetSupervisorPrivilege(BOOL fMakeSupervisor, LPCSTR pszSupervisorPassword);
STDMETHODIMP MakeTempSupervisor(BOOL fMakeSupervisor, LPCSTR pszSupervisorPassword);
STDMETHODIMP AppearsSupervisor(void);
STDMETHODIMP Authenticate(LPCSTR pszPassword);
STDMETHODIMP ChangePassword(LPCSTR pszOldPassword, LPCSTR pszNewPassword);
STDMETHODIMP GetPasswordCache(LPCSTR pszPassword, LPHANDLE phOut);
STDMETHODIMP LoadProfile(HKEY *phkeyUser);
STDMETHODIMP UnloadProfile(HKEY hkeyUser);
STDMETHODIMP GetComponentSettings(REFCLSID clsidComponent,
LPCSTR pszName, IUnknown **ppOut,
DWORD fdwAccess);
STDMETHODIMP EnumerateComponentSettings(IEnumUnknown **ppOut,
DWORD fdwAccess);
};
class CLUEnum : public IEnumUnknown
{
friend class CLUDatabase;
private:
ULONG m_cRef;
HKEY m_hkeyDB;
LPSTR *m_papszNames;
UINT m_cNames;
UINT m_cAlloc;
UINT m_iCurrent;
CLUDatabase *m_pDB;
CLUEnum(CLUDatabase *m_pDB);
~CLUEnum();
HRESULT Init(void);
void Cleanup(void);
public:
STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
STDMETHODIMP Next(ULONG celt, IUnknown __RPC_FAR *__RPC_FAR *rgelt,
ULONG __RPC_FAR *pceltFetched);
STDMETHODIMP Skip(ULONG celt);
STDMETHODIMP Reset(void);
STDMETHODIMP Clone(IEnumUnknown __RPC_FAR *__RPC_FAR *ppenum);
};
#ifdef USER_SETTINGS_IMPLEMENTED
class CUserSettings : public IUserSettings
{
private:
ULONG m_cRef;
CLSID m_clsid;
NLS_STR m_nlsName;
HKEY m_hkey;
CUserSettings();
~CUserSettings();
public:
STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
STDMETHODIMP GetCLSID(CLSID *pclsidOut);
STDMETHODIMP GetName(LPSTR pbBuffer, LPDWORD pcbBuffer);
STDMETHODIMP GetDisplayName(LPSTR pbBuffer, LPDWORD pcbBuffer);
STDMETHODIMP QueryKey(HKEY *phkeyOut);
};
#endif
class CWizData : public IUserProfileInit
{
public:
HRESULT m_hresRatings; /* result of VerifySupervisorPassword("") */
BOOL m_fGoMultiWizard; /* TRUE if this is the big go-multiuser wizard */
NLS_STR m_nlsSupervisorPassword;
NLS_STR m_nlsUsername;
NLS_STR m_nlsUserPassword;
IUserDatabase *m_pDB;
IUser *m_pUserToClone;
int m_idPrevPage; /* ID of page before Finish */
UINT m_cRef;
DWORD m_fdwOriginalPerUserFolders;
DWORD m_fdwNewPerUserFolders;
DWORD m_fdwCloneFromDefault;
BOOL m_fCreatingProfile;
IUser *m_pNewUser;
BOOL m_fChannelHack;
CWizData();
~CWizData();
// *** IUnknown methods ***
STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
STDMETHODIMP PreInitProfile(HKEY hkeyUser, LPCSTR pszProfileDir);
STDMETHODIMP PostInitProfile(HKEY hkeyUser, LPCSTR pszProfileDir);
};
void InitFolderCheckboxes(HWND hDlg, CWizData *pwd);
void FinishChooseFolders(HWND hDlg, CWizData *pwd);
BOOL ProfileUIRestricted(void);
void ReportRestrictionError(HWND hwndOwner);
typedef HRESULT (*PFNPROGRESS)(LPARAM lParam);
HRESULT CallWithinProgressDialog(HWND hwndOwner, UINT idResource, PFNPROGRESS pfn,
LPARAM lParam);
HRESULT IsCurrentUserSupervisor(IUserDatabase *pDB);
/* NOTE: Keep the following flags in the same order as the corresponding
* entries in the folder descriptor table in msluwiz.cpp.
*/
const DWORD FOLDER_DESKTOP = 0x00000001;
const DWORD FOLDER_NETHOOD = 0x00000002;
const DWORD FOLDER_RECENT = 0x00000004;
const DWORD FOLDER_STARTMENU = 0x00000008;
const DWORD FOLDER_PROGRAMS = 0x00000010;
const DWORD FOLDER_STARTUP = 0x00000020;
const DWORD FOLDER_FAVORITES = 0x00000040;
const DWORD FOLDER_CACHE = 0x00000080;
const DWORD FOLDER_MYDOCS = 0x00000100;