windows-nt/Source/XPSP1/NT/net/mmc/remrras/prxydll/rrasprxy.cpp
2020-09-26 16:20:57 +08:00

241 lines
6.2 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1998 - 1999
//
// File: rrasprxy.cpp
//
//--------------------------------------------------------------------------
#include <stdafx.h>
#include <windows.h>
#include "remras.h"
#include "resource.h"
#define _ATL_APARTMENT_THREADED
#define _ATL_STATIC_REGISTRY
#include <atlbase.h>
//You may derive a class from CComModule and use it if you want to override
//something, but do not change the name of _Module
class CExeModule : public CComModule
{
public:
LONG Unlock();
DWORD dwThreadID;
};
CExeModule _Module;
#include <atlcom.h>
#undef _ATL_DLL
#include <statreg.h>
#include <statreg.cpp>
#define _ATL_DLL
#include <atlimpl.cpp>
BEGIN_OBJECT_MAP(ObjectMap)
// OBJECT_ENTRY(CLSID_RemoteRouterConfig, CRemCfg)
END_OBJECT_MAP()
extern "C" {
extern BOOL WINAPI MidlGeneratedDllMain(HINSTANCE, DWORD, LPVOID);
extern HRESULT STDAPICALLTYPE MidlGeneratedDllRegisterServer();
extern HRESULT STDAPICALLTYPE MidlGeneratedDllUnregisterServer();
extern HRESULT STDAPICALLTYPE MidlGeneratedDllGetClassObject(REFCLSID,REFIID,
void **);
extern HRESULT STDAPICALLTYPE MidlGeneratedDllCanUnloadNow();
};
LONG CExeModule::Unlock()
{
LONG l = CComModule::Unlock();
if (l == 0)
{
#if _WIN32_WINNT >= 0x0400
if (CoSuspendClassObjects() == S_OK)
PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
#else
PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
#endif
}
return l;
}
/*!--------------------------------------------------------------------------
DllMain
-
Author: KennT
---------------------------------------------------------------------------*/
BOOL WINAPI DllMain(HINSTANCE hInstance,
DWORD dwReason,
LPVOID pvReserved)
{
BOOL fReturn;
_Module.Init(ObjectMap, hInstance);
_Module.dwThreadID = GetCurrentThreadId();
fReturn = MidlGeneratedDllMain(hInstance, dwReason, pvReserved);
return fReturn;
}
/*!--------------------------------------------------------------------------
DllRegisterServer
-
Author: KennT
---------------------------------------------------------------------------*/
HRESULT STDAPICALLTYPE DllRegisterServer()
{
CRegObject ro;
WCHAR swzPath[MAX_PATH*2 + 1];
WCHAR swzModule[MAX_PATH*2 + 1];
HRESULT hRes;
int i, cLen;
GetModuleFileNameW(_Module.GetModuleInstance(), swzPath, MAX_PATH*2);
lstrcpyW(swzModule, swzPath);
// Given this path, substitue remrras.exe for rrasprxy.dll
// ----------------------------------------------------------------
cLen = lstrlenW(swzPath);
for (i=cLen; --i>=0; )
{
// Ok, this is a path marker, copy over it
// ------------------------------------------------------------
if (swzPath[i] == L'\\')
{
lstrcpyW(swzPath+i+1, L"remrras.exe");
break;
}
}
// Add in the substitute for the %REMRRAS%
// ----------------------------------------------------------------
ro.AddReplacement(L"REMRRAS", swzPath);
// We need to fix up the registrar.
// Go through and register the object CLSID for remrras.exe
// ----------------------------------------------------------------
ro.ResourceRegister(swzModule, ((UINT) LOWORD((DWORD)IDR_Remrras)), L"REGISTRY");
// Register the APPIDs
// ----------------------------------------------------------------
ro.ResourceRegister(swzModule, ((UINT) LOWORD((DWORD) IDR_REMCFG)), L"REGISTRY");
// Register the type library for REMRRAS
// ----------------------------------------------------------------
hRes = AtlModuleRegisterTypeLib(&_Module, NULL);
// Call the MIDL-generated registration (to register the
// proxy dll).
// ----------------------------------------------------------------
if (SUCCEEDED(hRes))
hRes = MidlGeneratedDllRegisterServer();
return hRes;
}
/*!--------------------------------------------------------------------------
DllUnregisterServer
-
Author: KennT
---------------------------------------------------------------------------*/
HRESULT STDAPICALLTYPE DllUnregisterServer()
{
CRegObject ro;
WCHAR swzPath[MAX_PATH*2 + 1];
WCHAR swzModule[MAX_PATH*2 + 1];
HRESULT hRes;
int i, cLen;
GetModuleFileNameW(_Module.GetModuleInstance(), swzPath, MAX_PATH*2);
lstrcpyW(swzModule, swzPath);
// Given this path, substitue remrras.exe for rrasprxy.dll
// ----------------------------------------------------------------
cLen = lstrlenW(swzPath);
for (i=cLen; --i>=0; )
{
// Ok, this is a path marker, copy over it
// ------------------------------------------------------------
if (swzPath[i] == L'\\')
{
lstrcpyW(swzPath+i+1, L"remrras.exe");
break;
}
}
// Add in the substitute for the %REMRRAS%
// ----------------------------------------------------------------
ro.AddReplacement(L"REMRRAS", swzPath);
// We need to fix up the registrar.
// Go through and register the object CLSID for remrras.exe
// ----------------------------------------------------------------
ro.ResourceUnregister(swzModule, ((UINT) LOWORD((DWORD)IDR_Remrras)), L"REGISTRY");
// Unregister the APPID
// ----------------------------------------------------------------
ro.ResourceUnregister(swzModule, ((UINT) LOWORD((DWORD)IDR_REMCFG)), L"REGISTRY");
// Unregister the type library
// ----------------------------------------------------------------
hRes = UnRegisterTypeLib(LIBID_REMRRASLib,
1, 0, // version 1.0
LOCALE_SYSTEM_DEFAULT,
SYS_WIN32);
// Call the MIDL-generated registration (to unregister the
// proxy dll).
// ----------------------------------------------------------------
hRes = MidlGeneratedDllUnregisterServer();
return hRes;
}
/*!--------------------------------------------------------------------------
DllGetClassObject
-
Author: KennT
---------------------------------------------------------------------------*/
HRESULT STDAPICALLTYPE DllGetClassObject(REFCLSID rclsid,
REFIID riid,
void **ppv)
{
return MidlGeneratedDllGetClassObject(rclsid, riid, ppv);
}
/*!--------------------------------------------------------------------------
DllCanUnloadNow
-
Author: KennT
---------------------------------------------------------------------------*/
HRESULT STDAPICALLTYPE DllCanUnloadNow()
{
return MidlGeneratedDllCanUnloadNow();
}