// File: util.h // // Contents: Utility classes. // // Classes: CRefCount // // Functions:// // History: // //---------------------------------------------------------------------------- #ifndef _URLZONE_UTIL_H_ #define _URLZONE_UTIL_H_ // Declarations for global variables. extern BOOL g_bUseHKLMOnly; extern BOOL g_bInit; extern BOOL IsZonesInitialized(); extern HINSTANCE g_hInst; // Cache of drive letter to drive type. extern DWORD GetDriveTypeFromCacheA(LPCSTR psz); // Is this file under the Cache directory. extern BOOL IsFileInCacheDir(LPCWSTR pszFile); // Is this file under the Cookie directory. extern BOOL IsFileInCookieDir(LPCWSTR pszFile); // Is urlmon currently loaded in GUI-mode setup? extern BOOL IsInGUIModeSetup(); // Replacement for ultoa, works with wide-chars. extern BOOL DwToWchar (DWORD dw, LPWSTR lpwsz, int radix); #ifdef unix #undef offsetof #endif /* unix */ #define offsetof(s,m) ( (SIZE_T) &( ((s*)NULL)->m) ) #define GETPPARENT(pmemb, struc, membname) ((struc*)(((char*)(pmemb))-offsetof(struc, membname))) // Does this file bear the Mark of the Web extern BOOL FileBearsMarkOfTheWeb(LPCTSTR pszFile, LPWSTR *ppszURLMark); EXTERN_C HRESULT ZonesDllInstall(BOOL bInstall, LPCWSTR pwStr); ///////////////////////////////////////////////////////////////////////////// // CRegKey class CRegKey { public: CRegKey(BOOL bHKLMOnly); CRegKey(); ~CRegKey(); // Attributes public: operator HUSKEY() const; HUSKEY m_hKey; BOOL m_bHKLMOnly; // Operations public: LONG SetValue(DWORD dwValue, LPCTSTR lpszValueName); // DWORD LONG SetValue(LPCTSTR lpszValue, LPCTSTR lpszValueName = NULL); // STRING LONG SetBinaryValue(const BYTE *pb, LPCTSTR lpszValueName, DWORD dwCount); // BINARY LONG SetValueOfType(const BYTE *pb, LPCTSTR lpszValueName, DWORD dwCount, DWORD dwType); // ANY TYPE LONG QueryValue(DWORD* pdwValue, LPCTSTR lpszValueName); LONG QueryValue(LPTSTR szValue, LPCTSTR lpszValueName, DWORD* pdwCount); LONG QueryBinaryValue(LPBYTE pb, LPCTSTR lpszValueName, DWORD *pdwCount); LONG QueryValueOrWild (DWORD* pdwValue, LPCTSTR lpszValueName) { if (ERROR_SUCCESS == QueryValue (pdwValue, lpszValueName)) return ERROR_SUCCESS; else return QueryValue (pdwValue, TEXT("*")); } LONG SetKeyValue(LPCTSTR lpszKeyName, LPCTSTR lpszValue, LPCTSTR lpszValueName = NULL); static LONG WINAPI SetValue(HUSKEY hKeyParent, LPCTSTR lpszKeyName, LPCTSTR lpszValue, LPCTSTR lpszValueName = NULL, BOOL bHKLMOnly = FALSE); inline LONG QuerySubKeyInfo (DWORD* pdwNumKeys, DWORD* pdwMaxLen, DWORD *pdwNumValues); LONG EnumKey(DWORD dwIndex, LPTSTR lpszName, DWORD* pcchName); LONG EnumValue(DWORD dwIndex, LPTSTR pszValueName, LPDWORD pcchValueNameLen, LPDWORD pdwType, LPVOID pvData, LPDWORD pcbData); LONG Create( HUSKEY hKeyParent, // OPTIONAL LPCTSTR lpszKeyName, REGSAM samDesired); LONG Open( HUSKEY hKeyParent, // OPTIONAL LPCTSTR lpszKeyName, REGSAM samDesired); LONG Close(); HUSKEY Detach(); void Attach(HUSKEY hKey); LONG DeleteValue(LPCTSTR lpszValue); LONG DeleteEmptyKey(LPCTSTR pszSubKey); private: inline DWORD RegSetFlags() const { return m_bHKLMOnly ? SHREGSET_FORCE_HKLM : SHREGSET_FORCE_HKCU; } inline SHREGDEL_FLAGS RegDelFlags() const { return m_bHKLMOnly ? SHREGDEL_HKLM : SHREGDEL_HKCU; } inline SHREGENUM_FLAGS RegEnumFlags() const { return m_bHKLMOnly ? SHREGENUM_HKLM : SHREGENUM_DEFAULT; } }; inline CRegKey::CRegKey(BOOL bHKLMOnly) {m_hKey = NULL; m_bHKLMOnly = bHKLMOnly;} inline CRegKey::CRegKey() { TransAssert(g_bInit); m_bHKLMOnly = g_bUseHKLMOnly; m_hKey = NULL; } inline CRegKey::~CRegKey() {Close();} inline CRegKey::operator HUSKEY() const {return m_hKey;} inline LONG CRegKey::SetValue(DWORD dwValue, LPCTSTR lpszValueName) { TransAssert(m_hKey != NULL); return SHRegWriteUSValue(m_hKey, lpszValueName, REG_DWORD, (LPVOID)&dwValue, sizeof(DWORD), RegSetFlags()); } inline LONG CRegKey::SetValue(LPCTSTR lpszValue, LPCTSTR lpszValueName) { TransAssert(lpszValue != NULL); TransAssert(m_hKey != NULL); return SHRegWriteUSValue(m_hKey, lpszValueName, REG_SZ, (LPVOID)lpszValue, (lstrlen(lpszValue)+1)*sizeof(TCHAR), RegSetFlags()); } inline LONG CRegKey::SetBinaryValue(const BYTE *pb, LPCTSTR lpszValueName, DWORD dwCount) { TransAssert(pb != NULL); TransAssert(m_hKey != NULL); return SHRegWriteUSValue(m_hKey, lpszValueName, REG_BINARY, (LPVOID)pb, dwCount, RegSetFlags()); } inline LONG CRegKey::SetValueOfType(const BYTE *pb, LPCTSTR lpszValueName, DWORD dwCount, DWORD dwType) { TransAssert(pb != NULL); TransAssert(m_hKey != NULL); return SHRegWriteUSValue(m_hKey, lpszValueName, dwType, (LPVOID)pb, dwCount, RegSetFlags()); } inline LONG CRegKey::EnumKey(DWORD dwIndex, LPTSTR lpszName, LPDWORD pcchName) { TransAssert(pcchName != NULL); return SHRegEnumUSKey(m_hKey, dwIndex, lpszName, pcchName, RegEnumFlags()); } inline LONG CRegKey::EnumValue(DWORD dwIndex, LPTSTR pszValueName, LPDWORD pcchValueNameLen, LPDWORD pdwType, LPVOID pvData, LPDWORD pcbData) { // If these counts are all NULL, you will not get anything useful back. TransAssert(pcchValueNameLen != NULL || pdwType != NULL || pcbData != NULL); return SHRegEnumUSValue(m_hKey, dwIndex, pszValueName, pcchValueNameLen, pdwType, pvData, pcbData, RegEnumFlags()); } inline LONG CRegKey::QuerySubKeyInfo(DWORD *pdwNumKeys, DWORD *pdwMaxLen, DWORD *pdwNumValues) { return SHRegQueryInfoUSKey (m_hKey, pdwNumKeys, pdwMaxLen, pdwNumValues, NULL, RegEnumFlags()); } inline HUSKEY CRegKey::Detach() { HUSKEY hKey = m_hKey; m_hKey = NULL; return hKey; } inline void CRegKey::Attach(HUSKEY hKey) { TransAssert(m_hKey == NULL); m_hKey = hKey; } inline LONG CRegKey::DeleteValue(LPCTSTR lpszValue) { TransAssert(m_hKey != NULL); return SHRegDeleteUSValue(m_hKey, lpszValue, RegDelFlags()); } inline LONG CRegKey::DeleteEmptyKey(LPCTSTR pszSubKey) { TransAssert(m_hKey != NULL); return SHRegDeleteEmptyUSKey(m_hKey, pszSubKey, RegDelFlags()); } // Simple helper class to get an exclusive lock for the duration of a function. // WILL NOT BLOCK IF THE HANDLE PASSED IS NULL OR INVALID. class CExclusiveLock { public: CExclusiveLock(HANDLE hMutex); // pass in a handle to a mutex. ~CExclusiveLock(); private: HANDLE m_hMutex; BOOL fOk; }; inline CExclusiveLock::CExclusiveLock( HANDLE hMutex ) { fOk = FALSE; if ( hMutex ) { m_hMutex = hMutex; DWORD dw = WaitForSingleObject(hMutex, INFINITE); if ( (dw == WAIT_OBJECT_0) || (dw == WAIT_ABANDONED) ) { // fix IE bug 18152 fOk = TRUE; } else { TransAssert(FALSE); //shouldn't be anything else } } } inline CExclusiveLock::~CExclusiveLock( ) { if ( fOk ) { ReleaseMutex(m_hMutex); } } // Helper class to create a shared memory object to share between processes. class CSharedMem { public: CSharedMem() { m_hFileMapping = NULL; m_lpVoidShared = NULL ; m_dwSize = 0; }; ~CSharedMem( ) { Release( ); } BOOL Init(LPCSTR pszNamePrefix, DWORD dwSize); VOID Release( ); // Offset into the shared memory section. // Always check return value since this can return NULL. LPVOID GetPtr (DWORD dwOffset); private: HANDLE m_hFileMapping ; LPVOID m_lpVoidShared; DWORD m_dwSize; }; extern CSharedMem g_SharedMem; // Shared memory related constants #define SM_REGZONECHANGE_COUNTER 0 // Dword at offset 0 #define SM_SECMGRCHANGE_COUNTER 4 // Dword at offset 4 #define SM_SECTION_SIZE 8 // Total size of shared memory section. #define SM_SECTION_NAME "UrlZonesSM_" // registry key paths - absolute #define SZROOT TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\") #define SZZONES SZROOT TEXT("Zones\\") #define SZTEMPLATE SZROOT TEXT("TemplatePolicies\\") #define SZZONEMAP SZROOT TEXT("ZoneMap\\") #define SZCACHE SZROOT TEXT("Cache") #define SZPOLICIES TEXT("Software\\Policies\\Microsoft\\Windows\\CurrentVersion\\Internet Settings") #define SZHKLMONLY TEXT("Security_HKLM_only") // Entries to figure out if per user cache is allowed. #define SZLOGON TEXT("Network\\Logon") #define SZUSERPROFILES TEXT("UserProfiles") // Cache location if per user cache is allowed. #define SZSHELLFOLDER TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders") #define SZTIFS TEXT("Cache") // cache location if global #define SZCACHECONTENT SZROOT TEXT("Cache\\Content") #define SZCACHEPATH TEXT("CachePath") // registry key paths - relative to SZZONES #define SZZONESTANDARD TEXT("Standard\\") #define SZZONEUSERDEFINED TEXT("User-Defined\\") // registry key paths - relative to SZZONEMAP #define SZDOMAINS TEXT("Domains\\") #define SZHARDENEDDOMAINS TEXT("EscDomains\\") #define SZRANGES TEXT("Ranges\\") #define SZESCRANGES TEXT("EscRanges\\") #define SZPROTOCOLS TEXT("ProtocolDefaults\\") // registry value names #define SZINTRANETNAME TEXT("IntranetName") #define SZUNCASINTRANET TEXT("UNCAsIntranet") #define SZPROXYBYPASS TEXT("ProxyBypass") #define SZRANGE TEXT(":Range") #define SZRANGEPREFIX TEXT("Range") // Attributes to deal with "High", "Med", "Low" template policies #define SZMINLEVEL __TEXT("MinLevel") #define SZRECLEVEL __TEXT("RecommendedLevel") #define SZCURRLEVEL __TEXT("CurrentLevel") // registry key path for allowed activex controls list; relative to HKEY_LOCAL_MACHINE _or_ HKEY_CURRENT_USER #define ALLOWED_CONTROLS_KEY TEXT("SOFTWARE\\Policies\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\AllowedControls") #define CSTRLENW(str) (sizeof(str)/sizeof(TCHAR) - 1) #define MARK_PREFIX_SIZE 30 #define MARK_SUFFIX_SIZE 10 #define EXTRA_BUFFER_SIZE 1024 #define UNICODE_HEADER_SIZE 2 #endif // _URLZONE_UTIL_H_