You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
414 lines
14 KiB
414 lines
14 KiB
/*
|
|
|
|
Copyright (c) 1992 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
server.h
|
|
|
|
Abstract:
|
|
|
|
This module contains server definition and data structures relating to
|
|
server class APIs.
|
|
|
|
Author:
|
|
|
|
Jameel Hyder (microsoft!jameelh)
|
|
|
|
|
|
Revision History:
|
|
25 Apr 1992 Initial Version
|
|
|
|
Notes: Tab stop: 4
|
|
--*/
|
|
|
|
#ifndef _SERVER_
|
|
#define _SERVER_
|
|
|
|
// AfpGetSrvrMsg values
|
|
#define SRVRMSG_LOGIN 0
|
|
#define SRVRMSG_SERVER 1
|
|
#define SRVRMSG_BITMAP_MESSAGE 1
|
|
|
|
// Attention word definitions. These are the only one's used.
|
|
#define ATTN_SERVER_SHUTDOWN 0x8000
|
|
#define ATTN_USER_DISCONNECT 0x9000
|
|
#define ATTN_SERVER_MESSAGE 0x2000
|
|
#define ATTN_SERVER_NOTIFY 0x3001
|
|
#define ATTN_TIME_MASK 0x0FFF
|
|
|
|
// AfpGetUserInfo values
|
|
#define USERINFO_BITMAP_USERID 1
|
|
#define USERINFO_BITMAP_PRIGID 2
|
|
#define USERINFO_THISUSER 1
|
|
|
|
// AfpMapId subfunction values
|
|
#define MAP_USER_ID 1
|
|
#define MAP_GROUP_ID 2
|
|
#define MAP_USER_NAME 3
|
|
#define MAP_GROUP_NAME 4
|
|
|
|
#define SRVRPARMS_VOLUMEHASPASS 0x80
|
|
|
|
// AfpGetSrvrInfo values
|
|
#define SRVRINFO_SUPPORTS_COPYFILE 0x0001
|
|
#define SRVRINFO_SUPPORTS_CHGPASSWD 0x0002
|
|
#define SRVRINFO_DISALLOW_SAVEPASS 0x0004
|
|
#define SRVRINFO_SUPPORTS_SERVERMSG 0x0008
|
|
#define SRVRINFO_SUPPORTS_SRVSIGN 0x0010
|
|
#define SRVRINFO_SUPPORTS_TCPIP 0x0020
|
|
#define SRVRINFO_SUPPORTS_SRVNOTIFY 0x0040
|
|
#define SRVRINFO_SUPPORTS_MGETREQS 0x8000
|
|
#define SRVRINFO_MASK 0x800F
|
|
|
|
// in hopes that we will save some network traffic, we delay server notification for
|
|
// some time, so if too many changes are happening (e.g. xcopy on that dir) then
|
|
// we send just one notification for several of the changes combined...
|
|
#define AFP_MIN_SRVR_NOTIF_INTERVAL 3
|
|
|
|
// at the same time, we don't want to not send a notification for too long
|
|
#define AFP_MAX_SRVR_NOTIF_INTERVAL 15
|
|
|
|
// Server State values.
|
|
#define AFP_STATE_IDLE 0xFF
|
|
#define AFP_STATE_STOPPED 0x00
|
|
#define AFP_STATE_STOP_PENDING 0x01
|
|
#define AFP_STATE_START_PENDING 0x02
|
|
#define AFP_STATE_RUNNING 0x04
|
|
#define AFP_STATE_PAUSE_PENDING 0x08
|
|
#define AFP_STATE_PAUSED 0x10
|
|
#define AFP_STATE_CONTINUE_PENDING 0x20
|
|
#define AFP_STATE_SHUTTINGDOWN 0x40
|
|
#define AFP_STATE_PENDING_ANY (AFP_STATE_STOP_PENDING | \
|
|
AFP_STATE_START_PENDING | \
|
|
AFP_STATE_PAUSE_PENDING | \
|
|
AFP_STATE_CONTINUE_PENDING)
|
|
|
|
#define AFP_XLAT_TABLE_SIZE 128
|
|
#define AFP_REV_XLAT_TABLE_SIZE 256 - (0x80 - 0x20)
|
|
|
|
// all server global data must be non-pagable if it is protected by
|
|
// an executive spin-lock (i.e. accessed at IRQL DISPATCH_LEVEL)
|
|
|
|
GLOBAL AFP_SPIN_LOCK AfpServerGlobalLock EQU {0};
|
|
GLOBAL AFP_SPIN_LOCK AfpSwmrLock EQU {0};
|
|
GLOBAL PBYTE AfpServerIcon EQU NULL;
|
|
GLOBAL PANSI_STRING AfpServerMsg EQU NULL;
|
|
GLOBAL ANSI_STRING AfpServerName EQU { 0, 0 , NULL};
|
|
GLOBAL ANSI_STRING AfpLoginMsg EQU { 0, 0 , NULL};
|
|
GLOBAL UNICODE_STRING AfpLoginMsgU EQU { 0, 0 , NULL};
|
|
|
|
// There is no lock protecting the following codepage related variables
|
|
GLOBAL PBYTE AfpTranslationTable EQU NULL;
|
|
GLOBAL PBYTE AfpRevTranslationTable EQU NULL;
|
|
GLOBAL PUSHORT AfpMacCPBaseAddress EQU NULL;
|
|
GLOBAL CPTABLEINFO AfpMacCPTableInfo EQU { 0 };
|
|
|
|
GLOBAL DWORD AfpServerState EQU AFP_STATE_IDLE;
|
|
GLOBAL DWORD AfpServerMaxSessions EQU AFP_MAXSESSIONS;
|
|
GLOBAL KEVENT AfpStopConfirmEvent EQU { 0 };
|
|
GLOBAL KMUTEX AfpPgLkMutex EQU { 0 };
|
|
GLOBAL DWORD AfpServerOptions EQU AFP_SRVROPT_NONE;
|
|
GLOBAL PDEVICE_OBJECT AfpDeviceObject EQU NULL;
|
|
GLOBAL BOOLEAN AfpServerIsStandalone EQU { 0 };
|
|
GLOBAL BOOLEAN AfpServerIsGreek EQU { 0 };
|
|
|
|
GLOBAL LONG AfpEtcMapCount EQU 0; // # valid entries
|
|
GLOBAL LONG AfpEtcMapsSize EQU 0; // # entries allocated
|
|
GLOBAL struct _EtcMapInfo * AfpEtcMaps EQU NULL; // array of entries
|
|
GLOBAL struct _EtcMapInfo AfpDefaultEtcMap EQU { 0 };
|
|
GLOBAL SWMR AfpEtcMapLock EQU { 0 };
|
|
|
|
GLOBAL DWORD AfpSecondsSinceEpoch EQU 0;
|
|
#ifdef USE_OBSOLETE_LSA_API
|
|
GLOBAL HANDLE AfpLsaHandle EQU NULL;
|
|
#endif
|
|
|
|
GLOBAL CredHandle AfpSecHandle EQU {0, 0};
|
|
GLOBAL HANDLE AfpFspToken EQU NULL;
|
|
|
|
#ifdef OPTIMIZE_GUEST_LOGONS
|
|
GLOBAL HANDLE AfpGuestToken EQU NULL;
|
|
#endif
|
|
|
|
GLOBAL ULONG EncryptionKeyCount EQU 0;
|
|
GLOBAL PEPROCESS AfpProcessObject EQU NULL;
|
|
GLOBAL DWORD AfpAuthenticationPackage EQU 0;
|
|
GLOBAL PETHREAD AfpThread EQU NULL;
|
|
|
|
GLOBAL AFP_SPIN_LOCK AfpStatisticsLock EQU {0};
|
|
GLOBAL AFP_STATISTICS_INFO_EX AfpServerStatistics EQU { 0 };
|
|
|
|
GLOBAL DWORD AfpSrvrNotifSentTime EQU 0;
|
|
GLOBAL BOOLEAN fAfpServerShutdownEvent EQU FALSE;
|
|
GLOBAL BOOLEAN fAfpAdminStop EQU FALSE;
|
|
|
|
#ifdef PROFILING
|
|
GLOBAL PAFP_PROFILE_INFO AfpServerProfile EQU NULL;
|
|
#endif
|
|
|
|
GLOBAL DWORD AfpPagedPoolLimit EQU AFP_DEF_MAXPAGEDMEM * 1024;
|
|
GLOBAL DWORD AfpNonPagedPoolLimit EQU AFP_DEF_MAXNONPAGEDMEM * 1024;
|
|
GLOBAL SECURITY_QUALITY_OF_SERVICE AfpSecurityQOS EQU { 0 };
|
|
GLOBAL ANSI_STRING AfpVersions[AFP_NUM_VERSIONS] EQU { 0 };
|
|
|
|
#define AfpVersion20 AfpVersions[AFP_VER_20]
|
|
#define AfpVersion21 AfpVersions[AFP_VER_21]
|
|
#define AfpVersion22 AfpVersions[AFP_VER_22]
|
|
|
|
GLOBAL ANSI_STRING AfpUamStrings[AFP_NUM_UAMS] EQU { 0 };
|
|
|
|
#define AfpUamGuest AfpUamStrings[NO_USER_AUTHENT]
|
|
#define AfpUamClearText AfpUamStrings[CLEAR_TEXT_AUTHENT]
|
|
#define AfpUamCustomV1 AfpUamStrings[CUSTOM_UAM_V1]
|
|
#define AfpUamCustomV2 AfpUamStrings[CUSTOM_UAM_V2]
|
|
#define AfpUamCustomV3 AfpUamStrings[CUSTOM_UAM_V3]
|
|
#define AfpUamApple AfpUamStrings[RANDNUM_EXCHANGE]
|
|
#define AfpUamApple2Way AfpUamStrings[TWOWAY_EXCHANGE]
|
|
|
|
GLOBAL LARGE_INTEGER FiveSecTimeOut EQU {0, 0};
|
|
GLOBAL LARGE_INTEGER ThreeSecTimeOut EQU {0, 0};
|
|
GLOBAL LARGE_INTEGER TwoSecTimeOut EQU {0, 0};
|
|
GLOBAL LARGE_INTEGER OneSecTimeOut EQU {0, 0};
|
|
GLOBAL LARGE_INTEGER LIZero EQU {0, 0};
|
|
GLOBAL UNICODE_STRING UNullString EQU {0, 0, NULL};
|
|
|
|
GLOBAL BYTE AfpServerSignature[16] EQU {0};
|
|
|
|
#define THREAD_BASE_PRIORITY_MAX 2 // maximum thread base priority boost
|
|
|
|
// To manage our own threads
|
|
#define AFP_MIN_THREADS 3 // Independent of processors
|
|
#define AFP_MAX_THREADS 200 // Independent of processors
|
|
#define NUM_NOTIFY_QUEUES 2 // # of change notify threads
|
|
|
|
#define AFP_THREAD_THRESHOLD_REQS 2
|
|
#define AFP_THREAD_THRESHOLD_IDLE 8
|
|
|
|
typedef BYTE THREAD_STATE, *PTHREAD_STATE;
|
|
|
|
typedef LONG (FASTCALL *WORKER)(IN PVOID);
|
|
|
|
#define AFP_THREAD_DEAD 0
|
|
#define AFP_THREAD_STARTED 1
|
|
#define AFP_THREAD_WAITING 2
|
|
#define AFP_THREAD_BUSY 3
|
|
|
|
typedef struct
|
|
{
|
|
LIST_ENTRY wi_List;
|
|
WORKER wi_Worker;
|
|
PVOID wi_Context;
|
|
} WORK_ITEM, *PWORK_ITEM;
|
|
|
|
GLOBAL WORK_ITEM AfpTerminateThreadWI EQU { 0 };
|
|
|
|
#define AfpInitializeWorkItem(pWI, Worker, Context) \
|
|
{ \
|
|
InitializeListHead(&(pWI)->wi_List); \
|
|
(pWI)->wi_Worker = (WORKER)(Worker); \
|
|
(pWI)->wi_Context = (Context); \
|
|
}
|
|
|
|
GLOBAL THREAD_STATE AfpThreadState[AFP_MAX_THREADS] EQU { AFP_THREAD_DEAD };
|
|
GLOBAL PETHREAD AfpThreadPtrsW[AFP_MAX_THREADS] EQU { NULL };
|
|
GLOBAL PETHREAD AfpThreadPtrsN[NUM_NOTIFY_QUEUES] EQU { NULL };
|
|
|
|
#if DBG
|
|
GLOBAL LONG AfpThreadDispCount[AFP_MAX_THREADS] EQU { 0 };
|
|
GLOBAL AFP_SPIN_LOCK AfpDebugSpinLock EQU {0};
|
|
GLOBAL LIST_ENTRY AfpDebugDelAllocHead;
|
|
|
|
GLOBAL DWORD AfpReadCMAlloced EQU {0};
|
|
GLOBAL DWORD AfpWriteCMAlloced EQU {0};
|
|
GLOBAL DWORD AfpDbgMdlsAlloced EQU 0;
|
|
GLOBAL DWORD AfpDbgIrpsAlloced EQU 0;
|
|
|
|
#define AFP_DBG_INC_COUNT(_Val) \
|
|
{ \
|
|
KIRQL _OldIrql; \
|
|
ACQUIRE_SPIN_LOCK(&AfpDebugSpinLock, &_OldIrql); \
|
|
_Val++; \
|
|
RELEASE_SPIN_LOCK(&AfpDebugSpinLock, _OldIrql); \
|
|
}
|
|
#define AFP_DBG_DEC_COUNT(_Val) \
|
|
{ \
|
|
KIRQL _OldIrql; \
|
|
ACQUIRE_SPIN_LOCK(&AfpDebugSpinLock, &_OldIrql); \
|
|
if (_Val == 0) \
|
|
{ \
|
|
DbgPrint("How come this is 0!!\n"); \
|
|
DbgBreakPoint(); \
|
|
} \
|
|
_Val--; \
|
|
RELEASE_SPIN_LOCK(&AfpDebugSpinLock, _OldIrql); \
|
|
}
|
|
#else
|
|
#define AFP_DBG_INC_COUNT(_Val)
|
|
#define AFP_DBG_DEC_COUNT(_Val)
|
|
#endif
|
|
|
|
GLOBAL LONG AfpLockCount EQU 0;
|
|
GLOBAL PVOID AfpLockHandle EQU NULL;
|
|
GLOBAL LONG AfpWorkerRequests EQU 0;
|
|
GLOBAL LONG AfpNumThreads EQU 0;
|
|
GLOBAL LONG AfpNumNotifyThreads EQU 0;
|
|
GLOBAL LONG AfpNumAdminThreads EQU 0;
|
|
GLOBAL KQUEUE AfpWorkerQueue EQU { 0 };
|
|
GLOBAL KQUEUE AfpDelAllocQueue EQU { 0 };
|
|
GLOBAL KQUEUE AfpAdminQueue EQU { 0 };
|
|
|
|
GLOBAL BOOLEAN AfpIsMachineLittleEndian EQU True;
|
|
|
|
GLOBAL HANDLE AfpTdiNotificationHandle EQU NULL;
|
|
GLOBAL BOOLEAN AfpServerBoundToAsp EQU FALSE;
|
|
GLOBAL BOOLEAN AfpServerBoundToTcp EQU FALSE;
|
|
|
|
typedef AFPSTATUS (FASTCALL *AFPAPIWORKER) (IN struct _SessDataArea *);
|
|
typedef AFPSTATUS (*ADMINAPIWORKER)(IN PVOID, IN LONG, OUT PVOID);
|
|
|
|
typedef NTSTATUS (*AFPINITSUBS) (VOID);
|
|
typedef VOID (*AFPDEINITSUBS)(VOID);
|
|
|
|
#define AFPAttachProcess(_CurrProc) \
|
|
{ \
|
|
if ((_CurrProc) != AfpProcessObject) \
|
|
{ \
|
|
KeAttachProcess( (PRKPROCESS)AfpProcessObject );\
|
|
} \
|
|
}
|
|
|
|
#define AFPDetachProcess(_CurrProc) \
|
|
{ \
|
|
if ((_CurrProc) != AfpProcessObject) \
|
|
{ \
|
|
KeDetachProcess(); \
|
|
} \
|
|
}
|
|
|
|
#define AFP_KEYPATH_SERVER_PARAMS_GREEK \
|
|
TEXT("\\REGISTRY\\MACHINE\\SYSTEM\\CurrentControlSet\\Services\\MacFile\\Parameters")
|
|
#define AFPREG_VALNAME_GreekServer TEXT("GreekServer")
|
|
|
|
extern
|
|
NTSTATUS
|
|
AfpInitializeDataAndSubsystems(
|
|
VOID
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
AfpDeinitializeSubsystems(
|
|
VOID
|
|
);
|
|
|
|
extern
|
|
VOID FASTCALL
|
|
AfpUnmarshallReq(
|
|
IN struct _SessDataArea * pSda
|
|
);
|
|
|
|
extern
|
|
VOID FASTCALL
|
|
AfpDisposeRequest(
|
|
IN struct _SessDataArea * pSda,
|
|
IN AFPSTATUS RetCode
|
|
);
|
|
|
|
extern
|
|
VOID FASTCALL
|
|
AfpStartApiProcessing(
|
|
IN struct _SessDataArea * pSda
|
|
);
|
|
|
|
extern
|
|
VOID FASTCALL
|
|
AfpCompleteApiProcessing(
|
|
IN struct _SessDataArea * pSda,
|
|
IN AFPSTATUS RetCode
|
|
);
|
|
|
|
extern
|
|
NTSTATUS FASTCALL
|
|
AfpGetWriteBuffer(
|
|
IN struct _SessDataArea * pSda,
|
|
IN PREQUEST pRequest
|
|
);
|
|
|
|
extern
|
|
NTSTATUS
|
|
AfpSetServerStatus(
|
|
IN VOID
|
|
);
|
|
|
|
extern
|
|
AFPSTATUS
|
|
AfpAdmWServerSetInfo(
|
|
IN OUT PVOID Inbuf OPTIONAL,
|
|
IN LONG OutBufLen OPTIONAL,
|
|
OUT PVOID Outbuf OPTIONAL
|
|
);
|
|
|
|
|
|
extern
|
|
NTSTATUS FASTCALL
|
|
AfpCreateNewThread(
|
|
IN VOID (*ThreadFunc)(IN PVOID pContext),
|
|
IN LONG ThreadNum
|
|
);
|
|
|
|
|
|
extern
|
|
VOID FASTCALL
|
|
AfpInitStrings(
|
|
IN VOID
|
|
);
|
|
|
|
|
|
extern
|
|
VOID
|
|
AfpWorkerThread(
|
|
IN PVOID pContext
|
|
);
|
|
|
|
extern
|
|
VOID FASTCALL
|
|
AfpQueueWorkItem(
|
|
IN PWORK_ITEM pWI
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
AfpSleepAWhile(
|
|
IN DWORD SleepDuration
|
|
);
|
|
|
|
#ifdef SERVER_LOCALS
|
|
|
|
#define NUM_INIT_SYSTEMS 11
|
|
|
|
typedef struct _AfpInitSystems
|
|
{
|
|
AFPINITSUBS InitRoutine;
|
|
AFPDEINITSUBS DeInitRoutine;
|
|
#if DBG
|
|
BOOLEAN Initialized;
|
|
BOOLEAN Deinitialized;
|
|
PCHAR InitRoutineName;
|
|
PCHAR DeInitRoutineName;
|
|
#endif
|
|
} INIT_SYSTEMS, *PINIT_SYSTEMS;
|
|
|
|
extern INIT_SYSTEMS AfpInitSubSystems[];
|
|
|
|
extern
|
|
VOID FASTCALL
|
|
afpQueueDeferredRequest(
|
|
IN struct _SessDataArea * pSda,
|
|
IN PREQUEST pRequest
|
|
);
|
|
|
|
#endif // SERVER_LOCALS
|
|
|
|
#endif // _SERVER_
|
|
|