|
|
/*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
srvdata.h
Abstract:
This module defines global data for the LAN Manager server.
Author:
Chuck Lenzmeier (chuckl) 22-Sep-1989
Revision History:
--*/
#ifndef _SRVDATA_
#define _SRVDATA_
//#include <ntos.h>
//#include "lock.h"
//#include "srvconst.h"
//#include "smbtypes.h"
//
// All global variables referenced in this module are defined in
// srvdata.c. See that module for complete descriptions.
//
// The variables referenced herein, because they are part of the driver
// image, are not pageable. However, some of the things pointed to by
// these variables are in the FSP's address space and are pageable.
// These variables are only accessed by the FSP, and only at low IRQL.
// Any data referenced by the FSP at elevated IRQL or by the FSD must
// be nonpageable.
//
//
// Routine to initialize data structures contained herein that cannot
// be statically initialized.
//
VOID SrvInitializeData ( VOID );
//
// Routine to clean up global server data when the driver is unloaded.
//
VOID SrvTerminateData ( VOID );
//
// This is an enum structure that enumerates all the routines in the
// SrvSmbDispatchTable. This is done for convenience only. Note that
// this will only work if this list corresponds exactly to
// SrvSmbDispatchTable.
//
typedef enum _SRV_SMB_INDEX { ISrvSmbIllegalCommand, ISrvSmbCreateDirectory, ISrvSmbDeleteDirectory, ISrvSmbOpen, ISrvSmbCreate, ISrvSmbClose, ISrvSmbFlush, ISrvSmbDelete, ISrvSmbRename, ISrvSmbQueryInformation, ISrvSmbSetInformation, ISrvSmbRead, ISrvSmbWrite, ISrvSmbLockByteRange, ISrvSmbUnlockByteRange, ISrvSmbCreateTemporary, ISrvSmbCheckDirectory, ISrvSmbProcessExit, ISrvSmbSeek, ISrvSmbLockAndRead, ISrvSmbSetInformation2, ISrvSmbQueryInformation2, ISrvSmbLockingAndX, ISrvSmbTransaction, ISrvSmbTransactionSecondary, ISrvSmbIoctl, ISrvSmbIoctlSecondary, ISrvSmbMove, ISrvSmbEcho, ISrvSmbOpenAndX, ISrvSmbReadAndX, ISrvSmbWriteAndX, ISrvSmbFindClose2, ISrvSmbFindNotifyClose, ISrvSmbTreeConnect, ISrvSmbTreeDisconnect, ISrvSmbNegotiate, ISrvSmbSessionSetupAndX, ISrvSmbLogoffAndX, ISrvSmbTreeConnectAndX, ISrvSmbQueryInformationDisk, ISrvSmbSearch, ISrvSmbNtTransaction, ISrvSmbNtTransactionSecondary, ISrvSmbNtCreateAndX, ISrvSmbNtCancel, ISrvSmbOpenPrintFile, ISrvSmbClosePrintFile, ISrvSmbGetPrintQueue, ISrvSmbReadRaw, ISrvSmbWriteRaw, ISrvSmbReadMpx, ISrvSmbWriteMpx, ISrvSmbWriteMpxSecondary } SRV_SMB_INDEX;
//
// Address of the server device object.
//
extern PDEVICE_OBJECT SrvDeviceObject;
//
// Fields describing the state of the FSP.
//
extern BOOLEAN SrvFspActive; // Indicates whether the FSP is running
extern BOOLEAN SrvFspTransitioning; // Indicates that the server is in the
// process of starting up or
// shutting down
extern PEPROCESS SrvServerProcess; // Pointer to the initial system process
extern PEPROCESS SrvSvcProcess; // Pointer to the service controller process
extern BOOLEAN SrvCompletedPNPRegistration; // Indicates whether the FSP has completed
// registering for PNP notifications
//
// Endpoint variables. SrvEndpointCount is used to count the number of
// active endpoints. When the last endpoint is closed, SrvEndpointEvent
// is set so that the thread processing the shutdown request continues
// server termination.
//
extern CLONG SrvEndpointCount; // Number of transport endpoints
extern KEVENT SrvEndpointEvent; // Signaled when no active endpoints
//
// DMA alignment size
//
extern ULONG SrvCacheLineSize;
//
// Global spin locks.
//
extern SRV_GLOBAL_SPIN_LOCKS SrvGlobalSpinLocks;
#if SRVDBG || SRVDBG_HANDLES
//
// Lock used to protect debugging structures.
//
extern SRV_LOCK SrvDebugLock; #endif
//
// SrvConfigurationLock is used to synchronize configuration requests.
//
extern SRV_LOCK SrvConfigurationLock;
//
// SrvStartupShutdownLock is used to synchronize driver starting and stopping
//
extern SRV_LOCK SrvStartupShutdownLock;
//
// SrvEndpointLock serializes access to the global endpoint list and
// all endpoints. Note that the list of connections in each endpoint
// is also protected by this lock.
//
extern SRV_LOCK SrvEndpointLock;
//
// SrvShareLock protects all shares.
//
extern SRV_LOCK SrvShareLock;
//
// The number of processors in the system
//
extern ULONG SrvNumberOfProcessors;
//
// Work queues -- nonblocking, blocking, and critical.
//
#if MULTIPROCESSOR
extern PBYTE SrvWorkQueuesBase; extern PWORK_QUEUE SrvWorkQueues; #else
extern WORK_QUEUE SrvWorkQueues[1]; #endif
extern PWORK_QUEUE eSrvWorkQueues; // used to terminate 'for' loops
extern WORK_QUEUE SrvBlockingWorkQueue; extern ULONG SrvReBalanced; // how often we've picked another CPU
extern ULONG SrvNextBalanceProcessor; // Which processor we'll look for next
extern CLONG SrvBlockingOpsInProgress;
//
// Various list heads.
//
extern LIST_ENTRY SrvNeedResourceQueue; // The need resource queue
extern LIST_ENTRY SrvDisconnectQueue; // The disconnect queue
//
// Queue of connections that needs to be dereferenced.
//
extern SLIST_HEADER SrvBlockOrphanage;
//
// FSP configuration queue. The FSD puts configuration request IRPs
// (from NtDeviceIoControlFile) on this queue, and it is serviced by an
// EX worker thread.
//
extern LIST_ENTRY SrvConfigurationWorkQueue;
//
// This is the number of configuration IRPs which have been queued but not
// yet completed.
//
extern ULONG SrvConfigurationIrpsInProgress;
//
// Work item for running the configuration thread in the context of an
// EX worker thread.
extern WORK_QUEUE_ITEM SrvConfigurationThreadWorkItem[ MAX_CONFIG_WORK_ITEMS ];
//
// Base address of the large block allocated to hold initial normal
// work items (see blkwork.c\SrvAllocateInitialWorkItems).
//
extern PVOID SrvInitialWorkItemBlock;
//
// Work item used to run the resource thread. Booleans used to inform
// the resource thread to continue running.
//
extern WORK_QUEUE_ITEM SrvResourceThreadWorkItem; extern BOOLEAN SrvResourceThreadRunning; extern BOOLEAN SrvResourceDisconnectPending; extern BOOLEAN SrvResourceFreeConnection; extern LONG SrvResourceOrphanedBlocks;
//
// Denial of Service monitoring variables for the Resource Thread
//
#define SRV_DOS_MINIMUM_DOS_WAIT_PERIOD (50*1000*10)
#define SRV_DOS_TEARDOWN_MIN (LONG)MAX((SrvMaxReceiveWorkItemCount>>4),32)
#define SRV_DOS_TEARDOWN_MAX (LONG)(SrvMaxReceiveWorkItemCount>>1)
#define SRV_DOS_INCREASE_TEARDOWN() { \
LONG lTearDown = InterlockedCompareExchange( &SrvDoSWorkItemTearDown, 0, 0 ); \ LONG lNewTearDown = MIN(lTearDown+(lTearDown>>2), SRV_DOS_TEARDOWN_MAX); \ SrvDoSRundownIncreased = TRUE; \ InterlockedCompareExchange( &SrvDoSWorkItemTearDown, lNewTearDown, lTearDown ); \ } #define SRV_DOS_DECREASE_TEARDOWN() { \
LONG lTearDown = InterlockedCompareExchange( &SrvDoSWorkItemTearDown, 0, 0 ); \ LONG lNewTearDown = MAX(lTearDown-(SRV_DOS_TEARDOWN_MIN), SRV_DOS_TEARDOWN_MIN); \ if( lNewTearDown == SRV_DOS_TEARDOWN_MIN ) SrvDoSRundownIncreased = FALSE; \ InterlockedCompareExchange( &SrvDoSWorkItemTearDown, lNewTearDown, lTearDown ); \ } #define SRV_DOS_GET_TEARDOWN() InterlockedCompareExchange( &SrvDoSWorkItemTearDown, 0, 0 )
#define SRV_DOS_IS_TEARDOWN_IN_PROGRESS() InterlockedCompareExchange( &SrvDoSTearDownInProgress, 0, 0 )
#define SRV_DOS_CAN_START_TEARDOWN() !InterlockedCompareExchange( &SrvDoSTearDownInProgress, 1, 0 )
#define SRV_DOS_COMPLETE_TEARDOWN() InterlockedCompareExchange( &SrvDoSTearDownInProgress, 0, 1 )
extern LONG SrvDoSWorkItemTearDown; extern LONG SrvDoSTearDownInProgress; // Is a teardown in progress?
extern BOOLEAN SrvDoSDetected; extern BOOLEAN SrvDoSRundownDetector; // Used to rundown the teardown amounts
extern BOOLEAN SrvDoSRundownIncreased; // Have we increased the Rundown past the minimum
extern BOOLEAN SrvDisableDoSChecking; extern SPECIAL_WORK_ITEM SrvDoSWorkItem; extern KSPIN_LOCK SrvDosSpinLock; extern LARGE_INTEGER SrvDoSLastRan;
//
// Should we disable strict name checking
//
extern BOOLEAN SrvDisableStrictNameChecking;
//
// Generic security mapping for connecting to shares
//
extern GENERIC_MAPPING SrvShareConnectMapping;
//
// What's the minumum # of free work items each processor should have?
//
extern ULONG SrvMinPerProcessorFreeWorkItems;
//
// The server has callouts to enable a smart card to accelerate its direct
// host IPX performance. This is the vector of entry points.
//
extern SRV_IPX_SMART_CARD SrvIpxSmartCard;
//
// This is the name of the server computer. Returned in the negprot response
//
extern UNICODE_STRING SrvComputerName;
//
// The master file table contains one entry for each named file that has
// at least one open instance.
//
extern MFCBHASH SrvMfcbHashTable[ NMFCB_HASH_TABLE ];
//
// The share table contains one entry for each share
//
extern LIST_ENTRY SrvShareHashTable[ NSHARE_HASH_TABLE ];
//
// Hex digits array used by the dump routines and SrvSmbCreateTemporary.
//
extern CHAR SrvHexChars[];
#if SRVCATCH
//
// Are we looking for the special file?
//
extern UNICODE_STRING SrvCatch; extern PWSTR *SrvCatchBuf; extern UNICODE_STRING SrvCatchExt; extern PWSTR *SrvCatchExtBuf; extern ULONG SrvCatchShares; extern PWSTR *SrvCatchShareNames; #endif
//
// SMB dispatch table
//
extern UCHAR SrvSmbIndexTable[];
typedef struct { PSMB_PROCESSOR Func; #if DBG
LPSTR Name; #endif
} SRV_SMB_DISPATCH_TABLE;
extern SRV_SMB_DISPATCH_TABLE SrvSmbDispatchTable[];
//
// SMB word count table.
//
extern SCHAR SrvSmbWordCount[];
//
// Device prefix strings.
//
extern UNICODE_STRING SrvCanonicalNamedPipePrefix; extern UNICODE_STRING SrvNamedPipeRootDirectory; extern UNICODE_STRING SrvMailslotRootDirectory;
//
// Transaction2 dispatch table
//
extern PSMB_TRANSACTION_PROCESSOR SrvTransaction2DispatchTable[]; extern PSMB_TRANSACTION_PROCESSOR SrvNtTransactionDispatchTable[];
extern SRV_STATISTICS SrvStatistics; #if SRVDBG_STATS || SRVDBG_STATS2
extern SRV_STATISTICS_DEBUG SrvDbgStatistics; #endif
//
// The number of abortive disconnects that the server has gotten
//
extern ULONG SrvAbortiveDisconnects;
//
// Server environment information strings.
//
extern UNICODE_STRING SrvNativeOS; extern OEM_STRING SrvOemNativeOS; extern UNICODE_STRING SrvNativeLanMan; extern OEM_STRING SrvOemNativeLanMan; extern UNICODE_STRING SrvSystemRoot;
//
// The following will be a permanent handle and device object pointer
// to NPFS.
//
extern HANDLE SrvNamedPipeHandle; extern PDEVICE_OBJECT SrvNamedPipeDeviceObject; extern PFILE_OBJECT SrvNamedPipeFileObject;
//
// The following are used to converse with the Dfs driver
//
extern PFAST_IO_DEVICE_CONTROL SrvDfsFastIoDeviceControl; extern PDEVICE_OBJECT SrvDfsDeviceObject; extern PFILE_OBJECT SrvDfsFileObject;
//
// The following will be a permanent handle and device object pointer
// to MSFS.
//
extern HANDLE SrvMailslotHandle; extern PDEVICE_OBJECT SrvMailslotDeviceObject; extern PFILE_OBJECT SrvMailslotFileObject;
//
// Flag indicating XACTSRV whether is active, and resource synchronizing
// access to XACTSRV-related variabled.
//
extern BOOLEAN SrvXsActive;
extern ERESOURCE SrvXsResource;
//
// Handle to the unnamed shared memory and communication port used for
// communication between the server and XACTSRV.
//
extern HANDLE SrvXsSectionHandle; extern HANDLE SrvXsPortHandle;
//
// Pointers to control the unnamed shared memory for the XACTSRV LPC port.
//
extern PVOID SrvXsPortMemoryBase; extern ULONG_PTR SrvXsPortMemoryDelta; extern PVOID SrvXsPortMemoryHeap;
//
// Pointer to heap header for the special XACTSRV shared-memory heap.
//
extern PVOID SrvXsHeap;
//
// Dispatch table for handling server API requests.
//
extern PAPI_PROCESSOR SrvApiDispatchTable[];
//
// Names for the various types of clients.
//
extern UNICODE_STRING SrvClientTypes[];
//
// All the resumable Enum APIs use ordered lists for context-free
// resume. All data blocks in the server that correspond to return
// information for Enum APIs are maintained in ordered lists.
//
extern SRV_LOCK SrvOrderedListLock;
extern ORDERED_LIST_HEAD SrvEndpointList; extern ORDERED_LIST_HEAD SrvRfcbList; extern ORDERED_LIST_HEAD SrvSessionList; extern ORDERED_LIST_HEAD SrvShareList; extern ORDERED_LIST_HEAD SrvTreeConnectList;
// The DNS domain name for the domain
extern PUNICODE_STRING SrvDnsDomainName;
//
// To synchronize server shutdown with API requests handled in the
// server FSD, we track the number of outstanding API requests. The
// shutdown code waits until all APIs have been completed to start
// termination.
//
// SrvApiRequestCount tracks the active APIs in the FSD.
// SrvApiCompletionEvent is set by the last API to complete, and the
// shutdown code waits on it if there are outstanding APIs.
//
extern ULONG SrvApiRequestCount; extern KEVENT SrvApiCompletionEvent;
//
// Security contexts required for mutual authentication.
// SrvKerberosLsaHandle and SrvLmLsaHandle are credentials of the server
// principal. They are used to validate incoming kerberos tickets.
// SrvNullSessionToken is a cached token handle representing the null session.
//
extern CtxtHandle SrvLmLsaHandle; extern CtxtHandle SrvNullSessionToken;
extern CtxtHandle SrvExtensibleSecurityHandle;
//
// Oplock break information.
//
extern LIST_ENTRY SrvWaitForOplockBreakList; extern SRV_LOCK SrvOplockBreakListLock; extern LIST_ENTRY SrvOplockBreaksInProgressList;
//
// The default server security quality of service.
//
extern SECURITY_QUALITY_OF_SERVICE SrvSecurityQOS;
//
// A BOOLEAN to indicate whether the server is paused. If paused, the
// server will not accept new tree connections from non-admin users.
//
extern BOOLEAN SrvPaused;
//
// Alerting information.
//
extern SRV_ERROR_RECORD SrvErrorRecord; extern SRV_ERROR_RECORD SrvNetworkErrorRecord; extern BOOLEAN SrvDiskAlertRaised[26];
//
// Counts of the number of times pool allocations have failed because
// the server was at its configured pool limit.
//
extern ULONG SrvNonPagedPoolLimitHitCount; extern ULONG SrvPagedPoolLimitHitCount;
//
// SrvOpenCount counts the number of active opens of the server device.
// This is used at server shutdown time to determine whether the server
// service should unload the driver.
//
extern ULONG SrvOpenCount;
//
// Counters for logging resource shortage events during a scavenger pass.
//
extern ULONG SrvOutOfFreeConnectionCount; extern ULONG SrvOutOfRawWorkItemCount; extern ULONG SrvFailedBlockingIoCount;
//
// Current core search timeout time in seconds
//
extern ULONG SrvCoreSearchTimeout;
//
// SrvTimerList is a pool of timer/DPC structures available for use by
// code that needs to start a timer.
//
extern SLIST_HEADER SrvTimerList;
//
// Name that should be displayed when doing a server alert.
//
extern PWSTR SrvAlertServiceName;
//
// Variable to store the number of tick counts for 5 seconds
//
extern ULONG SrvFiveSecondTickCount;
//
// Holds the PNP notification handle for TDI
//
extern HANDLE SrvTdiNotificationHandle;
//
// Flag indicating whether or not SMB security signatures are enabled.
//
extern BOOLEAN SrvSmbSecuritySignaturesEnabled;
//
// Flag indicating whether or not SMB security signatures are required. The signature
// must match between the client and the server for the smb to be accepted.
//
extern BOOLEAN SrvSmbSecuritySignaturesRequired;
//
// Flag indicating whether or not SMB security signatures should be applied to W9x
// clients.
//
extern BOOLEAN SrvEnableW9xSecuritySignatures;
//
// Security descriptor granting Administrator READ access.
// Used to see if a client has administrative privileges
//
extern SECURITY_DESCRIPTOR SrvAdminSecurityDescriptor;
//
// Security descriptor granting Anonymous READ access.
// Used to see if a client was an anonymous (null session) logon
//
extern SECURITY_DESCRIPTOR SrvNullSessionSecurityDescriptor;
//
// Flag indicating whether or not we need to filter extended characters
// out of 8.3 names ourselves.
//
extern BOOLEAN SrvFilterExtendedCharsInPath;
//
// Flag indicating whether we enforce logoff times
//
extern BOOLEAN SrvEnforceLogoffTimes;
//
// Maximum amount of data that we'll allocate to support a METHOD_NEITHER Fsctl call
//
extern ULONG SrvMaxFsctlBufferSize;
//
// Maximum NT transaction size which we'll accept.
//
extern ULONG SrvMaxNtTransactionSize;
//
// Maximum size of large Read&X that we'll allow. We need to lock down a cache region
// to service this request, so we don't want it to get too big
//
extern ULONG SrvMaxReadSize;
//
// Maximum size of a compressed write that we'll allow. We need to lock down a cache
// region to service this request, so we dont' want it to get too big.
//
extern ULONG SrvMaxCompressedDataLength;
//
// When we receive an uncompressed large write from a client, we receive it in chunks,
// locking & unlocking the file cache as we receive the data. SrvMaxWriteChunk is the
// size of this 'chunk'. There's no magic to this chosen value.
//
extern ULONG SrvMaxWriteChunk;
//
// Handle used for PoRegisterSystemState calls
//
extern PVOID SrvPoRegistrationState;
//
// Counter used to suppress extraneous PoRegisterSystemStateCalls
//
extern ULONG SrvIdleCount;
#if SRVNTVERCHK
//
// This is the minimum NT5 client build number that we will allow to connect to the server
//
extern ULONG SrvMinNT5Client; extern BOOLEAN SrvMinNT5ClientIPCToo;
//
// To force upgrades of our internal development community, we can set a
// value in the registry that governs the minimum NT release that we allow
// people to run to connect to this server. However, some folks have special
// needs that preclude a forced upgrade. Presuming they have a static IP address,
// you can add their address to the registry to exclude them from the build number
// checking logic
//
extern DWORD SrvAllowIPAddress[25];
//
// If a server worker threads remains idle for this many ticks, then it terminate
//
extern LONGLONG SrvIdleThreadTimeOut;
extern LARGE_INTEGER SrvLastDosAttackTime; extern ULONG SrvDOSAttacks; extern BOOLEAN SrvLogEventOnDOS;
#endif
//
// These are used to track persistent connections/handles. The counters are
// assigned to RFCBs, connections, and sessions.
//
#ifdef INCLUDE_SMB_PERSISTENT
extern ULONG SrvGlobalPersistentSessionId; extern ULONG SrvGlobalPersistentRfcbId; #endif
//
// These are used for internal testing of the reauthentication code
//
extern USHORT SessionInvalidateCommand; extern USHORT SessionInvalidateMod;
typedef struct _SRV_REAUTH_TEST_ { USHORT InvalidateCommand; USHORT InvalidateModulo; } SRV_REAUTH_TEST, *PSRV_REAUTH_TEST;
#endif // ndef _SRVDATA_
|