1 /* EXECUTIVE ROUTINES ******************************************************/
3 VOID
ExAcquireFastMutex(PFAST_MUTEX FastMutex
);
4 VOID
ExAcquireFastMutexUnsafe(PFAST_MUTEX FastMutex
);
6 BOOLEAN
ExAcquireResourceExclusive(PERESOURCE Resource
, BOOLEAN Wait
);
7 BOOLEAN
ExAcquireResourceExclusiveLite(PERESOURCE Resource
, BOOLEAN Wait
);
8 BOOLEAN
ExAcquireResourceSharedLite(PERESOURCE Resource
, BOOLEAN Wait
);
9 BOOLEAN
ExAcquireSharedStarveExclusive(PERESOURCE Resource
, BOOLEAN Wait
);
10 BOOLEAN
ExAcquireSharedWaitForExclusive(PERESOURCE Resource
, BOOLEAN Wait
);
11 PVOID
ExAllocateFromNPagedLookasideList(PNPAGED_LOOKASIDE_LIST LookSide
);
12 PVOID
ExAllocateFromPagedLookasideList(PPAGED_LOOKASIDE_LIST LookSide
);
13 PVOID
ExAllocateFromZone(PZONE_HEADER Zone
);
16 * FUNCTION: Allocates memory from the nonpaged pool
18 * size = minimum size of the block to be allocated
19 * PoolType = the type of memory to use for the block (ignored)
21 * the address of the block if it succeeds
23 PVOID
ExAllocatePool(POOL_TYPE PoolType
, ULONG size
);
25 PVOID
ExAllocatePoolWithQuota(POOL_TYPE PoolType
, ULONG NumberOfBytes
);
26 PVOID
ExAllocatePoolWithQuotaTag(POOL_TYPE PoolType
, ULONG NumberOfBytes
,
28 PVOID
ExAllocatePoolWithTag(POOL_TYPE PoolType
, ULONG NumberOfBytes
,
30 VOID
ExConvertExclusiveToSharedLite(PERESOURCE Resource
);
31 VOID
ExDeleteNPagedLookasideList(PNPAGED_LOOKASIDE_LIST Lookaside
);
32 VOID
ExDeletePagedLookasideList(PPAGED_LOOKASIDE_LIST Lookaside
);
33 NTSTATUS
ExDeleteResource(PERESOURCE Resource
);
34 NTSTATUS
ExDeleteResourceLite(PERESOURCE Resource
);
35 NTSTATUS
ExExtendZone(PZONE_HEADER Zone
, PVOID Segment
, ULONG SegmentSize
);
38 * FUNCTION: Releases previously allocated memory
40 * block = block to free
42 VOID
ExFreePool(PVOID block
);
44 VOID
ExFreeToNPagedLookasideList(PNPAGED_LOOKASIDE_LIST Lookaside
,
46 VOID
ExFreeToPagedLookasideList(PPAGED_LOOKASIDE_LIST Lookaside
,
48 PVOID
ExFreeToZone(PZONE_HEADER Zone
, PVOID Block
);
49 ERESOURCE_THREAD
ExGetCurrentResourceThread(VOID
);
50 ULONG
ExGetExclusiveWaiterCount(PERESOURCE Resource
);
51 ULONG
ExGetSharedWaiterCount(PERESOURCE Resource
);
52 VOID
ExInitializeFastMutex(PFAST_MUTEX FastMutex
);
53 VOID
ExInitializeNPagedLookasideList(PNPAGED_LOOKASIDE_LIST Lookaside
,
54 PALLOCATE_FUNCTION Allocate
,
60 VOID
ExInitializePagedLookasideList(PPAGED_LOOKASIDE_LIST Lookaside
,
61 PALLOCATE_FUNCTION Allocate
,
67 NTSTATUS
ExInitializeResource(PERESOURCE Resource
);
68 NTSTATUS
ExInitializeResourceLite(PERESOURCE Resource
);
69 VOID
ExInitializeSListHead(PSLIST_HEADER SListHead
);
70 VOID
ExInitializeWorkItem(PWORK_QUEUE_ITEM Item
,
71 PWORKER_THREAD_ROUTINE Routine
,
73 NTSTATUS
ExInitializeZone(PZONE_HEADER Zone
,
76 ULONG InitialSegmentSize
);
77 LARGE_INTEGER
ExInterlockedAddLargeInteger(PLARGE_INTEGER Addend
,
78 LARGE_INTEGER Increment
,
80 ULONG
ExInterlockedAddUlong(PULONG Addend
, ULONG Increment
, PKSPIN_LOCK Lock
);
82 VOID
ExInterlockedRemoveEntryList(PLIST_ENTRY ListHead
, PLIST_ENTRY Entry
,
84 VOID
RemoveEntryFromList(PLIST_ENTRY ListHead
, PLIST_ENTRY Entry
);
85 PLIST_ENTRY
ExInterlockedRemoveHeadList(PLIST_ENTRY Head
, PKSPIN_LOCK Lock
);
87 PLIST_ENTRY
ExInterlockedInsertTailList(PLIST_ENTRY ListHead
,
88 PLIST_ENTRY ListEntry
,
91 PLIST_ENTRY
ExInterlockedInsertHeadList(PLIST_ENTRY ListHead
,
92 PLIST_ENTRY ListEntry
,
95 VOID
ExQueueWorkItem(PWORK_QUEUE_ITEM WorkItem
,
96 WORK_QUEUE_TYPE QueueType
);
97 VOID
ExRaiseStatus(NTSTATUS Status
);
98 VOID
ExReinitializeResourceLite(PERESOURCE Resource
);
99 VOID
ExReleaseFastMutex(PFAST_MUTEX Mutex
);
100 VOID
ExReleaseFastMutexUnsafe(PFAST_MUTEX Mutex
);
101 VOID
ExReleaseResource(PERESOURCE Resource
);
102 VOID
ExReleaseResourceForThread(PERESOURCE Resource
,
103 ERESOURCE_THREAD ResourceThreadId
);
104 VOID
ExReleaseResourceForThreadLite(PERESOURCE Resource
,
105 ERESOURCE_THREAD ResourceThreadId
);
106 VOID
ExSystemTimeToLocalTime(PLARGE_INTEGER SystemTime
,
107 PLARGE_INTEGER LocalTime
);
108 BOOLEAN
ExTryToAcquireFastMutex(PFAST_MUTEX FastMutex
);
109 BOOLEAN
ExTryToAcquireResourceExclusiveLite(PERESOURCE Resource
);
110 PVOID
InterlockedCompareExchange(PVOID
* Destination
,
113 LONG
InterlockedDecrement(PLONG Addend
);
114 LONG
InterlockedExchange(PLONG Target
, LONG Value
);
115 LONG
InterlockedExchangeAdd(PLONG Addend
, LONG Value
);
116 LONG
InterlockedIncrement(PLONG Addend
);
118 PVOID
ExInterlockedAllocateFromZone(PZONE_HEADER Zone
, PKSPIN_LOCK Lock
);
119 PVOID
ExInterlockedFreeToZone(PZONE_HEADER Zone
, PVOID Block
,
121 NTSTATUS
ExInterlockedExtendZone(PZONE_HEADER Zone
, PVOID Segment
,
122 ULONG SegmentSize
, PKSPIN_LOCK Lock
);
123 PSINGLE_LIST_ENTRY
ExInterlockedPopEntryList(PSINGLE_LIST_ENTRY ListHead
,
125 PSINGLE_LIST_ENTRY
ExInterlockedPushEntryList(PSINGLE_LIST_ENTRY ListHead
,
126 PSINGLE_LIST_ENTRY ListEntry
,
128 PSINGLE_LIST_ENTRY
ExInterlockedPushEntrySList(PSLIST_HEADER ListHead
,
129 PSINGLE_LIST_ENTRY ListEntry
,
131 PSINGLE_LIST_ENTRY
ExInterlockedPopEntrySList(PSLIST_HEADER ListHead
,
133 BOOLEAN
ExIsFullZone(PZONE_HEADER Zone
);
134 BOOLEAN
ExIsObjectInFirstZoneSegment(PZONE_HEADER Zone
, PVOID Object
);
135 VOID
ExLocalTimeToSystemTime(PLARGE_INTEGER LocalTime
,
136 PLARGE_INTEGER SystemTime
);
138 typedef unsigned int (exception_hook
)(CONTEXT
* c
, unsigned int exp
);
139 unsigned int ExHookException(exception_hook fn
, unsigned int exp
);
141 INTERLOCKED_RESULT
ExInterlockedDecrementLong(PLONG Addend
,
143 ULONG
ExInterlockedExchangeUlong(PULONG Target
,
146 INTERLOCKED_RESULT
ExInterlockedIncrementLong(PLONG Addend
,
148 BOOLEAN
ExIsResourceAcquiredExclusiveLite(PERESOURCE Resource
);
149 BOOLEAN
ExIsResourceAcquiredSharedLite(PERESOURCE Resource
);
150 USHORT
ExQueryDepthSListHead(PSLIST_HEADER SListHead
);