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