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