237 lines
5.4 KiB
C++
237 lines
5.4 KiB
C++
|
/*++
|
||
|
|
||
|
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;
|
||
|
}
|