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.
 
 
 
 
 
 

881 lines
23 KiB

// wamreg.cpp : Implementation of DLL Exports.
// Note: Proxy/Stub Information
// To merge the proxy/stub code into the object DLL, add the file
// dlldatax.c to the project. Make sure precompiled headers
// are turned off for this file, and add _MERGE_PROXYSTUB to the
// defines for the project.
//
// If you are not running WinNT4.0 or Win95 with DCOM, then you
// need to remove the following define from dlldatax.c
// #define _WIN32_WINNT 0x0400
//
// Further, if you are running MIDL without /Oicf switch, you also
// need to remove the following define from dlldatax.c.
// #define USE_STUBLESS_PROXY
//
// Modify the custom build rule for wamreg.idl by adding the following
// files to the Outputs.
// wamreg_p.c
// dlldata.c
// To build a separate proxy/stub DLL,
// run nmake -f wamregps.mk in the project directory.
#include "common.h"
#include "objbase.h"
#include "initguid.h"
#include "iwamreg.h"
#include "iadmext.h"
#include "dlldatax.h"
#include "auxfunc.h"
#include "wmrgsv.h"
#include "WamAdm.h"
#include "comobj.h"
#include "dbgutil.h"
#ifdef _MERGE_PROXYSTUB
extern "C" HINSTANCE hProxyDll;
#endif
#define IIS_DEFAULT_PACKAGE 0
#ifndef _NO_TRACING_
#include <initguid.h>
DEFINE_GUID(IisWamRegGuid,
0x784d8917, 0xaa8c, 0x11d2, 0x92, 0x5e, 0x00, 0xc0, 0x4f, 0x72, 0xd9, 0x0e);
#ifdef _IIS_6_0
#include "w3ctrlps.h"
#endif // _IIS_6_0
#endif
DECLARE_DEBUG_VARIABLE();
DECLARE_DEBUG_PRINTS_OBJECT();
DECLARE_PLATFORM_TYPE();
const CHAR g_pszModuleName[] = "WAMREG";
HINSTANCE g_hModule = NULL;
/////////////////////////////////////////////////////////////////////////////
// DLL Entry Point
extern "C"
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
lpReserved;
#ifdef _MERGE_PROXYSTUB
if (!PrxDllMain(hInstance, dwReason, lpReserved))
return FALSE;
#endif
BOOL fReturn = FALSE;
if (dwReason == DLL_PROCESS_ATTACH)
{
DisableThreadLibraryCalls(hInstance);
g_hModule = hInstance;
INITIALIZE_PLATFORM_TYPE();
#ifdef _NO_TRACING_
SET_DEBUG_FLAGS(DEBUG_ERROR);
CREATE_DEBUG_PRINT_OBJECT( g_pszModuleName);
#else
// CREATE_DEBUG_PRINT_OBJECT( g_pszModuleName);
#endif
/*
if ( !VALID_DEBUG_PRINT_OBJECT())
{
fReturn = FALSE;
}
else
{
*/
g_pWmRgSrvFactory = new CWmRgSrvFactory();
fReturn = g_WamRegGlobal.Init();
//}
}
else if (dwReason == DLL_PROCESS_DETACH)
{
g_WamRegGlobal.UnInit();
delete g_pWmRgSrvFactory;
DELETE_DEBUG_PRINT_OBJECT();
}
fReturn = TRUE; // ok
return fReturn;
}
/////////////////////////////////////////////////////////////////////////////
// Used to determine whether the DLL can be unloaded by OLE
STDAPI DllCanUnloadNow(void)
{
#ifdef _MERGE_PROXYSTUB
if (PrxDllCanUnloadNow() != S_OK)
return S_FALSE;
#endif
if (g_dwRefCount == 0)
{
return S_OK;
}
else
{
return S_FALSE;
}
}
/////////////////////////////////////////////////////////////////////////////
// Returns a class factory to create an object of the requested type
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
{
HRESULT hrReturn = E_FAIL;
#ifdef _MERGE_PROXYSTUB
if (PrxDllGetClassObject(rclsid, riid, ppv) == S_OK)
return S_OK;
#endif
if (rclsid == CLSID_WmRgSrv)
{
if (FAILED(g_pWmRgSrvFactory->QueryInterface(riid, ppv)))
{
*ppv = NULL;
hrReturn = E_INVALIDARG;
}
else
{
hrReturn = NOERROR;
}
}
else
{
hrReturn = S_OK;
}
return hrReturn;
}
HRESULT WamReg_RegisterServer()
{
HKEY hKeyCLSID, hKeyInproc32;
HKEY hKeyIF, hKeyStub32;
HKEY hKeyAppID, hKeyTemp;
DWORD dwDisposition;
BOOL fIsWin95 = FALSE;
char pszName[MAX_PATH+1 + sizeof("inetinfo.exe -e iisadmin")];
//
// if win95, then don't register as service
//
if ( IISGetPlatformType() == PtWindows95 ) {
fIsWin95 = TRUE;
}
if (fIsWin95) {
HMODULE hModule=GetModuleHandle(TEXT("WAMREG.DLL"));
if (!hModule) {
return E_UNEXPECTED;
}
WCHAR wchName[MAX_PATH + 1];
if (GetModuleFileName(hModule, pszName, sizeof(pszName))==0) {
return E_UNEXPECTED;
}
int i;
//
// Set pszName to the command to start the web server
//
for (i = strlen(pszName) -1; (i >= 0) && (pszName[i] != '/') & (pszName[i] != '\\'); i--) {
}
pszName[i + 1] = '\0';
strcat(pszName, "inetinfo.exe -e iisadmin");
}
HRESULT hr;
//
//register AppID
//CLSID_WamAdmin, 0x61738644, 0xF196, 0x11D0, 0x99, 0x53, 0x00, 0xC0, 0x4F, 0xD9, 0x19, 0xC1)
//
if (ERROR_SUCCESS != RegCreateKeyEx(HKEY_CLASSES_ROOT,
TEXT("AppID\\{61738644-F196-11D0-9953-00C04FD919C1}"),
NULL,
TEXT(""),
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hKeyAppID,
&dwDisposition))
{
return E_UNEXPECTED;
}
else
{
if (ERROR_SUCCESS != RegSetValueEx(hKeyAppID,
TEXT(""),
NULL,
REG_SZ,
(BYTE*) TEXT("IIS WAMREG admin Service"),
sizeof(TEXT("IIS WAMREG Admin Service"))))
{
RegCloseKey(hKeyAppID);
return E_UNEXPECTED;
}
if (!fIsWin95)
{
if (ERROR_SUCCESS != RegSetValueEx(hKeyAppID,
TEXT("LocalService"),
NULL,
REG_SZ,
(BYTE *) TEXT("IISADMIN"),
sizeof(TEXT("IISADMIN"))))
{
RegCloseKey(hKeyAppID);
return E_UNEXPECTED;
}
}
RegCloseKey(hKeyAppID);
}
//
// register CLSID
//WamAdmin_CLSID
if (ERROR_SUCCESS != RegCreateKeyEx(HKEY_CLASSES_ROOT,
TEXT("CLSID\\{61738644-F196-11D0-9953-00C04FD919C1}"),
NULL,
TEXT(""),
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hKeyCLSID,
&dwDisposition))
{
return E_UNEXPECTED;
}
else
{
if (ERROR_SUCCESS != RegSetValueEx(hKeyCLSID,
TEXT(""),
NULL,
REG_SZ,
(BYTE*) TEXT("IIS WAMREG Admin"),
sizeof(TEXT("IIS WAMREG Admin"))))
{
RegCloseKey(hKeyCLSID);
return E_UNEXPECTED;
}
if (ERROR_SUCCESS != RegSetValueEx(hKeyCLSID,
TEXT("AppID"),
NULL,
REG_SZ,
(BYTE*) TEXT("{61738644-F196-11D0-9953-00C04FD919C1}"),
sizeof(TEXT("{61738644-F196-11D0-9953-00C04FD919C1}"))))
{
RegCloseKey(hKeyCLSID);
return E_UNEXPECTED;
}
if (fIsWin95)
{
if (ERROR_SUCCESS != RegCreateKeyEx(hKeyCLSID,
TEXT("LocalServer32"),
NULL,
TEXT(""),
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hKeyTemp,
&dwDisposition))
{
RegCloseKey(hKeyCLSID);
return E_UNEXPECTED;
}
else
{
if (ERROR_SUCCESS != RegSetValueEx(hKeyTemp,
TEXT(""),
NULL,
REG_SZ,
(BYTE*) pszName,
strlen(pszName) + 1))
{
RegCloseKey(hKeyTemp);
RegCloseKey(hKeyCLSID);
return E_UNEXPECTED;
}
RegCloseKey(hKeyTemp);
}
}
else
{
if (ERROR_SUCCESS != RegSetValueEx(hKeyCLSID,
TEXT("LocalService"),
NULL,
REG_SZ,
(BYTE*) TEXT("IISADMIN"),
sizeof(TEXT("IISADMIN"))))
{
RegCloseKey(hKeyCLSID);
return E_UNEXPECTED;
}
}
RegCloseKey(hKeyCLSID);
}
//
// Main Interfaces
//
//
// WAMREG Admin Interface
//IID_IWamAdmin, 0x29822AB7, 0xF302, 0x11D0, 0x99, 0x53, 0x00, 0xC0, 0x4F, 0xD9, 0x19, 0xC1
if (ERROR_SUCCESS != RegCreateKeyEx(HKEY_CLASSES_ROOT,
TEXT("CLSID\\{29822AB7-F302-11D0-9953-00C04FD919C1}"),
NULL,
TEXT(""),
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hKeyCLSID,
&dwDisposition))
{
return E_UNEXPECTED;
}
else
{
if (ERROR_SUCCESS != RegSetValueEx(hKeyCLSID,
TEXT(""),
NULL,
REG_SZ,
(BYTE*) TEXT("PSFactoryBuffer"),
sizeof(TEXT("PSFactoryBuffer"))))
{
RegCloseKey(hKeyCLSID);
return E_UNEXPECTED;
}
if (ERROR_SUCCESS != RegCreateKeyEx(hKeyCLSID,
"InprocServer32",
NULL,
TEXT(""),
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hKeyInproc32,
&dwDisposition))
{
RegCloseKey(hKeyCLSID);
return E_UNEXPECTED;
}
else
{
if (ERROR_SUCCESS != RegSetValueEx(hKeyInproc32,
TEXT(""),
NULL,
REG_SZ,
(BYTE*) "WAMREGPS.DLL",
sizeof(TEXT("WAMREGPS.DLL"))))
{
RegCloseKey(hKeyInproc32);
RegCloseKey(hKeyCLSID);
return E_UNEXPECTED;
}
if (ERROR_SUCCESS != RegSetValueEx(hKeyInproc32,
TEXT("ThreadingModel"),
NULL,
REG_SZ,
(BYTE*) "Both",
sizeof("Both")-1 ))
{
RegCloseKey(hKeyInproc32);
RegCloseKey(hKeyCLSID);
return E_UNEXPECTED;
}
RegCloseKey(hKeyInproc32);
}
RegCloseKey(hKeyCLSID);
}
//
// WAMREG Admin Interface
//IID_IWamAdmin2, 0x29822AB8, 0xF302, 0x11D0, 0x99, 0x53, 0x00, 0xC0, 0x4F, 0xD9, 0x19, 0xC1
if (ERROR_SUCCESS != RegCreateKeyEx(HKEY_CLASSES_ROOT,
TEXT("CLSID\\{29822AB8-F302-11D0-9953-00C04FD919C1}"),
NULL,
TEXT(""),
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hKeyCLSID,
&dwDisposition))
{
return E_UNEXPECTED;
}
else
{
if (ERROR_SUCCESS != RegSetValueEx(hKeyCLSID,
TEXT(""),
NULL,
REG_SZ,
(BYTE*) TEXT("PSFactoryBuffer"),
sizeof(TEXT("PSFactoryBuffer"))))
{
RegCloseKey(hKeyCLSID);
return E_UNEXPECTED;
}
if (ERROR_SUCCESS != RegCreateKeyEx(hKeyCLSID,
"InprocServer32",
NULL,
TEXT(""),
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hKeyInproc32,
&dwDisposition))
{
RegCloseKey(hKeyCLSID);
return E_UNEXPECTED;
}
else
{
if (ERROR_SUCCESS != RegSetValueEx(hKeyInproc32,
TEXT(""),
NULL,
REG_SZ,
(BYTE*) "WAMREGPS.DLL",
sizeof(TEXT("WAMREGPS.DLL"))))
{
RegCloseKey(hKeyInproc32);
RegCloseKey(hKeyCLSID);
return E_UNEXPECTED;
}
if (ERROR_SUCCESS != RegSetValueEx(hKeyInproc32,
TEXT("ThreadingModel"),
NULL,
REG_SZ,
(BYTE*) "Both",
sizeof("Both")-1 ))
{
RegCloseKey(hKeyInproc32);
RegCloseKey(hKeyCLSID);
return E_UNEXPECTED;
}
RegCloseKey(hKeyInproc32);
}
RegCloseKey(hKeyCLSID);
}
//
//
// register Interfaces
//
//
// ANSI Main Interface
// WamReg Admin Interface
if (ERROR_SUCCESS != RegCreateKeyEx(HKEY_CLASSES_ROOT,
TEXT("Interface\\{29822AB7-F302-11D0-9953-00C04FD919C1}"),
NULL,
TEXT(""),
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hKeyIF,
&dwDisposition))
{
return E_UNEXPECTED;
}
else
{
if (ERROR_SUCCESS != RegSetValueEx(hKeyIF,
TEXT(""),
NULL,
REG_SZ,
(BYTE*) TEXT("IWamAdmin"),
sizeof(TEXT("IWamAdmin"))))
{
RegCloseKey(hKeyIF);
return E_UNEXPECTED;
}
if (ERROR_SUCCESS != RegCreateKeyEx(hKeyIF,
"ProxyStubClsid32",
NULL,
TEXT(""),
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hKeyStub32,
&dwDisposition))
{
RegCloseKey(hKeyIF);
return E_UNEXPECTED;
}
else
{
if (ERROR_SUCCESS != RegSetValueEx(hKeyStub32,
TEXT(""),
NULL,
REG_SZ,
(BYTE*)"{29822AB7-F302-11D0-9953-00C04FD919C1}",
sizeof("{29822AB7-F302-11D0-9953-00C04FD919C1}")))
{
RegCloseKey(hKeyStub32);
RegCloseKey(hKeyIF);
return E_UNEXPECTED;
}
RegCloseKey(hKeyStub32);
}
RegCloseKey(hKeyIF);
}
// WamReg Admin Interface
// IID_IWamAdmin2
if (ERROR_SUCCESS != RegCreateKeyEx(HKEY_CLASSES_ROOT,
TEXT("Interface\\{29822AB8-F302-11D0-9953-00C04FD919C1}"),
NULL,
TEXT(""),
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hKeyIF,
&dwDisposition))
{
return E_UNEXPECTED;
}
else
{
if (ERROR_SUCCESS != RegSetValueEx(hKeyIF,
TEXT(""),
NULL,
REG_SZ,
(BYTE*) TEXT("IWamAdmin2"),
sizeof(TEXT("IWamAdmin2"))))
{
RegCloseKey(hKeyIF);
return E_UNEXPECTED;
}
if (ERROR_SUCCESS != RegCreateKeyEx(hKeyIF,
"ProxyStubClsid32",
NULL,
TEXT(""),
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hKeyStub32,
&dwDisposition))
{
RegCloseKey(hKeyIF);
return E_UNEXPECTED;
}
else
{
if (ERROR_SUCCESS != RegSetValueEx(hKeyStub32,
TEXT(""),
NULL,
REG_SZ,
(BYTE*)"{29822AB8-F302-11D0-9953-00C04FD919C1}",
sizeof("{29822AB8-F302-11D0-9953-00C04FD919C1}")))
{
RegCloseKey(hKeyStub32);
RegCloseKey(hKeyIF);
return E_UNEXPECTED;
}
RegCloseKey(hKeyStub32);
}
RegCloseKey(hKeyIF);
}
return NOERROR;
}
STDAPI WamReg_UnRegisterServer(void) {
BOOL fIsWin95 = FALSE;
//
// if win95, then don't register as service
//
if ( IISGetPlatformType() == PtWindows95 ) {
fIsWin95 = TRUE;
}
//
// register AppID
//
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("AppID\\{61738644-F196-11D0-9953-00C04FD919C1}"));
//RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("AppID\\{61738646-F196-11D0-9953-00C04FD919C1}"));
//
// register CLSID
//
if (fIsWin95)
{
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("CLSID\\{61738644-F196-11D0-9953-00C04FD919C1}\\LocalServer32"));
}
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("CLSID\\{61738644-F196-11D0-9953-00C04FD919C1}"));
/*
if (fIsWin95) {
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("CLSID\\{61738646-F196-11D0-9953-00C04FD919C1}\\LocalServer32"));
}
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("CLSID\\{61738646-F196-11D0-9953-00C04FD919C1}"));
*/
//
// WAMREG Interfaces
//
//
// Admin Interface
//
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("CLSID\\{29822AB7-F302-11D0-9953-00C04FD919C1}\\InprocServer32"));
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("CLSID\\{29822AB7-F302-11D0-9953-00C04FD919C1}"));
//
// Replication Interface
//
/*
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("CLSID\\{29822AB8-F302-11D0-9953-00C04FD919C1}\\InprocServer32"));
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("CLSID\\{29822AB8-F302-11D0-9953-00C04FD919C1}"));
*/
//
// deregister Interfaces
//
//
// Admin Interface
//
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("Interface\\{29822AB7-F302-11D0-9953-00C04FD919C1}\\ProxyStubClsid32"));
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("Interface\\{29822AB7-F302-11D0-9953-00C04FD919C1}"));
/*
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("Interface\\{29822AB8-F302-11D0-9953-00C04FD919C1}\\ProxyStubClsid32"));
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("Interface\\{29822AB8-F302-11D0-9953-00C04FD919C1}"));
*/
return NOERROR;
}
/////////////////////////////////////////////////////////////////////////////
// DllRegisterServer - Adds entries to the system registry
STDAPI DllRegisterServer(void)
{
HKEY hKeyCLSID, hKeyInproc32;
DWORD dwDisposition;
HMODULE hModule;
DWORD dwReturn = ERROR_SUCCESS;
#ifdef _MERGE_PROXYSTUB
HRESULT hRes = PrxDllRegisterServer();
if (FAILED(hRes))
return hRes;
#endif
dwReturn = RegCreateKeyEx(HKEY_CLASSES_ROOT,
TEXT("CLSID\\{763A6C86-F30F-11D0-9953-00C04FD919C1}"),
NULL,
TEXT(""),
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hKeyCLSID,
&dwDisposition);
if (dwReturn == ERROR_SUCCESS)
{
dwReturn = RegSetValueEx(hKeyCLSID,
TEXT(""),
NULL,
REG_SZ,
(BYTE*) TEXT("WAM REG COM LAYER"),
sizeof(TEXT("WAM REG COM LAYER")));
if (dwReturn == ERROR_SUCCESS)
{
dwReturn = RegCreateKeyEx(hKeyCLSID,
"InprocServer32",
NULL,
TEXT(""),
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hKeyInproc32,
&dwDisposition);
if (dwReturn == ERROR_SUCCESS)
{
hModule=GetModuleHandle(TEXT("WAMREG.DLL"));
if (!hModule)
{
dwReturn = GetLastError();
}
else
{
TCHAR szName[MAX_PATH+1];
if (GetModuleFileName(hModule,
szName,
sizeof(szName)) == NULL)
{
dwReturn = GetLastError();
}
else
{
dwReturn = RegSetValueEx(hKeyInproc32,
TEXT(""),
NULL,
REG_SZ,
(BYTE*) szName,
sizeof(TCHAR)*(lstrlen(szName)+1));
if (dwReturn == ERROR_SUCCESS)
{
dwReturn = RegSetValueEx(hKeyInproc32,
TEXT("ThreadingModel"),
NULL,
REG_SZ,
(BYTE*) TEXT("Both"),
sizeof(TEXT("Both")));
}
}
}
RegCloseKey(hKeyInproc32);
}
}
RegCloseKey(hKeyCLSID);
}
//
// Register the COM object's CLSID under IISADMIN_EXTENSIONS_REG_KEY
//
if (dwReturn == ERROR_SUCCESS)
{
dwReturn = RegCreateKeyEx(HKEY_LOCAL_MACHINE,
IISADMIN_EXTENSIONS_REG_KEY
TEXT("\\{763A6C86-F30F-11D0-9953-00C04FD919C1}"),
NULL,
TEXT(""),
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hKeyCLSID,
&dwDisposition);
if (dwReturn == ERROR_SUCCESS)
{
RegCloseKey(hKeyCLSID);
}
}
if (dwReturn == ERROR_SUCCESS)
{
HRESULT hr;
// registers object, typelib and all interfaces in typelib
hr = WamReg_RegisterServer();
return hr;
}
else
{
return RETURNCODETOHRESULT(dwReturn);
}
}
/////////////////////////////////////////////////////////////////////////////
// DllUnregisterServer - Removes entries from the system registry
STDAPI DllUnregisterServer(void)
{
DWORD dwReturn = ERROR_SUCCESS;
DWORD dwTemp;
#ifdef _MERGE_PROXYSTUB
PrxDllUnregisterServer();
#endif
dwTemp = RegDeleteKey(HKEY_CLASSES_ROOT,
TEXT("CLSID\\{763A6C86-F30F-11D0-9953-00C04FD919C1}\\InprocServer32"));
if (dwTemp != ERROR_SUCCESS)
{
dwReturn = dwTemp;
}
dwTemp = RegDeleteKey(HKEY_CLASSES_ROOT,
TEXT("CLSID\\{763A6C86-F30F-11D0-9953-00C04FD919C1}"));
if (dwTemp != ERROR_SUCCESS)
{
dwReturn = dwTemp;
}
dwTemp = RegDeleteKey(HKEY_LOCAL_MACHINE,
IISADMIN_EXTENSIONS_REG_KEY
TEXT("\\{763A6C86-F30F-11D0-9953-00C04FD919C1}"));
if (dwTemp != ERROR_SUCCESS)
{
dwReturn = dwTemp;
}
if (SUCCEEDED(HRESULT_FROM_WIN32(dwReturn)))
{
HRESULT hr;
hr = WamReg_UnRegisterServer();
return hr;
}
else
{
return HRESULT_FROM_WIN32(dwReturn);
}
}