|
|
/*++
Copyright (c) 1999-2002 Microsoft Corporation
Module Name:
sendresponsep.h
Abstract:
The private definition of response sending interfaces.
Author:
Michael Courage (mcourage) 15-Jun-1999
Revision History:
--*/
#ifndef _SENDRESPONSEP_H_
#define _SENDRESPONSEP_H_
//
// Private constants.
//
//
// Convenience macro to test if a MDL describes locked memory.
//
#define IS_MDL_LOCKED(pmdl) (((pmdl)->MdlFlags & MDL_PAGES_LOCKED) != 0)
#define HEADER_CHUNK_COUNT 2
//
// Private prototypes.
//
ULONG UlpComputeFixedHeaderSize( IN PHTTP_RESPONSE pUserResponse );
VOID UlpComputeChunkBufferSizes( IN ULONG ChunkCount, IN PHTTP_DATA_CHUNK pDataChunks, IN UL_CAPTURE_FLAGS Flags, OUT PULONG pAuxBufferSize, OUT PULONG pCopiedMemorySize, OUT PULONG pUncopiedMemorySize );
VOID UlpDestroyCapturedResponse( IN PUL_INTERNAL_RESPONSE pResponse );
VOID UlpEnqueueSendHttpResponse( IN PUL_CHUNK_TRACKER pTracker, IN BOOLEAN FromKernelMode );
VOID UlpDequeueSendHttpResponse( IN PUL_INTERNAL_REQUEST pRequest );
VOID UlpSendHttpResponseWorker( IN PUL_WORK_ITEM pWorkItem );
VOID UlpCloseConnectionComplete( IN PVOID pCompletionContext, IN NTSTATUS Status, IN ULONG_PTR Information );
NTSTATUS UlpProbeHttpResponse( IN PHTTP_RESPONSE pUserResponse, IN USHORT ChunkCount, IN PHTTP_DATA_CHUNK pCapturedDataChunks, IN UL_CAPTURE_FLAGS Flags, IN PHTTP_LOG_FIELDS_DATA pCapturedLogData, IN KPROCESSOR_MODE RequestorMode );
PUL_CHUNK_TRACKER UlpAllocateChunkTracker( IN UL_TRACKER_TYPE TrackerType, IN CCHAR SendIrpStackSize, IN CCHAR ReadIrpStackSize, IN BOOLEAN FirstResponse, IN PUL_HTTP_CONNECTION pHttpConnection, IN PUL_INTERNAL_RESPONSE pResponse );
VOID UlpFreeChunkTracker( IN PUL_WORK_ITEM pWorkItem );
VOID UlpCompleteSendResponseWorker( IN PUL_WORK_ITEM pWorkItem );
NTSTATUS UlpRestartMdlRead( IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp, IN PVOID pContext );
VOID UlpMdlReadCompleteWorker( IN PUL_WORK_ITEM pWorkItem );
VOID UlpRestartMdlSend( IN PVOID pCompletionContext, IN NTSTATUS Status, IN ULONG_PTR Information );
NTSTATUS UlpCopySend( IN PUL_CHUNK_TRACKER pTracker, IN PMDL pMdl, IN ULONG Length, IN BOOLEAN InitiateDisconnect, IN BOOLEAN RequestComplete );
VOID UlpRestartCopySend( IN PVOID pCompletionContext, IN NTSTATUS Status, IN ULONG_PTR Information );
VOID UlpMdlSendCompleteWorker( IN PUL_WORK_ITEM pWorkItem );
NTSTATUS UlpFlushMdlRuns( IN PUL_CHUNK_TRACKER pTracker );
VOID UlpFreeMdlRuns( IN PUL_CHUNK_TRACKER pTracker );
VOID UlpFreeFileMdlRun( IN OUT PUL_CHUNK_TRACKER pTracker, IN OUT PUL_MDL_RUN pMdlRun );
VOID UlpIncrementChunkPointer( IN OUT PUL_INTERNAL_RESPONSE pResponse );
__inline VOID UlpInitMdlRuns( IN OUT PUL_CHUNK_TRACKER pTracker ) { pTracker->SendInfo.pMdlHead = NULL; pTracker->SendInfo.pMdlLink = &pTracker->SendInfo.pMdlHead; pTracker->SendInfo.MdlRunCount = 0; pTracker->SendInfo.BytesBuffered = 0; }
__inline VOID UlpBuildExtendedSearchKey( IN PUL_INTERNAL_REQUEST pRequest, OUT PURI_SEARCH_KEY pSearchKey ) { ASSERT(pSearchKey); ASSERT(UL_IS_VALID_INTERNAL_REQUEST(pRequest));
ASSERT(pRequest->CookedUrl.Length > 0); ASSERT(DIFF(pRequest->CookedUrl.pAbsPath - pRequest->CookedUrl.pUrl) > 0); pSearchKey->Type = UriKeyTypeExtended; pSearchKey->ExKey.pAbsPath = pRequest->CookedUrl.pAbsPath; pSearchKey->ExKey.AbsPathLength = pRequest->CookedUrl.Length - (DIFF(pRequest->CookedUrl.pAbsPath - pRequest->CookedUrl.pUrl) * sizeof(WCHAR));
ASSERT(pSearchKey->ExKey.AbsPathLength > 0); ASSERT(wcslen(pSearchKey->ExKey.pAbsPath) * sizeof(WCHAR) == pSearchKey->ExKey.AbsPathLength); pSearchKey->ExKey.Hash = pRequest->CookedUrl.RoutingHash; pSearchKey->ExKey.pToken = pRequest->CookedUrl.pRoutingToken; pSearchKey->ExKey.TokenLength = pRequest->CookedUrl.RoutingTokenLength;
ASSERT(pSearchKey->ExKey.TokenLength > 0); ASSERT(wcslen(pSearchKey->ExKey.pToken) * sizeof(WCHAR) == pSearchKey->ExKey.TokenLength); }
//
// read stuff into the cache
//
NTSTATUS UlpBuildCacheEntry( IN PUL_INTERNAL_REQUEST pRequest, IN PUL_INTERNAL_RESPONSE pResponse, IN PUL_APP_POOL_PROCESS pProcess, IN HTTP_CACHE_POLICY CachePolicy, IN PUL_COMPLETION_ROUTINE pCompletionRoutine, IN PVOID pCompletionContext );
VOID UlpBuildCacheEntryWorker( IN PUL_WORK_ITEM pWorkItem );
NTSTATUS UlpRestartCacheMdlRead( IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp, IN PVOID pContext );
VOID UlpCacheMdlReadCompleteWorker( IN PUL_WORK_ITEM pWorkItem );
NTSTATUS UlpRestartCacheMdlFree( IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp, IN PVOID pContext );
VOID UlpCompleteCacheBuild( IN PUL_CHUNK_TRACKER pTracker, IN NTSTATUS Status );
VOID UlpCompleteCacheBuildWorker( IN PUL_WORK_ITEM pWorkItem );
//
// send cache entry across the wire
//
NTSTATUS UlpSendCacheEntry( PUL_HTTP_CONNECTION pHttpConnection, ULONG Flags, PUL_URI_CACHE_ENTRY pUriCacheEntry, PUL_COMPLETION_ROUTINE pCompletionRoutine, PVOID pCompletionContext, PUL_LOG_DATA_BUFFER pLogData, UL_RESUME_PARSING_TYPE ResumeParsingType );
VOID UlpSendCacheEntryWorker( IN PUL_WORK_ITEM pWorkItem );
VOID UlpCompleteSendCacheEntry( IN PVOID pCompletionContext, IN NTSTATUS Status, IN ULONG_PTR Information );
VOID UlpCompleteSendCacheEntry( IN PVOID pCompletionContext, IN NTSTATUS Status, IN ULONG_PTR Information );
VOID UlpCompleteSendCacheEntryWorker( IN PUL_WORK_ITEM pWorkItem );
PUL_FULL_TRACKER UlpAllocateCacheTracker( IN CCHAR SendIrpStackSize );
VOID UlpFreeCacheTracker( IN PUL_FULL_TRACKER pTracker );
VOID UlReferenceChunkTracker( IN PUL_CHUNK_TRACKER pTracker REFERENCE_DEBUG_FORMAL_PARAMS );
VOID UlDereferenceChunkTracker( IN PUL_CHUNK_TRACKER pTracker REFERENCE_DEBUG_FORMAL_PARAMS );
#define UL_REFERENCE_CHUNK_TRACKER( pTracker ) \
UlReferenceChunkTracker( \ (pTracker) \ REFERENCE_DEBUG_ACTUAL_PARAMS \ )
#define UL_DEREFERENCE_CHUNK_TRACKER( pTracker ) \
UlDereferenceChunkTracker( \ (pTracker) \ REFERENCE_DEBUG_ACTUAL_PARAMS \ )
__inline VOID UlpQueueResponseWorkItem( IN PUL_WORK_ITEM pWorkItem, IN PUL_WORK_ROUTINE pWorkRoutine, IN BOOLEAN SyncItem ) { if (SyncItem) { UL_QUEUE_SYNC_ITEM( pWorkItem, pWorkRoutine ); } else { UL_QUEUE_WORK_ITEM( pWorkItem, pWorkRoutine ); } }
#endif // _SENDRESPONSEP_H_
|