573 lines
9.9 KiB
C
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
|
||
|
/////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|