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
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_
|