|
|
/*++
Copyright (c) 2000-2002 Microsoft Corporation
Module Name:
fastio.h
Abstract:
This module contains declarations related to fast I/O.
Author:
Chun Ye (chunye) 09-Dec-2000
Revision History:
--*/
#ifndef _FASTIO_H_
#define _FASTIO_H_
//
// Some useful macroes.
//
__inline BOOLEAN UlpIsLengthSpecified( IN PHTTP_KNOWN_HEADER pKnownHeaders ) { return (BOOLEAN)(pKnownHeaders[HttpHeaderContentLength].RawValueLength > 0);
} // UlpIsLengthSpecified
__inline BOOLEAN UlpIsChunkSpecified( IN PHTTP_KNOWN_HEADER pKnownHeaders, IN KPROCESSOR_MODE RequestorMode ) { USHORT RawValueLength; PCSTR pRawValue;
RawValueLength = pKnownHeaders[HttpHeaderTransferEncoding].RawValueLength; pRawValue = pKnownHeaders[HttpHeaderTransferEncoding].pRawValue;
if (CHUNKED_HDR_LENGTH == RawValueLength) { UlProbeAnsiString( pRawValue, CHUNKED_HDR_LENGTH, RequestorMode );
if (0 == _strnicmp(pRawValue, CHUNKED_HDR, CHUNKED_HDR_LENGTH)) { return TRUE; } }
return FALSE;
} // UlpIsChunkSpecified
//
// Inline functions to allocate/free a fast tracker.
//
__inline PUL_FULL_TRACKER UlpAllocateFastTracker( IN ULONG FixedHeaderLength, IN CCHAR SendIrpStackSize ) { PUL_FULL_TRACKER pTracker; ULONG SpaceLength; ULONG MaxFixedHeaderSize; USHORT MaxSendIrpSize; CCHAR MaxSendIrpStackSize;
//
// Sanity check.
//
PAGED_CODE();
if (FixedHeaderLength > g_UlMaxFixedHeaderSize || SendIrpStackSize > DEFAULT_MAX_IRP_STACK_SIZE) { MaxFixedHeaderSize = MAX(FixedHeaderLength, g_UlMaxFixedHeaderSize); MaxSendIrpStackSize = MAX(SendIrpStackSize, DEFAULT_MAX_IRP_STACK_SIZE); MaxSendIrpSize = (USHORT)ALIGN_UP(IoSizeOfIrp(MaxSendIrpStackSize), PVOID);
SpaceLength = ALIGN_UP(sizeof(UL_FULL_TRACKER), PVOID) + MaxSendIrpSize + MaxFixedHeaderSize + g_UlMaxVariableHeaderSize + g_UlMaxCopyThreshold + g_UlFixedHeadersMdlLength + g_UlVariableHeadersMdlLength + g_UlContentMdlLength;
pTracker = (PUL_FULL_TRACKER)UL_ALLOCATE_POOL( NonPagedPool, SpaceLength, UL_FULL_TRACKER_POOL_TAG );
if (pTracker) { pTracker->Signature = UL_FULL_TRACKER_POOL_TAG; pTracker->pLogData = NULL; pTracker->IrpContext.Signature = UL_IRP_CONTEXT_SIGNATURE; pTracker->FromLookaside = FALSE; pTracker->FromRequest = FALSE; pTracker->RequestVerb = HttpVerbInvalid; pTracker->ResponseStatusCode = 0; pTracker->AuxilaryBufferLength = MaxFixedHeaderSize + g_UlMaxVariableHeaderSize + g_UlMaxCopyThreshold;
UlInitializeFullTrackerPool( pTracker, MaxSendIrpStackSize ); } } else { pTracker = UlPplAllocateFullTracker();
if (pTracker) { pTracker->Signature = UL_FULL_TRACKER_POOL_TAG; pTracker->pLogData = NULL; pTracker->RequestVerb = HttpVerbInvalid; pTracker->ResponseStatusCode = 200; // OK
} }
return pTracker;
} // UlpAllocateFastTracker
__inline VOID UlpFreeFastTracker( IN PUL_FULL_TRACKER pTracker ) { //
// Sanity check.
//
ASSERT( IS_VALID_FULL_TRACKER( pTracker ) );
if (pTracker->pLogData) { PAGED_CODE();
UlDestroyLogDataBuffer( pTracker->pLogData ); }
if (pTracker->FromRequest == FALSE) { if (pTracker->FromLookaside) { UlPplFreeFullTracker( pTracker ); } else { UL_FREE_POOL_WITH_SIG( pTracker, UL_FULL_TRACKER_POOL_TAG ); } }
} // UlpFreeFastTracker
//
// Dispatch routines for fast I/O.
//
extern FAST_IO_DISPATCH UlFastIoDispatch;
//
// Fast I/O routines.
//
BOOLEAN UlFastIoDeviceControl ( IN PFILE_OBJECT pFileObject, IN BOOLEAN Wait, IN PVOID pInputBuffer OPTIONAL, IN ULONG InputBufferLength, OUT PVOID pOutputBuffer OPTIONAL, IN ULONG OutputBufferLength, IN ULONG IoControlCode, OUT PIO_STATUS_BLOCK pIoStatus, IN PDEVICE_OBJECT pDeviceObject );
BOOLEAN UlSendHttpResponseFastIo( IN PFILE_OBJECT pFileObject, IN PVOID pInputBuffer OPTIONAL, IN ULONG InputBufferLength, OUT PVOID pOutputBuffer OPTIONAL, IN ULONG OutputBufferLength, OUT PIO_STATUS_BLOCK pIoStatus, IN BOOLEAN RawResponse, IN KPROCESSOR_MODE RequestorMode );
BOOLEAN UlReceiveHttpRequestFastIo( IN PFILE_OBJECT pFileObject, IN PVOID pInputBuffer OPTIONAL, IN ULONG InputBufferLength, OUT PVOID pOutputBuffer OPTIONAL, IN ULONG OutputBufferLength, OUT PIO_STATUS_BLOCK pIoStatus, IN KPROCESSOR_MODE RequestorMode );
BOOLEAN UlReadFragmentFromCacheFastIo( IN PFILE_OBJECT pFileObject, IN PVOID pInputBuffer OPTIONAL, IN ULONG InputBufferLength, OUT PVOID pOutputBuffer OPTIONAL, IN ULONG OutputBufferLength, OUT PIO_STATUS_BLOCK pIoStatus, IN KPROCESSOR_MODE RequestorMode );
//
// Private prototypes.
//
NTSTATUS UlFastSendHttpResponse( IN PHTTP_RESPONSE pUserResponse OPTIONAL, IN PHTTP_LOG_FIELDS_DATA pLogData OPTIONAL, IN PHTTP_DATA_CHUNK pDataChunk, IN ULONG ChunkCount, IN ULONG FromMemoryLength, IN PUL_URI_CACHE_ENTRY pCacheEntry, IN ULONG Flags, IN PUL_INTERNAL_REQUEST pRequest, IN PIRP pUserIrp OPTIONAL, IN KPROCESSOR_MODE RequestorMode, IN ULONGLONG ConnectionSendBytes, IN ULONGLONG GlobalSendBytes, OUT PULONG BytesSent );
VOID UlpRestartFastSendHttpResponse( IN PVOID pCompletionContext, IN NTSTATUS Status, IN ULONG_PTR Information );
VOID UlpFastSendCompleteWorker( IN PUL_WORK_ITEM pWorkItem );
NTSTATUS UlpFastReceiveHttpRequest( IN HTTP_REQUEST_ID RequestId, IN PUL_APP_POOL_PROCESS pProcess, IN ULONG Flags, IN PVOID pOutputBuffer, IN ULONG OutputBufferLength, OUT PULONG pBytesRead );
#endif // _FASTIO_H_
|