Windows NT 4.0 source code leak
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.

1073 lines
23 KiB

4 years ago
  1. /*++
  2. Copyright (c) 1989 Microsoft Corporation
  3. Module Name:
  4. afdprocs.h
  5. Abstract:
  6. This module contains routine prototypes for AFD.
  7. Author:
  8. David Treadwell (davidtr) 21-Feb-1992
  9. Revision History:
  10. --*/
  11. #ifndef _AFDPROCS_
  12. #define _AFDPROCS_
  13. NTSTATUS
  14. DriverEntry (
  15. IN PDRIVER_OBJECT DriverObject,
  16. IN PUNICODE_STRING RegistryPath
  17. );
  18. NTSTATUS
  19. AfdAccept (
  20. IN PIRP Irp,
  21. IN PIO_STACK_LOCATION IrpSp
  22. );
  23. NTSTATUS
  24. AfdSuperAccept (
  25. IN PIRP Irp,
  26. IN PIO_STACK_LOCATION IrpSp
  27. );
  28. NTSTATUS
  29. AfdDeferAccept (
  30. IN PIRP Irp,
  31. IN PIO_STACK_LOCATION IrpSp
  32. );
  33. PMDL
  34. AfdAdvanceMdlChain(
  35. IN PMDL Mdl,
  36. IN ULONG Offset
  37. );
  38. NTSTATUS
  39. AfdAllocateMdlChain(
  40. IN PIRP Irp,
  41. IN LPWSABUF BufferArray,
  42. IN ULONG BufferCount,
  43. IN LOCK_OPERATION Operation,
  44. OUT PULONG TotalByteCount
  45. );
  46. BOOLEAN
  47. AfdAreTransportAddressesEqual (
  48. IN PTRANSPORT_ADDRESS EndpointAddress,
  49. IN ULONG EndpointAddressLength,
  50. IN PTRANSPORT_ADDRESS RequestAddress,
  51. IN ULONG RequestAddressLength,
  52. IN BOOLEAN HonorWildcardIpPortInEndpointAddress
  53. );
  54. NTSTATUS
  55. AfdBeginAbort (
  56. IN PAFD_CONNECTION Connection
  57. );
  58. NTSTATUS
  59. AfdBeginDisconnect (
  60. IN PAFD_ENDPOINT Endpoint,
  61. IN PLARGE_INTEGER Timeout OPTIONAL,
  62. OUT PIRP *DisconnectIrp OPTIONAL
  63. );
  64. NTSTATUS
  65. AfdBind (
  66. IN PIRP Irp,
  67. IN PIO_STACK_LOCATION IrpSp
  68. );
  69. ULONG
  70. AfdCalcBufferArrayByteLengthRead(
  71. IN LPWSABUF BufferArray,
  72. IN ULONG BufferCount
  73. );
  74. ULONG
  75. AfdCalcBufferArrayByteLengthWrite(
  76. IN LPWSABUF BufferArray,
  77. IN ULONG BufferCount
  78. );
  79. VOID
  80. AfdCancelReceiveDatagram (
  81. IN PDEVICE_OBJECT DeviceObject,
  82. IN PIRP Irp
  83. );
  84. VOID
  85. AfdCancelTransmit (
  86. IN PDEVICE_OBJECT DeviceObject,
  87. IN PIRP Irp
  88. );
  89. NTSTATUS
  90. AfdCleanup (
  91. IN PIRP Irp,
  92. IN PIO_STACK_LOCATION IrpSp
  93. );
  94. NTSTATUS
  95. AfdClose (
  96. IN PIRP Irp,
  97. IN PIO_STACK_LOCATION IrpSp
  98. );
  99. VOID
  100. AfdCompleteIrpList (
  101. IN PLIST_ENTRY IrpListHead,
  102. IN PKSPIN_LOCK SpinLock,
  103. IN NTSTATUS Status,
  104. IN PAFD_IRP_CLEANUP_ROUTINE CleanupRoutine OPTIONAL
  105. );
  106. VOID
  107. AfdCompleteClosePendedTransmit (
  108. IN PAFD_ENDPOINT Endpoint
  109. );
  110. NTSTATUS
  111. AfdConnect (
  112. IN PIRP Irp,
  113. IN PIO_STACK_LOCATION IrpSp
  114. );
  115. NTSTATUS
  116. AfdConnectEventHandler (
  117. IN PVOID TdiEventContext,
  118. IN int RemoteAddressLength,
  119. IN PVOID RemoteAddress,
  120. IN int UserDataLength,
  121. IN PVOID UserData,
  122. IN int OptionsLength,
  123. IN PVOID Options,
  124. OUT CONNECTION_CONTEXT *ConnectionContext,
  125. OUT PIRP *AcceptIrp
  126. );
  127. ULONG
  128. AfdCopyBufferArrayToBuffer(
  129. IN PVOID Destination,
  130. IN ULONG DestinationLength,
  131. IN LPWSABUF BufferArray,
  132. IN ULONG BufferCount
  133. );
  134. ULONG
  135. AfdCopyBufferToBufferArray(
  136. IN LPWSABUF BufferArray,
  137. IN ULONG Offset,
  138. IN ULONG BufferCount,
  139. IN PVOID Source,
  140. IN ULONG SourceLength
  141. );
  142. NTSTATUS
  143. AfdCreate (
  144. IN PIRP Irp,
  145. IN PIO_STACK_LOCATION IrpSp
  146. );
  147. VOID
  148. AfdDestroyMdlChain (
  149. IN PIRP Irp
  150. );
  151. NTSTATUS
  152. AfdDisconnectEventHandler (
  153. IN PVOID TdiEventContext,
  154. IN CONNECTION_CONTEXT ConnectionContext,
  155. IN int DisconnectDataLength,
  156. IN PVOID DisconnectData,
  157. IN int DisconnectInformationLength,
  158. IN PVOID DisconnectInformation,
  159. IN ULONG DisconnectFlags
  160. );
  161. NTSTATUS
  162. AfdDispatch (
  163. IN PDEVICE_OBJECT DeviceObject,
  164. IN PIRP Irp
  165. );
  166. NTSTATUS
  167. AfdEnumNetworkEvents (
  168. IN PIRP Irp,
  169. IN PIO_STACK_LOCATION IrpSp
  170. );
  171. NTSTATUS
  172. AfdErrorEventHandler (
  173. IN PVOID TdiEventContext,
  174. IN NTSTATUS Status
  175. );
  176. NTSTATUS
  177. AfdEventSelect (
  178. IN PIRP Irp,
  179. IN PIO_STACK_LOCATION IrpSp
  180. );
  181. BOOLEAN
  182. AfdFastTransmitFile (
  183. IN struct _FILE_OBJECT *FileObject,
  184. IN PVOID InputBuffer OPTIONAL,
  185. IN ULONG InputBufferLength,
  186. OUT PIO_STATUS_BLOCK IoStatus
  187. );
  188. VOID
  189. AfdFreeConnectDataBuffers (
  190. IN PAFD_CONNECT_DATA_BUFFERS ConnectDataBuffers
  191. );
  192. VOID
  193. AfdFreeQueuedConnections (
  194. IN PAFD_ENDPOINT Endpoint
  195. );
  196. NTSTATUS
  197. AfdGetAddress (
  198. IN PIRP Irp,
  199. IN PIO_STACK_LOCATION IrpSp
  200. );
  201. NTSTATUS
  202. AfdGetContext (
  203. IN PIRP Irp,
  204. IN PIO_STACK_LOCATION IrpSp
  205. );
  206. NTSTATUS
  207. AfdGetContextLength (
  208. IN PIRP Irp,
  209. IN PIO_STACK_LOCATION IrpSp
  210. );
  211. NTSTATUS
  212. AfdGetInformation (
  213. IN PIRP Irp,
  214. IN PIO_STACK_LOCATION IrpSp
  215. );
  216. VOID
  217. AfdIndicateEventSelectEvent (
  218. IN PAFD_ENDPOINT Endpoint,
  219. IN ULONG PollEventBit,
  220. IN NTSTATUS Status
  221. );
  222. VOID
  223. AfdIndicatePollEvent (
  224. IN PAFD_ENDPOINT Endpoint,
  225. IN ULONG PollEventBit,
  226. IN NTSTATUS Status
  227. );
  228. VOID
  229. AfdInitiateListenBacklogReplenish (
  230. IN PAFD_ENDPOINT Endpoint
  231. );
  232. BOOLEAN
  233. AfdInitializeData (
  234. VOID
  235. );
  236. NTSTATUS
  237. AfdIssueDeviceControl (
  238. IN HANDLE FileHandle OPTIONAL,
  239. IN PFILE_OBJECT FileObject OPTIONAL,
  240. IN PVOID IrpParameters,
  241. IN ULONG IrpParametersLength,
  242. IN PVOID MdlBuffer,
  243. IN ULONG MdlBufferLength,
  244. IN UCHAR MinorFunction
  245. );
  246. VOID
  247. AfdIncrementLockCount (
  248. VOID
  249. );
  250. VOID
  251. AfdDecrementLockCount (
  252. VOID
  253. );
  254. VOID
  255. AfdInsertNewEndpointInList (
  256. IN PAFD_ENDPOINT Endpoint
  257. );
  258. VOID
  259. AfdRemoveEndpointFromList (
  260. IN PAFD_ENDPOINT Endpoint
  261. );
  262. VOID
  263. AfdInterlockedRemoveEntryList (
  264. IN PLIST_ENTRY ListEntry,
  265. IN PKSPIN_LOCK SpinLock
  266. );
  267. NTSTATUS
  268. AfdOpenConnection (
  269. IN PIRP Irp,
  270. IN PIO_STACK_LOCATION IrpSp
  271. );
  272. NTSTATUS
  273. AfdPartialDisconnect (
  274. IN PIRP Irp,
  275. IN PIO_STACK_LOCATION IrpSp
  276. );
  277. NTSTATUS
  278. AfdPoll (
  279. IN PIRP Irp,
  280. IN PIO_STACK_LOCATION IrpSp
  281. );
  282. PAFD_WORK_ITEM
  283. AfdAllocateWorkItem(
  284. VOID
  285. );
  286. VOID
  287. AfdQueueWorkItem (
  288. IN PWORKER_THREAD_ROUTINE AfdWorkerRoutine,
  289. IN PAFD_WORK_ITEM AfdWorkItem
  290. );
  291. VOID
  292. AfdFreeWorkItem(
  293. IN PAFD_WORK_ITEM AfdWorkItem
  294. );
  295. #if DBG
  296. PVOID
  297. NTAPI
  298. AfdAllocateWorkItemPool(
  299. IN POOL_TYPE PoolType,
  300. IN ULONG NumberOfBytes,
  301. IN ULONG Tag
  302. );
  303. VOID
  304. NTAPI
  305. AfdFreeWorkItemPool(
  306. IN PVOID Block
  307. );
  308. #endif
  309. NTSTATUS
  310. AfdQueryHandles (
  311. IN PIRP Irp,
  312. IN PIO_STACK_LOCATION IrpSp
  313. );
  314. NTSTATUS
  315. AfdQueryReceiveInformation (
  316. IN PIRP Irp,
  317. IN PIO_STACK_LOCATION IrpSp
  318. );
  319. NTSTATUS
  320. AfdQueueUserApc (
  321. IN PIRP Irp,
  322. IN PIO_STACK_LOCATION IrpSp
  323. );
  324. NTSTATUS
  325. AfdSetContext (
  326. IN PIRP Irp,
  327. IN PIO_STACK_LOCATION IrpSp
  328. );
  329. NTSTATUS
  330. AfdSetEventHandler (
  331. IN PFILE_OBJECT FileObject,
  332. IN ULONG EventType,
  333. IN PVOID EventHandler,
  334. IN PVOID EventContext
  335. );
  336. NTSTATUS
  337. AfdSetInLineMode (
  338. IN PAFD_CONNECTION Connection,
  339. IN BOOLEAN InLine
  340. );
  341. NTSTATUS
  342. AfdReceive (
  343. IN PIRP Irp,
  344. IN PIO_STACK_LOCATION IrpSp
  345. );
  346. NTSTATUS
  347. AfdBReceive (
  348. IN PIRP Irp,
  349. IN PIO_STACK_LOCATION IrpSp,
  350. IN ULONG RecvFlags,
  351. IN ULONG AfdFlags,
  352. IN ULONG RecvLength
  353. );
  354. NTSTATUS
  355. AfdReceiveDatagram (
  356. IN PIRP Irp,
  357. IN PIO_STACK_LOCATION IrpSp,
  358. IN ULONG RecvFlags,
  359. IN ULONG AfdFlags
  360. );
  361. VOID
  362. AfdCleanupReceiveDatagramIrp(
  363. IN PIRP Irp
  364. );
  365. NTSTATUS
  366. AfdReceiveEventHandler (
  367. IN PVOID TdiEventContext,
  368. IN CONNECTION_CONTEXT ConnectionContext,
  369. IN ULONG ReceiveFlags,
  370. IN ULONG BytesIndicated,
  371. IN ULONG BytesAvailable,
  372. OUT ULONG *BytesTaken,
  373. IN PVOID Tsdu,
  374. OUT PIRP *IoRequestPacket
  375. );
  376. NTSTATUS
  377. AfdBReceiveEventHandler (
  378. IN PVOID TdiEventContext,
  379. IN CONNECTION_CONTEXT ConnectionContext,
  380. IN ULONG ReceiveFlags,
  381. IN ULONG BytesIndicated,
  382. IN ULONG BytesAvailable,
  383. OUT ULONG *BytesTaken,
  384. IN PVOID Tsdu,
  385. OUT PIRP *IoRequestPacket
  386. );
  387. NTSTATUS
  388. AfdReceiveDatagramEventHandler (
  389. IN PVOID TdiEventContext,
  390. IN int SourceAddressLength,
  391. IN PVOID SourceAddress,
  392. IN int OptionsLength,
  393. IN PVOID Options,
  394. IN ULONG ReceiveDatagramFlags,
  395. IN ULONG BytesIndicated,
  396. IN ULONG BytesAvailable,
  397. OUT ULONG *BytesTaken,
  398. IN PVOID Tsdu,
  399. OUT PIRP *IoRequestPacket
  400. );
  401. NTSTATUS
  402. AfdReceiveExpeditedEventHandler (
  403. IN PVOID TdiEventContext,
  404. IN CONNECTION_CONTEXT ConnectionContext,
  405. IN ULONG ReceiveFlags,
  406. IN ULONG BytesIndicated,
  407. IN ULONG BytesAvailable,
  408. OUT ULONG *BytesTaken,
  409. IN PVOID Tsdu,
  410. OUT PIRP *IoRequestPacket
  411. );
  412. NTSTATUS
  413. AfdBReceiveExpeditedEventHandler (
  414. IN PVOID TdiEventContext,
  415. IN CONNECTION_CONTEXT ConnectionContext,
  416. IN ULONG ReceiveFlags,
  417. IN ULONG BytesIndicated,
  418. IN ULONG BytesAvailable,
  419. OUT ULONG *BytesTaken,
  420. IN PVOID Tsdu,
  421. OUT PIRP *IoRequestPacket
  422. );
  423. NTSTATUS
  424. AfdRestartBufferReceive (
  425. IN PDEVICE_OBJECT DeviceObject,
  426. IN PIRP Irp,
  427. IN PVOID Context
  428. );
  429. NTSTATUS
  430. AfdRestartAbort (
  431. IN PDEVICE_OBJECT DeviceObject,
  432. IN PIRP Irp,
  433. IN PVOID Context
  434. );
  435. NTSTATUS
  436. AfdSend (
  437. IN PIRP Irp,
  438. IN PIO_STACK_LOCATION IrpSp
  439. );
  440. NTSTATUS
  441. AfdSendDatagram (
  442. IN PIRP Irp,
  443. IN PIO_STACK_LOCATION IrpSp
  444. );
  445. NTSTATUS
  446. AfdSendPossibleEventHandler (
  447. IN PVOID TdiEventContext,
  448. IN PVOID ConnectionContext,
  449. IN ULONG BytesAvailable
  450. );
  451. NTSTATUS
  452. AfdRestartBufferSend (
  453. IN PDEVICE_OBJECT DeviceObject,
  454. IN PIRP Irp,
  455. IN PVOID Context
  456. );
  457. NTSTATUS
  458. AfdSetInformation (
  459. IN PIRP Irp,
  460. IN PIO_STACK_LOCATION IrpSp
  461. );
  462. BOOLEAN
  463. AfdShouldSendBlock (
  464. IN PAFD_ENDPOINT Endpoint,
  465. IN PAFD_CONNECTION Connection,
  466. IN ULONG SendLength
  467. );
  468. NTSTATUS
  469. AfdStartListen (
  470. IN PIRP Irp,
  471. IN PIO_STACK_LOCATION IrpSp
  472. );
  473. NTSTATUS
  474. AfdTransmitFile (
  475. IN PIRP Irp,
  476. IN PIO_STACK_LOCATION IrpSp
  477. );
  478. NTSTATUS
  479. AfdMdlReadComplete(
  480. IN PFILE_OBJECT FileObject,
  481. IN PMDL MdlChain,
  482. IN LONGLONG FileOffset,
  483. IN ULONG Length
  484. );
  485. NTSTATUS
  486. AfdWaitForListen (
  487. IN PIRP Irp,
  488. IN PIO_STACK_LOCATION IrpSp
  489. );
  490. NTSTATUS
  491. AfdSetQos (
  492. IN PIRP Irp,
  493. IN PIO_STACK_LOCATION IrpSp
  494. );
  495. NTSTATUS
  496. AfdGetQos (
  497. IN PIRP Irp,
  498. IN PIO_STACK_LOCATION IrpSp
  499. );
  500. NTSTATUS
  501. AfdNoOperation (
  502. IN PIRP Irp,
  503. IN PIO_STACK_LOCATION IrpSp
  504. );
  505. NTSTATUS
  506. AfdValidateGroup (
  507. IN PIRP Irp,
  508. IN PIO_STACK_LOCATION IrpSp
  509. );
  510. NTSTATUS
  511. AfdGetUnacceptedConnectData (
  512. IN PIRP Irp,
  513. IN PIO_STACK_LOCATION IrpSp
  514. );
  515. #ifdef NT351
  516. NTSTATUS
  517. AfdReferenceEventObjectByHandle(
  518. IN HANDLE Handle,
  519. IN KPROCESSOR_MODE AccessMode,
  520. OUT PVOID *Object
  521. );
  522. #else // !NT351
  523. #define AfdReferenceEventObjectByHandle(Handle, AccessMode, Object) \
  524. ObReferenceObjectByHandle( \
  525. (Handle), \
  526. 0, \
  527. *(POBJECT_TYPE *)ExEventObjectType, \
  528. (AccessMode), \
  529. (Object), \
  530. NULL \
  531. )
  532. #endif
  533. //
  534. // Endpoint handling routines.
  535. //
  536. NTSTATUS
  537. AfdAllocateEndpoint (
  538. OUT PAFD_ENDPOINT * NewEndpoint,
  539. IN PUNICODE_STRING TransportDeviceName,
  540. IN LONG GroupID
  541. );
  542. VOID
  543. AfdCloseEndpoint (
  544. IN PAFD_ENDPOINT Endpoint
  545. );
  546. #if REFERENCE_DEBUG
  547. VOID
  548. AfdReferenceEndpoint (
  549. IN PAFD_ENDPOINT Endpoint,
  550. IN PVOID Info1,
  551. IN PVOID Info2
  552. );
  553. VOID
  554. AfdDereferenceEndpoint (
  555. IN PAFD_ENDPOINT Endpoint,
  556. IN PVOID Info1,
  557. IN PVOID Info2
  558. );
  559. #define REFERENCE_ENDPOINT(_a) AfdReferenceEndpoint((_a),(PVOID)__FILE__,(PVOID)__LINE__)
  560. #define REFERENCE_ENDPOINT2(_a,_b,_c) AfdReferenceEndpoint((_a),(_b),(_c))
  561. #define DEREFERENCE_ENDPOINT(_a) AfdDereferenceEndpoint((_a),(PVOID)__FILE__,(PVOID)__LINE__)
  562. #define DEREFERENCE_ENDPOINT2(_a,_b,_c) AfdDereferenceEndpoint((_a),(PVOID)__FILE__,(PVOID)__LINE__)
  563. #else
  564. VOID
  565. AfdDereferenceEndpoint (
  566. IN PAFD_ENDPOINT Endpoint
  567. );
  568. #define REFERENCE_ENDPOINT(_a) InterlockedIncrement( &(_a)->ReferenceCount )
  569. #define REFERENCE_ENDPOINT2(_a,_b,_c) InterlockedIncrement( &(_a)->ReferenceCount )
  570. #define DEREFERENCE_ENDPOINT(_a) AfdDereferenceEndpoint((_a))
  571. #define DEREFERENCE_ENDPOINT2(_a,_b,_c) AfdDereferenceEndpoint((_a))
  572. #endif
  573. VOID
  574. AfdRefreshEndpoint (
  575. IN PAFD_ENDPOINT Endpoint
  576. );
  577. //
  578. // Connection handling routines.
  579. //
  580. VOID
  581. AfdAbortConnection (
  582. IN PAFD_CONNECTION Connection
  583. );
  584. NTSTATUS
  585. AfdAddFreeConnection (
  586. IN PAFD_ENDPOINT Endpoint
  587. );
  588. PAFD_CONNECTION
  589. AfdAllocateConnection (
  590. VOID
  591. );
  592. NTSTATUS
  593. AfdCreateConnection (
  594. IN PUNICODE_STRING TransportDeviceName,
  595. IN HANDLE AddressHandle OPTIONAL,
  596. IN BOOLEAN TdiBufferring,
  597. IN BOOLEAN InLine,
  598. IN PEPROCESS ProcessToCharge,
  599. OUT PAFD_CONNECTION *Connection
  600. );
  601. PAFD_CONNECTION
  602. AfdGetFreeConnection (
  603. IN PAFD_ENDPOINT Endpoint
  604. );
  605. PAFD_CONNECTION
  606. AfdGetReturnedConnection (
  607. IN PAFD_ENDPOINT Endpoint,
  608. IN ULONG Sequence
  609. );
  610. PAFD_CONNECTION
  611. AfdGetUnacceptedConnection (
  612. IN PAFD_ENDPOINT Endpoint
  613. );
  614. #if REFERENCE_DEBUG
  615. VOID
  616. AfdReferenceConnection (
  617. IN PAFD_CONNECTION Connection,
  618. IN PVOID Info1,
  619. IN PVOID Info2
  620. );
  621. VOID
  622. AfdDereferenceConnection (
  623. IN PAFD_CONNECTION Connection,
  624. IN PVOID Info1,
  625. IN PVOID Info2
  626. );
  627. #define REFERENCE_CONNECTION(_a) AfdReferenceConnection((_a), (PVOID)__FILE__, (PVOID)__LINE__)
  628. #define REFERENCE_CONNECTION2(_a,_b,_c) AfdReferenceConnection((_a),(_b),(_c))
  629. #define DEREFERENCE_CONNECTION(_a) AfdDereferenceConnection((_a), (PVOID)__FILE__, (PVOID)__LINE__ )
  630. #define DEREFERENCE_CONNECTION2(_a,_b,_c) AfdDereferenceConnection((_a),(_b),(_c))
  631. VOID
  632. AfdUpdateConnectionTrack (
  633. IN PAFD_CONNECTION Connection,
  634. IN LONG NewReferenceCount,
  635. IN PVOID Info1,
  636. IN PVOID Info2,
  637. IN ULONG Action
  638. );
  639. #define UPDATE_CONN(_c,_a) \
  640. if( (_c) != NULL ) { \
  641. AfdUpdateConnectionTrack( \
  642. (_c), \
  643. (_c)->ReferenceCount, \
  644. __FILE__, \
  645. (PVOID)__LINE__, \
  646. (ULONG)(_a) \
  647. ); \
  648. } else
  649. #else
  650. VOID
  651. AfdDereferenceConnection (
  652. IN PAFD_CONNECTION Connection
  653. );
  654. #define REFERENCE_CONNECTION(_a) InterlockedIncrement( &(_a)->ReferenceCount )
  655. #define REFERENCE_CONNECTION2(_a,_b,_c) InterlockedIncrement( &(_a)->ReferenceCount )
  656. #define DEREFERENCE_CONNECTION(_a) AfdDereferenceConnection((_a))
  657. #define DEREFERENCE_CONNECTION2(_a,_b,_c) AfdDereferenceConnection((_a))
  658. #define UPDATE_CONN(_c,_a)
  659. #endif
  660. VOID
  661. AfdAddConnectedReference (
  662. IN PAFD_CONNECTION Connection
  663. );
  664. VOID
  665. AfdDeleteConnectedReference (
  666. IN PAFD_CONNECTION Connection,
  667. IN BOOLEAN EndpointLockHeld
  668. );
  669. //
  670. // Routines to handle fast IO.
  671. //
  672. BOOLEAN
  673. AfdFastIoRead (
  674. IN struct _FILE_OBJECT *FileObject,
  675. IN PLARGE_INTEGER FileOffset,
  676. IN ULONG Length,
  677. IN BOOLEAN Wait,
  678. IN ULONG LockKey,
  679. OUT PVOID Buffer,
  680. OUT PIO_STATUS_BLOCK IoStatus,
  681. IN struct _DEVICE_OBJECT *DeviceObject
  682. );
  683. BOOLEAN
  684. AfdFastIoWrite (
  685. IN struct _FILE_OBJECT *FileObject,
  686. IN PLARGE_INTEGER FileOffset,
  687. IN ULONG Length,
  688. IN BOOLEAN Wait,
  689. IN ULONG LockKey,
  690. IN PVOID Buffer,
  691. OUT PIO_STATUS_BLOCK IoStatus,
  692. IN struct _DEVICE_OBJECT *DeviceObject
  693. );
  694. BOOLEAN
  695. AfdFastIoDeviceControl (
  696. IN struct _FILE_OBJECT *FileObject,
  697. IN BOOLEAN Wait,
  698. IN PVOID InputBuffer OPTIONAL,
  699. IN ULONG InputBufferLength,
  700. OUT PVOID OutputBuffer OPTIONAL,
  701. IN ULONG OutputBufferLength,
  702. IN ULONG IoControlCode,
  703. OUT PIO_STATUS_BLOCK IoStatus,
  704. IN struct _DEVICE_OBJECT *DeviceObject
  705. );
  706. //
  707. // Routines to handle getting and setting connect data.
  708. //
  709. NTSTATUS
  710. AfdGetConnectData (
  711. IN PIRP Irp,
  712. IN PIO_STACK_LOCATION IrpSp,
  713. IN ULONG Code
  714. );
  715. NTSTATUS
  716. AfdSetConnectData (
  717. IN PIRP Irp,
  718. IN PIO_STACK_LOCATION IrpSp,
  719. IN ULONG Code
  720. );
  721. NTSTATUS
  722. AfdSaveReceivedConnectData (
  723. IN OUT PAFD_CONNECT_DATA_BUFFERS * DataBuffers,
  724. IN ULONG IoControlCode,
  725. IN PVOID Buffer,
  726. IN ULONG BufferLength
  727. );
  728. //
  729. // Buffer management routines.
  730. //
  731. PVOID
  732. AfdAllocateBuffer (
  733. IN POOL_TYPE PoolType,
  734. IN ULONG NumberOfBytes,
  735. IN ULONG Tag
  736. );
  737. CLONG
  738. AfdCalculateBufferSize (
  739. IN CLONG BufferDataSize,
  740. IN CLONG AddressSize
  741. );
  742. PAFD_BUFFER
  743. AfdGetBuffer (
  744. IN CLONG BufferDataSize,
  745. IN CLONG AddressSize
  746. );
  747. PAFD_BUFFER
  748. AfdGetBufferChain (
  749. IN CLONG BufferDataSize
  750. );
  751. VOID
  752. AfdReturnBuffer (
  753. IN PAFD_BUFFER AfdBuffer
  754. );
  755. VOID
  756. AfdReturnBufferChain (
  757. IN PAFD_BUFFER AfdBuffer
  758. );
  759. #if DBG
  760. VOID
  761. NTAPI
  762. AfdFreeBufferPool(
  763. IN PVOID Block
  764. );
  765. #endif
  766. //
  767. // Group ID managment routines.
  768. //
  769. BOOLEAN
  770. AfdInitializeGroup(
  771. VOID
  772. );
  773. VOID
  774. AfdTerminateGroup(
  775. VOID
  776. );
  777. BOOLEAN
  778. AfdReferenceGroup(
  779. IN LONG Group,
  780. OUT PAFD_GROUP_TYPE GroupType
  781. );
  782. BOOLEAN
  783. AfdDereferenceGroup(
  784. IN LONG Group
  785. );
  786. BOOLEAN
  787. AfdGetGroup(
  788. IN OUT PLONG Group,
  789. OUT PAFD_GROUP_TYPE GroupType
  790. );
  791. #define IS_DATA_ON_CONNECTION_B(conn) \
  792. ((conn)->Common.Bufferring.ReceiveBytesIndicated.QuadPart > \
  793. ((conn)->Common.Bufferring.ReceiveBytesTaken.QuadPart + \
  794. (conn)->Common.Bufferring.ReceiveBytesOutstanding.QuadPart )\
  795. || \
  796. (conn)->VcZeroByteReceiveIndicated)
  797. #define IS_EXPEDITED_DATA_ON_CONNECTION_B(conn) \
  798. ((conn)->Common.Bufferring.ReceiveExpeditedBytesIndicated.QuadPart > \
  799. ((conn)->Common.Bufferring.ReceiveExpeditedBytesTaken.QuadPart + \
  800. (conn)->Common.Bufferring.ReceiveExpeditedBytesOutstanding.QuadPart) )
  801. #define IS_DATA_ON_CONNECTION_NB(conn) \
  802. ( (conn)->Common.NonBufferring.BufferredReceiveCount != 0 )
  803. #define IS_EXPEDITED_DATA_ON_CONNECTION_NB(conn) \
  804. ( (conn)->Common.NonBufferring.BufferredExpeditedCount != 0 )
  805. #define IS_DATA_ON_CONNECTION(conn) \
  806. ( (conn)->Endpoint->TdiBufferring ? \
  807. IS_DATA_ON_CONNECTION_B(conn) : \
  808. IS_DATA_ON_CONNECTION_NB(conn) )
  809. #define IS_EXPEDITED_DATA_ON_CONNECTION(conn) \
  810. ( (conn)->Endpoint->TdiBufferring ? \
  811. IS_EXPEDITED_DATA_ON_CONNECTION_B(conn) : \
  812. IS_EXPEDITED_DATA_ON_CONNECTION_NB(conn) )
  813. #define ARE_DATAGRAMS_ON_ENDPOINT(endp) \
  814. ( (endp)->BufferredDatagramCount != 0 )
  815. //
  816. // Debug statistic manipulators. On checked builds these macros update
  817. // their corresponding statistic counter. On retail builds, these macros
  818. // evaluate to nothing.
  819. //
  820. #if AFD_KEEP_STATS
  821. #define AfdRecordPoolQuotaCharged( b ) \
  822. ExInterlockedAddLargeStatistic( \
  823. &AfdQuotaStats.Charged, \
  824. (b) \
  825. )
  826. #define AfdRecordPoolQuotaReturned( b ) \
  827. ExInterlockedAddLargeStatistic( \
  828. &AfdQuotaStats.Returned, \
  829. (b) \
  830. )
  831. #define AfdRecordAddrOpened() InterlockedIncrement( &AfdHandleStats.AddrOpened )
  832. #define AfdRecordAddrClosed() InterlockedIncrement( &AfdHandleStats.AddrClosed )
  833. #define AfdRecordAddrRef() InterlockedIncrement( &AfdHandleStats.AddrRef )
  834. #define AfdRecordAddrDeref() InterlockedIncrement( &AfdHandleStats.AddrDeref )
  835. #define AfdRecordConnOpened() InterlockedIncrement( &AfdHandleStats.ConnOpened )
  836. #define AfdRecordConnClosed() InterlockedIncrement( &AfdHandleStats.ConnClosed )
  837. #define AfdRecordConnRef() InterlockedIncrement( &AfdHandleStats.ConnRef )
  838. #define AfdRecordConnDeref() InterlockedIncrement( &AfdHandleStats.ConnDeref )
  839. #define AfdRecordFileRef() InterlockedIncrement( &AfdHandleStats.FileRef )
  840. #define AfdRecordFileDeref() InterlockedIncrement( &AfdHandleStats.FileDeref )
  841. #define AfdRecordAfdWorkItemsQueued() InterlockedIncrement( &AfdQueueStats.AfdWorkItemsQueued )
  842. #define AfdRecordExWorkItemsQueued() InterlockedIncrement( &AfdQueueStats.ExWorkItemsQueued )
  843. #define AfdRecordWorkerEnter() InterlockedIncrement( &AfdQueueStats.WorkerEnter )
  844. #define AfdRecordWorkerLeave() InterlockedIncrement( &AfdQueueStats.WorkerLeave )
  845. #define AfdRecordAfdWorkItemsProcessed() InterlockedIncrement( &AfdQueueStats.AfdWorkItemsProcessed )
  846. #define AfdRecordAfdWorkerThread(t) \
  847. if( 1 ) { \
  848. ASSERT( AfdQueueStats.AfdWorkerThread == NULL || \
  849. (t) == NULL ); \
  850. AfdQueueStats.AfdWorkerThread = (t); \
  851. } else
  852. #define AfdRecordConnectedReferencesAdded() InterlockedIncrement( &AfdConnectionStats.ConnectedReferencesAdded )
  853. #define AfdRecordConnectedReferencesDeleted() InterlockedIncrement( &AfdConnectionStats.ConnectedReferencesDeleted )
  854. #define AfdRecordGracefulDisconnectsInitiated() InterlockedIncrement( &AfdConnectionStats.GracefulDisconnectsInitiated )
  855. #define AfdRecordGracefulDisconnectsCompleted() InterlockedIncrement( &AfdConnectionStats.GracefulDisconnectsCompleted )
  856. #define AfdRecordGracefulDisconnectIndications() InterlockedIncrement( &AfdConnectionStats.GracefulDisconnectIndications )
  857. #define AfdRecordAbortiveDisconnectsInitiated() InterlockedIncrement( &AfdConnectionStats.AbortiveDisconnectsInitiated )
  858. #define AfdRecordAbortiveDisconnectsCompleted() InterlockedIncrement( &AfdConnectionStats.AbortiveDisconnectsCompleted )
  859. #define AfdRecordAbortiveDisconnectIndications() InterlockedIncrement( &AfdConnectionStats.AbortiveDisconnectIndications )
  860. #else // !AFD_KEEP_STATS
  861. #define AfdRecordPoolQuotaCharged(b)
  862. #define AfdRecordPoolQuotaReturned(b)
  863. #define AfdRecordAddrOpened()
  864. #define AfdRecordAddrClosed()
  865. #define AfdRecordAddrRef()
  866. #define AfdRecordAddrDeref()
  867. #define AfdRecordConnOpened()
  868. #define AfdRecordConnClosed()
  869. #define AfdRecordConnRef()
  870. #define AfdRecordConnDeref()
  871. #define AfdRecordFileRef()
  872. #define AfdRecordFileDeref()
  873. #define AfdRecordAfdWorkItemsQueued()
  874. #define AfdRecordExWorkItemsQueued()
  875. #define AfdRecordWorkerEnter()
  876. #define AfdRecordWorkerLeave()
  877. #define AfdRecordAfdWorkItemsProcessed()
  878. #define AfdRecordAfdWorkerThread(t)
  879. #define AfdRecordConnectedReferencesAdded()
  880. #define AfdRecordConnectedReferencesDeleted()
  881. #define AfdRecordGracefulDisconnectsInitiated()
  882. #define AfdRecordGracefulDisconnectsCompleted()
  883. #define AfdRecordGracefulDisconnectIndications()
  884. #define AfdRecordAbortiveDisconnectsInitiated()
  885. #define AfdRecordAbortiveDisconnectsCompleted()
  886. #define AfdRecordAbortiveDisconnectIndications()
  887. #endif // if AFD_KEEP_STATS
  888. #endif // ndef _AFDPROCS_