/*++ Copyright (c) 1998-2001 Microsoft Corporation Module Name: ultdi.h Abstract: This module defines the interface to the TDI/MUX/SSL component. Author: Keith Moore (keithmo) 12-Jun-1998 Revision History: --*/ #ifndef _ULTDI_H_ #define _ULTDI_H_ #ifdef __cplusplus extern "C" { #endif // // Opaque structure pointers. These are defined (privately) in ULTDIP.H. // typedef struct _UL_ENDPOINT *PUL_ENDPOINT; typedef struct _UL_CONNECTION *PUL_CONNECTION; // // Routine invoked after an incoming TCP/MUX connection has been // received (but not yet accepted). // // Arguments: // // pListeningContext - Supplies an uninterpreted context value // as passed to the UlCreateListeningEndpoint() API. // // pConnection - Supplies the connection being established. // // pRemoteAddress - Supplies the remote (client-side) address // requesting the connection. // // RemoteAddressLength - Supplies the total byte length of the // pRemoteAddress structure. // // ppConnectionContext - Receives a pointer to an uninterpreted // context value to be associated with the new connection if // accepted. If the new connection is not accepted, this // parameter is ignored. // // Return Value: // // BOOLEAN - TRUE if the connection was accepted, FALSE if not. // typedef BOOLEAN (*PUL_CONNECTION_REQUEST)( IN PVOID pListeningContext, IN PUL_CONNECTION pConnection, IN PTRANSPORT_ADDRESS pRemoteAddress, IN ULONG RemoteAddressLength, OUT PVOID *ppConnectionContext ); // // Routine invoked after an incoming TCP/MUX connection has been fully // accepted. // // This routine is also invoked if an incoming connection was not accepted // *after* PUL_CONNECTION_REQUEST returned TRUE. In other words, if // PUL_CONNECTION_REQUEST indicated that the connection should be accepted // but a fatal error occurred later, then PUL_CONNECTION_COMPLETE is // invoked. // // Arguments: // // pListeningContext - Supplies an uninterpreted context value // as passed to the UlCreateListeningEndpoint() API. // // pConnectionContext - Supplies the uninterpreted context value // as returned by PUL_CONNECTION_REQUEST. // // Status - Supplie the completion status. If this value is // STATUS_SUCCESS, then the connection is now fully accepted. // Otherwise, the connection has been aborted. // typedef VOID (*PUL_CONNECTION_COMPLETE)( IN PVOID pListeningContext, IN PVOID pConnectionContext, IN NTSTATUS Status ); // // Routine invoked after an established TCP/MUX connection has been // disconnected by the remote (client) side. // // Arguments: // // pListeningContext - Supplies an uninterpreted context value // as passed to the UlCreateListeningEndpoint() API. // // pConnectionContext - Supplies an uninterpreted context value // as returned from the PUL_CONNECTION_REQUEST callback. // // Status - Supplies the termination status. // // CODEWORK: // // This indication is not currently invoked when the local // machine initiates an abortive disconnect. Faking an indication // during a local abort would probably be a Good Thing. // typedef VOID (*PUL_CONNECTION_DISCONNECT)( IN PVOID pListeningContext, IN PVOID pConnectionContext, IN NTSTATUS Status ); // // Routine invoked when a graceful disconnect requested by the client // is complete. The client may want to drain the indicated data on the // tdi connection to get the above indication. // typedef VOID (*PUL_CONNECTION_DISCONNECT_COMPLETE)( IN PVOID pListeningContext, IN PVOID pConnectionContext ); // // Routine invoked just before the internal state for a connection // is destroyed. This is the last chance to cleanup before the // connection fully disappears. // // Arguments: // // pListeningContext - Supplies an uninterpreted context value // as passed to the UlCreateListeningEndpoint() API. // // pConnectionContext - Supplies an uninterpreted context value // as returned from the PUL_CONNECTION_REQUEST callback. // typedef VOID (*PUL_CONNECTION_DESTROYED)( IN PVOID pListeningContext, IN PVOID pConnectionContext ); // // Routine invoked after data has been received on an established // TCP/MUX connection. // // Arguments: // // pListeningContext - Supplies an uninterpreted context value // as passed to the UlCreateListeningEndpoint() API. // // pConnectionContext - Supplies an uninterpreted context value // as returned from the PUL_CONNECTION_REQUEST callback. // // pBuffer - Supplies a pointer to the received data. // // IndicatedLength - Supplies the length of the received data // available in pBuffer. // // pTakenLength - Receives the number of bytes consumed by // the receive handler. // // Return Value: // // NTSTATUS - The status of the consumed data. The behavior of // the TDI/MUX component is dependent on the return value // and the value set in *pTakenLength, and is defined as // follows: // // STATUS_SUCCESS, *pTakenLength == IndicatedLength - // All indicated data was consumed by the receive // handler. Additional incoming data will cause // subsequent receive indications. // // STATUS_SUCCESS, *pTakenLength < IndicatedLength - // Part of the indicated data was consumed by the // receive handler. The network transport will // buffer data and no further indications will be // made until UlReceiveData() is called. // // STATUS_MORE_PROCESSING_REQUIRED - Part of the // indicated data was consumed by the receive handler. // A subsequent receive indication will be made // when additional data is available. The subsequent // indication will include the unconsumed data from // the current indication plus any additional data // received. // // Any other status - Indicates a fatal error in the // receive handler. The connection will be aborted. // // *pTakenLength > IndicatedLength - This is an error // condition and should never occur. // // // Public (within UL.SYS) entrypoints. // NTSTATUS UlInitializeTdi( VOID ); VOID UlTerminateTdi( VOID ); VOID UlWaitForEndpointDrain( VOID ); ULONG UlpComputeHttpRawConnectionLength( IN PVOID pConnectionContext ); ULONG UlpGenerateHttpRawConnectionInfo( IN PVOID pContext, IN PUCHAR pKernelBuffer, IN PVOID pUserBuffer, IN ULONG OutputBufferLength, IN PUCHAR pBuffer, IN ULONG InitialLength ); NTSTATUS UlCreateListeningEndpoint( IN PTRANSPORT_ADDRESS pLocalAddress, IN ULONG LocalAddressLength, IN BOOLEAN Secure, IN ULONG InitialBacklog, IN PUL_CONNECTION_REQUEST pConnectionRequestHandler, IN PUL_CONNECTION_COMPLETE pConnectionCompleteHandler, IN PUL_CONNECTION_DISCONNECT pConnectionDisconnectHandler, IN PUL_CONNECTION_DISCONNECT_COMPLETE pConnectionDisconnectCompleteHandler, IN PUL_CONNECTION_DESTROYED pConnectionDestroyedHandler, IN PUL_DATA_RECEIVE pDataReceiveHandler, IN PVOID pListeningContext, OUT PUL_ENDPOINT *ppListeningEndpoint ); NTSTATUS UlCloseListeningEndpoint( IN PUL_ENDPOINT pListeningEndpoint, IN PUL_COMPLETION_ROUTINE pCompletionRoutine, IN PVOID pCompletionContext ); NTSTATUS UlCloseConnection( IN PVOID pObject, IN BOOLEAN AbortiveDisconnect, IN PUL_COMPLETION_ROUTINE pCompletionRoutine, IN PVOID pCompletionContext ); NTSTATUS UlSendData( IN PUL_CONNECTION pConnection, IN PMDL pMdlChain, IN ULONG Length, IN PUL_COMPLETION_ROUTINE pCompletionRoutine, IN PVOID pCompletionContext, IN PIRP pOwnIrp, IN PUL_IRP_CONTEXT pOwnIrpContext, IN BOOLEAN InitiateDisconnect ); NTSTATUS UlReceiveData( IN PVOID pConnectionContext, IN PVOID pBuffer, IN ULONG BufferLength, IN PUL_COMPLETION_ROUTINE pCompletionRoutine, IN PVOID pCompletionContext ); NTSTATUS UlAddSiteToEndpointList( IN PWSTR pSiteUrl ); NTSTATUS UlRemoveSiteFromEndpointList( IN PWSTR pSiteUrl ); VOID UlReferenceConnection( IN PVOID pObject REFERENCE_DEBUG_FORMAL_PARAMS ); VOID UlDereferenceConnection( IN PVOID pObject REFERENCE_DEBUG_FORMAL_PARAMS ); #define REFERENCE_CONNECTION( pconn ) \ UlReferenceConnection( \ (pconn) \ REFERENCE_DEBUG_ACTUAL_PARAMS \ ) #define DEREFERENCE_CONNECTION( pconn ) \ UlDereferenceConnection( \ (pconn) \ REFERENCE_DEBUG_ACTUAL_PARAMS \ ) // // Prototype for TCP Send routine if Fast Send is possible. // typedef NTSTATUS (*PUL_TCPSEND_DISPATCH) ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp ); #ifdef __cplusplus }; // extern "C" #endif #endif // _ULTDI_H_