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;
|
|
}
|