/*++
Copyright (c) 1989-1993 Microsoft Corporation
Module Name:
stprocs.h
Abstract:
This header file defines private functions for the NT Sample transport
provider.
Author:
David Beaver (dbeaver) 1-July-1991
Revision History:
--*/
#ifndef _STPROCS_
#define _STPROCS_
//
// MACROS.
//
//
// Debugging aids
//
//
// VOID
// IF_STDBG(
// IN PSZ Message
// );
//
#if DBG
#define IF_STDBG(flags) \
if (StDebug & (flags))
#else
#define IF_STDBG(flags) \
if (0)
#endif
//
// VOID
// PANIC(
// IN PSZ Message
// );
//
#if DBG
#define PANIC(Msg) \
DbgPrint ((Msg))
#else
#define PANIC(Msg)
#endif
//
// These are define to allow DbgPrints that disappear when
// DBG is 0.
//
#if DBG
#define StPrint0(fmt) DbgPrint(fmt)
#define StPrint1(fmt,v0) DbgPrint(fmt,v0)
#define StPrint2(fmt,v0,v1) DbgPrint(fmt,v0,v1)
#define StPrint3(fmt,v0,v1,v2) DbgPrint(fmt,v0,v1,v2)
#define StPrint4(fmt,v0,v1,v2,v3) DbgPrint(fmt,v0,v1,v2,v3)
#define StPrint5(fmt,v0,v1,v2,v3,v4) DbgPrint(fmt,v0,v1,v2,v3,v4)
#define StPrint6(fmt,v0,v1,v2,v3,v4,v5) DbgPrint(fmt,v0,v1,v2,v3,v4,v5)
#else
#define StPrint0(fmt)
#define StPrint1(fmt,v0)
#define StPrint2(fmt,v0,v1)
#define StPrint3(fmt,v0,v1,v2)
#define StPrint4(fmt,v0,v1,v2,v3)
#define StPrint5(fmt,v0,v1,v2,v3,v4)
#define StPrint6(fmt,v0,v1,v2,v3,v4,v5)
#endif
//
// The REFCOUNTS message take up a lot of room, so make
// removing them easy.
//
#if 1
#define IF_REFDBG IF_STDBG (ST_DEBUG_REFCOUNTS)
#else
#define IF_REFDBG if (0)
#endif
#define StReferenceConnection(Reason, Connection)\
StRefConnection (Connection)
#define StDereferenceConnection(Reason, Connection)\
StDerefConnection (Connection)
#define StDereferenceConnectionSpecial(Reason, Connection)\
StDerefConnectionSpecial (Connection)
#define StReferenceRequest(Reason, Request)\
(VOID)InterlockedIncrement( \
&(Request)->ReferenceCount)
#define StDereferenceRequest(Reason, Request)\
StDerefRequest (Request)
#define StReferenceSendIrp(Reason, IrpSp)\
(VOID)InterlockedIncrement( \
&IRP_REFCOUNT(IrpSp))
#define StDereferenceSendIrp(Reason, IrpSp)\
StDerefSendIrp (IrpSp)
#define StReferenceAddress(Reason, Address)\
(VOID)InterlockedIncrement( \
&(Address)->ReferenceCount)
#define StDereferenceAddress(Reason, Address)\
StDerefAddress (Address)
#define StReferenceDeviceContext(Reason, DeviceContext)\
StRefDeviceContext (DeviceContext)
#define StDereferenceDeviceContext(Reason, DeviceContext)\
StDerefDeviceContext (DeviceContext)
#define StReferencePacket(Packet) \
(VOID)InterlockedIncrement( \
&(Packet)->ReferenceCount)
//
// These macros are used to create and destroy packets, due
// to the allocation or deallocation of structure which
// need them.
//
#define StAddSendPacket(DeviceContext) { \
PTP_PACKET _SendPacket; \
StAllocateSendPacket ((DeviceContext), &_SendPacket); \
if (_SendPacket != NULL) { \
ExInterlockedPushEntryList( \
&(DeviceContext)->PacketPool, \
(PSINGLE_LIST_ENTRY)&_SendPacket->Linkage, \
&(DeviceContext)->Interlock); \
} \
}
#define StRemoveSendPacket(DeviceContext) { \
PSINGLE_LIST_ENTRY s; \
if (DeviceContext->PacketAllocated > DeviceContext->PacketInitAllocated) { \
s = ExInterlockedPopEntryList( \
&(DeviceContext)->PacketPool, \
&(DeviceContext)->Interlock); \
if (s != NULL) { \
StDeallocateSendPacket((DeviceContext), \
(PTP_PACKET)CONTAINING_RECORD(s, TP_PACKET, Linkage)); \
} \
} \
}
#define StAddReceivePacket(DeviceContext) { \
PNDIS_PACKET _ReceivePacket; \
StAllocateReceivePacket ((DeviceContext), &_ReceivePacket); \
if (_ReceivePacket != NULL) { \
ExInterlockedPushEntryList( \
&(DeviceContext)->ReceivePacketPool, \
(PSINGLE_LIST_ENTRY)&((PRECEIVE_PACKET_TAG)_ReceivePacket->ProtocolReserved)->Linkage, \
&(DeviceContext)->Interlock); \
} \
}
#define StRemoveReceivePacket(DeviceContext) { \
PSINGLE_LIST_ENTRY s; \
if (DeviceContext->ReceivePacketAllocated > DeviceContext->ReceivePacketInitAllocated) { \
s = ExInterlockedPopEntryList( \
&(DeviceContext)->ReceivePacketPool, \
&(DeviceContext)->Interlock); \
if (s != NULL) { \
StDeallocateReceivePacket((DeviceContext), \
(PNDIS_PACKET)CONTAINING_RECORD(s, NDIS_PACKET, ProtocolReserved[0])); \
} \
} \
}
#define StAddReceiveBuffer(DeviceContext) { \
PBUFFER_TAG _ReceiveBuffer; \
StAllocateReceiveBuffer ((DeviceContext), &_ReceiveBuffer); \
if (_ReceiveBuffer != NULL) { \
ExInterlockedPushEntryList( \
&(DeviceContext)->ReceiveBufferPool, \
&_ReceiveBuffer->Linkage, \
&(DeviceContext)->Interlock); \
} \
}
#define StRemoveReceiveBuffer(DeviceContext) { \
PSINGLE_LIST_ENTRY s; \
if (DeviceContext->ReceiveBufferAllocated > DeviceContext->ReceiveBufferInitAllocated) { \
s = ExInterlockedPopEntryList( \
&(DeviceContext)->ReceiveBufferPool, \
&(DeviceContext)->Interlock); \
if (s != NULL) { \
StDeallocateReceiveBuffer(DeviceContext, \
(PBUFFER_TAG)CONTAINING_RECORD(s, BUFFER_TAG, Linkage)); \
} \
} \
}
//
// These routines are used to maintain counters.
//
#define INCREMENT_COUNTER(_DeviceContext,_Field) \
++(_DeviceContext)->_Field
#define DECREMENT_COUNTER(_DeviceContext,_Field) \
--(_DeviceContext)->_Field
#define ADD_TO_LARGE_INTEGER(_LargeInteger,_Ulong) \
ExInterlockedAddLargeStatistic((_LargeInteger), (ULONG)(_Ulong))
//
// Routines in PACKET.C (TP_PACKET object manager).
//
VOID
StAllocateSendPacket(
IN PDEVICE_CONTEXT DeviceContext,
OUT PTP_PACKET *TransportSendPacket
);
VOID
StAllocateReceivePacket(
IN PDEVICE_CONTEXT DeviceContext,
OUT PNDIS_PACKET *TransportReceivePacket
);
VOID
StAllocateReceiveBuffer(
IN PDEVICE_CONTEXT DeviceContext,
OUT PBUFFER_TAG *TransportReceiveBuffer
);
VOID
StDeallocateSendPacket(
IN PDEVICE_CONTEXT DeviceContext,
IN PTP_PACKET TransportSendPacket
);
VOID
StDeallocateReceivePacket(
IN PDEVICE_CONTEXT DeviceContext,
IN PNDIS_PACKET TransportReceivePacket
);
VOID
StDeallocateReceiveBuffer(
IN PDEVICE_CONTEXT DeviceContext,
IN PBUFFER_TAG TransportReceiveBuffer
);
NTSTATUS
StCreatePacket(
IN PDEVICE_CONTEXT DeviceContext,
OUT PTP_PACKET *Packet
);
VOID
StDestroyPacket(
IN PTP_PACKET Packet
);
VOID
StWaitPacket(
IN PTP_CONNECTION Connection,
IN ULONG Flags
);
//
// Routines in RCVENG.C (Receive engine).
//
VOID
AwakenReceive(
IN PTP_CONNECTION Connection
);
VOID
ActivateReceive(
IN PTP_CONNECTION Connection
);
VOID
CompleteReceive (
IN PTP_CONNECTION Connection,
IN BOOLEAN EndOfRecord,
KIRQL ConnectionIrql,
KIRQL CancelIrql
);
VOID
StCancelReceive(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
//
// Routines in SENDENG.C (Send engine).
//
VOID
InitializeSend(
PTP_CONNECTION Connection
);
VOID
StartPacketizingConnection(
PTP_CONNECTION Connection,
IN BOOLEAN Immediate,
IN KIRQL ConnectionIrql,
IN KIRQL CancelIrql
);
VOID
PacketizeConnections(
IN PDEVICE_CONTEXT DeviceContext
);
VOID
PacketizeSend(
IN PTP_CONNECTION Connection
);
VOID
CompleteSend(
IN PTP_CONNECTION Connection
);
VOID
FailSend(
IN PTP_CONNECTION Connection,
IN NTSTATUS RequestStatus,
IN BOOLEAN StopConnection
);
VOID
StCancelSend(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
VOID
StNdisSend(
IN PTP_PACKET Packet
);
VOID
StSendCompletionHandler(
IN NDIS_HANDLE ProtocolBindingContext,
IN PNDIS_PACKET NdisPacket,
IN NDIS_STATUS NdisStatus
);
NTSTATUS
BuildBufferChainFromMdlChain (
IN NDIS_HANDLE BufferPoolHandle,
IN PMDL CurrentMdl,
IN ULONG ByteOffset,
IN ULONG DesiredLength,
OUT PNDIS_BUFFER *Destination,
OUT PMDL *NewCurrentMdl,
OUT ULONG *NewByteOffset,
OUT ULONG *TrueLength
);
//
// Routines in DEVCTX.C (TP_DEVCTX object manager).
//
VOID
StRefDeviceContext(
IN PDEVICE_CONTEXT DeviceContext
);
VOID
StDerefDeviceContext(
IN PDEVICE_CONTEXT DeviceContext
);
NTSTATUS
StCreateDeviceContext(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING DeviceName,
IN OUT PDEVICE_CONTEXT *DeviceContext
);
VOID
StDestroyDeviceContext(
IN PDEVICE_CONTEXT DeviceContext
);
//
// Routines in ADDRESS.C (TP_ADDRESS object manager).
//
VOID
StRefAddress(
IN PTP_ADDRESS Address
);
VOID
StDerefAddress(
IN PTP_ADDRESS Address
);
VOID
StAllocateAddressFile(
IN PDEVICE_CONTEXT DeviceContext,
OUT PTP_ADDRESS_FILE *TransportAddressFile
);
VOID
StDeallocateAddressFile(
IN PDEVICE_CONTEXT DeviceContext,
IN PTP_ADDRESS_FILE TransportAddressFile
);
NTSTATUS
StCreateAddressFile(
IN PDEVICE_CONTEXT DeviceContext,
OUT PTP_ADDRESS_FILE * AddressFile
);
VOID
StReferenceAddressFile(
IN PTP_ADDRESS_FILE AddressFile
);
VOID
StDereferenceAddressFile(
IN PTP_ADDRESS_FILE AddressFile
);
VOID
StStopAddress(
IN PTP_ADDRESS Address
);
VOID
StRegisterAddress(
IN PTP_ADDRESS Address
);
BOOLEAN
StMatchNetbiosAddress(
IN PTP_ADDRESS Address,
IN PUCHAR NetBIOSName
);
VOID
StAllocateAddress(
IN PDEVICE_CONTEXT DeviceContext,
OUT PTP_ADDRESS *TransportAddress
);
VOID
StDeallocateAddress(
IN PDEVICE_CONTEXT DeviceContext,
IN PTP_ADDRESS TransportAddress
);
NTSTATUS
StCreateAddress(
IN PDEVICE_CONTEXT DeviceContext,
IN PST_NETBIOS_ADDRESS NetworkName,
OUT PTP_ADDRESS *Address
);
PTP_ADDRESS
StLookupAddress(
IN PDEVICE_CONTEXT DeviceContext,
IN PST_NETBIOS_ADDRESS NetworkName
);
PTP_CONNECTION
StLookupRemoteName(
IN PTP_ADDRESS Address,
IN PUCHAR RemoteName
);
NTSTATUS
StStopAddressFile(
IN PTP_ADDRESS_FILE AddressFile,
IN PTP_ADDRESS Address
);
NTSTATUS
StVerifyAddressObject (
IN PTP_ADDRESS_FILE AddressFile
);
NTSTATUS
StSendDatagramsOnAddress(
PTP_ADDRESS Address
);
//
//
// Routines in CONNOBJ.C (TP_CONNECTION object manager).
//
VOID
StRefConnection(
IN PTP_CONNECTION TransportConnection
);
VOID
StDerefConnection(
IN PTP_CONNECTION TransportConnection
);
VOID
StDerefConnectionSpecial(
IN PTP_CONNECTION TransportConnection
);
VOID
StStopConnection(
IN PTP_CONNECTION TransportConnection,
IN NTSTATUS Status
);
VOID
StCancelConnection(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
PTP_CONNECTION
StLookupListeningConnection(
IN PTP_ADDRESS Address
);
VOID
StAllocateConnection(
IN PDEVICE_CONTEXT DeviceContext,
OUT PTP_CONNECTION *TransportConnection
);
VOID
StDeallocateConnection(
IN PDEVICE_CONTEXT DeviceContext,
IN PTP_CONNECTION TransportConnection
);
NTSTATUS
StCreateConnection(
IN PDEVICE_CONTEXT DeviceContext,
OUT PTP_CONNECTION *TransportConnection
);
PTP_CONNECTION
StLookupConnectionByContext(
IN PTP_ADDRESS Address,
IN CONNECTION_CONTEXT ConnectionContext
);
PTP_CONNECTION
StFindConnection(
IN PDEVICE_CONTEXT DeviceContext,
IN PUCHAR LocalName,
IN PUCHAR RemoteName
);
NTSTATUS
StVerifyConnectionObject (
IN PTP_CONNECTION Connection
);
//
// Routines in REQUEST.C (TP_REQUEST object manager).
//
VOID
TdiRequestTimeoutHandler(
IN PKDPC Dpc,
IN PVOID DeferredContext,
IN PVOID SystemArgument1,
IN PVOID SystemArgument2
);
VOID
StRefRequest(
IN PTP_REQUEST Request
);
VOID
StDerefRequest(
IN PTP_REQUEST Request
);
VOID
StCompleteRequest(
IN PTP_REQUEST Request,
IN NTSTATUS Status,
IN ULONG Information
);
VOID
StRefSendIrp(
IN PIO_STACK_LOCATION IrpSp
);
VOID
StDerefSendIrp(
IN PIO_STACK_LOCATION IrpSp
);
VOID
StCompleteSendIrp(
IN PIRP Irp,
IN NTSTATUS Status,
IN ULONG Information
);
VOID
StAllocateRequest(
IN PDEVICE_CONTEXT DeviceContext,
OUT PTP_REQUEST *TransportRequest
);
VOID
StDeallocateRequest(
IN PDEVICE_CONTEXT DeviceContext,
IN PTP_REQUEST TransportRequest
);
NTSTATUS
StCreateRequest(
IN PIRP Irp,
IN PVOID Context,
IN ULONG Flags,
IN PMDL Buffer2,
IN ULONG Buffer2Length,
IN LARGE_INTEGER Timeout,
OUT PTP_REQUEST * TpRequest
);
//
// Routines in DLC.C (entrypoints from NDIS interface).
//
NDIS_STATUS
StReceiveIndication(
IN NDIS_HANDLE BindingContext,
IN NDIS_HANDLE ReceiveContext,
IN PVOID HeaderBuffer,
IN UINT HeaderBufferSize,
IN PVOID LookaheadBuffer,
IN UINT LookaheadBufferSize,
IN UINT PacketSize
);
NDIS_STATUS
StGeneralReceiveHandler (
IN PDEVICE_CONTEXT DeviceContext,
IN NDIS_HANDLE ReceiveContext,
IN PHARDWARE_ADDRESS SourceAddress,
IN PVOID HeaderBuffer,
IN UINT PacketSize,
IN PST_HEADER StHeader,
IN UINT StSize
);
VOID
StReceiveComplete (
IN NDIS_HANDLE BindingContext
);
VOID
StTransferDataComplete(
IN NDIS_HANDLE BindingContext,
IN PNDIS_PACKET NdisPacket,
IN NDIS_STATUS Status,
IN UINT BytesTransferred
);
//
// Routines in UFRAMES.C, the UI-frame ST frame processor.
//
NTSTATUS
StIndicateDatagram(
IN PDEVICE_CONTEXT DeviceContext,
IN PTP_ADDRESS Address,
IN PUCHAR Header,
IN ULONG Length
);
NTSTATUS
StProcessConnectionless(
IN PDEVICE_CONTEXT DeviceContext,
IN PHARDWARE_ADDRESS SourceAddress,
IN PST_HEADER StHeader,
IN ULONG StLength,
IN PUCHAR SourceRouting,
IN UINT SourceRoutingLength,
OUT PTP_ADDRESS * DatagramAddress
);
//
// Routines in IFRAMES.C, the I-frame ST frame processor.
//
NTSTATUS
StProcessIIndicate(
IN PTP_CONNECTION Connection,
IN PST_HEADER StHeader,
IN UINT StIndicatedLength,
IN UINT StTotalLength,
IN NDIS_HANDLE ReceiveContext,
IN BOOLEAN Last
);
//
// Routines in RCV.C (data copying routines for receives).
//
NTSTATUS
StCopyMdlToBuffer(
IN PMDL SourceMdlChain,
IN ULONG SourceOffset,
IN PVOID DestinationBuffer,
IN ULONG DestinationOffset,
IN ULONG DestinationBufferSize,
IN PULONG BytesCopied
);
//
// Routines in FRAMESND.C, the UI-frame (non-link) shipper.
//
NTSTATUS
StSendConnect(
IN PTP_CONNECTION Connection
);
NTSTATUS
StSendDisconnect(
IN PTP_CONNECTION Connection
);
NTSTATUS
StSendAddressFrame(
IN PTP_ADDRESS Address
);
VOID
StSendDatagramCompletion(
IN PTP_ADDRESS Address,
IN PNDIS_PACKET NdisPacket,
IN NDIS_STATUS NdisStatus
);
//
// Routines in stdrvr.c
//
NTSTATUS
StDispatchOpenClose(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
StDispatchInternal(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
StDispatch(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
//
// Routine in stndis.c
//
VOID
StOpenAdapterComplete(
IN NDIS_HANDLE NdisBindingContext,
IN NDIS_STATUS Status,
IN NDIS_STATUS OpenErrorStatus
);
VOID
StCloseAdapterComplete(
IN NDIS_HANDLE NdisBindingContext,
IN NDIS_STATUS Status
);
VOID
StResetComplete(
IN NDIS_HANDLE NdisBindingContext,
IN NDIS_STATUS Status
);
VOID
StRequestComplete(
IN NDIS_HANDLE NdisBindingContext,
IN PNDIS_REQUEST NdisRequest,
IN NDIS_STATUS Status
);
VOID
StStatusIndication (
IN NDIS_HANDLE NdisBindingContext,
IN NDIS_STATUS NdisStatus,
IN PVOID StatusBuffer,
IN UINT StatusBufferLength
);
VOID
StStatusComplete (
IN NDIS_HANDLE NdisBindingContext
);
#if DBG
PUCHAR
StGetNdisStatus (
IN NDIS_STATUS NdisStatus
);
#endif
VOID
StWriteResourceErrorLog(
IN PDEVICE_CONTEXT DeviceContext,
IN ULONG BytesNeeded,
IN ULONG UniqueErrorValue
);
VOID
StWriteGeneralErrorLog(
IN PDEVICE_CONTEXT DeviceContext,
IN NTSTATUS ErrorCode,
IN ULONG UniqueErrorValue,
IN NTSTATUS FinalStatus,
IN PWSTR SecondString,
IN ULONG DumpDataCount,
IN ULONG DumpData[]
);
VOID
StWriteOidErrorLog(
IN PDEVICE_CONTEXT DeviceContext,
IN NTSTATUS ErrorCode,
IN NTSTATUS FinalStatus,
IN PWSTR AdapterString,
IN ULONG OidValue
);
VOID
StFreeResources(
IN PDEVICE_CONTEXT DeviceContext
);
//
// routines in stcnfg.c
//
NTSTATUS
StConfigureProvider(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PIO_STACK_LOCATION IrpSp
);
//
// Routines in stndis.c
//
NTSTATUS
StRegisterProtocol (
IN STRING *NameString
);
VOID
StDeregisterProtocol (
VOID
);
NTSTATUS
StInitializeNdis (
IN PDEVICE_CONTEXT DeviceContext,
IN PCONFIG_DATA ConfigInfo,
IN UINT ConfigInfoNameIndex
);
VOID
StCloseNdis (
IN PDEVICE_CONTEXT DeviceContext
);
#endif // def _STPROCS_