2025-04-27 07:49:33 -04:00

314 lines
8.8 KiB
C++

/*
* ccatalog.h - definitions/declarations for Windows Update V3 Catalog infra-structure
*
* Copyright (c) 1998-1999 Microsoft Corporation. All Rights Reserved.
*
* Purpose:
* This file defines the class structures that allow reading, writing, and
* parsing of the V3 Windows Update catalog.
*/
#ifndef _INC_V3_CATALOG
#include <varray.h>
#include <wuv3.h>
#include <cbitmask.h>
#include <cwudload.h>
#include <diamond.h>
#include <ccdm.h>
#include <filecrc.h>
#define REGISTRYHIDING_KEY _T("Software\\Microsoft\\Windows\\CurrentVersion\\WindowsUpdate\\HiddenItems")
#ifdef _UNICODE
#define T2A W2A
#else
#define T2A
#endif
class CCatalog; //forward
const DWORD DISP_PUID_NOT_IN_MAP = 1;
const DWORD DISP_DESC_NOT_FOUND = 2;
void RegistryHidingRead(Varray<PUID>& vPuids, int& cPuids);
BOOL RegistryHidingUpdate(PUID puid, BOOL bHide);
void GlobalExclusionsRead(Varray<PUID>& vPuids, int& cPuids, CCatalog* pCatalog, CWUDownload *pDownload);
HRESULT DownloadFileToMem(CWUDownload* pDownload, LPCTSTR pszFileName, CDiamond* pDiamond, BYTE** ppMem, DWORD* pdwLen);
struct DEPENDPUID
{
PUID puid;
DWORD dwPriority;
PUID puidParent; // contains the PUID of the parent
PINVENTORY_ITEM pTopLevelItem; // points to top level item of a dependant item or NULL
};
typedef struct _WORKERQUEUEENTRY
{
CWUDownload *lpdl;
CDiamond *lpdm;
PINVENTORY_ITEM pItem;
_WORKERQUEUEENTRY *Next; // next queue entry
} WORKERQUEUEENTRY, *LPWORKERQUEUEENTRY;
#define MAX_WORKERS 4
typedef struct _HANDLEANDINDEX
{
HANDLE hThread;
DWORD dwIndex;
} HANDLEANDINDEX, *LPHANDLEANDINDEX;
class CCatalog
{
private:
// Functions for the worker threads
HANDLEANDINDEX m_hWorkers[MAX_WORKERS]; // Up to four workers
HANDLE m_hEvents[MAX_WORKERS];
LPWORKERQUEUEENTRY m_lpWorkQueue; // queue of work
HANDLE m_mutexWQ; // Access to workqueue
HANDLE m_mutexDiamond;
BOOL m_bTerminateWorkers; // shutdown read workers
void PurgeQueue(); // Clear the queue
LPWORKERQUEUEENTRY DeQueue();
LPWORKERQUEUEENTRY EnQueue(LPWORKERQUEUEENTRY lpwqe);
void TerminateWorkers();
friend ULONG WINAPI Worker(LPVOID lpv);
//friend unsigned int WINAPI Worker(LPVOID lpv);
public:
CCatalog(
LPCTSTR szServer = NULL, //server and share catalog is stored at.
PUID puidCatalog = 0 //PUID identifier of catalog.
);
~CCatalog();
//Adds a memory inventory item to a catalog
void AddItem(
IN PINVENTORY_ITEM pItem //Pointer to inventory item to be added to memory catalog file
);
//Reads an inventory catalog's items from an http server
void Read(
IN CWUDownload *pDownload, //pointer to internet server download class.
IN CDiamond *pDiamond //pointer to diamond de-compression class.
);
//read and attaches a description file to an inventory catalog item record.
HRESULT ReadDescription(
IN CWUDownload *pDownload, //pointer to internet server download class.
IN CDiamond *pDiamond, //pointer to diamond de-compression class.
IN PINVENTORY_ITEM pItem, //Pointer to item to attach description to.
IN CCRCMapFile* pIndex, //pointer to map file structure
OUT DWORD *pdwDisp = NULL //DWORD describing reason for an error
);
HRESULT MergeDescription(
CWUDownload* pDownload, // internet server download class.
CDiamond* pDiamond, // diamond de-compression class.
PINVENTORY_ITEM pItem, // item to attach description to.
CCRCMapFile* pIndex // must be for machine language
);
HRESULT ReadDescriptionEx(
IN CWUDownload *pDownload, //pointer to internet server download class.
IN CDiamond *pDiamond, //pointer to diamond de-compression class.
IN PINVENTORY_ITEM pItem //Pointer to item to attach description to.
);
HRESULT ReadDescriptionGang(
IN CWUDownload *pDownload, //pointer to internet server download class.
IN CDiamond *pDiamond //pointer to diamond de-compression class.
);
HRESULT BlankDescription(
IN PINVENTORY_ITEM pItem //Pointer to item to attach description to.
);
void Prune();
//returned the header record for an inventory catalog.
PWU_CATALOG_HEADER GetHeader()
{
return &m_hdr;
}
//returns a specific inventory item record.
PINVENTORY_ITEM GetItem
(
int index
)
{
if(index < m_items.SIZEOF())
{
return m_items[index];
}
else
{
return (PINVENTORY_ITEM)NULL;
}
}
void BitmaskPruning
(
IN CBitmask *pBm, //bitmask to be used to prune inventory list
IN PBYTE pOemInfoTable //Pointer OEM info table that OEM detection needs.
);
//This method prunes the inventory.plt list with the bitmask.plt
void BitmaskPruning(
IN CBitmask *pBm, //bitmask to be used to prune inventory list
IN PDWORD pdwPlatformId, //platform id list to be used.
IN long iTotalPlatforms //platform id list to be used.
);
void ProcessExclusions(
IN CWUDownload *pDownload
);
//this method returns the index in the inventory list where the specified
//record type is stored or -1 if not found. This method is used to find
//the the CDM device driver insertion record or the printer insertion
//record at present.
int GetRecordIndex(
int iRecordType //Record type to find.
);
void AddCDMRecords(
IN CCdm *pCdm //cdm class to be used to add Device Driver
);
BYTE GetItemFlags(
int index //index of record for which to retrieve the item flags
);
//Helper function that returns an inventory item's puid.
PUID GetItemPuid(
int index //index of record for which to retrieve the item flags
);
//returns information about an inventory item.
BOOL GetItemInfo(
int index, //index of inventory record
int infoType, //type of information to be returned
PVOID pBuffer //caller supplied buffer for the returned information. The caller is
//responsible for ensuring that the return buffer is large enough to
//contain the requested information.
);
//Returns the server that this catalog was read from.
LPTSTR GetCatalogServer()
{
return m_szServer;
}
PUID GetCatalogPuid()
{
return m_puidCatalog;
}
void SetBrowserLocale(LPCTSTR szLocale)
{
lstrcpy(m_szBrowserLocale, szLocale);
}
DWORD GetBrowserLocaleDW()
{
USES_CONVERSION;
return (DWORD)atoh(T2A(m_szBrowserLocale));
}
LPCTSTR GetBrowserLocaleSZ()
{
return m_szBrowserLocale;
}
LPCTSTR GetBaseName()
{
return m_szBaseName;
}
LPCTSTR GetBitmaskName()
{
return m_szBitmaskName;
}
void SetPlatform(DWORD platformId)
{
m_platformId = platformId;
}
DWORD GetPlatform(void)
{
return m_platformId;
}
LPCTSTR GetMachineLocaleSZ();
LPCTSTR GetUserLocaleSZ();
BOOL LocalesDifferent();
void GetItemDirectDependencies(PINVENTORY_ITEM pItem, Varray<DEPENDPUID>& vDepPuids, int& cDepPuids);
private:
int CCatalog::GetRecordType
(
PINVENTORY_ITEM pItem //inventory item to use to determine the record type.
);
void ConvertLinks();
int FindPuid(
PUID puid //PUID identifier of inventory record to find.
);
//parses a binary character memory array into a memory catalog file format.
void Parse(
IN PBYTE pCatalogBuffer //decompressed raw catalog memory image from server.
);
//returns a pointer to the next inventory record in an inventory record memory file.
PBYTE GetNextRecord(
IN PBYTE pRecord, //pointer to current inventory record
IN int iBitmaskIndex, //bitmask index for the current record
IN PINVENTORY_ITEM pItem //pointer to item structure that will be filled in by this method.
);
PUID m_puidCatalog; //The puid identifier for this catalog.
TCHAR m_szBrowserLocale[32]; //Browser locale that this catalog was retrieved with.
WU_CATALOG_HEADER m_hdr; //catalog header structure
Varray<PINVENTORY_ITEM> m_items; //array of catalog items
PBYTE m_pBuffer; //internal buffer allocated and managed by Read() and Parse() methods.
TCHAR m_szServer[MAX_PATH]; //server and share that this catalog is stored at.
DWORD m_platformId; //platform id for this catalog
TCHAR m_szMachineLocale[32]; //current machine locale
TCHAR m_szUserLocale[32]; //current user locale
BOOL m_bLocalesDifferent; //machine and browser locales are different
PBYTE m_pGangDesc;
TCHAR m_szBaseName[64]; // contains base name of the catalog (ie CRC name);
TCHAR m_szBitmaskName[64]; // contains base name of the active setup bitmask
};
#define _INC_V3_CATALOG
#endif