SIMPLE.CPP

/*++ 

Copyright (c) 1997 Microsoft Corporation

Module Name:

Simple.cpp

Abstract:

This module shows the basic functions needed for ISAPI extension

--*/
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <httpext.h>



BOOL WINAPI
DllMain(
IN HINSTANCE hinstDll,
IN DWORD dwReason,
IN LPVOID lpvContext
)
/*++
Function : DllMain

Description:

The initialization function for this DLL.

Arguments:

hinstDll - Instance handle of the DLL
dwReason - Reason why NT called this DLL
lpvContext - Reserved parameter for future use

Return Value:

Returns TRUE if successfull; otherwise FALSE.

--*/
{
// Note that appropriate initialization and termination code
// would be written within the switch statement below. Because
// this example is very simple, none is currently needed.

switch( dwReason ) {
case DLL_PROCESS_ATTACH:
break;

case DLL_PROCESS_DETACH:
break;
}

return(TRUE);
}


BOOL WINAPI
GetExtensionVersion(
OUT HSE_VERSION_INFO * pVer
)
/*++

Purpose:

The first function called after IIS successfully
loads the DLL. The function should use the
version structure provided by IIS to set the ISAPI
architectural version number of this extension.

A simple text-string is also set so that
administrators can identify the DLL.

Note that HSE_VERSION_MINOR and HSE_VERSION_MAJOR
are constants defined in httpext.h.

Arguments:

pVer - points to extension version structure

Return Value:

TRUE if successful; FALSE otherwise.

--*/
{
pVer->dwExtensionVersion = MAKELONG( HSE_VERSION_MINOR,
HSE_VERSION_MAJOR );

strcpy( pVer->lpszExtensionDesc,
"IIS SDK Simple ISAPI Extension" );

return TRUE;
}


DWORD WINAPI
HttpExtensionProc(
IN EXTENSION_CONTROL_BLOCK * pECB
)
/*++

Purpose:

Function called by the IIS Server when a request
for the ISAPI dll arrives. The HttpExtensionProc
function processes the request and outputs the
appropriate response to the web client using
WriteClient().

Argument:

pECB - pointer to extention control block.

Return Value:

HSE_STATUS_SUCCESS

--*/
{
static char szMessage[] =
"<HTML>"
"<HEAD><TITLE> Simple ISAPI Extension DLL </TITLE>"
"</HEAD>\r\n"
"<BODY>"
"<P>Hello from Simple ISAPI Extension DLL!</P>\r\n"
"</BODY></HTML>\r\n\r\n";

HSE_SEND_HEADER_EX_INFO HeaderExInfo;

//
// prepare headers
//

HeaderExInfo.pszStatus = "200 OK";
HeaderExInfo.pszHeader = "Content-type: text/html\r\n\r\n";
HeaderExInfo.cchStatus = strlen( HeaderExInfo.pszStatus );
HeaderExInfo.cchHeader = strlen( HeaderExInfo.pszHeader );
HeaderExInfo.fKeepConn = FALSE;


//
// send headers using IIS-provided callback
// (note - if we needed to keep connection open,
// we would set fKeepConn to TRUE *and* we would
// need to provide correct Content-Length: header)

pECB->ServerSupportFunction(
pECB->ConnID,
HSE_REQ_SEND_RESPONSE_HEADER_EX,
&HeaderExInfo,
NULL,
NULL
);

//
// Calculate length of string to output to client
//

DWORD dwBytesToWrite = strlen( szMessage );


//
// send text using IIS-provied callback
//

pECB->WriteClient( pECB->ConnID, szMessage, &dwBytesToWrite, 0 );

//
// Indicate that the call to HttpExtensionProc was successful
//

return HSE_STATUS_SUCCESS;
}



BOOL WINAPI
TerminateExtension(
IN DWORD dwFlags
)
/*++

Routine Description:

This function is called when the WWW service is shutdown

Arguments:

dwFlags - HSE_TERM_ADVISORY_UNLOAD or HSE_TERM_MUST_UNLOAD

Return Value:

TRUE if extension is ready to be unloaded,
FALSE otherwise

--*/
{
// Note: We must not agree to be unloaded if we have
// any pending requests.

return TRUE;
}