[XDK]
[reactos.git] / include / xdk / exfuncs.h
1 /******************************************************************************
2 * Executive Functions *
3 ******************************************************************************/
4 $if (_NTDDK_)
5 static __inline PVOID
6 ExAllocateFromZone(
7 IN PZONE_HEADER Zone)
8 {
9 if (Zone->FreeList.Next)
10 Zone->FreeList.Next = Zone->FreeList.Next->Next;
11 return (PVOID) Zone->FreeList.Next;
12 }
13
14 static __inline PVOID
15 ExFreeToZone(
16 IN PZONE_HEADER Zone,
17 IN PVOID Block)
18 {
19 ((PSINGLE_LIST_ENTRY) Block)->Next = Zone->FreeList.Next;
20 Zone->FreeList.Next = ((PSINGLE_LIST_ENTRY) Block);
21 return ((PSINGLE_LIST_ENTRY) Block)->Next;
22 }
23
24 /*
25 * PVOID
26 * ExInterlockedAllocateFromZone(
27 * IN PZONE_HEADER Zone,
28 * IN PKSPIN_LOCK Lock)
29 */
30 #define ExInterlockedAllocateFromZone(Zone, Lock) \
31 ((PVOID) ExInterlockedPopEntryList(&Zone->FreeList, Lock))
32
33 /* PVOID
34 * ExInterlockedFreeToZone(
35 * IN PZONE_HEADER Zone,
36 * IN PVOID Block,
37 * IN PKSPIN_LOCK Lock);
38 */
39 #define ExInterlockedFreeToZone(Zone, Block, Lock) \
40 ExInterlockedPushEntryList(&(Zone)->FreeList, (PSINGLE_LIST_ENTRY)(Block), Lock)
41
42 /*
43 * BOOLEAN
44 * ExIsFullZone(
45 * IN PZONE_HEADER Zone)
46 */
47 #define ExIsFullZone(Zone) \
48 ((Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY) NULL)
49
50 /* BOOLEAN
51 * ExIsObjectInFirstZoneSegment(
52 * IN PZONE_HEADER Zone,
53 * IN PVOID Object);
54 */
55 #define ExIsObjectInFirstZoneSegment(Zone,Object) \
56 ((BOOLEAN)( ((PUCHAR)(Object) >= (PUCHAR)(Zone)->SegmentList.Next) && \
57 ((PUCHAR)(Object) < (PUCHAR)(Zone)->SegmentList.Next + \
58 (Zone)->TotalSegmentSize)) )
59
60 #define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite
61 #define ExAcquireResourceShared ExAcquireResourceSharedLite
62 #define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite
63 #define ExDeleteResource ExDeleteResourceLite
64 #define ExInitializeResource ExInitializeResourceLite
65 #define ExIsResourceAcquiredExclusive ExIsResourceAcquiredExclusiveLite
66 #define ExIsResourceAcquiredShared ExIsResourceAcquiredSharedLite
67 #define ExIsResourceAcquired ExIsResourceAcquiredSharedLite
68 #define ExReleaseResourceForThread ExReleaseResourceForThreadLite
69 $endif
70
71 $if (_WDMDDK_)
72 #define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend)
73 #define ExInterlockedDecrementLong(Addend,Lock) Exfi386InterlockedDecrementLong(Addend)
74 #define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value)
75
76 #define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql))
77 #define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql))
78 #define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock)
79 #define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock)
80
81 #define ExInitializeSListHead InitializeSListHead
82
83 #if defined(_NTHAL_) && defined(_X86_)
84
85 NTKERNELAPI
86 VOID
87 FASTCALL
88 ExiAcquireFastMutex(
89 IN OUT PFAST_MUTEX FastMutex);
90
91 NTKERNELAPI
92 VOID
93 FASTCALL
94 ExiReleaseFastMutex(
95 IN OUT PFAST_MUTEX FastMutex);
96
97 NTKERNELAPI
98 BOOLEAN
99 FASTCALL
100 ExiTryToAcquireFastMutex(
101 IN OUT PFAST_MUTEX FastMutex);
102
103 #define ExAcquireFastMutex ExiAcquireFastMutex
104 #define ExReleaseFastMutex ExiReleaseFastMutex
105 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
106
107 #else
108
109 #if (NTDDI_VERSION >= NTDDI_WIN2K)
110
111 NTKERNELAPI
112 VOID
113 FASTCALL
114 ExAcquireFastMutex(
115 IN OUT PFAST_MUTEX FastMutex);
116
117 NTKERNELAPI
118 VOID
119 FASTCALL
120 ExReleaseFastMutex(
121 IN OUT PFAST_MUTEX FastMutex);
122
123 NTKERNELAPI
124 BOOLEAN
125 FASTCALL
126 ExTryToAcquireFastMutex(
127 IN OUT PFAST_MUTEX FastMutex);
128
129 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
130
131 #endif /* defined(_NTHAL_) && defined(_X86_) */
132
133 #if defined(_X86_)
134 #define ExInterlockedAddUlong ExfInterlockedAddUlong
135 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
136 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
137 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
138 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
139 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
140 #endif /* defined(_X86_) */
141
142 #if defined(_WIN64)
143
144 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
145 defined(_NTHAL_) || defined(_NTOSP_)
146 NTKERNELAPI
147 USHORT
148 ExQueryDepthSList(IN PSLIST_HEADER ListHead);
149 #else
150 FORCEINLINE
151 USHORT
152 ExQueryDepthSList(IN PSLIST_HEADER ListHead)
153 {
154 return (USHORT)(ListHead->Alignment & 0xffff);
155 }
156 #endif
157
158 NTKERNELAPI
159 PSLIST_ENTRY
160 ExpInterlockedFlushSList(
161 PSLIST_HEADER ListHead);
162
163 NTKERNELAPI
164 PSLIST_ENTRY
165 ExpInterlockedPopEntrySList(
166 PSLIST_HEADER ListHead);
167
168 NTKERNELAPI
169 PSLIST_ENTRY
170 ExpInterlockedPushEntrySList(
171 PSLIST_HEADER ListHead,
172 PSLIST_ENTRY ListEntry);
173
174 #define ExInterlockedFlushSList(Head) \
175 ExpInterlockedFlushSList(Head)
176 #define ExInterlockedPopEntrySList(Head, Lock) \
177 ExpInterlockedPopEntrySList(Head)
178 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
179 ExpInterlockedPushEntrySList(Head, Entry)
180
181 #else /* !defined(_WIN64) */
182
183 #define ExQueryDepthSList(listhead) (listhead)->Depth
184
185 NTKERNELAPI
186 PSINGLE_LIST_ENTRY
187 FASTCALL
188 ExInterlockedFlushSList(
189 IN OUT PSLIST_HEADER ListHead);
190
191 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
192
193 NTKERNELAPI
194 PSINGLE_LIST_ENTRY
195 FASTCALL
196 ExInterlockedPopEntrySList(
197 IN PSLIST_HEADER ListHead,
198 IN PKSPIN_LOCK Lock);
199
200 NTKERNELAPI
201 PSINGLE_LIST_ENTRY
202 FASTCALL
203 ExInterlockedPushEntrySList(
204 IN PSLIST_HEADER ListHead,
205 IN PSINGLE_LIST_ENTRY ListEntry,
206 IN PKSPIN_LOCK Lock);
207
208 NTKERNELAPI
209 PVOID
210 NTAPI
211 ExAllocateFromPagedLookasideList(
212 IN OUT PPAGED_LOOKASIDE_LIST Lookaside);
213
214 NTKERNELAPI
215 VOID
216 NTAPI
217 ExFreeToPagedLookasideList(
218 IN OUT PPAGED_LOOKASIDE_LIST Lookaside,
219 IN PVOID Entry);
220
221 #else
222
223 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
224 InterlockedPopEntrySList(_ListHead)
225 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
226 InterlockedPushEntrySList(_ListHead, _ListEntry)
227
228 static __inline
229 PVOID
230 ExAllocateFromPagedLookasideList(
231 IN OUT PPAGED_LOOKASIDE_LIST Lookaside)
232 {
233 PVOID Entry;
234
235 Lookaside->L.TotalAllocates++;
236 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
237 if (Entry == NULL) {
238 Lookaside->L.AllocateMisses++;
239 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
240 Lookaside->L.Size,
241 Lookaside->L.Tag);
242 }
243 return Entry;
244 }
245
246 static __inline
247 VOID
248 ExFreeToPagedLookasideList(
249 IN OUT PPAGED_LOOKASIDE_LIST Lookaside,
250 IN PVOID Entry)
251 {
252 Lookaside->L.TotalFrees++;
253 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
254 Lookaside->L.FreeMisses++;
255 (Lookaside->L.Free)(Entry);
256 } else {
257 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
258 }
259 }
260
261 #endif /* _WIN2K_COMPAT_SLIST_USAGE */
262
263 #endif /* !defined(_WIN64) */
264
265 /* ERESOURCE_THREAD
266 * ExGetCurrentResourceThread(
267 * VOID);
268 */
269 #define ExGetCurrentResourceThread() ((ULONG_PTR)PsGetCurrentThread())
270
271 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
272
273 /* VOID
274 * ExInitializeWorkItem(
275 * IN PWORK_QUEUE_ITEM Item,
276 * IN PWORKER_THREAD_ROUTINE Routine,
277 * IN PVOID Context)
278 */
279 #define ExInitializeWorkItem(Item, Routine, Context) \
280 { \
281 (Item)->WorkerRoutine = Routine; \
282 (Item)->Parameter = Context; \
283 (Item)->List.Flink = NULL; \
284 }
285
286 FORCEINLINE
287 VOID
288 ExInitializeFastMutex(
289 OUT PFAST_MUTEX FastMutex)
290 {
291 FastMutex->Count = FM_LOCK_BIT;
292 FastMutex->Owner = NULL;
293 FastMutex->Contention = 0;
294 KeInitializeEvent(&FastMutex->Event, SynchronizationEvent, FALSE);
295 return;
296 }
297 $endif
298
299 #if (NTDDI_VERSION >= NTDDI_WIN2K)
300 $if (_NTDDK_)
301 NTKERNELAPI
302 NTSTATUS
303 NTAPI
304 ExExtendZone(
305 IN OUT PZONE_HEADER Zone,
306 IN OUT PVOID Segment,
307 IN ULONG SegmentSize);
308
309 NTKERNELAPI
310 NTSTATUS
311 NTAPI
312 ExInitializeZone(
313 OUT PZONE_HEADER Zone,
314 IN ULONG BlockSize,
315 IN OUT PVOID InitialSegment,
316 IN ULONG InitialSegmentSize);
317
318 NTKERNELAPI
319 NTSTATUS
320 NTAPI
321 ExInterlockedExtendZone(
322 IN OUT PZONE_HEADER Zone,
323 IN OUT PVOID Segment,
324 IN ULONG SegmentSize,
325 IN OUT PKSPIN_LOCK Lock);
326
327 NTKERNELAPI
328 NTSTATUS
329 NTAPI
330 ExUuidCreate(
331 OUT UUID *Uuid);
332
333 NTKERNELAPI
334 DECLSPEC_NORETURN
335 VOID
336 NTAPI
337 ExRaiseAccessViolation(VOID);
338
339 NTKERNELAPI
340 DECLSPEC_NORETURN
341 VOID
342 NTAPI
343 ExRaiseDatatypeMisalignment(VOID);
344 $endif
345
346 $if (_WDMDDK_)
347 NTKERNELAPI
348 VOID
349 FASTCALL
350 ExAcquireFastMutexUnsafe(
351 IN OUT PFAST_MUTEX FastMutex);
352
353 NTKERNELAPI
354 VOID
355 FASTCALL
356 ExReleaseFastMutexUnsafe(
357 IN OUT PFAST_MUTEX FastMutex);
358
359 NTKERNELAPI
360 BOOLEAN
361 NTAPI
362 ExAcquireResourceExclusiveLite(
363 IN OUT PERESOURCE Resource,
364 IN BOOLEAN Wait);
365
366 NTKERNELAPI
367 BOOLEAN
368 NTAPI
369 ExAcquireResourceSharedLite(
370 IN OUT PERESOURCE Resource,
371 IN BOOLEAN Wait);
372
373 NTKERNELAPI
374 BOOLEAN
375 NTAPI
376 ExAcquireSharedStarveExclusive(
377 IN OUT PERESOURCE Resource,
378 IN BOOLEAN Wait);
379
380 NTKERNELAPI
381 BOOLEAN
382 NTAPI
383 ExAcquireSharedWaitForExclusive(
384 IN OUT PERESOURCE Resource,
385 IN BOOLEAN Wait);
386
387 NTKERNELAPI
388 PVOID
389 NTAPI
390 ExAllocatePool(
391 IN POOL_TYPE PoolType,
392 IN SIZE_T NumberOfBytes);
393
394 NTKERNELAPI
395 PVOID
396 NTAPI
397 ExAllocatePoolWithQuota(
398 IN POOL_TYPE PoolType,
399 IN SIZE_T NumberOfBytes);
400
401 NTKERNELAPI
402 PVOID
403 NTAPI
404 ExAllocatePoolWithQuotaTag(
405 IN POOL_TYPE PoolType,
406 IN SIZE_T NumberOfBytes,
407 IN ULONG Tag);
408
409 #ifndef POOL_TAGGING
410 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
411 #endif
412
413 NTKERNELAPI
414 PVOID
415 NTAPI
416 ExAllocatePoolWithTag(
417 IN POOL_TYPE PoolType,
418 IN SIZE_T NumberOfBytes,
419 IN ULONG Tag);
420
421 #ifndef POOL_TAGGING
422 #define ExAllocatePoolWithTag(a,b,c) ExAllocatePool(a,b)
423 #endif
424
425 NTKERNELAPI
426 PVOID
427 NTAPI
428 ExAllocatePoolWithTagPriority(
429 IN POOL_TYPE PoolType,
430 IN SIZE_T NumberOfBytes,
431 IN ULONG Tag,
432 IN EX_POOL_PRIORITY Priority);
433
434 NTKERNELAPI
435 VOID
436 NTAPI
437 ExConvertExclusiveToSharedLite(
438 IN OUT PERESOURCE Resource);
439
440 NTKERNELAPI
441 NTSTATUS
442 NTAPI
443 ExCreateCallback(
444 OUT PCALLBACK_OBJECT *CallbackObject,
445 IN POBJECT_ATTRIBUTES ObjectAttributes,
446 IN BOOLEAN Create,
447 IN BOOLEAN AllowMultipleCallbacks);
448
449 NTKERNELAPI
450 VOID
451 NTAPI
452 ExDeleteNPagedLookasideList(
453 IN OUT PNPAGED_LOOKASIDE_LIST Lookaside);
454
455 NTKERNELAPI
456 VOID
457 NTAPI
458 ExDeletePagedLookasideList(
459 IN PPAGED_LOOKASIDE_LIST Lookaside);
460
461 NTKERNELAPI
462 NTSTATUS
463 NTAPI
464 ExDeleteResourceLite(
465 IN OUT PERESOURCE Resource);
466
467 NTKERNELAPI
468 VOID
469 NTAPI
470 ExFreePool(
471 IN PVOID P);
472
473 NTKERNELAPI
474 VOID
475 NTAPI
476 ExFreePoolWithTag(
477 IN PVOID P,
478 IN ULONG Tag);
479
480 NTKERNELAPI
481 ULONG
482 NTAPI
483 ExGetExclusiveWaiterCount(
484 IN PERESOURCE Resource);
485
486 NTKERNELAPI
487 KPROCESSOR_MODE
488 NTAPI
489 ExGetPreviousMode(VOID);
490
491 NTKERNELAPI
492 ULONG
493 NTAPI
494 ExGetSharedWaiterCount(
495 IN PERESOURCE Resource);
496
497 NTKERNELAPI
498 VOID
499 NTAPI
500 ExInitializeNPagedLookasideList(
501 IN PNPAGED_LOOKASIDE_LIST Lookaside,
502 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
503 IN PFREE_FUNCTION Free OPTIONAL,
504 IN ULONG Flags,
505 IN SIZE_T Size,
506 IN ULONG Tag,
507 IN USHORT Depth);
508
509 NTKERNELAPI
510 VOID
511 NTAPI
512 ExInitializePagedLookasideList(
513 IN PPAGED_LOOKASIDE_LIST Lookaside,
514 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
515 IN PFREE_FUNCTION Free OPTIONAL,
516 IN ULONG Flags,
517 IN SIZE_T Size,
518 IN ULONG Tag,
519 IN USHORT Depth);
520
521 NTKERNELAPI
522 NTSTATUS
523 NTAPI
524 ExInitializeResourceLite(
525 OUT PERESOURCE Resource);
526
527 NTKERNELAPI
528 LARGE_INTEGER
529 NTAPI
530 ExInterlockedAddLargeInteger(
531 IN PLARGE_INTEGER Addend,
532 IN LARGE_INTEGER Increment,
533 IN PKSPIN_LOCK Lock);
534
535 #if defined(_WIN64)
536 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
537 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
538 #else
539 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
540 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
541 #endif
542
543 NTKERNELAPI
544 ULONG
545 FASTCALL
546 ExInterlockedAddUlong(
547 IN PULONG Addend,
548 IN ULONG Increment,
549 IN OUT PKSPIN_LOCK Lock);
550
551 #if defined(_AMD64_) || defined(_IA64_)
552
553 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
554 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
555
556 #elif defined(_X86_)
557
558 NTKERNELAPI
559 LONGLONG
560 FASTCALL
561 ExfInterlockedCompareExchange64(
562 IN OUT LONGLONG volatile *Destination,
563 IN PLONGLONG Exchange,
564 IN PLONGLONG Comperand);
565
566 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
567 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
568
569 #else
570
571 NTKERNELAPI
572 LONGLONG
573 FASTCALL
574 ExInterlockedCompareExchange64(
575 IN OUT LONGLONG volatile *Destination,
576 IN PLONGLONG Exchange,
577 IN PLONGLONG Comparand,
578 IN PKSPIN_LOCK Lock);
579
580 #endif /* defined(_AMD64_) || defined(_IA64_) */
581
582 NTKERNELAPI
583 PLIST_ENTRY
584 FASTCALL
585 ExInterlockedInsertHeadList(
586 IN OUT PLIST_ENTRY ListHead,
587 IN OUT PLIST_ENTRY ListEntry,
588 IN OUT PKSPIN_LOCK Lock);
589
590 NTKERNELAPI
591 PLIST_ENTRY
592 FASTCALL
593 ExInterlockedInsertTailList(
594 IN OUT PLIST_ENTRY ListHead,
595 IN OUT PLIST_ENTRY ListEntry,
596 IN OUT PKSPIN_LOCK Lock);
597
598 NTKERNELAPI
599 PSINGLE_LIST_ENTRY
600 FASTCALL
601 ExInterlockedPopEntryList(
602 IN OUT PSINGLE_LIST_ENTRY ListHead,
603 IN OUT PKSPIN_LOCK Lock);
604
605 NTKERNELAPI
606 PSINGLE_LIST_ENTRY
607 FASTCALL
608 ExInterlockedPushEntryList(
609 IN OUT PSINGLE_LIST_ENTRY ListHead,
610 IN OUT PSINGLE_LIST_ENTRY ListEntry,
611 IN OUT PKSPIN_LOCK Lock);
612
613 NTKERNELAPI
614 PLIST_ENTRY
615 FASTCALL
616 ExInterlockedRemoveHeadList(
617 IN OUT PLIST_ENTRY ListHead,
618 IN OUT PKSPIN_LOCK Lock);
619
620 NTKERNELAPI
621 BOOLEAN
622 NTAPI
623 ExIsProcessorFeaturePresent(
624 IN ULONG ProcessorFeature);
625
626 NTKERNELAPI
627 BOOLEAN
628 NTAPI
629 ExIsResourceAcquiredExclusiveLite(
630 IN PERESOURCE Resource);
631
632 NTKERNELAPI
633 ULONG
634 NTAPI
635 ExIsResourceAcquiredSharedLite(
636 IN PERESOURCE Resource);
637
638 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
639
640 NTKERNELAPI
641 VOID
642 NTAPI
643 ExLocalTimeToSystemTime(
644 IN PLARGE_INTEGER LocalTime,
645 OUT PLARGE_INTEGER SystemTime);
646
647 NTKERNELAPI
648 VOID
649 NTAPI
650 ExNotifyCallback(
651 IN PCALLBACK_OBJECT CallbackObject,
652 IN PVOID Argument1 OPTIONAL,
653 IN PVOID Argument2 OPTIONAL);
654
655 NTKERNELAPI
656 VOID
657 NTAPI
658 ExQueueWorkItem(
659 IN OUT PWORK_QUEUE_ITEM WorkItem,
660 IN WORK_QUEUE_TYPE QueueType);
661
662 NTKERNELAPI
663 DECLSPEC_NORETURN
664 VOID
665 NTAPI
666 ExRaiseStatus(
667 IN NTSTATUS Status);
668
669 NTKERNELAPI
670 PVOID
671 NTAPI
672 ExRegisterCallback(
673 IN PCALLBACK_OBJECT CallbackObject,
674 IN PCALLBACK_FUNCTION CallbackFunction,
675 IN PVOID CallbackContext OPTIONAL);
676
677 NTKERNELAPI
678 NTSTATUS
679 NTAPI
680 ExReinitializeResourceLite(
681 IN OUT PERESOURCE Resource);
682
683 NTKERNELAPI
684 VOID
685 NTAPI
686 ExReleaseResourceForThreadLite(
687 IN OUT PERESOURCE Resource,
688 IN ERESOURCE_THREAD ResourceThreadId);
689
690 NTKERNELAPI
691 VOID
692 FASTCALL
693 ExReleaseResourceLite(
694 IN OUT PERESOURCE Resource);
695
696 NTKERNELAPI
697 VOID
698 NTAPI
699 ExSetResourceOwnerPointer(
700 IN OUT PERESOURCE Resource,
701 IN PVOID OwnerPointer);
702
703 NTKERNELAPI
704 ULONG
705 NTAPI
706 ExSetTimerResolution(
707 IN ULONG DesiredTime,
708 IN BOOLEAN SetResolution);
709
710 NTKERNELAPI
711 VOID
712 NTAPI
713 ExSystemTimeToLocalTime(
714 IN PLARGE_INTEGER SystemTime,
715 OUT PLARGE_INTEGER LocalTime);
716
717 NTKERNELAPI
718 VOID
719 NTAPI
720 ExUnregisterCallback(
721 IN OUT PVOID CbRegistration);
722 $endif
723
724 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
725
726 $if (_WDMDDK_)
727 #if (NTDDI_VERSION >= NTDDI_WINXP)
728
729 NTKERNELAPI
730 BOOLEAN
731 FASTCALL
732 ExAcquireRundownProtection(
733 IN OUT PEX_RUNDOWN_REF RunRef);
734
735 NTKERNELAPI
736 VOID
737 FASTCALL
738 ExInitializeRundownProtection(
739 OUT PEX_RUNDOWN_REF RunRef);
740
741 NTKERNELAPI
742 VOID
743 FASTCALL
744 ExReInitializeRundownProtection(
745 IN OUT PEX_RUNDOWN_REF RunRef);
746
747 NTKERNELAPI
748 VOID
749 FASTCALL
750 ExReleaseRundownProtection(
751 IN OUT PEX_RUNDOWN_REF RunRef);
752
753 NTKERNELAPI
754 VOID
755 FASTCALL
756 ExRundownCompleted(
757 OUT PEX_RUNDOWN_REF RunRef);
758
759 NTKERNELAPI
760 BOOLEAN
761 NTAPI
762 ExVerifySuite(
763 IN SUITE_TYPE SuiteType);
764
765 NTKERNELAPI
766 VOID
767 FASTCALL
768 ExWaitForRundownProtectionRelease(
769 IN OUT PEX_RUNDOWN_REF RunRef);
770
771 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
772
773 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
774
775 NTKERNELAPI
776 BOOLEAN
777 FASTCALL
778 ExAcquireRundownProtectionEx(
779 IN OUT PEX_RUNDOWN_REF RunRef,
780 IN ULONG Count);
781
782 NTKERNELAPI
783 VOID
784 FASTCALL
785 ExReleaseRundownProtectionEx(
786 IN OUT PEX_RUNDOWN_REF RunRef,
787 IN ULONG Count);
788
789 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
790
791 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
792
793 NTKERNELAPI
794 PEX_RUNDOWN_REF_CACHE_AWARE
795 NTAPI
796 ExAllocateCacheAwareRundownProtection(
797 IN POOL_TYPE PoolType,
798 IN ULONG PoolTag);
799
800 NTKERNELAPI
801 SIZE_T
802 NTAPI
803 ExSizeOfRundownProtectionCacheAware(VOID);
804
805 NTKERNELAPI
806 PVOID
807 NTAPI
808 ExEnterCriticalRegionAndAcquireResourceShared(
809 IN OUT PERESOURCE Resource);
810
811 NTKERNELAPI
812 PVOID
813 NTAPI
814 ExEnterCriticalRegionAndAcquireResourceExclusive(
815 IN OUT PERESOURCE Resource);
816
817 NTKERNELAPI
818 PVOID
819 NTAPI
820 ExEnterCriticalRegionAndAcquireSharedWaitForExclusive(
821 IN OUT PERESOURCE Resource);
822
823 NTKERNELAPI
824 VOID
825 FASTCALL
826 ExReleaseResourceAndLeaveCriticalRegion(
827 IN OUT PERESOURCE Resource);
828
829 NTKERNELAPI
830 VOID
831 NTAPI
832 ExInitializeRundownProtectionCacheAware(
833 OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware,
834 IN SIZE_T RunRefSize);
835
836 NTKERNELAPI
837 VOID
838 NTAPI
839 ExFreeCacheAwareRundownProtection(
840 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
841
842 NTKERNELAPI
843 BOOLEAN
844 FASTCALL
845 ExAcquireRundownProtectionCacheAware(
846 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
847
848 NTKERNELAPI
849 VOID
850 FASTCALL
851 ExReleaseRundownProtectionCacheAware(
852 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
853
854 NTKERNELAPI
855 BOOLEAN
856 FASTCALL
857 ExAcquireRundownProtectionCacheAwareEx(
858 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware,
859 IN ULONG Count);
860
861 NTKERNELAPI
862 VOID
863 FASTCALL
864 ExReleaseRundownProtectionCacheAwareEx(
865 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRef,
866 IN ULONG Count);
867
868 NTKERNELAPI
869 VOID
870 FASTCALL
871 ExWaitForRundownProtectionReleaseCacheAware(
872 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRef);
873
874 NTKERNELAPI
875 VOID
876 FASTCALL
877 ExReInitializeRundownProtectionCacheAware(
878 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
879
880 NTKERNELAPI
881 VOID
882 FASTCALL
883 ExRundownCompletedCacheAware(
884 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
885
886 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
887
888 #if (NTDDI_VERSION >= NTDDI_VISTA)
889
890 NTKERNELAPI
891 NTSTATUS
892 NTAPI
893 ExInitializeLookasideListEx(
894 OUT PLOOKASIDE_LIST_EX Lookaside,
895 IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL,
896 IN PFREE_FUNCTION_EX Free OPTIONAL,
897 IN POOL_TYPE PoolType,
898 IN ULONG Flags,
899 IN SIZE_T Size,
900 IN ULONG Tag,
901 IN USHORT Depth);
902
903 NTKERNELAPI
904 VOID
905 NTAPI
906 ExDeleteLookasideListEx(
907 IN OUT PLOOKASIDE_LIST_EX Lookaside);
908
909 NTKERNELAPI
910 VOID
911 NTAPI
912 ExFlushLookasideListEx(
913 IN OUT PLOOKASIDE_LIST_EX Lookaside);
914
915 FORCEINLINE
916 PVOID
917 ExAllocateFromLookasideListEx(
918 IN OUT PLOOKASIDE_LIST_EX Lookaside)
919 {
920 PVOID Entry;
921
922 Lookaside->L.TotalAllocates += 1;
923 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
924 if (Entry == NULL) {
925 Lookaside->L.AllocateMisses += 1;
926 Entry = (Lookaside->L.AllocateEx)(Lookaside->L.Type,
927 Lookaside->L.Size,
928 Lookaside->L.Tag,
929 Lookaside);
930 }
931 return Entry;
932 }
933
934 FORCEINLINE
935 VOID
936 ExFreeToLookasideListEx(
937 IN OUT PLOOKASIDE_LIST_EX Lookaside,
938 IN PVOID Entry)
939 {
940 Lookaside->L.TotalFrees += 1;
941 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
942 Lookaside->L.FreeMisses += 1;
943 (Lookaside->L.FreeEx)(Entry, Lookaside);
944 } else {
945 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
946 }
947 return;
948 }
949
950 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
951
952 #if (NTDDI_VERSION >= NTDDI_WIN7)
953
954 NTKERNELAPI
955 VOID
956 NTAPI
957 ExSetResourceOwnerPointerEx(
958 IN OUT PERESOURCE Resource,
959 IN PVOID OwnerPointer,
960 IN ULONG Flags);
961
962 #define FLAG_OWNER_POINTER_IS_THREAD 0x1
963
964 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
965
966 static __inline PVOID
967 ExAllocateFromNPagedLookasideList(
968 IN OUT PNPAGED_LOOKASIDE_LIST Lookaside)
969 {
970 PVOID Entry;
971
972 Lookaside->L.TotalAllocates++;
973 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
974 Entry = ExInterlockedPopEntrySList(&Lookaside->L.ListHead,
975 &Lookaside->Lock__ObsoleteButDoNotDelete);
976 #else
977 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
978 #endif
979 if (Entry == NULL) {
980 Lookaside->L.AllocateMisses++;
981 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
982 Lookaside->L.Size,
983 Lookaside->L.Tag);
984 }
985 return Entry;
986 }
987
988 static __inline VOID
989 ExFreeToNPagedLookasideList(
990 IN OUT PNPAGED_LOOKASIDE_LIST Lookaside,
991 IN PVOID Entry)
992 {
993 Lookaside->L.TotalFrees++;
994 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
995 Lookaside->L.FreeMisses++;
996 (Lookaside->L.Free)(Entry);
997 } else {
998 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
999 ExInterlockedPushEntrySList(&Lookaside->L.ListHead,
1000 (PSLIST_ENTRY)Entry,
1001 &Lookaside->Lock__ObsoleteButDoNotDelete);
1002 #else
1003 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
1004 #endif
1005 }
1006 }
1007
1008 $endif
1009