windows-nt/Source/XPSP1/NT/base/ntsetup/oobe/inc/util.h
2020-09-26 16:20:57 +08:00

260 lines
7.4 KiB
C++

//*********************************************************************
//* Microsoft Windows **
//* Copyright(c) Microsoft Corp., 1999 **
//*********************************************************************
//
// UTIL.H - utilities
//
// HISTORY:
//
// 1/27/99 a-jaswed Created.
//
// Common utilities for printing out messages
#ifndef _UTIL_H_
#define _UTIL_H_
#include <assert.h>
#include <tchar.h>
#include <windows.h>
#include <ole2.h>
#include <setupapi.h>
#include <syssetup.h>
//////////////////////////////////////////////////////////////////////////////
//
// System boot mode
//
// Constants for values returned by GetSystemMetrics(SM_CLEANBOOT)
//
#define BOOT_CLEAN 0
#define BOOT_SAFEMODE 1
#define BOOT_SAFEMODEWITHNET 2
BOOL InSafeMode();
// Displays a message box with an error string in it.
void ErrorMessage(LPCWSTR str, HRESULT hr) ;
// Determine if two interfaces below to the same component.
BOOL InterfacesAreOnSameComponent(IUnknown* pI1, IUnknown* pI2) ;
bool GetOOBEPath(LPWSTR szOOBEPath);
bool GetOOBEMUIPath(LPWSTR szOOBEPath);
// Displays messages using OutputDebugString
void __cdecl MyTrace(LPCWSTR lpszFormat, ...);
// Determine if an address is accessable.
BOOL IsValidAddress(const void* lp, UINT nBytes = 1, BOOL bReadWrite = FALSE) ;
bool GetCanonicalizedPath(LPWSTR szCompletePath, LPCWSTR szFileName);
bool GetString(HINSTANCE hInstance, UINT uiID, LPWSTR szString, UINT uiStringLen = MAX_PATH);
HRESULT GetINIKey(HINSTANCE hInstance, LPCWSTR szINIFileName, UINT uiSectionName, UINT uiKeyName, LPVARIANT pvResult);
HRESULT GetINIKeyBSTR(HINSTANCE hInstance, LPCWSTR szINIFileName, UINT uiSectionName, UINT uiKeyName, LPVARIANT pvResult);
HRESULT GetINIKeyUINT(HINSTANCE hInstance, LPCWSTR szINIFileName, UINT uiSectionName, UINT uiKeyName, LPVARIANT pvResult);
HRESULT SetINIKey(HINSTANCE hInstance, LPCWSTR szINIFileName, UINT uiSectionName, UINT uiKeyName, LPVARIANT pvResult);
void WINAPI URLEncode(WCHAR* pszUrl, size_t bsize);
void WINAPI URLAppendQueryPair
(
LPWSTR lpszQuery,
LPWSTR lpszName,
LPWSTR lpszValue
);
void GetCmdLineToken(LPWSTR *ppszCmd, LPWSTR pszOut);
VOID PumpMessageQueue( );
BOOL IsOEMDebugMode();
BOOL IsThreadActive(HANDLE hThread);
void GetDesktopDirectory(WCHAR* pszPath);
void RemoveDesktopShortCut(LPWSTR lpszShortcutName);
BOOL InvokeExternalApplication(
IN PCWSTR ApplicationName, OPTIONAL
IN PCWSTR CommandLine,
IN OUT PDWORD ExitCode OPTIONAL
);
BOOL SignalComputerNameChangeComplete();
BOOL IsUserAdmin(VOID);
typedef struct tagSTRINGLIST {
struct tagSTRINGLIST* Next;
PTSTR String;
} STRINGLIST, *PSTRINGLIST;
PSTRINGLIST
CreateStringCell(
IN PCTSTR String
);
VOID
DeleteStringCell(
IN PSTRINGLIST Cell
);
BOOL
InsertList(
IN OUT PSTRINGLIST* List,
IN PSTRINGLIST NewList
);
VOID
DestroyList(
IN PSTRINGLIST List
);
BOOL
RemoveListI(
IN OUT PSTRINGLIST* List,
IN PCTSTR String
);
BOOL
ExistInListI(
IN PSTRINGLIST List,
IN PCTSTR String
);
BOOL IsDriveNTFS(IN TCHAR Drive);
BOOL
HasTablet();
// Determine if interface pointer is accessable.
inline BOOL IsValidInterface(IUnknown* p)
{
return (p != NULL) && IsValidAddress(p, sizeof(IUnknown*), FALSE) ;
}
// Determine if the out parameter for an interface pointer is accessable.
template <class T>
inline BOOL IsValidInterfaceOutParam(T** p)
{
return (p != NULL) && IsValidAddress(p, sizeof(IUnknown*), TRUE) ;
}
inline VARIANT_BOOL Bool2VarBool(BOOL b)
{
return (b) ? -1 : 0;
}
inline BOOL VarBool2Bool(VARIANT_BOOL b)
{
return (0 == b) ? 0 : 1;
}
///////////////////////////////////////////////////////////
// Diagnostic support
//
#if defined(DBG) && !defined(ASSERTS_ON)
#define ASSERTS_ON 1
#endif
#if ASSERTS_ON
VOID
AssertFail(
IN PSTR FileName,
IN UINT LineNumber,
IN PSTR Condition
);
#define MYASSERT(x) if(!(x)) { AssertFail(__FILE__,__LINE__,#x); }
#define VERIFY(x) MYASSERT(x)
#else
#define MYASSERT(x)
#define VERIFY(f) ((void)(f))
#endif
// Helper function for checking HRESULTs.
#ifdef DBG
inline void CheckResult(HRESULT hr)
{
if (FAILED(hr))
{
ErrorMessage(NULL, hr) ;
assert(FAILED(hr)) ;
}
}
#define ASSERT_HRESULT CheckResult
#else
#define ASSERT_HRESULT
#endif
///////////////////////////////////////////////////////////
//
// More Diagnostic support which mimics MFC
//
#ifndef __AFX_H__ // Only define these if MFC has not already been included
#define TRACE(_fmt_) \
pSetupDebugPrint(TEXT(__FILE__),__LINE__,NULL,_fmt_)
#define TRACE1(_fmt_,_arg1_) \
pSetupDebugPrint(TEXT(__FILE__),__LINE__,NULL,_fmt_,_arg1_)
#define TRACE2(_fmt_,_arg1_,_arg2_) \
pSetupDebugPrint(TEXT(__FILE__),__LINE__,NULL,_fmt_,_arg1_,_arg2_)
#define TRACE3(_fmt_,_arg1_,_arg2_,_arg3_) \
pSetupDebugPrint(TEXT(__FILE__),__LINE__,NULL,_fmt_,_arg1_,_arg2_,_arg3_)
#define TRACE4(_fmt_,_arg1_,_arg2_,_arg3_,_arg4_) \
pSetupDebugPrint(TEXT(__FILE__),__LINE__,NULL,_fmt_,_arg1_,_arg2_,_arg3_,_arg4_)
#define TRACE5(_fmt_,_arg1_,_arg2_,_arg3_,_arg4_,_arg5_) \
pSetupDebugPrint(TEXT(__FILE__),__LINE__,NULL,_fmt_,_arg1_,_arg2_,_arg3_,_arg4_,_arg5_)
#define TRACE6(_fmt_,_arg1_,_arg2_,_arg3_,_arg4_,_arg5_,_arg6_) \
pSetupDebugPrint(TEXT(__FILE__),__LINE__,NULL,_fmt_,_arg1_,_arg2_,_arg3_,_arg4_,_arg5_,_arg6_)
#define ASSERT_POINTER(p, type) \
MYASSERT(((p) != NULL) && IsValidAddress((p), sizeof(type), FALSE))
#define ASSERT_NULL_OR_POINTER(p, type) \
MYASSERT(((p) == NULL) || IsValidAddress((p), sizeof(type), FALSE))
#endif // TRACE
//////////////////////////////////////////////////////////////////////////////
//
// macro for QueryInterface and related functions
// that require a IID and a (void **)
// this will insure that the cast is safe and appropriate on C++
//
// IID_PPV_ARG(IType, ppType)
// IType is the type of pType
// ppType is the variable of type IType that will be filled
//
// RESULTS in: IID_IType, ppvType
// will create a compiler error if wrong level of indirection is used.
//
// Just like IID_PPV_ARG, except that it sticks a NULL between the
// IID and PPV (for IShellFolder::GetUIObjectOf).
//
// IID_PPV_ARG_NULL(IType, ppType)
//
#ifdef __cplusplus
#define IID_PPV_ARG(IType, ppType) IID_##IType, reinterpret_cast<void**>(static_cast<IType**>(ppType))
#define IID_X_PPV_ARG(IType, X, ppType) IID_##IType, X, reinterpret_cast<void**>(static_cast<IType**>(ppType))
#else
#define IID_PPV_ARG(IType, ppType) &IID_##IType, (void**)(ppType)
#define IID_X_PPV_ARG(IType, X, ppType) &IID_##IType, X, (void**)(ppType)
#endif
#define IID_PPV_ARG_NULL(IType, ppType) IID_X_PPV_ARG(IType, NULL, ppType)
//////////////////////////////////////////////////////////////////////////////
//
// Types of actions OOBE requires after shutdown. The type and amount of
// cleanup done by OOBE on exit are dependent on these. This includes
// notifying WinLogon of the necessity of reboot, deleting persistent data,
// and setting the keys in HKLM\System\Setup.
//
typedef enum _OOBE_SHUTDOWN_ACTION
{
SHUTDOWN_NOACTION,
SHUTDOWN_LOGON,
SHUTDOWN_REBOOT,
SHUTDOWN_POWERDOWN,
SHUTDOWN_MAX // this entry must always be last
} OOBE_SHUTDOWN_ACTION;
#endif // _UTIL_H_