426 lines
10 KiB
C
426 lines
10 KiB
C
|
/*++
|
||
|
|
||
|
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
|