mirror of
https://github.com/mirror/processhacker
synced 2026-06-08 16:03:24 +00:00
6ec346b61c
* added winsta.h * renamed phlib header guards git-svn-id: svn://svn.code.sf.net/p/processhacker/code@3228 21ef857c-d57f-4fe0-8362-d861dc6d29cd
152 lines
4.2 KiB
C
152 lines
4.2 KiB
C
#ifndef _PH_HANDLEP_H
|
|
#define _PH_HANDLEP_H
|
|
|
|
#define PH_HANDLE_TABLE_ENTRY_TYPE 0x1
|
|
#define PH_HANDLE_TABLE_ENTRY_IN_USE 0x0
|
|
#define PH_HANDLE_TABLE_ENTRY_FREE 0x1
|
|
|
|
// Locked actually means Not Locked. This means
|
|
// that an in use, locked handle table entry can
|
|
// be used as-is.
|
|
#define PH_HANDLE_TABLE_ENTRY_LOCKED 0x2
|
|
#define PH_HANDLE_TABLE_ENTRY_LOCKED_SHIFT 1
|
|
|
|
// There is initially one handle table level, with
|
|
// 256 entries. When the handle table is expanded,
|
|
// the table is replaced with a level 1 table, which
|
|
// contains 256 pointers to level 0 tables (the first
|
|
// entry already points to the initial level 0 table).
|
|
// Similarly, when the handle table is expanded a
|
|
// second time, the table is replaced with a level 2
|
|
// table, which contains 256 pointers to level 1 tables.
|
|
//
|
|
// This provides a maximum of 16,777,216 handles.
|
|
|
|
#define PH_HANDLE_TABLE_LEVEL_ENTRIES 256
|
|
#define PH_HANDLE_TABLE_LEVEL_MASK 0x3
|
|
|
|
#define PH_HANDLE_TABLE_LOCKS 8
|
|
#define PH_HANDLE_TABLE_LOCK_INDEX(HandleValue) ((HandleValue) % PH_HANDLE_TABLE_LOCKS)
|
|
|
|
typedef struct _PH_HANDLE_TABLE
|
|
{
|
|
PH_QUEUED_LOCK Lock;
|
|
PH_QUEUED_LOCK HandleWakeEvent;
|
|
|
|
ULONG Count;
|
|
ULONG_PTR TableValue;
|
|
ULONG FreeValue;
|
|
ULONG NextValue;
|
|
ULONG FreeValueAlt;
|
|
|
|
ULONG Flags;
|
|
|
|
PH_QUEUED_LOCK Locks[PH_HANDLE_TABLE_LOCKS];
|
|
} PH_HANDLE_TABLE, *PPH_HANDLE_TABLE;
|
|
|
|
FORCEINLINE VOID PhpLockHandleTableShared(
|
|
__inout PPH_HANDLE_TABLE HandleTable,
|
|
__in ULONG Index
|
|
)
|
|
{
|
|
PhAcquireQueuedLockShared(&HandleTable->Locks[Index]);
|
|
}
|
|
|
|
FORCEINLINE VOID PhpUnlockHandleTableShared(
|
|
__inout PPH_HANDLE_TABLE HandleTable,
|
|
__in ULONG Index
|
|
)
|
|
{
|
|
PhReleaseQueuedLockShared(&HandleTable->Locks[Index]);
|
|
}
|
|
|
|
// Handle values work by specifying indicies into each
|
|
// level.
|
|
//
|
|
// Bits 0-7: level 0
|
|
// Bits 8-15: level 1
|
|
// Bits 16-23: level 2
|
|
// Bits 24-31: reserved
|
|
|
|
#define PH_HANDLE_VALUE_INVALID ((ULONG)-1)
|
|
#define PH_HANDLE_VALUE_SHIFT 2
|
|
#define PH_HANDLE_VALUE_BIAS 4
|
|
|
|
#define PH_HANDLE_VALUE_LEVEL0(HandleValue) ((HandleValue) & 0xff)
|
|
#define PH_HANDLE_VALUE_LEVEL1_U(HandleValue) ((HandleValue) >> 8)
|
|
#define PH_HANDLE_VALUE_LEVEL1(HandleValue) (PH_HANDLE_VALUE_LEVEL1_U(HandleValue) & 0xff)
|
|
#define PH_HANDLE_VALUE_LEVEL2_U(HandleValue) ((HandleValue) >> 16)
|
|
#define PH_HANDLE_VALUE_LEVEL2(HandleValue) (PH_HANDLE_VALUE_LEVEL2_U(HandleValue) & 0xff)
|
|
#define PH_HANDLE_VALUE_IS_INVALID(HandleValue) (((HandleValue) >> 24) != 0)
|
|
|
|
FORCEINLINE HANDLE PhpEncodeHandle(
|
|
__in ULONG HandleValue
|
|
)
|
|
{
|
|
return (HANDLE)((HandleValue << PH_HANDLE_VALUE_SHIFT) + PH_HANDLE_VALUE_BIAS);
|
|
}
|
|
|
|
FORCEINLINE ULONG PhpDecodeHandle(
|
|
__in HANDLE Handle
|
|
)
|
|
{
|
|
return ((ULONG)Handle - PH_HANDLE_VALUE_BIAS) >> PH_HANDLE_VALUE_SHIFT;
|
|
}
|
|
|
|
VOID PhpBlockOnLockedHandleTableEntry(
|
|
__inout PPH_HANDLE_TABLE HandleTable,
|
|
__in PPH_HANDLE_TABLE_ENTRY HandleTableEntry
|
|
);
|
|
|
|
PPH_HANDLE_TABLE_ENTRY PhpAllocateHandleTableEntry(
|
|
__inout PPH_HANDLE_TABLE HandleTable,
|
|
__out PULONG HandleValue
|
|
);
|
|
|
|
VOID PhpFreeHandleTableEntry(
|
|
__inout PPH_HANDLE_TABLE HandleTable,
|
|
__in ULONG HandleValue,
|
|
__inout PPH_HANDLE_TABLE_ENTRY HandleTableEntry
|
|
);
|
|
|
|
BOOLEAN PhpAllocateMoreHandleTableEntries(
|
|
__in __assumeLocked PPH_HANDLE_TABLE HandleTable,
|
|
__in BOOLEAN Initialize
|
|
);
|
|
|
|
PPH_HANDLE_TABLE_ENTRY PhpLookupHandleTableEntry(
|
|
__in PPH_HANDLE_TABLE HandleTable,
|
|
__in ULONG HandleValue
|
|
);
|
|
|
|
ULONG PhpMoveFreeHandleTableEntries(
|
|
__inout __assumeLocked PPH_HANDLE_TABLE HandleTable
|
|
);
|
|
|
|
PPH_HANDLE_TABLE_ENTRY PhpCreateHandleTableLevel0(
|
|
__in PPH_HANDLE_TABLE HandleTable,
|
|
__in BOOLEAN Initialize
|
|
);
|
|
|
|
VOID PhpFreeHandleTableLevel0(
|
|
__in PPH_HANDLE_TABLE_ENTRY Table
|
|
);
|
|
|
|
PPH_HANDLE_TABLE_ENTRY *PhpCreateHandleTableLevel1(
|
|
__in PPH_HANDLE_TABLE HandleTable
|
|
);
|
|
|
|
VOID PhpFreeHandleTableLevel1(
|
|
__in PPH_HANDLE_TABLE_ENTRY *Table
|
|
);
|
|
|
|
PPH_HANDLE_TABLE_ENTRY **PhpCreateHandleTableLevel2(
|
|
__in PPH_HANDLE_TABLE HandleTable
|
|
);
|
|
|
|
VOID PhpFreeHandleTableLevel2(
|
|
__in PPH_HANDLE_TABLE_ENTRY **Table
|
|
);
|
|
|
|
#endif
|