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.
207 lines
5.1 KiB
207 lines
5.1 KiB
// MdKey.cpp
|
|
#include "stdafx.h"
|
|
|
|
// Do stuff to define the iadm guid
|
|
#include <objbase.h>
|
|
#include <initguid.h>
|
|
#define INITGUID
|
|
#include "iadm.h"
|
|
|
|
#include "mdkey.h"
|
|
|
|
#define TIMEOUT_VALUE 5000
|
|
|
|
CMDKey::CMDKey():
|
|
m_cCoInits(0)
|
|
{
|
|
m_pcCom = NULL;
|
|
m_hKey = NULL;
|
|
}
|
|
|
|
CMDKey::~CMDKey()
|
|
{
|
|
this->Close();
|
|
|
|
// while there are outstanding coinits, close them
|
|
while ( m_cCoInits > 0 && !(m_cCoInits < 0) )
|
|
DoCoUnInit();
|
|
}
|
|
|
|
HRESULT CMDKey::DoCoInitEx()
|
|
{
|
|
//HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);
|
|
HRESULT hRes = CoInitialize(NULL);
|
|
|
|
// track our calls to coinit
|
|
if ( SUCCEEDED(hRes) )
|
|
{
|
|
m_cCoInits++;
|
|
}
|
|
|
|
return hRes;
|
|
}
|
|
|
|
void CMDKey::DoCoUnInit()
|
|
{
|
|
HRESULT hRes = NOERROR;
|
|
|
|
// if there are outstanding coinits, uninit one
|
|
if ( m_cCoInits > 0 )
|
|
{
|
|
CoUninitialize();
|
|
m_cCoInits--;
|
|
}
|
|
|
|
// we shouldn't ever have a negative count. But just in case...
|
|
assert( m_cCoInits >= 0 );
|
|
if ( m_cCoInits < 0 )
|
|
{
|
|
// something is seriously wrong here. Prevent looping
|
|
// by going straight to zero, and write an error to the log.
|
|
m_cCoInits = 0;
|
|
iisDebugOut(_T("WARNING: CoInits in mdkey have gone negative"));
|
|
}
|
|
}
|
|
|
|
HRESULT CMDKey::OpenNode(LPCTSTR pchSubKeyPath)
|
|
{
|
|
HRESULT hRes = ERROR_SUCCESS;
|
|
IClassFactory * pcsfFactory = NULL;
|
|
BOOL b = FALSE;
|
|
m_pcCom = NULL;
|
|
m_hKey = NULL;
|
|
WCHAR szSubKeyPath[_MAX_PATH];
|
|
|
|
pszFailedAPI = NULL;
|
|
|
|
iisDebugOut(_T("CMDKey::OpenNode(%s).\n"), pchSubKeyPath);
|
|
|
|
if ( !pchSubKeyPath || !(*pchSubKeyPath) )
|
|
{
|
|
*szSubKeyPath = L'\0';
|
|
}
|
|
else
|
|
{
|
|
#if defined(UNICODE) || defined(_UNICODE)
|
|
_tcscpy(szSubKeyPath, pchSubKeyPath);
|
|
#else
|
|
MultiByteToWideChar( CP_ACP, 0, pchSubKeyPath, -1, szSubKeyPath, _MAX_PATH);
|
|
#endif
|
|
}
|
|
|
|
hRes = DoCoInitEx();
|
|
if (FAILED(hRes))
|
|
{
|
|
iisDebugOut(_T("CoInitializeEx() failed, hRes=%x\n"), hRes);
|
|
}
|
|
|
|
hRes = CoGetClassObject(GETAdminBaseCLSID(TRUE), CLSCTX_SERVER, NULL, IID_IClassFactory, (void**) &pcsfFactory);
|
|
if (FAILED(hRes))
|
|
{
|
|
//SetErrorFlag(__FILE__, __LINE__);
|
|
//MyMessageBox(NULL, _T("CoGetClassObject"), hRes, MB_OK | MB_SETFOREGROUND);
|
|
}
|
|
else
|
|
{
|
|
hRes = pcsfFactory->CreateInstance(NULL, IID_IMSAdminBase, (void **) &m_pcCom);
|
|
pcsfFactory->Release();
|
|
if (FAILED(hRes))
|
|
{
|
|
//SetErrorFlag(__FILE__, __LINE__);
|
|
//MyMessageBox(NULL, _T("CoCreateInstance"), hRes, MB_OK | MB_SETFOREGROUND);
|
|
}
|
|
else
|
|
{
|
|
hRes = m_pcCom->OpenKey(METADATA_MASTER_ROOT_HANDLE,szSubKeyPath,METADATA_PERMISSION_WRITE | METADATA_PERMISSION_READ,TIMEOUT_VALUE,&m_hKey);
|
|
if (FAILED(hRes))
|
|
{
|
|
if (hRes != RETURNCODETOHRESULT(ERROR_PATH_NOT_FOUND))
|
|
{
|
|
//SetErrorFlag(__FILE__, __LINE__);
|
|
//MyMessageBox(NULL, _T("OpenKey"), hRes, MB_OK | MB_SETFOREGROUND);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
b = TRUE;
|
|
}
|
|
} // end of CoCreateInstance
|
|
} // end of CoGetClassObject
|
|
|
|
if (!b) {this->Close();}
|
|
return hRes;
|
|
}
|
|
|
|
HRESULT CMDKey::Close()
|
|
{
|
|
HRESULT hRes = ERROR_SUCCESS;
|
|
if (m_pcCom)
|
|
{
|
|
if (m_hKey){hRes = m_pcCom->CloseKey(m_hKey);}
|
|
hRes = m_pcCom->Release();
|
|
}
|
|
DoCoUnInit();
|
|
m_pcCom = NULL;
|
|
m_hKey = NULL;
|
|
return hRes;
|
|
}
|
|
|
|
HRESULT CMDKey::DeleteNode(LPCTSTR pchSubKeyPath)
|
|
{
|
|
HRESULT hRes = ERROR_SUCCESS;
|
|
WCHAR szSubKeyPath[_MAX_PATH];
|
|
|
|
if ( pchSubKeyPath && (*pchSubKeyPath) )
|
|
{
|
|
#if defined(UNICODE) || defined(_UNICODE)
|
|
_tcscpy(szSubKeyPath, pchSubKeyPath);
|
|
#else
|
|
MultiByteToWideChar( CP_ACP, 0, pchSubKeyPath, -1, szSubKeyPath, _MAX_PATH );
|
|
#endif
|
|
hRes = m_pcCom->DeleteKey(m_hKey, szSubKeyPath);
|
|
}
|
|
|
|
return hRes;
|
|
}
|
|
|
|
|
|
#if !defined(UNICODE) && !defined(_UNICODE)
|
|
void MyMultiByteToWideChar( char *sData, WCHAR *wData, int cbBufSize, BOOL fMultiSZ)
|
|
{
|
|
MultiByteToWideChar( CP_ACP, 0, sData, -1, wData, cbBufSize );
|
|
while (fMultiSZ)
|
|
{
|
|
sData = _tcsninc( sData, _tcslen(sData)) + 1;
|
|
while (*wData++);
|
|
if (*sData)
|
|
{
|
|
MultiByteToWideChar( CP_ACP, 0, sData, -1, wData, cbBufSize );
|
|
}
|
|
else
|
|
{
|
|
*wData = L'\0';
|
|
break;
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
void MyWideCharToMultiByte( WCHAR *wData, char *sData, int cbBufSize, BOOL fMultiSZ)
|
|
{
|
|
WideCharToMultiByte( CP_ACP, 0, wData, -1, sData, cbBufSize, NULL, NULL );
|
|
while (fMultiSZ)
|
|
{
|
|
while (*wData++);
|
|
sData = _tcsninc( sData, _tcslen(sData)) + 1;
|
|
if (*wData)
|
|
{
|
|
WideCharToMultiByte( CP_ACP, 0, wData, -1, sData, cbBufSize, NULL, NULL );
|
|
}
|
|
else
|
|
{
|
|
*sData = '\0';
|
|
break;
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
#endif // not unicode
|