296 lines
8.7 KiB
C
296 lines
8.7 KiB
C
/*
|
|
|
|
Copyright (c) 1992 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
sda.h
|
|
|
|
Abstract:
|
|
|
|
This module contains session data area and related data structures.
|
|
|
|
Author:
|
|
|
|
Jameel Hyder (microsoft!jameelh)
|
|
|
|
|
|
Revision History:
|
|
25 Apr 1992 Initial Version
|
|
|
|
Notes: Tab stop: 4
|
|
--*/
|
|
|
|
#ifndef _SDA_
|
|
#define _SDA_
|
|
|
|
// sda_Flags values
|
|
#define SDA_USER_NOT_LOGGEDIN 0x0000 //
|
|
#define SDA_USER_LOGIN_PARTIAL 0x0001 // Encrypted logon is half-way done
|
|
#define SDA_USER_LOGGEDIN 0x0002
|
|
#define SDA_LOGIN_MASK 0x0003
|
|
|
|
#define SDA_REQUEST_IN_PROCESS 0x0004 // A request is being processed
|
|
#define SDA_REPLY_IN_PROCESS 0x0008 // A reply has been posted
|
|
#define SDA_NAMEXSPACE_IN_USE 0x0010 // NameXSpace is in use by reply processing
|
|
|
|
#define SDA_DEREF_VOLUME 0x0020 // Dereference volume before reply
|
|
#define SDA_DEREF_OFORK 0x0040 // Dereference open-fork before reply
|
|
#define SDA_LOGIN_FAILED 0x0080 // Funky stuff for AFP 2.1 Chooser
|
|
#define SDA_CLIENT_CLOSE 0x0100 // Set if the close if hapenning from the client side
|
|
#define SDA_QUEUE_IF_DPC 0x0200 // Copied from the dispatch table (see afpapi.c)
|
|
#define SDA_SESSION_CLOSED 0x0400 // If set, do not close session in deref.
|
|
#define SDA_SESSION_CLOSE_COMP 0x0800 // If set, close completion called for this session
|
|
#define SDA_SESSION_OVER_TCP 0x1000 // this is an AFP/TCP session
|
|
#define SDA_SESSION_NOTIFY_SENT 0x2000 // Server Notification sent to this sda
|
|
#define SDA_CLOSING 0x8000 // Session is marked to die
|
|
|
|
// sda_ClientType values
|
|
#define SDA_CLIENT_GUEST NO_USER_AUTHENT
|
|
#define SDA_CLIENT_CLEARTEXT CLEAR_TEXT_AUTHENT
|
|
#define SDA_CLIENT_MSUAM_V1 CUSTOM_UAM_V1
|
|
#define SDA_CLIENT_MSUAM_V2 CUSTOM_UAM_V2
|
|
#define SDA_CLIENT_RANDNUM RANDNUM_EXCHANGE
|
|
#define SDA_CLIENT_TWOWAY TWOWAY_EXCHANGE
|
|
#define SDA_CLIENT_ADMIN AFP_NUM_UAMS
|
|
|
|
#define MAX_REQ_ENTRIES 7
|
|
#define MAX_REQ_ENTRIES_PLUS_1 8 // used to allocate space 1 DWORD more
|
|
// than required. The first entry is
|
|
// used to store pointer to VolDesc
|
|
// or ConnDesc. The extra DWORD is used
|
|
// to accomodate 64-bit pointer if we
|
|
// have one
|
|
#define MAX_VAR_ENTRIES 3
|
|
|
|
#define SESSION_CHECK_TIME 60 // In seconds
|
|
#define SESSION_WARN_TIME SESSION_CHECK_TIME * 10
|
|
|
|
// SDA_SIZE is the total size allocated to the SDA pointer
|
|
// This includes sizeof(SDA) plus additional buffer allocated for
|
|
// copying strings into. This extra space is allocated after the
|
|
// first sizeof(SDA) bytes. The size is purely a ball-park figure
|
|
// The original design does not mention why the total space was 384
|
|
// Currently we are doubling the space to accomodate 64-bit stuff
|
|
#ifdef _WIN64
|
|
#define SDA_SIZE (((768 - POOL_OVERHEAD)+7) & 0xfffffff8)
|
|
#else
|
|
#define SDA_SIZE (((450 - POOL_OVERHEAD)+7) & 0xfffffff8)
|
|
#endif
|
|
|
|
// Linked list of deferred request packets. If the session is already
|
|
// processing a request, then subsequent requests are queued. These
|
|
// are always handled in a FIFO order.
|
|
typedef struct _DeferredRequestQueue
|
|
{
|
|
LIST_ENTRY drq_Link;
|
|
PREQUEST drq_pRequest;
|
|
} DFRDREQQ, *PDFRDREQQ;
|
|
|
|
/*
|
|
* This is the per-session data area. This is allocated whenever a listen is
|
|
* posted. At that point it is in the outstanding session list. When the listen
|
|
* is completed, it moves to the active session list.
|
|
*/
|
|
#if DBG
|
|
#define SDA_SIGNATURE *(DWORD *)"SDA"
|
|
#define VALID_SDA(pSda) (((pSda) != NULL) && \
|
|
((pSda)->Signature == SDA_SIGNATURE))
|
|
#else
|
|
#define VALID_SDA(pSda) ((pSda) != NULL)
|
|
#endif
|
|
|
|
typedef struct _SessDataArea
|
|
{
|
|
#if DBG
|
|
DWORD Signature;
|
|
#endif
|
|
struct _SessDataArea * sda_Next; // link to next session in session list
|
|
AFP_SPIN_LOCK sda_Lock; // Lock for manipulating certain SDA
|
|
// fields
|
|
DWORD sda_Flags; // Bit mask of the SDA states
|
|
LONG sda_RefCount; // Count of references to this SDA
|
|
PASP_XPORT_ENTRIES sda_XportTable; // pointer to ASP's or DSI's entry points
|
|
DWORD sda_MaxWriteSize; // 64000 for TCP/IP, 4624 for Appletalk
|
|
PVOID sda_SessHandle; // Asp Session handle
|
|
PREQUEST sda_Request; // Current request
|
|
HANDLE sda_UserToken; // Logon token for this user.
|
|
PSID sda_UserSid; // SID representing owner
|
|
PSID sda_GroupSid; // SID representing primary group
|
|
PTOKEN_GROUPS sda_pGroups; // List of groups this user is member of
|
|
#ifdef INHERIT_DIRECTORY_PERMS
|
|
DWORD sda_UID; // User Id corres. to sda_UserSid
|
|
DWORD sda_GID; // Group Id corres. to sda_GroupSid
|
|
#else
|
|
PISECURITY_DESCRIPTOR sda_pSecDesc; // Security descriptor used by directory
|
|
// Creation API
|
|
DWORD sda_Dummy; // For alignment
|
|
#endif
|
|
PANSI_STRING sda_Message; // The actual message in macintosh ansi
|
|
// The above field is used only for
|
|
// client specific message. Broadcast
|
|
// messages are stored in a global area
|
|
UNICODE_STRING sda_WSName; // Workstation name of logged in user
|
|
UNICODE_STRING sda_UserName; // User name
|
|
UNICODE_STRING sda_DomainName; // DomainName for Login/ChgPwd
|
|
|
|
#ifdef PROFILING
|
|
TIME sda_ApiStartTime; // Time stamp when Api req. was recvd.
|
|
TIME sda_QueueTime; // Time spent waiting for worker thread
|
|
#endif
|
|
|
|
DWORD sda_SessionId; // Session Id for use by admin APIs
|
|
AFPTIME sda_TimeLoggedOn; // Time when session established
|
|
// in macintosh time
|
|
DWORD sda_tTillKickOff; // # of seconds before this session will
|
|
// be kicked off
|
|
struct _ConnDesc * sda_pConnDesc; // List of connections by this session
|
|
struct _OpenForkSession sda_OpenForkSess;
|
|
// List of open files by this session
|
|
LONG sda_cOpenVolumes; // Number of volumes mounted (admin api)
|
|
LONG sda_cOpenForks; // Number of forks opened (admin api)
|
|
DWORD sda_MaxOForkRefNum; // High-water mark of the fork-ref num assigned
|
|
|
|
BYTE sda_AfpFunc; // AFP API in execution for FSP
|
|
BYTE sda_AfpSubFunc; // Sub function code used by some APIs
|
|
BYTE sda_ClientVersion; // AFP Version of the client s/w
|
|
// AFP_VER_20
|
|
// AFP_VER_21
|
|
BYTE sda_ClientType; // One of SDA_CLIENT_XXXX
|
|
BYTE sda_PathType; // For all path based calls
|
|
USHORT sda_SizeNameXSpace; // Constant, initialized once
|
|
USHORT sda_ReplySize; // Size of the reply buffer
|
|
|
|
#define sda_ReadStatus sda_SecUtilResult
|
|
NTSTATUS sda_SecUtilResult; // Result of scurity utitility call
|
|
PSID sda_SecUtilSid; // Name to Sid translation. Should be
|
|
// freed if non-null.
|
|
// The incoming packet is copied here. The parameters from the RequestBuf
|
|
// are un-marshalled into this. Each API structures this differently. Make
|
|
// sure sda_Name and sda_ReqBlock are together and next to each other AND
|
|
// in this order. The code in afpapi.c depends on this while clearing this.
|
|
// The extra DWORD is used in cases where the first entry is reused to
|
|
// stored pointer values. On 64-bit architecture we require 2 DWORD at
|
|
// the start of the ReqBlock.
|
|
DWORD sda_ReqBlock[MAX_REQ_ENTRIES_PLUS_1];
|
|
ANSI_STRING sda_Name[MAX_VAR_ENTRIES];
|
|
|
|
#define sda_Name1 sda_Name[0]
|
|
#define sda_Name2 sda_Name[1]
|
|
#define sda_Name3 sda_Name[2]
|
|
|
|
#define sda_IOBuf sda_ReplyBuf
|
|
#define sda_IOSize sda_ReplySize
|
|
|
|
PBYTE sda_ReplyBuf; // Reply Buffer (variable size)
|
|
|
|
AFPAPIWORKER sda_WorkerRoutine; // Api Worker
|
|
WORK_ITEM sda_WorkItem; // For queueing up to worker threads
|
|
|
|
PBYTE sda_Challenge; // Challenge from MSV1_0
|
|
|
|
LIST_ENTRY sda_DeferredQueue; // Queue of deferred requests
|
|
PBYTE sda_NameBuf; // Space is allocated for variable
|
|
// part of request buffer here.
|
|
PBYTE sda_NameXSpace;
|
|
} SDA, *PSDA;
|
|
|
|
GLOBAL AFP_SPIN_LOCK AfpSdaLock EQU {0};// Lock for session list
|
|
GLOBAL PSDA AfpSessionList EQU NULL;
|
|
// Linked-List of sessions
|
|
|
|
// These values are subject to tuning.
|
|
GLOBAL LONG AfpNumSessions EQU 0;
|
|
GLOBAL UNICODE_STRING AfpDefaultWksta EQU {0, 0, NULL};
|
|
|
|
extern
|
|
NTSTATUS
|
|
AfpSdaInit(
|
|
VOID
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
AfpSdaDeInit(
|
|
VOID
|
|
);
|
|
|
|
extern
|
|
PSDA FASTCALL
|
|
AfpSdaCreateNewSession(
|
|
IN PVOID SessionHandle,
|
|
IN BOOLEAN fOverTcp
|
|
);
|
|
|
|
extern
|
|
VOID FASTCALL
|
|
afpQueueDeferredRequest(
|
|
IN PSDA pSda,
|
|
IN PREQUEST pRequest
|
|
);
|
|
|
|
extern
|
|
PSDA FASTCALL
|
|
AfpSdaReferenceSessionById(
|
|
IN DWORD SessId
|
|
);
|
|
|
|
extern
|
|
PSDA FASTCALL
|
|
AfpSdaReferenceSessionByPointer(
|
|
IN PSDA pSda
|
|
);
|
|
|
|
extern
|
|
VOID FASTCALL
|
|
AfpSdaDereferenceSession(
|
|
IN PSDA pSda
|
|
);
|
|
|
|
extern
|
|
AFPSTATUS FASTCALL
|
|
AfpSdaCloseSession(
|
|
IN PSDA pSda
|
|
);
|
|
|
|
extern
|
|
AFPSTATUS
|
|
AfpAdmWSessionClose(
|
|
IN OUT PVOID Inbuf OPTIONAL,
|
|
IN LONG OutBufLen OPTIONAL,
|
|
OUT PVOID Outbuf OPTIONAL
|
|
);
|
|
|
|
extern
|
|
AFPSTATUS FASTCALL
|
|
AfpSdaCheckSession(
|
|
IN PVOID pContext
|
|
);
|
|
|
|
extern
|
|
VOID FASTCALL
|
|
AfpKillSessionsOverProtocol(
|
|
IN BOOLEAN fAppletalkSessions
|
|
);
|
|
|
|
extern
|
|
VOID FASTCALL
|
|
afpUpdateDiskQuotaInfo(
|
|
IN struct _ConnDesc * pConnDesc
|
|
);
|
|
|
|
#ifdef _SDA_LOCALS
|
|
|
|
LOCAL DWORD afpNextSessionId = 1;
|
|
|
|
LOCAL AFPSTATUS FASTCALL
|
|
afpCloseSessionAndFreeSda(
|
|
IN PSDA pSda
|
|
);
|
|
|
|
#endif // _SDA_LOCALS
|
|
|
|
#endif // _SDA_
|
|
|
|
|