Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenexfuncs.h
Go to the documentation of this file.
00001 /****************************************************************************** 00002 * Executive Functions * 00003 ******************************************************************************/ 00004 00005 $if (_WDMDDK_) 00006 #define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend) 00007 #define ExInterlockedDecrementLong(Addend,Lock) Exfi386InterlockedDecrementLong(Addend) 00008 #define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value) 00009 00010 #define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql)) 00011 #define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql)) 00012 #define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock) 00013 #define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock) 00014 00015 #define ExInitializeSListHead InitializeSListHead 00016 00017 #if defined(_NTHAL_) && defined(_X86_) 00018 00019 NTKERNELAPI 00020 VOID 00021 FASTCALL 00022 ExiAcquireFastMutex( 00023 IN OUT PFAST_MUTEX FastMutex); 00024 00025 NTKERNELAPI 00026 VOID 00027 FASTCALL 00028 ExiReleaseFastMutex( 00029 IN OUT PFAST_MUTEX FastMutex); 00030 00031 NTKERNELAPI 00032 BOOLEAN 00033 FASTCALL 00034 ExiTryToAcquireFastMutex( 00035 IN OUT PFAST_MUTEX FastMutex); 00036 00037 #define ExAcquireFastMutex ExiAcquireFastMutex 00038 #define ExReleaseFastMutex ExiReleaseFastMutex 00039 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex 00040 00041 #else 00042 00043 #if (NTDDI_VERSION >= NTDDI_WIN2K) 00044 00045 _IRQL_raises_(APC_LEVEL) 00046 _IRQL_saves_global_(OldIrql, FastMutex) 00047 NTKERNELAPI 00048 VOID 00049 FASTCALL 00050 ExAcquireFastMutex( 00051 _Inout_ _Requires_lock_not_held_(*_Curr_) _Acquires_lock_(*_Curr_) 00052 PFAST_MUTEX FastMutex); 00053 00054 _IRQL_requires_(APC_LEVEL) 00055 _IRQL_restores_global_(OldIrql, FastMutex) 00056 NTKERNELAPI 00057 VOID 00058 FASTCALL 00059 ExReleaseFastMutex( 00060 _Inout_ _Requires_lock_held_(*_Curr_) _Releases_lock_(*_Curr_) 00061 PFAST_MUTEX FastMutex); 00062 00063 _Must_inspect_result_ 00064 _Success_(return!=FALSE) 00065 _IRQL_raises_(APC_LEVEL) 00066 _IRQL_saves_global_(OldIrql, FastMutex) 00067 NTKERNELAPI 00068 BOOLEAN 00069 FASTCALL 00070 ExTryToAcquireFastMutex( 00071 _Inout_ _Requires_lock_not_held_(*_Curr_) _Acquires_lock_(*_Curr_) 00072 PFAST_MUTEX FastMutex); 00073 00074 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ 00075 00076 #endif /* defined(_NTHAL_) && defined(_X86_) */ 00077 00078 #if defined(_X86_) 00079 #define ExInterlockedAddUlong ExfInterlockedAddUlong 00080 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList 00081 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList 00082 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList 00083 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList 00084 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList 00085 #endif /* defined(_X86_) */ 00086 00087 #if defined(_WIN64) 00088 00089 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \ 00090 defined(_NTHAL_) || defined(_NTOSP_) 00091 NTKERNELAPI 00092 USHORT 00093 ExQueryDepthSList(_In_ PSLIST_HEADER ListHead); 00094 #else 00095 FORCEINLINE 00096 USHORT 00097 ExQueryDepthSList(_In_ PSLIST_HEADER ListHead) 00098 { 00099 return (USHORT)(ListHead->Alignment & 0xffff); 00100 } 00101 #endif 00102 00103 NTKERNELAPI 00104 PSLIST_ENTRY 00105 ExpInterlockedFlushSList( 00106 PSLIST_HEADER ListHead); 00107 00108 NTKERNELAPI 00109 PSLIST_ENTRY 00110 ExpInterlockedPopEntrySList( 00111 _Inout_ PSLIST_HEADER ListHead); 00112 00113 NTKERNELAPI 00114 PSLIST_ENTRY 00115 ExpInterlockedPushEntrySList( 00116 _Inout_ PSLIST_HEADER ListHead, 00117 _Inout_ __drv_aliasesMem PSLIST_ENTRY ListEntry); 00118 00119 #define ExInterlockedFlushSList(Head) \ 00120 ExpInterlockedFlushSList(Head) 00121 #define ExInterlockedPopEntrySList(Head, Lock) \ 00122 ExpInterlockedPopEntrySList(Head) 00123 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \ 00124 ExpInterlockedPushEntrySList(Head, Entry) 00125 00126 #else /* !defined(_WIN64) */ 00127 00128 #ifdef NONAMELESSUNION 00129 #define ExQueryDepthSList(listhead) (listhead)->s.Depth 00130 #else 00131 #define ExQueryDepthSList(listhead) (listhead)->Depth 00132 #endif 00133 00134 NTKERNELAPI 00135 PSINGLE_LIST_ENTRY 00136 FASTCALL 00137 ExInterlockedFlushSList( 00138 _Inout_ PSLIST_HEADER ListHead); 00139 00140 #endif /* !defined(_WIN64) */ 00141 00142 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_) 00143 00144 NTKERNELAPI 00145 PSINGLE_LIST_ENTRY 00146 FASTCALL 00147 ExInterlockedPopEntrySList( 00148 _Inout_ PSLIST_HEADER ListHead, 00149 _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock); 00150 00151 NTKERNELAPI 00152 PSINGLE_LIST_ENTRY 00153 FASTCALL 00154 ExInterlockedPushEntrySList( 00155 _Inout_ PSLIST_HEADER ListHead, 00156 _Inout_ __drv_aliasesMem PSINGLE_LIST_ENTRY ListEntry, 00157 _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock); 00158 00159 _IRQL_requires_max_(APC_LEVEL) 00160 NTKERNELAPI 00161 PVOID 00162 NTAPI 00163 ExAllocateFromPagedLookasideList( 00164 _Inout_ PPAGED_LOOKASIDE_LIST Lookaside); 00165 00166 _IRQL_requires_max_(APC_LEVEL) 00167 NTKERNELAPI 00168 VOID 00169 NTAPI 00170 ExFreeToPagedLookasideList( 00171 _Inout_ PPAGED_LOOKASIDE_LIST Lookaside, 00172 _In_ PVOID Entry); 00173 00174 #else /* !_WIN2K_COMPAT_SLIST_USAGE */ 00175 00176 #if !defined(_WIN64) 00177 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \ 00178 InterlockedPopEntrySList(_ListHead) 00179 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \ 00180 InterlockedPushEntrySList(_ListHead, _ListEntry) 00181 #endif 00182 00183 _IRQL_requires_max_(APC_LEVEL) 00184 static __inline 00185 PVOID 00186 ExAllocateFromPagedLookasideList( 00187 _Inout_ PPAGED_LOOKASIDE_LIST Lookaside) 00188 { 00189 PVOID Entry; 00190 00191 Lookaside->L.TotalAllocates++; 00192 #ifdef NONAMELESSUNION 00193 Entry = InterlockedPopEntrySList(&Lookaside->L.u.ListHead); 00194 if (Entry == NULL) { 00195 Lookaside->L.u2.AllocateMisses++; 00196 Entry = (Lookaside->L.u4.Allocate)(Lookaside->L.Type, 00197 Lookaside->L.Size, 00198 Lookaside->L.Tag); 00199 } 00200 #else /* NONAMELESSUNION */ 00201 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead); 00202 if (Entry == NULL) { 00203 Lookaside->L.AllocateMisses++; 00204 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type, 00205 Lookaside->L.Size, 00206 Lookaside->L.Tag); 00207 } 00208 #endif /* NONAMELESSUNION */ 00209 return Entry; 00210 } 00211 00212 _IRQL_requires_max_(APC_LEVEL) 00213 static __inline 00214 VOID 00215 ExFreeToPagedLookasideList( 00216 _Inout_ PPAGED_LOOKASIDE_LIST Lookaside, 00217 _In_ PVOID Entry) 00218 { 00219 Lookaside->L.TotalFrees++; 00220 #ifdef NONAMELESSUNION 00221 if (ExQueryDepthSList(&Lookaside->L.u.ListHead) >= Lookaside->L.Depth) { 00222 Lookaside->L.u3.FreeMisses++; 00223 (Lookaside->L.u5.Free)(Entry); 00224 } else { 00225 InterlockedPushEntrySList(&Lookaside->L.u.ListHead, (PSLIST_ENTRY)Entry); 00226 } 00227 #else /* NONAMELESSUNION */ 00228 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) { 00229 Lookaside->L.FreeMisses++; 00230 (Lookaside->L.Free)(Entry); 00231 } else { 00232 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry); 00233 } 00234 #endif /* NONAMELESSUNION */ 00235 } 00236 00237 #endif /* _WIN2K_COMPAT_SLIST_USAGE */ 00238 00239 00240 /* ERESOURCE_THREAD 00241 * ExGetCurrentResourceThread( 00242 * VOID); 00243 */ 00244 #define ExGetCurrentResourceThread() ((ULONG_PTR)PsGetCurrentThread()) 00245 00246 #define ExReleaseResource(R) (ExReleaseResourceLite(R)) 00247 00248 /* VOID 00249 * ExInitializeWorkItem( 00250 * IN PWORK_QUEUE_ITEM Item, 00251 * IN PWORKER_THREAD_ROUTINE Routine, 00252 * IN PVOID Context) 00253 */ 00254 #define ExInitializeWorkItem(Item, Routine, Context) \ 00255 { \ 00256 (Item)->WorkerRoutine = Routine; \ 00257 (Item)->Parameter = Context; \ 00258 (Item)->List.Flink = NULL; \ 00259 } 00260 00261 FORCEINLINE 00262 VOID 00263 ExInitializeFastMutex( 00264 _Out_ PFAST_MUTEX FastMutex) 00265 { 00266 FastMutex->Count = FM_LOCK_BIT; 00267 FastMutex->Owner = NULL; 00268 FastMutex->Contention = 0; 00269 KeInitializeEvent(&FastMutex->Event, SynchronizationEvent, FALSE); 00270 return; 00271 } 00272 00273 $endif (_WDMDDK_) 00274 $if (_NTDDK_) 00275 static __inline PVOID 00276 ExAllocateFromZone( 00277 IN PZONE_HEADER Zone) 00278 { 00279 if (Zone->FreeList.Next) 00280 Zone->FreeList.Next = Zone->FreeList.Next->Next; 00281 return (PVOID) Zone->FreeList.Next; 00282 } 00283 00284 static __inline PVOID 00285 ExFreeToZone( 00286 IN PZONE_HEADER Zone, 00287 IN PVOID Block) 00288 { 00289 ((PSINGLE_LIST_ENTRY) Block)->Next = Zone->FreeList.Next; 00290 Zone->FreeList.Next = ((PSINGLE_LIST_ENTRY) Block); 00291 return ((PSINGLE_LIST_ENTRY) Block)->Next; 00292 } 00293 00294 /* 00295 * PVOID 00296 * ExInterlockedAllocateFromZone( 00297 * IN PZONE_HEADER Zone, 00298 * IN PKSPIN_LOCK Lock) 00299 */ 00300 #define ExInterlockedAllocateFromZone(Zone, Lock) \ 00301 ((PVOID) ExInterlockedPopEntryList(&Zone->FreeList, Lock)) 00302 00303 /* PVOID 00304 * ExInterlockedFreeToZone( 00305 * IN PZONE_HEADER Zone, 00306 * IN PVOID Block, 00307 * IN PKSPIN_LOCK Lock); 00308 */ 00309 #define ExInterlockedFreeToZone(Zone, Block, Lock) \ 00310 ExInterlockedPushEntryList(&(Zone)->FreeList, (PSINGLE_LIST_ENTRY)(Block), Lock) 00311 00312 /* 00313 * BOOLEAN 00314 * ExIsFullZone( 00315 * IN PZONE_HEADER Zone) 00316 */ 00317 #define ExIsFullZone(Zone) \ 00318 ((Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY) NULL) 00319 00320 /* BOOLEAN 00321 * ExIsObjectInFirstZoneSegment( 00322 * IN PZONE_HEADER Zone, 00323 * IN PVOID Object); 00324 */ 00325 #define ExIsObjectInFirstZoneSegment(Zone,Object) \ 00326 ((BOOLEAN)( ((PUCHAR)(Object) >= (PUCHAR)(Zone)->SegmentList.Next) && \ 00327 ((PUCHAR)(Object) < (PUCHAR)(Zone)->SegmentList.Next + \ 00328 (Zone)->TotalSegmentSize)) ) 00329 00330 #define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite 00331 #define ExAcquireResourceShared ExAcquireResourceSharedLite 00332 #define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite 00333 #define ExDeleteResource ExDeleteResourceLite 00334 #define ExInitializeResource ExInitializeResourceLite 00335 #define ExIsResourceAcquiredExclusive ExIsResourceAcquiredExclusiveLite 00336 #define ExIsResourceAcquiredShared ExIsResourceAcquiredSharedLite 00337 #define ExIsResourceAcquired ExIsResourceAcquiredSharedLite 00338 #define ExReleaseResourceForThread ExReleaseResourceForThreadLite 00339 00340 #ifndef _M_IX86 00341 #define RESULT_ZERO 0 00342 #define RESULT_NEGATIVE 1 00343 #define RESULT_POSITIVE 2 00344 #endif 00345 00346 typedef enum _INTERLOCKED_RESULT { 00347 ResultNegative = RESULT_NEGATIVE, 00348 ResultZero = RESULT_ZERO, 00349 ResultPositive = RESULT_POSITIVE 00350 } INTERLOCKED_RESULT; 00351 00352 #ifdef _X86_ 00353 00354 NTKERNELAPI 00355 INTERLOCKED_RESULT 00356 FASTCALL 00357 Exfi386InterlockedIncrementLong( 00358 _Inout_ _Interlocked_operand_ LONG volatile *Addend); 00359 00360 NTKERNELAPI 00361 INTERLOCKED_RESULT 00362 FASTCALL 00363 Exfi386InterlockedDecrementLong( 00364 _Inout_ _Interlocked_operand_ PLONG Addend); 00365 00366 NTKERNELAPI 00367 ULONG 00368 FASTCALL 00369 Exfi386InterlockedExchangeUlong( 00370 _Inout_ _Interlocked_operand_ PULONG Target, 00371 _In_ ULONG Value); 00372 00373 #endif 00374 00375 $endif (_NTDDK_) 00376 $if (_NTIFS_) 00377 00378 #define ExDisableResourceBoost ExDisableResourceBoostLite 00379 00380 VOID 00381 ExInitializePushLock( 00382 _Out_ PEX_PUSH_LOCK PushLock); 00383 $endif (_NTIFS_) 00384 00385 #if (NTDDI_VERSION >= NTDDI_WIN2K) 00386 $if (_WDMDDK_) 00387 _IRQL_requires_max_(APC_LEVEL) 00388 _Requires_lock_held_(_Global_critical_region_) 00389 NTKERNELAPI 00390 VOID 00391 FASTCALL 00392 ExAcquireFastMutexUnsafe( 00393 _Inout_ _Requires_lock_not_held_(*_Curr_) _Acquires_lock_(*_Curr_) 00394 PFAST_MUTEX FastMutex); 00395 00396 _IRQL_requires_max_(APC_LEVEL) 00397 _Requires_lock_held_(_Global_critical_region_) 00398 NTKERNELAPI 00399 VOID 00400 FASTCALL 00401 ExReleaseFastMutexUnsafe( 00402 _Inout_ _Requires_lock_held_(*_Curr_) _Releases_lock_(*_Curr_) 00403 PFAST_MUTEX FastMutex); 00404 00405 _Requires_lock_held_(_Global_critical_region_) 00406 _Requires_lock_not_held_(*Resource) 00407 _When_(Wait!=0, _Acquires_exclusive_lock_(*Resource)) 00408 _IRQL_requires_max_(APC_LEVEL) 00409 _When_(Wait!=0, _Post_satisfies_(return == 1)) 00410 _When_(Wait==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_) 00411 NTKERNELAPI 00412 BOOLEAN 00413 NTAPI 00414 ExAcquireResourceExclusiveLite( 00415 _Inout_ PERESOURCE Resource, 00416 _In_ _Literal_ BOOLEAN Wait); 00417 00418 _IRQL_requires_max_(APC_LEVEL) 00419 _Requires_lock_held_(_Global_critical_region_) 00420 _When_(Wait!=0, _Post_satisfies_(return == 1)) 00421 _When_(Wait==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_) 00422 NTKERNELAPI 00423 BOOLEAN 00424 NTAPI 00425 ExAcquireResourceSharedLite( 00426 _Inout_ _Requires_lock_not_held_(*_Curr_) 00427 _When_(return!=0, _Acquires_shared_lock_(*_Curr_)) 00428 PERESOURCE Resource, 00429 _In_ BOOLEAN Wait); 00430 00431 _IRQL_requires_max_(APC_LEVEL) 00432 _Requires_lock_held_(_Global_critical_region_) 00433 _When_(Wait!=0, _Post_satisfies_(return == 1)) 00434 _When_(Wait==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_) 00435 NTKERNELAPI 00436 BOOLEAN 00437 NTAPI 00438 ExAcquireSharedStarveExclusive( 00439 _Inout_ _Requires_lock_not_held_(*_Curr_) 00440 _When_(return!=0, _Acquires_shared_lock_(*_Curr_)) 00441 PERESOURCE Resource, 00442 _In_ BOOLEAN Wait); 00443 00444 _IRQL_requires_max_(APC_LEVEL) 00445 _Requires_lock_held_(_Global_critical_region_) 00446 _When_(Wait!=0, _Post_satisfies_(return == 1)) 00447 _When_(Wait==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_) 00448 NTKERNELAPI 00449 BOOLEAN 00450 NTAPI 00451 ExAcquireSharedWaitForExclusive( 00452 _Inout_ _Requires_lock_not_held_(*_Curr_) 00453 _When_(return!=0, _Acquires_lock_(*_Curr_)) 00454 PERESOURCE Resource, 00455 _In_ BOOLEAN Wait); 00456 00457 __drv_preferredFunction("ExAllocatePoolWithTag", 00458 "No tag interferes with debugging.") 00459 __drv_allocatesMem(Mem) 00460 _When_((PoolType & PagedPool) != 0, _IRQL_requires_max_(APC_LEVEL)) 00461 _When_((PoolType & PagedPool) == 0, _IRQL_requires_max_(DISPATCH_LEVEL)) 00462 _When_((PoolType & NonPagedPoolMustSucceed) != 0, 00463 __drv_reportError("Must succeed pool allocations are forbidden. " 00464 "Allocation failures cause a system crash")) 00465 _When_((PoolType & (NonPagedPoolMustSucceed | 00466 POOL_RAISE_IF_ALLOCATION_FAILURE)) == 0, 00467 _Post_maybenull_ _Must_inspect_result_) 00468 _When_((PoolType & (NonPagedPoolMustSucceed | 00469 POOL_RAISE_IF_ALLOCATION_FAILURE)) != 0, 00470 _Post_notnull_) 00471 _Post_writable_byte_size_(NumberOfBytes) 00472 NTKERNELAPI 00473 PVOID 00474 NTAPI 00475 ExAllocatePool( 00476 __drv_strictTypeMatch(__drv_typeExpr) _In_ POOL_TYPE PoolType, 00477 _In_ SIZE_T NumberOfBytes); 00478 00479 __drv_preferredFunction("ExAllocatePoolWithQuotaTag", 00480 "No tag interferes with debugging.") 00481 __drv_allocatesMem(Mem) 00482 _When_((PoolType & PagedPool) != 0, _IRQL_requires_max_(APC_LEVEL)) 00483 _When_((PoolType & PagedPool) == 0, _IRQL_requires_max_(DISPATCH_LEVEL)) 00484 _When_((PoolType & NonPagedPoolMustSucceed) != 0, 00485 __drv_reportError("Must succeed pool allocations are forbidden. " 00486 "Allocation failures cause a system crash")) 00487 _When_((PoolType & POOL_QUOTA_FAIL_INSTEAD_OF_RAISE) != 0, 00488 _Post_maybenull_ _Must_inspect_result_) 00489 _When_((PoolType & POOL_QUOTA_FAIL_INSTEAD_OF_RAISE) == 0, _Post_notnull_) 00490 _Post_writable_byte_size_(NumberOfBytes) 00491 NTKERNELAPI 00492 PVOID 00493 NTAPI 00494 ExAllocatePoolWithQuota( 00495 __drv_strictTypeMatch(__drv_typeExpr) _In_ POOL_TYPE PoolType, 00496 _In_ SIZE_T NumberOfBytes); 00497 00498 __drv_allocatesMem(Mem) 00499 _When_((PoolType & PagedPool) != 0, _IRQL_requires_max_(APC_LEVEL)) 00500 _When_((PoolType & PagedPool) == 0, _IRQL_requires_max_(DISPATCH_LEVEL)) 00501 _When_((PoolType & NonPagedPoolMustSucceed) != 0, 00502 __drv_reportError("Must succeed pool allocations are forbidden. " 00503 "Allocation failures cause a system crash")) 00504 _When_((PoolType & POOL_QUOTA_FAIL_INSTEAD_OF_RAISE) != 0, 00505 _Post_maybenull_ _Must_inspect_result_) 00506 _When_((PoolType & POOL_QUOTA_FAIL_INSTEAD_OF_RAISE) == 0, _Post_notnull_) 00507 _Post_writable_byte_size_(NumberOfBytes) 00508 NTKERNELAPI 00509 PVOID 00510 NTAPI 00511 ExAllocatePoolWithQuotaTag( 00512 _In_ __drv_strictTypeMatch(__drv_typeExpr) POOL_TYPE PoolType, 00513 _In_ SIZE_T NumberOfBytes, 00514 _In_ ULONG Tag); 00515 00516 #ifndef POOL_TAGGING 00517 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b) 00518 #endif 00519 00520 __drv_allocatesMem(Mem) 00521 _When_((PoolType & PagedPool) != 0, _IRQL_requires_max_(APC_LEVEL)) 00522 _When_((PoolType & PagedPool) == 0, _IRQL_requires_max_(DISPATCH_LEVEL)) 00523 _When_((PoolType & NonPagedPoolMustSucceed) != 0, 00524 __drv_reportError("Must succeed pool allocations are forbidden. " 00525 "Allocation failures cause a system crash")) 00526 _When_((PoolType & (NonPagedPoolMustSucceed | POOL_RAISE_IF_ALLOCATION_FAILURE)) == 0, 00527 _Post_maybenull_ _Must_inspect_result_) 00528 _When_((PoolType & (NonPagedPoolMustSucceed | POOL_RAISE_IF_ALLOCATION_FAILURE)) != 0, 00529 _Post_notnull_) 00530 _Post_writable_byte_size_(NumberOfBytes) 00531 NTKERNELAPI 00532 PVOID 00533 NTAPI 00534 ExAllocatePoolWithTag( 00535 _In_ __drv_strictTypeMatch(__drv_typeExpr) POOL_TYPE PoolType, 00536 _In_ SIZE_T NumberOfBytes, 00537 _In_ ULONG Tag); 00538 00539 #ifndef POOL_TAGGING 00540 #define ExAllocatePoolWithTag(a,b,c) ExAllocatePool(a,b) 00541 #endif 00542 00543 __drv_allocatesMem(Mem) 00544 _When_((PoolType & PagedPool) != 0, _IRQL_requires_max_(APC_LEVEL)) 00545 _When_((PoolType & PagedPool) == 0, _IRQL_requires_max_(DISPATCH_LEVEL)) 00546 _When_((PoolType & NonPagedPoolMustSucceed) != 0, 00547 __drv_reportError("Must succeed pool allocations are forbidden. " 00548 "Allocation failures cause a system crash")) 00549 _When_((PoolType & (NonPagedPoolMustSucceed | POOL_RAISE_IF_ALLOCATION_FAILURE)) == 0, 00550 _Post_maybenull_ _Must_inspect_result_) 00551 _When_((PoolType & (NonPagedPoolMustSucceed | POOL_RAISE_IF_ALLOCATION_FAILURE)) != 0, 00552 _Post_notnull_) 00553 _Post_writable_byte_size_(NumberOfBytes) 00554 NTKERNELAPI 00555 PVOID 00556 NTAPI 00557 ExAllocatePoolWithTagPriority( 00558 _In_ __drv_strictTypeMatch(__drv_typeCond) POOL_TYPE PoolType, 00559 _In_ SIZE_T NumberOfBytes, 00560 _In_ ULONG Tag, 00561 _In_ __drv_strictTypeMatch(__drv_typeExpr) EX_POOL_PRIORITY Priority); 00562 00563 _IRQL_requires_max_(DISPATCH_LEVEL) 00564 NTKERNELAPI 00565 VOID 00566 NTAPI 00567 ExConvertExclusiveToSharedLite( 00568 _Inout_ _Requires_lock_held_(*_Curr_) PERESOURCE Resource); 00569 00570 _IRQL_requires_max_(APC_LEVEL) 00571 NTKERNELAPI 00572 NTSTATUS 00573 NTAPI 00574 ExCreateCallback( 00575 _Outptr_ PCALLBACK_OBJECT *CallbackObject, 00576 _In_ POBJECT_ATTRIBUTES ObjectAttributes, 00577 _In_ BOOLEAN Create, 00578 _In_ BOOLEAN AllowMultipleCallbacks); 00579 00580 NTKERNELAPI 00581 VOID 00582 NTAPI 00583 ExDeleteNPagedLookasideList( 00584 _Inout_ PNPAGED_LOOKASIDE_LIST Lookaside); 00585 00586 _IRQL_requires_max_(APC_LEVEL) 00587 NTKERNELAPI 00588 VOID 00589 NTAPI 00590 ExDeletePagedLookasideList( 00591 _Inout_ PPAGED_LOOKASIDE_LIST Lookaside); 00592 00593 _IRQL_requires_max_(DISPATCH_LEVEL) 00594 NTKERNELAPI 00595 NTSTATUS 00596 NTAPI 00597 ExDeleteResourceLite( 00598 _Inout_ PERESOURCE Resource); 00599 00600 _IRQL_requires_max_(DISPATCH_LEVEL) 00601 NTKERNELAPI 00602 VOID 00603 NTAPI 00604 ExFreePool( 00605 _In_ __drv_freesMem(Mem) PVOID P); 00606 00607 _IRQL_requires_max_(DISPATCH_LEVEL) 00608 NTKERNELAPI 00609 VOID 00610 NTAPI 00611 ExFreePoolWithTag( 00612 _In_ __drv_freesMem(Mem) PVOID P, 00613 _In_ ULONG Tag); 00614 00615 _IRQL_requires_max_(DISPATCH_LEVEL) 00616 NTKERNELAPI 00617 ULONG 00618 NTAPI 00619 ExGetExclusiveWaiterCount( 00620 _In_ PERESOURCE Resource); 00621 00622 _IRQL_requires_max_(DISPATCH_LEVEL) 00623 NTKERNELAPI 00624 KPROCESSOR_MODE 00625 NTAPI 00626 ExGetPreviousMode(VOID); 00627 00628 _IRQL_requires_max_(DISPATCH_LEVEL) 00629 NTKERNELAPI 00630 ULONG 00631 NTAPI 00632 ExGetSharedWaiterCount( 00633 _In_ PERESOURCE Resource); 00634 00635 _IRQL_requires_max_(DISPATCH_LEVEL) 00636 NTKERNELAPI 00637 VOID 00638 NTAPI 00639 ExInitializeNPagedLookasideList( 00640 _Out_ PNPAGED_LOOKASIDE_LIST Lookaside, 00641 _In_opt_ PALLOCATE_FUNCTION Allocate, 00642 _In_opt_ PFREE_FUNCTION Free, 00643 _In_ ULONG Flags, 00644 _In_ SIZE_T Size, 00645 _In_ ULONG Tag, 00646 _In_ USHORT Depth); 00647 00648 _IRQL_requires_max_(APC_LEVEL) 00649 NTKERNELAPI 00650 VOID 00651 NTAPI 00652 ExInitializePagedLookasideList( 00653 _Out_ PPAGED_LOOKASIDE_LIST Lookaside, 00654 _In_opt_ PALLOCATE_FUNCTION Allocate, 00655 _In_opt_ PFREE_FUNCTION Free, 00656 _In_ ULONG Flags, 00657 _In_ SIZE_T Size, 00658 _In_ ULONG Tag, 00659 _In_ USHORT Depth); 00660 00661 _IRQL_requires_max_(DISPATCH_LEVEL) 00662 NTKERNELAPI 00663 NTSTATUS 00664 NTAPI 00665 ExInitializeResourceLite( 00666 _Out_ PERESOURCE Resource); 00667 00668 NTKERNELAPI 00669 LARGE_INTEGER 00670 NTAPI 00671 ExInterlockedAddLargeInteger( 00672 _Inout_ PLARGE_INTEGER Addend, 00673 _In_ LARGE_INTEGER Increment, 00674 _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock); 00675 00676 #if defined(_WIN64) 00677 #define ExInterlockedAddLargeStatistic(Addend, Increment) \ 00678 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment) 00679 #else 00680 #define ExInterlockedAddLargeStatistic(Addend, Increment) \ 00681 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment) 00682 #endif 00683 00684 NTKERNELAPI 00685 ULONG 00686 FASTCALL 00687 ExInterlockedAddUlong( 00688 _Inout_ PULONG Addend, 00689 _In_ ULONG Increment, 00690 _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock); 00691 00692 #if defined(_AMD64_) || defined(_IA64_) 00693 00694 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \ 00695 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand)) 00696 00697 #elif defined(_X86_) 00698 00699 NTKERNELAPI 00700 LONGLONG 00701 FASTCALL 00702 ExfInterlockedCompareExchange64( 00703 _Inout_ _Interlocked_operand_ LONGLONG volatile *Destination, 00704 _In_ PLONGLONG Exchange, 00705 _In_ PLONGLONG Comperand); 00706 00707 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \ 00708 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand) 00709 00710 #else 00711 00712 NTKERNELAPI 00713 LONGLONG 00714 FASTCALL 00715 ExInterlockedCompareExchange64( 00716 IN OUT LONGLONG volatile *Destination, 00717 IN PLONGLONG Exchange, 00718 IN PLONGLONG Comparand, 00719 IN PKSPIN_LOCK Lock); 00720 00721 #endif /* defined(_AMD64_) || defined(_IA64_) */ 00722 00723 NTKERNELAPI 00724 PLIST_ENTRY 00725 FASTCALL 00726 ExInterlockedInsertHeadList( 00727 _Inout_ PLIST_ENTRY ListHead, 00728 _Inout_ __drv_aliasesMem PLIST_ENTRY ListEntry, 00729 _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock); 00730 00731 NTKERNELAPI 00732 PLIST_ENTRY 00733 FASTCALL 00734 ExInterlockedInsertTailList( 00735 _Inout_ PLIST_ENTRY ListHead, 00736 _Inout_ __drv_aliasesMem PLIST_ENTRY ListEntry, 00737 _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock); 00738 00739 NTKERNELAPI 00740 PSINGLE_LIST_ENTRY 00741 FASTCALL 00742 ExInterlockedPopEntryList( 00743 _Inout_ PSINGLE_LIST_ENTRY ListHead, 00744 _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock); 00745 00746 NTKERNELAPI 00747 PSINGLE_LIST_ENTRY 00748 FASTCALL 00749 ExInterlockedPushEntryList( 00750 _Inout_ PSINGLE_LIST_ENTRY ListHead, 00751 _Inout_ __drv_aliasesMem PSINGLE_LIST_ENTRY ListEntry, 00752 _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock); 00753 00754 NTKERNELAPI 00755 PLIST_ENTRY 00756 FASTCALL 00757 ExInterlockedRemoveHeadList( 00758 _Inout_ PLIST_ENTRY ListHead, 00759 _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock); 00760 00761 _IRQL_requires_max_(PASSIVE_LEVEL) 00762 NTKERNELAPI 00763 BOOLEAN 00764 NTAPI 00765 ExIsProcessorFeaturePresent( 00766 _In_ ULONG ProcessorFeature); 00767 00768 _IRQL_requires_max_(DISPATCH_LEVEL) 00769 NTKERNELAPI 00770 BOOLEAN 00771 NTAPI 00772 ExIsResourceAcquiredExclusiveLite( 00773 _In_ PERESOURCE Resource); 00774 00775 _IRQL_requires_max_(DISPATCH_LEVEL) 00776 NTKERNELAPI 00777 ULONG 00778 NTAPI 00779 ExIsResourceAcquiredSharedLite( 00780 _In_ PERESOURCE Resource); 00781 00782 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite 00783 00784 NTKERNELAPI 00785 VOID 00786 NTAPI 00787 ExLocalTimeToSystemTime( 00788 _In_ PLARGE_INTEGER LocalTime, 00789 _Out_ PLARGE_INTEGER SystemTime); 00790 00791 _IRQL_requires_max_(DISPATCH_LEVEL) 00792 NTKERNELAPI 00793 VOID 00794 NTAPI 00795 ExNotifyCallback( 00796 _In_ PCALLBACK_OBJECT CallbackObject, 00797 _In_opt_ PVOID Argument1, 00798 _In_opt_ PVOID Argument2); 00799 00800 _IRQL_requires_max_(DISPATCH_LEVEL) 00801 NTKERNELAPI 00802 VOID 00803 NTAPI 00804 ExQueueWorkItem( 00805 _Inout_ __drv_aliasesMem PWORK_QUEUE_ITEM WorkItem, 00806 __drv_strictTypeMatch(__drv_typeExpr) _In_ WORK_QUEUE_TYPE QueueType); 00807 00808 _IRQL_requires_max_(APC_LEVEL) 00809 NTKERNELAPI 00810 DECLSPEC_NORETURN 00811 VOID 00812 NTAPI 00813 ExRaiseStatus( 00814 _In_ NTSTATUS Status); 00815 00816 _IRQL_requires_max_(APC_LEVEL) 00817 NTKERNELAPI 00818 PVOID 00819 NTAPI 00820 ExRegisterCallback( 00821 _Inout_ PCALLBACK_OBJECT CallbackObject, 00822 _In_ PCALLBACK_FUNCTION CallbackFunction, 00823 _In_opt_ PVOID CallbackContext); 00824 00825 _IRQL_requires_max_(DISPATCH_LEVEL) 00826 NTKERNELAPI 00827 NTSTATUS 00828 NTAPI 00829 ExReinitializeResourceLite( 00830 _Inout_ PERESOURCE Resource); 00831 00832 _IRQL_requires_max_(DISPATCH_LEVEL) 00833 _Requires_lock_held_(_Global_critical_region_) 00834 NTKERNELAPI 00835 VOID 00836 NTAPI 00837 ExReleaseResourceForThreadLite( 00838 _Inout_ _Requires_lock_held_(*_Curr_) _Releases_lock_(*_Curr_) 00839 PERESOURCE Resource, 00840 _In_ ERESOURCE_THREAD ResourceThreadId); 00841 00842 _Requires_lock_held_(_Global_critical_region_) 00843 _Requires_lock_held_(*Resource) 00844 _Releases_lock_(*Resource) 00845 _IRQL_requires_max_(DISPATCH_LEVEL) 00846 NTKERNELAPI 00847 VOID 00848 FASTCALL 00849 ExReleaseResourceLite( 00850 _Inout_ PERESOURCE Resource); 00851 00852 _IRQL_requires_max_(DISPATCH_LEVEL) 00853 NTKERNELAPI 00854 VOID 00855 NTAPI 00856 ExSetResourceOwnerPointer( 00857 _Inout_ PERESOURCE Resource, 00858 _In_ PVOID OwnerPointer); 00859 00860 _IRQL_requires_max_(APC_LEVEL) 00861 NTKERNELAPI 00862 ULONG 00863 NTAPI 00864 ExSetTimerResolution( 00865 _In_ ULONG DesiredTime, 00866 _In_ BOOLEAN SetResolution); 00867 00868 NTKERNELAPI 00869 VOID 00870 NTAPI 00871 ExSystemTimeToLocalTime( 00872 _In_ PLARGE_INTEGER SystemTime, 00873 _Out_ PLARGE_INTEGER LocalTime); 00874 00875 _IRQL_requires_max_(APC_LEVEL) 00876 NTKERNELAPI 00877 VOID 00878 NTAPI 00879 ExUnregisterCallback( 00880 _Inout_ PVOID CbRegistration); 00881 00882 $endif (_WDMDDK_) 00883 $if (_NTDDK_) 00884 NTKERNELAPI 00885 NTSTATUS 00886 NTAPI 00887 ExExtendZone( 00888 _Inout_ PZONE_HEADER Zone, 00889 _Inout_ PVOID Segment, 00890 _In_ ULONG SegmentSize); 00891 00892 NTKERNELAPI 00893 NTSTATUS 00894 NTAPI 00895 ExInitializeZone( 00896 _Out_ PZONE_HEADER Zone, 00897 _In_ ULONG BlockSize, 00898 _Inout_ PVOID InitialSegment, 00899 _In_ ULONG InitialSegmentSize); 00900 00901 _IRQL_requires_max_(DISPATCH_LEVEL) 00902 NTKERNELAPI 00903 NTSTATUS 00904 NTAPI 00905 ExInterlockedExtendZone( 00906 _Inout_ PZONE_HEADER Zone, 00907 _Inout_ PVOID Segment, 00908 _In_ ULONG SegmentSize, 00909 _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock); 00910 00911 _IRQL_requires_max_(PASSIVE_LEVEL) 00912 NTKERNELAPI 00913 NTSTATUS 00914 NTAPI 00915 ExUuidCreate( 00916 _Out_ UUID *Uuid); 00917 00918 _IRQL_requires_max_(PASSIVE_LEVEL) 00919 NTKERNELAPI 00920 DECLSPEC_NORETURN 00921 VOID 00922 NTAPI 00923 ExRaiseAccessViolation(VOID); 00924 00925 _IRQL_requires_max_(PASSIVE_LEVEL) 00926 NTKERNELAPI 00927 DECLSPEC_NORETURN 00928 VOID 00929 NTAPI 00930 ExRaiseDatatypeMisalignment(VOID); 00931 00932 $endif (_NTDDK_) 00933 $if (_NTIFS_) 00934 00935 _IRQL_requires_max_(DISPATCH_LEVEL) 00936 NTKERNELAPI 00937 SIZE_T 00938 NTAPI 00939 ExQueryPoolBlockSize( 00940 _In_ PVOID PoolBlock, 00941 _Out_ PBOOLEAN QuotaCharged); 00942 00943 _IRQL_requires_max_(DISPATCH_LEVEL) 00944 VOID 00945 ExAdjustLookasideDepth(VOID); 00946 00947 _IRQL_requires_max_(DISPATCH_LEVEL) 00948 NTKERNELAPI 00949 VOID 00950 NTAPI 00951 ExDisableResourceBoostLite( 00952 _In_ PERESOURCE Resource); 00953 $endif (_NTIFS_) 00954 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ 00955 00956 $if (_WDMDDK_ || _NTIFS_) 00957 #if (NTDDI_VERSION >= NTDDI_WINXP) 00958 $endif (_WDMDDK_ || _NTIFS_) 00959 $if (_WDMDDK_) 00960 00961 _Must_inspect_result_ 00962 _Post_satisfies_(return == 0 || return == 1) 00963 NTKERNELAPI 00964 BOOLEAN 00965 FASTCALL 00966 ExAcquireRundownProtection( 00967 _Inout_ PEX_RUNDOWN_REF RunRef); 00968 00969 NTKERNELAPI 00970 VOID 00971 FASTCALL 00972 ExInitializeRundownProtection( 00973 _Out_ PEX_RUNDOWN_REF RunRef); 00974 00975 NTKERNELAPI 00976 VOID 00977 FASTCALL 00978 ExReInitializeRundownProtection( 00979 _Inout_ PEX_RUNDOWN_REF RunRef); 00980 00981 NTKERNELAPI 00982 VOID 00983 FASTCALL 00984 ExReleaseRundownProtection( 00985 _Inout_ PEX_RUNDOWN_REF RunRef); 00986 00987 NTKERNELAPI 00988 VOID 00989 FASTCALL 00990 ExRundownCompleted( 00991 _Out_ PEX_RUNDOWN_REF RunRef); 00992 00993 NTKERNELAPI 00994 BOOLEAN 00995 NTAPI 00996 ExVerifySuite( 00997 __drv_strictTypeMatch(__drv_typeExpr) _In_ SUITE_TYPE SuiteType); 00998 00999 NTKERNELAPI 01000 VOID 01001 FASTCALL 01002 ExWaitForRundownProtectionRelease( 01003 _Inout_ PEX_RUNDOWN_REF RunRef); 01004 $endif (_WDMDDK_) 01005 $if (_NTIFS_) 01006 01007 PSLIST_ENTRY 01008 FASTCALL 01009 InterlockedPushListSList( 01010 _Inout_ PSLIST_HEADER ListHead, 01011 _Inout_ __drv_aliasesMem PSLIST_ENTRY List, 01012 _Inout_ PSLIST_ENTRY ListEnd, 01013 _In_ ULONG Count); 01014 $endif (_NTIFS_) 01015 $if (_WDMDDK_ || _NTIFS_) 01016 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ 01017 $endif (_WDMDDK_ || _NTIFS_) 01018 01019 $if (_WDMDDK_) 01020 #if (NTDDI_VERSION >= NTDDI_WINXPSP2) 01021 01022 _Must_inspect_result_ 01023 _Post_satisfies_(return == 0 || return == 1) 01024 NTKERNELAPI 01025 BOOLEAN 01026 FASTCALL 01027 ExAcquireRundownProtectionEx( 01028 _Inout_ PEX_RUNDOWN_REF RunRef, 01029 _In_ ULONG Count); 01030 01031 NTKERNELAPI 01032 VOID 01033 FASTCALL 01034 ExReleaseRundownProtectionEx( 01035 _Inout_ PEX_RUNDOWN_REF RunRef, 01036 _In_ ULONG Count); 01037 01038 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */ 01039 01040 #if (NTDDI_VERSION >= NTDDI_WS03SP1) 01041 01042 _Must_inspect_result_ 01043 _IRQL_requires_max_(APC_LEVEL) 01044 NTKERNELAPI 01045 PEX_RUNDOWN_REF_CACHE_AWARE 01046 NTAPI 01047 ExAllocateCacheAwareRundownProtection( 01048 __drv_strictTypeMatch(__drv_typeExpr) _In_ POOL_TYPE PoolType, 01049 _In_ ULONG PoolTag); 01050 01051 _IRQL_requires_max_(APC_LEVEL) 01052 NTKERNELAPI 01053 SIZE_T 01054 NTAPI 01055 ExSizeOfRundownProtectionCacheAware(VOID); 01056 01057 _IRQL_requires_max_(APC_LEVEL) 01058 _Acquires_lock_(_Global_critical_region_) 01059 NTKERNELAPI 01060 PVOID 01061 NTAPI 01062 ExEnterCriticalRegionAndAcquireResourceShared( 01063 _Inout_ _Requires_lock_not_held_(*_Curr_) _Acquires_shared_lock_(*_Curr_) 01064 PERESOURCE Resource); 01065 01066 _IRQL_requires_max_(APC_LEVEL) 01067 _Acquires_lock_(_Global_critical_region_) 01068 NTKERNELAPI 01069 PVOID 01070 NTAPI 01071 ExEnterCriticalRegionAndAcquireResourceExclusive( 01072 _Inout_ _Requires_lock_not_held_(*_Curr_) _Acquires_exclusive_lock_(*_Curr_) 01073 PERESOURCE Resource); 01074 01075 _IRQL_requires_max_(APC_LEVEL) 01076 _Acquires_lock_(_Global_critical_region_) 01077 NTKERNELAPI 01078 PVOID 01079 NTAPI 01080 ExEnterCriticalRegionAndAcquireSharedWaitForExclusive( 01081 _Inout_ _Requires_lock_not_held_(*_Curr_) _Acquires_lock_(*_Curr_) 01082 PERESOURCE Resource); 01083 01084 _IRQL_requires_max_(DISPATCH_LEVEL) 01085 _Releases_lock_(_Global_critical_region_) 01086 NTKERNELAPI 01087 VOID 01088 FASTCALL 01089 ExReleaseResourceAndLeaveCriticalRegion( 01090 _Inout_ _Requires_lock_held_(*_Curr_) _Releases_lock_(*_Curr_) 01091 PERESOURCE Resource); 01092 01093 _IRQL_requires_max_(APC_LEVEL) 01094 NTKERNELAPI 01095 VOID 01096 NTAPI 01097 ExInitializeRundownProtectionCacheAware( 01098 _Out_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware, 01099 _In_ SIZE_T RunRefSize); 01100 01101 _IRQL_requires_max_(APC_LEVEL) 01102 NTKERNELAPI 01103 VOID 01104 NTAPI 01105 ExFreeCacheAwareRundownProtection( 01106 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware); 01107 01108 _Must_inspect_result_ 01109 _Post_satisfies_(return == 0 || return == 1) 01110 NTKERNELAPI 01111 BOOLEAN 01112 FASTCALL 01113 ExAcquireRundownProtectionCacheAware( 01114 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware); 01115 01116 NTKERNELAPI 01117 VOID 01118 FASTCALL 01119 ExReleaseRundownProtectionCacheAware( 01120 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware); 01121 01122 _Must_inspect_result_ 01123 _Post_satisfies_(return == 0 || return == 1) 01124 NTKERNELAPI 01125 BOOLEAN 01126 FASTCALL 01127 ExAcquireRundownProtectionCacheAwareEx( 01128 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware, 01129 _In_ ULONG Count); 01130 01131 NTKERNELAPI 01132 VOID 01133 FASTCALL 01134 ExReleaseRundownProtectionCacheAwareEx( 01135 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRef, 01136 _In_ ULONG Count); 01137 01138 NTKERNELAPI 01139 VOID 01140 FASTCALL 01141 ExWaitForRundownProtectionReleaseCacheAware( 01142 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRef); 01143 01144 NTKERNELAPI 01145 VOID 01146 FASTCALL 01147 ExReInitializeRundownProtectionCacheAware( 01148 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware); 01149 01150 NTKERNELAPI 01151 VOID 01152 FASTCALL 01153 ExRundownCompletedCacheAware( 01154 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware); 01155 01156 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */ 01157 01158 #if (NTDDI_VERSION >= NTDDI_VISTA) 01159 01160 _IRQL_requires_max_(DISPATCH_LEVEL) 01161 NTKERNELAPI 01162 NTSTATUS 01163 NTAPI 01164 ExInitializeLookasideListEx( 01165 _Out_ PLOOKASIDE_LIST_EX Lookaside, 01166 _In_opt_ PALLOCATE_FUNCTION_EX Allocate, 01167 _In_opt_ PFREE_FUNCTION_EX Free, 01168 _In_ POOL_TYPE PoolType, 01169 _In_ ULONG Flags, 01170 _In_ SIZE_T Size, 01171 _In_ ULONG Tag, 01172 _In_ USHORT Depth); 01173 01174 _IRQL_requires_max_(DISPATCH_LEVEL) 01175 NTKERNELAPI 01176 VOID 01177 NTAPI 01178 ExDeleteLookasideListEx( 01179 _Inout_ PLOOKASIDE_LIST_EX Lookaside); 01180 01181 _IRQL_requires_max_(DISPATCH_LEVEL) 01182 NTKERNELAPI 01183 VOID 01184 NTAPI 01185 ExFlushLookasideListEx( 01186 _Inout_ PLOOKASIDE_LIST_EX Lookaside); 01187 01188 _Must_inspect_result_ 01189 _IRQL_requires_max_(DISPATCH_LEVEL) 01190 FORCEINLINE 01191 PVOID 01192 ExAllocateFromLookasideListEx( 01193 _Inout_ PLOOKASIDE_LIST_EX Lookaside) 01194 { 01195 PVOID Entry; 01196 01197 Lookaside->L.TotalAllocates += 1; 01198 #ifdef NONAMELESSUNION 01199 Entry = InterlockedPopEntrySList(&Lookaside->L.u.ListHead); 01200 if (Entry == NULL) { 01201 Lookaside->L.u2.AllocateMisses += 1; 01202 Entry = (Lookaside->L.u4.AllocateEx)(Lookaside->L.Type, 01203 Lookaside->L.Size, 01204 Lookaside->L.Tag, 01205 Lookaside); 01206 } 01207 #else /* NONAMELESSUNION */ 01208 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead); 01209 if (Entry == NULL) { 01210 Lookaside->L.AllocateMisses += 1; 01211 Entry = (Lookaside->L.AllocateEx)(Lookaside->L.Type, 01212 Lookaside->L.Size, 01213 Lookaside->L.Tag, 01214 Lookaside); 01215 } 01216 #endif /* NONAMELESSUNION */ 01217 return Entry; 01218 } 01219 01220 _IRQL_requires_max_(DISPATCH_LEVEL) 01221 FORCEINLINE 01222 VOID 01223 ExFreeToLookasideListEx( 01224 _Inout_ PLOOKASIDE_LIST_EX Lookaside, 01225 _In_ PVOID Entry) 01226 { 01227 Lookaside->L.TotalFrees += 1; 01228 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) { 01229 Lookaside->L.FreeMisses += 1; 01230 (Lookaside->L.FreeEx)(Entry, Lookaside); 01231 } else { 01232 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry); 01233 } 01234 return; 01235 } 01236 01237 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ 01238 01239 #if (NTDDI_VERSION >= NTDDI_WIN7) 01240 01241 _IRQL_requires_max_(DISPATCH_LEVEL) 01242 NTKERNELAPI 01243 VOID 01244 NTAPI 01245 ExSetResourceOwnerPointerEx( 01246 _Inout_ PERESOURCE Resource, 01247 _In_ PVOID OwnerPointer, 01248 _In_ ULONG Flags); 01249 01250 #define FLAG_OWNER_POINTER_IS_THREAD 0x1 01251 01252 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ 01253 01254 _IRQL_requires_max_(DISPATCH_LEVEL) 01255 static __inline PVOID 01256 ExAllocateFromNPagedLookasideList( 01257 _Inout_ PNPAGED_LOOKASIDE_LIST Lookaside) 01258 { 01259 PVOID Entry; 01260 01261 Lookaside->L.TotalAllocates++; 01262 #ifdef NONAMELESSUNION 01263 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_) 01264 Entry = ExInterlockedPopEntrySList(&Lookaside->L.u.ListHead, 01265 &Lookaside->Lock__ObsoleteButDoNotDelete); 01266 #else 01267 Entry = InterlockedPopEntrySList(&Lookaside->L.u.ListHead); 01268 #endif 01269 if (Entry == NULL) { 01270 Lookaside->L.u2.AllocateMisses++; 01271 Entry = (Lookaside->L.u4.Allocate)(Lookaside->L.Type, 01272 Lookaside->L.Size, 01273 Lookaside->L.Tag); 01274 } 01275 #else /* NONAMELESSUNION */ 01276 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_) 01277 Entry = ExInterlockedPopEntrySList(&Lookaside->L.ListHead, 01278 &Lookaside->Lock__ObsoleteButDoNotDelete); 01279 #else 01280 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead); 01281 #endif 01282 if (Entry == NULL) { 01283 Lookaside->L.AllocateMisses++; 01284 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type, 01285 Lookaside->L.Size, 01286 Lookaside->L.Tag); 01287 } 01288 #endif /* NONAMELESSUNION */ 01289 return Entry; 01290 } 01291 01292 _IRQL_requires_max_(DISPATCH_LEVEL) 01293 static __inline VOID 01294 ExFreeToNPagedLookasideList( 01295 _Inout_ PNPAGED_LOOKASIDE_LIST Lookaside, 01296 _In_ PVOID Entry) 01297 { 01298 Lookaside->L.TotalFrees++; 01299 #ifdef NONAMELESSUNION 01300 if (ExQueryDepthSList(&Lookaside->L.u.ListHead) >= Lookaside->L.Depth) { 01301 Lookaside->L.u3.FreeMisses++; 01302 (Lookaside->L.u5.Free)(Entry); 01303 } else { 01304 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_) 01305 ExInterlockedPushEntrySList(&Lookaside->L.u.ListHead, 01306 (PSLIST_ENTRY)Entry, 01307 &Lookaside->Lock__ObsoleteButDoNotDelete); 01308 #else 01309 InterlockedPushEntrySList(&Lookaside->L.u.ListHead, (PSLIST_ENTRY)Entry); 01310 #endif 01311 } 01312 #else /* NONAMELESSUNION */ 01313 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) { 01314 Lookaside->L.FreeMisses++; 01315 (Lookaside->L.Free)(Entry); 01316 } else { 01317 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_) 01318 ExInterlockedPushEntrySList(&Lookaside->L.ListHead, 01319 (PSLIST_ENTRY)Entry, 01320 &Lookaside->Lock__ObsoleteButDoNotDelete); 01321 #else 01322 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry); 01323 #endif 01324 } 01325 #endif /* NONAMELESSUNION */ 01326 } 01327 01328 $endif (_WDMDDK_) Generated on Sun May 27 2012 04:30:50 for ReactOS by
1.7.6.1
|