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