Leaked source code of windows server 2003
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.
 
 
 
 
 
 

199 lines
6.2 KiB

#define OEMRESOURCE
#include <windows.h>
#include <windowsx.h>
#include <objidl.h>
#include <commctrl.h>
#include <comctrlp.h>
#include <regstr.h>
#include <shlobj.h>
#include <shellapi.h>
#include <advpub.h>
#define MAX_ENTRYNAME 256
#define WM_FINISHED (WM_USER + 0x123)
// taken from \\trango\slmadd\src\shell\inc\shellp.h
#define ARRAYSIZE(a) (sizeof(a)/sizeof(a[0]))
#define IsSpace(c) ((c) == ' ' || (c) == '\t' || (c) == '\r' || (c) == '\n' || (c) == '\v' || (c) == '\f')
#define IsDigit(c) ((c) >= '0' && (c) <= '9')
// Callback proc stuff for RunOnceExProcess
typedef VOID (*RUNONCEEXPROCESSCALLBACK)
(
int nCurrent,
int nMax,
LPSTR pszError
);
//////////////////////////////////////////////////////////////////
// TYPES:
//////////////////////////////////////////////////////////////////
typedef enum {
RRA_DEFAULT = 0x0000,
RRA_DELETE = 0x0001,
RRA_WAIT = 0x0002,
} RRA_FLAGS;
typedef enum {
RRAEX_NO_ERROR_DIALOGS = 0x0008,
RRAEX_ERRORFILE = 0x0010,
RRAEX_LOG_FILE = 0x0020,
RRAEX_NO_EXCEPTION_TRAPPING = 0x0040,
RRAEX_NO_STATUS_DIALOG = 0x0080,
RRAEX_IGNORE_REG_FLAGS = 0x0100,
RRAEX_CHECK_NT_ADMIN = 0x0200,
RRAEX_SHOW_SOFTBOOT_UI = 0x0400,
RRAEX_QUIT_IF_REBOOT_NEEDED = 0x0800,
RRAEX_BACKUP_SYSTEM_DAT = 0x1000,
#if 0
/****
RRAEX_DELETE_SYSTEM_IE4 = 0x2000,
****/
#endif
#if 0
/**** enable this when explorer.exe is fixed (bug #30866)
RRAEX_CREATE_REGFILE = 0x4000,
****/
#endif
} RRAEX_FLAGS;
typedef struct tagArgsInfo
{
HKEY hkeyParent;
LPCTSTR pszSubkey;
DWORD dwFlags;
HDPA hdpaSections;
int iNumberOfSections;
} ARGSINFO;
enum eRunOnceExAction
{
eRO_Unknown, // This indicates that we don't yet know the action
eRO_Register,
eRO_Unregister,
eRO_Install,
eRO_WinMainFunction,
eRO_Exe
};
//////////////////////////////////////////////////////////////////
// Class Definitions
//////////////////////////////////////////////////////////////////
/****************************************************\
CLASS: RunOnceExEntry
DESCRIPTION:
This class will contain one command that needs
to be executed.
\***************************************************/
class RunOnceExEntry
{
public:
// Member Variables
TCHAR m_szRunOnceExEntryName[MAX_ENTRYNAME];
TCHAR m_szFileName[MAX_PATH];
TCHAR m_szFunctionName[MAX_ENTRYNAME];
TCHAR m_szCmdLineArgs[MAX_PATH];
eRunOnceExAction m_ROAction;
// Member Functions
RunOnceExEntry(LPTSTR lpszNewEntryName, LPTSTR lpszNewCmd, DWORD dwFlags);
~RunOnceExEntry();
void Process(HKEY hkeyParent, LPCTSTR szSubkey, LPCTSTR szSectionName, DWORD dwFlags);
};
/****************************************************\
CLASS: RunOnceExSection
DESCRIPTION:
This class will contain one grouping of
commands that will need to be executed.
\***************************************************/
class RunOnceExSection
{
public:
// Member Variables
TCHAR m_szRunOnceExSectionName[MAX_ENTRYNAME];
TCHAR m_szDisplayName[MAX_ENTRYNAME];
HDPA m_hEntryArray;
int m_NumberOfEntries;
// Member Functions
RunOnceExSection(LPTSTR lpszNewSectionName, LPTSTR lpszNewDisplayName);
~RunOnceExSection();
void Process(HKEY hkeyParent, LPCTSTR szSubkey, DWORD dwFlags);
};
INT_PTR CALLBACK DlgProcRunOnceEx(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
void ProcessSections(HKEY hkeyParent, LPCTSTR pszSubkey, DWORD dwFlags, HDPA hdpaSections, int iNumberOfSections, HWND hWnd);
extern const TCHAR *g_c_szTitleRegValue;
extern TCHAR g_szTitleString[256];
extern BOOL g_bRunningOnNT;
extern HINSTANCE g_hinst;
extern HANDLE g_hHeap;
extern HANDLE g_hLogFile;
extern RUNONCEEXPROCESSCALLBACK g_pCallbackProc;
// internal functions defined in utils.cpp
void AddPath(LPTSTR szPath, LPCTSTR szName);
BOOL GetParentDir(LPTSTR szPath);
BOOL RunningOnIE4();
DWORD MsgWaitForMultipleObjectsLoop(HANDLE hEvent, DWORD dwTimeout);
void LogOff(BOOL bRestart);
void ReportError(DWORD dwFlags, UINT uiResourceNum, ...);
long AtoL(const char *nptr);
#ifdef UNICODE
#define LocalStrChr LocalStrChrW
#define LocalSHDeleteKey LocalSHDeleteKeyW
#define LocalSHDeleteValue LocalSHDeleteValueW
#else
#define LocalStrChr LocalStrChrA
#define LocalSHDeleteKey LocalSHDeleteKeyA
#define LocalSHDeleteValue LocalSHDeleteValueA
#endif
// following copied from \\trango\slmadd\src\shell\shlwapi\path.c
STDAPI_(LPTSTR) LocalPathGetArgs(LPCTSTR pszPath);
STDAPI_(void) LocalPathUnquoteSpaces(LPTSTR lpsz);
// following copied from \\trango\slmadd\src\shell\shlwapi\strings.c
#ifdef UNICODE
LPWSTR FAR PASCAL LocalStrChrW(LPCWSTR lpStart, WORD wMatch);
__inline BOOL ChrCmpW_inline(WORD w1, WORD wMatch);
#else
LPSTR FAR PASCAL LocalStrChrA(LPCSTR lpStart, WORD wMatch);
__inline BOOL ChrCmpA_inline(WORD w1, WORD wMatch);
#endif
// following copied from \\trango\slmadd\src\shell\shlwapi\reg.c
#ifdef UNICODE
STDAPI_(DWORD) LocalSHDeleteKeyW(HKEY hkey, LPCWSTR pwszSubKey);
#else
STDAPI_(DWORD) LocalSHDeleteKeyA(HKEY hkey, LPCSTR pszSubKey);
#endif
DWORD DeleteKeyRecursively(HKEY hkey, LPCSTR pszSubKey);
#ifdef UNICODE
STDAPI_(DWORD) LocalSHDeleteValueW(HKEY hkey, LPCWSTR pwszSubKey, LPCWSTR pwszValue);
#endif
STDAPI_(DWORD) LocalSHDeleteValueA(HKEY hkey, LPCSTR pszSubKey, LPCSTR pszValue);
// related to logging
LPTSTR GetLogFileName(LPCTSTR pcszLogFileKeyName, LPTSTR pszLogFileName, DWORD dwSizeInChars);
VOID StartLogging(LPCTSTR pcszLogFileName, DWORD dwCreationFlags);
VOID WriteToLog(LPCTSTR pcszFormatString, ...);
VOID StopLogging();
VOID LogDateAndTime();
VOID LogFlags(DWORD dwFlags);