411 lines
11 KiB
C
411 lines
11 KiB
C
/*
|
||
|
||
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 PBYTE AfpCasePreserveTranslationTable 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 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 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(); \
|
||
} \
|
||
}
|
||
|
||
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_
|
||
|
||
|