[DDK]
[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 typedef enum _INTERLOCKED_RESULT {
303 ResultNegative = RESULT_NEGATIVE,
304 ResultZero = RESULT_ZERO,
305 ResultPositive = RESULT_POSITIVE
306 } INTERLOCKED_RESULT;
307
308 #ifdef _X86_
309 NTKERNELAPI
310 INTERLOCKED_RESULT
311 FASTCALL
312 Exfi386InterlockedIncrementLong(
313 IN OUT LONG volatile *Addend);
314
315 NTKERNELAPI
316 INTERLOCKED_RESULT
317 FASTCALL
318 Exfi386InterlockedDecrementLong(
319 IN PLONG Addend);
320
321 NTKERNELAPI
322 ULONG
323 FASTCALL
324 Exfi386InterlockedExchangeUlong(
325 IN PULONG Target,
326 IN ULONG Value);
327 #endif
328
329 $endif (_NTDDK_)
330 $if (_NTIFS_)
331
332 #define ExDisableResourceBoost ExDisableResourceBoostLite
333
334 VOID
335 ExInitializePushLock (
336 OUT PEX_PUSH_LOCK PushLock);
337 $endif (_NTIFS_)
338
339 #if (NTDDI_VERSION >= NTDDI_WIN2K)
340 $if (_WDMDDK_)
341 NTKERNELAPI
342 VOID
343 FASTCALL
344 ExAcquireFastMutexUnsafe(
345 IN OUT PFAST_MUTEX FastMutex);
346
347 NTKERNELAPI
348 VOID
349 FASTCALL
350 ExReleaseFastMutexUnsafe(
351 IN OUT PFAST_MUTEX FastMutex);
352
353 NTKERNELAPI
354 BOOLEAN
355 NTAPI
356 ExAcquireResourceExclusiveLite(
357 IN OUT PERESOURCE Resource,
358 IN BOOLEAN Wait);
359
360 NTKERNELAPI
361 BOOLEAN
362 NTAPI
363 ExAcquireResourceSharedLite(
364 IN OUT PERESOURCE Resource,
365 IN BOOLEAN Wait);
366
367 NTKERNELAPI
368 BOOLEAN
369 NTAPI
370 ExAcquireSharedStarveExclusive(
371 IN OUT PERESOURCE Resource,
372 IN BOOLEAN Wait);
373
374 NTKERNELAPI
375 BOOLEAN
376 NTAPI
377 ExAcquireSharedWaitForExclusive(
378 IN OUT PERESOURCE Resource,
379 IN BOOLEAN Wait);
380
381 NTKERNELAPI
382 PVOID
383 NTAPI
384 ExAllocatePool(
385 IN POOL_TYPE PoolType,
386 IN SIZE_T NumberOfBytes);
387
388 NTKERNELAPI
389 PVOID
390 NTAPI
391 ExAllocatePoolWithQuota(
392 IN POOL_TYPE PoolType,
393 IN SIZE_T NumberOfBytes);
394
395 NTKERNELAPI
396 PVOID
397 NTAPI
398 ExAllocatePoolWithQuotaTag(
399 IN POOL_TYPE PoolType,
400 IN SIZE_T NumberOfBytes,
401 IN ULONG Tag);
402
403 #ifndef POOL_TAGGING
404 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
405 #endif
406
407 NTKERNELAPI
408 PVOID
409 NTAPI
410 ExAllocatePoolWithTag(
411 IN POOL_TYPE PoolType,
412 IN SIZE_T NumberOfBytes,
413 IN ULONG Tag);
414
415 #ifndef POOL_TAGGING
416 #define ExAllocatePoolWithTag(a,b,c) ExAllocatePool(a,b)
417 #endif
418
419 NTKERNELAPI
420 PVOID
421 NTAPI
422 ExAllocatePoolWithTagPriority(
423 IN POOL_TYPE PoolType,
424 IN SIZE_T NumberOfBytes,
425 IN ULONG Tag,
426 IN EX_POOL_PRIORITY Priority);
427
428 NTKERNELAPI
429 VOID
430 NTAPI
431 ExConvertExclusiveToSharedLite(
432 IN OUT PERESOURCE Resource);
433
434 NTKERNELAPI
435 NTSTATUS
436 NTAPI
437 ExCreateCallback(
438 OUT PCALLBACK_OBJECT *CallbackObject,
439 IN POBJECT_ATTRIBUTES ObjectAttributes,
440 IN BOOLEAN Create,
441 IN BOOLEAN AllowMultipleCallbacks);
442
443 NTKERNELAPI
444 VOID
445 NTAPI
446 ExDeleteNPagedLookasideList(
447 IN OUT PNPAGED_LOOKASIDE_LIST Lookaside);
448
449 NTKERNELAPI
450 VOID
451 NTAPI
452 ExDeletePagedLookasideList(
453 IN PPAGED_LOOKASIDE_LIST Lookaside);
454
455 NTKERNELAPI
456 NTSTATUS
457 NTAPI
458 ExDeleteResourceLite(
459 IN OUT PERESOURCE Resource);
460
461 NTKERNELAPI
462 VOID
463 NTAPI
464 ExFreePool(
465 IN PVOID P);
466
467 NTKERNELAPI
468 VOID
469 NTAPI
470 ExFreePoolWithTag(
471 IN PVOID P,
472 IN ULONG Tag);
473
474 NTKERNELAPI
475 ULONG
476 NTAPI
477 ExGetExclusiveWaiterCount(
478 IN PERESOURCE Resource);
479
480 NTKERNELAPI
481 KPROCESSOR_MODE
482 NTAPI
483 ExGetPreviousMode(VOID);
484
485 NTKERNELAPI
486 ULONG
487 NTAPI
488 ExGetSharedWaiterCount(
489 IN PERESOURCE Resource);
490
491 NTKERNELAPI
492 VOID
493 NTAPI
494 ExInitializeNPagedLookasideList(
495 IN PNPAGED_LOOKASIDE_LIST Lookaside,
496 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
497 IN PFREE_FUNCTION Free OPTIONAL,
498 IN ULONG Flags,
499 IN SIZE_T Size,
500 IN ULONG Tag,
501 IN USHORT Depth);
502
503 NTKERNELAPI
504 VOID
505 NTAPI
506 ExInitializePagedLookasideList(
507 IN PPAGED_LOOKASIDE_LIST Lookaside,
508 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
509 IN PFREE_FUNCTION Free OPTIONAL,
510 IN ULONG Flags,
511 IN SIZE_T Size,
512 IN ULONG Tag,
513 IN USHORT Depth);
514
515 NTKERNELAPI
516 NTSTATUS
517 NTAPI
518 ExInitializeResourceLite(
519 OUT PERESOURCE Resource);
520
521 NTKERNELAPI
522 LARGE_INTEGER
523 NTAPI
524 ExInterlockedAddLargeInteger(
525 IN PLARGE_INTEGER Addend,
526 IN LARGE_INTEGER Increment,
527 IN PKSPIN_LOCK Lock);
528
529 #if defined(_WIN64)
530 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
531 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
532 #else
533 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
534 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
535 #endif
536
537 NTKERNELAPI
538 ULONG
539 FASTCALL
540 ExInterlockedAddUlong(
541 IN PULONG Addend,
542 IN ULONG Increment,
543 IN OUT PKSPIN_LOCK Lock);
544
545 #if defined(_AMD64_) || defined(_IA64_)
546
547 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
548 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
549
550 #elif defined(_X86_)
551
552 NTKERNELAPI
553 LONGLONG
554 FASTCALL
555 ExfInterlockedCompareExchange64(
556 IN OUT LONGLONG volatile *Destination,
557 IN PLONGLONG Exchange,
558 IN PLONGLONG Comperand);
559
560 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
561 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
562
563 #else
564
565 NTKERNELAPI
566 LONGLONG
567 FASTCALL
568 ExInterlockedCompareExchange64(
569 IN OUT LONGLONG volatile *Destination,
570 IN PLONGLONG Exchange,
571 IN PLONGLONG Comparand,
572 IN PKSPIN_LOCK Lock);
573
574 #endif /* defined(_AMD64_) || defined(_IA64_) */
575
576 NTKERNELAPI
577 PLIST_ENTRY
578 FASTCALL
579 ExInterlockedInsertHeadList(
580 IN OUT PLIST_ENTRY ListHead,
581 IN OUT PLIST_ENTRY ListEntry,
582 IN OUT PKSPIN_LOCK Lock);
583
584 NTKERNELAPI
585 PLIST_ENTRY
586 FASTCALL
587 ExInterlockedInsertTailList(
588 IN OUT PLIST_ENTRY ListHead,
589 IN OUT PLIST_ENTRY ListEntry,
590 IN OUT PKSPIN_LOCK Lock);
591
592 NTKERNELAPI
593 PSINGLE_LIST_ENTRY
594 FASTCALL
595 ExInterlockedPopEntryList(
596 IN OUT PSINGLE_LIST_ENTRY ListHead,
597 IN OUT PKSPIN_LOCK Lock);
598
599 NTKERNELAPI
600 PSINGLE_LIST_ENTRY
601 FASTCALL
602 ExInterlockedPushEntryList(
603 IN OUT PSINGLE_LIST_ENTRY ListHead,
604 IN OUT PSINGLE_LIST_ENTRY ListEntry,
605 IN OUT PKSPIN_LOCK Lock);
606
607 NTKERNELAPI
608 PLIST_ENTRY
609 FASTCALL
610 ExInterlockedRemoveHeadList(
611 IN OUT PLIST_ENTRY ListHead,
612 IN OUT PKSPIN_LOCK Lock);
613
614 NTKERNELAPI
615 BOOLEAN
616 NTAPI
617 ExIsProcessorFeaturePresent(
618 IN ULONG ProcessorFeature);
619
620 NTKERNELAPI
621 BOOLEAN
622 NTAPI
623 ExIsResourceAcquiredExclusiveLite(
624 IN PERESOURCE Resource);
625
626 NTKERNELAPI
627 ULONG
628 NTAPI
629 ExIsResourceAcquiredSharedLite(
630 IN PERESOURCE Resource);
631
632 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
633
634 NTKERNELAPI
635 VOID
636 NTAPI
637 ExLocalTimeToSystemTime(
638 IN PLARGE_INTEGER LocalTime,
639 OUT PLARGE_INTEGER SystemTime);
640
641 NTKERNELAPI
642 VOID
643 NTAPI
644 ExNotifyCallback(
645 IN PCALLBACK_OBJECT CallbackObject,
646 IN PVOID Argument1 OPTIONAL,
647 IN PVOID Argument2 OPTIONAL);
648
649 NTKERNELAPI
650 VOID
651 NTAPI
652 ExQueueWorkItem(
653 IN OUT PWORK_QUEUE_ITEM WorkItem,
654 IN WORK_QUEUE_TYPE QueueType);
655
656 NTKERNELAPI
657 DECLSPEC_NORETURN
658 VOID
659 NTAPI
660 ExRaiseStatus(
661 IN NTSTATUS Status);
662
663 NTKERNELAPI
664 PVOID
665 NTAPI
666 ExRegisterCallback(
667 IN PCALLBACK_OBJECT CallbackObject,
668 IN PCALLBACK_FUNCTION CallbackFunction,
669 IN PVOID CallbackContext OPTIONAL);
670
671 NTKERNELAPI
672 NTSTATUS
673 NTAPI
674 ExReinitializeResourceLite(
675 IN OUT PERESOURCE Resource);
676
677 NTKERNELAPI
678 VOID
679 NTAPI
680 ExReleaseResourceForThreadLite(
681 IN OUT PERESOURCE Resource,
682 IN ERESOURCE_THREAD ResourceThreadId);
683
684 NTKERNELAPI
685 VOID
686 FASTCALL
687 ExReleaseResourceLite(
688 IN OUT PERESOURCE Resource);
689
690 NTKERNELAPI
691 VOID
692 NTAPI
693 ExSetResourceOwnerPointer(
694 IN OUT PERESOURCE Resource,
695 IN PVOID OwnerPointer);
696
697 NTKERNELAPI
698 ULONG
699 NTAPI
700 ExSetTimerResolution(
701 IN ULONG DesiredTime,
702 IN BOOLEAN SetResolution);
703
704 NTKERNELAPI
705 VOID
706 NTAPI
707 ExSystemTimeToLocalTime(
708 IN PLARGE_INTEGER SystemTime,
709 OUT PLARGE_INTEGER LocalTime);
710
711 NTKERNELAPI
712 VOID
713 NTAPI
714 ExUnregisterCallback(
715 IN OUT PVOID CbRegistration);
716
717 $endif (_WDMDDK_)
718 $if (_NTDDK_)
719 NTKERNELAPI
720 NTSTATUS
721 NTAPI
722 ExExtendZone(
723 IN OUT PZONE_HEADER Zone,
724 IN OUT PVOID Segment,
725 IN ULONG SegmentSize);
726
727 NTKERNELAPI
728 NTSTATUS
729 NTAPI
730 ExInitializeZone(
731 OUT PZONE_HEADER Zone,
732 IN ULONG BlockSize,
733 IN OUT PVOID InitialSegment,
734 IN ULONG InitialSegmentSize);
735
736 NTKERNELAPI
737 NTSTATUS
738 NTAPI
739 ExInterlockedExtendZone(
740 IN OUT PZONE_HEADER Zone,
741 IN OUT PVOID Segment,
742 IN ULONG SegmentSize,
743 IN OUT PKSPIN_LOCK Lock);
744
745 NTKERNELAPI
746 NTSTATUS
747 NTAPI
748 ExUuidCreate(
749 OUT UUID *Uuid);
750
751 NTKERNELAPI
752 DECLSPEC_NORETURN
753 VOID
754 NTAPI
755 ExRaiseAccessViolation(VOID);
756
757 NTKERNELAPI
758 DECLSPEC_NORETURN
759 VOID
760 NTAPI
761 ExRaiseDatatypeMisalignment(VOID);
762
763 $endif (_NTDDK_)
764 $if (_NTIFS_)
765
766 NTKERNELAPI
767 SIZE_T
768 NTAPI
769 ExQueryPoolBlockSize(
770 IN PVOID PoolBlock,
771 OUT PBOOLEAN QuotaCharged);
772
773 VOID
774 ExAdjustLookasideDepth(
775 VOID);
776
777 NTKERNELAPI
778 VOID
779 NTAPI
780 ExDisableResourceBoostLite(
781 IN PERESOURCE Resource);
782 $endif (_NTIFS_)
783 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
784
785 $if (_WDMDDK_ || _NTIFS_)
786 #if (NTDDI_VERSION >= NTDDI_WINXP)
787 $endif
788 $if (_WDMDDK_)
789
790 NTKERNELAPI
791 BOOLEAN
792 FASTCALL
793 ExAcquireRundownProtection(
794 IN OUT PEX_RUNDOWN_REF RunRef);
795
796 NTKERNELAPI
797 VOID
798 FASTCALL
799 ExInitializeRundownProtection(
800 OUT PEX_RUNDOWN_REF RunRef);
801
802 NTKERNELAPI
803 VOID
804 FASTCALL
805 ExReInitializeRundownProtection(
806 IN OUT PEX_RUNDOWN_REF RunRef);
807
808 NTKERNELAPI
809 VOID
810 FASTCALL
811 ExReleaseRundownProtection(
812 IN OUT PEX_RUNDOWN_REF RunRef);
813
814 NTKERNELAPI
815 VOID
816 FASTCALL
817 ExRundownCompleted(
818 OUT PEX_RUNDOWN_REF RunRef);
819
820 NTKERNELAPI
821 BOOLEAN
822 NTAPI
823 ExVerifySuite(
824 IN SUITE_TYPE SuiteType);
825
826 NTKERNELAPI
827 VOID
828 FASTCALL
829 ExWaitForRundownProtectionRelease(
830 IN OUT PEX_RUNDOWN_REF RunRef);
831 $endif (_WDMDDK_)
832 $if (_NTIFS_)
833
834 PSLIST_ENTRY
835 FASTCALL
836 InterlockedPushListSList(
837 IN OUT PSLIST_HEADER ListHead,
838 IN OUT PSLIST_ENTRY List,
839 IN OUT PSLIST_ENTRY ListEnd,
840 IN ULONG Count);
841 $endif (_NTIFS_)
842 $if (_WDMDDK_ || _NTIFS_)
843 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
844 $endif
845
846 $if (_WDMDDK_)
847 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
848
849 NTKERNELAPI
850 BOOLEAN
851 FASTCALL
852 ExAcquireRundownProtectionEx(
853 IN OUT PEX_RUNDOWN_REF RunRef,
854 IN ULONG Count);
855
856 NTKERNELAPI
857 VOID
858 FASTCALL
859 ExReleaseRundownProtectionEx(
860 IN OUT PEX_RUNDOWN_REF RunRef,
861 IN ULONG Count);
862
863 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
864
865 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
866
867 NTKERNELAPI
868 PEX_RUNDOWN_REF_CACHE_AWARE
869 NTAPI
870 ExAllocateCacheAwareRundownProtection(
871 IN POOL_TYPE PoolType,
872 IN ULONG PoolTag);
873
874 NTKERNELAPI
875 SIZE_T
876 NTAPI
877 ExSizeOfRundownProtectionCacheAware(VOID);
878
879 NTKERNELAPI
880 PVOID
881 NTAPI
882 ExEnterCriticalRegionAndAcquireResourceShared(
883 IN OUT PERESOURCE Resource);
884
885 NTKERNELAPI
886 PVOID
887 NTAPI
888 ExEnterCriticalRegionAndAcquireResourceExclusive(
889 IN OUT PERESOURCE Resource);
890
891 NTKERNELAPI
892 PVOID
893 NTAPI
894 ExEnterCriticalRegionAndAcquireSharedWaitForExclusive(
895 IN OUT PERESOURCE Resource);
896
897 NTKERNELAPI
898 VOID
899 FASTCALL
900 ExReleaseResourceAndLeaveCriticalRegion(
901 IN OUT PERESOURCE Resource);
902
903 NTKERNELAPI
904 VOID
905 NTAPI
906 ExInitializeRundownProtectionCacheAware(
907 OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware,
908 IN SIZE_T RunRefSize);
909
910 NTKERNELAPI
911 VOID
912 NTAPI
913 ExFreeCacheAwareRundownProtection(
914 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
915
916 NTKERNELAPI
917 BOOLEAN
918 FASTCALL
919 ExAcquireRundownProtectionCacheAware(
920 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
921
922 NTKERNELAPI
923 VOID
924 FASTCALL
925 ExReleaseRundownProtectionCacheAware(
926 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
927
928 NTKERNELAPI
929 BOOLEAN
930 FASTCALL
931 ExAcquireRundownProtectionCacheAwareEx(
932 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware,
933 IN ULONG Count);
934
935 NTKERNELAPI
936 VOID
937 FASTCALL
938 ExReleaseRundownProtectionCacheAwareEx(
939 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRef,
940 IN ULONG Count);
941
942 NTKERNELAPI
943 VOID
944 FASTCALL
945 ExWaitForRundownProtectionReleaseCacheAware(
946 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRef);
947
948 NTKERNELAPI
949 VOID
950 FASTCALL
951 ExReInitializeRundownProtectionCacheAware(
952 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
953
954 NTKERNELAPI
955 VOID
956 FASTCALL
957 ExRundownCompletedCacheAware(
958 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
959
960 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
961
962 #if (NTDDI_VERSION >= NTDDI_VISTA)
963
964 NTKERNELAPI
965 NTSTATUS
966 NTAPI
967 ExInitializeLookasideListEx(
968 OUT PLOOKASIDE_LIST_EX Lookaside,
969 IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL,
970 IN PFREE_FUNCTION_EX Free OPTIONAL,
971 IN POOL_TYPE PoolType,
972 IN ULONG Flags,
973 IN SIZE_T Size,
974 IN ULONG Tag,
975 IN USHORT Depth);
976
977 NTKERNELAPI
978 VOID
979 NTAPI
980 ExDeleteLookasideListEx(
981 IN OUT PLOOKASIDE_LIST_EX Lookaside);
982
983 NTKERNELAPI
984 VOID
985 NTAPI
986 ExFlushLookasideListEx(
987 IN OUT PLOOKASIDE_LIST_EX Lookaside);
988
989 FORCEINLINE
990 PVOID
991 ExAllocateFromLookasideListEx(
992 IN OUT PLOOKASIDE_LIST_EX Lookaside)
993 {
994 PVOID Entry;
995
996 Lookaside->L.TotalAllocates += 1;
997 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
998 if (Entry == NULL) {
999 Lookaside->L.AllocateMisses += 1;
1000 Entry = (Lookaside->L.AllocateEx)(Lookaside->L.Type,
1001 Lookaside->L.Size,
1002 Lookaside->L.Tag,
1003 Lookaside);
1004 }
1005 return Entry;
1006 }
1007
1008 FORCEINLINE
1009 VOID
1010 ExFreeToLookasideListEx(
1011 IN OUT PLOOKASIDE_LIST_EX Lookaside,
1012 IN PVOID Entry)
1013 {
1014 Lookaside->L.TotalFrees += 1;
1015 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
1016 Lookaside->L.FreeMisses += 1;
1017 (Lookaside->L.FreeEx)(Entry, Lookaside);
1018 } else {
1019 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
1020 }
1021 return;
1022 }
1023
1024 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
1025
1026 #if (NTDDI_VERSION >= NTDDI_WIN7)
1027
1028 NTKERNELAPI
1029 VOID
1030 NTAPI
1031 ExSetResourceOwnerPointerEx(
1032 IN OUT PERESOURCE Resource,
1033 IN PVOID OwnerPointer,
1034 IN ULONG Flags);
1035
1036 #define FLAG_OWNER_POINTER_IS_THREAD 0x1
1037
1038 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
1039
1040 static __inline PVOID
1041 ExAllocateFromNPagedLookasideList(
1042 IN OUT PNPAGED_LOOKASIDE_LIST Lookaside)
1043 {
1044 PVOID Entry;
1045
1046 Lookaside->L.TotalAllocates++;
1047 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
1048 Entry = ExInterlockedPopEntrySList(&Lookaside->L.ListHead,
1049 &Lookaside->Lock__ObsoleteButDoNotDelete);
1050 #else
1051 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
1052 #endif
1053 if (Entry == NULL) {
1054 Lookaside->L.AllocateMisses++;
1055 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
1056 Lookaside->L.Size,
1057 Lookaside->L.Tag);
1058 }
1059 return Entry;
1060 }
1061
1062 static __inline VOID
1063 ExFreeToNPagedLookasideList(
1064 IN OUT PNPAGED_LOOKASIDE_LIST Lookaside,
1065 IN PVOID Entry)
1066 {
1067 Lookaside->L.TotalFrees++;
1068 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
1069 Lookaside->L.FreeMisses++;
1070 (Lookaside->L.Free)(Entry);
1071 } else {
1072 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
1073 ExInterlockedPushEntrySList(&Lookaside->L.ListHead,
1074 (PSLIST_ENTRY)Entry,
1075 &Lookaside->Lock__ObsoleteButDoNotDelete);
1076 #else
1077 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
1078 #endif
1079 }
1080 }
1081
1082 $endif (_WDMDDK_)