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