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