16 typedef struct _CONTEXT
*PCONTEXT
;
19 // Resource list definitions
21 typedef int CM_RESOURCE_TYPE
;
23 #define CmResourceTypeNull 0
24 #define CmResourceTypePort 1
25 #define CmResourceTypeInterrupt 2
26 #define CmResourceTypeMemory 3
27 #define CmResourceTypeDma 4
28 #define CmResourceTypeDeviceSpecific 5
29 #define CmResourceTypeBusNumber 6
30 #define CmResourceTypeNonArbitrated 128
31 #define CmResourceTypeConfigData 128
32 #define CmResourceTypeDevicePrivate 129
33 #define CmResourceTypePcCardConfig 130
34 #define CmResourceTypeMfCardConfig 131
41 extern ULONG NtGlobalFlag
;
46 // Section map options
48 typedef enum _SECTION_INHERIT
{
54 // Section access rights
56 #define SECTION_QUERY 0x0001
57 #define SECTION_MAP_WRITE 0x0002
58 #define SECTION_MAP_READ 0x0004
59 #define SECTION_MAP_EXECUTE 0x0008
60 #define SECTION_EXTEND_SIZE 0x0010
61 #define SECTION_MAP_EXECUTE_EXPLICIT 0x0020
63 #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
66 SECTION_MAP_EXECUTE | \
69 #define SESSION_QUERY_ACCESS 0x0001
70 #define SESSION_MODIFY_ACCESS 0x0002
72 #define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
73 SESSION_QUERY_ACCESS | \
74 SESSION_MODIFY_ACCESS)
78 #define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
80 #define PAGE_NOACCESS 0x01
81 #define PAGE_READONLY 0x02
82 #define PAGE_READWRITE 0x04
83 #define PAGE_WRITECOPY 0x08
84 #define PAGE_EXECUTE 0x10
85 #define PAGE_EXECUTE_READ 0x20
86 #define PAGE_EXECUTE_READWRITE 0x40
87 #define PAGE_EXECUTE_WRITECOPY 0x80
88 #define PAGE_GUARD 0x100
89 #define PAGE_NOCACHE 0x200
90 #define PAGE_WRITECOMBINE 0x400
92 #define MEM_COMMIT 0x1000
93 #define MEM_RESERVE 0x2000
94 #define MEM_DECOMMIT 0x4000
95 #define MEM_RELEASE 0x8000
96 #define MEM_FREE 0x10000
97 #define MEM_PRIVATE 0x20000
98 #define MEM_MAPPED 0x40000
99 #define MEM_RESET 0x80000
100 #define MEM_TOP_DOWN 0x100000
101 #define MEM_LARGE_PAGES 0x20000000
102 #define MEM_4MB_PAGES 0x80000000
104 #define SEC_RESERVE 0x4000000
105 #define SEC_LARGE_PAGES 0x80000000
107 #define PROCESS_DUP_HANDLE (0x0040)
109 #if (NTDDI_VERSION >= NTDDI_VISTA)
110 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
113 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
120 // Processor features
122 #define PF_FLOATING_POINT_PRECISION_ERRATA 0
123 #define PF_FLOATING_POINT_EMULATED 1
124 #define PF_COMPARE_EXCHANGE_DOUBLE 2
125 #define PF_MMX_INSTRUCTIONS_AVAILABLE 3
126 #define PF_PPC_MOVEMEM_64BIT_OK 4
127 #define PF_ALPHA_BYTE_INSTRUCTIONS 5
128 #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
129 #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
130 #define PF_RDTSC_INSTRUCTION_AVAILABLE 8
131 #define PF_PAE_ENABLED 9
132 #define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
133 #define PF_SSE_DAZ_MODE_AVAILABLE 11
134 #define PF_NX_ENABLED 12
135 #define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
136 #define PF_COMPARE_EXCHANGE128 14
137 #define PF_COMPARE64_EXCHANGE128 15
138 #define PF_CHANNELS_ENABLED 16
143 // Intrinsics (note: taken from our winnt.h)
146 #if defined(__GNUC__)
148 static __inline__ BOOLEAN
149 InterlockedBitTestAndSet(IN LONG
volatile *Base
,
154 __asm__
__volatile__("lock "
157 :"=r" (OldBit
),"+m" (*Base
)
162 return (_InterlockedOr(Base
, 1 << Bit
) >> Bit
) & 1;
166 static __inline__ BOOLEAN
167 InterlockedBitTestAndReset(IN LONG
volatile *Base
,
172 __asm__
__volatile__("lock "
175 :"=r" (OldBit
),"+m" (*Base
)
180 return (_InterlockedAnd(Base
, ~(1 << Bit
)) >> Bit
) & 1;
184 static __inline__ BOOLEAN
185 BitScanReverse(OUT ULONG
*Index
,
188 BOOLEAN BitPosition
= 0;
190 __asm__
__volatile__("bsrl %2,%0\n\t"
192 :"=&r" (*Index
), "=q" (BitPosition
)
197 /* Slow implementation for now */
198 for( *Index
= 31; *Index
; (*Index
)-- ) {
199 if( (1<<*Index
) & Mask
) {
212 #define YieldProcessor() __asm__ __volatile__("pause");
213 #elif defined (_M_AMD64)
214 #define YieldProcessor() __asm__ __volatile__("pause");
215 #elif defined(_M_PPC)
216 #define YieldProcessor() __asm__ __volatile__("nop");
217 #elif defined(_M_MIPS)
218 #define YieldProcessor() __asm__ __volatile__("nop");
219 #elif defined(_M_ARM)
220 #define YieldProcessor()
222 #error Unknown architecture
230 #ifndef _SLIST_HEADER_
231 #define _SLIST_HEADER_
233 #define SLIST_ENTRY SINGLE_LIST_ENTRY
234 #define _SLIST_ENTRY _SINGLE_LIST_ENTRY
235 #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
237 typedef union _SLIST_HEADER
{
244 } SLIST_HEADER
, *PSLIST_HEADER
;
246 #endif /* _SLIST_HEADER_ */
251 // Power States/Levels
253 typedef enum _SYSTEM_POWER_STATE
{
254 PowerSystemUnspecified
,
256 PowerSystemSleeping1
,
257 PowerSystemSleeping2
,
258 PowerSystemSleeping3
,
259 PowerSystemHibernate
,
262 } SYSTEM_POWER_STATE
, *PSYSTEM_POWER_STATE
;
264 #define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
266 typedef enum _POWER_INFORMATION_LEVEL
{
269 VerifySystemPolicyAc
,
270 VerifySystemPolicyDc
,
271 SystemPowerCapabilities
,
273 SystemPowerStateHandler
,
274 ProcessorStateHandler
,
275 SystemPowerPolicyCurrent
,
276 AdministratorPowerPolicy
,
277 SystemReserveHiberFile
,
278 ProcessorInformation
,
279 SystemPowerInformation
,
280 ProcessorStateHandler2
,
283 SystemExecutionState
,
284 SystemPowerStateNotifyHandler
,
285 ProcessorPowerPolicyAc
,
286 ProcessorPowerPolicyDc
,
287 VerifyProcessorPowerPolicyAc
,
288 VerifyProcessorPowerPolicyDc
,
289 ProcessorPowerPolicyCurrent
290 } POWER_INFORMATION_LEVEL
;
296 PowerActionHibernate
,
298 PowerActionShutdownReset
,
299 PowerActionShutdownOff
,
301 } POWER_ACTION
, *PPOWER_ACTION
;
303 typedef enum _DEVICE_POWER_STATE
{
304 PowerDeviceUnspecified
,
310 } DEVICE_POWER_STATE
, *PDEVICE_POWER_STATE
;
312 #define ES_SYSTEM_REQUIRED 0x00000001
313 #define ES_DISPLAY_REQUIRED 0x00000002
314 #define ES_USER_PRESENT 0x00000004
315 #define ES_CONTINUOUS 0x80000000
317 typedef ULONG EXECUTION_STATE
;
327 // Access/Security Stuff
329 typedef ULONG ACCESS_MASK
, *PACCESS_MASK
;
330 typedef PVOID PACCESS_TOKEN
;
332 #define DELETE 0x00010000L
333 #define READ_CONTROL 0x00020000L
334 #define WRITE_DAC 0x00040000L
335 #define WRITE_OWNER 0x00080000L
336 #define SYNCHRONIZE 0x00100000L
337 #define STANDARD_RIGHTS_REQUIRED 0x000F0000L
338 #define STANDARD_RIGHTS_READ READ_CONTROL
339 #define STANDARD_RIGHTS_WRITE READ_CONTROL
340 #define STANDARD_RIGHTS_EXECUTE READ_CONTROL
341 #define STANDARD_RIGHTS_ALL 0x001F0000L
342 #define SPECIFIC_RIGHTS_ALL 0x0000FFFFL
343 #define ACCESS_SYSTEM_SECURITY 0x01000000L
344 #define MAXIMUM_ALLOWED 0x02000000L
345 #define GENERIC_READ 0x80000000L
346 #define GENERIC_WRITE 0x40000000L
347 #define GENERIC_EXECUTE 0x20000000L
348 #define GENERIC_ALL 0x10000000L
350 typedef struct _GENERIC_MAPPING
{
351 ACCESS_MASK GenericRead
;
352 ACCESS_MASK GenericWrite
;
353 ACCESS_MASK GenericExecute
;
354 ACCESS_MASK GenericAll
;
355 } GENERIC_MAPPING
, *PGENERIC_MAPPING
;
357 #define ACL_REVISION 2
358 #define ACL_REVISION_DS 4
360 #define ACL_REVISION1 1
361 #define ACL_REVISION2 2
362 #define ACL_REVISION3 3
363 #define ACL_REVISION4 4
364 #define MIN_ACL_REVISION ACL_REVISION2
365 #define MAX_ACL_REVISION ACL_REVISION4
367 typedef struct _ACL
{
378 // Current security descriptor revision value
380 #define SECURITY_DESCRIPTOR_REVISION (1)
381 #define SECURITY_DESCRIPTOR_REVISION1 (1)
384 // Privilege attributes
386 #define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
387 #define SE_PRIVILEGE_ENABLED (0x00000002L)
388 #define SE_PRIVILEGE_REMOVED (0X00000004L)
389 #define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
391 #define SE_PRIVILEGE_VALID_ATTRIBUTES (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
392 SE_PRIVILEGE_ENABLED | \
393 SE_PRIVILEGE_REMOVED | \
394 SE_PRIVILEGE_USED_FOR_ACCESS)
396 #include <pshpack4.h>
397 typedef struct _LUID_AND_ATTRIBUTES
{
400 } LUID_AND_ATTRIBUTES
, *PLUID_AND_ATTRIBUTES
;
402 typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY
[ANYSIZE_ARRAY
];
403 typedef LUID_AND_ATTRIBUTES_ARRAY
*PLUID_AND_ATTRIBUTES_ARRAY
;
410 #define PRIVILEGE_SET_ALL_NECESSARY (1)
412 typedef struct _PRIVILEGE_SET
{
413 ULONG PrivilegeCount
;
415 LUID_AND_ATTRIBUTES Privilege
[ANYSIZE_ARRAY
];
416 } PRIVILEGE_SET
,*PPRIVILEGE_SET
;
418 typedef enum _SECURITY_IMPERSONATION_LEVEL
{
420 SecurityIdentification
,
421 SecurityImpersonation
,
423 } SECURITY_IMPERSONATION_LEVEL
, * PSECURITY_IMPERSONATION_LEVEL
;
425 #define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
426 #define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
427 #define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
428 #define VALID_IMPERSONATION_LEVEL(Level) (((Level) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((Level) <= SECURITY_MAX_IMPERSONATION_LEVEL))
430 #define SECURITY_DYNAMIC_TRACKING (TRUE)
431 #define SECURITY_STATIC_TRACKING (FALSE)
433 typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE
, *PSECURITY_CONTEXT_TRACKING_MODE
;
435 typedef struct _SECURITY_QUALITY_OF_SERVICE
{
437 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
;
438 SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode
;
439 BOOLEAN EffectiveOnly
;
440 } SECURITY_QUALITY_OF_SERVICE
, *PSECURITY_QUALITY_OF_SERVICE
;
442 typedef struct _SE_IMPERSONATION_STATE
{
445 BOOLEAN EffectiveOnly
;
446 SECURITY_IMPERSONATION_LEVEL Level
;
447 } SE_IMPERSONATION_STATE
, *PSE_IMPERSONATION_STATE
;
449 #define OWNER_SECURITY_INFORMATION (0x00000001L)
450 #define GROUP_SECURITY_INFORMATION (0x00000002L)
451 #define DACL_SECURITY_INFORMATION (0x00000004L)
452 #define SACL_SECURITY_INFORMATION (0x00000008L)
453 #define LABEL_SECURITY_INFORMATION (0x00000010L)
455 #define PROTECTED_DACL_SECURITY_INFORMATION (0x80000000L)
456 #define PROTECTED_SACL_SECURITY_INFORMATION (0x40000000L)
457 #define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L)
458 #define UNPROTECTED_SACL_SECURITY_INFORMATION (0x10000000L)
463 // Registry Access Rights
465 #define KEY_QUERY_VALUE (0x0001)
466 #define KEY_SET_VALUE (0x0002)
467 #define KEY_CREATE_SUB_KEY (0x0004)
468 #define KEY_ENUMERATE_SUB_KEYS (0x0008)
469 #define KEY_NOTIFY (0x0010)
470 #define KEY_CREATE_LINK (0x0020)
471 #define KEY_WOW64_32KEY (0x0200)
472 #define KEY_WOW64_64KEY (0x0100)
473 #define KEY_WOW64_RES (0x0300)
475 #define KEY_READ ((STANDARD_RIGHTS_READ |\
477 KEY_ENUMERATE_SUB_KEYS |\
482 #define KEY_WRITE ((STANDARD_RIGHTS_WRITE |\
484 KEY_CREATE_SUB_KEY) \
488 #define KEY_EXECUTE ((KEY_READ) \
492 #define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL |\
495 KEY_CREATE_SUB_KEY |\
496 KEY_ENUMERATE_SUB_KEYS |\
503 // Registry Open/Create Options
505 #define REG_OPTION_RESERVED (0x00000000L)
506 #define REG_OPTION_NON_VOLATILE (0x00000000L)
507 #define REG_OPTION_VOLATILE (0x00000001L)
508 #define REG_OPTION_CREATE_LINK (0x00000002L)
509 #define REG_OPTION_BACKUP_RESTORE (0x00000004L)
510 #define REG_OPTION_OPEN_LINK (0x00000008L)
512 #define REG_LEGAL_OPTION \
513 (REG_OPTION_RESERVED |\
514 REG_OPTION_NON_VOLATILE |\
515 REG_OPTION_VOLATILE |\
516 REG_OPTION_CREATE_LINK |\
517 REG_OPTION_BACKUP_RESTORE |\
518 REG_OPTION_OPEN_LINK)
521 // Key creation/open disposition
523 #define REG_CREATED_NEW_KEY (0x00000001L)
524 #define REG_OPENED_EXISTING_KEY (0x00000002L)
527 // Key restore & hive load flags
529 #define REG_WHOLE_HIVE_VOLATILE (0x00000001L)
530 #define REG_REFRESH_HIVE (0x00000002L)
531 #define REG_NO_LAZY_FLUSH (0x00000004L)
532 #define REG_FORCE_RESTORE (0x00000008L)
533 #define REG_APP_HIVE (0x00000010L)
534 #define REG_PROCESS_PRIVATE (0x00000020L)
535 #define REG_START_JOURNAL (0x00000040L)
536 #define REG_HIVE_EXACT_FILE_GROWTH (0x00000080L)
537 #define REG_HIVE_NO_RM (0x00000100L)
538 #define REG_HIVE_SINGLE_LOG (0x00000200L)
543 #define REG_FORCE_UNLOAD 1
546 // Notify Filter Values
548 #define REG_NOTIFY_CHANGE_NAME (0x00000001L)
549 #define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L)
550 #define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L)
551 #define REG_NOTIFY_CHANGE_SECURITY (0x00000008L)
553 #define REG_LEGAL_CHANGE_FILTER \
554 (REG_NOTIFY_CHANGE_NAME |\
555 REG_NOTIFY_CHANGE_ATTRIBUTES |\
556 REG_NOTIFY_CHANGE_LAST_SET |\
557 REG_NOTIFY_CHANGE_SECURITY)
562 // Thread Access Rights
564 #define THREAD_TERMINATE (0x0001)
565 #define THREAD_SUSPEND_RESUME (0x0002)
566 #define THREAD_ALERT (0x0004)
567 #define THREAD_GET_CONTEXT (0x0008)
568 #define THREAD_SET_CONTEXT (0x0010)
569 #define THREAD_SET_INFORMATION (0x0020)
570 #define THREAD_SET_LIMITED_INFORMATION (0x0400)
571 #define THREAD_QUERY_LIMITED_INFORMATION (0x0800)
572 #if (NTDDI_VERSION >= NTDDI_VISTA)
573 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
576 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
581 // Service Start Types
583 #define SERVICE_BOOT_START 0x00000000
584 #define SERVICE_SYSTEM_START 0x00000001
585 #define SERVICE_AUTO_START 0x00000002
586 #define SERVICE_DEMAND_START 0x00000003
587 #define SERVICE_DISABLED 0x00000004
592 #define EXCEPTION_NONCONTINUABLE 1
593 #define EXCEPTION_MAXIMUM_PARAMETERS 15
595 typedef struct _EXCEPTION_RECORD
{
596 NTSTATUS ExceptionCode
;
597 ULONG ExceptionFlags
;
598 struct _EXCEPTION_RECORD
*ExceptionRecord
;
599 PVOID ExceptionAddress
;
600 ULONG NumberParameters
;
601 ULONG_PTR ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
602 } EXCEPTION_RECORD
, *PEXCEPTION_RECORD
;
604 typedef struct _EXCEPTION_RECORD32
{
605 NTSTATUS ExceptionCode
;
606 ULONG ExceptionFlags
;
607 ULONG ExceptionRecord
;
608 ULONG ExceptionAddress
;
609 ULONG NumberParameters
;
610 ULONG ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
611 } EXCEPTION_RECORD32
, *PEXCEPTION_RECORD32
;
613 typedef struct _EXCEPTION_RECORD64
{
614 NTSTATUS ExceptionCode
;
615 ULONG ExceptionFlags
;
616 ULONG64 ExceptionRecord
;
617 ULONG64 ExceptionAddress
;
618 ULONG NumberParameters
;
619 ULONG __unusedAlignment
;
620 ULONG64 ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
621 } EXCEPTION_RECORD64
, *PEXCEPTION_RECORD64
;
623 typedef struct _EXCEPTION_POINTERS
{
624 PEXCEPTION_RECORD ExceptionRecord
;
625 PCONTEXT ContextRecord
;
626 } EXCEPTION_POINTERS
, *PEXCEPTION_POINTERS
;
633 typedef struct _QUOTA_LIMITS
{
634 SIZE_T PagedPoolLimit
;
635 SIZE_T NonPagedPoolLimit
;
636 SIZE_T MinimumWorkingSetSize
;
637 SIZE_T MaximumWorkingSetSize
;
638 SIZE_T PagefileLimit
;
639 LARGE_INTEGER TimeLimit
;
640 } QUOTA_LIMITS
, *PQUOTA_LIMITS
;
642 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
643 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
644 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
645 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
646 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
650 // Byte Swap Functions
652 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037)) || \
653 ((defined(_M_AMD64) || \
654 defined(_M_IA64)) && (_MSC_FULL_VER > 13009175))
656 unsigned short __cdecl
_byteswap_ushort(unsigned short);
657 unsigned long __cdecl
_byteswap_ulong (unsigned long);
658 unsigned __int64 __cdecl
_byteswap_uint64(unsigned __int64
);
659 #pragma intrinsic(_byteswap_ushort)
660 #pragma intrinsic(_byteswap_ulong)
661 #pragma intrinsic(_byteswap_uint64)
662 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
663 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
664 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
666 #elif defined(__GNUC__)
668 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
669 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
670 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
674 #if (NTDDI_VERSION >= NTDDI_WIN2K)
678 RtlUshortByteSwap(IN USHORT Source
);
683 RtlUlongByteSwap(IN ULONG Source
);
688 RtlUlonglongByteSwap(IN ULONGLONG Source
);