1776 lines
59 KiB
C
1776 lines
59 KiB
C
/*++
|
||
|
||
Copyright (c) 1989 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
srvdata.c
|
||
|
||
Abstract:
|
||
|
||
This module defines global data for the LAN Manager server FSP. The
|
||
globals defined herein are part of the server driver image, and are
|
||
therefore loaded into the system address space and are nonpageable.
|
||
Some of the fields point to, or contain pointers to, data that is
|
||
also in the system address space and nonpageable. Such data can be
|
||
accessed by both the FSP and the FSD. Other fields point to data
|
||
that is in the FSP address and may or may not be pageable. Only the
|
||
FSP is allowed to address this data. Pageable data can only be
|
||
accessed at low IRQL (so that page faults are allowed).
|
||
|
||
This module also has a routine to initialize those fields defined
|
||
here that cannot be statically initialized.
|
||
|
||
Author:
|
||
|
||
Chuck Lenzmeier (chuckl) 3-Oct-1989
|
||
David Treadwell (davidtr)
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
|
||
#include "precomp.h"
|
||
#include "srvdata.tmh"
|
||
#pragma hdrstop
|
||
|
||
#ifdef ALLOC_PRAGMA
|
||
#pragma alloc_text( INIT, SrvInitializeData )
|
||
#pragma alloc_text( PAGE, SrvTerminateData )
|
||
#endif
|
||
|
||
|
||
#if SRVDBG
|
||
|
||
ULARGE_INTEGER SrvDebug = {DEBUG_STOP_ON_ERRORS};
|
||
ULARGE_INTEGER SmbDebug = {0};
|
||
|
||
CLONG SrvDumpMaximumRecursion = 0;
|
||
|
||
#endif // SRVDBG
|
||
|
||
#ifdef PAGED_DBG
|
||
ULONG ThisCodeCantBePaged = 0;
|
||
#endif
|
||
|
||
//
|
||
// SrvDeviceObject is a pointer to the server's device object, which
|
||
// is created by the server FSD during initialization. This global
|
||
// location is accessed primarily by the FSP. The FSD usually knows
|
||
// the device object address by other means -- because it was called
|
||
// with the address as a parameter, or via a file object, etc. But
|
||
// the transport receive event handler in the FSD doesn't have such
|
||
// other means, so it needs to access the global storage.
|
||
//
|
||
// *** The event handler has the address of a server connection block
|
||
// (in its ConnectionContext parameter). The device object address
|
||
// could be found through the connection block.
|
||
//
|
||
|
||
PDEVICE_OBJECT SrvDeviceObject = NULL;
|
||
|
||
//
|
||
// Fields describing the state of the FSP.
|
||
//
|
||
|
||
BOOLEAN SrvFspActive = FALSE; // Indicates whether the FSP is
|
||
// running
|
||
BOOLEAN SrvFspTransitioning = FALSE; // Indicates that the server is
|
||
// in the process of starting up
|
||
// or shutting down
|
||
|
||
BOOLEAN SrvMultiProcessorDriver = FALSE; // Is this a multiprocessor driver?
|
||
|
||
BOOLEAN SrvCompletedPNPRegistration = FALSE; // Indicates whether the FSP has completed
|
||
// registering for PNP notifications
|
||
|
||
PEPROCESS SrvServerProcess = NULL; // Pointer to the initial system process
|
||
|
||
PEPROCESS SrvSvcProcess = NULL; // Pointer to the service controller process
|
||
|
||
CLONG SrvEndpointCount = 0; // Number of transport endpoints
|
||
KEVENT SrvEndpointEvent = {0}; // Signaled when no active endpoints
|
||
|
||
//
|
||
// DMA alignment size
|
||
//
|
||
|
||
ULONG SrvCacheLineSize = 0;
|
||
|
||
//
|
||
// Global spin locks.
|
||
//
|
||
|
||
SRV_GLOBAL_SPIN_LOCKS SrvGlobalSpinLocks = {0};
|
||
|
||
#if SRVDBG || SRVDBG_HANDLES
|
||
//
|
||
// Lock used to protect debugging structures.
|
||
//
|
||
|
||
SRV_LOCK SrvDebugLock = {0};
|
||
#endif
|
||
|
||
//
|
||
// SrvConfigurationLock is used to synchronize configuration requests.
|
||
//
|
||
|
||
SRV_LOCK SrvConfigurationLock = {0};
|
||
|
||
//
|
||
// SrvStartupShutdownLock is used to synchronize server startup and shutdown
|
||
//
|
||
|
||
SRV_LOCK SrvStartupShutdownLock = {0};
|
||
|
||
//
|
||
// 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.
|
||
//
|
||
|
||
SRV_LOCK SrvEndpointLock = {0};
|
||
|
||
//
|
||
// SrvShareLock protects all shares.
|
||
//
|
||
|
||
SRV_LOCK SrvShareLock = {0};
|
||
|
||
//
|
||
// The number of processors in the system
|
||
//
|
||
ULONG SrvNumberOfProcessors = {0};
|
||
|
||
//
|
||
// A vector of nonblocking work queues, one for each processor
|
||
//
|
||
#if MULTIPROCESSOR
|
||
|
||
PBYTE SrvWorkQueuesBase = 0; // base of allocated memory for the queues
|
||
PWORK_QUEUE SrvWorkQueues = 0; // first queue in the allocated memory
|
||
|
||
#else
|
||
|
||
WORK_QUEUE SrvWorkQueues[1];
|
||
|
||
#endif
|
||
|
||
PWORK_QUEUE eSrvWorkQueues = 0; // used for terminating 'for' loops
|
||
|
||
//
|
||
// Blocking Work Queue
|
||
//
|
||
WORK_QUEUE SrvBlockingWorkQueue = {0};
|
||
ULONG SrvReBalanced = 0;
|
||
ULONG SrvNextBalanceProcessor = 0;
|
||
|
||
CLONG SrvBlockingOpsInProgress = 0; // Number of blocking ops currently
|
||
// being processed
|
||
|
||
|
||
//
|
||
// The queue of connections that need an SMB buffer to process a pending
|
||
// receive completion.
|
||
//
|
||
|
||
LIST_ENTRY SrvNeedResourceQueue = {0}; // The queue
|
||
|
||
//
|
||
// The queue of connections that are disconnecting and need resource
|
||
// thread processing.
|
||
//
|
||
|
||
LIST_ENTRY SrvDisconnectQueue = {0}; // The queue
|
||
|
||
//
|
||
// Queue of connections that needs to be dereferenced.
|
||
//
|
||
|
||
SLIST_HEADER SrvBlockOrphanage = {0}; // The queue
|
||
|
||
//
|
||
// FSP configuration queue. The FSD puts configuration request IRPs
|
||
// (from NtDeviceIoControlFile) on this queue, and it is serviced by an
|
||
// EX worker thread.
|
||
//
|
||
|
||
LIST_ENTRY SrvConfigurationWorkQueue = {0}; // The queue itself
|
||
|
||
//
|
||
// This is the number of configuration IRPs which have been queued but not
|
||
// yet completed.
|
||
//
|
||
ULONG SrvConfigurationIrpsInProgress = 0;
|
||
|
||
//
|
||
// Base address of the large block allocated to hold initial normal
|
||
// work items (see blkwork.c\SrvAllocateInitialWorkItems).
|
||
//
|
||
|
||
PVOID SrvInitialWorkItemBlock = NULL;
|
||
|
||
//
|
||
// Work item used to run the resource thread. Notification event used
|
||
// to inform the resource thread to continue running.
|
||
//
|
||
|
||
WORK_QUEUE_ITEM SrvResourceThreadWorkItem = {0};
|
||
BOOLEAN SrvResourceThreadRunning = FALSE;
|
||
BOOLEAN SrvResourceDisconnectPending = FALSE;
|
||
BOOLEAN SrvResourceFreeConnection = FALSE;
|
||
LONG SrvResourceOrphanedBlocks = 0;
|
||
|
||
//
|
||
// Denial of Service monitoring variables for the Resource Thread
|
||
//
|
||
LONG SrvDoSTearDownInProgress = 0;
|
||
LONG SrvDoSWorkItemTearDown = 0;
|
||
BOOLEAN SrvDoSDetected = FALSE;
|
||
BOOLEAN SrvDoSRundownDetector = FALSE;
|
||
BOOLEAN SrvDoSRundownIncreased = FALSE;
|
||
BOOLEAN SrvDisableDoSChecking = FALSE;
|
||
SPECIAL_WORK_ITEM SrvDoSWorkItem;
|
||
KSPIN_LOCK SrvDosSpinLock;
|
||
LARGE_INTEGER SrvDoSLastRan = {0};
|
||
|
||
//
|
||
// Should we enforce strict name checking?
|
||
//
|
||
BOOLEAN SrvDisableStrictNameChecking = FALSE;
|
||
|
||
//
|
||
// Generic security mapping for connecting to shares
|
||
//
|
||
GENERIC_MAPPING SrvShareConnectMapping = GENERIC_SHARE_CONNECT_MAPPING;
|
||
|
||
//
|
||
// What's the minumum # of free work items each processor should have?
|
||
//
|
||
ULONG SrvMinPerProcessorFreeWorkItems = 0;
|
||
|
||
//
|
||
// The server has callouts to enable a smart card to accelerate its direct
|
||
// host IPX performance. This is the vector of entry points.
|
||
//
|
||
SRV_IPX_SMART_CARD SrvIpxSmartCard = {0};
|
||
|
||
//
|
||
// This is the name of the server computer. Returned in the negprot response
|
||
//
|
||
UNICODE_STRING SrvComputerName = {0};
|
||
|
||
//
|
||
// The master file table contains one entry for each named file that has
|
||
// at least one open instance.
|
||
//
|
||
MFCBHASH SrvMfcbHashTable[ NMFCB_HASH_TABLE ] = {0};
|
||
|
||
//
|
||
// This is the list of resources which protect the SrvMfcbHashTable buckets
|
||
//
|
||
SRV_LOCK SrvMfcbHashTableLocks[ NMFCB_HASH_TABLE_LOCKS ];
|
||
|
||
//
|
||
// The share table contains one entry for each share the server is supporting
|
||
//
|
||
LIST_ENTRY SrvShareHashTable[ NSHARE_HASH_TABLE ] = {0};
|
||
|
||
//
|
||
// Array of the hex digits for use by the dump routines and
|
||
// SrvSmbCreateTemporary.
|
||
//
|
||
|
||
CHAR SrvHexChars[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
||
'A', 'B', 'C', 'D', 'E', 'F' };
|
||
|
||
|
||
#if SRVCATCH
|
||
//
|
||
// Are we looking for the special file?
|
||
//
|
||
UNICODE_STRING SrvCatch;
|
||
PWSTR *SrvCatchBuf = NULL;
|
||
UNICODE_STRING SrvCatchExt;
|
||
PWSTR *SrvCatchExtBuf = NULL;
|
||
ULONG SrvCatchShares = 0;
|
||
PWSTR *SrvCatchShareNames = NULL;
|
||
#endif
|
||
|
||
//
|
||
// SrvSmbIndexTable is the first-layer index table for processing SMBs.
|
||
// The contents of this table are used to index into SrvSmbDispatchTable.
|
||
//
|
||
|
||
UCHAR SrvSmbIndexTable[] = {
|
||
ISrvSmbCreateDirectory, // SMB_COM_CREATE_DIRECTORY
|
||
ISrvSmbDeleteDirectory, // SMB_COM_DELETE_DIRECTORY
|
||
ISrvSmbOpen, // SMB_COM_OPEN
|
||
ISrvSmbCreate, // SMB_COM_CREATE
|
||
ISrvSmbClose, // SMB_COM_CLOSE
|
||
ISrvSmbFlush, // SMB_COM_FLUSH
|
||
ISrvSmbDelete, // SMB_COM_DELETE
|
||
ISrvSmbRename, // SMB_COM_RENAME
|
||
ISrvSmbQueryInformation, // SMB_COM_QUERY_INFORMATION
|
||
ISrvSmbSetInformation, // SMB_COM_SET_INFORMATION
|
||
ISrvSmbRead, // SMB_COM_READ
|
||
ISrvSmbWrite, // SMB_COM_WRITE
|
||
ISrvSmbLockByteRange, // SMB_COM_LOCK_BYTE_RANGE
|
||
ISrvSmbUnlockByteRange, // SMB_COM_UNLOCK_BYTE_RANGE
|
||
ISrvSmbCreateTemporary, // SMB_COM_CREATE_TEMPORARY
|
||
ISrvSmbCreate, // SMB_COM_CREATE
|
||
ISrvSmbCheckDirectory, // SMB_COM_CHECK_DIRECTORY
|
||
ISrvSmbProcessExit, // SMB_COM_PROCESS_EXIT
|
||
ISrvSmbSeek, // SMB_COM_SEEK
|
||
ISrvSmbLockAndRead, // SMB_COM_LOCK_AND_READ
|
||
ISrvSmbWrite, // SMB_COM_WRITE_AND_UNLOCK
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbReadRaw, // SMB_COM_READ_RAW
|
||
ISrvSmbReadMpx, // SMB_COM_READ_MPX
|
||
ISrvSmbIllegalCommand, // SMB_COM_READ_MPX_SECONDARY (server only)
|
||
ISrvSmbWriteRaw, // SMB_COM_WRITE_RAW
|
||
ISrvSmbWriteMpx, // SMB_COM_WRITE_MPX
|
||
ISrvSmbWriteMpxSecondary, // SMB_COM_WRITE_MPX_SECONDARY
|
||
ISrvSmbIllegalCommand, // SMB_COM_WRITE_COMPLETE (server only)
|
||
ISrvSmbIllegalCommand, // SMB_COM_QUERY_INFORMATION_SRV
|
||
ISrvSmbSetInformation2, // SMB_COM_SET_INFORMATION2
|
||
ISrvSmbQueryInformation2, // SMB_COM_QUERY_INFORMATION2
|
||
ISrvSmbLockingAndX, // SMB_COM_LOCKING_ANDX
|
||
ISrvSmbTransaction, // SMB_COM_TRANSACTION
|
||
ISrvSmbTransactionSecondary, // SMB_COM_TRANSACTION_SECONDARY
|
||
ISrvSmbIoctl, // SMB_COM_IOCTL
|
||
ISrvSmbIoctlSecondary, // SMB_COM_IOCTL_SECONDARY
|
||
ISrvSmbMove, // SMB_COM_COPY
|
||
ISrvSmbMove, // SMB_COM_MOVE
|
||
ISrvSmbEcho, // SMB_COM_ECHO
|
||
ISrvSmbWrite, // SMB_COM_WRITE_AND_CLOSE
|
||
ISrvSmbOpenAndX, // SMB_COM_OPEN_ANDX
|
||
ISrvSmbReadAndX, // SMB_COM_READ_ANDX
|
||
ISrvSmbWriteAndX, // SMB_COM_WRITE_ANDX
|
||
ISrvSmbIllegalCommand, // SMB_COM_SET_NEW_SIZE
|
||
ISrvSmbClose, // SMB_COM_CLOSE_AND_TREE_DISC
|
||
ISrvSmbTransaction, // SMB_COM_TRANSACTION2
|
||
ISrvSmbTransactionSecondary, // SMB_COM_TRANSACTION2_SECONDARY
|
||
ISrvSmbFindClose2, // SMB_COM_FIND_CLOSE2
|
||
ISrvSmbFindNotifyClose, // SMB_COM_FIND_NOTIFY_CLOSE
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbTreeConnect, // SMB_COM_TREE_CONNECT
|
||
ISrvSmbTreeDisconnect, // SMB_COM_TREE_DISCONNECT
|
||
ISrvSmbNegotiate, // SMB_COM_NEGOTIATE
|
||
ISrvSmbSessionSetupAndX, // SMB_COM_SESSION_SETUP_ANDX
|
||
ISrvSmbLogoffAndX, // SMB_COM_LOGOFF_ANDX
|
||
ISrvSmbTreeConnectAndX, // SMB_COM_TREE_CONNECT_ANDX
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbQueryInformationDisk, // SMB_COM_QUERY_INFORMATION_DISK
|
||
ISrvSmbSearch, // SMB_COM_SEARCH
|
||
ISrvSmbSearch, // SMB_COM_SEARCH
|
||
ISrvSmbSearch, // SMB_COM_SEARCH
|
||
ISrvSmbSearch, // SMB_COM_SEARCH
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbNtTransaction, // SMB_COM_NT_TRANSACT
|
||
ISrvSmbNtTransactionSecondary, // SMB_COM_NT_TRANSACT_SECONDARY
|
||
ISrvSmbNtCreateAndX, // SMB_COM_NT_CREATE_ANDX
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbNtCancel, // SMB_COM_NT_CANCEL
|
||
ISrvSmbRename, // SMB_COM_NT_RENAME
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbOpenPrintFile, // SMB_COM_OPEN_PRINT_FILE
|
||
ISrvSmbWrite, // SMB_COM_WRITE_PRINT_FILE
|
||
ISrvSmbClosePrintFile, // SMB_COM_CLOSE_PRINT_FILE
|
||
ISrvSmbGetPrintQueue, // SMB_COM_GET_PRINT_QUEUE
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_SEND_MESSAGE
|
||
ISrvSmbIllegalCommand, // SMB_COM_SEND_BROADCAST_MESSAGE
|
||
ISrvSmbIllegalCommand, // SMB_COM_FORWARD_USER_NAME
|
||
ISrvSmbIllegalCommand, // SMB_COM_CANCEL_FORWARD
|
||
ISrvSmbIllegalCommand, // SMB_COM_GET_MACHINE_NAME
|
||
ISrvSmbIllegalCommand, // SMB_COM_SEND_START_MB_MESSAGE
|
||
ISrvSmbIllegalCommand, // SMB_COM_SEND_END_MB_MESSAGE
|
||
ISrvSmbIllegalCommand, // SMB_COM_SEND_TEXT_MB_MESSAGE
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand, // SMB_COM_ILLEGAL_COMMAND
|
||
ISrvSmbIllegalCommand // SMB_COM_ILLEGAL_COMMAND
|
||
};
|
||
|
||
//
|
||
// SrvSmbDispatchTable is the jump table for processing SMBs.
|
||
//
|
||
|
||
#if DBG
|
||
#define SMB_DISPATCH_ENTRY( x ) { x, #x }
|
||
#else
|
||
#define SMB_DISPATCH_ENTRY( x ) { x }
|
||
#endif
|
||
|
||
SRV_SMB_DISPATCH_TABLE SrvSmbDispatchTable[] = {
|
||
|
||
SMB_DISPATCH_ENTRY( SrvSmbIllegalCommand ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbCreateDirectory ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbDeleteDirectory ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbOpen ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbCreate ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbClose ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbFlush ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbDelete ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbRename ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbQueryInformation ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbSetInformation ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbRead ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbWrite ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbLockByteRange ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbUnlockByteRange ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbCreateTemporary ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbCheckDirectory ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbProcessExit ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbSeek ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbLockAndRead ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbSetInformation2 ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbQueryInformation2 ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbLockingAndX ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbTransaction ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbTransactionSecondary ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbIoctl ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbIoctlSecondary ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbMove ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbEcho ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbOpenAndX ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbReadAndX ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbWriteAndX ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbFindClose2 ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbFindNotifyClose ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbTreeConnect ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbTreeDisconnect ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbNegotiate ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbSessionSetupAndX ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbLogoffAndX ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbTreeConnectAndX ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbQueryInformationDisk ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbSearch ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbNtTransaction ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbNtTransactionSecondary ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbNtCreateAndX ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbNtCancel ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbOpenPrintFile ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbClosePrintFile ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbGetPrintQueue ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbReadRaw ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbWriteRaw ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbReadMpx ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbWriteMpx ),
|
||
SMB_DISPATCH_ENTRY( SrvSmbWriteMpxSecondary )
|
||
};
|
||
|
||
//
|
||
// Table of WordCount values for all SMBs.
|
||
//
|
||
|
||
SCHAR SrvSmbWordCount[] = {
|
||
0, // SMB_COM_CREATE_DIRECTORY
|
||
0, // SMB_COM_DELETE_DIRECTORY
|
||
2, // SMB_COM_OPEN
|
||
3, // SMB_COM_CREATE
|
||
3, // SMB_COM_CLOSE
|
||
1, // SMB_COM_FLUSH
|
||
1, // SMB_COM_DELETE
|
||
1, // SMB_COM_RENAME
|
||
0, // SMB_COM_QUERY_INFORMATION
|
||
8, // SMB_COM_SET_INFORMATION
|
||
5, // SMB_COM_READ
|
||
5, // SMB_COM_WRITE
|
||
5, // SMB_COM_LOCK_BYTE_RANGE
|
||
5, // SMB_COM_UNLOCK_BYTE_RANGE
|
||
3, // SMB_COM_CREATE_TEMPORARY
|
||
3, // SMB_COM_CREATE
|
||
0, // SMB_COM_CHECK_DIRECTORY
|
||
0, // SMB_COM_PROCESS_EXIT
|
||
4, // SMB_COM_SEEK
|
||
5, // SMB_COM_LOCK_AND_READ
|
||
5, // SMB_COM_WRITE_AND_UNLOCK
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-1, // SMB_COM_READ_RAW
|
||
8, // SMB_COM_READ_MPX
|
||
8, // SMB_COM_READ_MPX_SECONDARY
|
||
-1, // SMB_COM_WRITE_RAW
|
||
12, // SMB_COM_WRITE_MPX
|
||
12, // SMB_COM_WRITE_MPX_SECONDARY
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
1, // SMB_COM_QUERY_INFORMATION_SRV
|
||
7, // SMB_COM_SET_INFORMATION2
|
||
1, // SMB_COM_QUERY_INFORMATION2
|
||
8, // SMB_COM_LOCKING_ANDX
|
||
-1, // SMB_COM_TRANSACTION
|
||
8, // SMB_COM_TRANSACTION_SECONDARY
|
||
14, // SMB_COM_IOCTL
|
||
8, // SMB_COM_IOCTL_SECONDARY
|
||
3, // SMB_COM_COPY
|
||
3, // SMB_COM_MOVE
|
||
1, // SMB_COM_ECHO
|
||
-1, // SMB_COM_WRITE_AND_CLOSE
|
||
15, // SMB_COM_OPEN_ANDX
|
||
-1, // SMB_COM_READ_ANDX
|
||
-1, // SMB_COM_WRITE_ANDX
|
||
3, // SMB_COM_SET_NEW_SIZE
|
||
3, // SMB_COM_CLOSE_AND_TREE_DISC
|
||
-1, // SMB_COM_TRANSACTION2
|
||
9, // SMB_COM_TRANSACTION2_SECONDARY
|
||
1, // SMB_COM_FIND_CLOSE2
|
||
1, // SMB_COM_FIND_NOTIFY_CLOSE
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
0, // SMB_COM_TREE_CONNECT
|
||
0, // SMB_COM_TREE_DISCONNECT
|
||
0, // SMB_COM_NEGOTIATE
|
||
-1, // SMB_COM_SESSION_SETUP_ANDX
|
||
2, // SMB_COM_LOGOFF_ANDX
|
||
4, // SMB_COM_TREE_CONNECT_ANDX
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
0, // SMB_COM_QUERY_INFORMATION_DISK
|
||
2, // SMB_COM_SEARCH
|
||
2, // SMB_COM_SEARCH
|
||
2, // SMB_COM_SEARCH
|
||
2, // SMB_COM_SEARCH
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-1, // SMB_COM_NT_TRANSACT
|
||
18, // SMB_COM_NT_TRANSACT_SECONDARY
|
||
24, // SMB_COM_NT_CREATE_ANDX
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
0, // SMB_COM_NT_CANCEL
|
||
4, // SMB_COM_NT_RENAME
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
2, // SMB_COM_OPEN_PRINT_FILE
|
||
1, // SMB_COM_WRITE_PRINT_FILE
|
||
1, // SMB_COM_CLOSE_PRINT_FILE
|
||
2, // SMB_COM_GET_PRINT_QUEUE
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_SEND_MESSAGE
|
||
-2, // SMB_COM_SEND_BROADCAST_MESSAGE
|
||
-2, // SMB_COM_FORWARD_USER_NAME
|
||
-2, // SMB_COM_CANCEL_FORWARD
|
||
-2, // SMB_COM_GET_MACHINE_NAME
|
||
-2, // SMB_COM_SEND_START_MB_MESSAGE
|
||
-2, // SMB_COM_SEND_END_MB_MESSAGE
|
||
-2, // SMB_COM_SEND_TEXT_MB_MESSAGE
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
-2, // SMB_COM_ILLEGAL_COMMAND
|
||
};
|
||
|
||
//
|
||
// SrvCanonicalNamedPipePrefix is "PIPE\".
|
||
//
|
||
|
||
UNICODE_STRING SrvCanonicalNamedPipePrefix = {0};
|
||
|
||
//
|
||
// The following is used to generate NT style pipe paths.
|
||
//
|
||
|
||
UNICODE_STRING SrvNamedPipeRootDirectory = {0};
|
||
|
||
//
|
||
// The following is used to generate NT style mailslot paths.
|
||
//
|
||
|
||
UNICODE_STRING SrvMailslotRootDirectory = {0};
|
||
|
||
//
|
||
// SrvTransaction2DispatchTable is the jump table for processing
|
||
// Transaction2 SMBs.
|
||
//
|
||
|
||
PSMB_TRANSACTION_PROCESSOR SrvTransaction2DispatchTable[] = {
|
||
SrvSmbOpen2,
|
||
SrvSmbFindFirst2,
|
||
SrvSmbFindNext2,
|
||
SrvSmbQueryFsInformation,
|
||
SrvSmbSetFsInformation,
|
||
SrvSmbQueryPathInformation,
|
||
SrvSmbSetPathInformation,
|
||
SrvSmbQueryFileInformation,
|
||
SrvSmbSetFileInformation,
|
||
SrvSmbFsctl,
|
||
SrvSmbIoctl2,
|
||
SrvSmbFindNotify,
|
||
SrvSmbFindNotify,
|
||
SrvSmbCreateDirectory2,
|
||
SrvTransactionNotImplemented, // Can be reused...
|
||
SrvTransactionNotImplemented,
|
||
SrvSmbGetDfsReferral,
|
||
SrvSmbReportDfsInconsistency
|
||
};
|
||
|
||
//
|
||
// SrvNtTransactionDispatchTable is the jump table for processing
|
||
// NtTransaction SMBs.
|
||
//
|
||
|
||
PSMB_TRANSACTION_PROCESSOR SrvNtTransactionDispatchTable[ NT_TRANSACT_MAX_FUNCTION+1 ] = {
|
||
NULL,
|
||
SrvSmbCreateWithSdOrEa,
|
||
SrvSmbNtIoctl,
|
||
SrvSmbSetSecurityDescriptor,
|
||
SrvSmbNtNotifyChange,
|
||
SrvSmbNtRename,
|
||
SrvSmbQuerySecurityDescriptor,
|
||
SrvSmbQueryQuota,
|
||
SrvSmbSetQuota
|
||
};
|
||
|
||
//
|
||
// Global variables for server statistics.
|
||
//
|
||
|
||
SRV_STATISTICS SrvStatistics = {0};
|
||
|
||
#if SRVDBG_STATS || SRVDBG_STATS2
|
||
SRV_STATISTICS_DEBUG SrvDbgStatistics = {0};
|
||
#endif
|
||
|
||
//
|
||
// The number of abortive disconnects that the server has gotten
|
||
//
|
||
ULONG SrvAbortiveDisconnects = 0;
|
||
|
||
//
|
||
// The number of memory retries, and how often they were successful
|
||
//
|
||
LONG SrvMemoryAllocationRetries = 0;
|
||
LONG SrvMemoryAllocationRetriesSuccessful = 0;
|
||
|
||
//
|
||
// Server environment information strings.
|
||
//
|
||
|
||
UNICODE_STRING SrvNativeOS = {0};
|
||
OEM_STRING SrvOemNativeOS = {0};
|
||
UNICODE_STRING SrvNativeLanMan = {0};
|
||
OEM_STRING SrvOemNativeLanMan = {0};
|
||
UNICODE_STRING SrvSystemRoot = {0};
|
||
|
||
//
|
||
// The following will be a permanent handle and device object pointer
|
||
// to NPFS.
|
||
//
|
||
|
||
HANDLE SrvNamedPipeHandle = NULL;
|
||
PDEVICE_OBJECT SrvNamedPipeDeviceObject = NULL;
|
||
PFILE_OBJECT SrvNamedPipeFileObject = NULL;
|
||
|
||
//
|
||
// The following are used to converse with the Dfs driver
|
||
//
|
||
PFAST_IO_DEVICE_CONTROL SrvDfsFastIoDeviceControl = NULL;
|
||
PDEVICE_OBJECT SrvDfsDeviceObject = NULL;
|
||
PFILE_OBJECT SrvDfsFileObject = NULL;
|
||
|
||
//
|
||
// The following will be a permanent handle and device object pointer
|
||
// to MSFS.
|
||
//
|
||
|
||
HANDLE SrvMailslotHandle = NULL;
|
||
PDEVICE_OBJECT SrvMailslotDeviceObject = NULL;
|
||
PFILE_OBJECT SrvMailslotFileObject = NULL;
|
||
|
||
//
|
||
// Flag indicating XACTSRV whether is active, and resource synchronizing
|
||
// access to XACTSRV-related variabled.
|
||
//
|
||
|
||
BOOLEAN SrvXsActive = FALSE;
|
||
|
||
ERESOURCE SrvXsResource = {0};
|
||
|
||
//
|
||
// Handle to the unnamed shared memory and communication port used for
|
||
// communication between the server and XACTSRV.
|
||
//
|
||
|
||
HANDLE SrvXsSectionHandle = NULL;
|
||
HANDLE SrvXsPortHandle = NULL;
|
||
|
||
//
|
||
// Pointers to control the unnamed shared memory for the XACTSRV LPC port.
|
||
// The port memory heap handle is initialized to NULL to indicate that
|
||
// there is no connection with XACTSRV yet.
|
||
//
|
||
|
||
PVOID SrvXsPortMemoryBase = NULL;
|
||
ULONG_PTR SrvXsPortMemoryDelta = 0;
|
||
PVOID SrvXsPortMemoryHeap = NULL;
|
||
|
||
//
|
||
// Pointer to heap header for the special XACTSRV shared-memory heap.
|
||
//
|
||
|
||
PVOID SrvXsHeap = NULL;
|
||
|
||
//
|
||
// Dispatch table for server APIs. APIs are dispatched based on the
|
||
// control code passed to NtFsControlFile.
|
||
//
|
||
// *** The order here must match the order of API codes defined in
|
||
// net\inc\srvfsctl.h!
|
||
|
||
PAPI_PROCESSOR SrvApiDispatchTable[] = {
|
||
SrvNetConnectionEnum,
|
||
SrvNetFileClose,
|
||
SrvNetFileEnum,
|
||
SrvNetServerDiskEnum,
|
||
SrvNetServerSetInfo,
|
||
SrvNetServerTransportAdd,
|
||
SrvNetServerTransportDel,
|
||
SrvNetServerTransportEnum,
|
||
SrvNetSessionDel,
|
||
SrvNetSessionEnum,
|
||
SrvNetShareAdd,
|
||
SrvNetShareDel,
|
||
SrvNetShareEnum,
|
||
SrvNetShareSetInfo,
|
||
SrvNetStatisticsGet
|
||
};
|
||
|
||
//
|
||
// Names for the various types of clients. This array corresponds to
|
||
// the SMB_DIALECT enumerated type.
|
||
//
|
||
|
||
UNICODE_STRING SrvClientTypes[LAST_DIALECT] = {0};
|
||
|
||
//
|
||
// 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.
|
||
//
|
||
|
||
SRV_LOCK SrvOrderedListLock = {0};
|
||
|
||
ORDERED_LIST_HEAD SrvEndpointList = {0};
|
||
ORDERED_LIST_HEAD SrvRfcbList = {0};
|
||
ORDERED_LIST_HEAD SrvSessionList = {0};
|
||
ORDERED_LIST_HEAD SrvTreeConnectList = {0};
|
||
|
||
//
|
||
// The DNS name for the domain
|
||
//
|
||
PUNICODE_STRING SrvDnsDomainName = NULL;
|
||
|
||
//
|
||
// 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.
|
||
//
|
||
|
||
ULONG SrvApiRequestCount = 0;
|
||
KEVENT SrvApiCompletionEvent = {0};
|
||
|
||
//
|
||
// Security data for logging on remote users. SrvLsaHandle is the logon
|
||
// process handle that we use in calls to LsaLogonUser.
|
||
// SrvSystemSecurityMode contains the secutity mode the system is
|
||
// running in. SrvAuthenticationPackage is a token that describes the
|
||
// authentication package being used. SrvNullSessionToken is a cached
|
||
// token handle representing the null session.
|
||
//
|
||
|
||
CtxtHandle SrvNullSessionToken = {0, 0};
|
||
CtxtHandle SrvLmLsaHandle = {0, 0};
|
||
|
||
CtxtHandle SrvExtensibleSecurityHandle = {0, 0};
|
||
|
||
//
|
||
// Security descriptor granting Administrator READ access.
|
||
// Used to see if a client has administrative privileges
|
||
//
|
||
SECURITY_DESCRIPTOR SrvAdminSecurityDescriptor;
|
||
|
||
//
|
||
// Security descriptor granting Anonymous READ access.
|
||
// Used to see if a client was an anonymous (null session) logon
|
||
//
|
||
SECURITY_DESCRIPTOR SrvNullSessionSecurityDescriptor;
|
||
|
||
//
|
||
// A list of SMBs waiting for an oplock break to occur, before they can
|
||
// proceed, and a lock to protect the list.
|
||
//
|
||
|
||
LIST_ENTRY SrvWaitForOplockBreakList = {0};
|
||
SRV_LOCK SrvOplockBreakListLock = {0};
|
||
|
||
//
|
||
// A list of outstanding oplock break requests. The list is protected by
|
||
// SrvOplockBreakListLock.
|
||
//
|
||
|
||
LIST_ENTRY SrvOplockBreaksInProgressList = {0};
|
||
|
||
//
|
||
// Global security context. Use static tracking.
|
||
//
|
||
|
||
SECURITY_QUALITY_OF_SERVICE SrvSecurityQOS = {0};
|
||
|
||
//
|
||
// A BOOLEAN to indicate whether the server is paused. If paused, the
|
||
// server will not accept new tree connections from non-admin users.
|
||
//
|
||
|
||
BOOLEAN SrvPaused = FALSE;
|
||
|
||
//
|
||
// Alerting information.
|
||
//
|
||
|
||
SRV_ERROR_RECORD SrvErrorRecord = {0};
|
||
SRV_ERROR_RECORD SrvNetworkErrorRecord = {0};
|
||
|
||
BOOLEAN SrvDiskAlertRaised[26] = {0};
|
||
|
||
//
|
||
// Counts of the number of times pool allocations have failed because
|
||
// the server was at its configured pool limit.
|
||
//
|
||
|
||
ULONG SrvNonPagedPoolLimitHitCount = 0;
|
||
ULONG SrvPagedPoolLimitHitCount = 0;
|
||
|
||
//
|
||
// 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.
|
||
//
|
||
|
||
ULONG SrvOpenCount = 0;
|
||
|
||
//
|
||
// Counters for logging resource shortage events during a scavenger pass.
|
||
//
|
||
|
||
ULONG SrvOutOfFreeConnectionCount = 0;
|
||
ULONG SrvOutOfRawWorkItemCount = 0;
|
||
ULONG SrvFailedBlockingIoCount = 0;
|
||
|
||
//
|
||
// Current core search timeout time in seconds
|
||
//
|
||
|
||
ULONG SrvCoreSearchTimeout = 0;
|
||
|
||
SRV_LOCK SrvUnlockableCodeLock = {0};
|
||
SECTION_DESCRIPTOR SrvSectionInfo[SRV_CODE_SECTION_MAX] = {
|
||
{ SrvSmbRead, NULL, 0 }, // pageable code -- locked
|
||
// only and always on NTAS
|
||
{ SrvCheckAndReferenceRfcb, NULL, 0 } // 8FIL section -- locked
|
||
// when files are open
|
||
};
|
||
|
||
//
|
||
// SrvTimerList is a pool of timer/DPC structures available for use by
|
||
// code that needs to start a timer.
|
||
//
|
||
|
||
SLIST_HEADER SrvTimerList = {0};
|
||
|
||
//
|
||
// Name that should be displayed when doing a server alert.
|
||
//
|
||
|
||
PWSTR SrvAlertServiceName = NULL;
|
||
|
||
//
|
||
// Variable to store the number of tick counts for 5 seconds
|
||
//
|
||
|
||
ULONG SrvFiveSecondTickCount = 0;
|
||
|
||
//
|
||
// Flag indicating whether or not we need to filter extended characters
|
||
// out of 8.3 names ourselves.
|
||
//
|
||
BOOLEAN SrvFilterExtendedCharsInPath = FALSE;
|
||
|
||
//
|
||
// Flag indicating if we enforce all logoff times
|
||
//
|
||
BOOLEAN SrvEnforceLogoffTimes = FALSE;
|
||
|
||
//
|
||
// Holds the TDI PNP notification handle
|
||
//
|
||
HANDLE SrvTdiNotificationHandle = 0;
|
||
|
||
//
|
||
// Flag indicating whether or not SMB security signatures are enabled.
|
||
//
|
||
BOOLEAN SrvSmbSecuritySignaturesEnabled = FALSE;
|
||
|
||
//
|
||
// 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.
|
||
//
|
||
BOOLEAN SrvSmbSecuritySignaturesRequired = FALSE;
|
||
|
||
//
|
||
// Flag indicating whether or not SMB security signatures should be applied to W9x
|
||
// clients.
|
||
//
|
||
BOOLEAN SrvEnableW9xSecuritySignatures = FALSE;
|
||
|
||
//
|
||
// Maximum amount of data that we'll allocate to support a METHOD_NEITHER Fsctl call
|
||
//
|
||
ULONG SrvMaxFsctlBufferSize = 70*1024;
|
||
|
||
//
|
||
// Maximum NT transaction size which we'll accept.
|
||
//
|
||
ULONG SrvMaxNtTransactionSize = 70*1024;
|
||
|
||
//
|
||
// 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
|
||
//
|
||
ULONG SrvMaxReadSize = 64*1024;
|
||
|
||
//
|
||
// 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.
|
||
//
|
||
ULONG SrvMaxCompressedDataLength = 64*1024;
|
||
|
||
//
|
||
// 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.
|
||
//
|
||
ULONG SrvMaxWriteChunk = 64 * 1024;
|
||
|
||
//
|
||
// Handle used for PoRegisterSystemState calls
|
||
//
|
||
PVOID SrvPoRegistrationState = NULL;
|
||
//
|
||
// Counter used to suppress extraneous PoRegisterSystemStateCalls
|
||
//
|
||
ULONG SrvIdleCount = 0;
|
||
|
||
//
|
||
// If a server worker threads remains idle for this many ticks, then it terminate
|
||
//
|
||
LONGLONG SrvIdleThreadTimeOut = 0;
|
||
|
||
//
|
||
// Denial-of-Service monitoring and logging controls
|
||
//
|
||
LARGE_INTEGER SrvLastDosAttackTime = {0};
|
||
ULONG SrvDOSAttacks = 0;
|
||
BOOLEAN SrvLogEventOnDOS = TRUE;
|
||
|
||
|
||
#if SRVNTVERCHK
|
||
//
|
||
// This is the minimum NT5 client build number that we will allow to connect to the server
|
||
//
|
||
ULONG SrvMinNT5Client = 0;
|
||
BOOLEAN SrvMinNT5ClientIPCToo = FALSE;
|
||
|
||
//
|
||
// 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
|
||
//
|
||
DWORD SrvAllowIPAddress[25];
|
||
#endif
|
||
|
||
//
|
||
// These are used to track persistent connections/handles. The counters are
|
||
// assigned to RFCBs, connections, and sessions.
|
||
//
|
||
|
||
#ifdef INCLUDE_SMB_PERSISTENT
|
||
ULONG SrvGlobalPersistentSessionId = 0;
|
||
ULONG SrvGlobalPersistentRfcbId = 0;
|
||
#endif
|
||
|
||
|
||
VOID
|
||
SrvInitializeData (
|
||
VOID
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This is the initialization routine for data defined in this module.
|
||
|
||
Arguments:
|
||
|
||
None.
|
||
|
||
Return Value:
|
||
|
||
None.
|
||
|
||
--*/
|
||
|
||
{
|
||
ULONG i,j;
|
||
ANSI_STRING string;
|
||
|
||
PAGED_CODE( );
|
||
|
||
#if MULTIPROCESSOR
|
||
SrvMultiProcessorDriver = TRUE;
|
||
#endif
|
||
|
||
//
|
||
// Initialize the statistics database.
|
||
//
|
||
|
||
RtlZeroMemory( &SrvStatistics, sizeof(SrvStatistics) );
|
||
#if SRVDBG_STATS || SRVDBG_STATS2
|
||
RtlZeroMemory( &SrvDbgStatistics, sizeof(SrvDbgStatistics) );
|
||
#endif
|
||
|
||
//
|
||
// Store the address of the initial system process for later use.
|
||
//
|
||
|
||
SrvServerProcess = IoGetCurrentProcess();
|
||
|
||
//
|
||
// Store the number of processors
|
||
//
|
||
SrvNumberOfProcessors = KeNumberProcessors;
|
||
|
||
//
|
||
// Initialize the event used to determine when all endpoints have
|
||
// closed.
|
||
//
|
||
|
||
KeInitializeEvent( &SrvEndpointEvent, SynchronizationEvent, FALSE );
|
||
|
||
//
|
||
// Initialize the event used to deterine when all API requests have
|
||
// completed.
|
||
//
|
||
|
||
KeInitializeEvent( &SrvApiCompletionEvent, SynchronizationEvent, FALSE );
|
||
|
||
//
|
||
// Allocate the spin lock used to synchronize between the FSD and
|
||
// the FSP.
|
||
//
|
||
|
||
INITIALIZE_GLOBAL_SPIN_LOCK( Fsd );
|
||
|
||
#if SRVDBG || SRVDBG_HANDLES
|
||
INITIALIZE_GLOBAL_SPIN_LOCK( Debug );
|
||
#endif
|
||
|
||
INITIALIZE_GLOBAL_SPIN_LOCK( Statistics );
|
||
|
||
//
|
||
// Initialize various (non-spin) locks.
|
||
//
|
||
|
||
INITIALIZE_LOCK(
|
||
&SrvConfigurationLock,
|
||
CONFIGURATION_LOCK_LEVEL,
|
||
"SrvConfigurationLock"
|
||
);
|
||
INITIALIZE_LOCK(
|
||
&SrvStartupShutdownLock,
|
||
STARTUPSHUTDOWN_LOCK_LEVEL,
|
||
"SrvStartupShutdownLock"
|
||
);
|
||
INITIALIZE_LOCK(
|
||
&SrvEndpointLock,
|
||
ENDPOINT_LOCK_LEVEL,
|
||
"SrvEndpointLock"
|
||
);
|
||
|
||
for( i=0; i < NMFCB_HASH_TABLE_LOCKS; i++ ) {
|
||
INITIALIZE_LOCK(
|
||
&SrvMfcbHashTableLocks[i],
|
||
MFCB_LIST_LOCK_LEVEL,
|
||
"SrvMfcbListLock"
|
||
);
|
||
}
|
||
|
||
INITIALIZE_LOCK(
|
||
&SrvShareLock,
|
||
SHARE_LOCK_LEVEL,
|
||
"SrvShareLock"
|
||
);
|
||
|
||
INITIALIZE_LOCK(
|
||
&SrvOplockBreakListLock,
|
||
OPLOCK_LIST_LOCK_LEVEL,
|
||
"SrvOplockBreakListLock"
|
||
);
|
||
|
||
#if SRVDBG || SRVDBG_HANDLES
|
||
INITIALIZE_LOCK(
|
||
&SrvDebugLock,
|
||
DEBUG_LOCK_LEVEL,
|
||
"SrvDebugLock"
|
||
);
|
||
#endif
|
||
|
||
//
|
||
// Create the resource serializing access to the XACTSRV port. This
|
||
// resource protects access to the shared memory reference count and
|
||
// the shared memory heap.
|
||
//
|
||
|
||
ExInitializeResourceLite( &SrvXsResource );
|
||
|
||
//
|
||
// Initialize the need resource queue
|
||
//
|
||
|
||
InitializeListHead( &SrvNeedResourceQueue );
|
||
|
||
//
|
||
// Initialize the connection disconnect queue
|
||
//
|
||
|
||
InitializeListHead( &SrvDisconnectQueue );
|
||
|
||
//
|
||
// Initialize the configuration queue.
|
||
//
|
||
|
||
InitializeListHead( &SrvConfigurationWorkQueue );
|
||
|
||
//
|
||
// Initialize the orphan queue
|
||
//
|
||
|
||
ExInitializeSListHead( &SrvBlockOrphanage );
|
||
|
||
//
|
||
// Initialize the Timer List
|
||
//
|
||
|
||
ExInitializeSListHead( &SrvTimerList );
|
||
|
||
//
|
||
// Initialize the resource thread work item and continuation event.
|
||
// (Note that this is a notification [non-autoclearing] event.)
|
||
//
|
||
|
||
ExInitializeWorkItem(
|
||
&SrvResourceThreadWorkItem,
|
||
SrvResourceThread,
|
||
NULL
|
||
);
|
||
|
||
//
|
||
// Initialize global lists.
|
||
//
|
||
for( i=j=0; i < NMFCB_HASH_TABLE; i++ ) {
|
||
InitializeListHead( &SrvMfcbHashTable[i].List );
|
||
SrvMfcbHashTable[i].Lock = &SrvMfcbHashTableLocks[ j ];
|
||
if( ++j == NMFCB_HASH_TABLE_LOCKS ) {
|
||
j = 0;
|
||
}
|
||
}
|
||
|
||
for( i=0; i < NSHARE_HASH_TABLE; i++ ) {
|
||
InitializeListHead( &SrvShareHashTable[i] );
|
||
}
|
||
|
||
//
|
||
// Initialize the ordered list lock. Indicate that the ordered
|
||
// lists have not yet been initialized, so that TerminateServer can
|
||
// determine whether to delete them.
|
||
//
|
||
|
||
INITIALIZE_LOCK(
|
||
&SrvOrderedListLock,
|
||
ORDERED_LIST_LOCK_LEVEL,
|
||
"SrvOrderedListLock"
|
||
);
|
||
|
||
SrvEndpointList.Initialized = FALSE;
|
||
SrvRfcbList.Initialized = FALSE;
|
||
SrvSessionList.Initialized = FALSE;
|
||
SrvTreeConnectList.Initialized = FALSE;
|
||
|
||
//
|
||
// Initialize the unlockable code package lock.
|
||
//
|
||
|
||
INITIALIZE_LOCK(
|
||
&SrvUnlockableCodeLock,
|
||
UNLOCKABLE_CODE_LOCK_LEVEL,
|
||
"SrvUnlockableCodeLock"
|
||
);
|
||
|
||
//
|
||
// Initialize the waiting for oplock break to occur list, and the
|
||
// oplock breaks in progress list.
|
||
//
|
||
|
||
InitializeListHead( &SrvWaitForOplockBreakList );
|
||
InitializeListHead( &SrvOplockBreaksInProgressList );
|
||
|
||
//
|
||
// The default security quality of service for non NT clients.
|
||
//
|
||
|
||
SrvSecurityQOS.ImpersonationLevel = SecurityImpersonation;
|
||
SrvSecurityQOS.ContextTrackingMode = SECURITY_STATIC_TRACKING;
|
||
SrvSecurityQOS.EffectiveOnly = FALSE;
|
||
|
||
//
|
||
// Initialize Unicode strings.
|
||
//
|
||
|
||
RtlInitString( &string, StrPipeSlash );
|
||
RtlAnsiStringToUnicodeString(
|
||
&SrvCanonicalNamedPipePrefix,
|
||
&string,
|
||
TRUE
|
||
);
|
||
|
||
RtlInitUnicodeString( &SrvNamedPipeRootDirectory, StrNamedPipeDevice );
|
||
RtlInitUnicodeString( &SrvMailslotRootDirectory, StrMailslotDevice );
|
||
|
||
//
|
||
// The server's name
|
||
//
|
||
|
||
RtlInitUnicodeString( &SrvNativeLanMan, StrNativeLanman );
|
||
RtlInitAnsiString( (PANSI_STRING)&SrvOemNativeLanMan, StrNativeLanmanOem );
|
||
|
||
//
|
||
// The system root
|
||
//
|
||
#if defined(i386)
|
||
RtlInitUnicodeString( &SrvSystemRoot, SharedUserData->NtSystemRoot );
|
||
#endif
|
||
|
||
//
|
||
// Debug logic to verify the contents of SrvApiDispatchTable (see
|
||
// inititialization earlier in this module).
|
||
//
|
||
|
||
ASSERT( SRV_API_INDEX(FSCTL_SRV_MAX_API_CODE) + 1 ==
|
||
sizeof(SrvApiDispatchTable) / sizeof(PAPI_PROCESSOR) );
|
||
|
||
ASSERT( SrvApiDispatchTable[SRV_API_INDEX(
|
||
FSCTL_SRV_NET_CONNECTION_ENUM)] == SrvNetConnectionEnum );
|
||
ASSERT( SrvApiDispatchTable[SRV_API_INDEX(
|
||
FSCTL_SRV_NET_FILE_CLOSE)] == SrvNetFileClose );
|
||
ASSERT( SrvApiDispatchTable[SRV_API_INDEX(
|
||
FSCTL_SRV_NET_FILE_ENUM)] == SrvNetFileEnum );
|
||
ASSERT( SrvApiDispatchTable[SRV_API_INDEX(
|
||
FSCTL_SRV_NET_SERVER_DISK_ENUM)] == SrvNetServerDiskEnum );
|
||
ASSERT( SrvApiDispatchTable[SRV_API_INDEX(
|
||
FSCTL_SRV_NET_SERVER_SET_INFO)] == SrvNetServerSetInfo );
|
||
ASSERT( SrvApiDispatchTable[SRV_API_INDEX(
|
||
FSCTL_SRV_NET_SERVER_XPORT_ADD)] == SrvNetServerTransportAdd );
|
||
ASSERT( SrvApiDispatchTable[SRV_API_INDEX(
|
||
FSCTL_SRV_NET_SERVER_XPORT_DEL)] == SrvNetServerTransportDel );
|
||
ASSERT( SrvApiDispatchTable[SRV_API_INDEX(
|
||
FSCTL_SRV_NET_SERVER_XPORT_ENUM)] == SrvNetServerTransportEnum );
|
||
ASSERT( SrvApiDispatchTable[SRV_API_INDEX(
|
||
FSCTL_SRV_NET_SESSION_DEL)] == SrvNetSessionDel );
|
||
ASSERT( SrvApiDispatchTable[SRV_API_INDEX(
|
||
FSCTL_SRV_NET_SESSION_ENUM)] == SrvNetSessionEnum );
|
||
ASSERT( SrvApiDispatchTable[SRV_API_INDEX(
|
||
FSCTL_SRV_NET_SHARE_ADD)] == SrvNetShareAdd );
|
||
ASSERT( SrvApiDispatchTable[SRV_API_INDEX(
|
||
FSCTL_SRV_NET_SHARE_DEL)] == SrvNetShareDel );
|
||
ASSERT( SrvApiDispatchTable[SRV_API_INDEX(
|
||
FSCTL_SRV_NET_SHARE_ENUM)] == SrvNetShareEnum );
|
||
ASSERT( SrvApiDispatchTable[SRV_API_INDEX(
|
||
FSCTL_SRV_NET_SHARE_SET_INFO)] == SrvNetShareSetInfo );
|
||
ASSERT( SrvApiDispatchTable[SRV_API_INDEX(
|
||
FSCTL_SRV_NET_STATISTICS_GET)] == SrvNetStatisticsGet );
|
||
|
||
//
|
||
// Setup error log records
|
||
//
|
||
|
||
SrvErrorRecord.AlertNumber = ALERT_ErrorLog;
|
||
SrvNetworkErrorRecord.AlertNumber = ALERT_NetIO;
|
||
|
||
//
|
||
// Names for the various types of clients. This array corresponds
|
||
// to the SMB_DIALECT enumerated type.
|
||
//
|
||
|
||
for ( i = 0; i <= SmbDialectMsNet30; i++ ) {
|
||
RtlInitUnicodeString( &SrvClientTypes[i], StrClientTypes[i] );
|
||
}
|
||
for ( ; i < LAST_DIALECT; i++ ) {
|
||
SrvClientTypes[i] = SrvClientTypes[i-1]; // "DOWN LEVEL"
|
||
}
|
||
|
||
//
|
||
// Initialize the timer pool.
|
||
//
|
||
|
||
INITIALIZE_GLOBAL_SPIN_LOCK( Timer );
|
||
|
||
//
|
||
// Initialize the 4 endpoint spinlocks
|
||
//
|
||
|
||
for ( i = 0 ; i < ENDPOINT_LOCK_COUNT ; i++ ) {
|
||
INITIALIZE_SPIN_LOCK( &ENDPOINT_SPIN_LOCK(i) );
|
||
}
|
||
//KeSetSpecialSpinLock( &ENDPOINT_SPIN_LOCK(0), "endpoint 0 " );
|
||
//KeSetSpecialSpinLock( &ENDPOINT_SPIN_LOCK(1), "endpoint 1 " );
|
||
//KeSetSpecialSpinLock( &ENDPOINT_SPIN_LOCK(2), "endpoint 2 " );
|
||
//KeSetSpecialSpinLock( &ENDPOINT_SPIN_LOCK(3), "endpoint 3 " );
|
||
|
||
//
|
||
// Initialize the DMA alignment size
|
||
//
|
||
|
||
SrvCacheLineSize = KeGetRecommendedSharedDataAlignment(); // For PERF improvement, get the recommended cacheline
|
||
// alignment, instead of the HAL default
|
||
|
||
#if SRVDBG
|
||
{
|
||
ULONG cls = SrvCacheLineSize;
|
||
while ( cls > 2 ) {
|
||
ASSERTMSG(
|
||
"SRV: cache line size not a power of two",
|
||
(cls & 1) == 0 );
|
||
cls = cls >> 1;
|
||
}
|
||
}
|
||
#endif
|
||
|
||
if ( SrvCacheLineSize < 8 ) SrvCacheLineSize = 8;
|
||
|
||
SrvCacheLineSize--;
|
||
|
||
//
|
||
// Compute the number of tick counts for 5 seconds
|
||
//
|
||
|
||
SrvFiveSecondTickCount = 5*10*1000*1000 / KeQueryTimeIncrement();
|
||
|
||
return;
|
||
|
||
} // SrvInitializeData
|
||
|
||
|
||
VOID
|
||
SrvTerminateData (
|
||
VOID
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This is the rundown routine for data defined in this module. It is
|
||
called when the server driver is unloaded.
|
||
|
||
Arguments:
|
||
|
||
None.
|
||
|
||
Return Value:
|
||
|
||
None.
|
||
|
||
--*/
|
||
|
||
{
|
||
ULONG i;
|
||
|
||
PAGED_CODE( );
|
||
|
||
//
|
||
// Clean up SmbTrace.
|
||
//
|
||
|
||
SmbTraceTerminate( SMBTRACE_SERVER );
|
||
|
||
//
|
||
// Terminate various (non-spin) locks.
|
||
//
|
||
|
||
DELETE_LOCK( &SrvConfigurationLock );
|
||
DELETE_LOCK( &SrvStartupShutdownLock );
|
||
DELETE_LOCK( &SrvEndpointLock );
|
||
|
||
for( i=0; i < NMFCB_HASH_TABLE_LOCKS; i++ ) {
|
||
DELETE_LOCK( &SrvMfcbHashTableLocks[i] );
|
||
}
|
||
|
||
DELETE_LOCK( &SrvShareLock );
|
||
DELETE_LOCK( &SrvOplockBreakListLock );
|
||
|
||
#if SRVDBG || SRVDBG_HANDLES
|
||
DELETE_LOCK( &SrvDebugLock );
|
||
#endif
|
||
|
||
DELETE_LOCK( &SrvOrderedListLock );
|
||
DELETE_LOCK( &SrvUnlockableCodeLock );
|
||
|
||
ExDeleteResourceLite( &SrvXsResource );
|
||
|
||
RtlFreeUnicodeString( &SrvCanonicalNamedPipePrefix );
|
||
|
||
RtlFreeUnicodeString( &SrvComputerName );
|
||
|
||
} // SrvTerminateData
|
||
|