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.
 
 
 
 
 
 

432 lines
9.9 KiB

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name :
isapi_request.hxx
Abstract:
IIS+ ISAPI interface implementation.
Author:
Wade Hilmo (wadeh) 29-Aug-2000
Project:
w3core.dll
--*/
#ifndef _ISAPI_REQUEST_HXX_
#define _ISAPI_REQUEST_HXX_
#include "precomp.hxx"
#include "wam_process.hxx"
#define ISAPI_REQUEST_SIGNATURE (DWORD)'ISRQ'
#define ISAPI_REQUEST_SIGNATURE_FREE (DWORD)'ISRf'
class ISAPI_REQUEST : public IIsapiCore
{
//
// ACACHE stuff
//
public:
static BOOL InitClass( VOID );
static VOID CleanupClass( VOID );
ISAPI_REQUEST( W3_CONTEXT * pW3Context, BOOL fIsOop )
: _dwSignature( ISAPI_REQUEST_SIGNATURE ),
_cRefs( 1 ),
_pUnkFTM( NULL ),
_IsapiContext( 0 ),
_LastIsapiContext( 0 ),
_pW3Context( pW3Context ),
_fAsyncIoPending( FALSE ),
_hTfFile( INVALID_HANDLE_VALUE ),
_pTfHead( NULL ),
_pTfTail( NULL ),
_pAsyncReadBuffer( NULL ),
_pAsyncWriteBuffer( NULL ),
_nElementCount( 0 ),
_pbExecUrlEntity( NULL ),
_hExecUrlToken( NULL ),
_fIsOop( fIsOop ),
_fCacheResponse( FALSE ),
_pWamProcess( NULL )
{
DBG_ASSERT( _pW3Context );
}
BOOL
CheckSignature(
VOID
)
{
return ( _dwSignature == ISAPI_REQUEST_SIGNATURE );
}
VOID *
operator new(
size_t uiSize,
VOID * pPlacement
)
{
W3_CONTEXT * pContext;
pContext = (W3_CONTEXT*) pPlacement;
DBG_ASSERT( pContext != NULL );
DBG_ASSERT( pContext->CheckSignature() );
return pContext->ContextAlloc( (UINT)uiSize );
}
VOID
operator delete(
VOID *
)
{
}
BOOL
QueryAsyncIoPending(
VOID
)
{
DBG_ASSERT( CheckSignature() );
return _fAsyncIoPending;
}
VOID
SetAsyncIoPending(
BOOL fPending
)
{
DBG_ASSERT( CheckSignature() );
_fAsyncIoPending = fPending;
}
VOID
SetAssociatedWamProcess(
WAM_PROCESS * pWamProcess
)
{
DBG_ASSERT( _fIsOop );
DBG_ASSERT( _pWamProcess == NULL );
_pWamProcess = pWamProcess;
_pWamProcess->AddRef();
_pWamProcess->AddIsapiRequestToList( this );
}
DWORD64
QueryIsapiContext(
VOID
)
{
return _IsapiContext;
}
//
// Housekeeping
//
HRESULT
Create(
VOID
);
HRESULT STDMETHODCALLTYPE
QueryInterface(
REFIID riid,
void __RPC_FAR *__RPC_FAR *ppvObject
);
ULONG STDMETHODCALLTYPE
AddRef(
void
);
ULONG STDMETHODCALLTYPE
Release(
void
);
//
// IIsapiCore implementation
//
HRESULT STDMETHODCALLTYPE
GetServerVariable(
LPSTR szVariableName,
BYTE * szBuffer,
DWORD cbBuffer,
DWORD * pcbBufferRequired
);
HRESULT STDMETHODCALLTYPE
ReadClient(
DWORD64 IsaContext,
BYTE *pBuffer,
DWORD cbBuffer,
DWORD dwBytesToRead,
DWORD *pdwSyncBytesRead,
DWORD dwFlags
);
HRESULT STDMETHODCALLTYPE
WriteClient(
DWORD64 IsaContext,
BYTE * pBuffer,
DWORD cbBuffer,
DWORD dwFlags
);
HRESULT STDMETHODCALLTYPE
SendResponseHeaders(
BOOL fDisconnect,
LPSTR szStatus,
LPSTR szHeaders,
DWORD dwFlags
);
HRESULT STDMETHODCALLTYPE
MapPath(
BYTE * szPath,
DWORD cbPath,
DWORD * pcbBufferRequired,
BOOL fUnicode
);
HRESULT STDMETHODCALLTYPE
MapPathEx(
BYTE * szUrl,
DWORD cbUrl,
BYTE * szPath,
DWORD cbPath,
DWORD * pcbBufferRequired,
DWORD * pcchMatchingPath,
DWORD * pcchMatchingUrl,
DWORD * pdwFlags,
BOOL fUnicode
);
HRESULT STDMETHODCALLTYPE
TransmitFile(
DWORD64 IsaContext,
DWORD_PTR hFile,
DWORD64 cbOffset,
DWORD64 cbWrite,
LPSTR szStatusCode,
BYTE * pHead,
DWORD cbHead,
BYTE * pTail,
DWORD cbTail,
DWORD dwFlags
);
HRESULT STDMETHODCALLTYPE
SetConnectionClose(
BOOL fClose
);
HRESULT STDMETHODCALLTYPE
SendRedirect(
LPCSTR szLocation,
BOOL fDisconnect
);
HRESULT STDMETHODCALLTYPE
GetCertificateInfoEx(
DWORD cbAllocated,
DWORD * pdwCertEncodingType,
BYTE * pbCertEncoded,
DWORD * pcbCertEncoded,
DWORD * pdwCertificateFlags
);
HRESULT STDMETHODCALLTYPE
AppendLog(
LPSTR szExtraParam,
USHORT StatusCode
);
HRESULT STDMETHODCALLTYPE
ExecuteUrl(
DWORD64 IsaContext,
EXEC_URL_INFO * pExecUrlInfo
);
HRESULT STDMETHODCALLTYPE
GetExecuteUrlStatus(
USHORT * pChildStatusCode,
USHORT * pChildSubErrorCode,
DWORD * pChildWin32Error
);
HRESULT STDMETHODCALLTYPE
SendCustomError(
DWORD64 IsaContext,
CHAR * pszStatus,
USHORT uHttpSubError
);
HRESULT STDMETHODCALLTYPE
VectorSend(
DWORD64 IsaContext,
BOOL fDisconnect,
LPSTR pszStatus,
LPSTR pszHeaders,
VECTOR_ELEMENT *pElements,
DWORD nElementCount,
BOOL fFinalSend,
BOOL fCacheResponse
);
HRESULT
PreprocessIoCompletion(
DWORD cbIo
);
VOID
ResetIsapiContext(
VOID
)
{
DBG_ASSERT( _IsapiContext != 0 );
_LastIsapiContext = _IsapiContext;
_IsapiContext = 0;
}
HRESULT STDMETHODCALLTYPE
GetCustomError(
DWORD dwError,
DWORD dwSubError,
DWORD dwBufferSize,
BYTE *pvBuffer,
DWORD *pdwRequiredBufferSize,
BOOL *pfIsFileError,
BOOL *pfSendErrorBody);
HRESULT STDMETHODCALLTYPE
TestConnection(
BOOL *pfIsConnected
);
HRESULT STDMETHODCALLTYPE
GetSspiInfo(
BYTE *pCredHandle,
DWORD cbCredHandle,
BYTE *pCtxtHandle,
DWORD cbCtxtHandle);
HRESULT STDMETHODCALLTYPE
QueryToken(
BYTE *szUrl,
DWORD cbUrl,
DWORD dwTokenType,
DWORD64 *pToken,
BOOL fUnicode);
HRESULT STDMETHODCALLTYPE
ReportAsUnhealthy(
BYTE *szImage,
DWORD cbImage,
BYTE *szReason,
DWORD cbReason);
HRESULT STDMETHODCALLTYPE
AddFragmentToCache(
VECTOR_ELEMENT * pVectorElement,
WCHAR * pszFragmentName);
HRESULT STDMETHODCALLTYPE
ReadFragmentFromCache(
WCHAR * pszFragmentName,
BYTE * pvBuffer,
DWORD cbSize,
DWORD * pcbCopied);
HRESULT STDMETHODCALLTYPE
RemoveFragmentFromCache(
WCHAR * pszFragmentName);
HRESULT STDMETHODCALLTYPE
GetMetadataProperty(
DWORD dwPropertyId,
BYTE * pvBuffer,
DWORD cbBuffer,
DWORD * pcbBufferRequired);
HRESULT STDMETHODCALLTYPE
GetCacheInvalidationCallback(
DWORD64 * pfnCallback);
HRESULT STDMETHODCALLTYPE
CloseConnection(
VOID
);
HRESULT STDMETHODCALLTYPE
AllocateMemory(
DWORD cbSize,
DWORD64 * ppvBuffer
);
BOOL
QueryCacheResponse()
{
return _fCacheResponse;
}
LIST_ENTRY _leRequest; // for linking to the owning process
private:
~ISAPI_REQUEST(); // Destructor can only be called through Release
static ALLOC_CACHE_HANDLER * sm_pachIsapiRequest;
static PTRACE_LOG sm_pTraceLog;
//
// Member variables
//
DWORD _dwSignature;
LONG _cRefs;
IUnknown * _pUnkFTM;
DWORD64 _IsapiContext;
DWORD64 _LastIsapiContext;
W3_CONTEXT * _pW3Context;
BOOL _fAsyncIoPending;
HANDLE _hTfFile;
LPBYTE _pTfHead;
LPBYTE _pTfTail;
LPBYTE _pAsyncReadBuffer;
LPBYTE _pAsyncWriteBuffer;
BOOL _fIsOop;
WAM_PROCESS * _pWamProcess;
//
// Temprary buffer to store copied over handles/buffers for OOP+async
// vector send
BUFFER _bufVectorElements;
DWORD _nElementCount;
//
// ExecuteURL stuff
//
HANDLE _hExecUrlToken;
PVOID _pbExecUrlEntity;
//
// Do we allow http.sys to cache the response for this ISAPI request
//
BOOL _fCacheResponse;
};
#endif // _ISAPI_REQUEST_HXX_