- Fix intrinsics for MSVC -- just include intrin.h instead of duplicating the definit...
[reactos.git] / reactos / include / ddk / wdm.h
1 #ifndef _WDMDDK_
2 #define _WDMDDK_
3
4 //
5 // Dependencies
6 //
7 #define NT_INCLUDED
8 #include <excpt.h>
9 #include <ntdef.h>
10 #include <ntstatus.h>
11
12 #ifndef GUID_DEFINED
13 #include <guiddef.h>
14 #endif /* GUID_DEFINED */
15
16 #include "intrin.h"
17
18 #ifdef __cplusplus
19 extern "C" {
20 #endif
21
22 #define NTKERNELAPI DECLSPEC_IMPORT
23
24 #ifdef _WIN64
25 #define PORT_MAXIMUM_MESSAGE_LENGTH 512
26 #else
27 #define PORT_MAXIMUM_MESSAGE_LENGTH 256
28 #endif
29
30
31 /* Simple types */
32 typedef UCHAR KPROCESSOR_MODE;
33 typedef LONG KPRIORITY;
34 typedef PVOID PSECURITY_DESCRIPTOR;
35 typedef ULONG SECURITY_INFORMATION, *PSECURITY_INFORMATION;
36
37 /* Structures not exposed to drivers */
38 typedef struct _OBJECT_TYPE *POBJECT_TYPE;
39 typedef struct _HAL_DISPATCH_TABLE *PHAL_DISPATCH_TABLE;
40 typedef struct _HAL_PRIVATE_DISPATCH_TABLE *PHAL_PRIVATE_DISPATCH_TABLE;
41 typedef struct _DEVICE_HANDLER_OBJECT *PDEVICE_HANDLER_OBJECT;
42 typedef struct _BUS_HANDLER *PBUS_HANDLER;
43
44 typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT;
45 typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT;
46 typedef struct _ETHREAD *PETHREAD;
47 typedef struct _EPROCESS *PEPROCESS;
48 typedef struct _IO_TIMER *PIO_TIMER;
49 typedef struct _KINTERRUPT *PKINTERRUPT;
50 typedef struct _KPROCESS *PKPROCESS;
51 typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD;
52
53
54 typedef struct _CONTEXT *PCONTEXT;
55
56 //
57 // Resource list definitions
58 //
59 typedef int CM_RESOURCE_TYPE;
60
61 #define CmResourceTypeNull 0
62 #define CmResourceTypePort 1
63 #define CmResourceTypeInterrupt 2
64 #define CmResourceTypeMemory 3
65 #define CmResourceTypeDma 4
66 #define CmResourceTypeDeviceSpecific 5
67 #define CmResourceTypeBusNumber 6
68 #define CmResourceTypeNonArbitrated 128
69 #define CmResourceTypeConfigData 128
70 #define CmResourceTypeDevicePrivate 129
71 #define CmResourceTypePcCardConfig 130
72 #define CmResourceTypeMfCardConfig 131
73
74 typedef enum _INTERFACE_TYPE {
75 InterfaceTypeUndefined = -1,
76 Internal,
77 Isa,
78 Eisa,
79 MicroChannel,
80 TurboChannel,
81 PCIBus,
82 VMEBus,
83 NuBus,
84 PCMCIABus,
85 CBus,
86 MPIBus,
87 MPSABus,
88 ProcessorInternal,
89 InternalPowerBus,
90 PNPISABus,
91 PNPBus,
92 MaximumInterfaceType
93 } INTERFACE_TYPE, *PINTERFACE_TYPE;
94
95 /* IO_RESOURCE_DESCRIPTOR.Option */
96
97 #define IO_RESOURCE_PREFERRED 0x01
98 #define IO_RESOURCE_DEFAULT 0x02
99 #define IO_RESOURCE_ALTERNATIVE 0x08
100
101 typedef struct _IO_RESOURCE_DESCRIPTOR {
102 UCHAR Option;
103 UCHAR Type;
104 UCHAR ShareDisposition;
105 UCHAR Spare1;
106 USHORT Flags;
107 USHORT Spare2;
108 union {
109 struct {
110 ULONG Length;
111 ULONG Alignment;
112 PHYSICAL_ADDRESS MinimumAddress;
113 PHYSICAL_ADDRESS MaximumAddress;
114 } Port;
115 struct {
116 ULONG Length;
117 ULONG Alignment;
118 PHYSICAL_ADDRESS MinimumAddress;
119 PHYSICAL_ADDRESS MaximumAddress;
120 } Memory;
121 struct {
122 ULONG MinimumVector;
123 ULONG MaximumVector;
124 } Interrupt;
125 struct {
126 ULONG MinimumChannel;
127 ULONG MaximumChannel;
128 } Dma;
129 struct {
130 ULONG Length;
131 ULONG Alignment;
132 PHYSICAL_ADDRESS MinimumAddress;
133 PHYSICAL_ADDRESS MaximumAddress;
134 } Generic;
135 struct {
136 ULONG Data[3];
137 } DevicePrivate;
138 struct {
139 ULONG Length;
140 ULONG MinBusNumber;
141 ULONG MaxBusNumber;
142 ULONG Reserved;
143 } BusNumber;
144 struct {
145 ULONG Priority;
146 ULONG Reserved1;
147 ULONG Reserved2;
148 } ConfigData;
149 } u;
150 } IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
151
152 typedef struct _IO_RESOURCE_LIST {
153 USHORT Version;
154 USHORT Revision;
155 ULONG Count;
156 IO_RESOURCE_DESCRIPTOR Descriptors[1];
157 } IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;
158
159 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {
160 ULONG ListSize;
161 INTERFACE_TYPE InterfaceType;
162 ULONG BusNumber;
163 ULONG SlotNumber;
164 ULONG Reserved[3];
165 ULONG AlternativeLists;
166 IO_RESOURCE_LIST List[1];
167 } IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
168
169 //
170 // Global debug flag
171 //
172 extern ULONG NtGlobalFlag;
173
174
175 #include <pshpack4.h>
176 typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR {
177 UCHAR Type;
178 UCHAR ShareDisposition;
179 USHORT Flags;
180 union {
181 struct {
182 PHYSICAL_ADDRESS Start;
183 ULONG Length;
184 } Generic;
185 struct {
186 PHYSICAL_ADDRESS Start;
187 ULONG Length;
188 } Port;
189 struct {
190 ULONG Level;
191 ULONG Vector;
192 KAFFINITY Affinity;
193 } Interrupt;
194 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
195 struct {
196 union {
197 struct {
198 USHORT Reserved;
199 USHORT MessageCount;
200 ULONG Vector;
201 KAFFINITY Affinity;
202 } Raw;
203 struct {
204 ULONG Level;
205 ULONG Vector;
206 KAFFINITY Affinity;
207 } Translated;
208 };
209 } MessageInterrupt;
210 #endif
211 struct {
212 PHYSICAL_ADDRESS Start;
213 ULONG Length;
214 } Memory;
215 struct {
216 ULONG Channel;
217 ULONG Port;
218 ULONG Reserved1;
219 } Dma;
220 struct {
221 ULONG Data[3];
222 } DevicePrivate;
223 struct {
224 ULONG Start;
225 ULONG Length;
226 ULONG Reserved;
227 } BusNumber;
228 struct {
229 ULONG DataSize;
230 ULONG Reserved1;
231 ULONG Reserved2;
232 } DeviceSpecificData;
233 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
234 struct {
235 PHYSICAL_ADDRESS Start;
236 ULONG Length40;
237 } Memory40;
238 struct {
239 PHYSICAL_ADDRESS Start;
240 ULONG Length48;
241 } Memory48;
242 struct {
243 PHYSICAL_ADDRESS Start;
244 ULONG Length64;
245 } Memory64;
246 #endif
247 } u;
248 } CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;
249 #include <poppack.h>
250
251 //
252 // Section map options
253 //
254 typedef enum _SECTION_INHERIT {
255 ViewShare = 1,
256 ViewUnmap = 2
257 } SECTION_INHERIT;
258
259 //
260 // Section access rights
261 //
262 #define SECTION_QUERY 0x0001
263 #define SECTION_MAP_WRITE 0x0002
264 #define SECTION_MAP_READ 0x0004
265 #define SECTION_MAP_EXECUTE 0x0008
266 #define SECTION_EXTEND_SIZE 0x0010
267 #define SECTION_MAP_EXECUTE_EXPLICIT 0x0020
268
269 #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
270 SECTION_MAP_WRITE | \
271 SECTION_MAP_READ | \
272 SECTION_MAP_EXECUTE | \
273 SECTION_EXTEND_SIZE)
274
275 #define SESSION_QUERY_ACCESS 0x0001
276 #define SESSION_MODIFY_ACCESS 0x0002
277
278 #define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
279 SESSION_QUERY_ACCESS | \
280 SESSION_MODIFY_ACCESS)
281
282
283
284 #define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
285
286 #define PAGE_NOACCESS 0x01
287 #define PAGE_READONLY 0x02
288 #define PAGE_READWRITE 0x04
289 #define PAGE_WRITECOPY 0x08
290 #define PAGE_EXECUTE 0x10
291 #define PAGE_EXECUTE_READ 0x20
292 #define PAGE_EXECUTE_READWRITE 0x40
293 #define PAGE_EXECUTE_WRITECOPY 0x80
294 #define PAGE_GUARD 0x100
295 #define PAGE_NOCACHE 0x200
296 #define PAGE_WRITECOMBINE 0x400
297
298 #define MEM_COMMIT 0x1000
299 #define MEM_RESERVE 0x2000
300 #define MEM_DECOMMIT 0x4000
301 #define MEM_RELEASE 0x8000
302 #define MEM_FREE 0x10000
303 #define MEM_PRIVATE 0x20000
304 #define MEM_MAPPED 0x40000
305 #define MEM_RESET 0x80000
306 #define MEM_TOP_DOWN 0x100000
307 #define MEM_LARGE_PAGES 0x20000000
308 #define MEM_4MB_PAGES 0x80000000
309
310 #define SEC_RESERVE 0x4000000
311 #define SEC_LARGE_PAGES 0x80000000
312
313 #define PROCESS_DUP_HANDLE (0x0040)
314
315 #if (NTDDI_VERSION >= NTDDI_VISTA)
316 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
317 0xFFFF)
318 #else
319 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
320 0xFFF)
321 #endif
322
323
324
325 //
326 // Processor features
327 //
328 #define PF_FLOATING_POINT_PRECISION_ERRATA 0
329 #define PF_FLOATING_POINT_EMULATED 1
330 #define PF_COMPARE_EXCHANGE_DOUBLE 2
331 #define PF_MMX_INSTRUCTIONS_AVAILABLE 3
332 #define PF_PPC_MOVEMEM_64BIT_OK 4
333 #define PF_ALPHA_BYTE_INSTRUCTIONS 5
334 #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
335 #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
336 #define PF_RDTSC_INSTRUCTION_AVAILABLE 8
337 #define PF_PAE_ENABLED 9
338 #define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
339 #define PF_SSE_DAZ_MODE_AVAILABLE 11
340 #define PF_NX_ENABLED 12
341 #define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
342 #define PF_COMPARE_EXCHANGE128 14
343 #define PF_COMPARE64_EXCHANGE128 15
344 #define PF_CHANNELS_ENABLED 16
345
346
347
348 //
349 // Intrinsics (note: taken from our winnt.h)
350 // FIXME: 64-bit
351 //
352 #if defined(__GNUC__)
353
354 static __inline__ BOOLEAN
355 InterlockedBitTestAndSet(IN LONG volatile *Base,
356 IN LONG Bit)
357 {
358 #if defined(_M_IX86)
359 LONG OldBit;
360 __asm__ __volatile__("lock "
361 "btsl %2,%1\n\t"
362 "sbbl %0,%0\n\t"
363 :"=r" (OldBit),"+m" (*Base)
364 :"Ir" (Bit)
365 : "memory");
366 return OldBit;
367 #else
368 return (_InterlockedOr(Base, 1 << Bit) >> Bit) & 1;
369 #endif
370 }
371
372 static __inline__ BOOLEAN
373 InterlockedBitTestAndReset(IN LONG volatile *Base,
374 IN LONG Bit)
375 {
376 #if defined(_M_IX86)
377 LONG OldBit;
378 __asm__ __volatile__("lock "
379 "btrl %2,%1\n\t"
380 "sbbl %0,%0\n\t"
381 :"=r" (OldBit),"+m" (*Base)
382 :"Ir" (Bit)
383 : "memory");
384 return OldBit;
385 #else
386 return (_InterlockedAnd(Base, ~(1 << Bit)) >> Bit) & 1;
387 #endif
388 }
389
390 #endif
391
392 #define BitScanForward _BitScanForward
393 #define BitScanReverse _BitScanReverse
394
395 #define BitTest _bittest
396 #define BitTestAndComplement _bittestandcomplement
397 #define BitTestAndSet _bittestandset
398 #define BitTestAndReset _bittestandreset
399 #define InterlockedBitTestAndSet _interlockedbittestandset
400 #define InterlockedBitTestAndReset _interlockedbittestandreset
401
402
403 /** INTERLOCKED FUNCTIONS *****************************************************/
404
405 #if !defined(__INTERLOCKED_DECLARED)
406 #define __INTERLOCKED_DECLARED
407
408 #if defined (_X86_)
409 #if defined(NO_INTERLOCKED_INTRINSICS)
410 NTKERNELAPI
411 LONG
412 FASTCALL
413 InterlockedIncrement(
414 IN OUT LONG volatile *Addend);
415
416 NTKERNELAPI
417 LONG
418 FASTCALL
419 InterlockedDecrement(
420 IN OUT LONG volatile *Addend);
421
422 NTKERNELAPI
423 LONG
424 FASTCALL
425 InterlockedCompareExchange(
426 IN OUT LONG volatile *Destination,
427 IN LONG Exchange,
428 IN LONG Comparand);
429
430 NTKERNELAPI
431 LONG
432 FASTCALL
433 InterlockedExchange(
434 IN OUT LONG volatile *Destination,
435 IN LONG Value);
436
437 NTKERNELAPI
438 LONG
439 FASTCALL
440 InterlockedExchangeAdd(
441 IN OUT LONG volatile *Addend,
442 IN LONG Value);
443
444 #else // !defined(NO_INTERLOCKED_INTRINSICS)
445
446 #define InterlockedExchange _InterlockedExchange
447 #define InterlockedIncrement _InterlockedIncrement
448 #define InterlockedDecrement _InterlockedDecrement
449 #define InterlockedExchangeAdd _InterlockedExchangeAdd
450 #define InterlockedCompareExchange _InterlockedCompareExchange
451 #define InterlockedOr _InterlockedOr
452 #define InterlockedAnd _InterlockedAnd
453 #define InterlockedXor _InterlockedXor
454
455 #endif // !defined(NO_INTERLOCKED_INTRINSICS)
456
457 #endif // defined (_X86_)
458
459 #if !defined (_WIN64)
460 /*
461 * PVOID
462 * InterlockedExchangePointer(
463 * IN OUT PVOID volatile *Target,
464 * IN PVOID Value)
465 */
466 #define InterlockedExchangePointer(Target, Value) \
467 ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
468
469 /*
470 * PVOID
471 * InterlockedCompareExchangePointer(
472 * IN OUT PVOID *Destination,
473 * IN PVOID Exchange,
474 * IN PVOID Comparand)
475 */
476 #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
477 ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
478
479 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
480 #define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
481 #define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
482
483 #endif // !defined (_WIN64)
484
485 #if defined (_M_AMD64)
486
487 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONGLONG *)a, (LONGLONG)b)
488 #define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONGLONG *)a)
489 #define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONGLONG *)a)
490 #define InterlockedAnd _InterlockedAnd
491 #define InterlockedOr _InterlockedOr
492 #define InterlockedXor _InterlockedXor
493 #define InterlockedIncrement _InterlockedIncrement
494 #define InterlockedDecrement _InterlockedDecrement
495 #define InterlockedAdd _InterlockedAdd
496 #define InterlockedExchange _InterlockedExchange
497 #define InterlockedExchangeAdd _InterlockedExchangeAdd
498 #define InterlockedCompareExchange _InterlockedCompareExchange
499 #define InterlockedAnd64 _InterlockedAnd64
500 #define InterlockedOr64 _InterlockedOr64
501 #define InterlockedXor64 _InterlockedXor64
502 #define InterlockedIncrement64 _InterlockedIncrement64
503 #define InterlockedDecrement64 _InterlockedDecrement64
504 #define InterlockedAdd64 _InterlockedAdd64
505 #define InterlockedExchange64 _InterlockedExchange64
506 #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
507 #define InterlockedCompareExchange64 _InterlockedCompareExchange64
508 #define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
509 #define InterlockedExchangePointer _InterlockedExchangePointer
510 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
511 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
512
513 #endif // _M_AMD64
514
515 #if defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
516 //#if !defined(_X86AMD64_) // FIXME: what's _X86AMD64_ used for?
517 FORCEINLINE
518 LONG64
519 InterlockedAdd64(
520 IN OUT LONG64 volatile *Addend,
521 IN LONG64 Value)
522 {
523 return InterlockedExchangeAdd64(Addend, Value) + Value;
524 }
525 //#endif
526 #endif
527
528 #endif /* !__INTERLOCKED_DECLARED */
529
530 #if defined(_M_IX86)
531 #define YieldProcessor _mm_pause
532 #elif defined (_M_AMD64)
533 #define YieldProcessor _mm_pause
534 #elif defined(_M_PPC)
535 #define YieldProcessor() __asm__ __volatile__("nop");
536 #elif defined(_M_MIPS)
537 #define YieldProcessor() __asm__ __volatile__("nop");
538 #elif defined(_M_ARM)
539 #define YieldProcessor()
540 #else
541 #error Unknown architecture
542 #endif
543
544
545
546 //
547 // Slist Header
548 //
549 #ifndef _SLIST_HEADER_
550 #define _SLIST_HEADER_
551
552 #define SLIST_ENTRY SINGLE_LIST_ENTRY
553 #define _SLIST_ENTRY _SINGLE_LIST_ENTRY
554 #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
555
556 #if defined(_WIN64)
557 typedef union _SLIST_HEADER {
558 struct {
559 ULONGLONG Alignment;
560 ULONGLONG Region;
561 } DUMMYSTRUCTNAME;
562 struct {
563 ULONGLONG Depth:16;
564 ULONGLONG Sequence:9;
565 ULONGLONG NextEntry:39;
566 ULONGLONG HeaderType:1;
567 ULONGLONG Init:1;
568 ULONGLONG Reserved:59;
569 ULONGLONG Region:3;
570 } Header8;
571 struct {
572 ULONGLONG Depth:16;
573 ULONGLONG Sequence:48;
574 ULONGLONG HeaderType:1;
575 ULONGLONG Init:1;
576 ULONGLONG Reserved:2;
577 ULONGLONG NextEntry:60;
578 } Header16;
579 } SLIST_HEADER, *PSLIST_HEADER;
580 #else
581 typedef union _SLIST_HEADER {
582 ULONGLONG Alignment;
583 struct {
584 SLIST_ENTRY Next;
585 USHORT Depth;
586 USHORT Sequence;
587 } DUMMYSTRUCTNAME;
588 } SLIST_HEADER, *PSLIST_HEADER;
589 #endif
590
591 #endif /* _SLIST_HEADER_ */
592
593
594
595 //
596 // Power States/Levels
597 //
598 typedef enum _SYSTEM_POWER_STATE {
599 PowerSystemUnspecified,
600 PowerSystemWorking,
601 PowerSystemSleeping1,
602 PowerSystemSleeping2,
603 PowerSystemSleeping3,
604 PowerSystemHibernate,
605 PowerSystemShutdown,
606 PowerSystemMaximum
607 } SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE;
608
609 #define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
610
611 typedef enum _POWER_INFORMATION_LEVEL {
612 SystemPowerPolicyAc,
613 SystemPowerPolicyDc,
614 VerifySystemPolicyAc,
615 VerifySystemPolicyDc,
616 SystemPowerCapabilities,
617 SystemBatteryState,
618 SystemPowerStateHandler,
619 ProcessorStateHandler,
620 SystemPowerPolicyCurrent,
621 AdministratorPowerPolicy,
622 SystemReserveHiberFile,
623 ProcessorInformation,
624 SystemPowerInformation,
625 ProcessorStateHandler2,
626 LastWakeTime,
627 LastSleepTime,
628 SystemExecutionState,
629 SystemPowerStateNotifyHandler,
630 ProcessorPowerPolicyAc,
631 ProcessorPowerPolicyDc,
632 VerifyProcessorPowerPolicyAc,
633 VerifyProcessorPowerPolicyDc,
634 ProcessorPowerPolicyCurrent
635 } POWER_INFORMATION_LEVEL;
636
637 typedef enum {
638 PowerActionNone,
639 PowerActionReserved,
640 PowerActionSleep,
641 PowerActionHibernate,
642 PowerActionShutdown,
643 PowerActionShutdownReset,
644 PowerActionShutdownOff,
645 PowerActionWarmEject
646 } POWER_ACTION, *PPOWER_ACTION;
647
648 typedef enum _DEVICE_POWER_STATE {
649 PowerDeviceUnspecified,
650 PowerDeviceD0,
651 PowerDeviceD1,
652 PowerDeviceD2,
653 PowerDeviceD3,
654 PowerDeviceMaximum
655 } DEVICE_POWER_STATE, *PDEVICE_POWER_STATE;
656
657 #define ES_SYSTEM_REQUIRED 0x00000001
658 #define ES_DISPLAY_REQUIRED 0x00000002
659 #define ES_USER_PRESENT 0x00000004
660 #define ES_CONTINUOUS 0x80000000
661
662 typedef ULONG EXECUTION_STATE;
663
664 typedef enum {
665 LT_DONT_CARE,
666 LT_LOWEST_LATENCY
667 } LATENCY_TIME;
668
669
670
671 //
672 // Access/Security Stuff
673 //
674 typedef ULONG ACCESS_MASK, *PACCESS_MASK;
675 typedef PVOID PACCESS_TOKEN;
676
677 #define DELETE 0x00010000L
678 #define READ_CONTROL 0x00020000L
679 #define WRITE_DAC 0x00040000L
680 #define WRITE_OWNER 0x00080000L
681 #define SYNCHRONIZE 0x00100000L
682 #define STANDARD_RIGHTS_REQUIRED 0x000F0000L
683 #define STANDARD_RIGHTS_READ READ_CONTROL
684 #define STANDARD_RIGHTS_WRITE READ_CONTROL
685 #define STANDARD_RIGHTS_EXECUTE READ_CONTROL
686 #define STANDARD_RIGHTS_ALL 0x001F0000L
687 #define SPECIFIC_RIGHTS_ALL 0x0000FFFFL
688 #define ACCESS_SYSTEM_SECURITY 0x01000000L
689 #define MAXIMUM_ALLOWED 0x02000000L
690 #define GENERIC_READ 0x80000000L
691 #define GENERIC_WRITE 0x40000000L
692 #define GENERIC_EXECUTE 0x20000000L
693 #define GENERIC_ALL 0x10000000L
694
695 typedef struct _GENERIC_MAPPING {
696 ACCESS_MASK GenericRead;
697 ACCESS_MASK GenericWrite;
698 ACCESS_MASK GenericExecute;
699 ACCESS_MASK GenericAll;
700 } GENERIC_MAPPING, *PGENERIC_MAPPING;
701
702 #define ACL_REVISION 2
703 #define ACL_REVISION_DS 4
704
705 #define ACL_REVISION1 1
706 #define ACL_REVISION2 2
707 #define ACL_REVISION3 3
708 #define ACL_REVISION4 4
709 #define MIN_ACL_REVISION ACL_REVISION2
710 #define MAX_ACL_REVISION ACL_REVISION4
711
712 typedef struct _ACL {
713 UCHAR AclRevision;
714 UCHAR Sbz1;
715 USHORT AclSize;
716 USHORT AceCount;
717 USHORT Sbz2;
718 } ACL, *PACL;
719
720
721
722 //
723 // Current security descriptor revision value
724 //
725 #define SECURITY_DESCRIPTOR_REVISION (1)
726 #define SECURITY_DESCRIPTOR_REVISION1 (1)
727
728 //
729 // Privilege attributes
730 //
731 #define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
732 #define SE_PRIVILEGE_ENABLED (0x00000002L)
733 #define SE_PRIVILEGE_REMOVED (0X00000004L)
734 #define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
735
736 #define SE_PRIVILEGE_VALID_ATTRIBUTES (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
737 SE_PRIVILEGE_ENABLED | \
738 SE_PRIVILEGE_REMOVED | \
739 SE_PRIVILEGE_USED_FOR_ACCESS)
740
741 #include <pshpack4.h>
742 typedef struct _LUID_AND_ATTRIBUTES {
743 LUID Luid;
744 ULONG Attributes;
745 } LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES;
746 #include <poppack.h>
747 typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
748 typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY;
749
750
751
752 //
753 // Privilege sets
754 //
755 #define PRIVILEGE_SET_ALL_NECESSARY (1)
756
757 typedef struct _PRIVILEGE_SET {
758 ULONG PrivilegeCount;
759 ULONG Control;
760 LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
761 } PRIVILEGE_SET,*PPRIVILEGE_SET;
762
763 typedef enum _SECURITY_IMPERSONATION_LEVEL {
764 SecurityAnonymous,
765 SecurityIdentification,
766 SecurityImpersonation,
767 SecurityDelegation
768 } SECURITY_IMPERSONATION_LEVEL, * PSECURITY_IMPERSONATION_LEVEL;
769
770 #define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
771 #define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
772 #define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
773 #define VALID_IMPERSONATION_LEVEL(Level) (((Level) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((Level) <= SECURITY_MAX_IMPERSONATION_LEVEL))
774
775 #define SECURITY_DYNAMIC_TRACKING (TRUE)
776 #define SECURITY_STATIC_TRACKING (FALSE)
777
778 typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE, *PSECURITY_CONTEXT_TRACKING_MODE;
779
780 typedef struct _SECURITY_QUALITY_OF_SERVICE {
781 ULONG Length;
782 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
783 SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
784 BOOLEAN EffectiveOnly;
785 } SECURITY_QUALITY_OF_SERVICE, *PSECURITY_QUALITY_OF_SERVICE;
786
787 typedef struct _SE_IMPERSONATION_STATE {
788 PACCESS_TOKEN Token;
789 BOOLEAN CopyOnOpen;
790 BOOLEAN EffectiveOnly;
791 SECURITY_IMPERSONATION_LEVEL Level;
792 } SE_IMPERSONATION_STATE, *PSE_IMPERSONATION_STATE;
793
794 #define OWNER_SECURITY_INFORMATION (0x00000001L)
795 #define GROUP_SECURITY_INFORMATION (0x00000002L)
796 #define DACL_SECURITY_INFORMATION (0x00000004L)
797 #define SACL_SECURITY_INFORMATION (0x00000008L)
798 #define LABEL_SECURITY_INFORMATION (0x00000010L)
799
800 #define PROTECTED_DACL_SECURITY_INFORMATION (0x80000000L)
801 #define PROTECTED_SACL_SECURITY_INFORMATION (0x40000000L)
802 #define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L)
803 #define UNPROTECTED_SACL_SECURITY_INFORMATION (0x10000000L)
804
805
806
807 //
808 // Registry Access Rights
809 //
810 #define KEY_QUERY_VALUE (0x0001)
811 #define KEY_SET_VALUE (0x0002)
812 #define KEY_CREATE_SUB_KEY (0x0004)
813 #define KEY_ENUMERATE_SUB_KEYS (0x0008)
814 #define KEY_NOTIFY (0x0010)
815 #define KEY_CREATE_LINK (0x0020)
816 #define KEY_WOW64_32KEY (0x0200)
817 #define KEY_WOW64_64KEY (0x0100)
818 #define KEY_WOW64_RES (0x0300)
819
820 #define KEY_READ ((STANDARD_RIGHTS_READ |\
821 KEY_QUERY_VALUE |\
822 KEY_ENUMERATE_SUB_KEYS |\
823 KEY_NOTIFY) \
824 & \
825 (~SYNCHRONIZE))
826
827 #define KEY_WRITE ((STANDARD_RIGHTS_WRITE |\
828 KEY_SET_VALUE |\
829 KEY_CREATE_SUB_KEY) \
830 & \
831 (~SYNCHRONIZE))
832
833 #define KEY_EXECUTE ((KEY_READ) \
834 & \
835 (~SYNCHRONIZE))
836
837 #define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL |\
838 KEY_QUERY_VALUE |\
839 KEY_SET_VALUE |\
840 KEY_CREATE_SUB_KEY |\
841 KEY_ENUMERATE_SUB_KEYS |\
842 KEY_NOTIFY |\
843 KEY_CREATE_LINK) \
844 & \
845 (~SYNCHRONIZE))
846
847 //
848 // Registry Open/Create Options
849 //
850 #define REG_OPTION_RESERVED (0x00000000L)
851 #define REG_OPTION_NON_VOLATILE (0x00000000L)
852 #define REG_OPTION_VOLATILE (0x00000001L)
853 #define REG_OPTION_CREATE_LINK (0x00000002L)
854 #define REG_OPTION_BACKUP_RESTORE (0x00000004L)
855 #define REG_OPTION_OPEN_LINK (0x00000008L)
856
857 #define REG_LEGAL_OPTION \
858 (REG_OPTION_RESERVED |\
859 REG_OPTION_NON_VOLATILE |\
860 REG_OPTION_VOLATILE |\
861 REG_OPTION_CREATE_LINK |\
862 REG_OPTION_BACKUP_RESTORE |\
863 REG_OPTION_OPEN_LINK)
864
865 //
866 // Key creation/open disposition
867 //
868 #define REG_CREATED_NEW_KEY (0x00000001L)
869 #define REG_OPENED_EXISTING_KEY (0x00000002L)
870
871 //
872 // Key restore & hive load flags
873 //
874 #define REG_WHOLE_HIVE_VOLATILE (0x00000001L)
875 #define REG_REFRESH_HIVE (0x00000002L)
876 #define REG_NO_LAZY_FLUSH (0x00000004L)
877 #define REG_FORCE_RESTORE (0x00000008L)
878 #define REG_APP_HIVE (0x00000010L)
879 #define REG_PROCESS_PRIVATE (0x00000020L)
880 #define REG_START_JOURNAL (0x00000040L)
881 #define REG_HIVE_EXACT_FILE_GROWTH (0x00000080L)
882 #define REG_HIVE_NO_RM (0x00000100L)
883 #define REG_HIVE_SINGLE_LOG (0x00000200L)
884
885 //
886 // Unload Flags
887 //
888 #define REG_FORCE_UNLOAD 1
889
890 //
891 // Notify Filter Values
892 //
893 #define REG_NOTIFY_CHANGE_NAME (0x00000001L)
894 #define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L)
895 #define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L)
896 #define REG_NOTIFY_CHANGE_SECURITY (0x00000008L)
897
898 #define REG_LEGAL_CHANGE_FILTER \
899 (REG_NOTIFY_CHANGE_NAME |\
900 REG_NOTIFY_CHANGE_ATTRIBUTES |\
901 REG_NOTIFY_CHANGE_LAST_SET |\
902 REG_NOTIFY_CHANGE_SECURITY)
903
904
905
906 //
907 // Thread Access Rights
908 //
909 #define THREAD_TERMINATE (0x0001)
910 #define THREAD_SUSPEND_RESUME (0x0002)
911 #define THREAD_ALERT (0x0004)
912 #define THREAD_GET_CONTEXT (0x0008)
913 #define THREAD_SET_CONTEXT (0x0010)
914 #define THREAD_SET_INFORMATION (0x0020)
915 #define THREAD_SET_LIMITED_INFORMATION (0x0400)
916 #define THREAD_QUERY_LIMITED_INFORMATION (0x0800)
917 #if (NTDDI_VERSION >= NTDDI_VISTA)
918 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
919 0xFFFF)
920 #else
921 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
922 0x3FF)
923 #endif
924
925 //
926 // Service Start Types
927 //
928 #define SERVICE_BOOT_START 0x00000000
929 #define SERVICE_SYSTEM_START 0x00000001
930 #define SERVICE_AUTO_START 0x00000002
931 #define SERVICE_DEMAND_START 0x00000003
932 #define SERVICE_DISABLED 0x00000004
933
934 //
935 // Exception Records
936 //
937 #define EXCEPTION_NONCONTINUABLE 1
938 #define EXCEPTION_MAXIMUM_PARAMETERS 15
939
940 typedef struct _EXCEPTION_RECORD {
941 NTSTATUS ExceptionCode;
942 ULONG ExceptionFlags;
943 struct _EXCEPTION_RECORD *ExceptionRecord;
944 PVOID ExceptionAddress;
945 ULONG NumberParameters;
946 ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
947 } EXCEPTION_RECORD, *PEXCEPTION_RECORD;
948
949 typedef struct _EXCEPTION_RECORD32 {
950 NTSTATUS ExceptionCode;
951 ULONG ExceptionFlags;
952 ULONG ExceptionRecord;
953 ULONG ExceptionAddress;
954 ULONG NumberParameters;
955 ULONG ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
956 } EXCEPTION_RECORD32, *PEXCEPTION_RECORD32;
957
958 typedef struct _EXCEPTION_RECORD64 {
959 NTSTATUS ExceptionCode;
960 ULONG ExceptionFlags;
961 ULONG64 ExceptionRecord;
962 ULONG64 ExceptionAddress;
963 ULONG NumberParameters;
964 ULONG __unusedAlignment;
965 ULONG64 ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
966 } EXCEPTION_RECORD64, *PEXCEPTION_RECORD64;
967
968 typedef struct _EXCEPTION_POINTERS {
969 PEXCEPTION_RECORD ExceptionRecord;
970 PCONTEXT ContextRecord;
971 } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
972
973
974
975 //
976 // Process Qoutas
977 //
978 typedef struct _QUOTA_LIMITS {
979 SIZE_T PagedPoolLimit;
980 SIZE_T NonPagedPoolLimit;
981 SIZE_T MinimumWorkingSetSize;
982 SIZE_T MaximumWorkingSetSize;
983 SIZE_T PagefileLimit;
984 LARGE_INTEGER TimeLimit;
985 } QUOTA_LIMITS, *PQUOTA_LIMITS;
986
987 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
988 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
989 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
990 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
991 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
992
993
994 /******************************************************************************
995 * WINBASE Functions *
996 ******************************************************************************/
997 #if !defined(_WINBASE_)
998
999 #if defined(_WIN64)
1000
1001 #define InterlockedPopEntrySList(Head) \
1002 ExpInterlockedPopEntrySList(Head)
1003
1004 #define InterlockedPushEntrySList(Head, Entry) \
1005 ExpInterlockedPushEntrySList(Head, Entry)
1006
1007 #define InterlockedFlushSList(Head) \
1008 ExpInterlockedFlushSList(Head)
1009
1010 #define QueryDepthSList(Head) \
1011 ExQueryDepthSList(Head)
1012
1013 #else // !defined(_WIN64)
1014
1015 NTKERNELAPI
1016 PSLIST_ENTRY
1017 FASTCALL
1018 InterlockedPopEntrySList(
1019 IN PSLIST_HEADER ListHead);
1020
1021 NTKERNELAPI
1022 PSLIST_ENTRY
1023 FASTCALL
1024 InterlockedPushEntrySList(
1025 IN PSLIST_HEADER ListHead,
1026 IN PSLIST_ENTRY ListEntry);
1027
1028 #define InterlockedFlushSList(ListHead) \
1029 ExInterlockedFlushSList(ListHead)
1030
1031 #define QueryDepthSList(Head) \
1032 ExQueryDepthSList(Head)
1033
1034 #endif // !defined(_WIN64)
1035
1036 #endif // !defined(_WINBASE_)
1037
1038
1039 /******************************************************************************
1040 * Kernel Types *
1041 ******************************************************************************/
1042
1043 typedef struct _DISPATCHER_HEADER
1044 {
1045 union
1046 {
1047 struct
1048 {
1049 UCHAR Type;
1050 union
1051 {
1052 UCHAR Absolute;
1053 UCHAR NpxIrql;
1054 };
1055 union
1056 {
1057 UCHAR Size;
1058 UCHAR Hand;
1059 };
1060 union
1061 {
1062 UCHAR Inserted;
1063 BOOLEAN DebugActive;
1064 };
1065 };
1066 volatile LONG Lock;
1067 };
1068 LONG SignalState;
1069 LIST_ENTRY WaitListHead;
1070 } DISPATCHER_HEADER, *PDISPATCHER_HEADER;
1071
1072 typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK;
1073
1074 typedef struct _KEVENT {
1075 DISPATCHER_HEADER Header;
1076 } KEVENT, *PKEVENT, *RESTRICTED_POINTER PRKEVENT;
1077
1078 typedef struct _KSEMAPHORE {
1079 DISPATCHER_HEADER Header;
1080 LONG Limit;
1081 } KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE;
1082
1083 /******************************************************************************
1084 * RTL Types *
1085 ******************************************************************************/
1086
1087 #define RTL_REGISTRY_ABSOLUTE 0
1088 #define RTL_REGISTRY_SERVICES 1
1089 #define RTL_REGISTRY_CONTROL 2
1090 #define RTL_REGISTRY_WINDOWS_NT 3
1091 #define RTL_REGISTRY_DEVICEMAP 4
1092 #define RTL_REGISTRY_USER 5
1093 #define RTL_REGISTRY_MAXIMUM 6
1094 #define RTL_REGISTRY_HANDLE 0x40000000
1095 #define RTL_REGISTRY_OPTIONAL 0x80000000
1096
1097 /* RTL_QUERY_REGISTRY_TABLE.Flags */
1098 #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001
1099 #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002
1100 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004
1101 #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008
1102 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010
1103 #define RTL_QUERY_REGISTRY_DIRECT 0x00000020
1104 #define RTL_QUERY_REGISTRY_DELETE 0x00000040
1105
1106 typedef struct _RTL_BITMAP {
1107 ULONG SizeOfBitMap;
1108 PULONG Buffer;
1109 } RTL_BITMAP, *PRTL_BITMAP;
1110
1111 typedef struct _RTL_BITMAP_RUN {
1112 ULONG StartingIndex;
1113 ULONG NumberOfBits;
1114 } RTL_BITMAP_RUN, *PRTL_BITMAP_RUN;
1115
1116 typedef NTSTATUS
1117 (DDKAPI *PRTL_QUERY_REGISTRY_ROUTINE)(
1118 IN PWSTR ValueName,
1119 IN ULONG ValueType,
1120 IN PVOID ValueData,
1121 IN ULONG ValueLength,
1122 IN PVOID Context,
1123 IN PVOID EntryContext);
1124
1125 typedef struct _RTL_QUERY_REGISTRY_TABLE {
1126 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine;
1127 ULONG Flags;
1128 PCWSTR Name;
1129 PVOID EntryContext;
1130 ULONG DefaultType;
1131 PVOID DefaultData;
1132 ULONG DefaultLength;
1133 } RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE;
1134
1135 typedef struct _TIME_FIELDS {
1136 CSHORT Year;
1137 CSHORT Month;
1138 CSHORT Day;
1139 CSHORT Hour;
1140 CSHORT Minute;
1141 CSHORT Second;
1142 CSHORT Milliseconds;
1143 CSHORT Weekday;
1144 } TIME_FIELDS, *PTIME_FIELDS;
1145
1146
1147 /******************************************************************************
1148 * RTL Functions *
1149 ******************************************************************************/
1150
1151 NTSYSAPI
1152 VOID
1153 NTAPI
1154 RtlAssert(
1155 IN PVOID FailedAssertion,
1156 IN PVOID FileName,
1157 IN ULONG LineNumber,
1158 IN PCHAR Message);
1159
1160 /* VOID
1161 * RtlCopyMemory(
1162 * IN VOID UNALIGNED *Destination,
1163 * IN CONST VOID UNALIGNED *Source,
1164 * IN SIZE_T Length)
1165 */
1166 #define RtlCopyMemory(Destination, Source, Length) \
1167 memcpy(Destination, Source, Length)
1168
1169 #define RtlCopyBytes RtlCopyMemory
1170
1171 #if defined(_M_AMD64)
1172 NTSYSAPI
1173 VOID
1174 NTAPI
1175 RtlCopyMemoryNonTemporal(
1176 VOID UNALIGNED *Destination,
1177 CONST VOID UNALIGNED *Source,
1178 SIZE_T Length);
1179 #else
1180 #define RtlCopyMemoryNonTemporal RtlCopyMemory
1181 #endif
1182
1183 /* BOOLEAN
1184 * RtlEqualLuid(
1185 * IN PLUID Luid1,
1186 * IN PLUID Luid2)
1187 */
1188 #define RtlEqualLuid(Luid1, Luid2) \
1189 (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
1190
1191 /* ULONG
1192 * RtlEqualMemory(
1193 * IN VOID UNALIGNED *Destination,
1194 * IN CONST VOID UNALIGNED *Source,
1195 * IN SIZE_T Length)
1196 */
1197 #define RtlEqualMemory(Destination, Source, Length) \
1198 (!memcmp(Destination, Source, Length))
1199
1200 /* VOID
1201 * RtlFillMemory(
1202 * IN VOID UNALIGNED *Destination,
1203 * IN SIZE_T Length,
1204 * IN UCHAR Fill)
1205 */
1206 #define RtlFillMemory(Destination, Length, Fill) \
1207 memset(Destination, Fill, Length)
1208
1209 #define RtlFillBytes RtlFillMemory
1210
1211 NTSYSAPI
1212 VOID
1213 NTAPI
1214 RtlFreeUnicodeString(
1215 IN PUNICODE_STRING UnicodeString);
1216
1217 NTSYSAPI
1218 NTSTATUS
1219 NTAPI
1220 RtlGUIDFromString(
1221 IN PUNICODE_STRING GuidString,
1222 OUT GUID *Guid);
1223
1224 NTSYSAPI
1225 VOID
1226 NTAPI
1227 RtlInitUnicodeString(
1228 IN OUT PUNICODE_STRING DestinationString,
1229 IN PCWSTR SourceString);
1230
1231 /* VOID
1232 * RtlMoveMemory(
1233 * IN VOID UNALIGNED *Destination,
1234 * IN CONST VOID UNALIGNED *Source,
1235 * IN SIZE_T Length)
1236 */
1237 #define RtlMoveMemory(Destination, Source, Length) \
1238 memmove(Destination, Source, Length)
1239
1240 NTSYSAPI
1241 NTSTATUS
1242 NTAPI
1243 RtlStringFromGUID(
1244 IN REFGUID Guid,
1245 OUT PUNICODE_STRING GuidString);
1246
1247 /* VOID
1248 * RtlZeroMemory(
1249 * IN VOID UNALIGNED *Destination,
1250 * IN SIZE_T Length)
1251 */
1252 #define RtlZeroMemory(Destination, Length) \
1253 memset(Destination, 0, Length)
1254
1255 #define RtlZeroBytes RtlZeroMemory
1256
1257
1258 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1259 NTSYSAPI
1260 BOOLEAN
1261 NTAPI
1262 RtlAreBitsClear(
1263 IN PRTL_BITMAP BitMapHeader,
1264 IN ULONG StartingIndex,
1265 IN ULONG Length);
1266
1267 NTSYSAPI
1268 BOOLEAN
1269 NTAPI
1270 RtlAreBitsSet(
1271 IN PRTL_BITMAP BitMapHeader,
1272 IN ULONG StartingIndex,
1273 IN ULONG Length);
1274
1275 NTSYSAPI
1276 NTSTATUS
1277 NTAPI
1278 RtlAnsiStringToUnicodeString(
1279 IN OUT PUNICODE_STRING DestinationString,
1280 IN PANSI_STRING SourceString,
1281 IN BOOLEAN AllocateDestinationString);
1282
1283 NTSYSAPI
1284 ULONG
1285 NTAPI
1286 RtlxAnsiStringToUnicodeSize(
1287 IN PCANSI_STRING AnsiString);
1288
1289 #define RtlAnsiStringToUnicodeSize(String) ( \
1290 NLS_MB_CODE_PAGE_TAG ? \
1291 RtlxAnsiStringToUnicodeSize(String) : \
1292 ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
1293 )
1294
1295 NTSYSAPI
1296 NTSTATUS
1297 NTAPI
1298 RtlAppendUnicodeStringToString(
1299 IN OUT PUNICODE_STRING Destination,
1300 IN PCUNICODE_STRING Source);
1301
1302 NTSYSAPI
1303 NTSTATUS
1304 NTAPI
1305 RtlAppendUnicodeToString(
1306 IN OUT PUNICODE_STRING Destination,
1307 IN PCWSTR Source);
1308
1309 NTSYSAPI
1310 NTSTATUS
1311 NTAPI
1312 RtlCheckRegistryKey(
1313 IN ULONG RelativeTo,
1314 IN PWSTR Path);
1315
1316 NTSYSAPI
1317 VOID
1318 NTAPI
1319 RtlClearAllBits(
1320 IN PRTL_BITMAP BitMapHeader);
1321
1322 NTSYSAPI
1323 VOID
1324 NTAPI
1325 RtlClearBits(
1326 IN PRTL_BITMAP BitMapHeader,
1327 IN ULONG StartingIndex,
1328 IN ULONG NumberToClear);
1329
1330 NTSYSAPI
1331 SIZE_T
1332 NTAPI
1333 RtlCompareMemory(
1334 IN CONST VOID *Source1,
1335 IN CONST VOID *Source2,
1336 IN SIZE_T Length);
1337
1338 NTSYSAPI
1339 LONG
1340 NTAPI
1341 RtlCompareUnicodeString(
1342 IN PCUNICODE_STRING String1,
1343 IN PCUNICODE_STRING String2,
1344 IN BOOLEAN CaseInSensitive);
1345
1346 NTSYSAPI
1347 LONG
1348 NTAPI
1349 RtlCompareUnicodeStrings(
1350 IN PCWCH String1,
1351 IN SIZE_T String1Length,
1352 IN PCWCH String2,
1353 IN SIZE_T String2Length,
1354 IN BOOLEAN CaseInSensitive);
1355
1356 NTSYSAPI
1357 VOID
1358 NTAPI
1359 RtlCopyUnicodeString(
1360 IN OUT PUNICODE_STRING DestinationString,
1361 IN PCUNICODE_STRING SourceString);
1362
1363 NTSYSAPI
1364 NTSTATUS
1365 NTAPI
1366 RtlCreateRegistryKey(
1367 IN ULONG RelativeTo,
1368 IN PWSTR Path);
1369
1370 NTSYSAPI
1371 NTSTATUS
1372 NTAPI
1373 RtlCreateSecurityDescriptor(
1374 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
1375 IN ULONG Revision);
1376
1377 NTSYSAPI
1378 NTSTATUS
1379 NTAPI
1380 RtlDeleteRegistryValue(
1381 IN ULONG RelativeTo,
1382 IN PCWSTR Path,
1383 IN PCWSTR ValueName);
1384
1385 NTSYSAPI
1386 BOOLEAN
1387 NTAPI
1388 RtlEqualUnicodeString(
1389 IN CONST UNICODE_STRING *String1,
1390 IN CONST UNICODE_STRING *String2,
1391 IN BOOLEAN CaseInSensitive);
1392
1393 #if !defined(_AMD64_) && !defined(_IA64_)
1394 NTSYSAPI
1395 LARGE_INTEGER
1396 NTAPI
1397 RtlExtendedIntegerMultiply(
1398 IN LARGE_INTEGER Multiplicand,
1399 IN LONG Multiplier);
1400
1401 NTSYSAPI
1402 LARGE_INTEGER
1403 NTAPI
1404 RtlExtendedLargeIntegerDivide(
1405 IN LARGE_INTEGER Dividend,
1406 IN ULONG Divisor,
1407 IN OUT PULONG Remainder);
1408 #endif
1409
1410 #if defined(_X86_) || defined(_IA64_)
1411 NTSYSAPI
1412 LARGE_INTEGER
1413 NTAPI
1414 RtlExtendedMagicDivide(
1415 IN LARGE_INTEGER Dividend,
1416 IN LARGE_INTEGER MagicDivisor,
1417 IN CCHAR ShiftCount);
1418 #endif
1419
1420 NTSYSAPI
1421 VOID
1422 NTAPI
1423 RtlFreeAnsiString(
1424 IN PANSI_STRING AnsiString);
1425
1426 NTSYSAPI
1427 ULONG
1428 NTAPI
1429 RtlFindClearBits(
1430 IN PRTL_BITMAP BitMapHeader,
1431 IN ULONG NumberToFind,
1432 IN ULONG HintIndex);
1433
1434 NTSYSAPI
1435 ULONG
1436 NTAPI
1437 RtlFindClearBitsAndSet(
1438 IN PRTL_BITMAP BitMapHeader,
1439 IN ULONG NumberToFind,
1440 IN ULONG HintIndex);
1441
1442 NTSYSAPI
1443 ULONG
1444 NTAPI
1445 RtlFindFirstRunClear(
1446 IN PRTL_BITMAP BitMapHeader,
1447 OUT PULONG StartingIndex);
1448
1449 NTSYSAPI
1450 ULONG
1451 NTAPI
1452 RtlFindClearRuns(
1453 IN PRTL_BITMAP BitMapHeader,
1454 OUT PRTL_BITMAP_RUN RunArray,
1455 IN ULONG SizeOfRunArray,
1456 IN BOOLEAN LocateLongestRuns);
1457
1458 NTSYSAPI
1459 ULONG
1460 NTAPI
1461 RtlFindLastBackwardRunClear(
1462 IN PRTL_BITMAP BitMapHeader,
1463 IN ULONG FromIndex,
1464 OUT PULONG StartingRunIndex);
1465
1466 NTSYSAPI
1467 CCHAR
1468 NTAPI
1469 RtlFindLeastSignificantBit(
1470 IN ULONGLONG Set);
1471
1472 NTSYSAPI
1473 ULONG
1474 NTAPI
1475 RtlFindLongestRunClear(
1476 IN PRTL_BITMAP BitMapHeader,
1477 OUT PULONG StartingIndex);
1478
1479 NTSYSAPI
1480 CCHAR
1481 NTAPI
1482 RtlFindMostSignificantBit(
1483 IN ULONGLONG Set);
1484
1485 NTSYSAPI
1486 ULONG
1487 NTAPI
1488 RtlFindNextForwardRunClear(
1489 IN PRTL_BITMAP BitMapHeader,
1490 IN ULONG FromIndex,
1491 OUT PULONG StartingRunIndex);
1492
1493 NTSYSAPI
1494 ULONG
1495 NTAPI
1496 RtlFindSetBits(
1497 IN PRTL_BITMAP BitMapHeader,
1498 IN ULONG NumberToFind,
1499 IN ULONG HintIndex);
1500
1501 NTSYSAPI
1502 ULONG
1503 NTAPI
1504 RtlFindSetBitsAndClear(
1505 IN PRTL_BITMAP BitMapHeader,
1506 IN ULONG NumberToFind,
1507 IN ULONG HintIndex);
1508
1509 NTSYSAPI
1510 NTSTATUS
1511 NTAPI
1512 RtlHashUnicodeString(
1513 IN CONST UNICODE_STRING *String,
1514 IN BOOLEAN CaseInSensitive,
1515 IN ULONG HashAlgorithm,
1516 OUT PULONG HashValue);
1517
1518 NTSYSAPI
1519 VOID
1520 NTAPI
1521 RtlInitAnsiString(
1522 IN OUT PANSI_STRING DestinationString,
1523 IN PCSZ SourceString);
1524
1525 NTSYSAPI
1526 VOID
1527 NTAPI
1528 RtlInitializeBitMap(
1529 IN PRTL_BITMAP BitMapHeader,
1530 IN PULONG BitMapBuffer,
1531 IN ULONG SizeOfBitMap);
1532
1533 NTSYSAPI
1534 VOID
1535 NTAPI
1536 RtlInitString(
1537 IN OUT PSTRING DestinationString,
1538 IN PCSZ SourceString);
1539
1540 NTSYSAPI
1541 NTSTATUS
1542 NTAPI
1543 RtlIntegerToUnicodeString(
1544 IN ULONG Value,
1545 IN ULONG Base OPTIONAL,
1546 IN OUT PUNICODE_STRING String);
1547
1548 NTSYSAPI
1549 NTSTATUS
1550 NTAPI
1551 RtlInt64ToUnicodeString(
1552 IN ULONGLONG Value,
1553 IN ULONG Base OPTIONAL,
1554 IN OUT PUNICODE_STRING String);
1555
1556 #ifdef _WIN64
1557 #define RtlIntPtrToUnicodeString(Value, Base, String) \
1558 RtlInt64ToUnicodeString(Value, Base, String)
1559 #else
1560 #define RtlIntPtrToUnicodeString(Value, Base, String) \
1561 RtlIntegerToUnicodeString(Value, Base, String)
1562 #endif
1563
1564 /* BOOLEAN
1565 * RtlIsZeroLuid(
1566 * IN PLUID L1);
1567 */
1568 #define RtlIsZeroLuid(_L1) \
1569 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
1570
1571 NTSYSAPI
1572 ULONG
1573 NTAPI
1574 RtlLengthSecurityDescriptor(
1575 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
1576
1577 NTSYSAPI
1578 ULONG
1579 NTAPI
1580 RtlNumberOfClearBits(
1581 IN PRTL_BITMAP BitMapHeader);
1582
1583 NTSYSAPI
1584 ULONG
1585 NTAPI
1586 RtlNumberOfSetBits(
1587 IN PRTL_BITMAP BitMapHeader);
1588
1589 NTSYSAPI
1590 NTSTATUS
1591 NTAPI
1592 RtlQueryRegistryValues(
1593 IN ULONG RelativeTo,
1594 IN PCWSTR Path,
1595 IN PRTL_QUERY_REGISTRY_TABLE QueryTable,
1596 IN PVOID Context,
1597 IN PVOID Environment OPTIONAL);
1598
1599 #define LONG_SIZE (sizeof(LONG))
1600 #define LONG_MASK (LONG_SIZE - 1)
1601
1602 /* VOID
1603 * RtlRetrieveUlong(
1604 * PULONG DestinationAddress,
1605 * PULONG SourceAddress);
1606 */
1607 #if defined(_AMD64_)
1608 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
1609 *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
1610 #else
1611 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
1612 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
1613 { \
1614 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
1615 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
1616 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
1617 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
1618 } \
1619 else \
1620 { \
1621 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
1622 }
1623 #endif
1624
1625 /* VOID
1626 * RtlRetrieveUshort(
1627 * PUSHORT DestinationAddress,
1628 * PUSHORT SourceAddress);
1629 */
1630 #if defined(_AMD64_)
1631 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
1632 *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
1633 #else
1634 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
1635 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
1636 { \
1637 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
1638 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
1639 } \
1640 else \
1641 { \
1642 *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
1643 }
1644 #endif
1645
1646 NTSYSAPI
1647 VOID
1648 NTAPI
1649 RtlSetAllBits(
1650 IN PRTL_BITMAP BitMapHeader);
1651
1652 NTSYSAPI
1653 VOID
1654 NTAPI
1655 RtlSetBits(
1656 IN PRTL_BITMAP BitMapHeader,
1657 IN ULONG StartingIndex,
1658 IN ULONG NumberToSet);
1659
1660 NTSYSAPI
1661 NTSTATUS
1662 NTAPI
1663 RtlSetDaclSecurityDescriptor(
1664 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
1665 IN BOOLEAN DaclPresent,
1666 IN PACL Dacl OPTIONAL,
1667 IN BOOLEAN DaclDefaulted OPTIONAL);
1668
1669 /* VOID
1670 * RtlStoreUlong(
1671 * IN PULONG Address,
1672 * IN ULONG Value);
1673 */
1674 #if defined(_AMD64_)
1675 #define RtlStoreUlong(Address,Value) \
1676 *(ULONG UNALIGNED *)(Address) = (Value)
1677 #else
1678 #define RtlStoreUlong(Address,Value) \
1679 if ((ULONG_PTR)(Address) & LONG_MASK) { \
1680 ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
1681 ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
1682 ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
1683 ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT] = (UCHAR)(FOURTHBYTE(Value)); \
1684 } \
1685 else { \
1686 *((PULONG)(Address)) = (ULONG) (Value); \
1687 }
1688 #endif
1689
1690 /* VOID
1691 * RtlStoreUlonglong(
1692 * IN OUT PULONGLONG Address,
1693 * ULONGLONG Value);
1694 */
1695 #if defined(_AMD64_)
1696 #define RtlStoreUlonglong(Address,Value) \
1697 *(ULONGLONG UNALIGNED *)(Address) = (Value)
1698 #else
1699 #define RtlStoreUlonglong(Address,Value) \
1700 if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
1701 RtlStoreUlong((ULONG_PTR)(Address), \
1702 (ULONGLONG)(Value) & 0xFFFFFFFF); \
1703 RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
1704 (ULONGLONG)(Value) >> 32); \
1705 } else { \
1706 *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
1707 }
1708 #endif
1709
1710 /* VOID
1711 * RtlStoreUlongPtr(
1712 * IN OUT PULONG_PTR Address,
1713 * IN ULONG_PTR Value);
1714 */
1715 #ifdef _WIN64
1716 #define RtlStoreUlongPtr(Address,Value) \
1717 RtlStoreUlonglong(Address,Value)
1718 #else
1719 #define RtlStoreUlongPtr(Address,Value) \
1720 RtlStoreUlong(Address,Value)
1721 #endif
1722
1723 /* VOID
1724 * RtlStoreUshort(
1725 * IN PUSHORT Address,
1726 * IN USHORT Value);
1727 */
1728 #if defined(_AMD64_)
1729 #define RtlStoreUshort(Address,Value) \
1730 *(USHORT UNALIGNED *)(Address) = (Value)
1731 #else
1732 #define RtlStoreUshort(Address,Value) \
1733 if ((ULONG_PTR)(Address) & SHORT_MASK) { \
1734 ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
1735 ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
1736 } \
1737 else { \
1738 *((PUSHORT) (Address)) = (USHORT)Value; \
1739 }
1740 #endif
1741
1742 NTSYSAPI
1743 BOOLEAN
1744 NTAPI
1745 RtlTimeFieldsToTime(
1746 IN PTIME_FIELDS TimeFields,
1747 IN PLARGE_INTEGER Time);
1748
1749 NTSYSAPI
1750 VOID
1751 NTAPI
1752 RtlTimeToTimeFields(
1753 IN PLARGE_INTEGER Time,
1754 IN PTIME_FIELDS TimeFields);
1755
1756 NTSYSAPI
1757 ULONG
1758 FASTCALL
1759 RtlUlongByteSwap(
1760 IN ULONG Source);
1761
1762 NTSYSAPI
1763 ULONGLONG
1764 FASTCALL
1765 RtlUlonglongByteSwap(
1766 IN ULONGLONG Source);
1767
1768 NTSYSAPI
1769 NTSTATUS
1770 NTAPI
1771 RtlUnicodeStringToAnsiString(
1772 IN OUT PANSI_STRING DestinationString,
1773 IN PCUNICODE_STRING SourceString,
1774 IN BOOLEAN AllocateDestinationString);
1775
1776 NTSYSAPI
1777 ULONG
1778 NTAPI
1779 RtlxUnicodeStringToAnsiSize(
1780 IN PCUNICODE_STRING UnicodeString);
1781
1782 #define RtlUnicodeStringToAnsiSize(String) ( \
1783 NLS_MB_CODE_PAGE_TAG ? \
1784 RtlxUnicodeStringToAnsiSize(String) : \
1785 ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
1786 )
1787
1788 NTSYSAPI
1789 NTSTATUS
1790 NTAPI
1791 RtlUnicodeStringToInteger(
1792 IN PCUNICODE_STRING String,
1793 IN ULONG Base OPTIONAL,
1794 OUT PULONG Value);
1795
1796 NTSYSAPI
1797 WCHAR
1798 NTAPI
1799 RtlUpcaseUnicodeChar(
1800 IN WCHAR SourceCharacter);
1801
1802 NTSYSAPI
1803 USHORT
1804 FASTCALL
1805 RtlUshortByteSwap(
1806 IN USHORT Source);
1807
1808 NTSYSAPI
1809 BOOLEAN
1810 NTAPI
1811 RtlValidRelativeSecurityDescriptor(
1812 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput,
1813 IN ULONG SecurityDescriptorLength,
1814 IN SECURITY_INFORMATION RequiredInformation);
1815
1816 NTSYSAPI
1817 BOOLEAN
1818 NTAPI
1819 RtlValidSecurityDescriptor(
1820 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
1821
1822 NTSYSAPI
1823 NTSTATUS
1824 NTAPI
1825 RtlWriteRegistryValue(
1826 IN ULONG RelativeTo,
1827 IN PCWSTR Path,
1828 IN PCWSTR ValueName,
1829 IN ULONG ValueType,
1830 IN PVOID ValueData,
1831 IN ULONG ValueLength);
1832
1833 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
1834
1835 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
1836 NTSYSAPI
1837 VOID
1838 FASTCALL
1839 RtlPrefetchMemoryNonTemporal(
1840 IN PVOID Source,
1841 IN SIZE_T Length);
1842 #endif
1843
1844 #if (NTDDI_VERSION >= NTDDI_WINXP)
1845 NTSYSAPI
1846 VOID
1847 NTAPI
1848 RtlClearBit(
1849 PRTL_BITMAP BitMapHeader,
1850 ULONG BitNumber);
1851
1852 NTSYSAPI
1853 WCHAR
1854 NTAPI
1855 RtlDowncaseUnicodeChar(
1856 IN WCHAR SourceCharacter);
1857
1858 NTSYSAPI
1859 VOID
1860 NTAPI
1861 RtlSetBit(
1862 PRTL_BITMAP BitMapHeader,
1863 ULONG BitNumber);
1864
1865 NTSYSAPI
1866 BOOLEAN
1867 NTAPI
1868 RtlTestBit(
1869 IN PRTL_BITMAP BitMapHeader,
1870 IN ULONG BitNumber);
1871
1872 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
1873
1874 #if (NTDDI_VERSION >= NTDDI_VISTA)
1875 NTSYSAPI
1876 ULONG
1877 NTAPI
1878 RtlNumberOfSetBitsUlongPtr(
1879 IN ULONG_PTR Target);
1880
1881 NTSYSAPI
1882 ULONGLONG
1883 NTAPI
1884 RtlIoDecodeMemIoResource (
1885 IN PIO_RESOURCE_DESCRIPTOR Descriptor,
1886 OUT PULONGLONG Alignment OPTIONAL,
1887 OUT PULONGLONG MinimumAddress OPTIONAL,
1888 OUT PULONGLONG MaximumAddress OPTIONAL);
1889
1890 NTSYSAPI
1891 NTSTATUS
1892 NTAPI
1893 RtlIoEncodeMemIoResource(
1894 IN PIO_RESOURCE_DESCRIPTOR Descriptor,
1895 IN UCHAR Type,
1896 IN ULONGLONG Length,
1897 IN ULONGLONG Alignment,
1898 IN ULONGLONG MinimumAddress,
1899 IN ULONGLONG MaximumAddress);
1900
1901 NTSYSAPI
1902 ULONGLONG
1903 NTAPI
1904 RtlCmDecodeMemIoResource(
1905 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor,
1906 OUT PULONGLONG Start OPTIONAL);
1907
1908 NTSYSAPI
1909 NTSTATUS
1910 NTAPI
1911 RtlFindClosestEncodableLength(
1912 IN ULONGLONG SourceLength,
1913 OUT PULONGLONG TargetLength);
1914
1915 #endif
1916
1917 #if !defined(MIDL_PASS)
1918 /* inline funftions */
1919 //DECLSPEC_DEPRECATED_DDK_WINXP
1920 static __inline
1921 LARGE_INTEGER
1922 NTAPI_INLINE
1923 RtlConvertLongToLargeInteger(LONG SignedInteger)
1924 {
1925 LARGE_INTEGER ret;
1926 ret.QuadPart = SignedInteger;
1927 return ret;
1928 }
1929
1930 //DECLSPEC_DEPRECATED_DDK_WINXP
1931 static __inline
1932 LARGE_INTEGER
1933 NTAPI_INLINE
1934 RtlConvertUlongToLargeInteger(
1935 ULONG UnsignedInteger)
1936 {
1937 LARGE_INTEGER ret;
1938 ret.QuadPart = UnsignedInteger;
1939 return ret;
1940 }
1941
1942 //DECLSPEC_DEPRECATED_DDK
1943 static __inline
1944 ULONG
1945 NTAPI_INLINE
1946 RtlEnlargedUnsignedDivide(
1947 IN ULARGE_INTEGER Dividend,
1948 IN ULONG Divisor,
1949 IN OUT PULONG Remainder)
1950 {
1951 if (Remainder)
1952 *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
1953 return (ULONG)(Dividend.QuadPart / Divisor);
1954 }
1955
1956 //DECLSPEC_DEPRECATED_DDK
1957 static __inline
1958 LARGE_INTEGER
1959 NTAPI_INLINE
1960 RtlEnlargedUnsignedMultiply(
1961 IN ULONG Multiplicand,
1962 IN ULONG Multiplier)
1963 {
1964 LARGE_INTEGER ret;
1965 ret.QuadPart = (ULONGLONG)Multiplicand * (ULONGLONG)Multiplier;
1966 return ret;
1967 }
1968
1969 //DECLSPEC_DEPRECATED_DDK
1970 static __inline
1971 LARGE_INTEGER
1972 NTAPI_INLINE
1973 RtlEnlargedIntegerMultiply(
1974 IN LONG Multiplicand,
1975 IN LONG Multiplier)
1976 {
1977 LARGE_INTEGER ret;
1978 ret.QuadPart = (LONGLONG)Multiplicand * (ULONGLONG)Multiplier;
1979 return ret;
1980 }
1981
1982 FORCEINLINE
1983 VOID
1984 RtlInitEmptyAnsiString(OUT PANSI_STRING AnsiString,
1985 IN PCHAR Buffer,
1986 IN USHORT BufferSize)
1987 {
1988 AnsiString->Length = 0;
1989 AnsiString->MaximumLength = BufferSize;
1990 AnsiString->Buffer = Buffer;
1991 }
1992
1993 FORCEINLINE
1994 VOID
1995 RtlInitEmptyUnicodeString(
1996 OUT PUNICODE_STRING UnicodeString,
1997 IN PWSTR Buffer,
1998 IN USHORT BufferSize)
1999 {
2000 UnicodeString->Length = 0;
2001 UnicodeString->MaximumLength = BufferSize;
2002 UnicodeString->Buffer = Buffer;
2003 }
2004
2005 #if defined(_AMD64_) || defined(_IA64_)
2006 static __inline
2007 LARGE_INTEGER
2008 NTAPI_INLINE
2009 RtlExtendedIntegerMultiply(
2010 LARGE_INTEGER Multiplicand,
2011 LONG Multiplier)
2012 {
2013 LARGE_INTEGER ret;
2014 ret.QuadPart = Multiplicand.QuadPart * Multiplier;
2015 return ret;
2016 }
2017
2018 static __inline
2019 LARGE_INTEGER
2020 NTAPI_INLINE
2021 RtlExtendedLargeIntegerDivide(
2022 LARGE_INTEGER Dividend,
2023 ULONG Divisor,
2024 PULONG Remainder)
2025 {
2026 LARGE_INTEGER ret;
2027 ret.QuadPart = (ULONG64)Dividend.QuadPart / Divisor;
2028 if (Remainder)
2029 *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
2030 return ret;
2031 }
2032 #endif
2033
2034 #if defined(_AMD64_)
2035
2036 #define MultiplyHigh __mulh
2037 #define UnsignedMultiplyHigh __umulh
2038
2039 //DECLSPEC_DEPRECATED_DDK
2040 static __inline
2041 LARGE_INTEGER
2042 NTAPI_INLINE
2043 RtlExtendedMagicDivide(
2044 IN LARGE_INTEGER Dividend,
2045 IN LARGE_INTEGER MagicDivisor,
2046 IN CCHAR ShiftCount)
2047 {
2048 LARGE_INTEGER ret;
2049 ULONG64 ret64;
2050 BOOLEAN Pos;
2051 Pos = (Dividend.QuadPart >= 0);
2052 ret64 = UnsignedMultiplyHigh(Pos ? Dividend.QuadPart : -Dividend.QuadPart,
2053 MagicDivisor.QuadPart);
2054 ret64 >>= ShiftCount;
2055 ret.QuadPart = Pos ? ret64 : -ret64;
2056 return ret;
2057 }
2058 #endif
2059
2060 //DECLSPEC_DEPRECATED_DDK
2061 static __inline
2062 LARGE_INTEGER
2063 NTAPI_INLINE
2064 RtlLargeIntegerAdd(
2065 IN LARGE_INTEGER Addend1,
2066 IN LARGE_INTEGER Addend2)
2067 {
2068 LARGE_INTEGER ret;
2069 ret.QuadPart = Addend1.QuadPart + Addend2.QuadPart;
2070 return ret;
2071 }
2072
2073 /* VOID
2074 * RtlLargeIntegerAnd(
2075 * IN OUT LARGE_INTEGER Result,
2076 * IN LARGE_INTEGER Source,
2077 * IN LARGE_INTEGER Mask);
2078 */
2079 #define RtlLargeIntegerAnd(Result, Source, Mask) \
2080 Result.QuadPart = Source.QuadPart & Mask.QuadPart
2081
2082 //DECLSPEC_DEPRECATED_DDK
2083 static __inline
2084 LARGE_INTEGER
2085 NTAPI_INLINE
2086 RtlLargeIntegerArithmeticShift(
2087 IN LARGE_INTEGER LargeInteger,
2088 IN CCHAR ShiftCount)
2089 {
2090 LARGE_INTEGER ret;
2091 ret.QuadPart = LargeInteger.QuadPart >> ShiftCount;
2092 return ret;
2093 }
2094
2095 /* BOOLEAN
2096 * RtlLargeIntegerEqualTo(
2097 * IN LARGE_INTEGER Operand1,
2098 * IN LARGE_INTEGER Operand2);
2099 */
2100 #define RtlLargeIntegerEqualTo(X,Y) \
2101 (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
2102
2103 FORCEINLINE
2104 PVOID
2105 RtlSecureZeroMemory(
2106 OUT PVOID Pointer,
2107 IN SIZE_T Size)
2108 {
2109 volatile char* vptr = (volatile char*)Pointer;
2110 #if defined(_M_AMD64)
2111 __stosb((PUCHAR)vptr, 0, Size);
2112 #else
2113 char * endptr = (char *)vptr + Size;
2114 while (vptr < endptr)
2115 {
2116 *vptr = 0; vptr++;
2117 }
2118 #endif
2119 return Pointer;
2120 }
2121
2122 #if defined(_M_AMD64)
2123 FORCEINLINE
2124 ULONG
2125 RtlCheckBit(
2126 IN PRTL_BITMAP BitMapHeader,
2127 IN ULONG BitPosition)
2128 {
2129 return BitTest((LONG CONST*)BitMapHeader->Buffer, BitPosition);
2130 }
2131 #else
2132 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
2133 #endif // defined(_M_AMD64)
2134
2135 #endif // !defined(MIDL_PASS)
2136
2137 //
2138 // Byte Swap Functions
2139 //
2140 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \
2141 ((defined(_M_AMD64) || defined(_M_IA64)) \
2142 && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))
2143
2144 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
2145 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
2146 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
2147
2148 #endif
2149
2150 /******************************************************************************
2151 * Memory manager Types *
2152 ******************************************************************************/
2153
2154 typedef struct _MDL {
2155 struct _MDL *Next;
2156 CSHORT Size;
2157 CSHORT MdlFlags;
2158 struct _EPROCESS *Process;
2159 PVOID MappedSystemVa;
2160 PVOID StartVa;
2161 ULONG ByteCount;
2162 ULONG ByteOffset;
2163 } MDL, *PMDL;
2164
2165
2166 /******************************************************************************
2167 * Memory manager Functions *
2168 ******************************************************************************/
2169
2170 /* PVOID MmGetSystemAddressForMdl(
2171 * IN PMDL Mdl);
2172 */
2173 #define MmGetSystemAddressForMdl(Mdl) \
2174 (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
2175 MDL_SOURCE_IS_NONPAGED_POOL)) ? \
2176 ((Mdl)->MappedSystemVa) : \
2177 (MmMapLockedPages((Mdl), KernelMode)))
2178
2179 /* PVOID
2180 * MmGetSystemAddressForMdlSafe(
2181 * IN PMDL Mdl,
2182 * IN MM_PAGE_PRIORITY Priority)
2183 */
2184 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
2185 (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
2186 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
2187 (_Mdl)->MappedSystemVa : \
2188 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
2189 KernelMode, MmCached, NULL, FALSE, (_Priority)))
2190
2191 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2192 NTKERNELAPI
2193 PMDL
2194 NTAPI
2195 MmCreateMdl(
2196 IN PMDL MemoryDescriptorList OPTIONAL,
2197 IN PVOID Base,
2198 IN SIZE_T Length);
2199
2200 #endif
2201
2202
2203 /******************************************************************************
2204 * I/O Manager Functions *
2205 ******************************************************************************/
2206
2207 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
2208 (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
2209
2210 #define DMA_MACROS_DEFINED
2211
2212 FORCEINLINE
2213 NTSTATUS
2214 IoAllocateAdapterChannel(
2215 IN PADAPTER_OBJECT AdapterObject,
2216 IN PDEVICE_OBJECT DeviceObject,
2217 IN ULONG NumberOfMapRegisters,
2218 IN PDRIVER_CONTROL ExecutionRoutine,
2219 IN PVOID Context)
2220 {
2221 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
2222 AllocateAdapterChannel =
2223 *(DmaAdapter)->DmaOperations->AllocateAdapterChannel;
2224 ASSERT(AllocateAdapterChannel);
2225 return AllocateAdapterChannel(DmaAdapter,
2226 DeviceObject,
2227 NumberOfMapRegisters,
2228 ExecutionRoutine,
2229 Context );
2230 }
2231
2232 FORCEINLINE
2233 BOOLEAN
2234 IoFlushAdapterBuffers(
2235 IN PADAPTER_OBJECT AdapterObject,
2236 IN PMDL Mdl,
2237 IN PVOID MapRegisterBase,
2238 IN PVOID CurrentVa,
2239 IN ULONG Length,
2240 IN BOOLEAN WriteToDevice)
2241 {
2242 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
2243 FlushAdapterBuffers = *(DmaAdapter)->DmaOperations->FlushAdapterBuffers;
2244 ASSERT(FlushAdapterBuffers);
2245 return FlushAdapterBuffers(DmaAdapter,
2246 Mdl,
2247 MapRegisterBase,
2248 CurrentVa,
2249 Length,
2250 WriteToDevice );
2251 }
2252
2253 FORCEINLINE
2254 VOID
2255 IoFreeAdapterChannel(
2256 IN PADAPTER_OBJECT AdapterObject)
2257 {
2258 PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
2259 FreeAdapterChannel = *(DmaAdapter)->DmaOperations->FreeAdapterChannel;
2260 ASSERT(FreeAdapterChannel);
2261 FreeAdapterChannel(DmaAdapter);
2262 }
2263
2264 FORCEINLINE
2265 VOID
2266 IoFreeMapRegisters(
2267 IN PADAPTER_OBJECT AdapterObject,
2268 IN PVOID MapRegisterBase,
2269 IN ULONG NumberOfMapRegisters)
2270 {
2271 PFREE_MAP_REGISTERS FreeMapRegisters;
2272 FreeMapRegisters = *(DmaAdapter)->DmaOperations->FreeMapRegisters;
2273 ASSERT(FreeMapRegisters);
2274 FreeMapRegisters(DmaAdapter, MapRegisterBase, NumberOfMapRegisters);
2275 }
2276
2277 FORCEINLINE
2278 PHYSICAL_ADDRESS
2279 IoMapTransfer(
2280 IN PDMA_ADAPTER DmaAdapter,
2281 IN PMDL Mdl,
2282 IN PVOID MapRegisterBase,
2283 IN PVOID CurrentVa,
2284 IN OUT PULONG Length,
2285 IN BOOLEAN WriteToDevice)
2286 {
2287 PMAP_TRANSFER MapTransfer;
2288
2289 MapTransfer = *(DmaAdapter)->DmaOperations->MapTransfer;
2290 ASSERT(MapTransfer);
2291 return MapTransfer(DmaAdapter,
2292 Mdl,
2293 MapRegisterBase,
2294 CurrentVa,
2295 Length,
2296 WriteToDevice);
2297 }
2298 #endif
2299
2300
2301 /******************************************************************************
2302 * Executive Types *
2303 ******************************************************************************/
2304
2305 typedef enum _POOL_TYPE {
2306 NonPagedPool,
2307 PagedPool,
2308 NonPagedPoolMustSucceed,
2309 DontUseThisType,
2310 NonPagedPoolCacheAligned,
2311 PagedPoolCacheAligned,
2312 NonPagedPoolCacheAlignedMustS,
2313 MaxPoolType,
2314 NonPagedPoolSession = 32,
2315 PagedPoolSession,
2316 NonPagedPoolMustSucceedSession,
2317 DontUseThisTypeSession,
2318 NonPagedPoolCacheAlignedSession,
2319 PagedPoolCacheAlignedSession,
2320 NonPagedPoolCacheAlignedMustSSession
2321 } POOL_TYPE;
2322
2323 typedef enum _SUITE_TYPE {
2324 SmallBusiness,
2325 Enterprise,
2326 BackOffice,
2327 CommunicationServer,
2328 TerminalServer,
2329 SmallBusinessRestricted,
2330 EmbeddedNT,
2331 DataCenter,
2332 SingleUserTS,
2333 Personal,
2334 Blade,
2335 MaxSuiteType
2336 } SUITE_TYPE;
2337
2338 typedef enum _EX_POOL_PRIORITY {
2339 LowPoolPriority,
2340 LowPoolPrioritySpecialPoolOverrun = 8,
2341 LowPoolPrioritySpecialPoolUnderrun = 9,
2342 NormalPoolPriority = 16,
2343 NormalPoolPrioritySpecialPoolOverrun = 24,
2344 NormalPoolPrioritySpecialPoolUnderrun = 25,
2345 HighPoolPriority = 32,
2346 HighPoolPrioritySpecialPoolOverrun = 40,
2347 HighPoolPrioritySpecialPoolUnderrun = 41
2348 } EX_POOL_PRIORITY;
2349
2350 typedef struct _FAST_MUTEX
2351 {
2352 LONG Count;
2353 PKTHREAD Owner;
2354 ULONG Contention;
2355 KEVENT Gate;
2356 ULONG OldIrql;
2357 } FAST_MUTEX, *PFAST_MUTEX;
2358
2359 typedef ULONG_PTR ERESOURCE_THREAD, *PERESOURCE_THREAD;
2360
2361 typedef struct _OWNER_ENTRY {
2362 ERESOURCE_THREAD OwnerThread;
2363 _ANONYMOUS_UNION union {
2364 LONG OwnerCount;
2365 ULONG TableSize;
2366 } DUMMYUNIONNAME;
2367 } OWNER_ENTRY, *POWNER_ENTRY;
2368
2369 typedef struct _ERESOURCE
2370 {
2371 LIST_ENTRY SystemResourcesList;
2372 POWNER_ENTRY OwnerTable;
2373 SHORT ActiveCount;
2374 USHORT Flag;
2375 volatile PKSEMAPHORE SharedWaiters;
2376 volatile PKEVENT ExclusiveWaiters;
2377 OWNER_ENTRY OwnerEntry;
2378 ULONG ActiveEntries;
2379 ULONG ContentionCount;
2380 ULONG NumberOfSharedWaiters;
2381 ULONG NumberOfExclusiveWaiters;
2382 union
2383 {
2384 PVOID Address;
2385 ULONG_PTR CreatorBackTraceIndex;
2386 };
2387 KSPIN_LOCK SpinLock;
2388 } ERESOURCE, *PERESOURCE;
2389
2390 #if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
2391 #define LOOKASIDE_ALIGN
2392 #else
2393 #define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */
2394 #endif
2395
2396 typedef struct _LOOKASIDE_LIST_EX *PLOOKASIDE_LIST_EX;
2397
2398 typedef PVOID
2399 (DDKAPI *PALLOCATE_FUNCTION)(
2400 IN POOL_TYPE PoolType,
2401 IN SIZE_T NumberOfBytes,
2402 IN ULONG Tag);
2403
2404 typedef PVOID
2405 (DDKAPI *PALLOCATE_FUNCTION_EX)(
2406 IN POOL_TYPE PoolType,
2407 IN SIZE_T NumberOfBytes,
2408 IN ULONG Tag,
2409 IN OUT PLOOKASIDE_LIST_EX Lookaside);
2410
2411 typedef VOID
2412 (DDKAPI *PFREE_FUNCTION)(
2413 IN PVOID Buffer);
2414
2415 typedef VOID
2416 (DDKAPI *PFREE_FUNCTION_EX)(
2417 IN PVOID Buffer,
2418 IN OUT PLOOKASIDE_LIST_EX Lookaside);
2419
2420 typedef VOID
2421 (DDKAPI *PCALLBACK_FUNCTION)(
2422 IN PVOID CallbackContext,
2423 IN PVOID Argument1,
2424 IN PVOID Argument2);
2425
2426 typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE {
2427 union {
2428 SLIST_HEADER ListHead;
2429 SINGLE_LIST_ENTRY SingleListHead;
2430 } DUMMYUNIONNAME;
2431 USHORT Depth;
2432 USHORT MaximumDepth;
2433 ULONG TotalAllocates;
2434 union {
2435 ULONG AllocateMisses;
2436 ULONG AllocateHits;
2437 } DUMMYUNIONNAME2;
2438 ULONG TotalFrees;
2439 union {
2440 ULONG FreeMisses;
2441 ULONG FreeHits;
2442 } DUMMYUNIONNAME3;
2443 POOL_TYPE Type;
2444 ULONG Tag;
2445 ULONG Size;
2446 union {
2447 PALLOCATE_FUNCTION_EX AllocateEx;
2448 PALLOCATE_FUNCTION Allocate;
2449 } DUMMYUNIONNAME4;
2450 union {
2451 PFREE_FUNCTION_EX FreeEx;
2452 PFREE_FUNCTION Free;
2453 } DUMMYUNIONNAME5;
2454 LIST_ENTRY ListEntry;
2455 ULONG LastTotalAllocates;
2456 union {
2457 ULONG LastAllocateMisses;
2458 ULONG LastAllocateHits;
2459 } DUMMYUNIONNAME6;
2460 ULONG Future[2];
2461 } GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE;
2462
2463 typedef struct _PAGED_LOOKASIDE_LIST {
2464 GENERAL_LOOKASIDE L;
2465 #if !defined(_AMD64_) && !defined(_IA64_)
2466 FAST_MUTEX Lock__ObsoleteButDoNotDelete;
2467 #endif
2468 } PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST;
2469
2470 typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST {
2471 GENERAL_LOOKASIDE L;
2472 #if !defined(_AMD64_) && !defined(_IA64_)
2473 KSPIN_LOCK Lock__ObsoleteButDoNotDelete;
2474 #endif
2475 } NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST;
2476
2477 //typedef struct _LOOKASIDE_LIST_EX {
2478 // GENERAL_LOOKASIDE_POOL L;
2479 //} LOOKASIDE_LIST_EX, *PLOOKASIDE_LIST_EX;
2480
2481 typedef struct _EX_RUNDOWN_REF {
2482 union {
2483 volatile ULONG_PTR Count;
2484 volatile PVOID Ptr;
2485 };
2486 } EX_RUNDOWN_REF, *PEX_RUNDOWN_REF;
2487
2488 typedef struct _EX_RUNDOWN_REF_CACHE_AWARE *PEX_RUNDOWN_REF_CACHE_AWARE;
2489
2490 typedef enum _WORK_QUEUE_TYPE {
2491 CriticalWorkQueue,
2492 DelayedWorkQueue,
2493 HyperCriticalWorkQueue,
2494 MaximumWorkQueue
2495 } WORK_QUEUE_TYPE;
2496
2497 typedef VOID
2498 (DDKAPI *PWORKER_THREAD_ROUTINE)(
2499 IN PVOID Parameter);
2500
2501 typedef struct _WORK_QUEUE_ITEM {
2502 LIST_ENTRY List;
2503 PWORKER_THREAD_ROUTINE WorkerRoutine;
2504 volatile PVOID Parameter;
2505 } WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;
2506
2507
2508 /******************************************************************************
2509 * Executive Functions *
2510 ******************************************************************************/
2511
2512 #if defined(_X86_)
2513 #if defined(_NTHAL_)
2514 #define ExAcquireFastMutex ExiAcquireFastMutex
2515 #define ExReleaseFastMutex ExiReleaseFastMutex
2516 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
2517 #endif
2518 #define ExInterlockedAddUlong ExfInterlockedAddUlong
2519 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
2520 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
2521 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
2522 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
2523 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
2524 #endif
2525
2526 #if defined(_WIN64)
2527
2528 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
2529 defined(_NTHAL_) || defined(_NTOSP_)
2530 NTKERNELAPI
2531 USHORT
2532 ExQueryDepthSList(IN PSLIST_HEADER ListHead);
2533 #else
2534 FORCEINLINE
2535 USHORT
2536 ExQueryDepthSList(IN PSLIST_HEADER ListHead)
2537 {
2538 return (USHORT)(ListHead->Alignment & 0xffff);
2539 }
2540 #endif
2541
2542 NTKERNELAPI
2543 PSLIST_ENTRY
2544 ExpInterlockedFlushSList(
2545 PSLIST_HEADER ListHead);
2546
2547 NTKERNELAPI
2548 PSLIST_ENTRY
2549 ExpInterlockedPopEntrySList(
2550 PSLIST_HEADER ListHead);
2551
2552 NTKERNELAPI
2553 PSLIST_ENTRY
2554 ExpInterlockedPushEntrySList(
2555 PSLIST_HEADER ListHead,
2556 PSLIST_ENTRY ListEntry);
2557
2558 #define ExInterlockedFlushSList(Head) \
2559 ExpInterlockedFlushSList(Head)
2560 #define ExInterlockedPopEntrySList(Head, Lock) \
2561 ExpInterlockedPopEntrySList(Head)
2562 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
2563 ExpInterlockedPushEntrySList(Head, Entry)
2564
2565 #else // !defined(_WIN64)
2566
2567 #define ExQueryDepthSList(listhead) (listhead)->Depth
2568
2569 NTKERNELAPI
2570 PSINGLE_LIST_ENTRY
2571 FASTCALL
2572 ExInterlockedFlushSList(
2573 IN PSLIST_HEADER ListHead);
2574
2575 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
2576 NTKERNELAPI
2577 PSINGLE_LIST_ENTRY
2578 FASTCALL
2579 ExInterlockedPopEntrySList(
2580 IN PSLIST_HEADER ListHead,
2581 IN PKSPIN_LOCK Lock);
2582
2583 NTKERNELAPI
2584 PSINGLE_LIST_ENTRY
2585 FASTCALL
2586 ExInterlockedPushEntrySList(
2587 IN PSLIST_HEADER ListHead,
2588 IN PSINGLE_LIST_ENTRY ListEntry,
2589 IN PKSPIN_LOCK Lock);
2590 #else
2591 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
2592 InterlockedPopEntrySList(_ListHead)
2593 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
2594 InterlockedPushEntrySList(_ListHead, _ListEntry)
2595 #endif // _WIN2K_COMPAT_SLIST_USAGE
2596
2597 #endif // !defined(_WIN64)
2598
2599 /* ERESOURCE_THREAD
2600 * ExGetCurrentResourceThread(
2601 * VOID);
2602 */
2603 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread())
2604
2605 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
2606
2607 /* VOID
2608 * ExInitializeWorkItem(
2609 * IN PWORK_QUEUE_ITEM Item,
2610 * IN PWORKER_THREAD_ROUTINE Routine,
2611 * IN PVOID Context)
2612 */
2613 #define ExInitializeWorkItem(Item, Routine, Context) \
2614 { \
2615 (Item)->WorkerRoutine = Routine; \
2616 (Item)->Parameter = Context; \
2617 (Item)->List.Flink = NULL; \
2618 }
2619
2620 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2621
2622 NTKERNELAPI
2623 VOID
2624 FASTCALL
2625 ExAcquireFastMutex(
2626 IN OUT PFAST_MUTEX FastMutex);
2627
2628 NTKERNELAPI
2629 VOID
2630 FASTCALL
2631 ExReleaseFastMutex(
2632 IN OUT PFAST_MUTEX FastMutex);
2633
2634 NTKERNELAPI
2635 BOOLEAN
2636 FASTCALL
2637 ExTryToAcquireFastMutex(
2638 IN OUT PFAST_MUTEX FastMutex);
2639
2640 NTKERNELAPI
2641 VOID
2642 FASTCALL
2643 ExAcquireFastMutexUnsafe(
2644 IN OUT PFAST_MUTEX FastMutex);
2645
2646 NTKERNELAPI
2647 VOID
2648 FASTCALL
2649 ExReleaseFastMutexUnsafe(
2650 IN OUT PFAST_MUTEX FastMutex);
2651
2652 NTKERNELAPI
2653 BOOLEAN
2654 NTAPI
2655 ExAcquireResourceExclusiveLite(
2656 IN PERESOURCE Resource,
2657 IN BOOLEAN Wait);
2658
2659 NTKERNELAPI
2660 BOOLEAN
2661 NTAPI
2662 ExAcquireResourceSharedLite(
2663 IN PERESOURCE Resource,
2664 IN BOOLEAN Wait);
2665
2666 NTKERNELAPI
2667 BOOLEAN
2668 NTAPI
2669 ExAcquireSharedStarveExclusive(
2670 IN PERESOURCE Resource,
2671 IN BOOLEAN Wait);
2672
2673 NTKERNELAPI
2674 BOOLEAN
2675 NTAPI
2676 ExAcquireSharedWaitForExclusive(
2677 IN PERESOURCE Resource,
2678 IN BOOLEAN Wait);
2679
2680 NTKERNELAPI
2681 PVOID
2682 NTAPI
2683 ExAllocatePool(
2684 IN POOL_TYPE PoolType,
2685 IN SIZE_T NumberOfBytes);
2686
2687 #ifdef POOL_TAGGING
2688 #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
2689 #endif /* POOL_TAGGING */
2690
2691 NTKERNELAPI
2692 PVOID
2693 NTAPI
2694 ExAllocatePoolWithQuota(
2695 IN POOL_TYPE PoolType,
2696 IN SIZE_T NumberOfBytes);
2697
2698 #ifdef POOL_TAGGING
2699 #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
2700 #endif /* POOL_TAGGING */
2701
2702 NTKERNELAPI
2703 PVOID
2704 NTAPI
2705 ExAllocatePoolWithQuotaTag(
2706 IN POOL_TYPE PoolType,
2707 IN SIZE_T NumberOfBytes,
2708 IN ULONG Tag);
2709
2710 #ifndef POOL_TAGGING
2711 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
2712 #endif /* POOL_TAGGING */
2713
2714 NTKERNELAPI
2715 PVOID
2716 NTAPI
2717 ExAllocatePoolWithTag(
2718 IN POOL_TYPE PoolType,
2719 IN SIZE_T NumberOfBytes,
2720 IN ULONG Tag);
2721
2722 NTKERNELAPI
2723 PVOID
2724 NTAPI
2725 ExAllocatePoolWithTagPriority(
2726 IN POOL_TYPE PoolType,
2727 IN SIZE_T NumberOfBytes,
2728 IN ULONG Tag,
2729 IN EX_POOL_PRIORITY Priority);
2730
2731 NTKERNELAPI
2732 VOID
2733 NTAPI
2734 ExConvertExclusiveToSharedLite(
2735 IN PERESOURCE Resource);
2736
2737 NTKERNELAPI
2738 NTSTATUS
2739 NTAPI
2740 ExCreateCallback(
2741 OUT PCALLBACK_OBJECT *CallbackObject,
2742 IN POBJECT_ATTRIBUTES ObjectAttributes,
2743 IN BOOLEAN Create,
2744 IN BOOLEAN AllowMultipleCallbacks);
2745
2746 NTKERNELAPI
2747 VOID
2748 NTAPI
2749 ExDeleteNPagedLookasideList(
2750 IN PNPAGED_LOOKASIDE_LIST Lookaside);
2751
2752 NTKERNELAPI
2753 VOID
2754 NTAPI
2755 ExDeletePagedLookasideList(
2756 IN PPAGED_LOOKASIDE_LIST Lookaside);
2757
2758 NTKERNELAPI
2759 NTSTATUS
2760 NTAPI
2761 ExDeleteResourceLite(
2762 IN PERESOURCE Resource);
2763
2764 NTKERNELAPI
2765 VOID
2766 NTAPI
2767 ExFreePool(
2768 IN PVOID P);
2769
2770 #ifdef POOL_TAGGING
2771 #define ExFreePool(P) ExFreePoolWithTag(P, 0)
2772 #endif
2773
2774 NTKERNELAPI
2775 VOID
2776 NTAPI
2777 ExFreePoolWithTag(
2778 IN PVOID P,
2779 IN ULONG Tag);
2780
2781 NTKERNELAPI
2782 ULONG
2783 NTAPI
2784 ExGetExclusiveWaiterCount(
2785 IN PERESOURCE Resource);
2786
2787 NTKERNELAPI
2788 KPROCESSOR_MODE
2789 NTAPI
2790 ExGetPreviousMode(
2791 VOID);
2792
2793 NTKERNELAPI
2794 ULONG
2795 NTAPI
2796 ExGetSharedWaiterCount(
2797 IN PERESOURCE Resource);
2798
2799 NTKERNELAPI
2800 VOID
2801 NTAPI
2802 ExInitializeNPagedLookasideList(
2803 IN PNPAGED_LOOKASIDE_LIST Lookaside,
2804 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
2805 IN PFREE_FUNCTION Free OPTIONAL,
2806 IN ULONG Flags,
2807 IN SIZE_T Size,
2808 IN ULONG Tag,
2809 IN USHORT Depth);
2810
2811 NTKERNELAPI
2812 VOID
2813 NTAPI
2814 ExInitializePagedLookasideList(
2815 IN PPAGED_LOOKASIDE_LIST Lookaside,
2816 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
2817 IN PFREE_FUNCTION Free OPTIONAL,
2818 IN ULONG Flags,
2819 IN SIZE_T Size,
2820 IN ULONG Tag,
2821 IN USHORT Depth);
2822
2823 NTKERNELAPI
2824 NTSTATUS
2825 NTAPI
2826 ExInitializeResourceLite(
2827 IN PERESOURCE Resource);
2828
2829 NTKERNELAPI
2830 LARGE_INTEGER
2831 NTAPI
2832 ExInterlockedAddLargeInteger(
2833 IN PLARGE_INTEGER Addend,
2834 IN LARGE_INTEGER Increment,
2835 IN PKSPIN_LOCK Lock);
2836
2837 #if defined(_WIN64)
2838 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
2839 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
2840 #else
2841 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
2842 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
2843 #endif
2844
2845 NTKERNELAPI
2846 ULONG
2847 FASTCALL
2848 ExInterlockedAddUlong(
2849 IN PULONG Addend,
2850 IN ULONG Increment,
2851 PKSPIN_LOCK Lock);
2852
2853 #if defined(_AMD64_) || defined(_IA64_)
2854 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
2855 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
2856 #elif defined(_X86_)
2857 NTKERNELAPI
2858 LONGLONG
2859 FASTCALL
2860 ExfInterlockedCompareExchange64(
2861 IN OUT LONGLONG volatile *Destination,
2862 IN PLONGLONG Exchange,
2863 IN PLONGLONG Comperand);
2864 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
2865 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
2866 #else
2867 NTKERNELAPI
2868 LONGLONG
2869 FASTCALL
2870 ExInterlockedCompareExchange64(
2871 IN OUT LONGLONG volatile *Destination,
2872 IN PLONGLONG Exchange,
2873 IN PLONGLONG Comparand,
2874 IN PKSPIN_LOCK Lock);
2875 #endif
2876
2877 NTKERNELAPI
2878 PLIST_ENTRY
2879 FASTCALL
2880 ExInterlockedInsertHeadList(
2881 IN PLIST_ENTRY ListHead,
2882 IN PLIST_ENTRY ListEntry,
2883 IN PKSPIN_LOCK Lock);
2884
2885 NTKERNELAPI
2886 PLIST_ENTRY
2887 FASTCALL
2888 ExInterlockedInsertTailList(
2889 IN PLIST_ENTRY ListHead,
2890 IN PLIST_ENTRY ListEntry,
2891 IN PKSPIN_LOCK Lock);
2892
2893 NTKERNELAPI
2894 PSINGLE_LIST_ENTRY
2895 FASTCALL
2896 ExInterlockedPopEntryList(
2897 IN PSINGLE_LIST_ENTRY ListHead,
2898 IN PKSPIN_LOCK Lock);
2899
2900 NTKERNELAPI
2901 PSINGLE_LIST_ENTRY
2902 FASTCALL
2903 ExInterlockedPushEntryList(
2904 IN PSINGLE_LIST_ENTRY ListHead,
2905 IN PSINGLE_LIST_ENTRY ListEntry,
2906 IN PKSPIN_LOCK Lock);
2907
2908 NTKERNELAPI
2909 PLIST_ENTRY
2910 FASTCALL
2911 ExInterlockedRemoveHeadList(
2912 IN PLIST_ENTRY ListHead,
2913 IN PKSPIN_LOCK Lock);
2914
2915 NTKERNELAPI
2916 BOOLEAN
2917 NTAPI
2918 ExIsProcessorFeaturePresent(
2919 IN ULONG ProcessorFeature);
2920
2921 NTKERNELAPI
2922 BOOLEAN
2923 NTAPI
2924 ExIsResourceAcquiredExclusiveLite(
2925 IN PERESOURCE Resource);
2926
2927 NTKERNELAPI
2928 ULONG
2929 NTAPI
2930 ExIsResourceAcquiredSharedLite(
2931 IN PERESOURCE Resource);
2932
2933 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
2934
2935 NTKERNELAPI
2936 VOID
2937 NTAPI
2938 ExLocalTimeToSystemTime(
2939 IN PLARGE_INTEGER LocalTime,
2940 OUT PLARGE_INTEGER SystemTime);
2941
2942 NTKERNELAPI
2943 VOID
2944 NTAPI
2945 ExNotifyCallback(
2946 IN PCALLBACK_OBJECT CallbackObject,
2947 IN PVOID Argument1,
2948 IN PVOID Argument2);
2949
2950 NTKERNELAPI
2951 VOID
2952 NTAPI
2953 ExQueueWorkItem(
2954 IN PWORK_QUEUE_ITEM WorkItem,
2955 IN WORK_QUEUE_TYPE QueueType);
2956
2957 NTKERNELAPI
2958 DECLSPEC_NORETURN
2959 VOID
2960 NTAPI
2961 ExRaiseStatus(
2962 IN NTSTATUS Status);
2963
2964 NTKERNELAPI
2965 PVOID
2966 NTAPI
2967 ExRegisterCallback(
2968 IN PCALLBACK_OBJECT CallbackObject,
2969 IN PCALLBACK_FUNCTION CallbackFunction,
2970 IN PVOID CallbackContext);
2971
2972 NTKERNELAPI
2973 NTSTATUS
2974 NTAPI
2975 ExReinitializeResourceLite(
2976 IN PERESOURCE Resource);
2977
2978 NTKERNELAPI
2979 VOID
2980 NTAPI
2981 ExReleaseResourceForThreadLite(
2982 IN PERESOURCE Resource,
2983 IN ERESOURCE_THREAD ResourceThreadId);
2984
2985 NTKERNELAPI
2986 VOID
2987 FASTCALL
2988 ExReleaseResourceLite(
2989 IN PERESOURCE Resource);
2990
2991 NTKERNELAPI
2992 VOID
2993 NTAPI
2994 ExSetResourceOwnerPointer(
2995 IN PERESOURCE Resource,
2996 IN PVOID OwnerPointer);
2997
2998 NTKERNELAPI
2999 ULONG
3000 NTAPI
3001 ExSetTimerResolution(
3002 IN ULONG DesiredTime,
3003 IN BOOLEAN SetResolution);
3004
3005 NTKERNELAPI
3006 VOID
3007 NTAPI
3008 ExSystemTimeToLocalTime(
3009 IN PLARGE_INTEGER SystemTime,
3010 OUT PLARGE_INTEGER LocalTime);
3011
3012 NTKERNELAPI
3013 VOID
3014 NTAPI
3015 ExUnregisterCallback(
3016 IN PVOID CbRegistration);
3017
3018
3019 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
3020
3021 #if (NTDDI_VERSION >= NTDDI_WINXP)
3022 NTKERNELAPI
3023 BOOLEAN
3024 FASTCALL
3025 ExAcquireRundownProtection(
3026 IN OUT PEX_RUNDOWN_REF RunRef);
3027
3028 NTKERNELAPI
3029 VOID
3030 FASTCALL
3031 ExInitializeRundownProtection(
3032 OUT PEX_RUNDOWN_REF RunRef);
3033
3034 NTKERNELAPI
3035 VOID
3036 FASTCALL
3037 ExReInitializeRundownProtection(
3038 OUT PEX_RUNDOWN_REF RunRef);
3039
3040 NTKERNELAPI
3041 VOID
3042 FASTCALL
3043 ExReleaseRundownProtection(
3044 IN OUT PEX_RUNDOWN_REF RunRef);
3045
3046 NTKERNELAPI
3047 VOID
3048 FASTCALL
3049 ExRundownCompleted(
3050 OUT PEX_RUNDOWN_REF RunRef);
3051
3052 NTKERNELAPI
3053 BOOLEAN
3054 NTAPI
3055 ExVerifySuite(
3056 IN SUITE_TYPE SuiteType);
3057
3058 NTKERNELAPI
3059 VOID
3060 FASTCALL
3061 ExWaitForRundownProtectionRelease(
3062 IN OUT PEX_RUNDOWN_REF RunRef);
3063
3064 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
3065
3066 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
3067 NTKERNELAPI
3068 BOOLEAN
3069 FASTCALL
3070 ExAcquireRundownProtectionEx(
3071 IN OUT PEX_RUNDOWN_REF RunRef,
3072 IN ULONG Count);
3073
3074 NTKERNELAPI
3075 VOID
3076 FASTCALL
3077 ExReleaseRundownProtectionEx(
3078 IN OUT PEX_RUNDOWN_REF RunRef,
3079 IN ULONG Count);
3080 #endif // (NTDDI_VERSION >= NTDDI_WINXPSP2)
3081
3082 #if (NTDDI_VERSION >= NTDDI_WS03)
3083
3084 #endif // (NTDDI_VERSION >= NTDDI_WS03)
3085
3086 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
3087 NTKERNELAPI
3088 PEX_RUNDOWN_REF_CACHE_AWARE
3089 ExAllocateCacheAwareRundownProtection(
3090 IN POOL_TYPE PoolType,
3091 IN ULONG PoolTag);
3092
3093 NTKERNELAPI
3094 SIZE_T
3095 ExSizeOfRundownProtectionCacheAware(VOID);
3096
3097 #endif // (NTDDI_VERSION >= NTDDI_WS03SP1)
3098
3099 #if (NTDDI_VERSION >= NTDDI_VISTA)
3100 NTKERNELAPI
3101 NTSTATUS
3102 ExInitializeLookasideListEx(
3103 OUT PLOOKASIDE_LIST_EX Lookaside,
3104 IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL,
3105 IN PFREE_FUNCTION_EX Free OPTIONAL,
3106 IN POOL_TYPE PoolType,
3107 IN ULONG Flags,
3108 IN SIZE_T Size,
3109 IN ULONG Tag,
3110 IN USHORT Depth);
3111 #endif
3112
3113
3114 #if !defined(MIDL_PASS)
3115
3116 static __inline PVOID
3117 ExAllocateFromNPagedLookasideList(
3118 IN PNPAGED_LOOKASIDE_LIST Lookaside)
3119 {
3120 PVOID Entry;
3121
3122 Lookaside->L.TotalAllocates++;
3123 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
3124 if (Entry == NULL) {
3125 Lookaside->L.AllocateMisses++;
3126 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
3127 Lookaside->L.Size,
3128 Lookaside->L.Tag);
3129 }
3130 return Entry;
3131 }
3132
3133 static __inline PVOID
3134 ExAllocateFromPagedLookasideList(
3135 IN PPAGED_LOOKASIDE_LIST Lookaside)
3136 {
3137 PVOID Entry;
3138
3139 Lookaside->L.TotalAllocates++;
3140 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
3141 if (Entry == NULL) {
3142 Lookaside->L.AllocateMisses++;
3143 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
3144 Lookaside->L.Size,
3145 Lookaside->L.Tag);
3146 }
3147 return Entry;
3148 }
3149
3150 static __inline VOID
3151 ExFreeToNPagedLookasideList(
3152 IN PNPAGED_LOOKASIDE_LIST Lookaside,
3153 IN PVOID Entry)
3154 {
3155 Lookaside->L.TotalFrees++;
3156 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
3157 Lookaside->L.FreeMisses++;
3158 (Lookaside->L.Free)(Entry);
3159 } else {
3160 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
3161 }
3162 }
3163
3164 static __inline VOID
3165 ExFreeToPagedLookasideList(
3166 IN PPAGED_LOOKASIDE_LIST Lookaside,
3167 IN PVOID Entry)
3168 {
3169 Lookaside->L.TotalFrees++;
3170 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
3171 Lookaside->L.FreeMisses++;
3172 (Lookaside->L.Free)(Entry);
3173 } else {
3174 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
3175 }
3176 }
3177
3178
3179 #endif // !defined(MIDL_PASS)
3180
3181
3182 #ifdef __cplusplus
3183 }
3184 #endif
3185
3186 #endif // _WDMDDK_