/*++ 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; }