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.
 
 
 
 
 
 

448 lines
20 KiB

#ifndef _IEAKUTIL_H_
#define _IEAKUTIL_H_
#include <delayimp.h>
#include "dload.h"
#include "debug.h"
/////////////////////////////////////////////////////////////////////////////
// Required definitions in the final project
extern TCHAR g_szModule[];
extern HANDLE g_hBaseDllHandle;
extern const DLOAD_DLL_MAP g_DllMap;
/////////////////////////////////////////////////////////////////////////////
// Macros
#ifndef ARRAYSIZE
#define ARRAYSIZE(a) (sizeof(a)/sizeof(a[0]))
#endif
#ifndef countof
#define countof ARRAYSIZE
#endif
#define IE3_VERSION 1086
/////////////////////////////////////////////////////////////////////////////
// Classes
#include "newcur.h"
#include "logitem.h"
#include "regins.h"
/////////////////////////////////////////////////////////////////////////////
// Unicode wrappers
#include "unicwrap.h"
/////////////////////////////////////////////////////////////////////////////
// Functions
//----- Dialog Controls Routines -----
#define EnableDBCSChars(hDlg, iCtrlID) (InitSysFont((hDlg), (iCtrlID)))
#define DisableDBCSChars(hDlg, iCtrlID) (ImmAssociateContext(GetDlgItem((hDlg), (iCtrlID)), NULL))
void InitSysFont(HWND hDlg, int iCtrlID);
UINT GetRadioButton(HWND hDlg, UINT idFirst, UINT idLast);
#define EnableDlgItem(hDlg, idCtrl) (EnableWindow(GetDlgItem((hDlg), (idCtrl)), TRUE))
#define ShowDlgItem(hDlg, idCtrl) (ShowWindow(GetDlgItem((hDlg), (idCtrl)), SW_SHOW))
#define EnableDlgItem2(hDlg, idCtrl, fEnable) (EnableWindow(GetDlgItem((hDlg), (idCtrl)), (fEnable)))
#define ShowDlgItem2(hDlg, idCtrl, fShow) (ShowWindow(GetDlgItem((hDlg), (idCtrl)), (fShow) ? SW_SHOW : SW_HIDE))
#define DisableDlgItem(hDlg, idCtrl) (EnableWindow(GetDlgItem((hDlg), (idCtrl)), FALSE))
#define HideDlgItem(hDlg, idCtrl) (ShowWindow(GetDlgItem((hDlg), (idCtrl)), SW_HIDE))
BOOL EnableDlgItems(HWND hDlg, const PINT pidCtrls, UINT cidCtrls, BOOL fEnable = TRUE);
#define DisableDlgItems(hDlg, pidCtrls, cidCtrls) (EnableDlgItems((hDlg), (pidCtrls), (cidCtrls), FALSE))
#define IsDlgItemEnabled(hDlg, idCtrl) (IsWindowEnabled(GetDlgItem((hDlg), (idCtrl))))
#define GetDlgItemTextLength(hDlg, idCtrl) (GetWindowTextLength(GetDlgItem((hDlg), (idCtrl))))
BOOL SetDlgItemFocus(HWND hDlg, int iCtrlID, BOOL fUsePropertySheet = FALSE);
BOOL EnsureDialogFocus(HWND hDlg, int idFocus, int idBackup, BOOL fUsePropertySheet = FALSE);
BOOL EnsureDialogFocus(HWND hDlg, const PINT pidFocus, UINT cidFocus, int idBackup, BOOL fUsePropertySheet = FALSE);
void SetDlgItemTextTriState(HWND hDlg, int nIDDlgText, int nIDDlgCheck, PCTSTR pszString, BOOL fChecked);
BOOL GetDlgItemTextTriState(HWND hDlg, int nIDDlgText, int nIDDlgCheck, PTSTR pszString, int nMaxCount);
#define TS_CHECK_OK 1
#define TS_CHECK_ERROR 2
#define TS_CHECK_SKIP 3
void IsTriStateValid(HWND hDlg, int nIDDlgText, int nIDDlgCheck, PINT pnStatus, PCTSTR pszErrMsg, PCTSTR pszTitle);
//----- String Routines -----
int StrPrepend(PTSTR pszSource, UINT cchSource, PCTSTR pszAdd, UINT cchAdd = 0);
#define StrRemoveWhitespace(pszSrc) (StrTrim((pszSrc), TEXT(" \t\r\n")))
void StrRemoveAllWhiteSpace(PTSTR pszBuf);
#define StrLenA(pszSrcA) (lstrlenA(pszSrcA))
#define StrLenW(pszSrcW) (lstrlenW(pszSrcW))
#define StrLenUAW(pszSrcUAW) (ualstrlenW(pszSrcUAW))
#define StrCbFromCchA(cchSrc) (cchSrc)
#define StrCbFromCchW(cchSrc) ((cchSrc) * sizeof(WCHAR))
#define StrCchFromCbA(cbSrc) (cbSrc)
#define StrCchFromCbW(cbSrc) (GetUnitsFromCb(cbSrc, sizeof(WCHAR)))
#define StrCbFromSzA(pszSrcA) ((pszSrcA) != NULL ? StrCbFromCchA(StrLenA(pszSrcA) + 1) : 0)
#define StrCbFromSzW(pszSrcW) ((pszSrcW) != NULL ? StrCbFromCchW(StrLenW(pszSrcW) + 1) : 0)
#define StrCbFromSzUAW(pszSrcUAW) ((pszSrcUAW) != NULL ? StrCbFromCchW(StrLenUAW(pszSrcUAW) + 1) : 0)
#ifdef _UNICODE
#define StrLen StrLenW
#define StrCbFromCch StrCbFromCchW
#define StrCbFromSz StrCbFromSzW
#define StrCchFromCb StrCchFromCbW
#define StrCbFromSzUA StrCbFromSzUAW
#else
#define StrLen StrLenA
#define StrCbFromCch StrCbFromCchA
#define StrCbFromSz StrCbFromSzA
#define StrCchFromCb StrCchFromCbA
#define StrCbFromSzUA StrCbFromSzA
#endif
#define REMOVE_QUOTES 0x01
#define IGNORE_QUOTES 0x02
PTSTR StrGetNextField(PTSTR *ppszData, PCTSTR pcszDelims, DWORD dwFlags);
PTSTR WINAPIV FormatString(PCTSTR pcszFormatString, ...);
#define ISNULL(sz) ((*(sz)) == TEXT('\0'))
#define ISNONNULL(sz) ((*(sz)) != TEXT('\0'))
//----- String Conversion Routines -----
PWSTR StrAnsiToUnicode(PWSTR pszTarget, PCSTR pszSource, UINT cchTarget = 0);
PSTR StrUnicodeToAnsi(PSTR pszTarget, PCWSTR pszSource, UINT cchTarget = 0);
PTSTR StrSameToSame (PTSTR pszTarget, PCTSTR pszSource, UINT cchTarget = 0);
#ifndef ATLA2WHELPER
#define ATLA2WHELPER StrAnsiToUnicode
#define ATLW2AHELPER StrUnicodeToAnsi
#include <atlconv.h>
#endif
#if (_ATL_VER != 0x0202)
#pragma message("WARNING: (andrewgu) _ATL_VER changed! please update this file.")
#endif
#ifdef USES_CONVERSION
#undef USES_CONVERSION
#endif
#define USES_CONVERSION int _convert; _convert = 0
#define A2Wbuf(pszSource, pszTarget, cchTarget) StrAnsiToUnicode((pszTarget), (pszSource), (cchTarget))
#define A2Wbux(pszSource, pszTarget) StrAnsiToUnicode((pszTarget), (pszSource))
#define W2Abuf(pszSource, pszTarget, cchTarget) StrUnicodeToAnsi((pszTarget), (pszSource), (cchTarget))
#define W2Abux(pszSource, pszTarget) StrUnicodeToAnsi((pszTarget), (pszSource))
#ifdef _UNICODE
#define T2Abuf W2Abuf
#define T2Abux W2Abux
#define A2Tbuf A2Wbuf
#define A2Tbux A2Wbux
#define T2Wbuf(pszSource, pszTarget, cchTarget) StrSameToSame((pszTarget), (pszSource), (cchTarget))
#define T2Wbux(pszSource, pszTarget) StrSameToSame((pszTarget), (pszSource))
#define W2Tbuf(pszSource, pszTarget, cchTarget) StrSameToSame((pszTarget), (pszSource), (cchTarget))
#define W2Tbux(pszSource, pszTarget) StrSameToSame((pszTarget), (pszSource))
#else /* #ifndef _UNICODE */
#define T2Abuf(pszSource, pszTarget, cchTarget) StrSameToSame((pszTarget), (pszSource), (cchTarget))
#define T2Abux(pszSource, pszTarget) StrSameToSame((pszTarget), (pszSource))
#define A2Tbuf(pszSource, pszTarget, cchTarget) StrSameToSame((pszTarget), (pszSource), (cchTarget))
#define A2Tbux(pszSource, pszTarget) StrSameToSame((pszTarget), (pszSource))
#define T2Wbuf A2Wbuf
#define T2Wbux A2Wbux
#define W2Tbuf W2Abuf
#define W2Tbux W2Abux
#endif /* #ifdef _UNICODE */
//----- Path Routines -----
BOOL PathCreatePath(PCTSTR pszPathToCreate);
#define PIVP_DEFAULT 0x00000000
#define PIVP_FILENAME_ONLY 0x00000001
#define PIVP_RELATIVE_VALID 0x00000002
#define PIVP_DBCS_INVALID 0x00000004
#define PIVP_0x5C_INVALID 0x00000008
#define PIVP_MUST_EXIST 0x00000010
#define PIVP_FILE_ONLY (PIVP_MUST_EXIST | 0x00000020)
#define PIVP_FOLDER_ONLY (PIVP_MUST_EXIST | 0x00000040)
#define PIVP_EXCHAR_INVALID (PIVP_DBCS_INVALID | 0x00000080)
BOOL PathIsValidPath(PCTSTR pszPath, DWORD dwFlags = PIVP_DEFAULT);
BOOL PathIsValidFile(PCTSTR pszFile, DWORD dwFlags = PIVP_DEFAULT);
#define PIVP_VALID 0x00000000 // the path is valid
#define PIVP_INVALID 0x80000000 // general flag for failure
#define PIVP_ARG 0x80000001 // invalid argument to the function
#define PIVP_CHAR 0x80000002 // invalid char
#define PIVP_WILD 0x80000004 // wildcard
#define PIVP_RELATIVE 0x80000008 // "\\foo" if PIVP_RELATIVE_VALID is not set
#define PIVP_FIRST_CHAR 0x80000010 // "<not '\\' | ' ' | not <LFN char>>\\foo"
#define PIVP_PRESLASH 0x80000020 // char in front of '\\' is invalid
#define PIVP_SPACE 0x80000040 // "bar \\foo"
#define PIVP_FWDSLASH 0x80000080 // '/' encountered
#define PIVP_COLON 0x80000100 // ':' in other than "c:" position
#define PIVP_DRIVE 0x80000200 // invalid drive letter
#define PIVP_SEPARATOR 0x80000400 // invalid separator, should never happen
#define PIVP_DBCS 0x80000800 // DBCS encountered when PIVP_DBCS_INVALID is set
#define PIVP_0x5C 0x80001000 // 0x5C encountered when PIVP_0x5C_INVALID is set
#define PIVP_DOESNT_EXIST 0x80002000 // the path or file doesn't exist
#define PIVP_NOT_FILE 0x80004000 // not a file when PIVP_FILE_ONLY is set
#define PIVP_NOT_FOLDER 0x80008000 // not a folder when PIVP_FOLDER_ONLY is set
#define PIVP_EXCHAR 0x80010000 // extended char encountered when PIVP_EXCHAR_INVALID is set
DWORD PathIsValidPathEx(PCTSTR pszPath, DWORD dwFlags = PIVP_DEFAULT, PCTSTR *ppszError = NULL);
#define PEP_DEFAULT 0x00000000
#define PEP_SCPE_DEFAULT 0x00000000
#define PEP_SCPE_NOFILES 0x00000001
#define PEP_SCPE_NOFOLDERS 0x00000002
#define PEP_SCPE_ALL 0x00000003
#define PEP_CTRL_DEFAULT 0x00000000
#define PEP_CTRL_ENUMPROCFIRST 0x00000010
#define PEP_CTRL_NOSECONDCALL 0x00000020
#define PEP_CTRL_USECONTROL 0x00000040
#define PEP_CTRL_RESET 0x00000080
#define PEP_CTRL_KEEPAPPLY 0x00000100
#define PEP_CTRL_ALL 0x000001F0
#define PEP_RCRS_DEFAULT 0x00000000
#define PEP_RCRS_FALSE 0x00010000
#define PEP_RCRS_CONTINUE 0x00020000
#define PEP_RCRS_CONTINUE_FALSE 0x00040000
#define PEP_RCRS_FAILED 0x00080000
#define PEP_RCRS_ALL 0x000F0000
#define PEP_S_CONTINUE ((HRESULT)0x00000002L)
#define PEP_S_CONTINUE_FALSE ((HRESULT)0x00000003L)
#define PEP_ENUM_INPOS_FIRST 0
#define PEP_ENUM_INPOS_FLAGS 0
#define PEP_ENUM_INPOS_RECOURSEFLAGS 1
#define PEP_ENUM_INPOS_LAST 2
#define PEP_ENUM_OUTPOS_FIRST 0
#define PEP_ENUM_OUTPOS_SECONDCALL 0
#define PEP_ENUM_OUTPOS_BELOW 1
#define PEP_ENUM_OUTPOS_THISLEVEL 2
#define PEP_ENUM_OUTPOS_ABOVE_SIBLINGS 3
#define PEP_ENUM_OUTPOS_ABOVE 4
#define PEP_ENUM_OUTPOS_LAST 5
#define PEP_RCRS_OUTPOS_FIRST 0
#define PEP_RCRS_OUTPOS_SECONDCALL 0
#define PEP_RCRS_OUTPOS_BELOW 1
#define PEP_RCRS_OUTPOS_THISLEVEL 2
#define PEP_RCRS_OUTPOS_LAST 3
typedef HRESULT (*PFNPATHENUMPATHPROC)(PCTSTR pszPath, PWIN32_FIND_DATA pfd, LPARAM lParam,
PDWORD *prgdwControl /*= NULL*/);
HRESULT PathEnumeratePath(PCTSTR pszPath, DWORD dwFlags, PFNPATHENUMPATHPROC pfnEnumProc, LPARAM lParam,
PDWORD *ppdwReserved = NULL);
BOOL PathRemovePath(PCTSTR pcszPath, DWORD dwFlags = 0);
BOOL PathIsLocalPath(PCTSTR pszPath);
BOOL PathFileExistsInDir(PCTSTR pcszFile, PCTSTR pcszDir);
BOOL PathHasBackslash(PCTSTR pcszPath);
#define PathIsExtension(pszFile, pszExt) (StrCmpI(PathFindExtension(pszFile), pszExt) == 0)
#define PathIsFullPath(pszFile) (StrCmpI(PathFindFileName(pszFile), pszFile) != 0)
#define PathIsFileURL(pszUrl) (StrCmpNI(pszUrl, FILEPREFIX, countof(FILEPREFIX)-1) == 0)
#define PathIsFileOrFileURL(pszUrl) (PathFileExists(pszUrl) || PathIsFileURL(pszUrl))
#define FILES_ONLY 0x00000001
#define FILES_AND_DIRS 0x00000002
BOOL PathIsEmptyPath(PCTSTR pcszPath, DWORD dwFlags = FILES_AND_DIRS, PCTSTR pcszExcludeFile = NULL);
void PathReplaceWithLDIDs(PTSTR pszPath);
//----- Registry Routines -----
#define SHCreateKey(hk, pszSubKey, sam, phkResult) \
(RegCreateKeyEx((hk), (pszSubKey), 0, NULL, REG_OPTION_NON_VOLATILE, (sam), NULL, (phkResult), NULL))
#define SHCreateKeyHKCR(pszSubKey, sam, phkResult) \
(SHCreateKey(HKEY_CLASSES_ROOT, pszSubKey, sam, phkResult))
#define SHCreateKeyHKCC(pszSubKey, sam, phkResult) \
(SHCreateKey(HKEY_CURRENT_CONFIG, pszSubKey, sam, phkResult))
#define SHCreateKeyHKLM(pszSubKey, sam, phkResult) \
(SHCreateKey(HKEY_LOCAL_MACHINE, pszSubKey, sam, phkResult))
#define SHCreateKeyHKCU(pszSubKey, sam, phkResult) \
(SHCreateKey(HKEY_CURRENT_USER, pszSubKey, sam, phkResult))
#define SHCreateKeyHKU(pszSubKey, sam, phkResult) \
(SHCreateKey(HKEY_USERS, pszSubKey, sam, phkResult))
#define SHOpenKey(hk, pszSubKey, sam, phkResult) \
(RegOpenKeyEx((hk), (pszSubKey), 0, (sam), (phkResult)))
#define SHOpenKeyHKCR(pszSubKey, sam, phkResult) \
(SHOpenKey(HKEY_CLASSES_ROOT, pszSubKey, sam, phkResult))
#define SHOpenKeyHKCC(pszSubKey, sam, phkResult) \
(SHOpenKey(HKEY_CURRENT_CONFIG, pszSubKey, sam, phkResult))
#define SHOpenKeyHKLM(pszSubKey, sam, phkResult) \
(SHOpenKey(HKEY_LOCAL_MACHINE, pszSubKey, sam, phkResult))
#define SHOpenKeyHKCU(pszSubKey, sam, phkResult) \
(SHOpenKey(HKEY_CURRENT_USER, pszSubKey, sam, phkResult))
#define SHOpenKeyHKU(pszSubKey, sam, phkResult) \
(SHOpenKey(HKEY_USERS, pszSubKey, sam, phkResult))
HRESULT SHCleanUpValue(HKEY hk, PCTSTR pszKey, PCTSTR pszValue = NULL);
void SHCopyKey (HKEY hkFrom, HKEY hkTo);
HRESULT SHCopyValue (HKEY hkFrom, HKEY hkTo, PCTSTR pszValue);
HRESULT SHCopyValue (HKEY hkFrom, PCTSTR pszSubkeyFrom, HKEY hkTo, PCTSTR pszSubkeyTo, PCTSTR pszValue);
HRESULT SHIsKeyEmpty (HKEY hk);
HRESULT SHIsKeyEmpty (HKEY hk, PCTSTR pszSubKey);
HRESULT SHKeyExists (HKEY hk, PCTSTR pszSubKey);
HRESULT SHValueExists (HKEY hk, PCTSTR pszValue);
HRESULT SHValueExists (HKEY hk, PCTSTR pszSubKey, PCTSTR pszValue);
DWORD RegSaveRestoreDWORD(HKEY hk, PCTSTR pszValue, DWORD dwValue);
#define SHCloseKey(hk) \
if ((hk) != NULL) { RegCloseKey((hk)); (hk) = NULL; } else
//----- Advanced File Manipulation Routines -----
#define CopyFileToDir(pszFile, pszDir) (CopyFileToDirEx((pszFile), (pszDir), NULL, NULL))
BOOL CopyFileToDirEx(PCTSTR pszSourceFileOrPath, PCTSTR pszTargetPath, PCTSTR pszSection = NULL, PCTSTR pszIns = NULL);
BOOL AppendFile(PCTSTR pcszSrcFile, PCTSTR pcszDstFile);
#define CopyHtmlImgs(pszHtmlFile, pszDestPath, pszSectionName, pszInsFile) \
(CopyHtmlImgsEx((pszHtmlFile), (pszDestPath), (pszSectionName), (pszInsFile), TRUE))
#define DeleteHtmlImgs(pszHtmlFile, pszDestPath, pszSectionName, pszInsFile) \
(CopyHtmlImgsEx((pszHtmlFile), (pszDestPath), (pszSectionName), (pszInsFile), FALSE))
void CopyHtmlImgsEx(PCTSTR pszHtmlFile, PCTSTR pszDestPath, PCTSTR pszSectionName, PCTSTR pszInsFile, BOOL fCopy);
HANDLE CreateNewFile(PCTSTR pcszFileToCreate);
DWORD FileSize(PCTSTR pcszFile);
BOOL DeleteFileInDir(PCTSTR pszFileName, PCTSTR pszPath);
#define CloseFile(h) CloseHandle(h)
#define GetFilePointer(hFile) SetFilePointer((hFile), 0, NULL, FILE_CURRENT)
void SetAttribAllEx(PCTSTR pcszDir, PCTSTR pcszFile, DWORD dwAtr, BOOL fRecurse);
DWORD GetNumberOfFiles(PCTSTR pcszFileName, PCTSTR pcszDir);
BOOL GetFreeDiskSpace (PCTSTR pcszDir, PDWORD pdwFreeSpace, PDWORD pdwFlags);
DWORD FindSpaceRequired(PCTSTR pcszSrcDir, PCTSTR pcszFile, PCTSTR pcszDstDir);
BOOL WriteStringToFileA (HANDLE hFile, LPCVOID pbBuf, DWORD cchSize);
BOOL WriteStringToFileW (HANDLE hFile, LPCVOID pbBuf, DWORD cchSize);
BOOL ReadStringFromFileA(HANDLE hFile, LPVOID pbBuf, DWORD cchSize);
BOOL ReadStringFromFileW(HANDLE hFile, LPVOID pbBuf, DWORD cchSize);
#ifdef _UNICODE
#define WriteStringToFile WriteStringToFileW
#define ReadStringFromFile ReadStringFromFileW
#else
#define WriteStringToFile WriteStringToFileA
#define ReadStringFromFile ReadStringFromFileA
#endif
BOOL HasFileAttribute(DWORD dwFileAttrib, PCTSTR pcszFile, PCTSTR pcszDir = NULL);
inline BOOL IsFileReadOnly(PCTSTR pcszFile, PCTSTR pcszDir = NULL)
{
return HasFileAttribute(FILE_ATTRIBUTE_READONLY, pcszFile, pcszDir);
}
BOOL IsFileCreatable(PCTSTR pcszFile);
//----- Settings File Routines -----
#define InsGetBool(pszSection, pszKey, fDefault, pszIns) \
(GetPrivateProfileInt((pszSection), (pszKey), (fDefault), (pszIns)) ? TRUE : FALSE)
#define InsGetInt(pszSection, pszKey, iDefault, pszIns) \
(GetPrivateProfileInt((pszSection), (pszKey), (iDefault), (pszIns)))
DWORD InsGetString(PCTSTR pszSection, PCTSTR pszKey, PTSTR pszValue, DWORD cchValue, PCTSTR pszIns,
PCTSTR pszServerFile = NULL, PBOOL pfChecked = NULL);
DWORD InsGetSubstString(PCTSTR pszSection, PCTSTR pszKey, PTSTR pszValue, DWORD cchValue, PCTSTR pszIns);
BOOL InsGetYesNo(PCTSTR pszSection, PCTSTR pszKey, BOOL fDefault, PCTSTR pszIns);
#define InsWriteBool(pszSection, pszKey, fValue, pszIns) \
(WritePrivateProfileString((pszSection), (pszKey), (fValue) ? TEXT("1") : NULL, (pszIns)))
#define InsWriteBoolEx(pszSection, pszKey, fDefault, pszIns) \
(WritePrivateProfileString((pszSection), (pszKey), (fDefault) ? TEXT("1") : TEXT("0"), (pszIns)))
void InsWriteInt(PCTSTR pszSection, PCTSTR pszKey, int iValue, PCTSTR pszIns);
void InsWriteString(PCTSTR pszSection, PCTSTR pszKey, PCTSTR pszValue, PCTSTR pszIns,
BOOL fChecked = TRUE, PCTSTR pszServerFile = NULL, DWORD dwFlags = 0);
int InsWriteQuotedString(PCTSTR pszSection, PCTSTR pszKey, PCTSTR pszValue, PCTSTR pszIns);
#define InsWriteYesNo(pszSection, pszKey, fValue, pszIns) \
(WritePrivateProfileString((pszSection), (pszKey), (fValue) ? TEXT("Yes") : TEXT("No"), (pszIns)))
#define InsDeleteSection(pszSection, pszIns) \
(WritePrivateProfileString((pszSection), NULL, NULL, (pszIns)))
#define InsDeleteKey(pszSection, pszKey, pszIns) \
(WritePrivateProfileString((pszSection), (pszKey), NULL, (pszIns)))
#define InsReadSections(pszSections, cchSections, pszIns) \
(GetPrivateProfileString(NULL, NULL, (pszSections), (cchSections), (pszIns)))
#define InsReadKeys(pszSection, pszKeys, cchKeys, pszIns) \
(GetPrivateProfileString((pszSection), NULL, (pszKeys), (cchKeys), (pszIns)))
#define InsFlushChanges(pszIns) \
(WritePrivateProfileString(NULL, NULL, NULL, (pszIns)))
BOOL InsIsSectionEmpty(PCTSTR pszSection, PCTSTR pszFile);
BOOL InsIsKeyEmpty(PCTSTR pszSection, PCTSTR pszKey, PCTSTR pszFile);
BOOL InsKeyExists (PCTSTR pszSection, PCTSTR pszKey, PCTSTR pszFile);
#define ReadBoolAndCheckButton(pszSection, pszKey, fDefault, pszIns, hDlg, idCtrl) \
(CheckDlgButton((hDlg), (idCtrl), InsGetBool((pszSection), (pszKey), (fDefault), (pszIns)) ? BST_CHECKED : BST_UNCHECKED))
#define CheckButtonAndWriteBool(hDlg, idCtrl, pszSection, pszKey, pszIns) \
(InsWriteBool((pszSection), (pszKey), BST_CHECKED == IsDlgButtonChecked((hDlg), (idCtrl)), (pszIns)))
#define INSIO_TRISTATE 0x00000001
#define INSIO_PATH 0x00000002
#define INSIO_SERVERONLY 0x00000004
void SetDlgItemTextFromIns(HWND hDlg, int idText, int idCheck,
PCTSTR pszSection, PCTSTR pszKey, PCTSTR pszIns,
PCTSTR pszServerFile, DWORD dwFlags);
void WriteDlgItemTextToIns(HWND hDlg, int idText, int idCheck,
PCTSTR pszSection, PCTSTR pszKey, PCTSTR pszIns,
PCTSTR pcszServerFile, DWORD dwFlags);
//----- Delay Load Failure Routine -----
FARPROC WINAPI DelayLoadFailureHook(UINT unReason, PDelayLoadInfo pDelayInfo);
//----- Miscellaneous -----
typedef struct tagMAPDW2PSZ {
DWORD dw;
PCTSTR psz;
} MAPDW2PSZ, *PMAPDW2PSZ;
typedef const MAPDW2PSZ *PCMAPDW2PSZ;
#define DW2PSZ_PAIR(dw) { ((DWORD)dw), TEXT(#dw) }
ULONG CoTaskMemSize(PVOID pv);
UINT CoStringFromGUID(REFGUID rguid, PTSTR pszBuf, UINT cchBuf);
PCTSTR GetHrSz(HRESULT hr);
void ConvertVersionStrToDwords(PTSTR pszVer, PDWORD pdwVer, PDWORD pdwBuild);
void ConvertDwordsToVersionStr(PTSTR pszVer, DWORD dwVer, DWORD dwBuild);
DWORD GetIEVersion();
#define HasFlag(dwFlags, dwMask) (((DWORD)(dwFlags) & (DWORD)(dwMask)) != 0L)
BOOL SetFlag(PDWORD pdwFlags, DWORD dwMask, BOOL fSet = TRUE);
BOOL IsNTAdmin(VOID);
HRESULT GetLcid(LCID *pLcid, PCTSTR pcszLang, PCTSTR pcszLocaleIni);
UINT GetUnitsFromCb(UINT cbSrc, UINT cbUnit);
#endif