windows-nt/Source/XPSP1/NT/inetsrv/iis/ui/itools/w3key/w3addon.cpp
2020-09-26 16:20:57 +08:00

231 lines
5.9 KiB
C++

// W3Key.cpp : Defines the initialization routines for the DLL.
//
#include "stdafx.h"
#include "resource.h"
#include <afxdllx.h>
#include "KeyObjs.h"
#include "wrapmb.h"
#include "CmnKey.h"
#include "W3Key.h"
#include "W3Serv.h"
#include "MDKey.h"
#include "MDServ.h"
#include "kmlsa.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
static AFX_EXTENSION_MODULE W3KeyDLL = { NULL, NULL };
// the tree control
CTreeCtrl* g_pTreeCtrl = NULL;
// the service image index
int g_iServiceImage = 0;
BOOL fInitialized = FALSE;
BOOL fInitMetaWrapper = FALSE;
HINSTANCE g_hInstance = NULL;
void LoadServiceIcon( CTreeCtrl* pTree );
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("W3KEY.DLL Initializing!\n");
// save the instance
g_hInstance = hInstance;
// Extension DLL one-time initialization
AfxInitExtensionModule(W3KeyDLL, hInstance);
// one-time initialization of ip address window
//IPAddrInit( hInstance );
//
// Changed to using common control - RonaldM
//
INITCOMMONCONTROLSEX icex;
icex.dwSize = sizeof(icex);
icex.dwICC = ICC_INTERNET_CLASSES;
InitCommonControlsEx(&icex);
//
// End of RonaldM changes
//
// Insert this DLL into the resource chain
new CDynLinkLibrary(W3KeyDLL);
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("W3KEY.DLL Terminating!\n");
if ( fInitMetaWrapper )
FCloseMetabaseWrapper();
if ( fInitialized )
CoUninitialize();
}
return 1; // ok
}
//=======================================================
// the main routine called by the keyring application
BOOL _cdecl LoadService( CMachine* pMachine )
{
BOOL fAnswer = FALSE;
HRESULT hRes;
// initialize the ole stuff if necessary
if ( !fInitialized )
{
//DebugBreak();
hRes = CoInitialize( NULL );
}
ASSERT( pMachine );
if ( !pMachine ) return FALSE;
// specify the resources to use
HINSTANCE hOldRes = AfxGetResourceHandle();
AfxSetResourceHandle( g_hInstance );
// if this is the first time through, initialize the tree control stuff
if ( !g_pTreeCtrl )
{
// get the tree control
g_pTreeCtrl = pMachine->PGetTreeCtrl();
ASSERT( g_pTreeCtrl );
// since we are adding a service icon, we need to do that now too
LoadServiceIcon( g_pTreeCtrl );
}
// see if we can access this machine
// get the wide name of the machine we intend to target
CString szName;
DWORD err;
pMachine->GetMachineName( szName );
// allocate the cache for the machine name
WCHAR* pszwMachineName = new WCHAR[MAX_PATH];
if ( !pszwMachineName ) return FALSE;
// unicodize the name
MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, szName, -1, pszwMachineName, MAX_PATH );
// drat the local name for the metabase should be null, while it should be an empty string
// for LSA. Make a temp metabase name as appropriate
WCHAR* pszwMeta;
if ( szName.IsEmpty() )
pszwMeta = NULL;
else
pszwMeta = pszwMachineName;
// first we see if we can access the metabase at the proscribed location.
if ( FInitMetabaseWrapper(pszwMeta) )
{
fInitMetaWrapper = TRUE;
// hey--- the ole interface is there. We can use the metabase
// now the whole purpose here is to setup a service object on the
// machine object. So, create the service object
try {
CMDKeyService* pKServ = new CMDKeyService;
// it needs to know the target machine
pKServ->SetMachineName( pszwMeta );
// add it to the machine
pKServ->FAddToTree( pMachine );
// load the keys
pKServ->LoadKeys( pMachine );
}
catch( CException e )
{
goto cleanup;
}
// now close the metabase again. We will open it when we need it
FCloseMetabaseWrapper();
// success!
fAnswer = TRUE;
}
else
{
// try to open the LSA policy. if this fails, then there is no server on the
// target machine - we return a false
HANDLE hPolicy = HOpenLSAPolicy( pszwMachineName, &err );
// if we did not get the policy, then fail
if ( !hPolicy )
goto cleanup;
// we did get the policy, so close it
FCloseLSAPolicy( hPolicy, &err );
// now the whole purpose here is to setup a service object on the
// machine object. So, create the service object
try {
CW3KeyService* pKServ = new CW3KeyService;
// add it to the machine
pKServ->FAddToTree( pMachine );
// load the keys
pKServ->LoadKeys( pMachine );
}
catch( CException e )
{
goto cleanup;
}
// success! - well, LSA success anyway
fAnswer = TRUE;
}
// clean up
cleanup:
delete pszwMachineName;
// restore the resources
AfxSetResourceHandle( hOldRes );
// return successfully
return fAnswer;
}
//-------------------------------------------------------------------
void LoadServiceIcon( CTreeCtrl* pTree )
{
ASSERT( pTree );
// get the image list from the tree
CImageList* pImageList = pTree->GetImageList(TVSIL_NORMAL);
ASSERT( pImageList );
// load the service bitmap
CBitmap bmpService;
if ( !bmpService.LoadBitmap( IDB_SERVICE_BMP ) )
{
ASSERT( FALSE );
return;
}
// connect the bitmap to the image list
g_iServiceImage = pImageList->Add( &bmpService, 0x00FF00FF );
}