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