utils.h
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 8k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. #ifndef __UTILS__
  2. #define __UTILS__
  3. #include <windows.h>
  4. #include <advpub.h>
  5. #include <CleanOC.h>
  6. #include <debug.h>
  7. #include "general.h"
  8. #define LStrNICmp(sz1, sz2, cch) (CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE, sz1, cch, sz2, cch) - 2)
  9. #define MODULE_UNKNOWN_OWNER   "Unknown Owner"
  10. #define MAX_MESSAGE_LEN        2048
  11. // numeric constants
  12. #define GD_EXTRACTDIR    0
  13. #define GD_CACHEDIR      1
  14. #define GD_CONFLICTDIR   2
  15. #define GD_CONTAINERDIR  3
  16. #define GD_WINDOWSDIR   10
  17. #define GD_SYSTEMDIR    11
  18. #define LENGTH_NAME             200
  19. #define MAX_INF_SECTION_SIZE    1024
  20. #define OLEUI_CCHKEYMAX         256
  21. #define OLEUI_CCHKEYMAX_SIZE    (OLEUI_CCHKEYMAX*sizeof(TCHAR))
  22. #define TIMESTAMP_MAXSIZE       64
  23. #define VERSUBBLOCK_SIZE        256
  24. #define MAX_VERSION_SIZE      16
  25. // string constants
  26. #define INPROCSERVER       TEXT("InprocServer")
  27. #define LOCALSERVER        TEXT("LocalServer")
  28. #define INPROCSERVERX86    TEXT("InProcServerX86")
  29. #define LOCALSERVERX86     TEXT("LocalServerX86")
  30. #define INPROCSERVER32     TEXT("InprocServer32")
  31. #define LOCALSERVER32      TEXT("LocalServer32")
  32. #define INFFILE            TEXT("InfFile")
  33. #define UNKNOWNDATA        TEXT("n/a")
  34. #define UNKNOWNOWNER       TEXT("Unknown Owner")
  35. #define VARTRANSLATION     TEXT("\VarFileInfo\Translation")
  36. #define FILEVERSION        TEXT("\FileVersion")
  37. #define STRINGFILEINFO     TEXT("\StringFileInfo\")
  38. #define HKCR_CLSID         TEXT("CLSID")
  39. #define HKCR_TYPELIB       TEXT("TypeLib")
  40. #define HKCR_INTERFACE     TEXT("Interface")
  41. #define VALUE_OWNER        TEXT(".Owner")
  42. #define VALUE_ACTIVEXCACHE TEXT("ActiveXCache")
  43. #define VALUE_PATH         TEXT("PATH")
  44. #define VALUE_SYSTEM       TEXT("SystemComponent")
  45. #define CONTAINER_APP      TEXT("IEXPLORE.EXE")
  46. #define DEMO_PAGE          TEXT("DemoTmp.html")
  47. #define KEY_HOOK           TEXT("Hook")
  48. #define KEY_INFFILE        TEXT("InfFile")
  49. #define KEY_INFSECTION     TEXT("InfSection")
  50. #define KEY_DEFAULTUNINSTALL TEXT("DefaultUninstall")
  51. #define KEY_UNINSTALL      TEXT("UNINSTALL")
  52. #define KEY_SETUPHOOK      TEXT("SETUP HOOKS")
  53. #define INF_EXTENSION      TEXT(".INF")
  54. #define ENV_PATH           TEXT("PATH")
  55. #define KEY_ADDCODE        TEXT("Add.Code")
  56. #define DEFAULT_VALUE      TEXT("")
  57. #define DEFAULT_CACHE      TEXT("\OCCACHE")
  58. #define DEFAULT_CONFLICT   TEXT("\CONFLICT")
  59. #define DU_INSTALLER_VALUE TEXT("Installer")
  60. #define CDL_INSTALLER      TEXT("MSICD")
  61. // registry paths for ModuleUsage
  62. #define REGSTR_PATH_SHAREDDLLS     TEXT("SOFTWARE\Microsoft\Windows\CurrentVersion\SharedDlls")
  63. #define REGSTR_PATH_MODULE_USAGE   TEXT("SOFTWARE\Microsoft\Windows\CurrentVersion\ModuleUsage")
  64. #define REGSTR_PATH_IE             TEXT("SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths")
  65. #define REGSTR_PATH_IE_SETTINGS    TEXT("SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings")
  66. //#define REGSTR_PATH_ACTIVEX_CACHE  TEXT("SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\ActiveX Cache\Paths")
  67. #define REGSTR_PATH_ACTIVEX_CACHE  TEXT("SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\ActiveX Cache")
  68. #define SOFTWARECLASSES            TEXT("SOFTWARE\CLASSES")
  69. // CLSIDLIST_ITEM declaration
  70. struct tagCLSIDLIST_ITEM;
  71. typedef struct tagCLSIDLIST_ITEM CLSIDLIST_ITEM;
  72. typedef CLSIDLIST_ITEM* LPCLSIDLIST_ITEM;
  73. struct tagCLSIDLIST_ITEM
  74. {
  75.     TCHAR szFile[MAX_PATH];
  76.     TCHAR szCLSID[MAX_DIST_UNIT_NAME_LEN];
  77.     BOOL bIsDistUnit;
  78.     LPCLSIDLIST_ITEM pNext;
  79. };
  80. // function prototypes
  81. // void RemoveObsoleteKeys();
  82. void ReverseSlashes(LPTSTR pszStr);
  83. TCHAR* ReverseStrchr(LPCTSTR szString, TCHAR ch);
  84. LONG DeleteKeyAndSubKeys(HKEY hkIn, LPCTSTR pszSubKey);
  85. BOOL FileExist(LPCTSTR lpszFileName);
  86. HRESULT LookUpModuleUsage(
  87.                 LPCTSTR lpszFileName, 
  88.                 LPCTSTR lpszCLSID,
  89.                 LPTSTR lpszOwner = NULL, 
  90.                 DWORD dwOwnerSize = 0);
  91. DWORD SubtractModuleOwner( LPCTSTR lpszFileName, LPCTSTR lpszGUID );
  92. HRESULT SetSharedDllsCount(
  93.                 LPCTSTR lpszFileName, 
  94.                 LONG cRef, 
  95.                 LONG *pcRefOld = NULL);
  96. HRESULT GetSizeOfFile(LPCTSTR lpszFile, LPDWORD lpSize);
  97. HRESULT CleanOrphanedRegistry(
  98.                 LPCTSTR szFileName, 
  99.                 LPCTSTR szClientClsId,
  100.                 LPCTSTR szTypeLibCLSID);
  101. HRESULT UnregisterOCX(LPCTSTR pszFile);
  102. HRESULT GetDirectory(
  103.                 UINT nDirType, 
  104.                 LPTSTR szDirBuffer, 
  105.                 int nBufSize, 
  106.                 LPCTSTR szOCXFullName = NULL);
  107. /*
  108. HRESULT GetTypeLibId(
  109.                 LPCTSTR lpszClientClsId, 
  110.                 LPTSTR lpszTypeLibId, 
  111.                 LONG* pLibIdSize);
  112. */
  113. HRESULT CleanInterfaceEntries(LPCTSTR lpszTypeLibCLSID);
  114. HRESULT ConvertToLongFileName(
  115.                 LPTSTR lpszShortFileName,
  116.                 BOOL bToUpper = FALSE);
  117. void RemoveList(LPCLSIDLIST_ITEM lpListHead);
  118. BOOL ReadInfFileNameFromRegistry(LPCTSTR lpszCLSID, LPTSTR lpszInf, LONG nBufLen);
  119. BOOL WriteInfFileNameToRegistry(LPCTSTR lpszCLSID, LPTSTR lpszInf);
  120. HRESULT FindDLLInModuleUsage(
  121.       LPTSTR lpszFileName,
  122.       LPCTSTR lpszCLSID,
  123.       DWORD &iSubKey);
  124. HRESULT
  125. ExpandCommandLine(
  126.     LPCSTR szSrc,
  127.     LPSTR szBuf,
  128.     DWORD cbBuffer,
  129.     const char * szVars[],
  130.     const char * szValues[]);
  131. BOOL PatternMatch(LPCTSTR szModName, LPTSTR szSectionName);
  132. DWORD OCCGetLongPathName( LPTSTR szLong, LPCTSTR szShort, DWORD cchBuffer );
  133. TCHAR *CatPathStrN( TCHAR *szDst, const TCHAR *szHead, const TCHAR *szTail, int cchDst );
  134. //=--------------------------------------------------------------------------=
  135. // allocates a temporary buffer that will disappear when it goes out of scope
  136. // NOTE: be careful of that -- make sure you use the string in the same or
  137. // nested scope in which you created this buffer. people should not use this
  138. // class directly.  use the macro(s) below.
  139. //
  140. class TempBuffer {
  141.   public:
  142.     TempBuffer(ULONG cBytes) {
  143.         m_pBuf = (cBytes <= 120) ? &m_szTmpBuf : CoTaskMemAlloc(cBytes);
  144.         m_fHeapAlloc = (cBytes > 120);
  145.     }
  146.     ~TempBuffer() {
  147.         if (m_pBuf && m_fHeapAlloc) CoTaskMemFree(m_pBuf);
  148.     }
  149.     void *GetBuffer() {
  150.         return m_pBuf;
  151.     }
  152.   private:
  153.     void *m_pBuf;
  154.     // we'll use this temp buffer for small cases.
  155.     //
  156.     char  m_szTmpBuf[120];
  157.     unsigned m_fHeapAlloc:1;
  158. };
  159. //=--------------------------------------------------------------------------=
  160. // string helpers.
  161. //
  162. // given and ANSI String, copy it into a wide buffer.
  163. // be careful about scoping when using this macro!
  164. //
  165. // how to use the below two macros:
  166. //
  167. //  ...
  168. //  LPSTR pszA;
  169. //  pszA = MyGetAnsiStringRoutine();
  170. //  MAKE_WIDEPTR_FROMANSI(pwsz, pszA);
  171. //  MyUseWideStringRoutine(pwsz);
  172. //  ...
  173. //
  174. // similarily for MAKE_ANSIPTR_FROMWIDE.  note that the first param does not
  175. // have to be declared, and no clean up must be done.
  176. //
  177. #define MAKE_WIDEPTR_FROMANSI(ptrname, ansistr) 
  178.     long __l##ptrname = (lstrlen(ansistr) + 1) * sizeof(WCHAR); 
  179.     TempBuffer __TempBuffer##ptrname(__l##ptrname); 
  180.     MultiByteToWideChar(CP_ACP, 0, ansistr, -1, (LPWSTR)__TempBuffer##ptrname.GetBuffer(), __l##ptrname); 
  181.     LPWSTR ptrname = (LPWSTR)__TempBuffer##ptrname.GetBuffer()
  182. //
  183. // Note: allocate lstrlenW(widestr) * 2 because its possible for a UNICODE 
  184. // character to map to 2 ansi characters this is a quick guarantee that enough
  185. // space will be allocated.
  186. //
  187. #define MAKE_ANSIPTR_FROMWIDE(ptrname, widestr) 
  188.     long __l##ptrname = (lstrlenW(widestr) + 1) * 2 * sizeof(char); 
  189.     TempBuffer __TempBuffer##ptrname(__l##ptrname); 
  190.     WideCharToMultiByte(CP_ACP, 0, widestr, -1, (LPSTR)__TempBuffer##ptrname.GetBuffer(), __l##ptrname, NULL, NULL); 
  191.     LPSTR ptrname = (LPSTR)__TempBuffer##ptrname.GetBuffer()
  192. #endif