294 lines
6.7 KiB
C++
294 lines
6.7 KiB
C++
/*==========================================================================
|
|
*
|
|
* Copyright (C) 1999, 2000 Microsoft Corporation. All Rights Reserved.
|
|
*
|
|
* File: dllmain.cpp
|
|
* Content: This file contains all of the DLL exports except for DllGetClass / DllCanUnload
|
|
* History:
|
|
* Date By Reason
|
|
* ==== == ======
|
|
* 07/05/00 rodtoll Created
|
|
* 08/23/2000 rodtoll DllCanUnloadNow always returning TRUE!
|
|
* 08/28/2000 masonb Voice Merge: Removed OSAL_* and dvosal.h
|
|
* 06/27/2001 rodtoll RC2: DPVOICE: DPVACM's DllMain calls into acm -- potential hang
|
|
* Move global initialization to first object creation
|
|
*
|
|
***************************************************************************/
|
|
|
|
#include "dpvacmpch.h"
|
|
|
|
|
|
#ifdef DPLAY_LOADANDCHECKTRUE
|
|
HRESULT InitializeRedirectFunctionTable()
|
|
HRESULT FreeRedirectFunctionTable()
|
|
#endif
|
|
|
|
LONG lInitCount = 0;
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "RegisterDefaultSettings"
|
|
//
|
|
// RegisterDefaultSettings
|
|
//
|
|
// This function registers the default settings for this module.
|
|
//
|
|
// For DPVOICE.DLL this is making sure the compression provider sub-key is created.
|
|
//
|
|
HRESULT RegisterDefaultSettings()
|
|
{
|
|
CRegistry creg;
|
|
|
|
|
|
|
|
if( !creg.Open( HKEY_LOCAL_MACHINE, DPVOICE_REGISTRY_BASE DPVOICE_REGISTRY_CP DPVOICE_REGISTRY_DPVACM, FALSE, TRUE ) )
|
|
{
|
|
DPFERR( "Could not create dpvacm config key" );
|
|
return DVERR_GENERIC;
|
|
}
|
|
else
|
|
{
|
|
if( !creg.WriteGUID( L"", DPVOICE_CLSID_DPVACM ) )
|
|
{
|
|
DPFERR( "Could not write dpvacm GUID" );
|
|
return DVERR_GENERIC;
|
|
}
|
|
|
|
return DV_OK;
|
|
}
|
|
}
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "UnRegisterDefaultSettings"
|
|
//
|
|
// UnRegisterDefaultSettings
|
|
//
|
|
// This function unregisters the default settings for this module.
|
|
//
|
|
// For DPVOICE.DLL this is making sure the compression provider sub-key is created.
|
|
//
|
|
HRESULT UnRegisterDefaultSettings()
|
|
{
|
|
CRegistry creg;
|
|
|
|
if( !creg.Open( HKEY_LOCAL_MACHINE, DPVOICE_REGISTRY_BASE DPVOICE_REGISTRY_CP, FALSE, FALSE ) )
|
|
{
|
|
DPFERR( "Cannot remove DPVACM key, does not exist" );
|
|
}
|
|
else
|
|
{
|
|
if( !creg.DeleteSubKey( &(DPVOICE_REGISTRY_DPVACM)[1] ) )
|
|
{
|
|
DPFERR( "Could not remove DPVACM sub-key" );
|
|
}
|
|
}
|
|
|
|
return DV_OK;
|
|
}
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "DllRegisterServer"
|
|
HRESULT WINAPI DllRegisterServer()
|
|
{
|
|
HRESULT hr = S_OK;
|
|
BOOL fFailed = FALSE;
|
|
|
|
if( !CRegistry::Register( L"DirectPlayVoiceACM.Converter.1", L"DirectPlayVoice ACM Converter Object",
|
|
L"dpvacm.dll", DPVOICE_CLSID_DPVACM_CONVERTER, L"DirectPlayVoiceACM.Converter") )
|
|
{
|
|
DPFERR( "Could not register converter object" );
|
|
fFailed = TRUE;
|
|
}
|
|
|
|
if( !CRegistry::Register( L"DirectPlayVoiceACM.Provider.1", L"DirectPlayVoice ACM Provider Object",
|
|
L"dpvacm.dll", DPVOICE_CLSID_DPVACM , L"DirectPlayVoiceACM.Provider") )
|
|
{
|
|
DPFERR( "Could not register provider object" );
|
|
fFailed = TRUE;
|
|
}
|
|
|
|
|
|
if( FAILED( hr = RegisterDefaultSettings() ) )
|
|
{
|
|
DPFX(DPFPREP, 0, "Could not register default settings hr = 0x%x", hr );
|
|
fFailed = TRUE;
|
|
}
|
|
|
|
if( fFailed )
|
|
{
|
|
return E_FAIL;
|
|
}
|
|
else
|
|
{
|
|
return S_OK;
|
|
}
|
|
}
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "DllUnregisterServer"
|
|
STDAPI DllUnregisterServer()
|
|
{
|
|
HRESULT hr = S_OK;
|
|
BOOL fFailed = FALSE;
|
|
|
|
if( !CRegistry::UnRegister(DPVOICE_CLSID_DPVACM_CONVERTER) )
|
|
{
|
|
DPFX(DPFPREP, DVF_ERRORLEVEL, "Failed to unregister server object" );
|
|
fFailed = TRUE;
|
|
}
|
|
|
|
if( !CRegistry::UnRegister(DPVOICE_CLSID_DPVACM) )
|
|
{
|
|
DPFX(DPFPREP, DVF_ERRORLEVEL, "Failed to unregister compat object" );
|
|
fFailed = TRUE;
|
|
}
|
|
|
|
if( FAILED( hr = UnRegisterDefaultSettings() ) )
|
|
{
|
|
DPFX(DPFPREP, 0, "Could not remove default settings hr=0x%x", hr );
|
|
fFailed = TRUE;
|
|
}
|
|
|
|
if( fFailed )
|
|
{
|
|
return E_FAIL;
|
|
}
|
|
else
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "DllMain"
|
|
BOOL WINAPI DllMain(
|
|
HINSTANCE hDllInst,
|
|
DWORD fdwReason,
|
|
LPVOID lpvReserved)
|
|
{
|
|
if( fdwReason == DLL_PROCESS_ATTACH )
|
|
{
|
|
if( !lInitCount )
|
|
{
|
|
g_hDllInst = hDllInst;
|
|
|
|
if (!DNOSIndirectionInit())
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
if( !DNInitializeCriticalSection( &g_csObjectCountLock ) )
|
|
{
|
|
DNOSIndirectionDeinit();
|
|
return FALSE;
|
|
}
|
|
|
|
#ifdef DPLAY_LOADANDCHECKTRUE
|
|
InitializeRedirectFunctionTable();
|
|
#endif
|
|
DPFX(DPFPREP, DVF_INFOLEVEL, ">>>>>>>>>>>>>>>> DPF INIT CALLED <<<<<<<<<<<<<<<" );
|
|
}
|
|
|
|
InterlockedIncrement( &lInitCount );
|
|
}
|
|
else if( fdwReason == DLL_PROCESS_DETACH )
|
|
{
|
|
InterlockedDecrement( &lInitCount );
|
|
|
|
if( lInitCount == 0 )
|
|
{
|
|
DPFX(DPFPREP, DVF_INFOLEVEL, ">>>>>>>>>>>>>>>> DPF UNINITED <<<<<<<<<<<<<<<" );
|
|
#ifdef DPLAY_LOADANDCHECKTRUE
|
|
FreeRedirectFunctionTable();
|
|
#endif
|
|
DNDeleteCriticalSection(&g_csObjectCountLock);
|
|
DNOSIndirectionDeinit();
|
|
|
|
// Check to ensure we're not being unloaded with objects active
|
|
DNASSERT( g_lNumObjects == 0 && g_lNumLocks == 0 );
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// SUPPORT FUNCTIONS FOR STANDALONE DLL
|
|
//
|
|
|
|
#ifdef DPLAY_LOADANDCHECKTRUE
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "CheckForPrivateBit"
|
|
BOOL CheckForPrivateBit( DWORD dwBit )
|
|
{
|
|
CRegistry creg;
|
|
DWORD dwValue;
|
|
|
|
if( !creg.Open( DPLAY_LOADTREE_REGTREE, DPLAY_LOADTRUE_REGPATH, TRUE, FALSE ) )
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
if( !creg.ReadDWORD( DPLAY_LOADTRUE_REGKEY, dwValue ) )
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
if( dwValue & dwBit )
|
|
{
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
typedef HRESULT (WINAPI *PFN_DLLGETCLASSOBJECT)(REFCLSID rclsid,REFIID riid,LPVOID *ppvObj );
|
|
typedef HRESULT (WINAPI *PFN_DLLCANUNLOADNOW)(void);
|
|
|
|
extern "C" {
|
|
HMODULE ghRedirect = NULL;
|
|
PFN_DLLGETCLASSOBJECT pfnGetClassObject = NULL;
|
|
PFN_DLLCANUNLOADNOW pfnDllCanUnLoadNow = NULL;
|
|
};
|
|
|
|
HRESULT InitializeRedirectFunctionTable()
|
|
{
|
|
LONG lLastError;
|
|
|
|
if( CheckForPrivateBit( DPLAY_LOADTRUE_BIT ) )
|
|
{
|
|
ghRedirect = LoadLibraryA( "dpvacm.dll" );
|
|
|
|
if( ghRedirect == NULL )
|
|
{
|
|
lLastError = GetLastError();
|
|
|
|
DPFX(DPFPREP, 0, "Could not load dplayx.dll error = 0x%x", lLastError );
|
|
return DVERR_GENERIC;
|
|
|
|
}
|
|
|
|
pfnGetClassObject = (PFN_DLLGETCLASSOBJECT) GetProcAddress( ghRedirect, "DllGetClassObject" );
|
|
pfnDllCanUnLoadNow = (PFN_DLLCANUNLOADNOW) GetProcAddress( ghRedirect, "DllCanUnloadNow" );
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT FreeRedirectFunctionTable()
|
|
{
|
|
if( ghRedirect != NULL )
|
|
FreeLibrary( ghRedirect );
|
|
|
|
return S_OK;
|
|
}
|
|
#endif
|
|
|
|
|