You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
212 lines
5.0 KiB
212 lines
5.0 KiB
/*++
|
|
|
|
Copyright (c) 1998 Microsoft Corporation
|
|
|
|
Module Name :
|
|
testwp.cxx
|
|
|
|
Abstract:
|
|
Main module for the Rogue Worker Process. Takes the place of w3wp.exe/w3core.dll
|
|
and calls directly into w3dt.dll, which will have been overwritten by tw3dt.dll.
|
|
|
|
Author:
|
|
|
|
Michael Brown ( MiBrown ) 4-Mar-2002
|
|
|
|
Environment:
|
|
Win32 - User Mode
|
|
|
|
--*/
|
|
|
|
|
|
/************************************************************
|
|
* Include Headers
|
|
************************************************************/
|
|
|
|
#include "precomp.hxx"
|
|
|
|
HTTP_DATA_CHUNK g_DataChunk;
|
|
HTTP_RESPONSE g_HttpResponse;
|
|
|
|
VOID
|
|
OnNewRequest(
|
|
ULATQ_CONTEXT ulatqContext
|
|
)
|
|
{
|
|
HRESULT hr;
|
|
|
|
//
|
|
// Set a context to receive on completions
|
|
//
|
|
|
|
UlAtqSetContextProperty( ulatqContext,
|
|
ULATQ_PROPERTY_COMPLETION_CONTEXT,
|
|
(PVOID) ulatqContext );
|
|
|
|
//
|
|
// Just send the response
|
|
//
|
|
DWORD cbSent;
|
|
|
|
|
|
hr = UlAtqSendHttpResponse( ulatqContext,
|
|
TRUE, // async
|
|
0, // no special flags
|
|
&g_HttpResponse,
|
|
NULL, // no UL cache
|
|
&cbSent, // bytes sent
|
|
NULL ); // no log
|
|
if ( FAILED( hr ) )
|
|
{
|
|
UlAtqFreeContext( ulatqContext );
|
|
}
|
|
}
|
|
|
|
|
|
VOID
|
|
OnIoCompletion(
|
|
VOID * pContext,
|
|
DWORD cbWritten,
|
|
DWORD dwCompletionStatus,
|
|
OVERLAPPED * lpo
|
|
)
|
|
{
|
|
//
|
|
// Ignore the completion. Just cleanup the request
|
|
//
|
|
|
|
UlAtqFreeContext( (ULATQ_CONTEXT) pContext );
|
|
}
|
|
|
|
VOID
|
|
OnUlDisconnect(
|
|
VOID * pvContext
|
|
)
|
|
{
|
|
return;
|
|
}
|
|
|
|
VOID
|
|
OnShutdown(
|
|
BOOL fDoImmediate
|
|
)
|
|
{
|
|
return;
|
|
}
|
|
|
|
HRESULT FakeCollectCounters(PBYTE *ppCounterData,
|
|
DWORD *pdwCounterData)
|
|
{
|
|
return E_FAIL;
|
|
}
|
|
|
|
|
|
extern "C" INT
|
|
__cdecl
|
|
wmain(
|
|
INT argc,
|
|
PWSTR argv[]
|
|
)
|
|
{
|
|
HRESULT hr;
|
|
ULATQ_CONFIG ulatqConfig;
|
|
|
|
//
|
|
// One time initialization of generic response
|
|
//
|
|
|
|
g_DataChunk.DataChunkType = HttpDataChunkFromMemory;
|
|
g_DataChunk.FromMemory.pBuffer = "Hello From The IIS Rogue Worker Process!";
|
|
g_DataChunk.FromMemory.BufferLength = strlen ((const char *) g_DataChunk.FromMemory.pBuffer);
|
|
|
|
g_HttpResponse.Flags = 0;
|
|
g_HttpResponse.StatusCode = 200;
|
|
g_HttpResponse.pReason = "OK";
|
|
g_HttpResponse.ReasonLength = (USHORT) strlen(g_HttpResponse.pReason);
|
|
g_HttpResponse.Headers.UnknownHeaderCount = 1;
|
|
g_HttpResponse.EntityChunkCount = 1;
|
|
g_HttpResponse.pEntityChunks = &g_DataChunk;
|
|
|
|
//
|
|
// set the known headers
|
|
//
|
|
|
|
//g_HttpResponse.Headers.KnownHeaders[HttpHeaderContentLength].pRawValue = "0";
|
|
// g_HttpResponse.Headers.KnownHeaders[HttpHeaderContentLength].RawValueLength = sizeof (CHAR);
|
|
|
|
//
|
|
// set the unknown headers
|
|
//
|
|
|
|
HTTP_UNKNOWN_HEADER UnknownHeader;
|
|
|
|
memset(&UnknownHeader, 0, sizeof(HTTP_UNKNOWN_HEADER));
|
|
|
|
g_HttpResponse.Headers.UnknownHeaderCount = 1;
|
|
g_HttpResponse.Headers.pUnknownHeaders = &UnknownHeader;
|
|
|
|
//
|
|
// Set Header PID
|
|
//
|
|
|
|
PHTTP_UNKNOWN_HEADER pHeaderPid = g_HttpResponse.Headers.pUnknownHeaders;
|
|
|
|
pHeaderPid->pName = "PID";
|
|
pHeaderPid->NameLength = (USHORT) strlen (pHeaderPid->pName);
|
|
|
|
CHAR Pid[256];
|
|
|
|
pHeaderPid->pRawValue = _itoa (GetCurrentProcessId(), Pid, 10);
|
|
pHeaderPid->RawValueLength = (USHORT) strlen (pHeaderPid->pRawValue);
|
|
|
|
/*
|
|
//
|
|
// Set Header Application-Pool
|
|
//
|
|
|
|
PHTTP_UNKNOWN_HEADER pHeaderAppPool = (pResponse->Headers.pUnknownHeaders + 1);
|
|
|
|
pHeaderAppPool->pName = "Application-Pool";
|
|
pHeaderAppPool->NameLength = strlen (pHeaderAppPool->pName);
|
|
|
|
WP_CONFIG* wpConfig = g_pwpContext->QueryConfig ();
|
|
|
|
CHAR AppPoolName[256];
|
|
wcstombs (AppPoolName, wpConfig->QueryAppPoolName(), wcslen(wpConfig->QueryAppPoolName()));
|
|
pHeaderAppPool->pRawValue = AppPoolName;
|
|
pHeaderAppPool->RawValueLength = strlen(pHeaderAppPool->pRawValue);
|
|
*/
|
|
|
|
//
|
|
// Initialize ULATQ
|
|
//
|
|
|
|
ulatqConfig.pfnNewRequest = OnNewRequest;
|
|
ulatqConfig.pfnIoCompletion = OnIoCompletion;
|
|
ulatqConfig.pfnOnShutdown = OnShutdown;
|
|
ulatqConfig.pfnDisconnect = OnUlDisconnect;
|
|
ulatqConfig.pfnCollectCounters = FakeCollectCounters;
|
|
|
|
hr = UlAtqInitialize( argc, argv, &ulatqConfig );
|
|
|
|
if ( FAILED( hr ) )
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
//
|
|
// Start listening
|
|
//
|
|
|
|
UlAtqStartListen();
|
|
|
|
//
|
|
// Cleanup
|
|
//
|
|
|
|
UlAtqTerminate(S_OK);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/************************ End of File ***********************/
|