211 lines
7 KiB
C
211 lines
7 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1989-1993 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
spxdev.h
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module contains definitions specific to the
|
|||
|
SPX module of the ISN transport.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Adam Barr (adamba ) Original Version
|
|||
|
Nikhil Kamkolkar (nikhilk) 17-November-1993
|
|||
|
|
|||
|
Environment:
|
|||
|
|
|||
|
Kernel mode
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
|
|||
|
// Hash buckets for SPX_ADDR done using socket number
|
|||
|
#define NUM_SPXADDR_HASH_BUCKETS 8
|
|||
|
#define NUM_SPXADDR_HASH_MASK 7
|
|||
|
#define NUM_SPXCONN_HASH_BUCKETS 8
|
|||
|
#define NUM_SPXCONN_HASH_MASK 7
|
|||
|
|
|||
|
// This structure defines the per-device structure for SPX
|
|||
|
// (one of these is allocated globally).
|
|||
|
#define DREF_CREATE 0
|
|||
|
#define DREF_LOADED 1
|
|||
|
#define DREF_ADAPTER 2
|
|||
|
#define DREF_ADDRESS 3
|
|||
|
#define DREF_ORPHAN 4
|
|||
|
|
|||
|
#define DREF_TOTAL 5
|
|||
|
|
|||
|
typedef struct _DEVICE {
|
|||
|
|
|||
|
PDEVICE_OBJECT dev_DevObj; // the I/O system's device object.
|
|||
|
|
|||
|
#if DBG
|
|||
|
ULONG dev_RefTypes[DREF_TOTAL];
|
|||
|
#endif
|
|||
|
|
|||
|
CSHORT dev_Type; // type of this structure
|
|||
|
USHORT dev_Size; // size of this structure
|
|||
|
|
|||
|
#if DBG
|
|||
|
UCHAR dev_Signature1[4]; // contains "SPX1"
|
|||
|
#endif
|
|||
|
|
|||
|
// activity count/this provider.
|
|||
|
LONG dev_RefCount;
|
|||
|
UCHAR dev_State;
|
|||
|
|
|||
|
// number of adapters IPX is bound to.
|
|||
|
USHORT dev_Adapters;
|
|||
|
|
|||
|
// GLOBAL lock for reference count (used in ExInterlockedXxx calls).
|
|||
|
CTELock dev_Interlock;
|
|||
|
CTELock dev_Lock;
|
|||
|
|
|||
|
// Hash table of lists of addresses opened on this device
|
|||
|
struct _SPX_ADDR * dev_AddrHashTable[NUM_SPXADDR_HASH_BUCKETS];
|
|||
|
|
|||
|
// List of all active connections, later this be a tree.
|
|||
|
struct _SPX_CONN_FILE * dev_GlobalActiveConnList[NUM_SPXCONN_HASH_BUCKETS];
|
|||
|
USHORT dev_NextConnId;
|
|||
|
|
|||
|
// Other configuration parameters.
|
|||
|
// Where the current socket allocation is.
|
|||
|
USHORT dev_CurrentSocket;
|
|||
|
|
|||
|
// Our node and network.
|
|||
|
UCHAR dev_Network[4];
|
|||
|
UCHAR dev_Node[6];
|
|||
|
|
|||
|
// Pointer to the config information from registry
|
|||
|
PCONFIG dev_ConfigInfo;
|
|||
|
|
|||
|
// Control channel identifier
|
|||
|
ULONG dev_CcId;
|
|||
|
|
|||
|
// These are kept around for error logging, and stored right
|
|||
|
// after this structure.
|
|||
|
PWCHAR dev_DeviceName;
|
|||
|
#if defined(_PNP_POWER)
|
|||
|
USHORT dev_DeviceNameLen;
|
|||
|
#else
|
|||
|
ULONG dev_DeviceNameLen;
|
|||
|
#endif _PNP_POWER
|
|||
|
|
|||
|
#if DBG
|
|||
|
UCHAR dev_Signature2[4]; // contains "SPX2"
|
|||
|
#endif
|
|||
|
|
|||
|
// Handle to ndis buffer pool for spx stack.
|
|||
|
NDIS_HANDLE dev_NdisBufferPoolHandle;
|
|||
|
|
|||
|
// registration handle with tdi clients.
|
|||
|
#if defined(_PNP_POWER)
|
|||
|
HANDLE dev_TdiRegistrationHandle;
|
|||
|
#endif _PNP_POWER
|
|||
|
|
|||
|
// This interlock is used to guard access to the statistics
|
|||
|
// define below.
|
|||
|
KSPIN_LOCK dev_StatInterlock; // for ULONG quantities
|
|||
|
KSPIN_LOCK dev_StatSpinLock; // for LARGE_INTEGER quantities
|
|||
|
|
|||
|
// Counters for most of the statistics that SPX maintains;
|
|||
|
// some of these are kept elsewhere. Including the structure
|
|||
|
// itself wastes a little space but ensures that the alignment
|
|||
|
// inside the structure is correct.
|
|||
|
TDI_PROVIDER_STATISTICS dev_Stat;
|
|||
|
|
|||
|
// This resource guards access to the ShareAccess
|
|||
|
// and SecurityDescriptor fields in addresses.
|
|||
|
ERESOURCE dev_AddrResource;
|
|||
|
|
|||
|
// The following structure contains statistics counters for use
|
|||
|
// by TdiQueryInformation and TdiSetInformation. They should not
|
|||
|
// be used for maintenance of internal data structures.
|
|||
|
TDI_PROVIDER_INFO dev_ProviderInfo; // information about this provider.
|
|||
|
|
|||
|
} DEVICE, * PDEVICE;
|
|||
|
|
|||
|
//
|
|||
|
// As part of "doing it ourselves" theme as opposed to the DeviceExtension code,
|
|||
|
// we declare a global SpxDevice that will be used by all.
|
|||
|
//
|
|||
|
//PDEVICE SpxDevice;
|
|||
|
//PDEVICE_OBJECT DeviceObject;
|
|||
|
|
|||
|
// device state definitions
|
|||
|
#if defined(_PNP_POWER)
|
|||
|
#define DEVICE_STATE_CLOSED 0x00 // Initial state
|
|||
|
#define DEVICE_STATE_LOADED 0x01 // Loaded and bound to IPX but no adapters
|
|||
|
#define DEVICE_STATE_OPEN 0x02 // Fully operational
|
|||
|
#define DEVICE_STATE_STOPPING 0x03 // Unload has been initiated, The I/O system
|
|||
|
// will not call us until nobody above has Netbios open.
|
|||
|
#else
|
|||
|
#define DEVICE_STATE_CLOSED 0x00
|
|||
|
#define DEVICE_STATE_OPEN 0x01
|
|||
|
#define DEVICE_STATE_STOPPING 0x02
|
|||
|
#endif _PNP_POWER
|
|||
|
|
|||
|
|
|||
|
// SPX device name
|
|||
|
#define SPX_DEVICE_NAME L"\\Device\\NwlnkSpx"
|
|||
|
|
|||
|
#define SPX_TDI_RESOURCES 9
|
|||
|
|
|||
|
|
|||
|
// MACROS
|
|||
|
#if DBG
|
|||
|
|
|||
|
#define SpxReferenceDevice(_Device, _Type) \
|
|||
|
{ \
|
|||
|
(VOID)SPX_ADD_ULONG ( \
|
|||
|
&(_Device)->dev_RefTypes[_Type], \
|
|||
|
1, \
|
|||
|
&SpxGlobalInterlock); \
|
|||
|
\
|
|||
|
(VOID)InterlockedIncrement ( \
|
|||
|
&(_Device)->dev_RefCount); \
|
|||
|
}
|
|||
|
|
|||
|
#define SpxDereferenceDevice(_Device, _Type) \
|
|||
|
{ \
|
|||
|
(VOID)SPX_ADD_ULONG ( \
|
|||
|
&(_Device)->dev_RefTypes[_Type], \
|
|||
|
(ULONG)-1, \
|
|||
|
&SpxGlobalInterlock); \
|
|||
|
SpxDerefDevice (_Device); \
|
|||
|
}
|
|||
|
|
|||
|
#else
|
|||
|
|
|||
|
#define SpxReferenceDevice(_Device, _Type) \
|
|||
|
{ \
|
|||
|
(VOID)InterlockedIncrement ( \
|
|||
|
&(_Device)->dev_RefCount); \
|
|||
|
}
|
|||
|
|
|||
|
#define SpxDereferenceDevice(_Device, _Type) \
|
|||
|
SpxDerefDevice (_Device)
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
// EXPORTED ROUTINES
|
|||
|
|
|||
|
VOID
|
|||
|
SpxDestroyDevice(
|
|||
|
IN PDEVICE Device);
|
|||
|
|
|||
|
VOID
|
|||
|
SpxDerefDevice(
|
|||
|
IN PDEVICE Device);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SpxInitCreateDevice(
|
|||
|
IN PDRIVER_OBJECT DriverObject,
|
|||
|
IN PUNICODE_STRING DeviceName);
|
|||
|
|