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