Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

213 lines
5.1 KiB

/*++
Copyright (C) 2000-2001 Microsoft Corporation
--*/
#ifndef __CREPOSIT__H_
#define __CREPOSIT__H_
#include <windows.h>
#include <wbemidl.h>
#include <unk.h>
#include <wbemcomn.h>
#include <sync.h>
#include <reposit.h>
#include <wmiutils.h>
#include <filecach.h>
#include <hiecache.h>
#include <corex.h>
#include "a51fib.h"
#include "lock.h"
extern CLock g_readWriteLock;
extern bool g_bShuttingDown;
/* ===================================================================================
* A51_REP_FS_VERSION
*
* 1 - Original A51 file-based repository
* 2 - All Objects stored in single file (Whistler Beta 1)
* 3 - BTree added
* 4 - System Class optimisation - put all system classes in __SYSTEMCLASS namespace
* 5 - Change to system classes in __SYSTEMCLASS namespace - need to propagate change
* to all namespaces as there may be instances of these classes.
* 6 - XFiles: New page based heap. Transacted page manager sitting under new heap and
* BTree. Instance indexing improved so instance queries are faster
* ===================================================================================
*/
#define A51_REP_FS_VERSION 6
#define A51_CLASSDEF_FILE_PREFIX L"CD_"
#define A51_CLASSRELATION_DIR_PREFIX L"CR_"
#define A51_CHILDCLASS_FILE_PREFIX L"C_"
#define A51_KEYROOTINST_DIR_PREFIX L"KI_"
#define A51_INSTDEF_FILE_PREFIX L"I_"
#define A51_CLASSINST_DIR_PREFIX L"CI_"
#define A51_INSTLINK_FILE_PREFIX L"IL_"
#define A51_INSTREF_DIR_PREFIX L"IR_"
#define A51_REF_FILE_PREFIX L"R_"
#define A51_SCOPE_DIR_PREFIX L"SC_"
#define A51_SYSTEMCLASS_NS L"__SYSTEMCLASS"
class CGlobals;
extern CGlobals g_Glob;
class CNamespaceHandle;
extern CNamespaceHandle * g_pSystemClassNamespace;
/*
DWORD g_dwOldRepositoryVersion = 0;
DWORD g_dwCurrentRepositoryVersion = 0;
DWORD g_ShutDownFlags = 0;
*/
class CForestCache;
class CGlobals
{
private:
BOOL m_bInit;
CRITICAL_SECTION m_cs;
_IWmiCoreServices* m_pCoreServices;
CForestCache m_ForestCache;
CFileCache m_FileCache;
long m_lRootDirLen;
WCHAR m_wszRootDir[MAX_PATH]; // keep this last: be debugger friendly
public:
CGlobals():m_bInit(FALSE)
{
InitializeCriticalSection(&m_cs);
};
~CGlobals()
{
DeleteCriticalSection(&m_cs);
};
HRESULT Initialize();
HRESULT Deinitialize();
_IWmiCoreServices * GetCoreSvcs();
CForestCache * GetForestCache();
CFileCache * GetFileCache();
WCHAR * GetRootDir() {return (WCHAR *)m_wszRootDir;}
long GetRootDirLen() {return m_lRootDirLen;};
void SetRootDirLen(long Len) { m_lRootDirLen = Len;};
BOOL IsInit(){ return m_bInit; };
};
HRESULT DoAutoDatabaseRestore();
class CNamespaceHandle;
class CRepository : public CUnkBase<IWmiDbController, &IID_IWmiDbController>
{
private:
CFlexArray m_aSystemClasses; //Used for part of the upgrade process.
static DWORD m_ShutDownFlags;
static HANDLE m_hShutdownEvent;
static HANDLE m_hFlusherThread;
static LONG m_ulReadCount;
static LONG m_ulWriteCount;
static HANDLE m_hWriteEvent;
static HANDLE m_hReadEvent;
static int m_threadState;
static CCritSec m_cs;
static LONG m_threadCount;
enum { ThreadStateDead, ThreadStateIdle, ThreadStateFlush, ThreadStateOperationPending};
protected:
HRESULT Initialize();
HRESULT UpgradeRepositoryFormat();
HRESULT GetRepositoryDirectory();
HRESULT InitializeGlobalVariables();
HRESULT InitializeRepositoryVersions();
static DWORD WINAPI _FlusherThread(void *);
public:
HRESULT STDMETHODCALLTYPE Logon(
WMIDB_LOGON_TEMPLATE *pLogonParms,
DWORD dwFlags,
DWORD dwRequestedHandleType,
IWmiDbSession **ppSession,
IWmiDbHandle **ppRootNamespace
);
HRESULT STDMETHODCALLTYPE GetLogonTemplate(
LCID lLocale,
DWORD dwFlags,
WMIDB_LOGON_TEMPLATE **ppLogonTemplate
);
HRESULT STDMETHODCALLTYPE FreeLogonTemplate(
WMIDB_LOGON_TEMPLATE **ppTemplate
);
HRESULT STDMETHODCALLTYPE Shutdown(
DWORD dwFlags
);
HRESULT STDMETHODCALLTYPE SetCallTimeout(
DWORD dwMaxTimeout
);
HRESULT STDMETHODCALLTYPE SetCacheValue(
DWORD dwMaxBytes
);
HRESULT STDMETHODCALLTYPE FlushCache(
DWORD dwFlags
);
HRESULT STDMETHODCALLTYPE GetStatistics(
DWORD dwParameter,
DWORD *pdwValue
);
HRESULT STDMETHODCALLTYPE Backup(
LPCWSTR wszBackupFile,
long lFlags
);
HRESULT STDMETHODCALLTYPE Restore(
LPCWSTR wszBackupFile,
long lFlags
);
HRESULT STDMETHODCALLTYPE LockRepository();
HRESULT STDMETHODCALLTYPE UnlockRepository();
HRESULT STDMETHODCALLTYPE GetRepositoryVersions(DWORD *pdwOldVersion, DWORD *pdwCurrentVersion);
static HRESULT ReadOperationNotification();
static HRESULT WriteOperationNotification();
static HRESULT RecoverCheckpoint();
public:
CRepository(CLifeControl* pControl) : TUnkBase(pControl)
{
}
~CRepository()
{
}
HRESULT GetNamespaceHandle(LPCWSTR wszNamespaceName,
CNamespaceHandle** ppHandle);
};
#endif /*__CREPOSIT__H_*/