windows-nt/Source/XPSP1/NT/net/nwlink/spx/spxaddr.h
2020-09-26 16:20:57 +08:00

427 lines
10 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
Copyright (c) 1989-1993 Microsoft Corporation
Module Name:
spxaddr.h
Abstract:
Author:
Adam Barr (adamba ) Original Version
Nikhil Kamkolkar (nikhilk) 11-November-1993
Environment:
Kernel mode
Revision History:
--*/
#define DYNSKT_RANGE_START 0x4000
#define DYNSKT_RANGE_END 0x7FFF
#define SOCKET_UNIQUENESS 1
// This structure is pointed to by the FsContext field in the FILE_OBJECT
// for this Address. This structure is the base for all activities on
// the open file object within the transport provider. All active connections
// on the address point to this structure, although no queues exist here to do
// work from. This structure also maintains a reference to an ADDRESS
// structure, which describes the address that it is bound to.
#define AFREF_CREATE 0
#define AFREF_VERIFY 1
#define AFREF_INDICATION 2
#define AFREF_CONN_ASSOC 3
#define AFREF_TOTAL 4
typedef struct _SPX_ADDR_FILE {
#if DBG
ULONG saf_RefTypes[AFREF_TOTAL];
#endif
CSHORT saf_Type;
CSHORT saf_Size;
// number of references to this object.
ULONG saf_RefCount;
// Linkage in address list.
struct _SPX_ADDR_FILE * saf_Next;
struct _SPX_ADDR_FILE * saf_GlobalNext;
// List of associated connection/active or otherwise
struct _SPX_CONN_FILE * saf_AssocConnList;
// the current state of the address file structure; this is either open or
// closing
USHORT saf_Flags;
// address to which we are bound, pointer to its lock.
struct _SPX_ADDR * saf_Addr;
CTELock * saf_AddrLock;
#ifdef ISN_NT
// easy backlink to file object.
PFILE_OBJECT saf_FileObject;
#endif
// device to which we are attached.
struct _DEVICE * saf_Device;
// This holds the request used to close this address file,
// for pended completion.
PREQUEST saf_CloseReq;
// This function pointer points to a connection indication handler for this
// Address. Any time a connect request is received on the address, this
// routine is invoked.
PTDI_IND_CONNECT saf_ConnHandler;
PVOID saf_ConnHandlerCtx;
// The following function pointer always points to a TDI_IND_DISCONNECT
// handler for the address.
PTDI_IND_DISCONNECT saf_DiscHandler;
PVOID saf_DiscHandlerCtx;
// The following function pointer always points to a TDI_IND_RECEIVE
// event handler for connections on this address.
PTDI_IND_RECEIVE saf_RecvHandler;
PVOID saf_RecvHandlerCtx;
// Send possible handler
PTDI_IND_SEND_POSSIBLE saf_SendPossibleHandler;
PVOID saf_SendPossibleHandlerCtx;
// !!!We do not do datagrams or expedited data!!!
// The following function pointer always points to a TDI_IND_ERROR
// handler for the address.
PTDI_IND_ERROR saf_ErrHandler;
PVOID saf_ErrHandlerCtx;
PVOID saf_ErrHandlerOwner;
} SPX_ADDR_FILE, *PSPX_ADDR_FILE;
#define SPX_ADDRFILE_OPENING 0x0000 // not yet open for business
#define SPX_ADDRFILE_OPEN 0x0001 // open for business
#define SPX_ADDRFILE_CLOSING 0x0002 // closing
#define SPX_ADDRFILE_STREAM 0x0004 // Opened for stream mode operation
#define SPX_ADDRFILE_CONNIND 0x0008 // Connect ind in progress
#define SPX_ADDRFILE_SPX2 0x0010 // Attempt SPX2 address file
#define SPX_ADDRFILE_NOACKWAIT 0x0020 // Dont delay acks on assoc connections
#define SPX_ADDRFILE_IPXHDR 0x0040 // Pass ipx hdr on all assoc connections
// ***STOP*** ***STOP*** ***STOP*** ***STOP*** ***STOP*** ***STOP*** ***STOP***
// If you are adding any more states to this beyond 0x0080, MAKE SURE to go
// in code and change statements like (Flags & SPX_***) to
// ((Flags & SPX_**) != 0)!!! I dont want to make that change that at this stage.
// ***STOP*** ***STOP*** ***STOP*** ***STOP*** ***STOP*** ***STOP*** ***STOP***
// This structure defines an ADDRESS, or active transport address,
// maintained by the transport provider. It contains all the visible
// components of the address (such as the TSAP and network name components),
// and it also contains other maintenance parts, such as a reference count,
// ACL, and so on.
#define AREF_ADDR_FILE 0
#define AREF_LOOKUP 1
#define AREF_RECEIVE 2
#define AREF_TOTAL 4
typedef struct _SPX_ADDR {
#if DBG
ULONG sa_RefTypes[AREF_TOTAL];
#endif
USHORT sa_Size;
CSHORT sa_Type;
// number of references to this object.
ULONG sa_RefCount;
// next address/this device object.
struct _SPX_ADDR * sa_Next;
// The following fields are used to maintain state about this address.
// attributes of the address.
ULONG sa_Flags;
// Next addressfile for this address
struct _SPX_ADDR_FILE * sa_AddrFileList;
// List of inactive connections and active connections on this address file.
struct _SPX_CONN_FILE * sa_InactiveConnList;
struct _SPX_CONN_FILE * sa_ActiveConnList;
// This is the list of connections which have a POST_LISTEN on them. They
// do not have a local connection id at this point. But will, when they move
// from here to the ActiveConnList, when the listen is satisfied (no matter
// if the accept has not been posted yet, in the case of non-autoaccept listens)
struct _SPX_CONN_FILE * sa_ListenConnList;
CTELock sa_Lock;
// the socket this address corresponds to.
USHORT sa_Socket;
// device context to which we are attached.
struct _DEVICE * sa_Device;
CTELock * sa_DeviceLock;
#ifdef ISN_NT
// These two can be a union because they are not used
// concurrently.
union {
// This structure is used for checking share access.
SHARE_ACCESS sa_ShareAccess;
// Used for delaying NbfDestroyAddress to a thread so
// we can access the security descriptor.
WORK_QUEUE_ITEM sa_DestroyAddrQueueItem;
} u;
// This structure is used to hold ACLs on the address.
PSECURITY_DESCRIPTOR sa_SecurityDescriptor;
#endif
} SPX_ADDR, *PSPX_ADDR;
#define SPX_ADDR_CLOSING 0x00000001
// ROUTINE PROTOTYPES
VOID
SpxAddrRef(
IN PSPX_ADDR Address);
VOID
SpxAddrLockRef(
IN PSPX_ADDR Address);
VOID
SpxAddrDeref(
IN PSPX_ADDR Address);
VOID
SpxAddrFileRef(
IN PSPX_ADDR_FILE pAddrFile);
VOID
SpxAddrFileLockRef(
IN PSPX_ADDR_FILE pAddrFile);
VOID
SpxAddrFileDeref(
IN PSPX_ADDR_FILE pAddrFile);
PSPX_ADDR
SpxAddrCreate(
IN PDEVICE Device,
IN USHORT Socket);
NTSTATUS
SpxAddrFileCreate(
IN PDEVICE Device,
IN PREQUEST Request,
OUT PSPX_ADDR_FILE * ppAddrFile);
NTSTATUS
SpxAddrOpen(
IN PDEVICE Device,
IN PREQUEST Request);
NTSTATUS
SpxAddrSetEventHandler(
IN PDEVICE Device,
IN PREQUEST pRequest);
NTSTATUS
SpxAddrFileVerify(
IN PSPX_ADDR_FILE pAddrFile);
NTSTATUS
SpxAddrFileStop(
IN PSPX_ADDR_FILE pAddrFile,
IN PSPX_ADDR Address);
NTSTATUS
SpxAddrFileCleanup(
IN PDEVICE Device,
IN PREQUEST Request);
NTSTATUS
SpxAddrFileClose(
IN PDEVICE Device,
IN PREQUEST Request);
PSPX_ADDR
SpxAddrLookup(
IN PDEVICE Device,
IN USHORT Socket);
NTSTATUS
SpxAddrConnByRemoteIdAddrLock(
IN PSPX_ADDR pSpxAddr,
IN USHORT SrcConnId,
IN PBYTE SrcIpxAddr,
OUT struct _SPX_CONN_FILE **ppSpxConnFile);
NTSTATUS
SpxAddrFileDestroy(
IN PSPX_ADDR_FILE pAddrFile);
VOID
SpxAddrDestroy(
IN PVOID Parameter);
USHORT
SpxAddrAssignSocket(
IN PDEVICE Device);
BOOLEAN
SpxAddrExists(
IN PDEVICE Device,
IN USHORT Socket);
NTSTATUS
spxAddrRemoveFromGlobalList(
IN PSPX_ADDR_FILE pSpxAddrFile);
VOID
spxAddrInsertIntoGlobalList(
IN PSPX_ADDR_FILE pSpxAddrFile);
#if DBG
#define SpxAddrReference(_Address, _Type) \
{ \
(VOID)SPX_ADD_ULONG ( \
&(_Address)->sa_RefTypes[_Type],\
1, \
&SpxGlobalInterlock); \
SpxAddrRef (_Address); \
}
#define SpxAddrLockReference(_Address, _Type) \
{ \
(VOID)SPX_ADD_ULONG ( \
&(_Address)->sa_RefTypes[_Type], \
1, \
&SpxGlobalInterlock); \
SpxAddrLockRef (_Address); \
}
#define SpxAddrDereference(_Address, _Type) \
{ \
(VOID)SPX_ADD_ULONG ( \
&(_Address)->sa_RefTypes[_Type], \
(ULONG)-1, \
&SpxGlobalInterlock); \
if (SPX_ADD_ULONG( \
&(_Address)->sa_RefCount, \
(ULONG)-1, \
&(_Address)->sa_Lock) == 1) { \
SpxAddrDestroy (_Address); \
}\
}
#define SpxAddrFileReference(_AddressFile, _Type) \
{ \
(VOID)SPX_ADD_ULONG ( \
&(_AddressFile)->saf_RefTypes[_Type], \
1, \
&SpxGlobalInterlock); \
SpxAddrFileRef (_AddressFile); \
}
#define SpxAddrFileLockReference(_AddressFile, _Type) \
{ \
(VOID)SPX_ADD_ULONG ( \
&(_AddressFile)->saf_RefTypes[_Type], \
1, \
&SpxGlobalInterlock); \
SpxAddrFileLockRef (_AddressFile); \
}
#define SpxAddrFileDereference(_AddressFile, _Type) \
{ \
(VOID)SPX_ADD_ULONG ( \
&(_AddressFile)->saf_RefTypes[_Type], \
(ULONG)-1, \
&SpxGlobalInterlock); \
SpxAddrFileDeref (_AddressFile); \
}
#define SpxAddrFileTransferReference(_AddressFile, _OldType, _NewType) \
{ \
(VOID)SPX_ADD_ULONG ( \
&(_AddressFile)->saf_RefTypes[_NewType], \
1, \
&SpxGlobalInterlock); \
(VOID)SPX_ADD_ULONG ( \
&(_AddressFile)->saf_RefTypes[_OldType], \
(ULONG)-1, \
&SpxGlobalInterlock); \
}
#else // DBG
#define SpxAddrReference(_Address, _Type) \
SPX_ADD_ULONG( \
&(_Address)->sa_RefCount, \
1, \
(_Address)->sa_DeviceLock)
#define SpxAddrLockReference(_Address, _Type) \
SPX_ADD_ULONG( \
&(_Address)->sa_RefCount, \
1, \
(_Address)->sa_DeviceLock);
#define SpxAddrDereference(_Address, _Type) \
if (SPX_ADD_ULONG( \
&(_Address)->sa_RefCount, \
(ULONG)-1, \
&(_Address)->sa_Lock) == 1) { \
SpxAddrDestroy (_Address); \
}
#define SpxAddrFileReference(_AddressFile, _Type) \
SPX_ADD_ULONG( \
&(_AddressFile)->saf_RefCount, \
1, \
(_AddressFile)->saf_AddrLock)
#define SpxAddrFileLockReference(_AddressFile, _Type) \
SPX_ADD_ULONG( \
&(_AddressFile)->saf_RefCount, \
1, \
(_AddressFile)->saf_AddrLock);
#define SpxAddrFileDereference(_AddressFile, _Type) \
if (SPX_ADD_ULONG( \
&(_AddressFile)->saf_RefCount, \
(ULONG)-1, \
(_AddressFile)->saf_AddrLock) == 1) { \
SpxAddrFileDestroy (_AddressFile); \
}
#define SpxAddrFileTransferReference(_AddressFile, _OldType, _NewType)
#endif // DBG