Leaked source code of windows server 2003
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.
 
 
 
 
 
 

273 lines
8.4 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"
#include <statsync.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
* 7 - Locale Upgrade run on repository
* ===================================================================================
*/
#define A51_REP_FS_VERSION 7
/* =================================================================================
*
* See sample_layout.txt for an example of the raw data!
* See sample_layout_translated.txt for a version with hashes converted to appropriate classes/keys/namespaces
*
* <full repository path> - Stripped out in the INDEX.CPP layer... c:\windows\system32\wbem\repository\fs
* \NS_<full_namespace> - one for each namespace, hashed on full NS path
*
* \CD_<class name>.x.y.z - Class definition, hash on class name, object location appended
* \CR_<parent_class_name>\C_<class_name> - parent/child class relationship
* \CR_<reference_class_name>\R_<class_name> - class reference to another class
*
* \KI_<key_root_class_name>\I_<key>.x.y.z - Instance location for all instances sharing key tree
* \CI_<class_name>\IL_<key>.x.y.z - Instance location associated with its own class
*
* \KI_<referenced_key_root_class_name>\IR_<referenced_key>\R_<full_repository_path_of_referencing_KI\I_instance>.x.y.z - instance reference
*
* SC_<hash> - Not used!
*
*
* Class definition object
* DWORD dwSuperclassLen - no NULL terminator
* wchar_t wsSuperclassName[dwSuperclassLen]; - superclass name
* __int64 i64Timestamp - timestamp of last update
* BYTE baUnmergedClass[?] - Unmerged class
*
*
* Instance definition object
* wchar_t wsClassHash[MAX_HASH_LEN]
* __int64 i64InstanceTimestamp
* __int64 i64ClassTimestamp
* BYTE baUnmergedClass[?]
*
*
* Instance Reference definition object -
* NOTE! If an instance has multiple references to the same object, we will only return the last one as each one will get overwritten by
* the last! This is because final R_<HASH> is based on the referring objects full instance path. It does not include the property in the hash!
* DWORD dwNamespaceLen - no NULL terminator
* wchar_t wsNamespace [dwNamespaceLen] - namespace, root\default...
* DWORD dwReferringClassLen - Class name of instance referring to this instance
* wchar_t wsReferringClass[dwReferringClassLen] - no NULL terminator
* DWORD dwReferringPropertyLen - property referring to us from the source object
* wchar_t wsReferringProperty[dwReferringPropertyLen] - no NULL terminator
* DWORD dwReferringFileNameLen - file path of instance referring to this one, minus the full repository path
* wchar_t dwReferringFileName[dwReferringFileNameLen] - (minus c:\windows..., but includes NS_....), not NULL terminated
*
* =================================================================================
*/
#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;
//
// let's count here how many times we fail to recover from a failed transaction
//
/////////////////////////////////////////////////
enum eFailCnt {
FailCntCommit,
FailCntInternalBegin,
FailCntInternalCommit,
FailCntCreateSystem,
FailCntCompactPages,
FailCntLast
};
extern LONG g_RecoverFailureCnt[];
class CForestCache;
class CGlobals
{
private:
BOOL m_bInit;
CStaticCritSec m_cs;
public:
_IWmiCoreServices* m_pCoreServices;
CForestCache m_ForestCache;
CFileCache m_FileCache;
private:
long m_lRootDirLen;
WCHAR m_wszRootDir[MAX_PATH]; // keep this last: be debugger friendly
WCHAR m_ComputerName[MAX_COMPUTERNAME_LENGTH+1];
public:
CGlobals():m_bInit(FALSE){};
~CGlobals(){};
HRESULT Initialize();
HRESULT Deinitialize();
_IWmiCoreServices * GetCoreSvcs(){if (m_pCoreServices) m_pCoreServices->AddRef();return m_pCoreServices;}
// CForestCache * GetForestCache() { return &m_ForestCache; }
// CFileCache * GetFileCache() { return &m_FileCache; }
WCHAR * GetRootDir() {return (WCHAR *)m_wszRootDir;}
WCHAR * GetComputerName(){ return (WCHAR *)m_ComputerName; };
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 CStaticCritSec m_cs;
static LONG m_threadCount;
static LONG m_nFlushFailureCount;
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();
public:
CRepository(CLifeControl* pControl) : TUnkBase(pControl)
{
}
~CRepository()
{
}
HRESULT GetNamespaceHandle(LPCWSTR wszNamespaceName,
CNamespaceHandle** ppHandle);
};
#endif /*__CREPOSIT__H_*/