|
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1996 - 1999
//
// File: catdb.cpp
//
// Contents: Microsoft Internet Security Catalog Utilities
//
// History: 23-Oct-1997 pberkman created
//
//--------------------------------------------------------------------------
#include "global.hxx"
#include "catdb.hxx"
cCatalogDB_::cCatalogDB_(WCHAR *pwszBaseDirIn, WCHAR *pwszSubDirIn) { WCHAR wszPath[MAX_PATH]; LPWSTR pwszPath; BOOL fCreatedOK = FALSE;
pCatMast = NULL;
pwszPath = new WCHAR [ wcslen(pwszBaseDirIn)+wcslen(pwszSubDirIn)+1 ]; if ( pwszPath == NULL ) { return; }
wcscpy(pwszPath, pwszBaseDirIn);
CreateDirectoryU(pwszPath, NULL);
//
// sysmast is in the CatRoot directory.
//
if ((pSysMast = new cBFile_(&MSCAT_CriticalSection, pwszPath, SYSMAST_NAME, sizeof(GUID), sizeof(SysMastRec), CATDB_VERSION_1, &fCreatedOK)) && fCreatedOK && (pSysMast->Initialize())) { wcscat(pwszPath, pwszSubDirIn);
// create the directory!
CreateDirectoryU(pwszPath, NULL);
if ((pCatMast = new cBFile_(&MSCAT_CriticalSection, pwszPath, CATMAST_NAME, sizeof(DWORD), sizeof(CatMastRec), CATDB_VERSION_1, &fCreatedOK)) && fCreatedOK && (pCatMast->Initialize())) { pCatMast->UseRecNumAsKey(TRUE); DELETE_OBJECT(pwszPath); return; } }
DELETE_OBJECT(pSysMast); DELETE_OBJECT(pCatMast); DELETE_OBJECT(pwszPath); }
cCatalogDB_::~cCatalogDB_(void) { DELETE_OBJECT(pSysMast); DELETE_OBJECT(pCatMast); }
BOOL cCatalogDB_::Initialize(void) { if ((pSysMast) && (pCatMast)) { return(TRUE); }
return(FALSE); }
ULONG cCatalogDB_::SysMast_GetNewId(void) { return(0L); // handled in the add....
}
DWORD cCatalogDB_::SysMast_NumKeys(void) { return(pSysMast->GetNumKeys()); }
BOOL cCatalogDB_::SysMast_Get(const GUID *pgSubSys, SysMast *psData) { SysMastRec *rec;
memset(psData, 0x00, sizeof(SysMast));
pSysMast->setKey((void *)pgSubSys);
if (pSysMast->Find()) { rec = (SysMastRec *)pSysMast->getData();
MultiByteToWideChar(0, 0, rec->SubDir, -1, psData->SubDir, REG_MAX_GUID_TEXT); psData->SubDir[REG_MAX_GUID_TEXT - 1] = NULL;
memcpy(&psData->SysGuid, &rec->SysGuid, sizeof(GUID));
psData->SysId = rec->SysId;
return(TRUE); }
return(FALSE); }
BOOL cCatalogDB_::SysMast_GetFirst(SysMast *psData) { SysMastRec *rec;
memset(psData, 0x00, sizeof(SysMast));
if (pSysMast->GetFirst()) { rec = (SysMastRec *)pSysMast->getData();
MultiByteToWideChar(0, 0, rec->SubDir, -1, psData->SubDir, REG_MAX_GUID_TEXT); psData->SubDir[REG_MAX_GUID_TEXT - 1] = NULL;
memcpy((void *)&psData->SysGuid, &rec->SysGuid, sizeof(GUID));
psData->SysId = rec->SysId;
return(TRUE); }
return(FALSE); }
BOOL cCatalogDB_::SysMast_GetNext(SysMast *psData) { SysMastRec *rec;
memset(psData, 0x00, sizeof(SysMast));
if (pSysMast->GetNext()) { rec = (SysMastRec *)pSysMast->getData();
MultiByteToWideChar(0, 0, rec->SubDir, -1, psData->SubDir, REG_MAX_GUID_TEXT); psData->SubDir[REG_MAX_GUID_TEXT - 1] = NULL;
memcpy((void *)&psData->SysGuid, &rec->SysGuid, sizeof(GUID));
psData->SysId = rec->SysId;
return(TRUE); }
return(FALSE); }
BOOL cCatalogDB_::SysMast_Add(SysMast *psData) { SysMastRec rec;
memset(&rec, 0x00, sizeof(SysMastRec));
WideCharToMultiByte(0, 0, psData->SubDir, -1, &rec.SubDir[0], REG_MAX_GUID_TEXT, NULL, NULL); rec.SubDir[REG_MAX_GUID_TEXT - 1] = NULL;
memcpy(&rec.SysGuid, &psData->SysGuid, sizeof(GUID));
rec.SysId = psData->SysId;
pSysMast->setKey(&psData->SysGuid); pSysMast->setData(&rec);
if (pSysMast->Add()) { //
// because the id is the record number, we need to add it first, get the rec
// number, force an index update, then update the record.
//
psData->SysId = pSysMast->getRecNum(); memcpy(&rec, pSysMast->getData(), sizeof(SysMastRec));
rec.SysId = psData->SysId;
pSysMast->Sort(); // force update of the index!
pSysMast->setKey(&psData->SysGuid); pSysMast->setData(&rec); pSysMast->Update();
return(TRUE); }
return(FALSE); }
ULONG cCatalogDB_::CatMast_GetNewId(void) { return(0L); // handled in the add....
}
BOOL cCatalogDB_::CatMast_Get(DWORD ulId, CatMast *psData) { CatMastRec *rec;
memset(psData, 0x00, sizeof(CatMast));
pCatMast->setKey(&ulId);
if (pCatMast->Find()) { rec = (CatMastRec *)pCatMast->getData();
MultiByteToWideChar(0, 0, rec->OrigName, -1, psData->OrigName, MAX_PATH); psData->OrigName[MAX_PATH - 1] = NULL;
MultiByteToWideChar(0, 0, rec->CurName, -1, psData->CurName, MAX_PATH); psData->CurName[MAX_PATH - 1] = NULL;
psData->CatId = rec->CatId; psData->SysId = rec->SysId;
memcpy(&psData->InstDate, &rec->InstDate, sizeof(FILETIME));
return(TRUE); }
return(FALSE); }
BOOL cCatalogDB_::CatMast_Add(CatMast *psData) { CatMastRec rec;
memset(&rec, 0x00, sizeof(CatMastRec));
WideCharToMultiByte(0, 0, psData->OrigName, -1, &rec.OrigName[0], MAX_PATH, NULL, NULL); rec.OrigName[MAX_PATH - 1] = NULL;
WideCharToMultiByte(0, 0, psData->CurName, -1, &rec.CurName[0], MAX_PATH, NULL, NULL); rec.CurName[MAX_PATH - 1] = NULL;
rec.SysId = psData->SysId;
pCatMast->setData(&rec);
if (pCatMast->Add()) { memcpy(&rec, pCatMast->getData(), sizeof(CatMastRec));
psData->CatId = pCatMast->getRecNum(); rec.CatId = psData->CatId;
pCatMast->Sort(); // force index update.
if (!(rec.CurName[0])) { sprintf(&rec.CurName[0], "%08.8lX.CAT", rec.CatId);
MultiByteToWideChar(0, 0, &rec.CurName[0], -1, psData->CurName, MAX_PATH); psData->CurName[MAX_PATH - 1] = NULL;
}
pCatMast->setKey(&psData->CatId); pCatMast->setData(&rec); pCatMast->Update();
return(TRUE); }
return(FALSE); }
cHashDB_::cHashDB_(WCHAR *pwszBase, WCHAR *pwszSubSysDirIn, BOOL *pfCreatedOK) { *pfCreatedOK = TRUE;
pwszSubSysDir = new WCHAR[wcslen(pwszBase) + wcslen(pwszSubSysDirIn) + 2];
if (pwszSubSysDir) { BOOL fCreatedOK;
wcscpy(pwszSubSysDir, pwszBase); wcscat(pwszSubSysDir, pwszSubSysDirIn);
pHashMast = new cBFile_(&MSCAT_CriticalSection, pwszSubSysDir, HASHMAST_NAME, MAX_HASH_LEN, sizeof(HashMastRec), CATDB_VERSION_1, pfCreatedOK);
if (pHashMast == NULL) { *pfCreatedOK = FALSE; } } else { *pfCreatedOK = FALSE; } }
cHashDB_::~cHashDB_(void) { DELETE_OBJECT(pHashMast); DELETE_OBJECT(pwszSubSysDir); }
BOOL cHashDB_::Initialize(void) { if (pHashMast) { return(TRUE); }
return(FALSE); }
BOOL cHashDB_::HashMast_Get(DWORD dwLastRec, BYTE *pbHash, DWORD cbHash, HashMast *psData) { HashMastRec *rec; BYTE bHash[MAX_HASH_LEN]; BOOL fRet;
if (cbHash > MAX_HASH_LEN) { return(FALSE); }
memset(&bHash[0], 0x00, MAX_HASH_LEN); memcpy(&bHash[0], pbHash, cbHash);
memset(psData, 0x00, sizeof(HashMast));
pHashMast->setKey(&bHash[0]);
if (dwLastRec == 0xFFFFFFFF) { fRet = pHashMast->Find(); } else { fRet = pHashMast->GetNext(dwLastRec); }
if (fRet) { if (memcmp(&bHash[0], pHashMast->getKey(), MAX_HASH_LEN) != 0) { return(FALSE); }
rec = (HashMastRec *)pHashMast->getData();
MultiByteToWideChar(0, 0, rec->CatName, -1, psData->CatName, MAX_PATH); psData->CatName[MAX_PATH - 1] = NULL;
return(TRUE); }
return(FALSE); }
BOOL cHashDB_::HashMast_Add(HashMast *psData) { HashMastRec rec;
memset(&rec, 0x00, sizeof(HashMastRec));
WideCharToMultiByte(0, 0, psData->CatName, -1, &rec.CatName[0], MAX_PATH, NULL, NULL); rec.CatName[MAX_PATH - 1] = NULL;
pHashMast->setKey(&psData->Hash[0]); pHashMast->setData(&rec);
if (pHashMast->Add()) { return(TRUE); }
return(FALSE); }
|