2537 lines
61 KiB
C
2537 lines
61 KiB
C
/*++
|
||
|
||
Copyright (c) 1989, 1990, 1991 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
nbfprocs.h
|
||
|
||
Abstract:
|
||
|
||
This header file defines private functions for the NT NBF transport
|
||
provider.
|
||
|
||
Author:
|
||
|
||
David Beaver (dbeaver) 1-July-1991
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
|
||
#ifndef _NBFPROCS_
|
||
#define _NBFPROCS_
|
||
|
||
//
|
||
// MACROS.
|
||
//
|
||
//
|
||
// Debugging aids
|
||
//
|
||
|
||
//
|
||
// VOID
|
||
// IF_NBFDBG(
|
||
// IN PSZ Message
|
||
// );
|
||
//
|
||
|
||
#if DBG
|
||
#define IF_NBFDBG(flags) \
|
||
if (NbfDebug & (flags))
|
||
#else
|
||
#define IF_NBFDBG(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 NbfPrint0(fmt) DbgPrint(fmt)
|
||
#define NbfPrint1(fmt,v0) DbgPrint(fmt,v0)
|
||
#define NbfPrint2(fmt,v0,v1) DbgPrint(fmt,v0,v1)
|
||
#define NbfPrint3(fmt,v0,v1,v2) DbgPrint(fmt,v0,v1,v2)
|
||
#define NbfPrint4(fmt,v0,v1,v2,v3) DbgPrint(fmt,v0,v1,v2,v3)
|
||
#define NbfPrint5(fmt,v0,v1,v2,v3,v4) DbgPrint(fmt,v0,v1,v2,v3,v4)
|
||
#define NbfPrint6(fmt,v0,v1,v2,v3,v4,v5) DbgPrint(fmt,v0,v1,v2,v3,v4,v5)
|
||
#else
|
||
#define NbfPrint0(fmt)
|
||
#define NbfPrint1(fmt,v0)
|
||
#define NbfPrint2(fmt,v0,v1)
|
||
#define NbfPrint3(fmt,v0,v1,v2)
|
||
#define NbfPrint4(fmt,v0,v1,v2,v3)
|
||
#define NbfPrint5(fmt,v0,v1,v2,v3,v4)
|
||
#define NbfPrint6(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_NBFDBG (NBF_DEBUG_REFCOUNTS)
|
||
#else
|
||
#define IF_REFDBG if (0)
|
||
#endif
|
||
|
||
#if DBG
|
||
#define NbfReferenceLink( Reason, Link, Type)\
|
||
if ((Link)->Destroyed) { \
|
||
DbgPrint("NBF: Attempt to reference destroyed link %lx\n", Link); \
|
||
DbgBreakPoint(); \
|
||
} \
|
||
IF_REFDBG { \
|
||
DbgPrint ("RefL %x: %s %s, %ld : %ld\n", Link, Reason, __FILE__, __LINE__, (Link)->ReferenceCount);\
|
||
}\
|
||
(VOID)ExInterlockedAddUlong ( \
|
||
(PULONG)(&(Link)->RefTypes[Type]), \
|
||
1, \
|
||
&NbfGlobalInterlock); \
|
||
NbfRefLink (Link)
|
||
|
||
#define NbfDereferenceLink(Reason, Link, Type)\
|
||
if ((Link)->Destroyed) { \
|
||
DbgPrint("NBF: Attempt to dereference destroyed link %lx\n", Link); \
|
||
DbgBreakPoint(); \
|
||
} \
|
||
IF_REFDBG { \
|
||
DbgPrint ("DeRefL %x: %s %s, %ld : %ld\n", Link, Reason, __FILE__, __LINE__, (Link)->ReferenceCount);\
|
||
} \
|
||
(VOID)ExInterlockedAddUlong ( \
|
||
(PULONG)(&(Link)->RefTypes[Type]), \
|
||
(ULONG)-1, \
|
||
&NbfGlobalInterlock); \
|
||
NbfDerefLink (Link)
|
||
|
||
#define NbfDereferenceLinkMacro(Reason, Link, Type)\
|
||
NbfDereferenceLink(Reason, Link, Type)
|
||
|
||
#define NbfReferenceLinkSpecial( Reason, Link, Type)\
|
||
if ((Link)->Destroyed) { \
|
||
DbgPrint("NBF: Attempt to special reference destroyed link %lx\n", Link); \
|
||
DbgBreakPoint(); \
|
||
} \
|
||
IF_REFDBG { \
|
||
DbgPrint ("RefLS %x: %s %s, %ld : %ld\n", Link, Reason, __FILE__, __LINE__, (Link)->SpecialRefCount);\
|
||
}\
|
||
(VOID)ExInterlockedAddUlong ( \
|
||
(PULONG)(&(Link)->RefTypes[Type]), \
|
||
1, \
|
||
&NbfGlobalInterlock); \
|
||
NbfRefLinkSpecial (Link)
|
||
|
||
#define NbfDereferenceLinkSpecial(Reason, Link, Type)\
|
||
if ((Link)->Destroyed) { \
|
||
DbgPrint("NBF: Attempt to special dereference destroyed link %lx\n", Link); \
|
||
DbgBreakPoint(); \
|
||
} \
|
||
IF_REFDBG { \
|
||
DbgPrint ("DeRefLS %x: %s %s, %ld : %ld\n", Link, Reason, __FILE__, __LINE__, (Link)->SpecialRefCount);\
|
||
} \
|
||
(VOID)ExInterlockedAddUlong ( \
|
||
(PULONG)(&(Link)->RefTypes[Type]), \
|
||
(ULONG)-1, \
|
||
&NbfGlobalInterlock); \
|
||
NbfDerefLinkSpecial (Link)
|
||
|
||
#define NbfReferenceConnection(Reason, Connection, Type)\
|
||
if ((Connection)->Destroyed) { \
|
||
DbgPrint("NBF: Attempt to reference destroyed conn %lx\n", Connection); \
|
||
DbgBreakPoint(); \
|
||
} \
|
||
IF_REFDBG { \
|
||
DbgPrint ("RefC %x: %s %s, %ld : %ld\n", Connection, Reason, __FILE__, __LINE__, (Connection)->ReferenceCount);\
|
||
} \
|
||
(VOID)ExInterlockedAddUlong ( \
|
||
(PULONG)(&(Connection)->RefTypes[Type]), \
|
||
1, \
|
||
&NbfGlobalInterlock); \
|
||
NbfRefConnection (Connection)
|
||
|
||
#define NbfDereferenceConnection(Reason, Connection, Type)\
|
||
if ((Connection)->Destroyed) { \
|
||
DbgPrint("NBF: Attempt to dereference destroyed conn %lx\n", Connection); \
|
||
DbgBreakPoint(); \
|
||
} \
|
||
IF_REFDBG { \
|
||
DbgPrint ("DeRefC %x: %s %s, %ld : %ld\n", Connection, Reason, __FILE__, __LINE__, (Connection)->ReferenceCount);\
|
||
} \
|
||
(VOID)ExInterlockedAddUlong ( \
|
||
(PULONG)&((Connection)->RefTypes[Type]), \
|
||
(ULONG)-1, \
|
||
&NbfGlobalInterlock); \
|
||
NbfDerefConnection (Connection)
|
||
|
||
#define NbfDereferenceConnectionMacro(Reason, Connection, Type)\
|
||
NbfDereferenceConnection(Reason, Connection, Type)
|
||
|
||
#define NbfDereferenceConnectionSpecial(Reason, Connection, Type)\
|
||
IF_REFDBG { \
|
||
DbgPrint ("DeRefCL %x: %s %s, %ld : %ld\n", Connection, Reason, __FILE__, __LINE__, (Connection)->ReferenceCount);\
|
||
} \
|
||
(VOID)ExInterlockedAddUlong ( \
|
||
(PULONG)&((Connection)->RefTypes[Type]), \
|
||
(ULONG)-1, \
|
||
&NbfGlobalInterlock); \
|
||
NbfDerefConnectionSpecial (Connection)
|
||
|
||
#define NbfReferenceRequest( Reason, Request, Type)\
|
||
if ((Request)->Destroyed) { \
|
||
DbgPrint("NBF: Attempt to reference destroyed req %lx\n", Request); \
|
||
DbgBreakPoint(); \
|
||
} \
|
||
IF_REFDBG { \
|
||
DbgPrint ("RefR %x: %s %s, %ld : %ld\n", Request, Reason, __FILE__, __LINE__, (Request)->ReferenceCount);}\
|
||
(VOID)ExInterlockedAddUlong ( \
|
||
(PULONG)(&(Request)->RefTypes[Type]), \
|
||
1, \
|
||
&NbfGlobalInterlock); \
|
||
NbfRefRequest (Request)
|
||
|
||
#define NbfDereferenceRequest(Reason, Request, Type)\
|
||
if ((Request)->Destroyed) { \
|
||
DbgPrint("NBF: Attempt to dereference destroyed req %lx\n", Request); \
|
||
DbgBreakPoint(); \
|
||
} \
|
||
IF_REFDBG { \
|
||
DbgPrint ("DeRefR %x: %s %s, %ld : %ld\n", Request, Reason, __FILE__, __LINE__, (Request)->ReferenceCount);\
|
||
} \
|
||
(VOID)ExInterlockedAddUlong ( \
|
||
(PULONG)(&(Request)->RefTypes[Type]), \
|
||
(ULONG)-1, \
|
||
&NbfGlobalInterlock); \
|
||
NbfDerefRequest (Request)
|
||
|
||
#define NbfReferenceSendIrp( Reason, IrpSp, Type)\
|
||
IF_REFDBG { \
|
||
DbgPrint ("RefSI %x: %s %s, %ld : %ld\n", IrpSp, Reason, __FILE__, __LINE__, IRP_SEND_REFCOUNT(IrpSp));}\
|
||
NbfRefSendIrp (IrpSp)
|
||
|
||
#define NbfDereferenceSendIrp(Reason, IrpSp, Type)\
|
||
IF_REFDBG { \
|
||
DbgPrint ("DeRefSI %x: %s %s, %ld : %ld\n", IrpSp, Reason, __FILE__, __LINE__, IRP_SEND_REFCOUNT(IrpSp));\
|
||
} \
|
||
NbfDerefSendIrp (IrpSp)
|
||
|
||
#define NbfReferenceReceiveIrpLocked( Reason, IrpSp, Type)\
|
||
IF_REFDBG { \
|
||
DbgPrint ("RefRI %x: %s %s, %ld : %ld\n", IrpSp, Reason, __FILE__, __LINE__, IRP_RECEIVE_REFCOUNT(IrpSp));}\
|
||
NbfRefReceiveIrpLocked (IrpSp)
|
||
|
||
#define NbfDereferenceReceiveIrp(Reason, IrpSp, Type)\
|
||
IF_REFDBG { \
|
||
DbgPrint ("DeRefRI %x: %s %s, %ld : %ld\n", IrpSp, Reason, __FILE__, __LINE__, IRP_RECEIVE_REFCOUNT(IrpSp));\
|
||
} \
|
||
NbfDerefReceiveIrp (IrpSp)
|
||
|
||
#define NbfDereferenceReceiveIrpLocked(Reason, IrpSp, Type)\
|
||
IF_REFDBG { \
|
||
DbgPrint ("DeRefRILocked %x: %s %s, %ld : %ld\n", IrpSp, Reason, __FILE__, __LINE__, IRP_RECEIVE_REFCOUNT(IrpSp));\
|
||
} \
|
||
NbfDerefReceiveIrpLocked (IrpSp)
|
||
|
||
#define NbfReferenceAddress( Reason, Address, Type)\
|
||
IF_REFDBG { \
|
||
DbgPrint ("RefA %x: %s %s, %ld : %ld\n", Address, Reason, __FILE__, __LINE__, (Address)->ReferenceCount);}\
|
||
(VOID)ExInterlockedAddUlong ( \
|
||
(PULONG)(&(Address)->RefTypes[Type]), \
|
||
1, \
|
||
&NbfGlobalInterlock); \
|
||
NbfRefAddress (Address)
|
||
|
||
#define NbfDereferenceAddress(Reason, Address, Type)\
|
||
IF_REFDBG { \
|
||
DbgPrint ("DeRefA %x: %s %s, %ld : %ld\n", Address, Reason, __FILE__, __LINE__, (Address)->ReferenceCount);\
|
||
} \
|
||
(VOID)ExInterlockedAddUlong ( \
|
||
(PULONG)(&(Address)->RefTypes[Type]), \
|
||
(ULONG)-1, \
|
||
&NbfGlobalInterlock); \
|
||
NbfDerefAddress (Address)
|
||
|
||
#define NbfReferenceDeviceContext( Reason, DeviceContext, Type)\
|
||
if ((DeviceContext)->ReferenceCount == 0) \
|
||
DbgBreakPoint(); \
|
||
IF_REFDBG { \
|
||
DbgPrint ("RefDC %x: %s %s, %ld : %ld\n", DeviceContext, Reason, __FILE__, __LINE__, (DeviceContext)->ReferenceCount);}\
|
||
(VOID)ExInterlockedAddUlong ( \
|
||
(PULONG)(&(DeviceContext)->RefTypes[Type]), \
|
||
1, \
|
||
&NbfGlobalInterlock); \
|
||
NbfRefDeviceContext (DeviceContext)
|
||
|
||
#define NbfDereferenceDeviceContext(Reason, DeviceContext, Type)\
|
||
if ((DeviceContext)->ReferenceCount == 0) \
|
||
DbgBreakPoint(); \
|
||
IF_REFDBG { \
|
||
DbgPrint ("DeRefDC %x: %s %s, %ld : %ld\n", DeviceContext, Reason, __FILE__, __LINE__, (DeviceContext)->ReferenceCount);\
|
||
} \
|
||
(VOID)ExInterlockedAddUlong ( \
|
||
(PULONG)(&(DeviceContext)->RefTypes[Type]), \
|
||
(ULONG)-1, \
|
||
&NbfGlobalInterlock); \
|
||
NbfDerefDeviceContext (DeviceContext)
|
||
|
||
#else
|
||
#if defined(NBF_UP)
|
||
#define NbfReferenceLink(Reason, Link, Type) \
|
||
{ \
|
||
ULONG _ref; \
|
||
_ref = ++(Link)->ReferenceCount; \
|
||
if ( _ref == 0 ) { \
|
||
NbfReferenceLinkSpecial ("first ref", (Link), LREF_SPECIAL_TEMP); \
|
||
} \
|
||
}
|
||
#else
|
||
#define NbfReferenceLink(Reason, Link, Type) \
|
||
if (InterlockedIncrement( \
|
||
&(Link)->ReferenceCount) == 0) { \
|
||
NbfReferenceLinkSpecial ("first ref", (Link), LREF_SPECIAL_TEMP); \
|
||
}
|
||
#endif
|
||
|
||
#define NbfDereferenceLink(Reason, Link, Type)\
|
||
NbfDereferenceLinkMacro(Reason,Link,Type)
|
||
|
||
#if defined(NBF_UP)
|
||
#define NbfDereferenceLinkMacro(Reason, Link, Type){ \
|
||
ULONG _ref; \
|
||
_ref = --(Link)->ReferenceCount; \
|
||
if (_ref < 0) { \
|
||
NbfDisconnectLink (Link); \
|
||
NbfDerefLinkSpecial (Link); \
|
||
} \
|
||
}
|
||
#else
|
||
#define NbfDereferenceLinkMacro(Reason, Link, Type){ \
|
||
if (InterlockedDecrement( \
|
||
&(Link)->ReferenceCount) < 0) { \
|
||
NbfDisconnectLink (Link); \
|
||
NbfDerefLinkSpecial (Link); \
|
||
} \
|
||
}
|
||
#endif
|
||
|
||
#define NbfReferenceLinkSpecial(Reason, Link, Type)\
|
||
NbfRefLinkSpecial (Link)
|
||
|
||
#define NbfDereferenceLinkSpecial(Reason, Link, Type)\
|
||
NbfDerefLinkSpecial (Link)
|
||
|
||
#define NbfReferenceConnection(Reason, Connection, Type)\
|
||
if (((Connection)->ReferenceCount == -1) && \
|
||
((Connection)->SpecialRefCount == 0)) \
|
||
DbgBreakPoint(); \
|
||
\
|
||
if (InterlockedIncrement( \
|
||
&(Connection)->ReferenceCount) == 0) { \
|
||
ExInterlockedAddUlong( \
|
||
(PULONG)(&(Connection)->SpecialRefCount), \
|
||
1, \
|
||
(Connection)->ProviderInterlock); \
|
||
}
|
||
|
||
#define NbfDereferenceConnection(Reason, Connection, Type)\
|
||
if (((Connection)->ReferenceCount == -1) && \
|
||
((Connection)->SpecialRefCount == 0)) \
|
||
DbgBreakPoint(); \
|
||
\
|
||
NbfDerefConnection (Connection)
|
||
|
||
#define NbfDereferenceConnectionMacro(Reason, Connection, Type){ \
|
||
if (((Connection)->ReferenceCount == -1) && \
|
||
((Connection)->SpecialRefCount == 0)) \
|
||
DbgBreakPoint(); \
|
||
\
|
||
\
|
||
if (InterlockedDecrement( \
|
||
&(Connection)->ReferenceCount) < 0) { \
|
||
if (NbfDisconnectFromLink (Connection, TRUE)) { \
|
||
NbfIndicateDisconnect (Connection); \
|
||
} \
|
||
NbfDerefConnectionSpecial (Connection); \
|
||
} \
|
||
}
|
||
|
||
#define NbfDereferenceConnectionSpecial(Reason, Connection, Type)\
|
||
NbfDerefConnectionSpecial (Connection)
|
||
|
||
#define NbfReferenceRequest(Reason, Request, Type)\
|
||
(VOID)InterlockedIncrement( \
|
||
&(Request)->ReferenceCount)
|
||
|
||
#define NbfDereferenceRequest(Reason, Request, Type)\
|
||
NbfDerefRequest (Request)
|
||
|
||
#define NbfReferenceSendIrp(Reason, IrpSp, Type)\
|
||
(VOID)InterlockedIncrement( \
|
||
&IRP_SEND_REFCOUNT(IrpSp))
|
||
|
||
#define NbfDereferenceSendIrp(Reason, IrpSp, Type) {\
|
||
PIO_STACK_LOCATION _IrpSp = (IrpSp); \
|
||
if (InterlockedDecrement( \
|
||
&IRP_SEND_REFCOUNT(_IrpSp)) == 0) { \
|
||
PIRP _Irp = IRP_SEND_IRP(_IrpSp); \
|
||
IRP_SEND_REFCOUNT(_IrpSp) = 0; \
|
||
IRP_SEND_IRP (_IrpSp) = NULL; \
|
||
IoCompleteRequest (_Irp, IO_NETWORK_INCREMENT); \
|
||
} \
|
||
}
|
||
|
||
#define NbfReferenceReceiveIrpLocked(Reason, IrpSp, Type)\
|
||
++IRP_RECEIVE_REFCOUNT(IrpSp)
|
||
|
||
#define NbfDereferenceReceiveIrp(Reason, IrpSp, Type)\
|
||
NbfDerefReceiveIrp (IrpSp)
|
||
|
||
#define NbfDereferenceReceiveIrpLocked(Reason, IrpSp, Type) { \
|
||
if (--IRP_RECEIVE_REFCOUNT(IrpSp) == 0) { \
|
||
ExInterlockedInsertTailList( \
|
||
&(IRP_DEVICE_CONTEXT(IrpSp)->IrpCompletionQueue), \
|
||
&(IRP_RECEIVE_IRP(IrpSp))->Tail.Overlay.ListEntry, \
|
||
&(IRP_DEVICE_CONTEXT(IrpSp)->Interlock)); \
|
||
} \
|
||
}
|
||
|
||
#define NbfReferenceAddress(Reason, Address, Type)\
|
||
if ((Address)->ReferenceCount <= 0){ DbgBreakPoint(); }\
|
||
(VOID)InterlockedIncrement(&(Address)->ReferenceCount)
|
||
|
||
#define NbfDereferenceAddress(Reason, Address, Type)\
|
||
if ((Address)->ReferenceCount <= 0){ DbgBreakPoint(); }\
|
||
NbfDerefAddress (Address)
|
||
|
||
#define NbfReferenceDeviceContext(Reason, DeviceContext, Type)\
|
||
if ((DeviceContext)->ReferenceCount == 0) \
|
||
DbgBreakPoint(); \
|
||
NbfRefDeviceContext (DeviceContext)
|
||
|
||
#define NbfDereferenceDeviceContext(Reason, DeviceContext, Type)\
|
||
if ((DeviceContext)->ReferenceCount == 0) \
|
||
DbgBreakPoint(); \
|
||
NbfDerefDeviceContext (DeviceContext)
|
||
|
||
#define NbfReferencePacket(Packet) \
|
||
(VOID)InterlockedIncrement(&(Packet)->ReferenceCount)
|
||
|
||
#define NbfDereferencePacket(Packet){ \
|
||
if (InterlockedDecrement ( \
|
||
&(Packet)->ReferenceCount) == 0) { \
|
||
NbfDestroyPacket (Packet); \
|
||
} \
|
||
}
|
||
|
||
#endif
|
||
|
||
|
||
//
|
||
// Error and statistics Macros
|
||
//
|
||
|
||
|
||
// VOID
|
||
// LogErrorToSystem(
|
||
// NTSTATUS ErrorType,
|
||
// PUCHAR ErrorDescription
|
||
// )
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine is called to log an error from the transport to the system.
|
||
Errors that are of system interest should be logged using this interface.
|
||
For now, this macro is defined trivially.
|
||
|
||
Arguments:
|
||
|
||
ErrorType - The error type, a conventional NT status
|
||
|
||
ErrorDescription - A pointer to a string describing the error.
|
||
|
||
Return Value:
|
||
|
||
none.
|
||
|
||
--*/
|
||
|
||
#if DBG
|
||
#define LogErrorToSystem( ErrorType, ErrorDescription) \
|
||
DbgPrint ("Logging error: File: %s Line: %ld \n Description: %s\n",__FILE__, __LINE__, ErrorDescription)
|
||
#else
|
||
#define LogErrorToSystem( ErrorType, ErrorDescription)
|
||
#endif
|
||
|
||
|
||
//
|
||
// Routines in TIMER.C (lightweight timer system package).
|
||
// Note that all the start and stop routines for the timers assume that you
|
||
// have the link spinlock when you call them!
|
||
// Note also that, with the latest revisions, the timer system now works by
|
||
// putting those links that have timers running on a list of links to be looked
|
||
// at for each clock tick. This list is ordered, with the most recently inserted
|
||
// elements at the tail of the list. Note further that anything already on the
|
||
// is moved to the end of the list if the timer is restarted; thus, the list
|
||
// order is preserved.
|
||
//
|
||
|
||
VOID
|
||
NbfStartShortTimer(
|
||
IN PDEVICE_CONTEXT DeviceContext
|
||
);
|
||
|
||
VOID
|
||
NbfInitializeTimerSystem(
|
||
IN PDEVICE_CONTEXT DeviceContext
|
||
);
|
||
|
||
VOID
|
||
NbfStopTimerSystem(
|
||
IN PDEVICE_CONTEXT DeviceContext
|
||
);
|
||
|
||
|
||
VOID
|
||
StartT1(
|
||
IN PTP_LINK Link,
|
||
IN ULONG PacketSize
|
||
);
|
||
|
||
VOID
|
||
StartT2(
|
||
IN PTP_LINK Link
|
||
);
|
||
|
||
VOID
|
||
StartTi(
|
||
IN PTP_LINK Link
|
||
);
|
||
|
||
#if DBG
|
||
|
||
VOID
|
||
StopT1(
|
||
IN PTP_LINK Link
|
||
);
|
||
|
||
VOID
|
||
StopT2(
|
||
IN PTP_LINK Link
|
||
);
|
||
|
||
VOID
|
||
StopTi(
|
||
IN PTP_LINK Link
|
||
);
|
||
|
||
#else
|
||
|
||
#define StopT1(_Link) \
|
||
{ \
|
||
(_Link)->CurrentPollOutstanding = FALSE; \
|
||
(_Link)->T1 = 0; \
|
||
}
|
||
|
||
#define StopT2(_Link) \
|
||
{ \
|
||
(_Link)->ConsecutiveIFrames = 0; \
|
||
(_Link)->T2 = 0; \
|
||
}
|
||
|
||
#define StopTi(_Link) \
|
||
(_Link)->Ti = 0;
|
||
|
||
#endif
|
||
|
||
|
||
//
|
||
// These functions may become macros once they are finished.
|
||
//
|
||
|
||
ULONG
|
||
GetTimerInterval(
|
||
IN PTP_LINK Link
|
||
);
|
||
|
||
VOID
|
||
BackoffCurrentT1Timeout(
|
||
IN PTP_LINK Link
|
||
);
|
||
|
||
VOID
|
||
UpdateBaseT1Timeout(
|
||
IN PTP_LINK Link
|
||
);
|
||
|
||
VOID
|
||
CancelT1Timeout(
|
||
IN PTP_LINK Link
|
||
);
|
||
|
||
VOID
|
||
UpdateDelayAndThroughput(
|
||
IN PTP_LINK Link,
|
||
IN ULONG TimerInterval
|
||
);
|
||
|
||
VOID
|
||
FakeStartT1(
|
||
IN PTP_LINK Link,
|
||
IN ULONG PacketSize
|
||
);
|
||
|
||
VOID
|
||
FakeUpdateBaseT1Timeout(
|
||
IN PTP_LINK Link
|
||
);
|
||
|
||
//
|
||
// Timer Macros - these are make sure that no timers are
|
||
// executing after we finish call to NbfStopTimerSystem
|
||
//
|
||
// State Descriptions -
|
||
//
|
||
// If TimerState is
|
||
// < TIMERS_ENABLED - Multiple ENABLE_TIMERS happened,
|
||
// Will be corrected in an instant
|
||
//
|
||
// = TIMERS_ENABLED - ENABLE_TIMERS done but no timers
|
||
// that have gone through START_TIMER
|
||
// but not yet executed a LEAVE_TIMER
|
||
//
|
||
// > TIMERS_ENABLED &&
|
||
// < TIMERS_DISABLED - ENABLE_TIMERS done and num timers =
|
||
// (TimerInitialized - TIMERS_ENABLED)
|
||
// that have gone through START_TIMER
|
||
// but not yet executed a LEAVE_TIMER
|
||
//
|
||
// = TIMERS_DISABLED - DISABLE_TIMERS done and no timers
|
||
// executing timer code at this pt
|
||
// [This is also the initial state]
|
||
//
|
||
// > TIMERS_DISABLED &&
|
||
// < TIMERS_DISABLED + TIMERS_RANGE
|
||
// - DISABLE_TIMERS done and num timers =
|
||
// (TimerInitialized - TIMERS_ENABLED)
|
||
// that have gone through START_TIMER
|
||
// but not yet executed a LEAVE_TIMER
|
||
//
|
||
// >= TIMERS_DISABLED + TIMERS_RANGE
|
||
// - Multiple DISABLE_TIMERS happened,
|
||
// Will be corrected in an instant
|
||
//
|
||
// Allow basically TIMER_RANGE = 2^24 timers
|
||
// (and 2^8 / 2 simultaneous stops or starts)
|
||
//
|
||
|
||
#if DBG_TIMER
|
||
#define DbgTimer DbgPrint
|
||
#else
|
||
#define DbgTimer
|
||
#endif
|
||
|
||
#define TIMERS_ENABLED 0x08000000
|
||
#define TIMERS_DISABLED 0x09000000
|
||
#define TIMERS_RANGE_ADD 0x01000000 /* TIMERS_DISABLED - TIMERS_ENABLED */
|
||
#define TIMERS_RANGE_SUB 0xFF000000 /* TIMERS_ENABLED - TIMERS_DISABLED */
|
||
|
||
#define INITIALIZE_TIMER_STATE(DeviceContext) \
|
||
DbgTimer("*--------------- Timers State Initialized ---------*\n"); \
|
||
/* Initial state is set to timers disabled */ \
|
||
DeviceContext->TimerState = TIMERS_DISABLED; \
|
||
|
||
#define TIMERS_INITIALIZED(DeviceContext) \
|
||
(DeviceContext->TimerState == TIMERS_DISABLED) \
|
||
|
||
#define ENABLE_TIMERS(DeviceContext) \
|
||
{ \
|
||
ULONG Count; \
|
||
\
|
||
DbgTimer("*--------------- Enabling Timers ------------------*\n"); \
|
||
Count= InterlockedExchangeAdd(&DeviceContext->TimerState, \
|
||
TIMERS_RANGE_SUB); \
|
||
DbgTimer("Count = %08x, TimerState = %08x\n", Count, \
|
||
DeviceContext->TimerState); \
|
||
if (Count < TIMERS_ENABLED) \
|
||
{ \
|
||
DbgTimer("*--------------- Timers Already Enabled -----------*\n"); \
|
||
/* We have already enabled the timers */ \
|
||
InterlockedExchangeAdd(&DeviceContext->TimerState, \
|
||
TIMERS_RANGE_ADD); \
|
||
DbgTimer("Count = %08x, TimerState = %08x\n", Count, \
|
||
DeviceContext->TimerState); \
|
||
} \
|
||
DbgTimer("*--------------- Enabling Timers Done -------------*\n"); \
|
||
} \
|
||
|
||
#define DISABLE_TIMERS(DeviceContext) \
|
||
{ \
|
||
ULONG Count; \
|
||
\
|
||
DbgTimer("*--------------- Disabling Timers -----------------*\n"); \
|
||
Count= InterlockedExchangeAdd(&DeviceContext->TimerState, \
|
||
TIMERS_RANGE_ADD); \
|
||
DbgTimer("Count = %08x, TimerState = %08x\n", Count, \
|
||
DeviceContext->TimerState); \
|
||
if (Count >= TIMERS_DISABLED) \
|
||
{ \
|
||
DbgTimer("*--------------- Timers Already Disabled ----------*\n"); \
|
||
/* We have already disabled the timers */ \
|
||
InterlockedExchangeAdd(&DeviceContext->TimerState, \
|
||
TIMERS_RANGE_SUB); \
|
||
DbgTimer("Count = %08x, TimerState = %08x\n", Count, \
|
||
DeviceContext->TimerState); \
|
||
} \
|
||
\
|
||
/* Loop until we have zero timers active */ \
|
||
while (*((ULONG volatile *)&DeviceContext->TimerState)!=TIMERS_DISABLED)\
|
||
DbgTimer("Number of timers active = %08x\n", \
|
||
DeviceContext->TimerState \
|
||
- TIMERS_DISABLED); \
|
||
DbgTimer("*--------------- Disabling Timers Done ------------*\n"); \
|
||
} \
|
||
|
||
#define START_TIMER(DeviceContext, TimerId, Timer, DueTime, Dpc) \
|
||
/*DbgTimer("*---------- Entering Timer %d ---------*\n", TimerId);*/\
|
||
if (InterlockedIncrement(&DeviceContext->TimerState) < \
|
||
TIMERS_DISABLED) \
|
||
{ \
|
||
KeSetTimer(Timer, DueTime, Dpc); \
|
||
} \
|
||
else \
|
||
{ \
|
||
/* Timers disabled - get out and reset */ \
|
||
NbfDereferenceDeviceContext("Timers disabled", \
|
||
DeviceContext, \
|
||
DCREF_SCAN_TIMER); \
|
||
LEAVE_TIMER(DeviceContext, TimerId); \
|
||
} \
|
||
/*DbgTimer("*---------- Entering Done %d ---------*\n", TimerId);*/\
|
||
|
||
#define LEAVE_TIMER(DeviceContext, TimerId) \
|
||
/* Get out and adjust the time count */ \
|
||
/*DbgTimer("*---------- Leaving Timer %d ---------*\n", TimerId);*/ \
|
||
InterlockedDecrement(&DeviceContext->TimerState); \
|
||
/*DbgTimer("*---------- Leaving Done %d ---------*\n", TimerId);*/ \
|
||
|
||
|
||
// Basic timer types (just for debugging)
|
||
#define LONG_TIMER 0
|
||
#define SHORT_TIMER 1
|
||
|
||
|
||
//
|
||
// These macros are used to create and destroy packets, due
|
||
// to the allocation or deallocation of structure which
|
||
// need them.
|
||
//
|
||
|
||
#define NbfAddUIFrame(DeviceContext) { \
|
||
PTP_UI_FRAME _UIFrame; \
|
||
NbfAllocateUIFrame ((DeviceContext), &_UIFrame); \
|
||
if (_UIFrame != NULL) { \
|
||
ExInterlockedInsertTailList( \
|
||
&(DeviceContext)->UIFramePool, \
|
||
&_UIFrame->Linkage, \
|
||
&(DeviceContext)->Interlock); \
|
||
} \
|
||
}
|
||
|
||
#define NbfRemoveUIFrame(DeviceContext) { \
|
||
PLIST_ENTRY p; \
|
||
if (DeviceContext->UIFrameAllocated > DeviceContext->UIFrameInitAllocated) { \
|
||
p = ExInterlockedRemoveHeadList( \
|
||
&(DeviceContext)->UIFramePool, \
|
||
&(DeviceContext)->Interlock); \
|
||
if (p != NULL) { \
|
||
NbfDeallocateUIFrame((DeviceContext), \
|
||
(PTP_UI_FRAME)CONTAINING_RECORD(p, TP_UI_FRAME, Linkage)); \
|
||
} \
|
||
} \
|
||
}
|
||
|
||
|
||
#define NbfAddSendPacket(DeviceContext) { \
|
||
PTP_PACKET _SendPacket; \
|
||
NbfAllocateSendPacket ((DeviceContext), &_SendPacket); \
|
||
if (_SendPacket != NULL) { \
|
||
ExInterlockedPushEntryList( \
|
||
&(DeviceContext)->PacketPool, \
|
||
(PSINGLE_LIST_ENTRY)&_SendPacket->Linkage, \
|
||
&(DeviceContext)->Interlock); \
|
||
} \
|
||
}
|
||
|
||
#define NbfRemoveSendPacket(DeviceContext) { \
|
||
PSINGLE_LIST_ENTRY s; \
|
||
if (DeviceContext->PacketAllocated > DeviceContext->PacketInitAllocated) { \
|
||
s = ExInterlockedPopEntryList( \
|
||
&(DeviceContext)->PacketPool, \
|
||
&(DeviceContext)->Interlock); \
|
||
if (s != NULL) { \
|
||
NbfDeallocateSendPacket((DeviceContext), \
|
||
(PTP_PACKET)CONTAINING_RECORD(s, TP_PACKET, Linkage)); \
|
||
} \
|
||
} \
|
||
}
|
||
|
||
|
||
#define NbfAddReceivePacket(DeviceContext) { \
|
||
if (!(DeviceContext)->MacInfo.SingleReceive) { \
|
||
PNDIS_PACKET _ReceivePacket; \
|
||
NbfAllocateReceivePacket ((DeviceContext), &_ReceivePacket); \
|
||
if (_ReceivePacket != NULL) { \
|
||
ExInterlockedPushEntryList( \
|
||
&(DeviceContext)->ReceivePacketPool, \
|
||
&((PRECEIVE_PACKET_TAG)_ReceivePacket->ProtocolReserved)->Linkage, \
|
||
&(DeviceContext)->Interlock); \
|
||
} \
|
||
} \
|
||
}
|
||
|
||
#define NbfRemoveReceivePacket(DeviceContext) { \
|
||
PSINGLE_LIST_ENTRY s; \
|
||
if (DeviceContext->ReceivePacketAllocated > DeviceContext->ReceivePacketInitAllocated) { \
|
||
s = ExInterlockedPopEntryList( \
|
||
&(DeviceContext)->ReceivePacketPool, \
|
||
&(DeviceContext)->Interlock); \
|
||
if (s != NULL) { \
|
||
NbfDeallocateReceivePacket((DeviceContext), \
|
||
(PNDIS_PACKET)CONTAINING_RECORD(s, NDIS_PACKET, ProtocolReserved[0])); \
|
||
} \
|
||
} \
|
||
}
|
||
|
||
|
||
#define NbfAddReceiveBuffer(DeviceContext) { \
|
||
if (!(DeviceContext)->MacInfo.SingleReceive) { \
|
||
PBUFFER_TAG _ReceiveBuffer; \
|
||
NbfAllocateReceiveBuffer ((DeviceContext), &_ReceiveBuffer); \
|
||
if (_ReceiveBuffer != NULL) { \
|
||
ExInterlockedPushEntryList( \
|
||
&(DeviceContext)->ReceiveBufferPool, \
|
||
(PSINGLE_LIST_ENTRY)&_ReceiveBuffer->Linkage, \
|
||
&(DeviceContext)->Interlock); \
|
||
} \
|
||
} \
|
||
}
|
||
|
||
#define NbfRemoveReceiveBuffer(DeviceContext) { \
|
||
PSINGLE_LIST_ENTRY s; \
|
||
if (DeviceContext->ReceiveBufferAllocated > DeviceContext->ReceiveBufferInitAllocated) { \
|
||
s = ExInterlockedPopEntryList( \
|
||
&(DeviceContext)->ReceiveBufferPool, \
|
||
&(DeviceContext)->Interlock); \
|
||
if (s != NULL) { \
|
||
NbfDeallocateReceiveBuffer(DeviceContext, \
|
||
(PBUFFER_TAG)CONTAINING_RECORD(s, BUFFER_TAG, Linkage)); \
|
||
} \
|
||
} \
|
||
}
|
||
|
||
|
||
//
|
||
// These routines are used to maintain counters.
|
||
//
|
||
|
||
#define INCREMENT_COUNTER(_DeviceContext,_Field) \
|
||
++(_DeviceContext)->Statistics._Field
|
||
|
||
#define DECREMENT_COUNTER(_DeviceContext,_Field) \
|
||
--(_DeviceContext)->Statistics._Field
|
||
|
||
#define ADD_TO_LARGE_INTEGER(_LargeInteger,_Ulong) \
|
||
ExInterlockedAddLargeStatistic((_LargeInteger), (ULONG)(_Ulong))
|
||
|
||
|
||
|
||
//
|
||
// Routines in PACKET.C (TP_PACKET object manager).
|
||
//
|
||
|
||
VOID
|
||
NbfAllocateUIFrame(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
OUT PTP_UI_FRAME *TransportUIFrame
|
||
);
|
||
|
||
VOID
|
||
NbfAllocateSendPacket(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
OUT PTP_PACKET *TransportSendPacket
|
||
);
|
||
|
||
VOID
|
||
NbfAllocateReceivePacket(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
OUT PNDIS_PACKET *TransportReceivePacket
|
||
);
|
||
|
||
VOID
|
||
NbfAllocateReceiveBuffer(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
OUT PBUFFER_TAG *TransportReceiveBuffer
|
||
);
|
||
|
||
VOID
|
||
NbfDeallocateUIFrame(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN PTP_UI_FRAME TransportUIFrame
|
||
);
|
||
|
||
VOID
|
||
NbfDeallocateSendPacket(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN PTP_PACKET TransportSendPacket
|
||
);
|
||
|
||
VOID
|
||
NbfDeallocateReceivePacket(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN PNDIS_PACKET TransportReceivePacket
|
||
);
|
||
|
||
VOID
|
||
NbfDeallocateReceiveBuffer(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN PBUFFER_TAG TransportReceiveBuffer
|
||
);
|
||
|
||
NTSTATUS
|
||
NbfCreatePacket(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN PTP_LINK Link,
|
||
OUT PTP_PACKET *Packet
|
||
);
|
||
|
||
NTSTATUS
|
||
NbfCreateRrPacket(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN PTP_LINK Link,
|
||
OUT PTP_PACKET *Packet
|
||
);
|
||
|
||
VOID
|
||
NbfDestroyPacket(
|
||
IN PTP_PACKET Packet
|
||
);
|
||
VOID
|
||
NbfGrowSendPacketPool(
|
||
IN PDEVICE_CONTEXT DeviceContext
|
||
);
|
||
|
||
#if DBG
|
||
VOID
|
||
NbfReferencePacket(
|
||
IN PTP_PACKET Packet
|
||
);
|
||
|
||
VOID
|
||
NbfDereferencePacket(
|
||
IN PTP_PACKET Packet
|
||
);
|
||
#endif
|
||
|
||
VOID
|
||
NbfWaitPacket(
|
||
IN PTP_CONNECTION Connection,
|
||
IN ULONG Flags
|
||
);
|
||
|
||
#if DBG
|
||
#define MAGIC 1
|
||
extern BOOLEAN NbfEnableMagic;
|
||
#else
|
||
#define MAGIC 0
|
||
#endif
|
||
|
||
#if MAGIC
|
||
VOID
|
||
NbfSendMagicBullet (
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN PTP_LINK Link
|
||
);
|
||
#endif
|
||
|
||
//
|
||
// 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 EndOfMessage,
|
||
IN ULONG BytesTransferred
|
||
);
|
||
|
||
VOID
|
||
NbfCancelReceive(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp
|
||
);
|
||
|
||
VOID
|
||
NbfCancelReceiveDatagram(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp
|
||
);
|
||
|
||
//
|
||
// Routines in SEND.C (Receive engine).
|
||
//
|
||
|
||
NTSTATUS
|
||
NbfTdiSend(
|
||
IN PIRP Irp
|
||
);
|
||
|
||
NTSTATUS
|
||
NbfTdiSendDatagram(
|
||
IN PIRP Irp
|
||
);
|
||
|
||
//
|
||
// Routines in SENDENG.C (Send engine).
|
||
//
|
||
|
||
#if DBG
|
||
|
||
VOID
|
||
InitializeSend(
|
||
PTP_CONNECTION Connection
|
||
);
|
||
|
||
#else
|
||
|
||
// See SENDENG.C for the fully-commented description of InitializeSend.
|
||
|
||
#define InitializeSend(_conn_) { \
|
||
PIRP _irp_; \
|
||
(_conn_)->SendState = CONNECTION_SENDSTATE_PACKETIZE; \
|
||
_irp_ = CONTAINING_RECORD ((_conn_)->SendQueue.Flink, \
|
||
IRP, \
|
||
Tail.Overlay.ListEntry); \
|
||
(_conn_)->FirstSendIrp = (_conn_)->sp.CurrentSendIrp = _irp_; \
|
||
(_conn_)->FirstSendMdl = (_conn_)->sp.CurrentSendMdl = \
|
||
_irp_->MdlAddress; \
|
||
(_conn_)->FirstSendByteOffset = (_conn_)->sp.SendByteOffset = 0; \
|
||
(_conn_)->sp.MessageBytesSent = 0; \
|
||
(_conn_)->CurrentSendLength = \
|
||
IRP_SEND_LENGTH(IoGetCurrentIrpStackLocation(_irp_)); \
|
||
(_conn_)->StallCount = 0; \
|
||
(_conn_)->StallBytesSent = 0; \
|
||
if ((_conn_)->NetbiosHeader.ResponseCorrelator == 0xffff) { \
|
||
(_conn_)->NetbiosHeader.ResponseCorrelator = 1; \
|
||
} else { \
|
||
++((_conn_)->NetbiosHeader.ResponseCorrelator); \
|
||
} \
|
||
}
|
||
|
||
#endif
|
||
|
||
// See SENDENG.C for the fully-commented description of
|
||
// StartPacketizingConnection. On a free build this is a
|
||
// macro for speed.
|
||
|
||
#if DBG
|
||
|
||
VOID
|
||
StartPacketizingConnection(
|
||
PTP_CONNECTION Connection,
|
||
IN BOOLEAN Immediate
|
||
);
|
||
|
||
#else
|
||
|
||
#define StartPacketizingConnection(_conn_,_immed_) { \
|
||
PDEVICE_CONTEXT _devctx_; \
|
||
_devctx_ = (_conn_)->Provider; \
|
||
if (((_conn_)->SendState == CONNECTION_SENDSTATE_PACKETIZE) && \
|
||
!((_conn_)->Flags & CONNECTION_FLAGS_PACKETIZE)) { \
|
||
(_conn_)->Flags |= CONNECTION_FLAGS_PACKETIZE; \
|
||
if (!(_immed_)) { \
|
||
NbfReferenceConnection("Packetize", \
|
||
(_conn_), \
|
||
CREF_PACKETIZE_QUEUE); \
|
||
} \
|
||
ExInterlockedInsertTailList (&_devctx_->PacketizeQueue, \
|
||
&(_conn_)->PacketizeLinkage, \
|
||
&_devctx_->SpinLock); \
|
||
RELEASE_DPC_SPIN_LOCK ((_conn_)->LinkSpinLock); \
|
||
} else { \
|
||
RELEASE_DPC_SPIN_LOCK ((_conn_)->LinkSpinLock); \
|
||
if (_immed_) { \
|
||
NbfDereferenceConnection("temp TdiSend", (_conn_), CREF_BY_ID); \
|
||
} \
|
||
} \
|
||
if (_immed_) { \
|
||
PacketizeConnections (_devctx_); \
|
||
} \
|
||
}
|
||
|
||
#endif
|
||
|
||
VOID
|
||
PacketizeConnections(
|
||
IN PDEVICE_CONTEXT DeviceContext
|
||
);
|
||
|
||
VOID
|
||
PacketizeSend(
|
||
IN PTP_CONNECTION Connection,
|
||
IN BOOLEAN Direct
|
||
);
|
||
|
||
BOOLEAN
|
||
ResendLlcPackets(
|
||
IN PTP_LINK Link,
|
||
IN UCHAR AckSequenceNumber,
|
||
IN BOOLEAN Resend
|
||
);
|
||
|
||
VOID
|
||
CompleteSend(
|
||
IN PTP_CONNECTION Connection,
|
||
IN USHORT Correlator
|
||
);
|
||
|
||
VOID
|
||
FailSend(
|
||
IN PTP_CONNECTION Connection,
|
||
IN NTSTATUS RequestStatus,
|
||
IN BOOLEAN StopConnection
|
||
);
|
||
|
||
VOID
|
||
ReframeSend(
|
||
IN PTP_CONNECTION Connection,
|
||
IN ULONG BytesReceived
|
||
);
|
||
|
||
VOID
|
||
NbfCancelSend(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp
|
||
);
|
||
|
||
NTSTATUS
|
||
SendOnePacket(
|
||
IN PTP_CONNECTION Connection,
|
||
IN PTP_PACKET Packet,
|
||
IN BOOLEAN ForceAck,
|
||
OUT PBOOLEAN LinkCheckpoint OPTIONAL
|
||
);
|
||
|
||
VOID
|
||
SendControlPacket(
|
||
IN PTP_LINK Link,
|
||
IN PTP_PACKET Packet
|
||
);
|
||
|
||
VOID
|
||
NbfNdisSend(
|
||
IN PTP_LINK Link,
|
||
IN PTP_PACKET Packet
|
||
);
|
||
|
||
VOID
|
||
RestartLinkTraffic(
|
||
IN PTP_LINK Link
|
||
);
|
||
|
||
VOID
|
||
NbfSendCompletionHandler(
|
||
IN NDIS_HANDLE ProtocolBindingContext,
|
||
IN PNDIS_PACKET NdisPacket,
|
||
IN NDIS_STATUS NdisStatus
|
||
);
|
||
|
||
NTSTATUS
|
||
BuildBufferChainFromMdlChain (
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
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
|
||
NbfRefDeviceContext(
|
||
IN PDEVICE_CONTEXT DeviceContext
|
||
);
|
||
|
||
VOID
|
||
NbfDerefDeviceContext(
|
||
IN PDEVICE_CONTEXT DeviceContext
|
||
);
|
||
|
||
NTSTATUS
|
||
NbfCreateDeviceContext(
|
||
IN PDRIVER_OBJECT DriverObject,
|
||
IN PUNICODE_STRING DeviceName,
|
||
IN OUT PDEVICE_CONTEXT *DeviceContext
|
||
);
|
||
|
||
VOID
|
||
NbfDestroyDeviceContext(
|
||
IN PDEVICE_CONTEXT DeviceContext
|
||
);
|
||
|
||
|
||
//
|
||
// Routines in ADDRESS.C (TP_ADDRESS object manager).
|
||
//
|
||
|
||
#if DBG
|
||
VOID
|
||
NbfRefAddress(
|
||
IN PTP_ADDRESS Address
|
||
);
|
||
#endif
|
||
|
||
VOID
|
||
NbfDerefAddress(
|
||
IN PTP_ADDRESS Address
|
||
);
|
||
|
||
VOID
|
||
NbfAllocateAddressFile(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
OUT PTP_ADDRESS_FILE *TransportAddressFile
|
||
);
|
||
|
||
VOID
|
||
NbfDeallocateAddressFile(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN PTP_ADDRESS_FILE TransportAddressFile
|
||
);
|
||
|
||
NTSTATUS
|
||
NbfCreateAddressFile(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
OUT PTP_ADDRESS_FILE * AddressFile
|
||
);
|
||
|
||
VOID
|
||
NbfReferenceAddressFile(
|
||
IN PTP_ADDRESS_FILE AddressFile
|
||
);
|
||
|
||
VOID
|
||
NbfDereferenceAddressFile(
|
||
IN PTP_ADDRESS_FILE AddressFile
|
||
);
|
||
|
||
VOID
|
||
NbfDestroyAddress(
|
||
IN PVOID Parameter
|
||
);
|
||
|
||
NTSTATUS
|
||
NbfOpenAddress(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp,
|
||
IN PIO_STACK_LOCATION IrpSp
|
||
);
|
||
|
||
NTSTATUS
|
||
NbfCloseAddress(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp,
|
||
IN PIO_STACK_LOCATION IrpSp
|
||
);
|
||
|
||
VOID
|
||
NbfStopAddress(
|
||
IN PTP_ADDRESS Address
|
||
);
|
||
|
||
VOID
|
||
NbfRegisterAddress(
|
||
IN PTP_ADDRESS Address
|
||
);
|
||
|
||
BOOLEAN
|
||
NbfMatchNetbiosAddress(
|
||
IN PTP_ADDRESS Address,
|
||
IN UCHAR NameType,
|
||
IN PUCHAR NetBIOSName
|
||
);
|
||
|
||
VOID
|
||
NbfAllocateAddress(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
OUT PTP_ADDRESS *TransportAddress
|
||
);
|
||
|
||
VOID
|
||
NbfDeallocateAddress(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN PTP_ADDRESS TransportAddress
|
||
);
|
||
|
||
NTSTATUS
|
||
NbfCreateAddress(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN PNBF_NETBIOS_ADDRESS NetworkName,
|
||
OUT PTP_ADDRESS *Address
|
||
);
|
||
|
||
PTP_ADDRESS
|
||
NbfLookupAddress(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN PNBF_NETBIOS_ADDRESS NetworkName
|
||
);
|
||
|
||
PTP_CONNECTION
|
||
NbfLookupRemoteName(
|
||
IN PTP_ADDRESS Address,
|
||
IN PUCHAR RemoteName,
|
||
IN UCHAR RemoteSessionNumber
|
||
);
|
||
|
||
NTSTATUS
|
||
NbfStopAddressFile(
|
||
IN PTP_ADDRESS_FILE AddressFile,
|
||
IN PTP_ADDRESS Address
|
||
);
|
||
|
||
VOID
|
||
AddressTimeoutHandler(
|
||
IN PKDPC Dpc,
|
||
IN PVOID DeferredContext,
|
||
IN PVOID SystemArgument1,
|
||
IN PVOID SystemArgument2
|
||
);
|
||
|
||
TDI_ADDRESS_NETBIOS *
|
||
NbfParseTdiAddress(
|
||
IN TRANSPORT_ADDRESS UNALIGNED * TransportAddress,
|
||
IN BOOLEAN BroadcastAddressOk
|
||
);
|
||
|
||
BOOLEAN
|
||
NbfValidateTdiAddress(
|
||
IN TRANSPORT_ADDRESS UNALIGNED * TransportAddress,
|
||
IN ULONG TransportAddressLength
|
||
);
|
||
|
||
NTSTATUS
|
||
NbfVerifyAddressObject (
|
||
IN PTP_ADDRESS_FILE AddressFile
|
||
);
|
||
|
||
NTSTATUS
|
||
NbfSendDatagramsOnAddress(
|
||
PTP_ADDRESS Address
|
||
);
|
||
|
||
//
|
||
// Routines in CONNECT.C.
|
||
//
|
||
|
||
NTSTATUS
|
||
NbfTdiAccept(
|
||
IN PIRP Irp
|
||
);
|
||
|
||
NTSTATUS
|
||
NbfTdiConnect(
|
||
IN PIRP Irp
|
||
);
|
||
|
||
NTSTATUS
|
||
NbfTdiDisconnect(
|
||
IN PIRP Irp
|
||
);
|
||
|
||
NTSTATUS
|
||
NbfTdiDisassociateAddress (
|
||
IN PIRP Irp
|
||
);
|
||
|
||
NTSTATUS
|
||
NbfTdiAssociateAddress(
|
||
IN PIRP Irp
|
||
);
|
||
|
||
NTSTATUS
|
||
NbfTdiListen(
|
||
IN PIRP Irp
|
||
);
|
||
|
||
NTSTATUS
|
||
NbfOpenConnection(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp,
|
||
IN PIO_STACK_LOCATION IrpSp
|
||
);
|
||
|
||
NTSTATUS
|
||
NbfCloseConnection(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp,
|
||
IN PIO_STACK_LOCATION IrpSp
|
||
);
|
||
|
||
//
|
||
//
|
||
// Routines in CONNOBJ.C (TP_CONNECTION object manager).
|
||
//
|
||
|
||
#if DBG
|
||
VOID
|
||
NbfRefConnection(
|
||
IN PTP_CONNECTION TransportConnection
|
||
);
|
||
#endif
|
||
|
||
VOID
|
||
NbfDerefConnection(
|
||
IN PTP_CONNECTION TransportConnection
|
||
);
|
||
|
||
VOID
|
||
NbfDerefConnectionSpecial(
|
||
IN PTP_CONNECTION TransportConnection
|
||
);
|
||
|
||
VOID
|
||
NbfClearConnectionLsn(
|
||
IN PTP_CONNECTION TransportConnection
|
||
);
|
||
|
||
VOID
|
||
NbfStopConnection(
|
||
IN PTP_CONNECTION TransportConnection,
|
||
IN NTSTATUS Status
|
||
);
|
||
|
||
VOID
|
||
NbfCancelConnection(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp
|
||
);
|
||
|
||
VOID
|
||
NbfStartConnectionTimer(
|
||
IN PTP_CONNECTION TransportConnection,
|
||
IN PKDEFERRED_ROUTINE TimeoutFunction,
|
||
IN ULONG WaitTime
|
||
);
|
||
|
||
PTP_CONNECTION
|
||
NbfLookupListeningConnection(
|
||
IN PTP_ADDRESS Address,
|
||
IN PUCHAR RemoteName
|
||
);
|
||
|
||
PTP_CONNECTION
|
||
NbfLookupConnectingConnection(
|
||
IN PTP_ADDRESS Address
|
||
);
|
||
|
||
VOID
|
||
NbfAllocateConnection(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
OUT PTP_CONNECTION *TransportConnection
|
||
);
|
||
|
||
VOID
|
||
NbfDeallocateConnection(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN PTP_CONNECTION TransportConnection
|
||
);
|
||
|
||
NTSTATUS
|
||
NbfCreateConnection(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
OUT PTP_CONNECTION *TransportConnection
|
||
);
|
||
|
||
PTP_CONNECTION
|
||
NbfLookupConnectionById(
|
||
IN PTP_ADDRESS Address,
|
||
IN USHORT ConnectionId
|
||
);
|
||
|
||
PTP_CONNECTION
|
||
NbfLookupConnectionByContext(
|
||
IN PTP_ADDRESS Address,
|
||
IN CONNECTION_CONTEXT ConnectionContext
|
||
);
|
||
|
||
#if 0
|
||
VOID
|
||
NbfWaitConnectionOnLink(
|
||
IN PTP_CONNECTION Connection,
|
||
IN ULONG Flags
|
||
);
|
||
#endif
|
||
|
||
VOID
|
||
ConnectionEstablishmentTimeout(
|
||
IN PKDPC Dpc,
|
||
IN PVOID DeferredContext,
|
||
IN PVOID SystemArgument1,
|
||
IN PVOID SystemArgument2
|
||
);
|
||
|
||
NTSTATUS
|
||
NbfVerifyConnectionObject (
|
||
IN PTP_CONNECTION Connection
|
||
);
|
||
|
||
NTSTATUS
|
||
NbfIndicateDisconnect(
|
||
IN PTP_CONNECTION TransportConnection
|
||
);
|
||
|
||
//
|
||
// Routines in INFO.C (QUERY_INFO manager).
|
||
//
|
||
|
||
NTSTATUS
|
||
NbfTdiQueryInformation(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN PIRP Irp
|
||
);
|
||
|
||
NTSTATUS
|
||
NbfTdiSetInformation(
|
||
IN PIRP Irp
|
||
);
|
||
|
||
VOID
|
||
NbfSendQueryFindName(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN PTP_REQUEST Request
|
||
);
|
||
|
||
NTSTATUS
|
||
NbfProcessQueryNameRecognized(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN PUCHAR Packet,
|
||
PNBF_HDR_CONNECTIONLESS UiFrame
|
||
);
|
||
|
||
VOID
|
||
NbfSendStatusQuery(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN PTP_REQUEST Request,
|
||
IN PHARDWARE_ADDRESS DestinationAddress,
|
||
IN PUCHAR SourceRouting,
|
||
IN UINT SourceRoutingLength
|
||
);
|
||
|
||
NTSTATUS
|
||
NbfProcessStatusResponse(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN NDIS_HANDLE ReceiveContext,
|
||
IN PNBF_HDR_CONNECTIONLESS UiFrame,
|
||
IN PHARDWARE_ADDRESS SourceAddress,
|
||
IN PUCHAR SourceRouting,
|
||
IN UINT SourceRoutingLength
|
||
);
|
||
|
||
NTSTATUS
|
||
NbfProcessStatusQuery(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN PTP_ADDRESS Address OPTIONAL,
|
||
IN PNBF_HDR_CONNECTIONLESS UiFrame,
|
||
IN PHARDWARE_ADDRESS SourceAddress,
|
||
IN PUCHAR SourceRouting,
|
||
IN UINT SourceRoutingLength
|
||
);
|
||
|
||
//
|
||
// Routines in EVENT.C.
|
||
//
|
||
|
||
NTSTATUS
|
||
NbfTdiSetEventHandler(
|
||
IN PIRP Irp
|
||
);
|
||
|
||
//
|
||
// Routines in REQUEST.C (TP_REQUEST object manager).
|
||
//
|
||
|
||
|
||
VOID
|
||
TdiRequestTimeoutHandler(
|
||
IN PKDPC Dpc,
|
||
IN PVOID DeferredContext,
|
||
IN PVOID SystemArgument1,
|
||
IN PVOID SystemArgument2
|
||
);
|
||
|
||
#if DBG
|
||
VOID
|
||
NbfRefRequest(
|
||
IN PTP_REQUEST Request
|
||
);
|
||
#endif
|
||
|
||
VOID
|
||
NbfDerefRequest(
|
||
IN PTP_REQUEST Request
|
||
);
|
||
|
||
VOID
|
||
NbfCompleteRequest(
|
||
IN PTP_REQUEST Request,
|
||
IN NTSTATUS Status,
|
||
IN ULONG Information
|
||
);
|
||
|
||
#if DBG
|
||
VOID
|
||
NbfRefSendIrp(
|
||
IN PIO_STACK_LOCATION IrpSp
|
||
);
|
||
|
||
VOID
|
||
NbfDerefSendIrp(
|
||
IN PIO_STACK_LOCATION IrpSp
|
||
);
|
||
#endif
|
||
|
||
VOID
|
||
NbfCompleteSendIrp(
|
||
IN PIRP Irp,
|
||
IN NTSTATUS Status,
|
||
IN ULONG Information
|
||
);
|
||
|
||
#if DBG
|
||
VOID
|
||
NbfRefReceiveIrpLocked(
|
||
IN PIO_STACK_LOCATION IrpSp
|
||
);
|
||
#endif
|
||
|
||
VOID
|
||
NbfDerefReceiveIrp(
|
||
IN PIO_STACK_LOCATION IrpSp
|
||
);
|
||
|
||
#if DBG
|
||
VOID
|
||
NbfDerefReceiveIrpLocked(
|
||
IN PIO_STACK_LOCATION IrpSp
|
||
);
|
||
#endif
|
||
|
||
VOID
|
||
NbfCompleteReceiveIrp(
|
||
IN PIRP Irp,
|
||
IN NTSTATUS Status,
|
||
IN ULONG Information
|
||
);
|
||
|
||
VOID
|
||
NbfAllocateRequest(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
OUT PTP_REQUEST *TransportRequest
|
||
);
|
||
|
||
VOID
|
||
NbfDeallocateRequest(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN PTP_REQUEST TransportRequest
|
||
);
|
||
|
||
NTSTATUS
|
||
NbfCreateRequest(
|
||
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 LINK.C (TP_LINK object manager).
|
||
//
|
||
|
||
NTSTATUS
|
||
NbfDestroyLink(
|
||
IN PTP_LINK TransportLink
|
||
);
|
||
|
||
VOID
|
||
NbfDisconnectLink(
|
||
IN PTP_LINK Link
|
||
);
|
||
|
||
#if DBG
|
||
VOID
|
||
NbfRefLink(
|
||
IN PTP_LINK TransportLink
|
||
);
|
||
#endif
|
||
|
||
VOID
|
||
NbfDerefLink(
|
||
IN PTP_LINK TransportLink
|
||
);
|
||
|
||
VOID
|
||
NbfRefLinkSpecial(
|
||
IN PTP_LINK TransportLink
|
||
);
|
||
|
||
VOID
|
||
NbfDerefLinkSpecial(
|
||
IN PTP_LINK TransportLink
|
||
);
|
||
|
||
VOID
|
||
NbfResetLink(
|
||
IN PTP_LINK Link
|
||
);
|
||
|
||
VOID
|
||
NbfStopLink(
|
||
IN PTP_LINK Link
|
||
);
|
||
|
||
VOID
|
||
NbfCompleteLink(
|
||
IN PTP_LINK Link
|
||
);
|
||
|
||
VOID
|
||
NbfActivateLink(
|
||
IN PTP_LINK Link
|
||
);
|
||
|
||
VOID
|
||
NbfWaitLink(
|
||
IN PTP_LINK Link
|
||
);
|
||
|
||
BOOLEAN
|
||
NbfDisconnectFromLink(
|
||
IN PTP_CONNECTION TransportConnection,
|
||
IN BOOLEAN VerifyReferenceCount
|
||
);
|
||
|
||
NTSTATUS
|
||
NbfAssignGroupLsn(
|
||
IN PTP_CONNECTION TransportConnection
|
||
);
|
||
|
||
NTSTATUS
|
||
NbfConnectToLink(
|
||
IN PTP_LINK Link,
|
||
IN PTP_CONNECTION TransportConnection
|
||
);
|
||
|
||
PTP_CONNECTION
|
||
NbfLookupPendingConnectOnLink(
|
||
IN PTP_LINK Link
|
||
);
|
||
|
||
PTP_CONNECTION
|
||
NbfLookupPendingListenOnLink(
|
||
IN PTP_LINK Link
|
||
);
|
||
|
||
VOID
|
||
NbfAllocateLink(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
OUT PTP_LINK *TransportLink
|
||
);
|
||
|
||
VOID
|
||
NbfDeallocateLink(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN PTP_LINK TransportLink
|
||
);
|
||
|
||
NTSTATUS
|
||
NbfCreateLink(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN PHARDWARE_ADDRESS HardwareAddress,
|
||
IN PUCHAR SourceRouting,
|
||
IN UINT SourceRoutingLength,
|
||
IN USHORT LoopbackLinkIndex,
|
||
OUT PTP_LINK *TransportLink
|
||
);
|
||
|
||
VOID
|
||
NbfDumpLinkInfo (
|
||
IN PTP_LINK Link
|
||
);
|
||
|
||
//
|
||
// routines in linktree.c
|
||
//
|
||
|
||
|
||
NTSTATUS
|
||
NbfAddLinkToTree (
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN PTP_LINK Link
|
||
);
|
||
|
||
NTSTATUS
|
||
NbfRemoveLinkFromTree(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN PTP_LINK Link
|
||
);
|
||
|
||
PTP_LINK
|
||
NbfFindLinkInTree(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN PUCHAR Remote
|
||
);
|
||
|
||
PTP_LINK
|
||
NbfFindLink(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN PUCHAR Remote
|
||
);
|
||
|
||
//
|
||
// Routines in DLC.C (LLC frame cracker, entrypoints from NDIS interface).
|
||
//
|
||
|
||
VOID
|
||
NbfInsertInLoopbackQueue (
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN PNDIS_PACKET NdisPacket,
|
||
IN UCHAR LinkIndex
|
||
);
|
||
|
||
VOID
|
||
NbfProcessLoopbackQueue (
|
||
IN PKDPC Dpc,
|
||
IN PVOID DeferredContext,
|
||
IN PVOID SystemArgument1,
|
||
IN PVOID SystemArgument2
|
||
);
|
||
|
||
NDIS_STATUS
|
||
NbfReceiveIndication(
|
||
IN NDIS_HANDLE BindingContext,
|
||
IN NDIS_HANDLE ReceiveContext,
|
||
IN PVOID HeaderBuffer,
|
||
IN UINT HeaderBufferSize,
|
||
IN PVOID LookaheadBuffer,
|
||
IN UINT LookaheadBufferSize,
|
||
IN UINT PacketSize
|
||
);
|
||
|
||
VOID
|
||
NbfGeneralReceiveHandler (
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN NDIS_HANDLE ReceiveContext,
|
||
IN PHARDWARE_ADDRESS SourceAddress,
|
||
IN PTP_LINK Link,
|
||
IN PVOID HeaderBuffer,
|
||
IN UINT PacketSize,
|
||
IN PDLC_FRAME DlcHeader,
|
||
IN UINT DlcSize,
|
||
IN BOOLEAN Loopback
|
||
);
|
||
|
||
VOID
|
||
NbfReceiveComplete (
|
||
IN NDIS_HANDLE BindingContext
|
||
);
|
||
|
||
VOID
|
||
NbfProcessWanDelayedQueue(
|
||
IN PVOID Parameter
|
||
);
|
||
|
||
VOID
|
||
NbfTransferDataComplete(
|
||
IN NDIS_HANDLE BindingContext,
|
||
IN PNDIS_PACKET NdisPacket,
|
||
IN NDIS_STATUS Status,
|
||
IN UINT BytesTransferred
|
||
);
|
||
|
||
|
||
VOID
|
||
NbfTransferLoopbackData (
|
||
OUT PNDIS_STATUS NdisStatus,
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN NDIS_HANDLE ReceiveContext,
|
||
IN UINT ByteOffset,
|
||
IN UINT BytesToTransfer,
|
||
IN PNDIS_PACKET Packet,
|
||
OUT PUINT BytesTransferred
|
||
);
|
||
|
||
|
||
//
|
||
// Routines in UFRAMES.C, the UI-frame NBF frame processor.
|
||
//
|
||
|
||
NTSTATUS
|
||
NbfIndicateDatagram(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN PTP_ADDRESS Address,
|
||
IN PUCHAR Dsdu,
|
||
IN ULONG Length
|
||
);
|
||
|
||
NTSTATUS
|
||
NbfProcessUi(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN PHARDWARE_ADDRESS SourceAddress,
|
||
IN PUCHAR Header,
|
||
IN PUCHAR DlcHeader,
|
||
IN ULONG DlcLength,
|
||
IN PUCHAR SourceRouting,
|
||
IN UINT SourceRoutingLength,
|
||
OUT PTP_ADDRESS * DatagramAddress
|
||
);
|
||
|
||
//
|
||
// Routines in IFRAMES.C, the I-frame NBF frame processor.
|
||
//
|
||
|
||
VOID
|
||
NbfAcknowledgeDataOnlyLast(
|
||
IN PTP_CONNECTION Connection,
|
||
IN ULONG MessageLength
|
||
);
|
||
|
||
VOID
|
||
NbfProcessIIndicate(
|
||
IN BOOLEAN Command,
|
||
IN BOOLEAN PollFinal,
|
||
IN PTP_LINK Link,
|
||
IN PUCHAR DlcHeader,
|
||
IN UINT DlcIndicatedLength,
|
||
IN UINT DlcTotalLength,
|
||
IN NDIS_HANDLE ReceiveContext,
|
||
IN BOOLEAN Loopback
|
||
);
|
||
|
||
NTSTATUS
|
||
ProcessIndicateData(
|
||
IN PTP_CONNECTION Connection,
|
||
IN PUCHAR DlcHeader,
|
||
IN UINT DlcIndicatedLength,
|
||
IN PUCHAR DataHeader,
|
||
IN UINT DataTotalLength,
|
||
IN NDIS_HANDLE ReceiveContext,
|
||
IN BOOLEAN Last,
|
||
IN BOOLEAN Loopback
|
||
);
|
||
|
||
//
|
||
// Routines in RCV.C (data copying routines for receives).
|
||
//
|
||
|
||
NTSTATUS
|
||
NbfTdiReceive(
|
||
IN PIRP Irp
|
||
);
|
||
|
||
NTSTATUS
|
||
NbfTdiReceiveDatagram(
|
||
IN PIRP Irp
|
||
);
|
||
|
||
//
|
||
// Routines in FRAMESND.C, the UI-frame (non-link) shipper.
|
||
//
|
||
|
||
VOID
|
||
NbfSendNameQuery(
|
||
IN PTP_CONNECTION Connection,
|
||
IN BOOLEAN SourceRoutingOptional
|
||
);
|
||
|
||
VOID
|
||
NbfSendNameRecognized(
|
||
IN PTP_ADDRESS Address,
|
||
IN UCHAR LocalSessionNumber, // LSN assigned to session.
|
||
IN PNBF_HDR_CONNECTIONLESS Header,
|
||
IN PHARDWARE_ADDRESS SourceAddress,
|
||
IN PUCHAR SourceRouting,
|
||
IN UINT SourceRoutingLength
|
||
);
|
||
|
||
VOID
|
||
NbfSendNameInConflict(
|
||
IN PTP_ADDRESS Address,
|
||
IN PUCHAR ConflictingName
|
||
);
|
||
|
||
NTSTATUS
|
||
NbfSendAddNameQuery(
|
||
IN PTP_ADDRESS Address
|
||
);
|
||
|
||
VOID
|
||
NbfSendSessionInitialize(
|
||
IN PTP_CONNECTION Connection
|
||
);
|
||
|
||
VOID
|
||
NbfSendSessionConfirm(
|
||
IN PTP_CONNECTION Connection
|
||
);
|
||
|
||
VOID
|
||
NbfSendSessionEnd(
|
||
IN PTP_CONNECTION Connection,
|
||
IN BOOLEAN Abort
|
||
);
|
||
|
||
VOID
|
||
NbfSendNoReceive(
|
||
IN PTP_CONNECTION Connection
|
||
);
|
||
|
||
VOID
|
||
NbfSendReceiveContinue(
|
||
IN PTP_CONNECTION Connection
|
||
);
|
||
|
||
VOID
|
||
NbfSendReceiveOutstanding(
|
||
IN PTP_CONNECTION Connection
|
||
);
|
||
|
||
VOID
|
||
NbfSendDataAck(
|
||
IN PTP_CONNECTION Connection
|
||
);
|
||
|
||
VOID
|
||
NbfSendSabme(
|
||
IN PTP_LINK Link,
|
||
IN BOOLEAN PollFinal
|
||
);
|
||
|
||
VOID
|
||
NbfSendDisc(
|
||
IN PTP_LINK Link,
|
||
IN BOOLEAN PollFinal
|
||
);
|
||
|
||
VOID
|
||
NbfSendUa(
|
||
IN PTP_LINK Link,
|
||
IN BOOLEAN PollFinal
|
||
);
|
||
|
||
VOID
|
||
NbfSendDm(
|
||
IN PTP_LINK Link,
|
||
IN BOOLEAN PollFinal
|
||
);
|
||
|
||
VOID
|
||
NbfSendRr(
|
||
IN PTP_LINK Link,
|
||
IN BOOLEAN Command,
|
||
IN BOOLEAN PollFinal
|
||
);
|
||
|
||
#if 0
|
||
|
||
//
|
||
// These functions are not currently called, so they are commented
|
||
// out.
|
||
//
|
||
|
||
VOID
|
||
NbfSendRnr(
|
||
IN PTP_LINK Link,
|
||
IN BOOLEAN Command,
|
||
IN BOOLEAN PollFinal
|
||
);
|
||
|
||
VOID
|
||
NbfSendTest(
|
||
IN PTP_LINK Link,
|
||
IN BOOLEAN Command,
|
||
IN BOOLEAN PollFinal,
|
||
IN PMDL Psdu
|
||
);
|
||
|
||
VOID
|
||
NbfSendFrmr(
|
||
IN PTP_LINK Link,
|
||
IN BOOLEAN PollFinal
|
||
);
|
||
|
||
#endif
|
||
|
||
VOID
|
||
NbfSendXid(
|
||
IN PTP_LINK Link,
|
||
IN BOOLEAN Command,
|
||
IN BOOLEAN PollFinal
|
||
);
|
||
|
||
VOID
|
||
NbfSendRej(
|
||
IN PTP_LINK Link,
|
||
IN BOOLEAN Command,
|
||
IN BOOLEAN PollFinal
|
||
);
|
||
|
||
NTSTATUS
|
||
NbfCreateConnectionlessFrame(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
OUT PTP_UI_FRAME *OuterFrame
|
||
);
|
||
|
||
VOID
|
||
NbfDestroyConnectionlessFrame(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN PTP_UI_FRAME RawFrame
|
||
);
|
||
|
||
VOID
|
||
NbfSendUIFrame(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN PTP_UI_FRAME RawFrame,
|
||
IN BOOLEAN Loopback
|
||
);
|
||
|
||
VOID
|
||
NbfSendUIMdlFrame(
|
||
IN PTP_ADDRESS Address
|
||
);
|
||
|
||
VOID
|
||
NbfSendDatagramCompletion(
|
||
IN PTP_ADDRESS Address,
|
||
IN PNDIS_PACKET NdisPacket,
|
||
IN NDIS_STATUS NdisStatus
|
||
);
|
||
|
||
//
|
||
// Routines in FRAMECON.C, the NetBIOS Frames Protocol Frame Constructors.
|
||
// To understand the various constant parameters to these functions (such
|
||
// as special data1 & data2 values, see NBFCONST.H for details.
|
||
//
|
||
|
||
VOID
|
||
ConstructAddGroupNameQuery(
|
||
IN PNBF_HDR_CONNECTIONLESS RawFrame,// frame buffer to format.
|
||
IN USHORT Correlator, // correlator for ADD_NAME_RESPONSE.
|
||
IN PNAME GroupName // NetBIOS group name to be added.
|
||
);
|
||
|
||
VOID
|
||
ConstructAddNameQuery(
|
||
IN PNBF_HDR_CONNECTIONLESS RawFrame,// frame buffer to format.
|
||
IN USHORT Correlator, // correlator for ADD_NAME_RESPONSE.
|
||
IN PNAME Name // NetBIOS name to be added.
|
||
);
|
||
|
||
VOID
|
||
ConstructNameInConflict(
|
||
IN PNBF_HDR_CONNECTIONLESS RawFrame,// frame buffer to format.
|
||
IN PNAME ConflictingName, // NetBIOS name that is conflicting.
|
||
IN PNAME SendingPermanentName // NetBIOS permanent node name of sender.
|
||
);
|
||
|
||
VOID
|
||
ConstructStatusQuery(
|
||
IN PNBF_HDR_CONNECTIONLESS RawFrame,// frame buffer to format.
|
||
IN UCHAR RequestType, // type of request, defined below.
|
||
IN USHORT BufferLength, // length of user's status buffer.
|
||
IN USHORT Correlator, // correlator for STATUS_RESPONSE.
|
||
IN PNAME ReceiverName, // NetBIOS name of receiver.
|
||
IN PNAME SendingPermanentName // NetBIOS permanent node name of sender.
|
||
);
|
||
|
||
VOID
|
||
ConstructTerminateTrace(
|
||
IN PNBF_HDR_CONNECTIONLESS RawFrame // frame buffer to format.
|
||
);
|
||
|
||
VOID
|
||
ConstructDatagram(
|
||
IN PNBF_HDR_CONNECTIONLESS RawFrame,// frame buffer to format.
|
||
IN PNAME ReceiverName, // NetBIOS name of receiver.
|
||
IN PNAME SenderName // NetBIOS name of sender.
|
||
);
|
||
|
||
VOID
|
||
ConstructDatagramBroadcast(
|
||
IN PNBF_HDR_CONNECTIONLESS RawFrame,// frame buffer to format.
|
||
IN PNAME SenderName // NetBIOS name of sender.
|
||
);
|
||
|
||
VOID
|
||
ConstructNameQuery(
|
||
IN PNBF_HDR_CONNECTIONLESS RawFrame,// frame buffer to format.
|
||
IN UCHAR NameType, // type of name.
|
||
IN UCHAR LocalSessionNumber, // LSN assigned to session (0=FIND_NAME).
|
||
IN USHORT Correlator, // correlator in NAME_RECOGNIZED.
|
||
IN PNAME SenderName, // NetBIOS name of sender.
|
||
IN PNAME ReceiverName // NetBIOS name of sender.
|
||
);
|
||
|
||
VOID
|
||
ConstructAddNameResponse(
|
||
IN PNBF_HDR_CONNECTIONLESS RawFrame,// frame buffer to format.
|
||
IN UCHAR NameType, // type of name.
|
||
IN USHORT Correlator, // correlator from ADD_[GROUP_]NAME_QUERY.
|
||
IN PNAME Name // NetBIOS name being responded to.
|
||
);
|
||
|
||
VOID
|
||
ConstructNameRecognized(
|
||
IN PNBF_HDR_CONNECTIONLESS RawFrame,// frame buffer to format.
|
||
IN UCHAR NameType, // type of name.
|
||
IN UCHAR LocalSessionNumber, // LSN assigned to session.
|
||
IN USHORT NameQueryCorrelator, // correlator from NAME_QUERY.
|
||
IN USHORT Correlator, // correlator expected from next response.
|
||
IN PNAME SenderName, // NetBIOS name of sender.
|
||
IN PNAME ReceiverName // NetBIOS name of receiver.
|
||
);
|
||
|
||
VOID
|
||
ConstructStatusResponse(
|
||
IN PNBF_HDR_CONNECTIONLESS RawFrame,// frame buffer to format.
|
||
IN UCHAR RequestType, // type of request, defined below.
|
||
IN BOOLEAN Truncated, // data is truncated.
|
||
IN BOOLEAN DataOverflow, // too much data for user's buffer.
|
||
IN USHORT DataLength, // length of data sent.
|
||
IN USHORT Correlator, // correlator from STATUS_QUERY.
|
||
IN PNAME ReceivingPermanentName, // NetBIOS permanent node name of receiver.
|
||
IN PNAME SenderName // NetBIOS name of sender.
|
||
);
|
||
|
||
VOID
|
||
ConstructDataAck(
|
||
IN PNBF_HDR_CONNECTION RawFrame, // frame buffer to format.
|
||
IN USHORT Correlator, // correlator from DATA_ONLY_LAST.
|
||
IN UCHAR LocalSessionNumber, // session number of SENDER.
|
||
IN UCHAR RemoteSessionNumber // session number of RECEIVER.
|
||
);
|
||
|
||
VOID
|
||
ConstructDataOnlyLast(
|
||
IN PNBF_HDR_CONNECTION RawFrame, // frame buffer to format.
|
||
IN BOOLEAN Resynched, // TRUE if we are resynching.
|
||
IN USHORT Correlator, // correlator for RECEIVE_CONTINUE.
|
||
IN UCHAR LocalSessionNumber, // session number of SENDER.
|
||
IN UCHAR RemoteSessionNumber // session number of RECEIVER.
|
||
);
|
||
|
||
VOID
|
||
ConstructSessionConfirm(
|
||
IN PNBF_HDR_CONNECTION RawFrame, // frame buffer to format.
|
||
IN UCHAR Options, // bitflag options, defined below.
|
||
IN USHORT MaximumUserBufferSize, // max size of user frame on session.
|
||
IN USHORT Correlator, // correlator from SESSION_INITIALIZE.
|
||
IN UCHAR LocalSessionNumber, // session number of SENDER.
|
||
IN UCHAR RemoteSessionNumber // session number of RECEIVER.
|
||
);
|
||
|
||
VOID
|
||
ConstructSessionEnd(
|
||
IN PNBF_HDR_CONNECTION RawFrame, // frame buffer to format.
|
||
IN USHORT Reason, // reason for termination, defined below.
|
||
IN UCHAR LocalSessionNumber, // session number of SENDER.
|
||
IN UCHAR RemoteSessionNumber // session number of RECEIVER.
|
||
);
|
||
|
||
VOID
|
||
ConstructSessionInitialize(
|
||
IN PNBF_HDR_CONNECTION RawFrame, // frame buffer to format.
|
||
IN UCHAR Options, // bitflag options, defined below.
|
||
IN USHORT MaximumUserBufferSize, // max size of user frame on session.
|
||
IN USHORT NameRecognizedCorrelator, // correlator from NAME_RECOGNIZED.
|
||
IN USHORT Correlator, // correlator for SESSION_CONFIRM.
|
||
IN UCHAR LocalSessionNumber, // session number of SENDER.
|
||
IN UCHAR RemoteSessionNumber // session number of RECEIVER.
|
||
);
|
||
|
||
VOID
|
||
ConstructNoReceive(
|
||
IN PNBF_HDR_CONNECTION RawFrame, // frame buffer to format.
|
||
IN USHORT Options, // option bitflags, defined below.
|
||
IN USHORT BytesAccepted, // number of bytes accepted.
|
||
IN UCHAR LocalSessionNumber, // session number of SENDER.
|
||
IN UCHAR RemoteSessionNumber // session number of RECEIVER.
|
||
);
|
||
|
||
VOID
|
||
ConstructReceiveOutstanding(
|
||
IN PNBF_HDR_CONNECTION RawFrame, // frame buffer to format.
|
||
IN USHORT BytesAccepted, // number of bytes accepted.
|
||
IN UCHAR LocalSessionNumber, // session number of SENDER.
|
||
IN UCHAR RemoteSessionNumber // session number of RECEIVER.
|
||
);
|
||
|
||
VOID
|
||
ConstructReceiveContinue(
|
||
IN PNBF_HDR_CONNECTION RawFrame, // frame buffer to format.
|
||
IN USHORT Correlator, // correlator from DATA_FIRST_MIDDLE
|
||
IN UCHAR LocalSessionNumber, // session number of SENDER.
|
||
IN UCHAR RemoteSessionNumber // session number of RECEIVER.
|
||
);
|
||
|
||
#if 0
|
||
VOID
|
||
ConstructSessionAlive(
|
||
IN PNBF_HDR_CONNECTION RawFrame // frame buffer to format.
|
||
);
|
||
#endif
|
||
|
||
//
|
||
// Routines in nbfndis.c.
|
||
//
|
||
|
||
#if DBG
|
||
PUCHAR
|
||
NbfGetNdisStatus (
|
||
IN NDIS_STATUS NdisStatus
|
||
);
|
||
#endif
|
||
|
||
//
|
||
// Routines in nbfdrvr.c
|
||
//
|
||
|
||
VOID
|
||
NbfWriteResourceErrorLog(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN NTSTATUS ErrorCode,
|
||
IN ULONG UniqueErrorValue,
|
||
IN ULONG BytesNeeded,
|
||
IN ULONG ResourceId
|
||
);
|
||
|
||
VOID
|
||
NbfWriteGeneralErrorLog(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN NTSTATUS ErrorCode,
|
||
IN ULONG UniqueErrorValue,
|
||
IN NTSTATUS FinalStatus,
|
||
IN PWSTR SecondString,
|
||
IN ULONG DumpDataCount,
|
||
IN ULONG DumpData[]
|
||
);
|
||
|
||
VOID
|
||
NbfWriteOidErrorLog(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN NTSTATUS ErrorCode,
|
||
IN NTSTATUS FinalStatus,
|
||
IN PWSTR AdapterString,
|
||
IN ULONG OidValue
|
||
);
|
||
|
||
VOID
|
||
NbfFreeResources(
|
||
IN PDEVICE_CONTEXT DeviceContext
|
||
);
|
||
|
||
|
||
extern
|
||
ULONG
|
||
NbfInitializeOneDeviceContext(
|
||
OUT PNDIS_STATUS NdisStatus,
|
||
IN PDRIVER_OBJECT DriverObject,
|
||
IN PCONFIG_DATA NbfConfig,
|
||
IN PUNICODE_STRING BindName,
|
||
IN PUNICODE_STRING ExportName,
|
||
IN PVOID SystemSpecific1,
|
||
IN PVOID SystemSpecific2
|
||
);
|
||
|
||
|
||
extern
|
||
VOID
|
||
NbfReInitializeDeviceContext(
|
||
OUT PNDIS_STATUS NdisStatus,
|
||
IN PDRIVER_OBJECT DriverObject,
|
||
IN PCONFIG_DATA NbfConfig,
|
||
IN PUNICODE_STRING BindName,
|
||
IN PUNICODE_STRING ExportName,
|
||
IN PVOID SystemSpecific1,
|
||
IN PVOID SystemSpecific2
|
||
);
|
||
|
||
//
|
||
// routines in nbfcnfg.c
|
||
//
|
||
|
||
NTSTATUS
|
||
NbfConfigureTransport (
|
||
IN PUNICODE_STRING RegistryPath,
|
||
IN PCONFIG_DATA * ConfigData
|
||
);
|
||
|
||
NTSTATUS
|
||
NbfGetExportNameFromRegistry(
|
||
IN PUNICODE_STRING RegistryPath,
|
||
IN PUNICODE_STRING BindName,
|
||
OUT PUNICODE_STRING ExportName
|
||
);
|
||
|
||
//
|
||
// Routines in nbfndis.c
|
||
//
|
||
|
||
NTSTATUS
|
||
NbfRegisterProtocol (
|
||
IN PUNICODE_STRING NameString
|
||
);
|
||
|
||
VOID
|
||
NbfDeregisterProtocol (
|
||
VOID
|
||
);
|
||
|
||
|
||
NTSTATUS
|
||
NbfInitializeNdis (
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN PCONFIG_DATA ConfigInfo,
|
||
IN PUNICODE_STRING AdapterString
|
||
);
|
||
|
||
VOID
|
||
NbfCloseNdis (
|
||
IN PDEVICE_CONTEXT DeviceContext
|
||
);
|
||
|
||
|
||
//
|
||
// Routines in action.c
|
||
//
|
||
|
||
NTSTATUS
|
||
NbfTdiAction(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN PIRP Irp
|
||
);
|
||
|
||
VOID
|
||
NbfActionQueryIndication(
|
||
PDEVICE_CONTEXT DeviceContext,
|
||
PNBF_HDR_CONNECTIONLESS UiFrame
|
||
);
|
||
|
||
VOID
|
||
NbfActionDatagramIndication(
|
||
PDEVICE_CONTEXT DeviceContext,
|
||
PNBF_HDR_CONNECTIONLESS UiFrame,
|
||
ULONG Length
|
||
);
|
||
|
||
VOID
|
||
NbfStopControlChannel(
|
||
IN PDEVICE_CONTEXT DeviceContext,
|
||
IN USHORT ChannelIdentifier
|
||
);
|
||
|
||
|
||
//
|
||
// Routines in nbfdebug.c
|
||
//
|
||
|
||
#if DBG
|
||
|
||
VOID
|
||
DisplayOneFrame(
|
||
PTP_PACKET Packet
|
||
);
|
||
|
||
VOID
|
||
NbfDisplayUIFrame(
|
||
PTP_UI_FRAME OuterFrame
|
||
);
|
||
|
||
VOID
|
||
NbfFormattedDump(
|
||
PCHAR far_p,
|
||
ULONG len
|
||
);
|
||
|
||
#endif
|
||
|
||
//
|
||
// Routines in nbflog.c
|
||
//
|
||
|
||
#if PKT_LOG
|
||
|
||
VOID
|
||
NbfLogRcvPacket(
|
||
PTP_CONNECTION Connection,
|
||
PTP_LINK Link,
|
||
PUCHAR Header,
|
||
UINT TotalLength,
|
||
UINT AvailLength
|
||
);
|
||
|
||
VOID
|
||
NbfLogSndPacket(
|
||
PTP_LINK Link,
|
||
PTP_PACKET Packet
|
||
);
|
||
|
||
VOID
|
||
NbfLogIndPacket(
|
||
PTP_CONNECTION Connection,
|
||
PUCHAR Header,
|
||
UINT TotalLength,
|
||
UINT AvailLength,
|
||
UINT TakenLength,
|
||
ULONG Status
|
||
);
|
||
|
||
#endif // PKT_LOG
|
||
|
||
#endif // def _NBFPROCS_
|