summaryrefslogtreecommitdiffstats
path: root/private/ntos/nbt/inc/vxdprocs.h
diff options
context:
space:
mode:
Diffstat (limited to 'private/ntos/nbt/inc/vxdprocs.h')
-rw-r--r--private/ntos/nbt/inc/vxdprocs.h1121
1 files changed, 1121 insertions, 0 deletions
diff --git a/private/ntos/nbt/inc/vxdprocs.h b/private/ntos/nbt/inc/vxdprocs.h
new file mode 100644
index 000000000..b24946af6
--- /dev/null
+++ b/private/ntos/nbt/inc/vxdprocs.h
@@ -0,0 +1,1121 @@
+/**********************************************************************/
+/** Microsoft Windows/NT **/
+/** Copyright(c) Microsoft Corp., 1993 **/
+/**********************************************************************/
+
+/*
+ vxdprocs.h
+
+ This file contains VxD specific types/manifests for the NBT driver
+
+
+ FILE HISTORY:
+ Johnl 29-Mar-1993 Created
+
+*/
+
+#ifndef _VXDPROCS_H_
+#define _VXDPROCS_H_
+
+//--------------------------------------------------------------------
+//
+// Define some ndis stuff here because tdivxd.h needs it however we can't
+// include ndis3\inc\ndis.h because it conflicts with ntconfig.h and we
+// can't take out ntconfig.h because it has definitions needed by other
+// header files...grrrr....
+//
+
+#ifdef CHICAGO
+#ifndef NDIS_STDCALL
+#define NDIS_STDCALL 1
+#endif
+#include <vmm.h>
+#undef PAGE
+#define PAGE _PTEXT
+#endif
+
+#ifdef NDIS_STDCALL
+#define NDIS_API __stdcall
+#else
+#define NDIS_API
+#endif
+
+//
+// Ndis Buffer
+//
+
+#define BUFFER_POOL_SIGN (UINT)0X4C50424E /* NBPL */
+#define BUFFER_SIGN (UINT)0x4655424e /* NBUF */
+
+typedef INT NDIS_SPIN_LOCK, * PNDIS_SPIN_LOCK;
+
+struct _NDIS_BUFFER;
+typedef struct _NDIS_BUFFER_POOL {
+ UINT Signature; //character signature for debug "NBPL"
+ NDIS_SPIN_LOCK SpinLock; //to serialize access to the buffer pool
+ struct _NDIS_BUFFER *FreeList; //linked list of free slots in pool
+ UINT BufferLength; //amount needed for each buffer descriptor
+ UCHAR Buffer[1]; //actual pool memory
+ } NDIS_BUFFER_POOL, * PNDIS_BUFFER_POOL;
+
+#ifdef NDIS_STDCALL
+typedef struct _NDIS_BUFFER {
+ struct _NDIS_BUFFER *Next; //pointer to next buffer descriptor in chain
+ PVOID VirtualAddress; //linear address of this buffer
+ PNDIS_BUFFER_POOL Pool; //pointer to pool so we can free to correct pool
+ UINT Length; //length of this buffer
+ UINT Signature; //character signature for debug "NBUF"
+} NDIS_BUFFER, * PNDIS_BUFFER;
+
+#else
+
+typedef struct _NDIS_BUFFER {
+ UINT Signature; //character signature for debug "NBUF"
+ struct _NDIS_BUFFER *Next; //pointer to next buffer descriptor in chain
+ PVOID VirtualAddress; //linear address of this buffer
+ PNDIS_BUFFER_POOL Pool; //pointer to pool so we can free to correct pool
+ UINT Length; //length of this buffer
+} NDIS_BUFFER, * PNDIS_BUFFER;
+#endif
+
+#define NDIS_STATUS_SUCCESS 0 // Used by CTEinitBlockStruc macro
+
+//
+// Possible data types
+//
+
+typedef enum _NDIS_PARAMETER_TYPE {
+ NdisParameterInteger,
+ NdisParameterHexInteger,
+ NdisParameterString,
+ NdisParameterMultiString
+} NDIS_PARAMETER_TYPE, *PNDIS_PARAMETER_TYPE;
+
+typedef struct _STRING {
+ USHORT Length;
+ USHORT MaximumLength;
+ PUCHAR Buffer;
+} STRING, *PSTRING;
+
+typedef STRING NDIS_STRING, *PNDIS_STRING;
+typedef PVOID NDIS_HANDLE, *PNDIS_HANDLE;
+
+//
+// To store configuration information
+//
+typedef struct _NDIS_CONFIGURATION_PARAMETER {
+ NDIS_PARAMETER_TYPE ParameterType;
+ union {
+ ULONG IntegerData;
+ NDIS_STRING StringData;
+ } ParameterData;
+} NDIS_CONFIGURATION_PARAMETER, *PNDIS_CONFIGURATION_PARAMETER;
+
+typedef ULONG NDIS_STATUS;
+typedef NDIS_STATUS *PNDIS_STATUS;
+
+VOID NDIS_API
+NdisOpenProtocolConfiguration(
+ OUT PNDIS_STATUS Status,
+ OUT PNDIS_HANDLE ConfigurationHandle,
+ IN PNDIS_STRING ProtocolName
+ );
+
+VOID NDIS_API
+NdisReadConfiguration(
+ OUT PNDIS_STATUS Status,
+ OUT PNDIS_CONFIGURATION_PARAMETER *ParameterValue,
+ IN NDIS_HANDLE ConfigurationHandle,
+ IN PNDIS_STRING Parameter,
+ IN NDIS_PARAMETER_TYPE ParameterType
+ );
+
+VOID NDIS_API
+NdisCloseConfiguration(
+ IN NDIS_HANDLE ConfigurationHandle
+ );
+
+//--------------------------------------------------------------------
+
+#include <tdivxd.h>
+#include <tdistat.h>
+
+//--------------------------------------------------------------------
+//
+// Initializes a TA_NETBIOS_ADDRESS structure
+//
+// ptanb - Pointer to the TA_NETBIOS_ADDRESS
+// pName - Pointer to the netbios name this address structure represents
+//
+#define InitNBAddress( ptanb, pName ) \
+{ \
+ (ptanb)->TAAddressCount = 1 ; \
+ (ptanb)->Address[0].AddressLength = sizeof( TDI_ADDRESS_NETBIOS );\
+ (ptanb)->Address[0].AddressType = TDI_ADDRESS_TYPE_NETBIOS ; \
+ (ptanb)->Address[0].Address[0].NetbiosNameType = 0 ; \
+ CTEMemCopy( (ptanb)->Address[0].Address[0].NetbiosName, \
+ pName, \
+ NCBNAMSZ ) ; \
+}
+
+//
+// Initializes a TDI_CONNECTION_INFORMATION structure for Netbios
+//
+// pConnInfo - Pointer to TDI_CONNECTION_INFORMATION structure
+// ptanb - same as for InitNBAddress
+// pName - same as for InitNBAddress
+//
+#define InitNBTDIConnectInfo( pConnInfo, ptanb, pName ) \
+{ \
+ InitNBAddress( ((PTA_NETBIOS_ADDRESS)ptanb), (pName) ) ; \
+ (pConnInfo)->RemoteAddressLength = sizeof( TA_NETBIOS_ADDRESS ) ; \
+ (pConnInfo)->RemoteAddress = (ptanb) ; \
+}
+
+//
+// Initializes an NDIS buffer (doesn't allocate memory)
+//
+// pndisBuff - Pointer to NDIS buffer to initialize
+// pvData - Pointer to buffer data
+// cbLen - Length of user data (in bytes)
+// pndisBuffnext - Next NDIS buffer in chain (or NULL if last)
+//
+#define InitNDISBuff( pndisBuff, pvData, cbLen, pndisBuffNext ) \
+{ \
+ (pndisBuff)->Signature = BUFFER_SIGN ; \
+ (pndisBuff)->Next = (pndisBuffNext) ; \
+ (pndisBuff)->Length = (cbLen) ; \
+ (pndisBuff)->VirtualAddress = (pvData) ; \
+ (pndisBuff)->Pool = NULL ; \
+}
+
+//
+// Proper NCB error type
+//
+typedef uchar NCBERR ;
+
+//
+// This is a private NCB command used for adding name number 0 to the
+// name table. It is submitted directly by the Nbt driver during
+// initialization. Note that if a client tries to submit an NCB with
+// this command we'll return illegal command.
+//
+#define NCBADD_PERMANENT_NAME 0xff
+
+//
+// Last valid NCB session or name number
+//
+#define MAX_NCB_NUMS 254
+
+//
+// When a send or receive tick count reaches this value, it's timed out
+//
+#define NCB_TIMED_OUT 1
+
+//
+// A timeout of this value means the NCB will never timeout
+//
+#define NCB_INFINITE_TIME_OUT 0
+
+//--------------------------------------------------------------------
+//
+// Receieve session data context, set in VxdReceive.
+// Allocated on the heap (too big for ncb_reserve).
+//
+#define RCVCONT_SIGN 0x1900BEEF
+typedef struct _RCV_CONTEXT
+{
+ union
+ {
+ LIST_ENTRY ListEntry ; // Used when NCB is put on RcvHead
+ EventRcvBuffer evrcvbuf ; // Used for doing actual receive
+ // (after removed from RcvHead)
+ } ;
+ UINT Signature ;
+ tLOWERCONNECTION * pLowerConnId ; // Where data is arriving from
+ NCB * pNCB ; // Pointer to NCB
+ NDIS_BUFFER ndisBuff ; // Transport fills this buffer
+ UCHAR RTO ; // 1/2 second ticks till timeout
+ USHORT usFlags; // in case different from default
+} RCV_CONTEXT, *PRCV_CONTEXT ;
+
+//
+// Allocate, initialize and free a receive context structure
+//
+#define GetRcvContext( ppContext ) \
+ (STATUS_SUCCESS == NbtGetBuffer( &NbtConfig.RcvContextFreeList, \
+ (PLIST_ENTRY*)ppContext, \
+ eNBT_RCV_CONTEXT ))
+
+#define FreeRcvContext( pRcvContext ) \
+{ \
+ ASSERT( (pRcvContext)->Signature == RCVCONT_SIGN ) ; \
+ InsertTailList( &NbtConfig.RcvContextFreeList, \
+ &(pRcvContext)->ListEntry ) ; \
+}
+
+#define InitRcvContext( pRcvCont, pRcvLowerConn, pRcvNCB ) \
+{ \
+ pRcvCont->Signature = RCVCONT_SIGN ; \
+ pRcvCont->pLowerConnId= pRcvLowerConn ; \
+ pRcvCont->pNCB = pRcvNCB ; \
+}
+
+//--------------------------------------------------------------------
+//
+// Send session data context, set in VxdSend.
+// Stored in ncb_reserve
+//
+typedef struct _SEND_CONTEXT
+{
+ LIST_ENTRY ListEntry ; // Kept on timeout queue
+ tSESSIONHDR * pHdr ; // Allocated session header
+ UCHAR STO ; // 1/2 second ticks till timeout
+} SEND_CONTEXT, *PSEND_CONTEXT ;
+
+
+#define GetSessionHdr( ppHdr ) \
+ (STATUS_SUCCESS == NbtGetBuffer( &NbtConfig.SessionBufferFreeList, \
+ (PLIST_ENTRY*)ppHdr, \
+ eNBT_SESSION_HDR ))
+
+#define FreeSessionHdr( pSessionHdr ) \
+{ \
+ InsertTailList( &NbtConfig.SessionBufferFreeList, \
+ (PLIST_ENTRY) pSessionHdr ) ; \
+}
+
+//--------------------------------------------------------------------
+//
+// TDI Send context (used by TdiSend)
+//
+// When handling the datagram completion routines, we need to set up
+// another completion routine. We store the old completion routine
+// in this structure
+//
+typedef union _TDI_SEND_CONTEXT
+{
+ LIST_ENTRY ListEntry ; // Only used when on buffer free list
+
+ struct
+ {
+ PVOID NewContext ;
+ NBT_COMPLETION OldRequestNotifyObject ;
+ PVOID OldContext ;
+ NDIS_BUFFER ndisHdr ; // Generally NBT message
+ NDIS_BUFFER ndisData1 ; // Data or SMB
+ NDIS_BUFFER ndisData2 ; // Data if ndisData1 is an SMB
+ } ;
+} TDI_SEND_CONTEXT, * PTDI_SEND_CONTEXT ;
+
+//
+// Allocates a TDI_SEND_CONTEXT
+//
+#define GetSendContext( ppContext ) \
+ (STATUS_SUCCESS == NbtGetBuffer( &NbtConfig.SendContextFreeList, \
+ (PLIST_ENTRY*)ppContext, \
+ eNBT_SEND_CONTEXT ))
+
+//
+// Frees a send context structure and its allocated memory
+//
+#define FreeSendContext( psendCont ) \
+{ \
+ InsertTailList( &NbtConfig.SendContextFreeList, \
+ &(psendCont)->ListEntry ) ; \
+}
+
+//--------------------------------------------------------------------
+//
+// Lana related stuff
+//
+
+#define NBT_MAX_LANAS 8
+
+typedef struct
+{
+ tDEVICECONTEXT * pDeviceContext ; // Adapter for this Lana
+} LANA_ENTRY, *PLANA_ENTRY ;
+
+extern LANA_ENTRY LanaTable[NBT_MAX_LANAS] ;
+
+//--------------------------------------------------------------------
+//
+// Procedures in ncb.c
+//
+//
+NCBERR MapTDIStatus2NCBErr( TDI_STATUS status ) ;
+
+//
+// Get the correct adapter for this NCBs Lana
+//
+tDEVICECONTEXT *
+GetDeviceContext(
+ NCB * pNCB
+ );
+
+BOOL
+NbtWouldLoopback(
+ ULONG IpAddr
+ );
+
+extern BOOL fNCBCompleted ; // Wait NCB completed before returning to submitter
+extern BOOL fWaitingForNCB ; // We are blocked waiting for a Wait NCB to complete
+extern CTEBlockStruc WaitNCBBlock ; // Wait on this until signaled in completion
+extern UCHAR LanaBase ;
+
+#define IPINFO_BUFF_SIZE (sizeof(IPInfo) + MAX_IP_NETS * sizeof(NetInfo))
+
+//--------------------------------------------------------------------
+//
+// externs from fileio.c
+//
+extern PUCHAR pFileBuff;
+extern PUCHAR pFilePath;
+
+//--------------------------------------------------------------------
+//
+// TDI Dispatch table (exported from vtdi.386)
+//
+extern TDIDispatchTable * TdiDispatch ;
+
+//
+// Wrappers for interfacing to the TDI Dispatch table
+//
+#define TdiVxdOpenAddress TdiDispatch->TdiOpenAddressEntry
+#define TdiVxdCloseAddress TdiDispatch->TdiCloseAddressEntry
+#define TdiVxdOpenConnection TdiDispatch->TdiOpenConnectionEntry
+#define TdiVxdCloseConnection TdiDispatch->TdiCloseConnectionEntry
+#define TdiVxdAssociateAddress TdiDispatch->TdiAssociateAddressEntry
+#define TdiVxdDisAssociateAddress TdiDispatch->TdiDisAssociateAddressEntry
+#define TdiVxdConnect TdiDispatch->TdiConnectEntry
+#define TdiVxdDisconnect TdiDispatch->TdiDisconnectEntry
+#define TdiVxdListen TdiDispatch->TdiListenEntry
+#define TdiVxdAccept TdiDispatch->TdiAcceptEntry
+#define TdiVxdReceive TdiDispatch->TdiReceiveEntry
+#define TdiVxdSend TdiDispatch->TdiSendEntry
+#define TdiVxdSendDatagram TdiDispatch->TdiSendDatagramEntry
+#define TdiVxdReceiveDatagram TdiDispatch->TdiReceiveDatagramEntry
+#define TdiVxdSetEventHandler TdiDispatch->TdiSetEventEntry
+#define TdiVxdQueryInformationEx TdiDispatch->TdiQueryInformationExEntry
+#define TdiVxdSetInformationEx TdiDispatch->TdiSetInformationExEntry
+
+//--------------------------------------------------------------------
+//
+// NTSTATUS to TDI_STATUS mappings.
+//
+// Rather then convert from NTSTATUS to TDI_STATUS (then sometimes back to
+// NTSTATUS) we'll just use TDI_STATUS codes everywhere (and map to NCBERR
+// when returning codes to the Netbios interface).
+//
+#undef STATUS_SUCCESS
+#undef STATUS_INSUFFICIENT_RESOURCES
+#undef STATUS_ADDRESS_ALREADY_EXISTS
+#undef STATUS_TOO_MANY_ADDRESSES
+#undef STATUS_INVALID_ADDRESS
+#undef STATUS_BUFFER_OVERFLOW
+#undef STATUS_TRANSACTION_INVALID_TYPE
+#undef STATUS_TRANSACTION_INVALID_ID
+#undef STATUS_EVENT_DONE
+#undef STATUS_TRANSACTION_TIMED_OUT
+#undef STATUS_EVENT_PENDING
+#undef STATUS_PENDING
+#undef STATUS_BAD_NETWORK_NAME
+#undef STATUS_REQUEST_NOT_ACCEPTED
+#undef STATUS_INVALID_CONNECTION
+#undef STATUS_DATA_NOT_ACCEPTED
+#undef STATUS_MORE_PROCESSING_REQUIRED
+#undef STATUS_IO_TIMEOUT
+#undef STATUS_TIMEOUT
+#undef STATUS_GRACEFUL_DISCONNECT
+#undef STATUS_CONNECTION_RESET
+
+#define STATUS_SUCCESS TDI_SUCCESS
+//#define STATUS_UNSUCCESSFUL
+#define STATUS_MORE_PROCESSING_REQUIRED TDI_MORE_PROCESSING
+#define STATUS_BAD_NETWORK_NAME TDI_INVALID_CONNECTION
+#define STATUS_DATA_NOT_ACCEPTED TDI_NOT_ACCEPTED
+//#define STATUS_REMOTE_NOT_LISTENING
+//#define STATUS_DUPLICATE_NAME
+//#define STATUS_INVALID_PARAMETER
+//#define STATUS_OBJECT_NAME_COLLISION Duplicate Name
+//#define STATUS_SHARING_VIOLATION Duplicate Name
+#define STATUS_CONNECTION_INVALID TDI_INVALID_CONNECTION
+#define STATUS_INVALID_CONNECTION TDI_INVALID_CONNECTION
+#define STATUS_INSUFFICIENT_RESOURCES TDI_NO_RESOURCES
+#define STATUS_ADDRESS_ALREADY_EXISTS TDI_ADDR_IN_USE
+#define STATUS_TOO_MANY_ADDRESSES TDI_NO_FREE_ADDR
+#define STATUS_INVALID_ADDRESS TDI_ADDR_INVALID
+#define STATUS_BUFFER_OVERFLOW TDI_BUFFER_OVERFLOW
+#define STATUS_TRANSACTION_INVALID_TYPE TDI_BAD_EVENT_TYPE
+#define STATUS_TRANSACTION_INVALID_ID TDI_BAD_OPTION // ??
+#define STATUS_EVENT_DONE TDI_EVENT_DONE
+#define STATUS_TRANSACTION_TIMED_OUT TDI_TIMED_OUT
+#define STATUS_IO_TIMEOUT TDI_TIMED_OUT
+#define STATUS_TIMEOUT TDI_TIMED_OUT
+#define STATUS_EVENT_PENDING TDI_PENDING
+#define STATUS_PENDING TDI_PENDING
+#define STATUS_GRACEFUL_DISCONNECT TDI_GRACEFUL_DISC
+#define STATUS_CONNECTION_RESET TDI_CONNECTION_RESET
+
+//
+// This is the "Name deregistered but not deleted because of
+// active sessions" error code.
+//
+#define STATUS_NRC_ACTSES 0xCA000001
+
+//
+// The NT_SUCCESS macro looks at the high bytes of the errr code which isn't
+// appropriate for our mapping to TDI_STATUS error codes
+//
+#undef NT_SUCCESS
+#define NT_SUCCESS(err) ((err==TDI_SUCCESS)||(err==TDI_PENDING))
+
+//--------------------------------------------------------------------
+//
+// General porting macros
+//
+//
+//--------------------------------------------------------------------
+
+//
+// Note that the ExInterlocked* routines (in ntos\ex\i386) do a spinlock
+// for MP machines. Since we aren't MP we shouldn't need the spin lock.
+// We shouldn't need to disable interrupts either.
+//
+#define ExInterlockedInsertTailList(list, entry, spinlock ) \
+ InsertTailList( (list), (entry) )
+
+#define ExInterlockedInsertHeadList(list, entry, spinlock ) \
+ InsertHeadList( (list), (entry) )
+
+//
+// These two definitions must be kept keep a couple of NT macros use
+// the ExInterlocked* macros
+//
+#ifdef InterlockedIncrement
+#undef InterlockedIncrement
+#endif
+#ifdef InterlockedIncrementLong
+#undef InterlockedIncrementLong
+#endif
+#define InterlockedIncrement(n) \
+ CTEInterlockedIncrementLong( n )
+#define InterlockedIncrementLong InterlockedIncrement
+
+#ifdef InterlockedDecrement
+#undef InterlockedDecrement
+#endif
+#ifdef InterlockedDecrementLong
+#undef InterlockedDecrementLong
+#endif
+#define InterlockedDecrement(n) \
+ CTEInterlockedDecrementLong( n )
+#define InterlockedDecrementLong InterlockedDecrement
+
+//--------------------------------------------------------------------
+//
+// Debug helper macros
+//
+#undef ASSERT
+#undef ASSERTMSG
+#ifdef DEBUG
+ #include <vxddebug.h>
+
+ extern DWORD DebugFlags ;
+ extern char DBOut[4096] ;
+ extern char szOutput[1024];
+ extern int iCurPos ;
+ void NbtDebugOut( char * ) ;
+
+ #define DBGFLAG_ALL (0x00000001) // Everything else
+ #define DBGFLAG_LMHOST (0x00000002)
+ #define DBGFLAG_KDPRINTS (0x00000004) // Jim's KdPrint output
+ #define DBGFLAG_ERROR (0x00000010)
+ #define DBGFLAG_AUX_OUTPUT (0x00000080)
+
+ #define DbgPrint( s ) \
+ if ( DebugFlags & DBGFLAG_ALL ) \
+ { \
+ VxdSprintf( szOutput, s ) ; \
+ VxdCopyToDBOut() ; \
+ NbtDebugOut( DBOut+iCurPos ) ; \
+ }
+
+ #define DbgPrintNum( n ) \
+ if ( DebugFlags & DBGFLAG_ALL ) \
+ { \
+ VxdSprintf( szOutput, "%x", n ) ; \
+ VxdCopyToDBOut() ; \
+ NbtDebugOut( DBOut+iCurPos ) ; \
+ }
+
+ #undef KdPrint
+ #define KdPrint( s ) \
+ if ( DebugFlags & DBGFLAG_KDPRINTS ) \
+ { \
+ VxdPrintf s ; \
+ }
+
+ //
+ // Conditional print routines
+ //
+ #define CDbgPrint( flag, s ) \
+ if ( DebugFlags & (flag) ) \
+ { \
+ VxdSprintf( szOutput, s ) ; \
+ VxdCopyToDBOut() ; \
+ NbtDebugOut( DBOut+iCurPos ) ; \
+ }
+
+ #define CDbgPrintNum( flag, n ) \
+ if ( DebugFlags & (flag) ) \
+ { \
+ VxdSprintf( szOutput, "%x", n ) ; \
+ VxdCopyToDBOut() ; \
+ NbtDebugOut( DBOut+iCurPos ) ; \
+ }
+
+ #define DbgBreak() _asm int 3
+ #define ASSERT( exp ) CTEAssert( exp )
+ #define ASSERTMSG( msg, exp ) CTEAssert( exp )
+ //
+ // REQUIRE is an ASSERT that keeps the expression under non-debug
+ // builds
+ //
+ #define REQUIRE( exp ) ASSERT( exp )
+
+ //
+ // Consistency checks of the interrupt vector table to help watch
+ // for NULL pointer writes
+ //
+ extern BYTE abVecTbl[256] ;
+ #define INIT_NULL_PTR_CHECK() memcpy( abVecTbl, 0, sizeof( abVecTbl ))
+ #define CHECK_MEM() if ( sizeof(abVecTbl) != VxdRtlCompareMemory( 0, abVecTbl, sizeof(abVecTbl)) ) \
+ { \
+ DbgPrint("Vector table corrupt at " ) ; \
+ DbgPrintNum( VxdRtlCompareMemory( 0, abVecTbl, sizeof(abVecTbl) ) ) ;\
+ DbgPrint("\n\r") ; \
+ _asm int 3 \
+ } \
+ CTECheckMem(__FILE__) ;
+#else
+ #define DbgPrint( s )
+ #define DbgPrintNum( n )
+ #define DbgBreak()
+ #undef KdPrint
+ #define KdPrint( s )
+ #define ASSERT( exp ) { ; }
+ #define ASSERTMSG( msg, exp ) { ; }
+ #define REQUIRE( exp ) { exp ; }
+ #define INIT_NULL_PTR_CHECK()
+ #define CHECK_MEM()
+ #define CDbgPrint( flag, s )
+ #define CDbgPrintNum( flag, n )
+#endif
+
+//---------------------------------------------------------------------
+//
+// FROM tdihndlr.c
+//
+TDI_STATUS
+TdiReceiveHandler (
+ IN PVOID ReceiveEventContext,
+ IN PVOID ConnectionContext,
+ IN USHORT ReceiveFlags,
+ IN ULONG BytesIndicated,
+ IN ULONG BytesAvailable,
+ OUT PULONG BytesTaken,
+ IN PVOID Data,
+ EventRcvBuffer * pevrcvbuf
+ );
+
+TDI_STATUS
+ReceiveAnyHandler ( // Handles NCBRCVANY commands, is
+ IN PVOID ReceiveEventContext, // called after all other receive
+ IN PVOID ConnectionContext, // handlers
+ IN USHORT ReceiveFlags,
+ IN ULONG BytesIndicated,
+ IN ULONG BytesAvailable,
+ OUT PULONG BytesTaken,
+ IN PVOID Data,
+ PVOID * ppBuffer // Pointer to ListEntry of RCV_CONTEXT
+ ) ;
+
+TDI_STATUS
+VxdDisconnectHandler ( // Cleans up Netbios stuff for remote
+ IN PVOID DisconnectEventContext, // disconnects
+ IN PVOID ConnectionContext,
+ IN PVOID DisconnectData,
+ IN ULONG DisconnectInformationLength,
+ IN PVOID pDisconnectInformation,
+ IN ULONG DisconnectIndicators
+ ) ;
+
+VOID
+CompletionRcv(
+ IN PVOID pContext,
+ IN uint tdistatus,
+ IN uint BytesRcvd
+ );
+
+TDI_STATUS
+TdiConnectHandler (
+ IN PVOID pConnectEventContext,
+ IN int RemoteAddressLength,
+ IN PVOID pRemoteAddress,
+ IN int UserDataLength,
+ IN PVOID pUserData,
+ IN int OptionsLength,
+ IN PVOID pOptions,
+ IN PVOID * pAcceptingID,
+ IN ConnectEventInfo * pEventInfo
+ );
+
+TDI_STATUS
+TdiDisconnectHandler (
+ PVOID EventContext,
+ PVOID ConnectionContext,
+ ULONG DisconnectDataLength,
+ PVOID DisconnectData,
+ ULONG DisconnectInformationLength,
+ PVOID DisconnectInformation,
+ ULONG DisconnectIndicators // Is this the Flags field?
+ );
+
+TDI_STATUS
+TdiRcvDatagramHandler(
+ IN PVOID pDgramEventContext,
+ IN int SourceAddressLength,
+ IN PVOID pSourceAddress,
+ IN int OptionsLength,
+ IN PVOID pOptions,
+ IN UINT ReceiveDatagramFlags,
+ IN ULONG BytesIndicated,
+ IN ULONG BytesAvailable,
+ OUT ULONG *pBytesTaken,
+ IN PVOID pTsdu,
+ OUT EventRcvBuffer * * ppBuffer //OUT PIRP *pIoRequestPacket
+ );
+TDI_STATUS
+TdiRcvNameSrvHandler(
+ IN PVOID pDgramEventContext,
+ IN int SourceAddressLength,
+ IN PVOID pSourceAddress,
+ IN int OptionsLength,
+ IN PVOID pOptions,
+ IN UINT ReceiveDatagramFlags,
+ IN ULONG BytesIndicated,
+ IN ULONG BytesAvailable,
+ OUT ULONG *pBytesTaken,
+ IN PVOID pTsdu,
+ OUT EventRcvBuffer * * ppBuffer //OUT PIRP *pIoRequestPacket
+ );
+TDI_STATUS
+TdiErrorHandler (
+ IN PVOID Context,
+ IN ULONG Status
+ );
+
+VOID
+CompletionRcvDgram(
+ IN PVOID Context,
+ IN UINT tdistatus,
+ IN UINT RcvdSize
+ ) ;
+
+//---------------------------------------------------------------------
+//
+// FROM init.c
+//
+
+PVOID
+CTEAllocInitMem(
+ IN ULONG cbBuff ) ;
+
+NTSTATUS
+VxdReadIniString(
+ IN LPTSTR pchKeyName,
+ IN OUT LPTSTR * ppStringBuff
+ ) ;
+
+NTSTATUS CreateDeviceObject(
+ IN tNBTCONFIG *pConfig,
+ IN ULONG IpAddr,
+ IN ULONG IpMask,
+ IN ULONG IpNameServer,
+ IN ULONG IpBackupServer,
+ IN ULONG IpDnsServer,
+ IN ULONG IpDnsBackupServer,
+ IN UCHAR MacAddr[],
+ IN UCHAR IpIndex
+ ) ;
+
+void GetNameServerAddress( ULONG IpAddr,
+ PULONG pIpNameServer);
+
+void GetDnsServerAddress( ULONG IpAddr,
+ PULONG pIpNameServer);
+
+#define COUNT_NS_ADDR 4 // Maximum number of name server addresses
+//---------------------------------------------------------------------
+//
+// FROM vxdfile.asm
+//
+
+HANDLE
+VxdFileOpen(
+ IN char * pchFile ) ;
+
+ULONG
+VxdFileRead(
+ IN HANDLE hFile,
+ IN ULONG BytesToRead,
+ IN BYTE * pBuff ) ;
+
+VOID
+VxdFileClose(
+ IN HANDLE hFile ) ;
+
+PUCHAR
+VxdWindowsPath(
+ );
+
+//---------------------------------------------------------------------
+//
+// FROM vnbtd.asm
+//
+
+ULONG
+GetProfileHex(
+ IN HANDLE ParametersHandle, // Not used
+ IN PCHAR ValueName,
+ IN ULONG DefaultValue,
+ IN ULONG MinimumValue
+ );
+
+ULONG
+GetProfileInt(
+ IN HANDLE ParametersHandle, // Not used
+ IN PCHAR ValueName,
+ IN ULONG DefaultValue,
+ IN ULONG MinimumValue
+ );
+
+TDI_STATUS DhcpQueryInfo( UINT Type, PVOID pBuff, UINT * pSize ) ;
+
+//---------------------------------------------------------------------
+//
+// FROM tdiout.c
+//
+NTSTATUS VxdDisconnectWait( tLOWERCONNECTION * pLowerConn,
+ tDEVICECONTEXT * pDeviceContext,
+ ULONG Flags,
+ PVOID Timeout) ;
+
+NTSTATUS VxdScheduleDelayedCall( tDGRAM_SEND_TRACKING * pTracker,
+ PVOID pClientContext,
+ PVOID ClientCompletion,
+ PVOID CallBackRoutine,
+ tDEVICECONTEXT *pDeviceContext ) ;
+
+//---------------------------------------------------------------------
+//
+// FROM timer.c
+//
+BOOL CheckForTimedoutNCBs( CTEEvent *pEvent, PVOID pCont ) ;
+VOID StopTimeoutTimer( VOID );
+NTSTATUS StartRefreshTimer( VOID );
+
+//---------------------------------------------------------------------
+//
+// FROM tdicnct.c
+//
+NTSTATUS CloseAddress( HANDLE hAddress ) ;
+
+
+//---------------------------------------------------------------------
+//
+// FROM wfw.c - Snowball specific routines
+//
+#ifndef CHICAGO
+
+BOOL GetActiveLanasFromIP( VOID );
+
+#endif //!CHICAGO
+
+
+//---------------------------------------------------------------------
+//
+// FROM chic.c - Chicago specific routines
+//
+#ifdef CHICAGO
+
+NTSTATUS DestroyDeviceObject(
+ tNBTCONFIG *pConfig,
+ ULONG IpAddr
+ );
+
+BOOL IPRegisterAddrChangeHandler( PVOID AddChangeHandler, BOOL );
+
+TDI_STATUS IPNotification( ULONG IpAddress,
+ ULONG IpMask,
+ PVOID pDevNode,
+ USHORT IPContext,
+ BOOL fNew );
+
+BOOL VxdInitLmHostsSupport( PUCHAR pchLmHostPath, USHORT ulPathSize );
+
+VOID SaveNameDnsServerAddrs( VOID );
+BOOL VxdOpenNdis( VOID );
+VOID VxdCloseNdis( VOID );
+
+
+VOID ReleaseNbtConfigMem( VOID );
+
+NTSTATUS VxdUnload( LPSTR pchModuleName );
+
+#endif //CHICAGO
+
+//--------------------------------------------------------------------
+//
+// Procedures in vxdisol.c
+//
+//
+NCBERR VxdOpenName( tDEVICECONTEXT * pDeviceContext, NCB * pNCB ) ;
+NCBERR VxdCloseName( tDEVICECONTEXT * pDeviceContext, NCB * pNCB ) ;
+NCBERR VxdCall( tDEVICECONTEXT * pDeviceContext, NCB * pNCB ) ;
+NCBERR VxdListen( tDEVICECONTEXT * pDeviceContext, NCB * pNCB ) ;
+NCBERR VxdDgramSend( tDEVICECONTEXT * pDeviceContext, NCB * pNCB ) ;
+NCBERR VxdDgramReceive( tDEVICECONTEXT * pDeviceContext, NCB * pNCB ) ;
+NCBERR VxdReceiveAny( tDEVICECONTEXT *pDeviceContext, NCB * pNCB ) ;
+NCBERR VxdReceive( tDEVICECONTEXT * pDeviceContext, NCB * pNCB, BOOL fReceive ) ;
+NCBERR VxdHangup( tDEVICECONTEXT * pDeviceContext, NCB * pNCB ) ;
+NCBERR VxdCancel( tDEVICECONTEXT * pDeviceContext, NCB * pNCB ) ;
+NCBERR VxdSend( tDEVICECONTEXT * pDeviceContext, NCB * pNCB ) ;
+NCBERR VxdSessionStatus( tDEVICECONTEXT * pDeviceContext, NCB * pNCB ) ;
+VOID DelayedSessEstablish( PVOID pContext );
+
+
+//--------------------------------------------------------------------
+//
+// Procedures in dns.c
+//
+//
+PCHAR
+DnsStoreName(
+ OUT PCHAR pDest,
+ IN PCHAR pName,
+ IN PCHAR pDomainName,
+ IN enum eNSTYPE eNsType
+ );
+
+VOID
+DnsExtractName(
+ IN PCHAR pNameHdr,
+ IN LONG NumBytes,
+ OUT PCHAR pName,
+ OUT PULONG pNameSize
+ );
+
+VOID
+ProcessDnsResponse(
+ IN tDEVICECONTEXT *pDeviceContext,
+ IN PVOID pSrcAddress,
+ IN tNAMEHDR UNALIGNED *pNameHdr,
+ IN LONG lNumBytes,
+ IN USHORT OpCodeFlags
+ );
+
+VOID
+DnsCompletion(
+ PVOID pContext,
+ PVOID pContext2,
+ tTIMERQENTRY *pTimerQEntry
+ );
+
+//
+// These routines all have "Direct" at the end of the routine name
+// because they are used exclusively for name queries to the DNS
+// server to resolve DNS names and not NetBIOS names.
+//
+
+VOID
+ProcessDnsResponseDirect(
+ IN tDEVICECONTEXT *pDeviceContext,
+ IN PVOID pSrcAddress,
+ IN tNAMEHDR UNALIGNED *pNameHdr,
+ IN LONG lNumBytes,
+ IN USHORT OpCodeFlags
+ );
+
+ULONG
+DoDnsResolveDirect(
+ PNCB pncb,
+ PUCHAR pzDnsName,
+ PULONG pIpAddressList
+ );
+
+BOOL
+DoDnsCancelDirect(
+ PNCB pncb
+ );
+
+VOID
+DnsCompletionDirect(
+ PVOID pContext,
+ PVOID pContext2,
+ tTIMERQENTRY *pTimerQEntry
+ );
+
+PDNS_DIRECT_WORK_ITEM_CONTEXT
+FindContextDirect(
+ USHORT TransactionId
+ );
+
+VOID
+DnsActualCompletionDirect(
+ IN NBT_WORK_ITEM_CONTEXT * pnbtContext
+ );
+
+VOID
+DnsUnlinkAndCompleteDirect(
+ IN PDNS_DIRECT_WORK_ITEM_CONTEXT pContext
+ );
+
+NTSTATUS
+UdpSendDNSBcastDirect(
+ IN PDNS_DIRECT_WORK_ITEM_CONTEXT pContext,
+ IN ULONG Retries,
+ IN ULONG Timeout
+ );
+
+VOID
+SendDNSBcastDoneDirect(
+ IN PVOID pContext,
+ IN NTSTATUS status,
+ IN ULONG lInfo
+ );
+
+PDNS_DIRECT_SEND_CONTEXT
+CreateSendContextDirect(
+ IN PCHAR pName,
+ IN PCHAR pchDomainName,
+ OUT PVOID *pHdrs,
+ OUT PULONG pLength,
+ IN PDNS_DIRECT_WORK_ITEM_CONTEXT pContext
+ );
+
+VOID
+IpToAscii(
+ IN DWORD IpAddress,
+ IN OUT PCHAR pzAscii
+ );
+
+//
+// Flag passed to TdiSend indicating we are dealing with a chain send
+// and not a normal send.
+//
+#define CHAIN_SEND_FLAG 0x80
+typedef struct _tBUFFERCHAINSEND
+{
+ tBUFFER tBuff ; // Must be first member of this structure!!
+ PVOID pBuffer2 ;
+ ULONG Length2 ;
+} tBUFFERCHAINSEND ;
+
+
+//
+// Flag for pConnectEle->Flags indicating whether the client has been
+// notified the session is dead (by completing an NCB with NRC_SCLOSED)
+//
+#define NB_CLIENT_NOTIFIED 0x01
+
+
+//
+// Translates the name number/logical session number to the appropriate
+// structure pointer
+//
+NCBERR VxdFindClientElement( tDEVICECONTEXT * pDeviceContext,
+ UCHAR ncbnum,
+ tCLIENTELE * * ppClientEle,
+ enum CLIENT_TYPE Type ) ;
+NCBERR VxdFindConnectElement( tDEVICECONTEXT * pDeviceContext,
+ NCB * pNCB,
+ tCONNECTELE * * ppConnectEle ) ;
+NCBERR VxdFindLSN( tDEVICECONTEXT * pDeviceContext,
+ tCONNECTELE * pConnectEle,
+ UCHAR * plsn ) ;
+NCBERR VxdFindNameNum( tDEVICECONTEXT * pDeviceContext,
+ tADDRESSELE * pAddressEle,
+ UCHAR * pNum ) ;
+//
+// Used by Register/Unregister for selecting either the name table or the
+// session table from the device context
+//
+typedef enum
+{
+ NB_NAME,
+ NB_SESSION
+} NB_TABLE_TYPE ;
+
+BOOL NBRegister( tDEVICECONTEXT * pDeviceContext,
+ UCHAR * pNCBNum,
+ PVOID pElem,
+ NB_TABLE_TYPE NbTable ) ;
+BOOL NBUnregister( tDEVICECONTEXT * pDeviceContext,
+ UCHAR NCBNum,
+ NB_TABLE_TYPE NbTable ) ;
+
+TDI_STATUS VxdCompleteSessionNcbs( tDEVICECONTEXT * pDeviceContext,
+ tCONNECTELE * pConnEle ) ;
+
+NCBERR VxdCleanupAddress( tDEVICECONTEXT * pDeviceContext,
+ NCB * pNCB,
+ tCLIENTELE * pClientEle,
+ UCHAR NameNum,
+ BOOL fDeleteAddress ) ;
+
+BOOL ActiveSessions( tCLIENTELE * pClientEle ) ;
+
+//
+// This structure holds context information while we are waiting for
+// a session setup to complete (either listen or call)
+//
+// It is stored in the ncb_reserve field of the NCB
+//
+typedef struct _SESS_SETUP_CONTEXT
+{
+ TDI_CONNECTION_INFORMATION * pRequestConnect ; //
+ TDI_CONNECTION_INFORMATION * pReturnConnect ; // Name who answered the listen
+ tCONNECTELE * pConnEle ;
+ UCHAR fIsWorldListen ; // Listenning for '*'?
+} SESS_SETUP_CONTEXT, *PSESS_SETUP_CONTEXT ;
+
+
+void VxdTearDownSession( tDEVICECONTEXT * pDevCont,
+ tCONNECTELE * pConnEle,
+ PSESS_SETUP_CONTEXT pCont,
+ NCB * pNCB ) ;
+
+//
+// Finishes off a Netbios request (fill in NCB fields, call the post
+// routine etc.). Is macroed as CTEIoComplete.
+//
+VOID VxdIoComplete( PCTE_IRP pirp, NTSTATUS status, ULONG cbExtra ) ;
+
+ULONG
+_stdcall
+
+ VNBT_NCB_X( PNCB pNCB,
+ PUCHAR pzDnsName,
+ PULONG pIpAddress,
+ PVOID pExtended,
+ ULONG fFlag ) ;
+
+ULONG
+_stdcall
+VNBT_LANA_MASK(
+ );
+
+#endif //_VXDPROCS_H_