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.
|
|
// 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 ); }
|