14 #endif /* GUID_DEFINED */
25 /* HACKHACKHACK!!! We shouldn't include this header from ntoskrnl! */
28 #define NTKERNELAPI DECLSPEC_IMPORT
32 typedef UCHAR KPROCESSOR_MODE
;
33 typedef LONG KPRIORITY
;
34 typedef PVOID PSECURITY_DESCRIPTOR
;
35 typedef ULONG SECURITY_INFORMATION
, *PSECURITY_INFORMATION
;
37 /* Structures not exposed to drivers */
38 typedef struct _OBJECT_TYPE
*POBJECT_TYPE
;
39 typedef struct _HAL_DISPATCH_TABLE
*PHAL_DISPATCH_TABLE
;
40 typedef struct _HAL_PRIVATE_DISPATCH_TABLE
*PHAL_PRIVATE_DISPATCH_TABLE
;
41 typedef struct _DEVICE_HANDLER_OBJECT
*PDEVICE_HANDLER_OBJECT
;
42 typedef struct _BUS_HANDLER
*PBUS_HANDLER
;
44 typedef struct _ADAPTER_OBJECT
*PADAPTER_OBJECT
;
45 typedef struct _CALLBACK_OBJECT
*PCALLBACK_OBJECT
;
46 typedef struct _ETHREAD
*PETHREAD
;
47 typedef struct _EPROCESS
*PEPROCESS
;
48 typedef struct _IO_TIMER
*PIO_TIMER
;
49 typedef struct _KINTERRUPT
*PKINTERRUPT
;
50 typedef struct _KPROCESS
*PKPROCESS
;
51 typedef struct _KTHREAD
*PKTHREAD
, *PRKTHREAD
;
54 typedef struct _CONTEXT
*PCONTEXT
;
57 // Resource list definitions
59 typedef int CM_RESOURCE_TYPE
;
61 #define CmResourceTypeNull 0
62 #define CmResourceTypePort 1
63 #define CmResourceTypeInterrupt 2
64 #define CmResourceTypeMemory 3
65 #define CmResourceTypeDma 4
66 #define CmResourceTypeDeviceSpecific 5
67 #define CmResourceTypeBusNumber 6
68 #define CmResourceTypeNonArbitrated 128
69 #define CmResourceTypeConfigData 128
70 #define CmResourceTypeDevicePrivate 129
71 #define CmResourceTypePcCardConfig 130
72 #define CmResourceTypeMfCardConfig 131
79 extern ULONG NtGlobalFlag
;
84 // Section map options
86 typedef enum _SECTION_INHERIT
{
92 // Section access rights
94 #define SECTION_QUERY 0x0001
95 #define SECTION_MAP_WRITE 0x0002
96 #define SECTION_MAP_READ 0x0004
97 #define SECTION_MAP_EXECUTE 0x0008
98 #define SECTION_EXTEND_SIZE 0x0010
99 #define SECTION_MAP_EXECUTE_EXPLICIT 0x0020
101 #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
102 SECTION_MAP_WRITE | \
104 SECTION_MAP_EXECUTE | \
107 #define SESSION_QUERY_ACCESS 0x0001
108 #define SESSION_MODIFY_ACCESS 0x0002
110 #define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
111 SESSION_QUERY_ACCESS | \
112 SESSION_MODIFY_ACCESS)
116 #define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
118 #define PAGE_NOACCESS 0x01
119 #define PAGE_READONLY 0x02
120 #define PAGE_READWRITE 0x04
121 #define PAGE_WRITECOPY 0x08
122 #define PAGE_EXECUTE 0x10
123 #define PAGE_EXECUTE_READ 0x20
124 #define PAGE_EXECUTE_READWRITE 0x40
125 #define PAGE_EXECUTE_WRITECOPY 0x80
126 #define PAGE_GUARD 0x100
127 #define PAGE_NOCACHE 0x200
128 #define PAGE_WRITECOMBINE 0x400
130 #define MEM_COMMIT 0x1000
131 #define MEM_RESERVE 0x2000
132 #define MEM_DECOMMIT 0x4000
133 #define MEM_RELEASE 0x8000
134 #define MEM_FREE 0x10000
135 #define MEM_PRIVATE 0x20000
136 #define MEM_MAPPED 0x40000
137 #define MEM_RESET 0x80000
138 #define MEM_TOP_DOWN 0x100000
139 #define MEM_LARGE_PAGES 0x20000000
140 #define MEM_4MB_PAGES 0x80000000
142 #define SEC_RESERVE 0x4000000
143 #define SEC_LARGE_PAGES 0x80000000
145 #define PROCESS_DUP_HANDLE (0x0040)
147 #if (NTDDI_VERSION >= NTDDI_VISTA)
148 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
151 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
158 // Processor features
160 #define PF_FLOATING_POINT_PRECISION_ERRATA 0
161 #define PF_FLOATING_POINT_EMULATED 1
162 #define PF_COMPARE_EXCHANGE_DOUBLE 2
163 #define PF_MMX_INSTRUCTIONS_AVAILABLE 3
164 #define PF_PPC_MOVEMEM_64BIT_OK 4
165 #define PF_ALPHA_BYTE_INSTRUCTIONS 5
166 #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
167 #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
168 #define PF_RDTSC_INSTRUCTION_AVAILABLE 8
169 #define PF_PAE_ENABLED 9
170 #define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
171 #define PF_SSE_DAZ_MODE_AVAILABLE 11
172 #define PF_NX_ENABLED 12
173 #define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
174 #define PF_COMPARE_EXCHANGE128 14
175 #define PF_COMPARE64_EXCHANGE128 15
176 #define PF_CHANNELS_ENABLED 16
181 // Intrinsics (note: taken from our winnt.h)
184 #if defined(__GNUC__)
186 static __inline__ BOOLEAN
187 InterlockedBitTestAndSet(IN LONG
volatile *Base
,
192 __asm__
__volatile__("lock "
195 :"=r" (OldBit
),"+m" (*Base
)
200 return (_InterlockedOr(Base
, 1 << Bit
) >> Bit
) & 1;
204 static __inline__ BOOLEAN
205 InterlockedBitTestAndReset(IN LONG
volatile *Base
,
210 __asm__
__volatile__("lock "
213 :"=r" (OldBit
),"+m" (*Base
)
218 return (_InterlockedAnd(Base
, ~(1 << Bit
)) >> Bit
) & 1;
224 #define BitScanForward _BitScanForward
225 #define BitScanReverse _BitScanReverse
228 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
229 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
234 #define YieldProcessor _mm_pause
235 #elif defined (_M_AMD64)
236 #define YieldProcessor _mm_pause
237 #elif defined(_M_PPC)
238 #define YieldProcessor() __asm__ __volatile__("nop");
239 #elif defined(_M_MIPS)
240 #define YieldProcessor() __asm__ __volatile__("nop");
241 #elif defined(_M_ARM)
242 #define YieldProcessor()
244 #error Unknown architecture
252 #ifndef _SLIST_HEADER_
253 #define _SLIST_HEADER_
255 #define SLIST_ENTRY SINGLE_LIST_ENTRY
256 #define _SLIST_ENTRY _SINGLE_LIST_ENTRY
257 #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
260 typedef union _SLIST_HEADER
{
267 ULONGLONG Sequence
:9;
268 ULONGLONG NextEntry
:39;
269 ULONGLONG HeaderType
:1;
271 ULONGLONG Reserved
:59;
275 ULONGLONG Sequence
:48;
276 ULONGLONG HeaderType
:1;
278 ULONGLONG Reserved
:2;
282 } SLIST_HEADER
, *PSLIST_HEADER
;
284 typedef union _SLIST_HEADER
{
291 } SLIST_HEADER
, *PSLIST_HEADER
;
294 #endif /* _SLIST_HEADER_ */
299 // Power States/Levels
301 typedef enum _SYSTEM_POWER_STATE
{
302 PowerSystemUnspecified
,
304 PowerSystemSleeping1
,
305 PowerSystemSleeping2
,
306 PowerSystemSleeping3
,
307 PowerSystemHibernate
,
310 } SYSTEM_POWER_STATE
, *PSYSTEM_POWER_STATE
;
312 #define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
314 typedef enum _POWER_INFORMATION_LEVEL
{
317 VerifySystemPolicyAc
,
318 VerifySystemPolicyDc
,
319 SystemPowerCapabilities
,
321 SystemPowerStateHandler
,
322 ProcessorStateHandler
,
323 SystemPowerPolicyCurrent
,
324 AdministratorPowerPolicy
,
325 SystemReserveHiberFile
,
326 ProcessorInformation
,
327 SystemPowerInformation
,
328 ProcessorStateHandler2
,
331 SystemExecutionState
,
332 SystemPowerStateNotifyHandler
,
333 ProcessorPowerPolicyAc
,
334 ProcessorPowerPolicyDc
,
335 VerifyProcessorPowerPolicyAc
,
336 VerifyProcessorPowerPolicyDc
,
337 ProcessorPowerPolicyCurrent
338 } POWER_INFORMATION_LEVEL
;
344 PowerActionHibernate
,
346 PowerActionShutdownReset
,
347 PowerActionShutdownOff
,
349 } POWER_ACTION
, *PPOWER_ACTION
;
351 typedef enum _DEVICE_POWER_STATE
{
352 PowerDeviceUnspecified
,
358 } DEVICE_POWER_STATE
, *PDEVICE_POWER_STATE
;
360 #define ES_SYSTEM_REQUIRED 0x00000001
361 #define ES_DISPLAY_REQUIRED 0x00000002
362 #define ES_USER_PRESENT 0x00000004
363 #define ES_CONTINUOUS 0x80000000
365 typedef ULONG EXECUTION_STATE
;
375 // Access/Security Stuff
377 typedef ULONG ACCESS_MASK
, *PACCESS_MASK
;
378 typedef PVOID PACCESS_TOKEN
;
380 #define DELETE 0x00010000L
381 #define READ_CONTROL 0x00020000L
382 #define WRITE_DAC 0x00040000L
383 #define WRITE_OWNER 0x00080000L
384 #define SYNCHRONIZE 0x00100000L
385 #define STANDARD_RIGHTS_REQUIRED 0x000F0000L
386 #define STANDARD_RIGHTS_READ READ_CONTROL
387 #define STANDARD_RIGHTS_WRITE READ_CONTROL
388 #define STANDARD_RIGHTS_EXECUTE READ_CONTROL
389 #define STANDARD_RIGHTS_ALL 0x001F0000L
390 #define SPECIFIC_RIGHTS_ALL 0x0000FFFFL
391 #define ACCESS_SYSTEM_SECURITY 0x01000000L
392 #define MAXIMUM_ALLOWED 0x02000000L
393 #define GENERIC_READ 0x80000000L
394 #define GENERIC_WRITE 0x40000000L
395 #define GENERIC_EXECUTE 0x20000000L
396 #define GENERIC_ALL 0x10000000L
398 typedef struct _GENERIC_MAPPING
{
399 ACCESS_MASK GenericRead
;
400 ACCESS_MASK GenericWrite
;
401 ACCESS_MASK GenericExecute
;
402 ACCESS_MASK GenericAll
;
403 } GENERIC_MAPPING
, *PGENERIC_MAPPING
;
405 #define ACL_REVISION 2
406 #define ACL_REVISION_DS 4
408 #define ACL_REVISION1 1
409 #define ACL_REVISION2 2
410 #define ACL_REVISION3 3
411 #define ACL_REVISION4 4
412 #define MIN_ACL_REVISION ACL_REVISION2
413 #define MAX_ACL_REVISION ACL_REVISION4
415 typedef struct _ACL
{
426 // Current security descriptor revision value
428 #define SECURITY_DESCRIPTOR_REVISION (1)
429 #define SECURITY_DESCRIPTOR_REVISION1 (1)
432 // Privilege attributes
434 #define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
435 #define SE_PRIVILEGE_ENABLED (0x00000002L)
436 #define SE_PRIVILEGE_REMOVED (0X00000004L)
437 #define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
439 #define SE_PRIVILEGE_VALID_ATTRIBUTES (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
440 SE_PRIVILEGE_ENABLED | \
441 SE_PRIVILEGE_REMOVED | \
442 SE_PRIVILEGE_USED_FOR_ACCESS)
444 #include <pshpack4.h>
445 typedef struct _LUID_AND_ATTRIBUTES
{
448 } LUID_AND_ATTRIBUTES
, *PLUID_AND_ATTRIBUTES
;
450 typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY
[ANYSIZE_ARRAY
];
451 typedef LUID_AND_ATTRIBUTES_ARRAY
*PLUID_AND_ATTRIBUTES_ARRAY
;
458 #define PRIVILEGE_SET_ALL_NECESSARY (1)
460 typedef struct _PRIVILEGE_SET
{
461 ULONG PrivilegeCount
;
463 LUID_AND_ATTRIBUTES Privilege
[ANYSIZE_ARRAY
];
464 } PRIVILEGE_SET
,*PPRIVILEGE_SET
;
466 typedef enum _SECURITY_IMPERSONATION_LEVEL
{
468 SecurityIdentification
,
469 SecurityImpersonation
,
471 } SECURITY_IMPERSONATION_LEVEL
, * PSECURITY_IMPERSONATION_LEVEL
;
473 #define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
474 #define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
475 #define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
476 #define VALID_IMPERSONATION_LEVEL(Level) (((Level) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((Level) <= SECURITY_MAX_IMPERSONATION_LEVEL))
478 #define SECURITY_DYNAMIC_TRACKING (TRUE)
479 #define SECURITY_STATIC_TRACKING (FALSE)
481 typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE
, *PSECURITY_CONTEXT_TRACKING_MODE
;
483 typedef struct _SECURITY_QUALITY_OF_SERVICE
{
485 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
;
486 SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode
;
487 BOOLEAN EffectiveOnly
;
488 } SECURITY_QUALITY_OF_SERVICE
, *PSECURITY_QUALITY_OF_SERVICE
;
490 typedef struct _SE_IMPERSONATION_STATE
{
493 BOOLEAN EffectiveOnly
;
494 SECURITY_IMPERSONATION_LEVEL Level
;
495 } SE_IMPERSONATION_STATE
, *PSE_IMPERSONATION_STATE
;
497 #define OWNER_SECURITY_INFORMATION (0x00000001L)
498 #define GROUP_SECURITY_INFORMATION (0x00000002L)
499 #define DACL_SECURITY_INFORMATION (0x00000004L)
500 #define SACL_SECURITY_INFORMATION (0x00000008L)
501 #define LABEL_SECURITY_INFORMATION (0x00000010L)
503 #define PROTECTED_DACL_SECURITY_INFORMATION (0x80000000L)
504 #define PROTECTED_SACL_SECURITY_INFORMATION (0x40000000L)
505 #define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L)
506 #define UNPROTECTED_SACL_SECURITY_INFORMATION (0x10000000L)
511 // Registry Access Rights
513 #define KEY_QUERY_VALUE (0x0001)
514 #define KEY_SET_VALUE (0x0002)
515 #define KEY_CREATE_SUB_KEY (0x0004)
516 #define KEY_ENUMERATE_SUB_KEYS (0x0008)
517 #define KEY_NOTIFY (0x0010)
518 #define KEY_CREATE_LINK (0x0020)
519 #define KEY_WOW64_32KEY (0x0200)
520 #define KEY_WOW64_64KEY (0x0100)
521 #define KEY_WOW64_RES (0x0300)
523 #define KEY_READ ((STANDARD_RIGHTS_READ |\
525 KEY_ENUMERATE_SUB_KEYS |\
530 #define KEY_WRITE ((STANDARD_RIGHTS_WRITE |\
532 KEY_CREATE_SUB_KEY) \
536 #define KEY_EXECUTE ((KEY_READ) \
540 #define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL |\
543 KEY_CREATE_SUB_KEY |\
544 KEY_ENUMERATE_SUB_KEYS |\
551 // Registry Open/Create Options
553 #define REG_OPTION_RESERVED (0x00000000L)
554 #define REG_OPTION_NON_VOLATILE (0x00000000L)
555 #define REG_OPTION_VOLATILE (0x00000001L)
556 #define REG_OPTION_CREATE_LINK (0x00000002L)
557 #define REG_OPTION_BACKUP_RESTORE (0x00000004L)
558 #define REG_OPTION_OPEN_LINK (0x00000008L)
560 #define REG_LEGAL_OPTION \
561 (REG_OPTION_RESERVED |\
562 REG_OPTION_NON_VOLATILE |\
563 REG_OPTION_VOLATILE |\
564 REG_OPTION_CREATE_LINK |\
565 REG_OPTION_BACKUP_RESTORE |\
566 REG_OPTION_OPEN_LINK)
569 // Key creation/open disposition
571 #define REG_CREATED_NEW_KEY (0x00000001L)
572 #define REG_OPENED_EXISTING_KEY (0x00000002L)
575 // Key restore & hive load flags
577 #define REG_WHOLE_HIVE_VOLATILE (0x00000001L)
578 #define REG_REFRESH_HIVE (0x00000002L)
579 #define REG_NO_LAZY_FLUSH (0x00000004L)
580 #define REG_FORCE_RESTORE (0x00000008L)
581 #define REG_APP_HIVE (0x00000010L)
582 #define REG_PROCESS_PRIVATE (0x00000020L)
583 #define REG_START_JOURNAL (0x00000040L)
584 #define REG_HIVE_EXACT_FILE_GROWTH (0x00000080L)
585 #define REG_HIVE_NO_RM (0x00000100L)
586 #define REG_HIVE_SINGLE_LOG (0x00000200L)
591 #define REG_FORCE_UNLOAD 1
594 // Notify Filter Values
596 #define REG_NOTIFY_CHANGE_NAME (0x00000001L)
597 #define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L)
598 #define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L)
599 #define REG_NOTIFY_CHANGE_SECURITY (0x00000008L)
601 #define REG_LEGAL_CHANGE_FILTER \
602 (REG_NOTIFY_CHANGE_NAME |\
603 REG_NOTIFY_CHANGE_ATTRIBUTES |\
604 REG_NOTIFY_CHANGE_LAST_SET |\
605 REG_NOTIFY_CHANGE_SECURITY)
610 // Thread Access Rights
612 #define THREAD_TERMINATE (0x0001)
613 #define THREAD_SUSPEND_RESUME (0x0002)
614 #define THREAD_ALERT (0x0004)
615 #define THREAD_GET_CONTEXT (0x0008)
616 #define THREAD_SET_CONTEXT (0x0010)
617 #define THREAD_SET_INFORMATION (0x0020)
618 #define THREAD_SET_LIMITED_INFORMATION (0x0400)
619 #define THREAD_QUERY_LIMITED_INFORMATION (0x0800)
620 #if (NTDDI_VERSION >= NTDDI_VISTA)
621 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
624 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
629 // Service Start Types
631 #define SERVICE_BOOT_START 0x00000000
632 #define SERVICE_SYSTEM_START 0x00000001
633 #define SERVICE_AUTO_START 0x00000002
634 #define SERVICE_DEMAND_START 0x00000003
635 #define SERVICE_DISABLED 0x00000004
640 #define EXCEPTION_NONCONTINUABLE 1
641 #define EXCEPTION_MAXIMUM_PARAMETERS 15
643 typedef struct _EXCEPTION_RECORD
{
644 NTSTATUS ExceptionCode
;
645 ULONG ExceptionFlags
;
646 struct _EXCEPTION_RECORD
*ExceptionRecord
;
647 PVOID ExceptionAddress
;
648 ULONG NumberParameters
;
649 ULONG_PTR ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
650 } EXCEPTION_RECORD
, *PEXCEPTION_RECORD
;
652 typedef struct _EXCEPTION_RECORD32
{
653 NTSTATUS ExceptionCode
;
654 ULONG ExceptionFlags
;
655 ULONG ExceptionRecord
;
656 ULONG ExceptionAddress
;
657 ULONG NumberParameters
;
658 ULONG ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
659 } EXCEPTION_RECORD32
, *PEXCEPTION_RECORD32
;
661 typedef struct _EXCEPTION_RECORD64
{
662 NTSTATUS ExceptionCode
;
663 ULONG ExceptionFlags
;
664 ULONG64 ExceptionRecord
;
665 ULONG64 ExceptionAddress
;
666 ULONG NumberParameters
;
667 ULONG __unusedAlignment
;
668 ULONG64 ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
669 } EXCEPTION_RECORD64
, *PEXCEPTION_RECORD64
;
671 typedef struct _EXCEPTION_POINTERS
{
672 PEXCEPTION_RECORD ExceptionRecord
;
673 PCONTEXT ContextRecord
;
674 } EXCEPTION_POINTERS
, *PEXCEPTION_POINTERS
;
681 typedef struct _QUOTA_LIMITS
{
682 SIZE_T PagedPoolLimit
;
683 SIZE_T NonPagedPoolLimit
;
684 SIZE_T MinimumWorkingSetSize
;
685 SIZE_T MaximumWorkingSetSize
;
686 SIZE_T PagefileLimit
;
687 LARGE_INTEGER TimeLimit
;
688 } QUOTA_LIMITS
, *PQUOTA_LIMITS
;
690 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
691 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
692 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
693 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
694 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
696 /******************************************************************************
698 ******************************************************************************/
700 typedef struct _DISPATCHER_HEADER
726 LIST_ENTRY WaitListHead
;
727 } DISPATCHER_HEADER
, *PDISPATCHER_HEADER
;
729 typedef ULONG_PTR KSPIN_LOCK
, *PKSPIN_LOCK
;
731 typedef struct _KEVENT
{
732 DISPATCHER_HEADER Header
;
733 } KEVENT
, *PKEVENT
, *RESTRICTED_POINTER PRKEVENT
;
735 typedef struct _KSEMAPHORE
{
736 DISPATCHER_HEADER Header
;
738 } KSEMAPHORE
, *PKSEMAPHORE
, *RESTRICTED_POINTER PRKSEMAPHORE
;
740 /******************************************************************************
742 ******************************************************************************/
744 #define RTL_REGISTRY_ABSOLUTE 0
745 #define RTL_REGISTRY_SERVICES 1
746 #define RTL_REGISTRY_CONTROL 2
747 #define RTL_REGISTRY_WINDOWS_NT 3
748 #define RTL_REGISTRY_DEVICEMAP 4
749 #define RTL_REGISTRY_USER 5
750 #define RTL_REGISTRY_MAXIMUM 6
751 #define RTL_REGISTRY_HANDLE 0x40000000
752 #define RTL_REGISTRY_OPTIONAL 0x80000000
754 /* RTL_QUERY_REGISTRY_TABLE.Flags */
755 #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001
756 #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002
757 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004
758 #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008
759 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010
760 #define RTL_QUERY_REGISTRY_DIRECT 0x00000020
761 #define RTL_QUERY_REGISTRY_DELETE 0x00000040
763 typedef struct _RTL_BITMAP
{
766 } RTL_BITMAP
, *PRTL_BITMAP
;
768 typedef struct _RTL_BITMAP_RUN
{
771 } RTL_BITMAP_RUN
, *PRTL_BITMAP_RUN
;
774 (DDKAPI
*PRTL_QUERY_REGISTRY_ROUTINE
)(
778 IN ULONG ValueLength
,
780 IN PVOID EntryContext
);
782 typedef struct _RTL_QUERY_REGISTRY_TABLE
{
783 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine
;
790 } RTL_QUERY_REGISTRY_TABLE
, *PRTL_QUERY_REGISTRY_TABLE
;
792 typedef struct _TIME_FIELDS
{
801 } TIME_FIELDS
, *PTIME_FIELDS
;
804 /******************************************************************************
806 ******************************************************************************/
812 IN PVOID FailedAssertion
,
819 * IN VOID UNALIGNED *Destination,
820 * IN CONST VOID UNALIGNED *Source,
823 #define RtlCopyMemory(Destination, Source, Length) \
824 memcpy(Destination, Source, Length)
826 #define RtlCopyBytes RtlCopyMemory
828 #if defined(_M_AMD64)
832 RtlCopyMemoryNonTemporal(
833 VOID UNALIGNED
*Destination
,
834 CONST VOID UNALIGNED
*Source
,
837 #define RtlCopyMemoryNonTemporal RtlCopyMemory
845 #define RtlEqualLuid(Luid1, Luid2) \
846 (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
850 * IN VOID UNALIGNED *Destination,
851 * IN CONST VOID UNALIGNED *Source,
854 #define RtlEqualMemory(Destination, Source, Length) \
855 (!memcmp(Destination, Source, Length))
859 * IN VOID UNALIGNED *Destination,
863 #define RtlFillMemory(Destination, Length, Fill) \
864 memset(Destination, Fill, Length)
866 #define RtlFillBytes RtlFillMemory
871 RtlFreeUnicodeString(
872 IN PUNICODE_STRING UnicodeString
);
878 IN PUNICODE_STRING GuidString
,
884 RtlInitUnicodeString(
885 IN OUT PUNICODE_STRING DestinationString
,
886 IN PCWSTR SourceString
);
890 * IN VOID UNALIGNED *Destination,
891 * IN CONST VOID UNALIGNED *Source,
894 #define RtlMoveMemory(Destination, Source, Length) \
895 memmove(Destination, Source, Length)
902 OUT PUNICODE_STRING GuidString
);
906 * IN VOID UNALIGNED *Destination,
909 #define RtlZeroMemory(Destination, Length) \
910 memset(Destination, 0, Length)
912 #define RtlZeroBytes RtlZeroMemory
915 #if (NTDDI_VERSION >= NTDDI_WIN2K)
920 IN PRTL_BITMAP BitMapHeader
,
921 IN ULONG StartingIndex
,
928 IN PRTL_BITMAP BitMapHeader
,
929 IN ULONG StartingIndex
,
935 RtlAnsiStringToUnicodeString(
936 IN OUT PUNICODE_STRING DestinationString
,
937 IN PANSI_STRING SourceString
,
938 IN BOOLEAN AllocateDestinationString
);
943 RtlxAnsiStringToUnicodeSize(
944 IN PCANSI_STRING AnsiString
);
946 #define RtlAnsiStringToUnicodeSize(String) ( \
947 NLS_MB_CODE_PAGE_TAG ? \
948 RtlxAnsiStringToUnicodeSize(String) : \
949 ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
955 RtlAppendUnicodeStringToString(
956 IN OUT PUNICODE_STRING Destination
,
957 IN PCUNICODE_STRING Source
);
962 RtlAppendUnicodeToString(
963 IN OUT PUNICODE_STRING Destination
,
977 IN PRTL_BITMAP BitMapHeader
);
983 IN PRTL_BITMAP BitMapHeader
,
984 IN ULONG StartingIndex
,
985 IN ULONG NumberToClear
);
991 IN CONST VOID
*Source1
,
992 IN CONST VOID
*Source2
,
998 RtlCompareUnicodeString(
999 IN PCUNICODE_STRING String1
,
1000 IN PCUNICODE_STRING String2
,
1001 IN BOOLEAN CaseInSensitive
);
1006 RtlCompareUnicodeStrings(
1008 IN SIZE_T String1Length
,
1010 IN SIZE_T String2Length
,
1011 IN BOOLEAN CaseInSensitive
);
1016 RtlCopyUnicodeString(
1017 IN OUT PUNICODE_STRING DestinationString
,
1018 IN PCUNICODE_STRING SourceString
);
1023 RtlCreateRegistryKey(
1024 IN ULONG RelativeTo
,
1030 RtlCreateSecurityDescriptor(
1031 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
1037 RtlDeleteRegistryValue(
1038 IN ULONG RelativeTo
,
1040 IN PCWSTR ValueName
);
1045 RtlEqualUnicodeString(
1046 IN CONST UNICODE_STRING
*String1
,
1047 IN CONST UNICODE_STRING
*String2
,
1048 IN BOOLEAN CaseInSensitive
);
1054 IN PANSI_STRING AnsiString
);
1060 IN PRTL_BITMAP BitMapHeader
,
1061 IN ULONG NumberToFind
,
1062 IN ULONG HintIndex
);
1067 RtlFindClearBitsAndSet(
1068 IN PRTL_BITMAP BitMapHeader
,
1069 IN ULONG NumberToFind
,
1070 IN ULONG HintIndex
);
1075 RtlFindFirstRunClear(
1076 IN PRTL_BITMAP BitMapHeader
,
1077 OUT PULONG StartingIndex
);
1083 IN PRTL_BITMAP BitMapHeader
,
1084 OUT PRTL_BITMAP_RUN RunArray
,
1085 IN ULONG SizeOfRunArray
,
1086 IN BOOLEAN LocateLongestRuns
);
1091 RtlFindLastBackwardRunClear(
1092 IN PRTL_BITMAP BitMapHeader
,
1094 OUT PULONG StartingRunIndex
);
1099 RtlFindLeastSignificantBit(
1105 RtlFindLongestRunClear(
1106 IN PRTL_BITMAP BitMapHeader
,
1107 OUT PULONG StartingIndex
);
1112 RtlFindMostSignificantBit(
1118 RtlFindNextForwardRunClear(
1119 IN PRTL_BITMAP BitMapHeader
,
1121 OUT PULONG StartingRunIndex
);
1127 IN PRTL_BITMAP BitMapHeader
,
1128 IN ULONG NumberToFind
,
1129 IN ULONG HintIndex
);
1134 RtlFindSetBitsAndClear(
1135 IN PRTL_BITMAP BitMapHeader
,
1136 IN ULONG NumberToFind
,
1137 IN ULONG HintIndex
);
1142 RtlHashUnicodeString(
1143 IN CONST UNICODE_STRING
*String
,
1144 IN BOOLEAN CaseInSensitive
,
1145 IN ULONG HashAlgorithm
,
1146 OUT PULONG HashValue
);
1152 IN OUT PANSI_STRING DestinationString
,
1153 IN PCSZ SourceString
);
1158 RtlInitializeBitMap(
1159 IN PRTL_BITMAP BitMapHeader
,
1160 IN PULONG BitMapBuffer
,
1161 IN ULONG SizeOfBitMap
);
1167 IN OUT PSTRING DestinationString
,
1168 IN PCSZ SourceString
);
1173 RtlIntegerToUnicodeString(
1175 IN ULONG Base OPTIONAL
,
1176 IN OUT PUNICODE_STRING String
);
1181 RtlInt64ToUnicodeString(
1183 IN ULONG Base OPTIONAL
,
1184 IN OUT PUNICODE_STRING String
);
1187 #define RtlIntPtrToUnicodeString(Value, Base, String) \
1188 RtlInt64ToUnicodeString(Value, Base, String)
1190 #define RtlIntPtrToUnicodeString(Value, Base, String) \
1191 RtlIntegerToUnicodeString(Value, Base, String)
1198 #define RtlIsZeroLuid(_L1) \
1199 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
1204 RtlLengthSecurityDescriptor(
1205 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
1210 RtlNumberOfClearBits(
1211 IN PRTL_BITMAP BitMapHeader
);
1217 IN PRTL_BITMAP BitMapHeader
);
1222 RtlQueryRegistryValues(
1223 IN ULONG RelativeTo
,
1225 IN PRTL_QUERY_REGISTRY_TABLE QueryTable
,
1227 IN PVOID Environment OPTIONAL
);
1229 #define LONG_SIZE (sizeof(LONG))
1230 #define LONG_MASK (LONG_SIZE - 1)
1234 * PULONG DestinationAddress,
1235 * PULONG SourceAddress);
1237 #if defined(_AMD64_)
1238 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
1239 *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
1241 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
1242 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
1244 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
1245 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
1246 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
1247 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
1251 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
1256 * RtlRetrieveUshort(
1257 * PUSHORT DestinationAddress,
1258 * PUSHORT SourceAddress);
1260 #if defined(_AMD64_)
1261 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
1262 *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
1264 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
1265 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
1267 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
1268 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
1272 *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
1280 IN PRTL_BITMAP BitMapHeader
);
1286 IN PRTL_BITMAP BitMapHeader
,
1287 IN ULONG StartingIndex
,
1288 IN ULONG NumberToSet
);
1293 RtlSetDaclSecurityDescriptor(
1294 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
1295 IN BOOLEAN DaclPresent
,
1296 IN PACL Dacl OPTIONAL
,
1297 IN BOOLEAN DaclDefaulted OPTIONAL
);
1301 * IN PULONG Address,
1304 #if defined(_AMD64_)
1305 #define RtlStoreUlong(Address,Value) \
1306 *(ULONG UNALIGNED *)(Address) = (Value)
1308 #define RtlStoreUlong(Address,Value) \
1309 if ((ULONG_PTR)(Address) & LONG_MASK) { \
1310 ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
1311 ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
1312 ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
1313 ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT] = (UCHAR)(FOURTHBYTE(Value)); \
1316 *((PULONG)(Address)) = (ULONG) (Value); \
1321 * RtlStoreUlonglong(
1322 * IN OUT PULONGLONG Address,
1325 #if defined(_AMD64_)
1326 #define RtlStoreUlonglong(Address,Value) \
1327 *(ULONGLONG UNALIGNED *)(Address) = (Value)
1329 #define RtlStoreUlonglong(Address,Value) \
1330 if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
1331 RtlStoreUlong((ULONG_PTR)(Address), \
1332 (ULONGLONG)(Value) & 0xFFFFFFFF); \
1333 RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
1334 (ULONGLONG)(Value) >> 32); \
1336 *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
1342 * IN OUT PULONG_PTR Address,
1343 * IN ULONG_PTR Value);
1346 #define RtlStoreUlongPtr(Address,Value) \
1347 RtlStoreUlonglong(Address,Value)
1349 #define RtlStoreUlongPtr(Address,Value) \
1350 RtlStoreUlong(Address,Value)
1355 * IN PUSHORT Address,
1358 #if defined(_AMD64_)
1359 #define RtlStoreUshort(Address,Value) \
1360 *(USHORT UNALIGNED *)(Address) = (Value)
1362 #define RtlStoreUshort(Address,Value) \
1363 if ((ULONG_PTR)(Address) & SHORT_MASK) { \
1364 ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
1365 ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
1368 *((PUSHORT) (Address)) = (USHORT)Value; \
1375 RtlTimeFieldsToTime(
1376 IN PTIME_FIELDS TimeFields
,
1377 IN PLARGE_INTEGER Time
);
1382 RtlTimeToTimeFields(
1383 IN PLARGE_INTEGER Time
,
1384 IN PTIME_FIELDS TimeFields
);
1395 RtlUlonglongByteSwap(
1396 IN ULONGLONG Source
);
1401 RtlUnicodeStringToAnsiString(
1402 IN OUT PANSI_STRING DestinationString
,
1403 IN PCUNICODE_STRING SourceString
,
1404 IN BOOLEAN AllocateDestinationString
);
1409 RtlxUnicodeStringToAnsiSize(
1410 IN PCUNICODE_STRING UnicodeString
);
1412 #define RtlUnicodeStringToAnsiSize(String) ( \
1413 NLS_MB_CODE_PAGE_TAG ? \
1414 RtlxUnicodeStringToAnsiSize(String) : \
1415 ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
1421 RtlUnicodeStringToInteger(
1422 IN PCUNICODE_STRING String
,
1423 IN ULONG Base OPTIONAL
,
1429 RtlUpcaseUnicodeChar(
1430 IN WCHAR SourceCharacter
);
1441 RtlValidRelativeSecurityDescriptor(
1442 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput
,
1443 IN ULONG SecurityDescriptorLength
,
1444 IN SECURITY_INFORMATION RequiredInformation
);
1449 RtlValidSecurityDescriptor(
1450 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
1455 RtlWriteRegistryValue(
1456 IN ULONG RelativeTo
,
1458 IN PCWSTR ValueName
,
1461 IN ULONG ValueLength
);
1463 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
1465 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
1469 RtlPrefetchMemoryNonTemporal(
1474 #if (NTDDI_VERSION >= NTDDI_WINXP)
1479 PRTL_BITMAP BitMapHeader
,
1485 RtlDowncaseUnicodeChar(
1486 IN WCHAR SourceCharacter
);
1492 PRTL_BITMAP BitMapHeader
,
1499 IN PRTL_BITMAP BitMapHeader
,
1500 IN ULONG BitNumber
);
1502 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
1504 #if (NTDDI_VERSION >= NTDDI_VISTA)
1508 RtlNumberOfSetBitsUlongPtr(
1509 IN ULONG_PTR Target
);
1514 RtlIoDecodeMemIoResource (
1515 IN PIO_RESOURCE_DESCRIPTOR Descriptor
,
1516 OUT PULONGLONG Alignment OPTIONAL
,
1517 OUT PULONGLONG MinimumAddress OPTIONAL
,
1518 OUT PULONGLONG MaximumAddress OPTIONAL
);
1523 RtlIoEncodeMemIoResource(
1524 IN PIO_RESOURCE_DESCRIPTOR Descriptor
,
1526 IN ULONGLONG Length
,
1527 IN ULONGLONG Alignment
,
1528 IN ULONGLONG MinimumAddress
,
1529 IN ULONGLONG MaximumAddress
);
1534 RtlCmDecodeMemIoResource(
1535 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor
,
1536 OUT PULONGLONG Start OPTIONAL
);
1541 RtlFindClosestEncodableLength(
1542 IN ULONGLONG SourceLength
,
1543 OUT PULONGLONG TargetLength
);
1547 #if !defined(MIDL_PASS)
1548 /* inline funftions */
1549 //DECLSPEC_DEPRECATED_DDK_WINXP
1553 RtlConvertLongToLargeInteger(LONG SignedInteger
)
1555 LARGE_INTEGER Result
;
1556 Result
.QuadPart
= SignedInteger
;
1560 //DECLSPEC_DEPRECATED_DDK_WINXP
1564 RtlConvertUlongToLargeInteger(
1565 ULONG UnsignedInteger
)
1568 ret
.QuadPart
= UnsignedInteger
;
1574 RtlInitEmptyAnsiString(OUT PANSI_STRING AnsiString
,
1576 IN USHORT BufferSize
)
1578 AnsiString
->Length
= 0;
1579 AnsiString
->MaximumLength
= BufferSize
;
1580 AnsiString
->Buffer
= Buffer
;
1585 RtlInitEmptyUnicodeString(
1586 OUT PUNICODE_STRING UnicodeString
,
1588 IN USHORT BufferSize
)
1590 UnicodeString
->Length
= 0;
1591 UnicodeString
->MaximumLength
= BufferSize
;
1592 UnicodeString
->Buffer
= Buffer
;
1599 RtlExtendedIntegerMultiply(
1600 LARGE_INTEGER Multiplicand
,
1604 ret
.QuadPart
= Multiplicand
.QuadPart
* Multiplier
;
1611 RtlExtendedLargeIntegerDivide(
1612 LARGE_INTEGER Dividend
,
1617 ret
.QuadPart
= (ULONG64
)Dividend
.QuadPart
/ Divisor
;
1619 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
1626 RtlSecureZeroMemory(
1630 volatile char* vptr
= (volatile char*)Pointer
;
1631 #if defined(_M_AMD64)
1632 _stosb((PUCHAR
)vptr
, 0, Size
);
1634 char * endptr
= (char *)vptr
+ Size
;
1635 while (vptr
< endptr
)
1643 #if defined(_M_AMD64)
1647 IN PRTL_BITMAP BitMapHeader
,
1648 IN ULONG BitPosition
);
1650 return BitTest((LONG CONST
*)BitMapHeader
->Buffer
, BitPosition
);
1653 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
1654 #endif // defined(_M_AMD64)
1656 #endif // !defined(MIDL_PASS)
1659 // Byte Swap Functions
1661 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037)) || \
1662 ((defined(_M_AMD64) || \
1663 defined(_M_IA64)) && (_MSC_FULL_VER > 13009175))
1665 unsigned short __cdecl
_byteswap_ushort(unsigned short);
1666 unsigned long __cdecl
_byteswap_ulong (unsigned long);
1667 unsigned __int64 __cdecl
_byteswap_uint64(unsigned __int64
);
1668 #pragma intrinsic(_byteswap_ushort)
1669 #pragma intrinsic(_byteswap_ulong)
1670 #pragma intrinsic(_byteswap_uint64)
1671 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
1672 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
1673 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
1675 #elif defined(__GNUC__) && (defined(_M_IX86) || defined(_M_AMD64))
1677 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
1678 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
1679 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
1684 /******************************************************************************
1686 ******************************************************************************/
1688 typedef enum _POOL_TYPE
{
1691 NonPagedPoolMustSucceed
,
1693 NonPagedPoolCacheAligned
,
1694 PagedPoolCacheAligned
,
1695 NonPagedPoolCacheAlignedMustS
,
1697 NonPagedPoolSession
= 32,
1699 NonPagedPoolMustSucceedSession
,
1700 DontUseThisTypeSession
,
1701 NonPagedPoolCacheAlignedSession
,
1702 PagedPoolCacheAlignedSession
,
1703 NonPagedPoolCacheAlignedMustSSession
1706 typedef enum _SUITE_TYPE
{
1710 CommunicationServer
,
1712 SmallBusinessRestricted
,
1721 typedef enum _EX_POOL_PRIORITY
{
1723 LowPoolPrioritySpecialPoolOverrun
= 8,
1724 LowPoolPrioritySpecialPoolUnderrun
= 9,
1725 NormalPoolPriority
= 16,
1726 NormalPoolPrioritySpecialPoolOverrun
= 24,
1727 NormalPoolPrioritySpecialPoolUnderrun
= 25,
1728 HighPoolPriority
= 32,
1729 HighPoolPrioritySpecialPoolOverrun
= 40,
1730 HighPoolPrioritySpecialPoolUnderrun
= 41
1733 typedef struct _FAST_MUTEX
1740 } FAST_MUTEX
, *PFAST_MUTEX
;
1742 typedef ULONG_PTR ERESOURCE_THREAD
, *PERESOURCE_THREAD
;
1744 typedef struct _OWNER_ENTRY
{
1745 ERESOURCE_THREAD OwnerThread
;
1746 _ANONYMOUS_UNION
union {
1750 } OWNER_ENTRY
, *POWNER_ENTRY
;
1752 typedef struct _ERESOURCE
1754 LIST_ENTRY SystemResourcesList
;
1755 POWNER_ENTRY OwnerTable
;
1758 volatile PKSEMAPHORE SharedWaiters
;
1759 volatile PKEVENT ExclusiveWaiters
;
1760 OWNER_ENTRY OwnerEntry
;
1761 ULONG ActiveEntries
;
1762 ULONG ContentionCount
;
1763 ULONG NumberOfSharedWaiters
;
1764 ULONG NumberOfExclusiveWaiters
;
1768 ULONG_PTR CreatorBackTraceIndex
;
1770 KSPIN_LOCK SpinLock
;
1771 } ERESOURCE
, *PERESOURCE
;
1773 #if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
1774 #define LOOKASIDE_ALIGN
1776 #define LOOKASIDE_ALIGN DECLSPEC_CACHEALIGN
1779 typedef struct _LOOKASIDE_LIST_EX
*PLOOKASIDE_LIST_EX
;
1782 (DDKAPI
*PALLOCATE_FUNCTION
)(
1783 IN POOL_TYPE PoolType
,
1784 IN SIZE_T NumberOfBytes
,
1788 (DDKAPI
*PALLOCATE_FUNCTION_EX
)(
1789 IN POOL_TYPE PoolType
,
1790 IN SIZE_T NumberOfBytes
,
1792 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
1795 (DDKAPI
*PFREE_FUNCTION
)(
1799 (DDKAPI
*PFREE_FUNCTION_EX
)(
1801 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
1804 (DDKAPI
*PCALLBACK_FUNCTION
)(
1805 IN PVOID CallbackContext
,
1807 IN PVOID Argument2
);
1809 typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE
{
1811 SLIST_HEADER ListHead
;
1812 SINGLE_LIST_ENTRY SingleListHead
;
1815 USHORT MaximumDepth
;
1816 ULONG TotalAllocates
;
1818 ULONG AllocateMisses
;
1830 PALLOCATE_FUNCTION_EX AllocateEx
;
1831 PALLOCATE_FUNCTION Allocate
;
1834 PFREE_FUNCTION_EX FreeEx
;
1835 PFREE_FUNCTION Free
;
1837 LIST_ENTRY ListEntry
;
1838 ULONG LastTotalAllocates
;
1840 ULONG LastAllocateMisses
;
1841 ULONG LastAllocateHits
;
1844 } GENERAL_LOOKASIDE
, *PGENERAL_LOOKASIDE
;
1846 typedef struct _PAGED_LOOKASIDE_LIST
{
1847 GENERAL_LOOKASIDE L
;
1848 #if !defined(_AMD64_) && !defined(_IA64_)
1849 FAST_MUTEX Lock__ObsoleteButDoNotDelete
;
1851 } PAGED_LOOKASIDE_LIST
, *PPAGED_LOOKASIDE_LIST
;
1853 typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST
{
1854 GENERAL_LOOKASIDE L
;
1855 #if !defined(_AMD64_) && !defined(_IA64_)
1856 KSPIN_LOCK Lock__ObsoleteButDoNotDelete
;
1858 } NPAGED_LOOKASIDE_LIST
, *PNPAGED_LOOKASIDE_LIST
;
1860 //typedef struct _LOOKASIDE_LIST_EX {
1861 // GENERAL_LOOKASIDE_POOL L;
1862 //} LOOKASIDE_LIST_EX, *PLOOKASIDE_LIST_EX;
1864 typedef struct _EX_RUNDOWN_REF
{
1866 volatile ULONG_PTR Count
;
1869 } EX_RUNDOWN_REF
, *PEX_RUNDOWN_REF
;
1872 /******************************************************************************
1873 * Executive Functions *
1874 ******************************************************************************/
1876 #if defined (_WIN64)
1877 #if defined(_NTDRIVER_) || defined(_NTDDK) || defined(_NTIFS_) || \
1878 defined(_NTHAL_) || defined(_NTOSP_)
1881 ExQueryDepthSList(IN PSLIST_HEADER Listhead
);
1885 ExQueryDepthSList(IN PSLIST_HEADER Listhead
)
1887 return (USHORT
)(ListHead
->Alignment
& 0xffff);
1891 #define ExQueryDepthSList(listhead) (listhead)->Depth
1898 ExpInterlockedFlushSList(
1899 PSLIST_HEADER ListHead
);
1903 ExpInterlockedPopEntrySList(
1904 PSLIST_HEADER ListHead
);
1908 ExpInterlockedPushEntrySList(
1909 PSLIST_HEADER ListHead
,
1910 PSLIST_ENTRY ListEntry
);
1912 #define ExInterlockedFlushSList(Head) \
1913 ExpInterlockedFlushSList(Head)
1914 #define ExInterlockedPopEntrySList(Head, Lock) \
1915 ExpInterlockedPopEntrySList(Head)
1916 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
1917 ExpInterlockedPushEntrySList(Head, Entry)
1919 #else // !defined(_WIN64)
1924 ExInterlockedFlushSList(
1925 IN PSLIST_HEADER ListHead
);
1927 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
1931 ExInterlockedPopEntrySList(
1932 IN PSLIST_HEADER ListHead
,
1933 IN PKSPIN_LOCK Lock
);
1938 ExInterlockedPushEntrySList(
1939 IN PSLIST_HEADER ListHead
,
1940 IN PSINGLE_LIST_ENTRY ListEntry
,
1941 IN PKSPIN_LOCK Lock
);
1943 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
1944 InterlockedPopEntrySList(_ListHead)
1945 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
1946 InterlockedPushEntrySList(_ListHead, _ListEntry)
1947 #endif // _WIN2K_COMPAT_SLIST_USAGE
1950 * ExGetCurrentResourceThread(
1953 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread())
1955 #endif // !defined(_WIN64)
1957 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1959 #if defined(_NTHAL_) && defined(_X86_)
1960 #define ExAcquireFastMutex ExiAcquireFastMutex
1961 #define ExReleaseFastMutex ExiReleaseFastMutex
1962 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
1966 #define ExInterlockedAddUlong ExfInterlockedAddUlong
1967 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
1968 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
1969 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
1970 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
1971 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
1978 IN OUT PFAST_MUTEX FastMutex
);
1984 IN OUT PFAST_MUTEX FastMutex
);
1989 ExTryToAcquireFastMutex(
1990 IN OUT PFAST_MUTEX FastMutex
);
1995 ExAcquireResourceExclusiveLite(
1996 IN PERESOURCE Resource
,
2002 ExAcquireResourceSharedLite(
2003 IN PERESOURCE Resource
,
2009 ExAcquireSharedStarveExclusive(
2010 IN PERESOURCE Resource
,
2016 ExAcquireSharedWaitForExclusive(
2017 IN PERESOURCE Resource
,
2024 IN POOL_TYPE PoolType
,
2025 IN SIZE_T NumberOfBytes
);
2028 #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
2029 #endif /* POOL_TAGGING */
2034 ExAllocatePoolWithQuota(
2035 IN POOL_TYPE PoolType
,
2036 IN SIZE_T NumberOfBytes
);
2039 #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
2040 #endif /* POOL_TAGGING */
2045 ExAllocatePoolWithQuotaTag(
2046 IN POOL_TYPE PoolType
,
2047 IN SIZE_T NumberOfBytes
,
2050 #ifndef POOL_TAGGING
2051 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
2052 #endif /* POOL_TAGGING */
2057 ExAllocatePoolWithTag(
2058 IN POOL_TYPE PoolType
,
2059 IN SIZE_T NumberOfBytes
,
2065 ExAllocatePoolWithTagPriority(
2066 IN POOL_TYPE PoolType
,
2067 IN SIZE_T NumberOfBytes
,
2069 IN EX_POOL_PRIORITY Priority
);
2074 ExConvertExclusiveToSharedLite(
2075 IN PERESOURCE Resource
);
2081 OUT PCALLBACK_OBJECT
*CallbackObject
,
2082 IN POBJECT_ATTRIBUTES ObjectAttributes
,
2084 IN BOOLEAN AllowMultipleCallbacks
);
2089 ExDeleteNPagedLookasideList(
2090 IN PNPAGED_LOOKASIDE_LIST Lookaside
);
2095 ExDeletePagedLookasideList(
2096 IN PPAGED_LOOKASIDE_LIST Lookaside
);
2101 ExDeleteResourceLite(
2102 IN PERESOURCE Resource
);
2111 #define ExFreePool(P) ExFreePoolWithTag(P, 0)
2124 ExGetExclusiveWaiterCount(
2125 IN PERESOURCE Resource
);
2136 ExGetSharedWaiterCount(
2137 IN PERESOURCE Resource
);
2142 ExInitializeNPagedLookasideList(
2143 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
2144 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
2145 IN PFREE_FUNCTION Free OPTIONAL
,
2154 ExInitializePagedLookasideList(
2155 IN PPAGED_LOOKASIDE_LIST Lookaside
,
2156 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
2157 IN PFREE_FUNCTION Free OPTIONAL
,
2166 ExInitializeResourceLite(
2167 IN PERESOURCE Resource
);
2172 ExInterlockedAddLargeInteger(
2173 IN PLARGE_INTEGER Addend
,
2174 IN LARGE_INTEGER Increment
,
2175 IN PKSPIN_LOCK Lock
);
2178 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
2179 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
2181 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
2182 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
2188 ExInterlockedAddUlong(
2193 #if defined(_AMD64_) || defined(_IA64_)
2194 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
2195 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
2196 #elif defined(_X86_)
2200 ExfInterlockedCompareExchange64(
2201 IN OUT LONGLONG
volatile *Destination
,
2202 IN PLONGLONG Exchange
,
2203 IN PLONGLONG Comperand
);
2204 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
2205 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
2210 ExInterlockedCompareExchange64(
2211 IN OUT LONGLONG
volatile *Destination
,
2212 IN PLONGLONG Exchange
,
2213 IN PLONGLONG Comparand
,
2214 IN PKSPIN_LOCK Lock
);
2220 ExInterlockedInsertHeadList(
2221 IN PLIST_ENTRY ListHead
,
2222 IN PLIST_ENTRY ListEntry
,
2223 IN PKSPIN_LOCK Lock
);
2228 ExInterlockedInsertTailList(
2229 IN PLIST_ENTRY ListHead
,
2230 IN PLIST_ENTRY ListEntry
,
2231 IN PKSPIN_LOCK Lock
);
2236 ExInterlockedPopEntryList(
2237 IN PSINGLE_LIST_ENTRY ListHead
,
2238 IN PKSPIN_LOCK Lock
);
2243 ExInterlockedPushEntryList(
2244 IN PSINGLE_LIST_ENTRY ListHead
,
2245 IN PSINGLE_LIST_ENTRY ListEntry
,
2246 IN PKSPIN_LOCK Lock
);
2251 ExInterlockedRemoveHeadList(
2252 IN PLIST_ENTRY ListHead
,
2253 IN PKSPIN_LOCK Lock
);
2258 ExIsProcessorFeaturePresent(
2259 IN ULONG ProcessorFeature
);
2264 ExIsResourceAcquiredExclusiveLite(
2265 IN PERESOURCE Resource
);
2270 ExIsResourceAcquiredSharedLite(
2271 IN PERESOURCE Resource
);
2273 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
2278 ExLocalTimeToSystemTime(
2279 IN PLARGE_INTEGER LocalTime
,
2280 OUT PLARGE_INTEGER SystemTime
);
2286 IN PCALLBACK_OBJECT CallbackObject
,
2288 IN PVOID Argument2
);
2295 IN NTSTATUS Status
);
2301 IN PCALLBACK_OBJECT CallbackObject
,
2302 IN PCALLBACK_FUNCTION CallbackFunction
,
2303 IN PVOID CallbackContext
);
2308 ExReinitializeResourceLite(
2309 IN PERESOURCE Resource
);
2314 ExReleaseResourceForThreadLite(
2315 IN PERESOURCE Resource
,
2316 IN ERESOURCE_THREAD ResourceThreadId
);
2321 ExReleaseResourceLite(
2322 IN PERESOURCE Resource
);
2327 ExSetResourceOwnerPointer(
2328 IN PERESOURCE Resource
,
2329 IN PVOID OwnerPointer
);
2334 ExSetTimerResolution(
2335 IN ULONG DesiredTime
,
2336 IN BOOLEAN SetResolution
);
2341 ExSystemTimeToLocalTime(
2342 IN PLARGE_INTEGER SystemTime
,
2343 OUT PLARGE_INTEGER LocalTime
);
2348 ExUnregisterCallback(
2349 IN PVOID CbRegistration
);
2352 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
2354 #if (NTDDI_VERSION >= NTDDI_WINXP)
2358 ExAcquireRundownProtection(
2359 IN OUT PEX_RUNDOWN_REF RunRef
);
2364 ExInitializeRundownProtection(
2365 OUT PEX_RUNDOWN_REF RunRef
);
2370 ExReInitializeRundownProtection(
2371 OUT PEX_RUNDOWN_REF RunRef
);
2376 ExReleaseRundownProtection(
2377 IN OUT PEX_RUNDOWN_REF RunRef
);
2383 OUT PEX_RUNDOWN_REF RunRef
);
2389 IN SUITE_TYPE SuiteType
);
2394 ExWaitForRundownProtectionRelease(
2395 IN OUT PEX_RUNDOWN_REF RunRef
);
2397 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
2399 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
2403 ExAcquireRundownProtectionEx(
2404 IN OUT PEX_RUNDOWN_REF RunRef
,
2410 ExReleaseRundownProtectionEx(
2411 IN OUT PEX_RUNDOWN_REF RunRef
,
2413 #endif // (NTDDI_VERSION >= NTDDI_WINXPSP2)
2415 #if (NTDDI_VERSION >= NTDDI_WS03)
2417 #endif // (NTDDI_VERSION >= NTDDI_WS03)
2419 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
2421 PEX_RUNDOWN_REF_CACHE_AWARE
2422 ExAllocateCacheAwareRundownProtection(
2423 IN POOL_TYPE PoolType
,
2428 ExSizeOfRundownProtectionCacheAware(VOID
);
2430 #endif // (NTDDI_VERSION >= NTDDI_WS03SP1)
2432 #if (NTDDI_VERSION >= NTDDI_VISTA)
2435 ExInitializeLookasideListEx(
2436 OUT PLOOKASIDE_LIST_EX Lookaside
,
2437 IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL
,
2438 IN PFREE_FUNCTION_EX Free OPTIONAL
,
2439 IN POOL_TYPE PoolType
,
2447 /******************************************************************************
2448 * WINBASE Functions *
2449 ******************************************************************************/
2450 #if !defined(_WINBASE_)
2454 #define InterlockedPopEntrySList(Head) \
2455 ExpInterlockedPopEntrySList(Head)
2457 #define InterlockedPushEntrySList(Head, Entry) \
2458 ExpInterlockedPushEntrySList(Head, Entry)
2460 #define InterlockedFlushSList(Head) \
2461 ExpInterlockedFlushSList(Head)
2463 #define QueryDepthSList(Head) \
2464 ExQueryDepthSList(Head)
2466 #else // !defined(_WIN64)
2471 InterlockedPopEntrySList(
2472 IN PSLIST_HEADER ListHead
);
2477 InterlockedPushEntrySList(
2478 IN PSLIST_HEADER ListHead
,
2479 IN PSLIST_ENTRY ListEntry
);
2481 #define InterlockedFlushSList(ListHead) \
2482 ExInterlockedFlushSList(ListHead)
2484 #define QueryDepthSList(Head) \
2485 ExQueryDepthSList(Head)
2487 #endif // !defined(_WIN64)
2489 #endif // !defined(_WINBASE_)