//********************************************************************* //* 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 #include #include #include #include #include ////////////////////////////////////////////////////////////////////////////// // // 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(); BOOL InDsRestoreMode(); // 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(); DWORD MyGetModuleFileName ( IN HMODULE Module, OUT PTSTR Buffer, IN DWORD BufferLength ); // 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 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(static_cast(ppType)) #define IID_X_PPV_ARG(IType, X, ppType) IID_##IType, X, reinterpret_cast(static_cast(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_