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