314 lines
8.8 KiB
C++
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
|