2025-04-27 07:49:33 -04:00

175 lines
4.2 KiB
C++

//***************************************************************************
//
// Copyright (c) 2000-2001 Microsoft Corporation
//
// WMISOAP.CPP
//
// alanbos 27-Oct-00 Created.
//
// The main entry point for the WMI SOAP ISAPI extension.
//
//***************************************************************************
#include "precomp.h"
// The Global Thread Pool that is used for handling requests
// After numerous exchange of emails with the IIS guys, it has been decided that we need
// to use a thread pool for handling requests. Wonder why they do not
// provide it themselves.
CThreadPool g_oThreadPool;
// Number of threads in the pool
LONG g_iNumberOfThreads = 4;
// Queue length of the task queue in the thread pool - typically 2*g_iNumberOfThreads
LONG g_iQueueLength = 8;
//***************************************************************************
//
// BOOL WINAPI DllMain
//
// DESCRIPTION:
//
// Entry point for DLL.
//
// PARAMETERS:
//
// hModule instance handle
// ulReason why we are being called
// pvReserved reserved
//
// RETURN VALUE:
//
// TRUE if OK.
//
//***************************************************************************
BOOL WINAPI DllMain( HINSTANCE hModule,
DWORD ulReason,
LPVOID lpReserved
)
{
switch (ulReason)
{
case DLL_PROCESS_ATTACH:
// DisableThreadLibraryCalls (hModule);
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
//***************************************************************************
//
// BOOL WINAPI GetExtensionVersion
//
// DESCRIPTION:
//
// Called once by IIS to get version information. Of little consequence.
//
// PARAMETERS:
//
// pVer pointer to a HSE_VERSION_INFO structure that
// will hold the version info.
//
// RETURN VALUE:
//
// TRUE if OK.
//
//***************************************************************************
BOOL WINAPI GetExtensionVersion(HSE_VERSION_INFO *pVer)
{
pVer->dwExtensionVersion = MAKELONG(1, 0);
strcpy(pVer->lpszExtensionDesc, "WMI XML/SOAP ISAPI Extension");
// Initialize the Thread Pool that will handle the queued requests
if(FAILED(g_oThreadPool.Initialize(g_iNumberOfThreads, g_iQueueLength)))
return FALSE;
return TRUE;
}
//***************************************************************************
//
// BOOL WINAPI HttpExtensionProc
//
// DESCRIPTION:
//
// Called once by IIS to service a single HTTP request.
//
// PARAMETERS:
//
// pECB pointer to a EXTENSION_CONTROL_BLOCK structure that
// will hold the request.
//
// RETURN VALUE:
//
// HSE_STATUS_SUCCESS request has been processed
//
// NOTES:
//
// Status codes are set in the dwHttpStatusCode field of the ECB
//
//***************************************************************************
DWORD WINAPI HttpExtensionProc(LPEXTENSION_CONTROL_BLOCK pECB)
{
bool bSuccess = false;
try
{
// Just queue the task on to the thread pool
CTask * pTask = NULL;
if(pTask = new CTask(pECB))
{
if(SUCCEEDED(g_oThreadPool.QueueTask(pTask)))
bSuccess = true;
}
}
catch (...) {}
if(!bSuccess)
{
// Send a 500 internal server error
// We could not successfully enqueue a task.
// Hence the task queue is full.
// rajeshr : This means we should send a specific HTTP code
}
return HSE_STATUS_PENDING;
}
//***************************************************************************
//
// BOOL WINAPI TerminateExtension
//
// DESCRIPTION:
//
// Called once by IIS to unload the extension.
//
// PARAMETERS:
//
// dwFlags determines nature of request (advisory or mandatory)
//
// RETURN VALUE:
//
// TRUE (always agree to an unload for now)
//
//***************************************************************************
BOOL WINAPI TerminateExtension(DWORD dwFlags )
{
// Shut down the threads in the thread pool graciously
g_oThreadPool.Terminate();
// We need to unload the COM DLLs that we loaded in this extension
CoFreeUnusedLibraries();
return TRUE;
}