ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

exfuncs.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.