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.
 
 
 
 
 
 

425 lines
10 KiB

/*++
Copyright (c) 1998-2000 Microsoft Corporation
Module Name:
metabase.h
Abstract:
This file contains implementation of:
CMetabase, CServerMethod
CMetabase encapsulates an IMSAdminBase pointer.
Author:
???
Revision History:
Mohit Srivastava 18-Dec-00
--*/
#ifndef _metabase_h_
#define _metabase_h_
#include <iadmw.h>
#include <comdef.h>
//
// Used by CMetabase
//
#define MAX_METABASE_PATH 1024
#define DEFAULT_TIMEOUT_VALUE 30000
//
// Period to sleep while waiting for service to attain desired state
// Used by CServerMethod
//
#define SLEEP_INTERVAL (500L)
#define MAX_SLEEP_INST (60000) // For an instance
class CMetabase;
//
// CMetabaseCache
//
class CMetabaseCache
{
private:
static const m_cbBufFixed = 1024;
BYTE m_pBufFixed[m_cbBufFixed];
LPBYTE m_pBufDynamic;
LPBYTE m_pBuf;
DWORD m_cbBuf;
DWORD m_dwNumEntries;
METADATA_HANDLE m_hKey;
public:
CMetabaseCache()
{
memset(m_pBufFixed, 0, sizeof(m_pBufFixed));
m_pBufDynamic = NULL;
m_pBuf = NULL;
m_cbBuf = 0;
m_dwNumEntries = 0;
m_hKey = 0;
}
~CMetabaseCache()
{
delete [] m_pBufDynamic;
m_pBufDynamic = NULL;
m_pBuf = NULL;
}
METADATA_HANDLE GetHandle()
{
return m_hKey;
}
HRESULT Populate(
IMSAdminBase* i_pIABase,
METADATA_HANDLE i_hKey);
HRESULT GetProp(
DWORD i_dwId,
DWORD i_dwUserType,
DWORD i_dwDataType,
LPBYTE* o_ppData,
METADATA_GETALL_RECORD** o_ppmr) const;
};
class CMetabaseKeyList
{
public:
CMetabaseKeyList()
{
InitializeListHead(&m_leHead);
}
~CMetabaseKeyList()
{
while(!IsListEmpty(&m_leHead))
{
CKeyListNode* pNode =
CONTAINING_RECORD(m_leHead.Flink, CKeyListNode, m_leEntry);
DBG_ASSERT(pNode != NULL);
RemoveEntryList(&pNode->m_leEntry);
delete pNode;
pNode = NULL;
}
}
HRESULT Add(METADATA_HANDLE i_hKey)
{
CKeyListNode* pNew = new CKeyListNode;
if(pNew == NULL)
{
return WBEM_E_OUT_OF_MEMORY;
}
pNew->hKey = i_hKey;
InsertHeadList(&m_leHead, &pNew->m_leEntry);
return WBEM_S_NO_ERROR;
}
HRESULT Remove(METADATA_HANDLE i_hKey)
{
LIST_ENTRY* pleEntry = &m_leHead;
while(pleEntry->Flink != pleEntry)
{
CKeyListNode* pNode =
CONTAINING_RECORD(pleEntry->Flink, CKeyListNode, m_leEntry);
if(pNode->hKey == i_hKey)
{
RemoveEntryList(&pNode->m_leEntry);
delete pNode;
pNode = NULL;
return WBEM_S_NO_ERROR;
}
pleEntry = pleEntry->Flink;
}
return WBEM_E_FAILED;
}
struct CKeyListNode
{
LIST_ENTRY m_leEntry;
METADATA_HANDLE hKey;
};
const LIST_ENTRY* GetHead() const { return &m_leHead; }
private:
LIST_ENTRY m_leHead;
};
//
// CMetabase
//
class CMetabase
{
private:
IMSAdminBase2* m_pIABase;
CMetabaseKeyList m_keyList;
CMetabaseCache* m_pNodeCache;
bool CheckKeyType(
LPCWSTR i_wszKeyTypeCurrent,
METABASE_KEYTYPE*& io_pktKeyTypeSearch);
public:
CMetabase();
~CMetabase();
operator IMSAdminBase2*()
{
return m_pIABase;
}
//
// IMSAdminBase/IMSAdminBase2 methods exposed thru WMI
//
HRESULT SaveData();
HRESULT BackupWithPasswd(
LPCWSTR i_wszMDBackupLocation,
DWORD i_dwMDVersion,
DWORD i_dwMDFlags,
LPCWSTR i_wszPassword);
HRESULT DeleteBackup(
LPCWSTR i_wszMDBackupLocation,
DWORD i_dwMDVersion);
HRESULT EnumBackups(
LPWSTR io_wszMDBackupLocation,
DWORD* o_pdwMDVersion,
PFILETIME o_pftMDBackupTime,
DWORD i_dwMDEnumIndex);
HRESULT RestoreWithPasswd(
LPCWSTR i_wszMDBackupLocation,
DWORD i_dwMDVersion,
DWORD i_dwMDFlags,
LPCWSTR i_wszPassword);
HRESULT Export(
LPCWSTR i_wszPasswd,
LPCWSTR i_wszFileName,
LPCWSTR i_wszSourcePath,
DWORD i_dwMDFlags);
HRESULT Import(
LPCWSTR i_wszPasswd,
LPCWSTR i_wszFileName,
LPCWSTR i_wszSourcePath,
LPCWSTR i_wszDestPath,
DWORD i_dwMDFlags);
HRESULT RestoreHistory(
LPCWSTR i_wszMDHistoryLocation,
DWORD i_dwMDMajorVersion,
DWORD i_dwMDMinorVersion,
DWORD i_dwMDFlags);
HRESULT EnumHistory(
LPWSTR io_wszMDHistoryLocation,
DWORD* o_pdwMDMajorVersion,
DWORD* o_pdwMDMinorVersion,
PFILETIME o_pftMDHistoryTime,
DWORD i_dwMDEnumIndex);
//
// Other IMSAdminBase methods
//
void CloseKey(METADATA_HANDLE i_hKey);
METADATA_HANDLE OpenKey(LPCWSTR i_wszKey, BOOL i_bWrite);
METADATA_HANDLE CreateKey(LPCWSTR i_wszKey);
bool CheckKey(LPCWSTR i_wszKey);
HRESULT CheckKey(LPCWSTR i_wszKey, METABASE_KEYTYPE* i_pktSearchKeyType);
HRESULT DeleteKey(METADATA_HANDLE i_hKey, LPCWSTR i_wszKeyPath);
//
// Cache
//
void CacheInit(METADATA_HANDLE i_hKey);
void CacheFree();
//
// Get Data from metabase and convert to WMI-friendly format
//
void Get(
METADATA_HANDLE i_hKey,
METABASE_PROPERTY* i_pmbp,
CWbemServices* i_pNamespace,
_variant_t& io_vt,
BOOL* io_pbIsInherited,
BOOL* io_pbIsDefault);
void GetDword(
METADATA_HANDLE i_hKey,
METABASE_PROPERTY* i_pmbp,
_variant_t& io_vt,
BOOL* io_pbIsInherited,
BOOL* io_pbIsDefault);
void GetString(
METADATA_HANDLE i_hKey,
METABASE_PROPERTY* i_pmbp,
_variant_t& io_vt,
BOOL* io_pbIsInherited,
BOOL* io_pbIsDefault);
void GetMultiSz(
METADATA_HANDLE i_hKey,
METABASE_PROPERTY* i_pmbp,
CWbemServices* i_pNamespace,
_variant_t& io_vt,
BOOL* io_pbIsInherited,
BOOL* io_pbIsDefault);
void GetBinary(
METADATA_HANDLE i_hKey,
METABASE_PROPERTY* i_pmbp,
_variant_t& io_vt,
BOOL* io_pbIsInherited,
BOOL* io_pbIsDefault);
//
// Put data to metabase (converting from WMI-friendly format in the process)
//
void Put(
METADATA_HANDLE i_hKey,
METABASE_PROPERTY* i_pmbp,
CWbemServices* i_pNamespace,
_variant_t& i_vt,
_variant_t* i_pvtOld, // can be NULL
DWORD i_dwQuals=0,
BOOL i_bDoDiff=false);
void PutDword(
METADATA_HANDLE i_hKey,
METABASE_PROPERTY* i_pmbp,
_variant_t& i_vt,
_variant_t* i_pvtOld, // can be NULL
DWORD i_dwQuals=0,
BOOL i_bDoDiff=false);
void PutString(
METADATA_HANDLE i_hKey,
METABASE_PROPERTY* i_pmbp,
_variant_t& i_vt,
_variant_t* i_pvtOld, // can be NULL
DWORD i_dwQuals=0,
BOOL i_bDoDiff=false);
void PutMultiSz(
METADATA_HANDLE i_hKey,
METABASE_PROPERTY* i_pmbp,
CWbemServices* i_pNamespace,
_variant_t& i_vt,
_variant_t* i_pvtOld, // can be NULL
DWORD i_dwQuals=0,
BOOL i_bDoDiff=false);
void PutBinary(
METADATA_HANDLE i_hKey,
METABASE_PROPERTY* i_pmbp,
_variant_t& i_vt,
_variant_t* i_pvtOld, // can be NULL
DWORD i_dwQuals=0,
BOOL i_bDoDiff=false);
void PutMethod(
LPWSTR i_wszPath,
DWORD i_id);
//
// Delete from metabase
//
void DeleteData(
METADATA_HANDLE i_hKey,
DWORD i_dwMDIdentifier,
DWORD i_dwMDDataType);
void DeleteData(
METADATA_HANDLE i_hKey,
METABASE_PROPERTY* i_pmbp,
bool i_bThrowOnRO);
HRESULT EnumKeys(
METADATA_HANDLE i_hKey,
LPCWSTR i_wszMDPath,
LPWSTR io_wszMDName,
DWORD* io_pdwMDEnumKeyIndex,
METABASE_KEYTYPE*& io_pktKeyTypeSearch,
bool i_bLookForMatchAtCurrentLevelOnly=false);
HRESULT WebAppCheck(METADATA_HANDLE);
HRESULT WebAppGetStatus(METADATA_HANDLE, PDWORD);
HRESULT WebAppSetStatus(METADATA_HANDLE, DWORD);
};
//
// Handles the Server.{Start,Stop,Pause,Continue} methods
//
class CServerMethod
{
private:
LPWSTR m_wszPath; // full metabase path of loc where we will execute method
IMSAdminBase* m_pIABase;
HRESULT IISGetServerState(
METADATA_HANDLE hObjHandle,
LPDWORD pdwState);
HRESULT IISGetServerWin32Error(
METADATA_HANDLE hObjHandle,
HRESULT* phrError);
HRESULT IISSetDword(
METADATA_HANDLE hKey,
DWORD dwPropId,
DWORD dwValue);
public:
CServerMethod()
{
m_wszPath = 0;
}
HRESULT Initialize(IMSAdminBase* i_pIABase, LPWSTR i_wszPath)
{
m_pIABase = i_pIABase;
m_wszPath = new WCHAR[wcslen(i_wszPath)+1];
if(m_wszPath == NULL)
{
return E_OUTOFMEMORY;
}
wcscpy(m_wszPath, i_wszPath);
return S_OK;
}
~CServerMethod()
{
delete [] m_wszPath;
}
HRESULT ExecMethod(DWORD dwControl);
};
#endif