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.

293 lines
6.6 KiB

  1. /*++
  2. Copyright (c) 2000-2002 Microsoft Corporation
  3. Module Name:
  4. fastio.h
  5. Abstract:
  6. This module contains declarations related to fast I/O.
  7. Author:
  8. Chun Ye (chunye) 09-Dec-2000
  9. Revision History:
  10. --*/
  11. #ifndef _FASTIO_H_
  12. #define _FASTIO_H_
  13. //
  14. // Some useful macroes.
  15. //
  16. __inline
  17. BOOLEAN
  18. UlpIsLengthSpecified(
  19. IN PHTTP_KNOWN_HEADER pKnownHeaders
  20. )
  21. {
  22. return (BOOLEAN)(pKnownHeaders[HttpHeaderContentLength].RawValueLength > 0);
  23. } // UlpIsLengthSpecified
  24. __inline
  25. BOOLEAN
  26. UlpIsChunkSpecified(
  27. IN PHTTP_KNOWN_HEADER pKnownHeaders,
  28. IN KPROCESSOR_MODE RequestorMode
  29. )
  30. {
  31. USHORT RawValueLength;
  32. PCSTR pRawValue;
  33. RawValueLength = pKnownHeaders[HttpHeaderTransferEncoding].RawValueLength;
  34. pRawValue = pKnownHeaders[HttpHeaderTransferEncoding].pRawValue;
  35. if (CHUNKED_HDR_LENGTH == RawValueLength)
  36. {
  37. UlProbeAnsiString(
  38. pRawValue,
  39. CHUNKED_HDR_LENGTH,
  40. RequestorMode
  41. );
  42. if (0 == _strnicmp(pRawValue, CHUNKED_HDR, CHUNKED_HDR_LENGTH))
  43. {
  44. return TRUE;
  45. }
  46. }
  47. return FALSE;
  48. } // UlpIsChunkSpecified
  49. //
  50. // Inline functions to allocate/free a fast tracker.
  51. //
  52. __inline
  53. PUL_FULL_TRACKER
  54. UlpAllocateFastTracker(
  55. IN ULONG FixedHeaderLength,
  56. IN CCHAR SendIrpStackSize
  57. )
  58. {
  59. PUL_FULL_TRACKER pTracker;
  60. ULONG SpaceLength;
  61. ULONG MaxFixedHeaderSize;
  62. USHORT MaxSendIrpSize;
  63. CCHAR MaxSendIrpStackSize;
  64. //
  65. // Sanity check.
  66. //
  67. PAGED_CODE();
  68. if (FixedHeaderLength > g_UlMaxFixedHeaderSize ||
  69. SendIrpStackSize > DEFAULT_MAX_IRP_STACK_SIZE)
  70. {
  71. MaxFixedHeaderSize = MAX(FixedHeaderLength, g_UlMaxFixedHeaderSize);
  72. MaxSendIrpStackSize = MAX(SendIrpStackSize, DEFAULT_MAX_IRP_STACK_SIZE);
  73. MaxSendIrpSize = (USHORT)ALIGN_UP(IoSizeOfIrp(MaxSendIrpStackSize), PVOID);
  74. SpaceLength =
  75. ALIGN_UP(sizeof(UL_FULL_TRACKER), PVOID) +
  76. MaxSendIrpSize +
  77. MaxFixedHeaderSize +
  78. g_UlMaxVariableHeaderSize +
  79. g_UlMaxCopyThreshold +
  80. g_UlFixedHeadersMdlLength +
  81. g_UlVariableHeadersMdlLength +
  82. g_UlContentMdlLength;
  83. pTracker = (PUL_FULL_TRACKER)UL_ALLOCATE_POOL(
  84. NonPagedPool,
  85. SpaceLength,
  86. UL_FULL_TRACKER_POOL_TAG
  87. );
  88. if (pTracker)
  89. {
  90. pTracker->Signature = UL_FULL_TRACKER_POOL_TAG;
  91. pTracker->pLogData = NULL;
  92. pTracker->IrpContext.Signature = UL_IRP_CONTEXT_SIGNATURE;
  93. pTracker->FromLookaside = FALSE;
  94. pTracker->FromRequest = FALSE;
  95. pTracker->RequestVerb = HttpVerbInvalid;
  96. pTracker->ResponseStatusCode = 0;
  97. pTracker->AuxilaryBufferLength =
  98. MaxFixedHeaderSize +
  99. g_UlMaxVariableHeaderSize +
  100. g_UlMaxCopyThreshold;
  101. UlInitializeFullTrackerPool( pTracker, MaxSendIrpStackSize );
  102. }
  103. }
  104. else
  105. {
  106. pTracker = UlPplAllocateFullTracker();
  107. if (pTracker)
  108. {
  109. pTracker->Signature = UL_FULL_TRACKER_POOL_TAG;
  110. pTracker->pLogData = NULL;
  111. pTracker->RequestVerb = HttpVerbInvalid;
  112. pTracker->ResponseStatusCode = 200; // OK
  113. }
  114. }
  115. return pTracker;
  116. } // UlpAllocateFastTracker
  117. __inline
  118. VOID
  119. UlpFreeFastTracker(
  120. IN PUL_FULL_TRACKER pTracker
  121. )
  122. {
  123. //
  124. // Sanity check.
  125. //
  126. ASSERT( IS_VALID_FULL_TRACKER( pTracker ) );
  127. if (pTracker->pLogData)
  128. {
  129. PAGED_CODE();
  130. UlDestroyLogDataBuffer( pTracker->pLogData );
  131. }
  132. if (pTracker->FromRequest == FALSE)
  133. {
  134. if (pTracker->FromLookaside)
  135. {
  136. UlPplFreeFullTracker( pTracker );
  137. }
  138. else
  139. {
  140. UL_FREE_POOL_WITH_SIG( pTracker, UL_FULL_TRACKER_POOL_TAG );
  141. }
  142. }
  143. } // UlpFreeFastTracker
  144. //
  145. // Dispatch routines for fast I/O.
  146. //
  147. extern FAST_IO_DISPATCH UlFastIoDispatch;
  148. //
  149. // Fast I/O routines.
  150. //
  151. BOOLEAN
  152. UlFastIoDeviceControl (
  153. IN PFILE_OBJECT pFileObject,
  154. IN BOOLEAN Wait,
  155. IN PVOID pInputBuffer OPTIONAL,
  156. IN ULONG InputBufferLength,
  157. OUT PVOID pOutputBuffer OPTIONAL,
  158. IN ULONG OutputBufferLength,
  159. IN ULONG IoControlCode,
  160. OUT PIO_STATUS_BLOCK pIoStatus,
  161. IN PDEVICE_OBJECT pDeviceObject
  162. );
  163. BOOLEAN
  164. UlSendHttpResponseFastIo(
  165. IN PFILE_OBJECT pFileObject,
  166. IN PVOID pInputBuffer OPTIONAL,
  167. IN ULONG InputBufferLength,
  168. OUT PVOID pOutputBuffer OPTIONAL,
  169. IN ULONG OutputBufferLength,
  170. OUT PIO_STATUS_BLOCK pIoStatus,
  171. IN BOOLEAN RawResponse,
  172. IN KPROCESSOR_MODE RequestorMode
  173. );
  174. BOOLEAN
  175. UlReceiveHttpRequestFastIo(
  176. IN PFILE_OBJECT pFileObject,
  177. IN PVOID pInputBuffer OPTIONAL,
  178. IN ULONG InputBufferLength,
  179. OUT PVOID pOutputBuffer OPTIONAL,
  180. IN ULONG OutputBufferLength,
  181. OUT PIO_STATUS_BLOCK pIoStatus,
  182. IN KPROCESSOR_MODE RequestorMode
  183. );
  184. BOOLEAN
  185. UlReadFragmentFromCacheFastIo(
  186. IN PFILE_OBJECT pFileObject,
  187. IN PVOID pInputBuffer OPTIONAL,
  188. IN ULONG InputBufferLength,
  189. OUT PVOID pOutputBuffer OPTIONAL,
  190. IN ULONG OutputBufferLength,
  191. OUT PIO_STATUS_BLOCK pIoStatus,
  192. IN KPROCESSOR_MODE RequestorMode
  193. );
  194. //
  195. // Private prototypes.
  196. //
  197. NTSTATUS
  198. UlFastSendHttpResponse(
  199. IN PHTTP_RESPONSE pUserResponse OPTIONAL,
  200. IN PHTTP_LOG_FIELDS_DATA pLogData OPTIONAL,
  201. IN PHTTP_DATA_CHUNK pDataChunk,
  202. IN ULONG ChunkCount,
  203. IN ULONG FromMemoryLength,
  204. IN PUL_URI_CACHE_ENTRY pCacheEntry,
  205. IN ULONG Flags,
  206. IN PUL_INTERNAL_REQUEST pRequest,
  207. IN PIRP pUserIrp OPTIONAL,
  208. IN KPROCESSOR_MODE RequestorMode,
  209. IN ULONGLONG ConnectionSendBytes,
  210. IN ULONGLONG GlobalSendBytes,
  211. OUT PULONG BytesSent
  212. );
  213. VOID
  214. UlpRestartFastSendHttpResponse(
  215. IN PVOID pCompletionContext,
  216. IN NTSTATUS Status,
  217. IN ULONG_PTR Information
  218. );
  219. VOID
  220. UlpFastSendCompleteWorker(
  221. IN PUL_WORK_ITEM pWorkItem
  222. );
  223. NTSTATUS
  224. UlpFastReceiveHttpRequest(
  225. IN HTTP_REQUEST_ID RequestId,
  226. IN PUL_APP_POOL_PROCESS pProcess,
  227. IN ULONG Flags,
  228. IN PVOID pOutputBuffer,
  229. IN ULONG OutputBufferLength,
  230. OUT PULONG pBytesRead
  231. );
  232. #endif // _FASTIO_H_