Leaked source code of windows server 2003
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.
 
 
 
 
 
 

221 lines
5.3 KiB

//
// Microsoft Corporation - Copyright 1997
//
//
// DLLMAIN.CPP - DLL entry points
//
#include "pch.h"
// Globals
HANDLE g_hInst;
//
// What: DllMain
//
// Desc: Dll initialization entry point.
//
BOOL WINAPI DllMain (
HANDLE hInst,
ULONG ulReason,
LPVOID lpReserved )
{
TraceMsg( TF_FUNC | TF_DLL, "DllMain( )" );
#if 0
DebugBreak( ); // stop so we can get a chance to enable break points
#endif
switch( ulReason )
{
case DLL_PROCESS_ATTACH:
g_hInst = hInst;
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
} // DllMain( )
//
// What: DllRegisterServer
//
// Desc: Register our ISAPI with IIS
//
STDAPI DllRegisterServer( void )
{
HRESULT hr = S_OK;
TraceMsg( TF_FUNC | TF_DLL, "DllRegisterServer( )" );
TraceMsgResult( TF_DLL, &HRtoStr, hr, "DllRegisterServer( ) Exit" );
return hr;
} // DllRegisterServer( )
//
// What: GetExtensionVersion
//
// Desc: ISAPI entry point
//
BOOL WINAPI GetExtensionVersion( HSE_VERSION_INFO *pVer )
{
TraceMsg( TF_FUNC | TF_DLL, "GetExtensionVersion( pVer )" );
pVer->dwExtensionVersion = MAKELONG( FILEUPLD_VERSION_MINOR,
FILEUPLD_VERSION_MAJOR );
StrCpyN( pVer->lpszExtensionDesc,
FILEUPLD_DESCRIPTION,
HSE_MAX_EXT_DLL_NAME_LEN );
TraceMsg( TF_FUNC | TF_DLL, "GetExtensionVersion( pVer ) Exit BOOL=TRUE" );
return TRUE;
} // GetExtensionVersion( )
//
// What: HttpExtensionProc
//
// Desc: ISAPI entry point
//
DWORD HttpExtensionProc( LPEXTENSION_CONTROL_BLOCK lpEcb )
{
DWORD dwResult = HSE_STATUS_SUCCESS; // return status
BOOL fReturn; // status flag
BOOL fMultipart; // multipart/form-data submit?
BOOL fTextPlain; // text/plain submit?
BOOL fDebug; // show debug spew?
LPSTR lpszOut = NULL; // server log output
LPSTR lpszDebug = NULL; // debug output
LPBYTE lpbData; // pointer to body data
DWORD dwParsed; // number of bytes parsed
DUMPTABLE DT[ MAX_DT ]; // Hex Dump table info.
QUERYMETHOD eMethod = METHOD_UNKNOWN; // method of query
CMultipartParse *lpMPParser = NULL;
CTextPlainParse *lpTPParser = NULL;
TraceMsg( TF_FUNC | TF_DLL, "HttpExtensionProc( lpEcb )" );
#if 0
fReturn = SendEcho( lpEcb );
#endif
// Make sure that we have all the data
fReturn = CompleteDownload( lpEcb, &lpbData );
// Check content-type for multipart
if ( fReturn )
{
fReturn = CheckForMultiPartFormSubmit( lpEcb, &fMultipart );
}
if ( fReturn )
{
fReturn = CheckForTextPlainSubmit( lpEcb, &fTextPlain );
}
if ( fReturn )
{
fReturn = CheckForDebug( lpEcb, &fDebug );
}
// Parse
if ( fReturn )
{
if ( fMultipart )
{
if ( fDebug )
{
lpMPParser = new CMultipartParse( lpEcb, &lpszOut, &lpszDebug, DT );
}
else
{
lpMPParser = new CMultipartParse( lpEcb, &lpszOut, NULL, DT );
lpszDebug = NULL;
}
fReturn = lpMPParser->PreParse( lpbData, &dwParsed );
eMethod= METHOD_POSTMULTIPART;
}
else if ( fTextPlain )
{
if ( ! fDebug )
{
lpTPParser = new CTextPlainParse( lpEcb, &lpszOut, &lpszDebug, DT );
}
else
{
lpTPParser = new CTextPlainParse( lpEcb, &lpszOut, NULL, DT );
lpszDebug = NULL;
}
fReturn = lpTPParser->Parse( lpbData, &dwParsed );
eMethod= METHOD_POSTTEXTPLAIN;
}
else
{
if ( !StrCmpI( lpEcb->lpszMethod, "POST" ) )
{
eMethod= METHOD_POST;
}
else if ( !StrCmpI( lpEcb->lpszMethod, "GET" ) )
{
eMethod= METHOD_GET;
}
}
}
// Display results
if ( fReturn )
{
fReturn = SendSuccess( eMethod, lpEcb, lpszOut, lpszDebug, lpbData, dwParsed, DT );
}
else
{
fReturn = SendFailure( eMethod, lpEcb, lpszOut, lpszDebug, lpbData, dwParsed, DT );
}
// Check to see if everything went OK
if ( !fReturn )
{
dwResult = HSE_STATUS_ERROR;
}
// Free if we created the buffer
if ( lpEcb->lpbData != lpbData )
{
GlobalFree( lpbData );
}
delete lpMPParser;
delete lpTPParser;
TraceMsgResult( TF_FUNC | TF_DLL, &HSEtoStr, dwResult, "HttpExtensionProc( lpEcb ) " );
lpEcb->dwHttpStatusCode = dwResult;
return dwResult;
} // HttpExtensionProc( )
//
// Support functions
//
void * __cdecl operator new( unsigned int nSize )
{
return ((LPVOID) LocalAlloc( LMEM_FIXED, nSize ));
}
void __cdecl operator delete( void *pv )
{
LocalFree( pv );
}
extern "C" int __cdecl _purecall( void ) { return 0; }