windows-nt/Source/XPSP1/NT/shell/ext/occache/utils.h
2020-09-26 16:20:57 +08:00

215 lines
7.6 KiB
C++

#ifndef __UTILS__
#define __UTILS__
#include <windows.h>
#include <advpub.h>
#include <CleanOC.h>
#include <debug.h>
#include "general.h"
#define LStrNICmp(sz1, sz2, cch) (CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE, sz1, cch, sz2, cch) - 2)
#define MODULE_UNKNOWN_OWNER "Unknown Owner"
#define MAX_MESSAGE_LEN 2048
// numeric constants
#define GD_EXTRACTDIR 0
#define GD_CACHEDIR 1
#define GD_CONFLICTDIR 2
#define GD_CONTAINERDIR 3
#define GD_WINDOWSDIR 10
#define GD_SYSTEMDIR 11
#define LENGTH_NAME 200
#define MAX_INF_SECTION_SIZE 1024
#define OLEUI_CCHKEYMAX 256
#define OLEUI_CCHKEYMAX_SIZE (OLEUI_CCHKEYMAX*sizeof(TCHAR))
#define TIMESTAMP_MAXSIZE 64
#define VERSUBBLOCK_SIZE 256
#define MAX_VERSION_SIZE 16
// string constants
#define INPROCSERVER TEXT("InprocServer")
#define LOCALSERVER TEXT("LocalServer")
#define INPROCSERVERX86 TEXT("InProcServerX86")
#define LOCALSERVERX86 TEXT("LocalServerX86")
#define INPROCSERVER32 TEXT("InprocServer32")
#define LOCALSERVER32 TEXT("LocalServer32")
#define INFFILE TEXT("InfFile")
#define UNKNOWNDATA TEXT("n/a")
#define UNKNOWNOWNER TEXT("Unknown Owner")
#define VARTRANSLATION TEXT("\\VarFileInfo\\Translation")
#define FILEVERSION TEXT("\\FileVersion")
#define STRINGFILEINFO TEXT("\\StringFileInfo\\")
#define HKCR_CLSID TEXT("CLSID")
#define HKCR_TYPELIB TEXT("TypeLib")
#define HKCR_INTERFACE TEXT("Interface")
#define VALUE_OWNER TEXT(".Owner")
#define VALUE_ACTIVEXCACHE TEXT("ActiveXCache")
#define VALUE_PATH TEXT("PATH")
#define VALUE_SYSTEM TEXT("SystemComponent")
#define CONTAINER_APP TEXT("IEXPLORE.EXE")
#define DEMO_PAGE TEXT("DemoTmp.html")
#define KEY_HOOK TEXT("Hook")
#define KEY_INFFILE TEXT("InfFile")
#define KEY_INFSECTION TEXT("InfSection")
#define KEY_DEFAULTUNINSTALL TEXT("DefaultUninstall")
#define KEY_UNINSTALL TEXT("UNINSTALL")
#define KEY_SETUPHOOK TEXT("SETUP HOOKS")
#define INF_EXTENSION TEXT(".INF")
#define ENV_PATH TEXT("PATH")
#define KEY_ADDCODE TEXT("Add.Code")
#define DEFAULT_VALUE TEXT("")
#define DEFAULT_CACHE TEXT("\\OCCACHE")
#define DEFAULT_CONFLICT TEXT("\\CONFLICT")
#define DU_INSTALLER_VALUE TEXT("Installer")
#define CDL_INSTALLER TEXT("MSICD")
// registry paths for ModuleUsage
#define REGSTR_PATH_SHAREDDLLS TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\SharedDlls")
#define REGSTR_PATH_MODULE_USAGE TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\ModuleUsage")
#define REGSTR_PATH_IE TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths")
#define REGSTR_PATH_IE_SETTINGS TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Internet Settings")
//#define REGSTR_PATH_ACTIVEX_CACHE TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ActiveX Cache\\Paths")
#define REGSTR_PATH_ACTIVEX_CACHE TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ActiveX Cache")
#define SOFTWARECLASSES TEXT("SOFTWARE\\CLASSES")
// CLSIDLIST_ITEM declaration
struct tagCLSIDLIST_ITEM;
typedef struct tagCLSIDLIST_ITEM CLSIDLIST_ITEM;
typedef CLSIDLIST_ITEM* LPCLSIDLIST_ITEM;
struct tagCLSIDLIST_ITEM
{
TCHAR szFile[MAX_PATH];
TCHAR szCLSID[MAX_DIST_UNIT_NAME_LEN];
BOOL bIsDistUnit;
LPCLSIDLIST_ITEM pNext;
};
// function prototypes
// void RemoveObsoleteKeys();
void ReverseSlashes(LPTSTR pszStr);
LPTSTR ReverseStrchr(LPCTSTR szString, TCHAR ch);
HRESULT NullLastSlash(LPTSTR szString, UINT uiOffset);
LONG DeleteKeyAndSubKeys(HKEY hkIn, LPCTSTR pszSubKey);
BOOL FileExist(LPCTSTR lpszFileName);
HRESULT LookUpModuleUsage(
LPCTSTR lpszFileName,
LPCTSTR lpszCLSID,
LPTSTR lpszOwner = NULL,
DWORD dwOwnerSize = 0);
DWORD SubtractModuleOwner( LPCTSTR lpszFileName, LPCTSTR lpszGUID );
HRESULT SetSharedDllsCount(
LPCTSTR lpszFileName,
LONG cRef,
LONG *pcRefOld = NULL);
HRESULT GetSizeOfFile(LPCTSTR lpszFile, LPDWORD lpSize);
HRESULT CleanOrphanedRegistry(
LPCTSTR szFileName,
LPCTSTR szClientClsId,
LPCTSTR szTypeLibCLSID);
HRESULT UnregisterOCX(LPCTSTR pszFile);
HRESULT GetDirectory(
UINT nDirType,
LPTSTR szDirBuffer,
int nBufSize,
LPCTSTR szOCXFullName = NULL);
/*
HRESULT GetTypeLibId(
LPCTSTR lpszClientClsId,
LPTSTR lpszTypeLibId,
LONG* pLibIdSize);
*/
HRESULT CleanInterfaceEntries(LPCTSTR lpszTypeLibCLSID);
HRESULT ConvertToLongFileName(
LPTSTR lpszShortFileName,
BOOL bToUpper = FALSE);
void RemoveList(LPCLSIDLIST_ITEM lpListHead);
BOOL ReadInfFileNameFromRegistry(LPCTSTR lpszCLSID, LPTSTR lpszInf, LONG nBufLen);
BOOL WriteInfFileNameToRegistry(LPCTSTR lpszCLSID, LPTSTR lpszInf);
HRESULT FindDLLInModuleUsage(
LPTSTR lpszFileName,
LPCTSTR lpszCLSID,
DWORD &iSubKey);
HRESULT
ExpandCommandLine(
LPCSTR szSrc,
LPSTR szBuf,
DWORD cbBuffer,
const char * szVars[],
const char * szValues[]);
BOOL PatternMatch(LPCTSTR szModName, LPTSTR szSectionName);
DWORD OCCGetLongPathName( LPTSTR szLong, LPCTSTR szShort, DWORD cchBuffer );
TCHAR *CatPathStrN( TCHAR *szDst, const TCHAR *szHead, const TCHAR *szTail, int cchDst );
//=--------------------------------------------------------------------------=
// allocates a temporary buffer that will disappear when it goes out of scope
// NOTE: be careful of that -- make sure you use the string in the same or
// nested scope in which you created this buffer. people should not use this
// class directly. use the macro(s) below.
//
class TempBuffer {
public:
TempBuffer(ULONG cBytes) {
m_pBuf = (cBytes <= 120) ? &m_szTmpBuf : CoTaskMemAlloc(cBytes);
m_fHeapAlloc = (cBytes > 120);
}
~TempBuffer() {
if (m_pBuf && m_fHeapAlloc) CoTaskMemFree(m_pBuf);
}
void *GetBuffer() {
return m_pBuf;
}
private:
void *m_pBuf;
// we'll use this temp buffer for small cases.
//
char m_szTmpBuf[120];
unsigned m_fHeapAlloc:1;
};
//=--------------------------------------------------------------------------=
// string helpers.
//
// given and ANSI String, copy it into a wide buffer.
// be careful about scoping when using this macro!
//
// how to use the below two macros:
//
// ...
// LPSTR pszA;
// pszA = MyGetAnsiStringRoutine();
// MAKE_WIDEPTR_FROMANSI(pwsz, pszA);
// MyUseWideStringRoutine(pwsz);
// ...
//
// similarily for MAKE_ANSIPTR_FROMWIDE. note that the first param does not
// have to be declared, and no clean up must be done.
//
#define MAKE_WIDEPTR_FROMANSI(ptrname, ansistr) \
long __l##ptrname = (lstrlen(ansistr) + 1) * sizeof(WCHAR); \
TempBuffer __TempBuffer##ptrname(__l##ptrname); \
MultiByteToWideChar(CP_ACP, 0, ansistr, -1, (LPWSTR)__TempBuffer##ptrname.GetBuffer(), __l##ptrname); \
LPWSTR ptrname = (LPWSTR)__TempBuffer##ptrname.GetBuffer()
//
// Note: allocate lstrlenW(widestr) * 2 because its possible for a UNICODE
// character to map to 2 ansi characters this is a quick guarantee that enough
// space will be allocated.
//
#define MAKE_ANSIPTR_FROMWIDE(ptrname, widestr) \
long __l##ptrname = (lstrlenW(widestr) + 1) * 2 * sizeof(char); \
TempBuffer __TempBuffer##ptrname(__l##ptrname); \
WideCharToMultiByte(CP_ACP, 0, widestr, -1, (LPSTR)__TempBuffer##ptrname.GetBuffer(), __l##ptrname, NULL, NULL); \
LPSTR ptrname = (LPSTR)__TempBuffer##ptrname.GetBuffer()
#endif