X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=reactos%2Fntoskrnl%2Finclude%2Finternal%2Fex.h;fp=reactos%2Fntoskrnl%2Finclude%2Finternal%2Fex.h;h=f730c7a803afaf2ad0f45023b969083d0bb6867f;hp=002736ce6bb982c9b5cb219f3d1753164cb2971e;hb=0a0fa78d34885e529eb2323ad5eb38bb44b630ee;hpb=5e50203d9d6005917fd9a5710ce9e0646d2e9e74 diff --git a/reactos/ntoskrnl/include/internal/ex.h b/reactos/ntoskrnl/include/internal/ex.h index 002736ce6bb..f730c7a803a 100644 --- a/reactos/ntoskrnl/include/internal/ex.h +++ b/reactos/ntoskrnl/include/internal/ex.h @@ -21,41 +21,15 @@ ULONG ExpAnsiCodePageDataOffset, ExpOemCodePageDataOffset; ULONG ExpUnicodeCaseTableDataOffset; PVOID ExpNlsSectionPointer; -typedef struct _EXHANDLE -{ - union - { - struct - { - ULONG TagBits:2; - ULONG Index:30; - }; - HANDLE GenericHandleOverlay; - ULONG_PTR Value; - }; -} EXHANDLE, *PEXHANDLE; - -typedef struct _ETIMER -{ - KTIMER KeTimer; - KAPC TimerApc; - KDPC TimerDpc; - LIST_ENTRY ActiveTimerListEntry; - KSPIN_LOCK Lock; - LONG Period; - BOOLEAN ApcAssociated; - BOOLEAN WakeTimer; - LIST_ENTRY WakeTimerListEntry; -} ETIMER, *PETIMER; - -typedef struct -{ - PCALLBACK_OBJECT *CallbackObject; - PWSTR Name; -} SYSTEM_CALLBACKS; - #define MAX_FAST_REFS 7 +#define EX_OBJ_TO_HDR(eob) ((POBJECT_HEADER)((ULONG_PTR)(eob) & \ + ~(EX_HANDLE_ENTRY_PROTECTFROMCLOSE | EX_HANDLE_ENTRY_INHERITABLE | \ + EX_HANDLE_ENTRY_AUDITONCLOSE))) +#define EX_HTE_TO_HDR(hte) ((POBJECT_HEADER)((ULONG_PTR)((hte)->Object) & \ + ~(EX_HANDLE_ENTRY_PROTECTFROMCLOSE | EX_HANDLE_ENTRY_INHERITABLE | \ + EX_HANDLE_ENTRY_AUDITONCLOSE))) + /* Note: we only use a spinlock on SMP. On UP, we cli/sti intead */ #ifndef CONFIG_SMP #define ExAcquireResourceLock(l, i) { \ @@ -75,27 +49,6 @@ typedef struct #define ExRundownCompleted _ExRundownCompleted #define ExGetPreviousMode KeGetPreviousMode - -// -// Various bits tagged on the handle or handle table -// -#define EXHANDLE_TABLE_ENTRY_LOCK_BIT 1 -#define FREE_HANDLE_MASK -1 - -// -// Number of entries in each table level -// -#define LOW_LEVEL_ENTRIES (PAGE_SIZE / sizeof(HANDLE_TABLE_ENTRY)) -#define MID_LEVEL_ENTRIES (PAGE_SIZE / sizeof(PHANDLE_TABLE_ENTRY)) -#define HIGH_LEVEL_ENTRIES (65535 / (LOW_LEVEL_ENTRIES * MID_LEVEL_ENTRIES)) - -// -// Maximum index in each table level before we need another table -// -#define MAX_LOW_INDEX LOW_LEVEL_ENTRIES -#define MAX_MID_INDEX (MID_LEVEL_ENTRIES * LOW_LEVEL_ENTRIES) -#define MAX_HIGH_INDEX (MID_LEVEL_ENTRIES * MID_LEVEL_ENTRIES * LOW_LEVEL_ENTRIES) - // // Detect GCC 4.1.2+ // @@ -171,7 +124,7 @@ ExInitializeSystemLookasideList( IN PLIST_ENTRY ListHead ); -BOOLEAN +VOID NTAPI ExpInitializeCallbacks(VOID); @@ -227,59 +180,7 @@ ExInitPoolLookasidePointers(VOID); VOID NTAPI ExInitializeCallBack( - IN OUT PEX_CALLBACK Callback -); - -PEX_CALLBACK_ROUTINE_BLOCK -NTAPI -ExAllocateCallBack( - IN PEX_CALLBACK_FUNCTION Function, - IN PVOID Context -); - -VOID -NTAPI -ExFreeCallBack( - IN PEX_CALLBACK_ROUTINE_BLOCK CallbackRoutineBlock -); - -BOOLEAN -NTAPI -ExCompareExchangeCallBack ( - IN OUT PEX_CALLBACK CallBack, - IN PEX_CALLBACK_ROUTINE_BLOCK NewBlock, - IN PEX_CALLBACK_ROUTINE_BLOCK OldBlock -); - -PEX_CALLBACK_ROUTINE_BLOCK -NTAPI -ExReferenceCallBackBlock( - IN OUT PEX_CALLBACK CallBack -); - -VOID -NTAPI -ExDereferenceCallBackBlock( - IN OUT PEX_CALLBACK CallBack, - IN PEX_CALLBACK_ROUTINE_BLOCK CallbackRoutineBlock -); - -PEX_CALLBACK_FUNCTION -NTAPI -ExGetCallBackBlockRoutine( - IN PEX_CALLBACK_ROUTINE_BLOCK CallbackRoutineBlock -); - -PVOID -NTAPI -ExGetCallBackBlockContext( - IN PEX_CALLBACK_ROUTINE_BLOCK CallbackRoutineBlock -); - -VOID -NTAPI -ExWaitForCallBacks( - IN PEX_CALLBACK_ROUTINE_BLOCK CallbackRoutineBlock + IN PEX_CALLBACK Callback ); /* Rundown Functions ********************************************************/ @@ -336,98 +237,104 @@ ExfWaitForRundownProtectionRelease( /* HANDLE TABLE FUNCTIONS ***************************************************/ -typedef VOID -(NTAPI *PEX_SWEEP_HANDLE_CALLBACK)( +#define EX_HANDLE_ENTRY_LOCKED (1 << ((sizeof(PVOID) * 8) - 1)) +#define EX_HANDLE_ENTRY_PROTECTFROMCLOSE (1 << 0) +#define EX_HANDLE_ENTRY_INHERITABLE (1 << 1) +#define EX_HANDLE_ENTRY_AUDITONCLOSE (1 << 2) + +#define EX_HANDLE_TABLE_CLOSING 0x1 + +#define EX_HANDLE_ENTRY_FLAGSMASK (EX_HANDLE_ENTRY_LOCKED | \ + EX_HANDLE_ENTRY_PROTECTFROMCLOSE | \ + EX_HANDLE_ENTRY_INHERITABLE | \ + EX_HANDLE_ENTRY_AUDITONCLOSE) + +typedef VOID (NTAPI PEX_SWEEP_HANDLE_CALLBACK)( PHANDLE_TABLE_ENTRY HandleTableEntry, - HANDLE Handle, + HANDLE Handle, PVOID Context ); -typedef BOOLEAN -(NTAPI *PEX_DUPLICATE_HANDLE_CALLBACK)( - IN PEPROCESS Process, - IN PHANDLE_TABLE HandleTable, - IN PHANDLE_TABLE_ENTRY HandleTableEntry, - IN PHANDLE_TABLE_ENTRY NewEntry +typedef BOOLEAN (NTAPI PEX_DUPLICATE_HANDLE_CALLBACK)( + PHANDLE_TABLE HandleTable, + PHANDLE_TABLE_ENTRY HandleTableEntry, + PVOID Context ); -typedef BOOLEAN -(NTAPI *PEX_CHANGE_HANDLE_CALLBACK)( - PHANDLE_TABLE_ENTRY HandleTableEntry, - ULONG_PTR Context +typedef BOOLEAN (NTAPI PEX_CHANGE_HANDLE_CALLBACK)( + PHANDLE_TABLE HandleTable, + PHANDLE_TABLE_ENTRY HandleTableEntry, + PVOID Context ); VOID -NTAPI -ExpInitializeHandleTables( - VOID -); +ExpInitializeHandleTables(VOID); PHANDLE_TABLE -NTAPI -ExCreateHandleTable( - IN PEPROCESS Process OPTIONAL +ExCreateHandleTable(IN PEPROCESS QuotaProcess OPTIONAL); + +VOID +ExDestroyHandleTable( + IN PHANDLE_TABLE HandleTable ); VOID -NTAPI -ExUnlockHandleTableEntry( +ExSweepHandleTable( IN PHANDLE_TABLE HandleTable, - IN PHANDLE_TABLE_ENTRY HandleTableEntry + IN PEX_SWEEP_HANDLE_CALLBACK SweepHandleCallback OPTIONAL, + IN PVOID Context OPTIONAL ); -HANDLE -NTAPI -ExCreateHandle( +PHANDLE_TABLE +ExDupHandleTable( + IN PEPROCESS QuotaProcess OPTIONAL, + IN PEX_DUPLICATE_HANDLE_CALLBACK DuplicateHandleCallback OPTIONAL, + IN PVOID Context OPTIONAL, + IN PHANDLE_TABLE SourceHandleTable +); + +BOOLEAN +ExLockHandleTableEntry( IN PHANDLE_TABLE HandleTable, - IN PHANDLE_TABLE_ENTRY HandleTableEntry + IN PHANDLE_TABLE_ENTRY Entry ); VOID -NTAPI -ExDestroyHandleTable( +ExUnlockHandleTableEntry( + IN PHANDLE_TABLE HandleTable, + IN PHANDLE_TABLE_ENTRY Entry +); + +HANDLE +ExCreateHandle( IN PHANDLE_TABLE HandleTable, - IN PVOID DestroyHandleProcedure OPTIONAL + IN PHANDLE_TABLE_ENTRY Entry ); BOOLEAN -NTAPI ExDestroyHandle( IN PHANDLE_TABLE HandleTable, - IN HANDLE Handle, - IN PHANDLE_TABLE_ENTRY HandleTableEntry OPTIONAL + IN HANDLE Handle ); -PHANDLE_TABLE_ENTRY -NTAPI -ExMapHandleToPointer( +VOID +ExDestroyHandleByEntry( IN PHANDLE_TABLE HandleTable, + IN PHANDLE_TABLE_ENTRY Entry, IN HANDLE Handle ); -PHANDLE_TABLE -NTAPI -ExDupHandleTable( - IN PEPROCESS Process, +PHANDLE_TABLE_ENTRY +ExMapHandleToPointer( IN PHANDLE_TABLE HandleTable, - IN PEX_DUPLICATE_HANDLE_CALLBACK DupHandleProcedure, - IN ULONG_PTR Mask + IN HANDLE Handle ); BOOLEAN -NTAPI ExChangeHandle( IN PHANDLE_TABLE HandleTable, IN HANDLE Handle, - IN PEX_CHANGE_HANDLE_CALLBACK ChangeRoutine, - IN ULONG_PTR Context -); - -VOID -NTAPI -ExSweepHandleTable( - IN PHANDLE_TABLE HandleTable, - IN PEX_SWEEP_HANDLE_CALLBACK EnumHandleProcedure, + IN PEX_CHANGE_HANDLE_CALLBACK ChangeHandleCallback, IN PVOID Context ); @@ -442,33 +349,6 @@ static __inline _SEH_FILTER(_SEH_ExSystemExceptionFilter) return ExSystemExceptionFilter(); } -/* CALLBACKS *****************************************************************/ - -VOID -FORCEINLINE -ExDoCallBack(IN OUT PEX_CALLBACK Callback, - IN PVOID Context, - IN PVOID Argument1, - IN PVOID Argument2) -{ - PEX_CALLBACK_ROUTINE_BLOCK CallbackRoutineBlock; - PEX_CALLBACK_FUNCTION Function; - - /* Reference the block */ - CallbackRoutineBlock = ExReferenceCallBackBlock(Callback); - if (CallbackRoutineBlock) - { - /* Get the function */ - Function = ExGetCallBackBlockRoutine(CallbackRoutineBlock); - - /* Do the callback */ - Function(Context, Argument1, Argument2); - - /* Now dereference it */ - ExDereferenceCallBackBlock(Callback, CallbackRoutineBlock); - } -} - /* RUNDOWN *******************************************************************/ #ifdef _WIN64 @@ -819,7 +699,7 @@ ExConvertPushLockSharedToExclusive(IN PEX_PUSH_LOCK PushLock) VOID FORCEINLINE ExWaitOnPushLock(PEX_PUSH_LOCK PushLock) -{ +{ /* Check if we're locked */ if (PushLock->Locked) {