windows-nt/Source/XPSP1/NT/net/tdi/sample/sys/sysprocs.h
2020-09-26 16:20:57 +08:00

573 lines
9.9 KiB
C

///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2001 Microsoft Corporation
//
// Module Name:
// sysprocs.hpp
//
// Abstract:
// Function prototypes for tdi sample driver.
//
//////////////////////////////////////////////////////////////////////////
//
// public functions in buffer.cpp
//
NTSTATUS
TSPostReceiveBuffer(
PGENERIC_HEADER pGenericHeader,
PSEND_BUFFER pSendBuffer
);
NTSTATUS
TSFetchReceiveBuffer(
PGENERIC_HEADER pGenericHeader,
PRECEIVE_BUFFER pReceiveBuffer
);
//
// public functions in connect.cpp
//
NTSTATUS
TSConnect(
PENDPOINT_OBJECT pEndpointObject,
PSEND_BUFFER pSendBuffer,
PIRP pIrp
);
NTSTATUS
TSDisconnect(
PENDPOINT_OBJECT pEndpointObject,
PSEND_BUFFER pSendBuffer,
PIRP pIrp
);
NTSTATUS
TSListen(
PENDPOINT_OBJECT pEndpointObject
);
NTSTATUS
TSIsConnected(
PENDPOINT_OBJECT pEndpointObject,
PRECEIVE_BUFFER pReceiveBuffer
);
TDI_STATUS
TSConnectHandler(
PVOID TdiEventContext,
LONG RemoteAddressLength,
PVOID RemoteAddress,
LONG UserDataLength,
PVOID UserData,
LONG OptionsLength,
PVOID Options,
CONNECTION_CONTEXT *ConnectionContext,
PIRP *AcceptIrp
);
TDI_STATUS
TSDisconnectHandler(
PVOID TdiEventContext,
CONNECTION_CONTEXT ConnectionContext,
LONG DisconnectDataLength,
PVOID DisconnectData,
LONG DisconnectInformationLength,
PVOID DisconnectInformation,
ULONG DisconnectFlags
);
//
// public functions in events.cpp
//
NTSTATUS
TSSetEventHandler(
PGENERIC_HEADER pGenericHeader,
PSEND_BUFFER pSendBuffer,
PIRP pIrp
);
//
// public functions in open.cpp
//
NTSTATUS
TSOpenControl(
PSEND_BUFFER pSendBuffer,
PRECEIVE_BUFFER pReceiveBuffer
);
VOID
TSCloseControl(
PCONTROL_CHANNEL pControlChannel
);
NTSTATUS
TSOpenAddress(
PSEND_BUFFER pSendBuffer,
PRECEIVE_BUFFER pReceiveBuffer
);
VOID
TSCloseAddress(
PADDRESS_OBJECT pAddressObject
);
NTSTATUS
TSOpenEndpoint(
PSEND_BUFFER pSendBuffer,
PRECEIVE_BUFFER pReceiveBuffer
);
VOID
TSCloseEndpoint(
PENDPOINT_OBJECT pEndpoint
);
//
// public functions from recvcom.cpp
//
VOID
TSPacketReceived(
PADDRESS_OBJECT pAddressObject,
PRECEIVE_DATA pReceiveData,
BOOLEAN fIsExpedited
);
VOID
TSFreePacketData(
PADDRESS_OBJECT pAddressObject
);
//
// locks down user buffer, maps to kernel space
//
PMDL
TSMakeMdlForUserBuffer(
PUCHAR pucDataBuffer,
ULONG ulDataLength,
LOCK_OPERATION AccessType
);
//
// unmaps and unlocks user buffer
//
inline
VOID
TSFreeUserBuffer(PMDL pMdl)
{
MmUnlockPages(pMdl);
IoFreeMdl(pMdl);
}
//
// public functions in rcvdgram.cpp
//
NTSTATUS
TSReceiveDatagram(
PADDRESS_OBJECT pAddressObject,
PSEND_BUFFER pSendBuffer,
PRECEIVE_BUFFER pReceiveBuffer
);
TDI_STATUS
TSRcvDatagramHandler(
PVOID pvTdiEventContext,
LONG lSourceAddressLength,
PVOID pvSourceAddress,
LONG lOptionsLength,
PVOID pvOptions,
ULONG ulReceiveDatagramFlags,
ULONG ulBytesIndicated,
ULONG ulBytesAvailable,
ULONG *pulBytesTaken,
PVOID pvTsdu,
PIRP *pIoRequestPacket
);
TDI_STATUS
TSChainedRcvDatagramHandler(
PVOID TdiEventContext,
LONG SourceAddressLength,
PVOID SourceAddress,
LONG OptionsLength,
PVOID Options,
ULONG ReceiveDatagramFlags,
ULONG ReceiveDatagramLength,
ULONG StartingOffset,
PMDL Tsdu,
PVOID TsduDescriptor
);
//
// public functions in receive.cpp
//
NTSTATUS
TSReceive(
PENDPOINT_OBJECT pEndpointObject,
PSEND_BUFFER pSendBuffer,
PRECEIVE_BUFFER pReceiveBuffer
);
TDI_STATUS
TSReceiveHandler(
PVOID TdiEventContext,
CONNECTION_CONTEXT ConnectionContext,
ULONG ReceiveFlags,
ULONG BytesIndicated,
ULONG BytesAvailable,
ULONG *BytesTaken,
PVOID Tsdu,
PIRP *IoRequestPacket
);
TDI_STATUS
TSRcvExpeditedHandler(
PVOID TdiEventContext,
CONNECTION_CONTEXT ConnectionContext,
ULONG ReceiveFlags,
ULONG BytesIndicated,
ULONG BytesAvailable,
ULONG *BytesTaken,
PVOID Tsdu,
PIRP *IoRequestPacket
);
TDI_STATUS
TSChainedReceiveHandler(
PVOID TdiEventContext,
CONNECTION_CONTEXT ConnectionContext,
ULONG ReceiveFlags,
ULONG ReceiveLength,
ULONG StartingOffset,
PMDL Tsdu,
PVOID TsduDescriptor
);
TDI_STATUS
TSChainedRcvExpeditedHandler(
PVOID TdiEventContext,
CONNECTION_CONTEXT ConnectionContext,
ULONG ReceiveFlags,
ULONG ReceiveLength,
ULONG StartingOffset,
PMDL Tsdu,
PVOID TsduDescriptor
);
//
// public functions in request.cpp
//
NTSTATUS
TSIssueRequest(
IN PDEVICE_CONTEXT pDeviceContext,
IN PIRP pIrp,
IN PIO_STACK_LOCATION pIrpSp
);
//
// public functions in send.cpp
//
NTSTATUS
TSSendDatagram(
PADDRESS_OBJECT pAddressObject,
PSEND_BUFFER pSendBuffer,
PIRP pIrp
);
NTSTATUS
TSSend(
PENDPOINT_OBJECT pEndpointObject,
PSEND_BUFFER pSendBuffer,
PIRP pIrp
);
//
// functions in tdipnp.cpp
//
VOID
TSPnpBindCallback(
TDI_PNP_OPCODE opcode,
PUNICODE_STRING devname,
PWSTR multiszstring
);
NTSTATUS
TSPnpPowerHandler(
PUNICODE_STRING devname,
PNET_PNP_EVENT pnpevent,
PTDI_PNP_CONTEXT Context1,
PTDI_PNP_CONTEXT Context2
);
VOID
TSPnpAddAddressCallback(
PTA_ADDRESS Address,
PUNICODE_STRING DeviceName,
PTDI_PNP_CONTEXT Context
);
VOID
TSPnpDelAddressCallback(
PTA_ADDRESS Address,
PUNICODE_STRING DeviceName,
PTDI_PNP_CONTEXT Context
);
VOID
TSGetNumDevices(
PSEND_BUFFER pSendBuffer,
PRECEIVE_BUFFER pReceiveBuffer
);
NTSTATUS
TSGetDevice(
PSEND_BUFFER pSendBuffer,
PRECEIVE_BUFFER pReceiveBuffer
);
NTSTATUS
TSGetAddress(
PSEND_BUFFER pSendBuffer,
PRECEIVE_BUFFER pReceiveBuffer
);
//
// functions in tdiquery.cpp
//
NTSTATUS
TSQueryInfo(
PGENERIC_HEADER pGenericHeader,
PSEND_BUFFER pSendBuffer,
PIRP pIrp
);
//
// functions in utils.cpp
//
NTSTATUS
TSAllocateMemory(
OUT PVOID *ppvVirtualAddress,
IN ULONG ulLength,
IN CONST PCHAR strFunction,
IN CONST PCHAR strTitle
);
VOID
TSFreeMemory(
IN PVOID pvVirtualAddress
);
VOID
TSScanMemoryPool(
VOID
);
ULONG
TSInsertNode(
PGENERIC_HEADER pNewNode
);
VOID
TSRemoveNode(
ULONG ulTdiHandle
);
PIRP
TSAllocateIrp(
PDEVICE_OBJECT pDeviceObject,
PIRP_POOL pIrpPool
);
VOID
TSFreeIrp(
PIRP pIrp,
PIRP_POOL pIrpPool
);
VOID
TSPrintTaAddress(
PTA_ADDRESS ptaaddr
);
PIRP_POOL
TSAllocateIrpPool(
PDEVICE_OBJECT pDeviceObject,
ULONG ulPoolSize
);
VOID
TSFreeIrpPool(
PIRP_POOL pIrpPool
);
PGENERIC_HEADER
TSGetObjectFromHandle(
ULONG ulTdiHandle,
ULONG ulType
);
//
// inline functions...
//
inline
PRECEIVE_BUFFER
TSGetReceiveBuffer(PIRP pIrp)
{
return (PRECEIVE_BUFFER)MmGetSystemAddressForMdl(pIrp->MdlAddress);
}
inline
PSEND_BUFFER
TSGetSendBuffer(PIRP pIrp)
{
return (PSEND_BUFFER)pIrp->AssociatedIrp.SystemBuffer;
}
inline
PMDL
TSAllocateBuffer(PVOID pvAddress,
ULONG ulLength)
{
PMDL pMdl
= IoAllocateMdl(pvAddress,
ulLength,
FALSE,
FALSE,
NULL);
if (pMdl)
{
MmBuildMdlForNonPagedPool(pMdl);
}
return pMdl;
}
inline
VOID
TSFreeBuffer(PMDL pMdl)
{
IoFreeMdl(pMdl);
}
inline
VOID
TSCompleteIrp(PIRP pIrp)
{
PSEND_BUFFER pSendBuffer = TSGetSendBuffer(pIrp);
pSendBuffer->pvLowerIrp = NULL;
((PDEVICE_CONTEXT)pSendBuffer->pvDeviceContext)->pLastCommandIrp = NULL;
pIrp->IoStatus.Status = STATUS_SUCCESS;
IoMarkIrpPending(pIrp);
IoCompleteRequest(pIrp, IO_NETWORK_INCREMENT);
}
//
// spinlock and timer functions, mostly stolen from ndis
//
inline
VOID
TSAllocateSpinLock(PTDI_SPIN_LOCK pTdiSpinLock)
{
KeInitializeSpinLock(&pTdiSpinLock->SpinLock);
}
#pragma warning(disable: UNREFERENCED_PARAM)
inline
VOID
TSFreeSpinLock(PTDI_SPIN_LOCK pTdiSpinLock)
{
}
#pragma warning(default: UNREFERENCED_PARAM)
inline
VOID
TSAcquireSpinLock(PTDI_SPIN_LOCK pTdiSpinLock)
{
KeAcquireSpinLock(&pTdiSpinLock->SpinLock,
&pTdiSpinLock->OldIrql);
}
inline
VOID
TSReleaseSpinLock(PTDI_SPIN_LOCK pTdiSpinLock)
{
KeReleaseSpinLock(&pTdiSpinLock->SpinLock,
pTdiSpinLock->OldIrql);
}
inline
VOID
TSInitializeEvent(PTDI_EVENT pTdiEvent)
{
KeInitializeEvent(pTdiEvent,
NotificationEvent,
FALSE);
}
inline
VOID
TSWaitEvent(PTDI_EVENT pTdiEvent)
{
KeWaitForSingleObject(pTdiEvent,
Executive,
KernelMode,
FALSE,
NULL);
}
inline
VOID
TSSetEvent(PTDI_EVENT pTdiEvent)
{
KeSetEvent(pTdiEvent,
0,
FALSE);
}
/////////////////////////////////////////////////////////////////////////
// end of file sysprocs.hpp
/////////////////////////////////////////////////////////////////////////