windows-nt/Source/XPSP1/NT/inetsrv/iis/iisrearc/iisplus/w3wp/w3wp.cxx

237 lines
5.4 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1998 Microsoft Corporation
Module Name :
w3wp.cxx
Abstract:
Main module for IIS compatible worker process
Author:
Murali R. Krishnan ( MuraliK ) 23-Sept-1998
Environment:
Win32 - User Mode
Project:
IIS compatible worker process
--*/
/************************************************************
* Include Headers
************************************************************/
#include "precomp.hxx"
#include "wpif.h"
#include "ulw3.h"
#include "../../../svcs/mdadmin/ntsec.h"
DECLARE_DEBUG_PRINTS_OBJECT();
DECLARE_DEBUG_VARIABLE();
//
// Configuration parameters registry key.
//
// BUGBUG
#undef INET_INFO_KEY
#undef INET_INFO_PARAMETERS_KEY
#define INET_INFO_KEY \
"System\\CurrentControlSet\\Services\\iisw3adm"
#define INET_INFO_PARAMETERS_KEY \
INET_INFO_KEY "\\Parameters"
const CHAR g_pszWpRegLocation[] =
INET_INFO_PARAMETERS_KEY "\\WP";
class DEBUG_WRAPPER {
public:
DEBUG_WRAPPER( IN LPCSTR pszModule)
{
#if DBG
CREATE_DEBUG_PRINT_OBJECT( pszModule);
#else
UNREFERENCED_PARAMETER(pszModule);
#endif
LOAD_DEBUG_FLAGS_FROM_REG_STR( g_pszWpRegLocation, DEBUG_ERROR );
}
~DEBUG_WRAPPER(void)
{ DELETE_DEBUG_PRINT_OBJECT(); }
};
//
// W3 DLL which does all the work
//
extern "C" INT
__cdecl
wmain(
INT argc,
PWSTR argv[]
)
{
DEBUG_WRAPPER dbgWrapper( "w3wp" );
HRESULT hr;
HMODULE hModule = NULL;
PFN_ULW3_ENTRY pEntry = NULL;
ULONG rcRet = CLEAN_WORKER_PROCESS_EXIT_CODE;
BOOL fCoInit = FALSE;
//
// We don't want the worker process to get stuck in a dialog box
// if it goes awry.
//
SetErrorMode( SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX );
IF_DEBUG( TRACE)
{
//
// Print out our process affinity mask on debug builds.
//
BOOL fRet = TRUE;
DWORD_PTR ProcessAffinityMask = 0;
DWORD_PTR SystemAffinityMask = 0;
fRet = GetProcessAffinityMask(
GetCurrentProcess(),
&ProcessAffinityMask,
&SystemAffinityMask
);
DBGPRINTF(( DBG_CONTEXT, "Process affinity mask: %p\n", ProcessAffinityMask ));
}
//
// Move this process to the WindowStation (with full access to all) in
// which we would have been if running in inetinfo.exe (look at
// iis\svcs\mdadmin\ntsec.cxx)
//
HWINSTA hWinSta = OpenWindowStationA(SZ_IIS_WINSTA, FALSE, WINSTA_ALL);
if (hWinSta == NULL)
{
hr = HRESULT_FROM_WIN32(GetLastError());
goto Finished;
}
//
// Set this as this process's window station
//
if (!SetProcessWindowStation(hWinSta))
{
hr = HRESULT_FROM_WIN32(GetLastError());
goto Finished;
}
//
// Do some COM junk
//
hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
if (FAILED(hr))
{
DBGPRINTF(( DBG_CONTEXT,
"Error in CoInitializeEx(). hr = %x\n",
hr ));
rcRet = ERROR_WORKER_PROCESS_EXIT_CODE;
goto Finished;
}
fCoInit = TRUE;
hr = CoInitializeSecurity( NULL
, -1
, NULL
, NULL
, RPC_C_AUTHN_LEVEL_DEFAULT
, RPC_C_IMP_LEVEL_IMPERSONATE
, NULL
, EOAC_NONE
, NULL);
if (FAILED(hr))
{
DBGPRINTF(( DBG_CONTEXT,
"Error in CoInitializeSecurity(). hr = %x\n",
hr ));
rcRet = ERROR_WORKER_PROCESS_EXIT_CODE;
goto Finished;
}
//
// Load the ULW3 DLL which does all the work
//
hModule = LoadLibrary( ULW3_DLL_NAME );
if ( hModule == NULL )
{
DBGPRINTF(( DBG_CONTEXT,
"Error loading W3 service dll '%ws'. Error = %d\n",
ULW3_DLL_NAME,
GetLastError() ));
rcRet = ERROR_WORKER_PROCESS_EXIT_CODE;
goto Finished;
}
pEntry = (PFN_ULW3_ENTRY) GetProcAddress( hModule,
ULW3_DLL_ENTRY );
if ( pEntry == NULL )
{
DBGPRINTF(( DBG_CONTEXT,
"Could not find entry point '%s'. Error = %d\n",
ULW3_DLL_ENTRY,
GetLastError() ));
rcRet = ERROR_WORKER_PROCESS_EXIT_CODE;
goto Finished;
}
hr = pEntry( argc,
argv,
FALSE ); // Compatibility Mode = FALSE
if ( FAILED( hr ) )
{
DBGPRINTF(( DBG_CONTEXT,
"Error executing W3WP. hr = %x\n",
hr ));
rcRet = ERROR_WORKER_PROCESS_EXIT_CODE;
goto Finished;
}
Finished:
DBG_ASSERT(SUCCEEDED(hr));
//
// Cleanup any lingering COM objects before unloading
//
if ( fCoInit )
{
CoUninitialize();
}
if ( hModule != NULL )
{
FreeLibrary( hModule );
}
return CLEAN_WORKER_PROCESS_EXIT_CODE;
}