From e611b132f9b8abe35b362e5870b74bce94a1e58e Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 16 May 2020 20:51:50 -0700 Subject: initial commit --- private/ntos/nbt/inc/vxdprocs.h | 1121 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 1121 insertions(+) create mode 100644 private/ntos/nbt/inc/vxdprocs.h (limited to 'private/ntos/nbt/inc/vxdprocs.h') 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 +#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 +#include + +//-------------------------------------------------------------------- +// +// 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 + + 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_ -- cgit v1.2.3