Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

252 lines
4.0 KiB

/*
Copyright (c) 1992 Microsoft Corporation
Module Name:
secutil.h
Abstract:
Author:
Narendra Gidwani (microsoft!NarenG)
Revision History:
8 Sept. 1992 Initial Version
Notes: Tab stop: 4
--*/
#ifndef _SECUTIL_
#define _SECUTIL_
typedef struct _AFP_SID_NAME
{
AFPTIME LastAccessedTime;
UNICODE_STRING Name;
struct _AFP_SID_NAME * SidLink;
BYTE Sid[1];
} AFP_SID_NAME, *PAFP_SID_NAME;
typedef struct _AFP_SID_MACID
{
struct _AFP_SID_MACID *Next;
DWORD MacId;
BYTE Sid[1];
} AFP_SID_MACID, *PAFP_SID_MACID;
extern
NTSTATUS
AfpSecUtilInit(
VOID
);
extern
VOID
AfpSecUtilDeInit(
VOID
);
extern
NTSTATUS
AfpSecurityUtilityWorker(
IN PIRP pIrp,
IN PIO_STACK_LOCATION pIrpSp
);
extern
NTSTATUS FASTCALL
AfpNameToSid(
IN PSDA pSda,
IN PUNICODE_STRING Name
);
extern
NTSTATUS
AfpSidToName(
IN PSDA pSda,
IN PSID Sid,
OUT PAFP_SID_NAME * ppTranslatedSid
);
extern
NTSTATUS FASTCALL
AfpSidToMacId(
IN PSID Sid,
OUT PULONG pMacId
);
extern
NTSTATUS FASTCALL
AfpMacIdToSid(
IN ULONG MacId,
OUT PSID * ppSid
);
extern
NTSTATUS FASTCALL
AfpChangePassword(
IN PSDA pSda,
IN PAFP_PASSWORD_DESC pPassword
);
extern
AFPSTATUS FASTCALL
AfpInitSidOffsets(
IN ULONG SidOffstPairs,
IN PAFP_SID_OFFSET pSidOff
);
extern
VOID
AfpTerminateSecurityUtility(
VOID
);
#ifdef _SECUTIL_LOCALS
#define SIZE_SID_LOOKUP_TABLE 51
#define SID_HASH_RADIX 11
#define SID_NAME_AGE 300 // In seconds
#define MAX_SECWORKITEM_QLEN 5000
typedef VOID (*SEC_COMPLETION_ROUTINE)(IN ULONG, IN PVOID);
typedef struct _SEC_WORK_ITEM
{
LIST_ENTRY Links;
PVOID pOutput;
LONG OutputBufSize;
SEC_COMPLETION_ROUTINE pCompletionRoutine;
PKEVENT pCompletionEvent;
PSDA pSda;
} SEC_WORK_ITEM, *PSEC_WORK_ITEM;
typedef enum _SECURITY_THREAD_STATE
{
IDLE=1,
BUSY,
NOT_AVAILABLE
} SECURITY_THREAD_STATE;
typedef struct _AFP_SECURITY_THREAD
{
SECURITY_THREAD_STATE State;
PIRP pIrp;
PSEC_WORK_ITEM pSecWorkItem;
} AFP_SECURITY_THREAD, *PAFP_SECURITY_THREAD;
// Array of utiity threads
LOCAL AFP_SECURITY_THREAD afpSecurityThread[NUM_SECURITY_UTILITY_THREADS] = { 0 };
// Hash table for SID/Name cache
LOCAL PAFP_SID_NAME * afpSidLookupTable = (PAFP_SID_NAME*)NULL;
LOCAL PAFP_SID_MACID * afpSidToMacIdTable = (PAFP_SID_MACID*)NULL;
LOCAL PAFP_SID_MACID afpLastCachedSid = (PAFP_SID_MACID)NULL;
LOCAL DWORD afpNextMacIdToUse = 1;
// Queue of work items for the SecurityThreads
LOCAL LIST_ENTRY afpSecWorkItemQ = { 0 };
LOCAL DWORD afpSecWorkItemQLength = { 0 };
// Single Writer Multi Reader for the SID/Name cache
LOCAL SWMR afpSWMRForSidNameCache = { 0 };
// Spinlock protects the array of worker threads, the work queue and the
// 'in progress' count/event
LOCAL AFP_SPIN_LOCK afpSecUtilLock = { 0 };
// Signalled when no work is in progress.
LOCAL KEVENT afpUtilWorkInProgressEvent = { 0 };
LOCAL LONG afpUtilWorkInProgress = 0;
LOCAL
NTSTATUS
afpQueueSecWorkItem(
IN AFP_FSD_CMD_ID FsdCommand,
IN PSDA pSda,
IN PKEVENT pCompletionEvent,
IN PAFP_FSD_CMD_PKT pAfpFsdCmdPkt,
IN LONG BufSize,
IN SEC_COMPLETION_ROUTINE pCompletionRoutine
);
#define ALLOC_SWI() (PSEC_WORK_ITEM)AfpAllocNonPagedMemory(sizeof(SEC_WORK_ITEM))
LOCAL VOID
afpCompleteNameToSid(
IN ULONG Index,
IN PVOID pInBuf
);
LOCAL VOID
afpCompleteSidToName(
IN ULONG Index,
IN PVOID pInBuf
);
LOCAL VOID
afpCompleteMacIdToSid(
IN ULONG Index,
IN PVOID pInBuf
);
LOCAL VOID
afpCompleteChangePassword(
IN ULONG Index,
IN PVOID pInBuf
);
LOCAL VOID
afpCompleteLogEvent(
IN ULONG Index,
IN PVOID pInBuf
);
LOCAL NTSTATUS FASTCALL
afpUpdateNameSidCache(
IN WCHAR * Name,
IN PSID Sid
);
LOCAL PAFP_SID_NAME FASTCALL
afpLookupSid(
IN PSID Sid
);
LOCAL ULONG FASTCALL
afpHashSid(
IN PSID Sid
);
LOCAL VOID
afpDeInitializeSecurityUtility(
VOID
);
AFPSTATUS FASTCALL
afpAgeSidNameCache(
IN PVOID pContext
);
#endif // _SECUTIL_LOCALS
#endif // _SECUTIL_