windows-nt/Source/XPSP1/NT/base/cluster/resdll/genscript/genscript.cpp
2020-09-26 16:20:57 +08:00

598 lines
14 KiB
C++

//////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000 Microsoft Corporation
//
// Module Name:
// GenScript.cpp
//
// Description:
// DLL services/entry points for the generic script resource.
//
// Maintained By:
// gpease 08-FEB-2000
//
//////////////////////////////////////////////////////////////////////////////
#include "pch.h"
#include "ActiveScriptSite.h"
#include "ScriptResource.h"
#include "SpinLock.h"
//
// Debugging Module Name
//
DEFINE_MODULE("SCRIPTRES")
//
// DLL Globals
//
HINSTANCE g_hInstance = NULL;
LONG g_cObjects = 0;
LONG g_cLock = 0;
TCHAR g_szDllFilename[ MAX_PATH ] = { 0 };
#if defined(DEBUG)
LPVOID g_GlobalMemoryList = NULL; // Global memory tracking list
#endif
PSET_RESOURCE_STATUS_ROUTINE g_prsrCallback = NULL;
extern "C"
{
extern CLRES_FUNCTION_TABLE GenScriptFunctionTable;
#define PARAM_NAME__PATH L"Path"
// GenScript resource read-write private properties
RESUTIL_PROPERTY_ITEM
GenScriptResourcePrivateProperties[] = {
{ PARAM_NAME__PATH, NULL, CLUSPROP_FORMAT_SZ, 0, 0, 0, RESUTIL_PROPITEM_REQUIRED, 0 },
{ NULL, NULL, 0, 0, 0, 0 }
};
//****************************************************************************
//
// DLL Entry Points
//
//****************************************************************************
//////////////////////////////////////////////////////////////////////////////
//
// BOOL
// WINAPI
// GenScriptDllEntryPoint(
// HANDLE hInstIn,
// ULONG ulReasonIn,
// LPVOID lpReservedIn
// )
//
// Description:
// Dll entry point.
//
// Arguments:
// hInstIn - DLL instance handle.
// ulReasonIn - DLL reason code for entrance.
// lpReservedIn - Not used.
//
//////////////////////////////////////////////////////////////////////////////
BOOL WINAPI
GenScriptDllEntryPoint(
HANDLE hInstIn,
ULONG ulReasonIn,
LPVOID // lpReservedIn
)
{
//
// KB: NO_THREAD_OPTIMIZATIONS gpease 19-OCT-1999
//
// By not defining this you can prvent the linker
// from calling you DllEntry for every new thread.
// This makes creating new thread significantly
// faster if every DLL in a process does it.
// Unfortunately, not all DLLs do this.
//
// In CHKed/DEBUG, we keep this on for memory
// tracking.
//
#if defined( DEBUG )
#define NO_THREAD_OPTIMIZATIONS
#endif // DEBUG
#if defined(DEBUG) || defined(NO_THREAD_OPTIMIZATIONS)
switch( ulReasonIn )
{
case DLL_PROCESS_ATTACH:
TraceInitializeProcess( NULL, NULL );
TraceCreateMemoryList( g_GlobalMemoryList );
#if defined( DEBUG )
TraceFunc( "GenScriptDllEntryPoint( )\n" );
TraceMessage( TEXT(__FILE__),
__LINE__,
__MODULE__,
mtfDLL,
TEXT("DLL: DLL_PROCESS_ATTACH - ThreadID = 0x%08x\n"),
GetCurrentThreadId( )
);
FRETURN( TRUE );
#endif // DEBUG
g_hInstance = (HINSTANCE) hInstIn;
GetModuleFileName( g_hInstance, g_szDllFilename, MAX_PATH );
break;
case DLL_PROCESS_DETACH:
#if defined( DEBUG )
TraceFunc( "GenScriptDllEntryPoint( )\n" );
TraceMessage( TEXT(__FILE__),
__LINE__,
__MODULE__,
mtfDLL,
TEXT("DLL: DLL_PROCESS_DETACH - ThreadID = 0x%08x [ g_cLock=%u, g_cObjects=%u ]\n"),
GetCurrentThreadId( ),
g_cLock,
g_cObjects
);
FRETURN( TRUE );
#endif // DEBUG
TraceTerminateMemoryList( g_GlobalMemoryList );
TraceTerminateProcess( NULL, NULL );
break;
case DLL_THREAD_ATTACH:
TraceInitializeThread( NULL );
#if defined( DEBUG )
DebugMsg( "The thread 0x%x has started.\n", GetCurrentThreadId( ) );
TraceFunc( "GenScriptDllEntryPoint( )\n" );
TraceMessage( TEXT(__FILE__),
__LINE__,
__MODULE__,
mtfDLL,
TEXT("DLL: DLL_THREAD_ATTACH - ThreadID = 0x%08x [ g_cLock=%u, g_cObjects=%u ]\n"),
GetCurrentThreadId( ),
g_cLock,
g_cObjects
);
FRETURN( TRUE );
#endif // DEBUG
break;
case DLL_THREAD_DETACH:
#if defined( DEBUG )
TraceFunc( "GenScriptDllEntryPoint( )\n" );
TraceMessage( TEXT(__FILE__),
__LINE__,
__MODULE__,
mtfDLL,
TEXT("DLL: DLL_THREAD_DETACH - ThreadID = 0x%08x [ g_cLock=%u, g_cObjects=%u ]\n"),
GetCurrentThreadId( ),
g_cLock,
g_cObjects
);
FRETURN( TRUE );
#endif // DEBUG
TraceRundownThread( );;
break;
default:
#if defined( DEBUG )
TraceFunc( "GenScriptDllEntryPoint( )\n" );
TraceMessage( TEXT(__FILE__),
__LINE__,
__MODULE__,
mtfDLL,
TEXT("DLL: UNKNOWN ENTRANCE REASON - ThreadID = 0x%08x [ g_cLock=%u, g_cObjects=%u ]\n"),
GetCurrentThreadId( ),
g_cLock,
g_cObjects
);
FRETURN( TRUE );
#endif // DEBUG
break;
}
return TRUE;
#else // !NO_THREAD_OPTIMIZATIONS
BOOL f;
Assert( ulReasonIn == DLL_PROCESS_ATTACH || ulReasonIn == DLL_PROCESS_DETACH );
TraceInitializeProcess( NULL, NULL );
g_hInstance = (HINSTANCE) hInstIn;
GetModuleFileName( g_hInstance, g_szDllFilename, MAX_PATH );
f = DisableThreadLibraryCalls( g_hInstance );
if ( !f )
{
OutputDebugString( TEXT("*ERROR* DisableThreadLibraryCalls( ) failed.") );
}
return TRUE;
#endif // NO_THREAD_OPTIMIZATIONS
} //*** GenScriptDllEntryPoint()
//****************************************************************************
//
// Cluster Resource Entry Points
//
//****************************************************************************
//////////////////////////////////////////////////////////////////////////////
//
// void
// WINAPI
// ScriptResClose(
// RESID residIn
// )
//
//////////////////////////////////////////////////////////////////////////////
void
WINAPI
ScriptResClose(
RESID residIn
)
{
TraceFunc1( "ScriptResClose( residIn = 0x%08x )\n", residIn );
HRESULT hr;
CScriptResource * pres = reinterpret_cast< CScriptResource * >( residIn );
if ( pres == NULL )
goto Cleanup;
hr = THR( pres->Close( ) );
//
// Matching Release() for object creation in ScriptResOpen( ).
//
pres->Release( );
Cleanup:
TraceFuncExit( );
} //*** ScriptResClose( )
//////////////////////////////////////////////////////////////////////////////
//
// RESID
// WINAPI
// ScriptResOpen(
// LPCWSTR pszNameIn,
// HKEY hkeyIn,
// RESOURCE_HANDLE hResourceIn
// )
//
//////////////////////////////////////////////////////////////////////////////
RESID
WINAPI
ScriptResOpen(
LPCWSTR pszNameIn,
HKEY hkeyIn,
RESOURCE_HANDLE hResourceIn
)
{
TraceFunc1( "ScriptResOpen( pszNameIn = '%s', hkeyIn, hResourceIn )\n", pszNameIn );
HRESULT hr;
CScriptResource * pres;
pres = CScriptResource_CreateInstance( pszNameIn, hkeyIn, hResourceIn );
if ( pres == NULL )
goto OutOfMemory;
hr = THR( pres->Open( ) );
Cleanup:
//
// KB: Don't pres->Release( ) as we are handing it out as out RESID.
//
RETURN( pres );
OutOfMemory:
hr = ERROR_OUTOFMEMORY;
goto Cleanup;
} //*** ScriptResOpen( )
//////////////////////////////////////////////////////////////////////////////
//
// DWORD
// WINAPI
// ScriptResOnline(
// RESID residIn,
// PHANDLE hEventInout
// )
//
//////////////////////////////////////////////////////////////////////////////
DWORD
WINAPI
ScriptResOnline(
RESID residIn,
PHANDLE hEventInout
)
{
TraceFunc2( "ScriptResOnline( residIn = 0x%08x, hEventInout = 0x%08x )\n",
residIn, hEventInout );
HRESULT hr;
CScriptResource * pres = reinterpret_cast< CScriptResource * >( residIn );
if ( pres == NULL )
goto InvalidArg;
hr = THR( pres->Online( ) );
Cleanup:
RETURN( hr );
InvalidArg:
hr = THR( E_INVALIDARG );
goto Cleanup;
} //*** ScriptResOnline( )
//////////////////////////////////////////////////////////////////////////////
//
// DWORD
// WINAPI
// ScriptResOffline(
// RESID residIn
// )
//
//////////////////////////////////////////////////////////////////////////////
DWORD
WINAPI
ScriptResOffline(
RESID residIn
)
{
TraceFunc1( "ScriptResOffline( residIn = 0x%08x )\n", residIn );
HRESULT hr;
CScriptResource * pres = reinterpret_cast< CScriptResource * >( residIn );
if ( pres == NULL )
goto InvalidArg;
hr = THR( pres->Offline( ) );
Cleanup:
RETURN( hr );
InvalidArg:
hr = THR( E_INVALIDARG );
goto Cleanup;
} //*** ScriptResOffline( )
//////////////////////////////////////////////////////////////////////////////
//
// void
// WINAPI
// ScriptResTerminate(
// RESID residIn
// )
//
//////////////////////////////////////////////////////////////////////////////
void
WINAPI
ScriptResTerminate(
RESID residIn
)
{
TraceFunc1( "ScriptResTerminate( residIn = 0x%08x )\n", residIn );
CScriptResource * pres = reinterpret_cast< CScriptResource * >( residIn );
if ( pres == NULL )
goto InvalidArg;
THR( pres->Terminate( ) );
Cleanup:
TraceFuncExit( );
InvalidArg:
THR( E_INVALIDARG );
goto Cleanup;
} // ScriptResTerminate( )
//////////////////////////////////////////////////////////////////////////////
//
// BOOL
// WINAPI
// ScriptResLooksAlive(
// RESID residIn
// )
//
//////////////////////////////////////////////////////////////////////////////
BOOL
WINAPI
ScriptResLooksAlive(
RESID residIn
)
{
TraceFunc1( "ScriptResLooksAlive( residIn = 0x%08x )\n", residIn );
HRESULT hr;
BOOL bLooksAlive = FALSE;
CScriptResource * pres = reinterpret_cast< CScriptResource * >( residIn );
if ( pres == NULL )
goto InvalidArg;
hr = STHR( pres->LooksAlive( ) );
if ( hr == S_OK )
{
bLooksAlive = TRUE;
} // if: S_OK
Cleanup:
RETURN( bLooksAlive );
InvalidArg:
hr = THR( E_INVALIDARG );
goto Cleanup;
} //*** ScriptResLooksAlive( )
//////////////////////////////////////////////////////////////////////////////
//
// BOOL
// WINAPI
// ScriptResIsAlive(
// RESID residIn
// )
//
//////////////////////////////////////////////////////////////////////////////
BOOL
WINAPI
ScriptResIsAlive(
RESID residIn
)
{
TraceFunc1( "ScriptResIsAlive( residIn = 0x%08x )\n", residIn );
HRESULT hr;
BOOL bIsAlive = FALSE;
CScriptResource * pres = reinterpret_cast< CScriptResource * >( residIn );
if ( pres == NULL )
goto InvalidArg;
hr = STHR( pres->IsAlive( ) );
if ( hr == S_OK )
{
bIsAlive = TRUE;
} // if: S_OK
Cleanup:
RETURN( bIsAlive );
InvalidArg:
hr = THR( E_INVALIDARG );
goto Cleanup;
} //*** ScriptResIsAlive( )
DWORD
ScriptResResourceControl(
RESID residIn,
DWORD dwControlCodeIn,
PVOID pvBufferIn,
DWORD dwBufferInSizeIn,
PVOID pvBufferOut,
DWORD dwBufferOutSizeIn,
LPDWORD pdwBytesReturnedOut
)
{
TraceFunc( "ScriptResResourceControl( ... )\n " );
DWORD dwErr = ERROR_SUCCESS;
DWORD dwBytesRequired;
*pdwBytesReturnedOut = 0;
CScriptResource * pres = reinterpret_cast< CScriptResource * >( residIn );
if ( pres == NULL )
{
dwErr = THR( E_INVALIDARG );
goto Cleanup;
}
switch ( dwControlCodeIn )
{
case CLUSCTL_RESOURCE_UNKNOWN:
break;
case CLUSCTL_RESOURCE_GET_PRIVATE_PROPERTY_FMTS:
dwErr = ResUtilGetPropertyFormats( GenScriptResourcePrivateProperties,
pvBufferOut,
dwBufferOutSizeIn,
pdwBytesReturnedOut,
&dwBytesRequired );
if ( dwErr == ERROR_MORE_DATA ) {
*pdwBytesReturnedOut = dwBytesRequired;
}
break;
default:
dwErr = ERROR_INVALID_FUNCTION;
break;
}
Cleanup:
RETURN( dwErr );
} //*** ScriptResResourceControl( )
DWORD
ScriptResTypeControl(
LPCWSTR ResourceTypeName,
DWORD dwControlCodeIn,
PVOID pvBufferIn,
DWORD dwBufferInSizeIn,
PVOID pvBufferOut,
DWORD dwBufferOutSizeIn,
LPDWORD pdwBytesReturnedOut
)
{
TraceFunc( "ScriptResTypeControl( ... )\n " );
DWORD dwErr = ERROR_SUCCESS;
DWORD dwBytesRequired;
*pdwBytesReturnedOut = 0;
switch ( dwControlCodeIn )
{
case CLUSCTL_RESOURCE_TYPE_UNKNOWN:
break;
case CLUSCTL_RESOURCE_TYPE_GET_PRIVATE_RESOURCE_PROPERTY_FMTS:
dwErr = ResUtilGetPropertyFormats( GenScriptResourcePrivateProperties,
pvBufferOut,
dwBufferOutSizeIn,
pdwBytesReturnedOut,
&dwBytesRequired );
if ( dwErr == ERROR_MORE_DATA ) {
*pdwBytesReturnedOut = dwBytesRequired;
}
break;
default:
dwErr = ERROR_INVALID_FUNCTION;
break;
}
RETURN( dwErr );
} //*** ScriptResTypeControl( )
//***********************************************************
//
// Define Function Table
//
//***********************************************************
CLRES_V1_FUNCTION_TABLE( GenScriptFunctionTable, // Name
CLRES_VERSION_V1_00, // Version
ScriptRes, // Prefix
NULL, // Arbitrate
NULL, // Release
ScriptResResourceControl, // ResControl
ScriptResTypeControl // ResTypeControl
);
} // extern "C"