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 #define BitScanForward _BitScanForward
185 #define BitScanReverse _BitScanReverse
191 #define YieldProcessor() __asm__ __volatile__("pause");
192 #elif defined (_M_AMD64)
193 #define YieldProcessor() __asm__ __volatile__("pause");
194 #elif defined(_M_PPC)
195 #define YieldProcessor() __asm__ __volatile__("nop");
196 #elif defined(_M_MIPS)
197 #define YieldProcessor() __asm__ __volatile__("nop");
198 #elif defined(_M_ARM)
199 #define YieldProcessor()
201 #error Unknown architecture
209 #ifndef _SLIST_HEADER_
210 #define _SLIST_HEADER_
212 #define SLIST_ENTRY SINGLE_LIST_ENTRY
213 #define _SLIST_ENTRY _SINGLE_LIST_ENTRY
214 #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
216 typedef union _SLIST_HEADER
{
223 } SLIST_HEADER
, *PSLIST_HEADER
;
225 #endif /* _SLIST_HEADER_ */
230 // Power States/Levels
232 typedef enum _SYSTEM_POWER_STATE
{
233 PowerSystemUnspecified
,
235 PowerSystemSleeping1
,
236 PowerSystemSleeping2
,
237 PowerSystemSleeping3
,
238 PowerSystemHibernate
,
241 } SYSTEM_POWER_STATE
, *PSYSTEM_POWER_STATE
;
243 #define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
245 typedef enum _POWER_INFORMATION_LEVEL
{
248 VerifySystemPolicyAc
,
249 VerifySystemPolicyDc
,
250 SystemPowerCapabilities
,
252 SystemPowerStateHandler
,
253 ProcessorStateHandler
,
254 SystemPowerPolicyCurrent
,
255 AdministratorPowerPolicy
,
256 SystemReserveHiberFile
,
257 ProcessorInformation
,
258 SystemPowerInformation
,
259 ProcessorStateHandler2
,
262 SystemExecutionState
,
263 SystemPowerStateNotifyHandler
,
264 ProcessorPowerPolicyAc
,
265 ProcessorPowerPolicyDc
,
266 VerifyProcessorPowerPolicyAc
,
267 VerifyProcessorPowerPolicyDc
,
268 ProcessorPowerPolicyCurrent
269 } POWER_INFORMATION_LEVEL
;
275 PowerActionHibernate
,
277 PowerActionShutdownReset
,
278 PowerActionShutdownOff
,
280 } POWER_ACTION
, *PPOWER_ACTION
;
282 typedef enum _DEVICE_POWER_STATE
{
283 PowerDeviceUnspecified
,
289 } DEVICE_POWER_STATE
, *PDEVICE_POWER_STATE
;
291 #define ES_SYSTEM_REQUIRED 0x00000001
292 #define ES_DISPLAY_REQUIRED 0x00000002
293 #define ES_USER_PRESENT 0x00000004
294 #define ES_CONTINUOUS 0x80000000
296 typedef ULONG EXECUTION_STATE
;
306 // Access/Security Stuff
308 typedef ULONG ACCESS_MASK
, *PACCESS_MASK
;
309 typedef PVOID PACCESS_TOKEN
;
311 #define DELETE 0x00010000L
312 #define READ_CONTROL 0x00020000L
313 #define WRITE_DAC 0x00040000L
314 #define WRITE_OWNER 0x00080000L
315 #define SYNCHRONIZE 0x00100000L
316 #define STANDARD_RIGHTS_REQUIRED 0x000F0000L
317 #define STANDARD_RIGHTS_READ READ_CONTROL
318 #define STANDARD_RIGHTS_WRITE READ_CONTROL
319 #define STANDARD_RIGHTS_EXECUTE READ_CONTROL
320 #define STANDARD_RIGHTS_ALL 0x001F0000L
321 #define SPECIFIC_RIGHTS_ALL 0x0000FFFFL
322 #define ACCESS_SYSTEM_SECURITY 0x01000000L
323 #define MAXIMUM_ALLOWED 0x02000000L
324 #define GENERIC_READ 0x80000000L
325 #define GENERIC_WRITE 0x40000000L
326 #define GENERIC_EXECUTE 0x20000000L
327 #define GENERIC_ALL 0x10000000L
329 typedef struct _GENERIC_MAPPING
{
330 ACCESS_MASK GenericRead
;
331 ACCESS_MASK GenericWrite
;
332 ACCESS_MASK GenericExecute
;
333 ACCESS_MASK GenericAll
;
334 } GENERIC_MAPPING
, *PGENERIC_MAPPING
;
336 #define ACL_REVISION 2
337 #define ACL_REVISION_DS 4
339 #define ACL_REVISION1 1
340 #define ACL_REVISION2 2
341 #define ACL_REVISION3 3
342 #define ACL_REVISION4 4
343 #define MIN_ACL_REVISION ACL_REVISION2
344 #define MAX_ACL_REVISION ACL_REVISION4
346 typedef struct _ACL
{
357 // Current security descriptor revision value
359 #define SECURITY_DESCRIPTOR_REVISION (1)
360 #define SECURITY_DESCRIPTOR_REVISION1 (1)
363 // Privilege attributes
365 #define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
366 #define SE_PRIVILEGE_ENABLED (0x00000002L)
367 #define SE_PRIVILEGE_REMOVED (0X00000004L)
368 #define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
370 #define SE_PRIVILEGE_VALID_ATTRIBUTES (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
371 SE_PRIVILEGE_ENABLED | \
372 SE_PRIVILEGE_REMOVED | \
373 SE_PRIVILEGE_USED_FOR_ACCESS)
375 #include <pshpack4.h>
376 typedef struct _LUID_AND_ATTRIBUTES
{
379 } LUID_AND_ATTRIBUTES
, *PLUID_AND_ATTRIBUTES
;
381 typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY
[ANYSIZE_ARRAY
];
382 typedef LUID_AND_ATTRIBUTES_ARRAY
*PLUID_AND_ATTRIBUTES_ARRAY
;
389 #define PRIVILEGE_SET_ALL_NECESSARY (1)
391 typedef struct _PRIVILEGE_SET
{
392 ULONG PrivilegeCount
;
394 LUID_AND_ATTRIBUTES Privilege
[ANYSIZE_ARRAY
];
395 } PRIVILEGE_SET
,*PPRIVILEGE_SET
;
397 typedef enum _SECURITY_IMPERSONATION_LEVEL
{
399 SecurityIdentification
,
400 SecurityImpersonation
,
402 } SECURITY_IMPERSONATION_LEVEL
, * PSECURITY_IMPERSONATION_LEVEL
;
404 #define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
405 #define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
406 #define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
407 #define VALID_IMPERSONATION_LEVEL(Level) (((Level) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((Level) <= SECURITY_MAX_IMPERSONATION_LEVEL))
409 #define SECURITY_DYNAMIC_TRACKING (TRUE)
410 #define SECURITY_STATIC_TRACKING (FALSE)
412 typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE
, *PSECURITY_CONTEXT_TRACKING_MODE
;
414 typedef struct _SECURITY_QUALITY_OF_SERVICE
{
416 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
;
417 SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode
;
418 BOOLEAN EffectiveOnly
;
419 } SECURITY_QUALITY_OF_SERVICE
, *PSECURITY_QUALITY_OF_SERVICE
;
421 typedef struct _SE_IMPERSONATION_STATE
{
424 BOOLEAN EffectiveOnly
;
425 SECURITY_IMPERSONATION_LEVEL Level
;
426 } SE_IMPERSONATION_STATE
, *PSE_IMPERSONATION_STATE
;
428 #define OWNER_SECURITY_INFORMATION (0x00000001L)
429 #define GROUP_SECURITY_INFORMATION (0x00000002L)
430 #define DACL_SECURITY_INFORMATION (0x00000004L)
431 #define SACL_SECURITY_INFORMATION (0x00000008L)
432 #define LABEL_SECURITY_INFORMATION (0x00000010L)
434 #define PROTECTED_DACL_SECURITY_INFORMATION (0x80000000L)
435 #define PROTECTED_SACL_SECURITY_INFORMATION (0x40000000L)
436 #define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L)
437 #define UNPROTECTED_SACL_SECURITY_INFORMATION (0x10000000L)
442 // Registry Access Rights
444 #define KEY_QUERY_VALUE (0x0001)
445 #define KEY_SET_VALUE (0x0002)
446 #define KEY_CREATE_SUB_KEY (0x0004)
447 #define KEY_ENUMERATE_SUB_KEYS (0x0008)
448 #define KEY_NOTIFY (0x0010)
449 #define KEY_CREATE_LINK (0x0020)
450 #define KEY_WOW64_32KEY (0x0200)
451 #define KEY_WOW64_64KEY (0x0100)
452 #define KEY_WOW64_RES (0x0300)
454 #define KEY_READ ((STANDARD_RIGHTS_READ |\
456 KEY_ENUMERATE_SUB_KEYS |\
461 #define KEY_WRITE ((STANDARD_RIGHTS_WRITE |\
463 KEY_CREATE_SUB_KEY) \
467 #define KEY_EXECUTE ((KEY_READ) \
471 #define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL |\
474 KEY_CREATE_SUB_KEY |\
475 KEY_ENUMERATE_SUB_KEYS |\
482 // Registry Open/Create Options
484 #define REG_OPTION_RESERVED (0x00000000L)
485 #define REG_OPTION_NON_VOLATILE (0x00000000L)
486 #define REG_OPTION_VOLATILE (0x00000001L)
487 #define REG_OPTION_CREATE_LINK (0x00000002L)
488 #define REG_OPTION_BACKUP_RESTORE (0x00000004L)
489 #define REG_OPTION_OPEN_LINK (0x00000008L)
491 #define REG_LEGAL_OPTION \
492 (REG_OPTION_RESERVED |\
493 REG_OPTION_NON_VOLATILE |\
494 REG_OPTION_VOLATILE |\
495 REG_OPTION_CREATE_LINK |\
496 REG_OPTION_BACKUP_RESTORE |\
497 REG_OPTION_OPEN_LINK)
500 // Key creation/open disposition
502 #define REG_CREATED_NEW_KEY (0x00000001L)
503 #define REG_OPENED_EXISTING_KEY (0x00000002L)
506 // Key restore & hive load flags
508 #define REG_WHOLE_HIVE_VOLATILE (0x00000001L)
509 #define REG_REFRESH_HIVE (0x00000002L)
510 #define REG_NO_LAZY_FLUSH (0x00000004L)
511 #define REG_FORCE_RESTORE (0x00000008L)
512 #define REG_APP_HIVE (0x00000010L)
513 #define REG_PROCESS_PRIVATE (0x00000020L)
514 #define REG_START_JOURNAL (0x00000040L)
515 #define REG_HIVE_EXACT_FILE_GROWTH (0x00000080L)
516 #define REG_HIVE_NO_RM (0x00000100L)
517 #define REG_HIVE_SINGLE_LOG (0x00000200L)
522 #define REG_FORCE_UNLOAD 1
525 // Notify Filter Values
527 #define REG_NOTIFY_CHANGE_NAME (0x00000001L)
528 #define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L)
529 #define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L)
530 #define REG_NOTIFY_CHANGE_SECURITY (0x00000008L)
532 #define REG_LEGAL_CHANGE_FILTER \
533 (REG_NOTIFY_CHANGE_NAME |\
534 REG_NOTIFY_CHANGE_ATTRIBUTES |\
535 REG_NOTIFY_CHANGE_LAST_SET |\
536 REG_NOTIFY_CHANGE_SECURITY)
541 // Thread Access Rights
543 #define THREAD_TERMINATE (0x0001)
544 #define THREAD_SUSPEND_RESUME (0x0002)
545 #define THREAD_ALERT (0x0004)
546 #define THREAD_GET_CONTEXT (0x0008)
547 #define THREAD_SET_CONTEXT (0x0010)
548 #define THREAD_SET_INFORMATION (0x0020)
549 #define THREAD_SET_LIMITED_INFORMATION (0x0400)
550 #define THREAD_QUERY_LIMITED_INFORMATION (0x0800)
551 #if (NTDDI_VERSION >= NTDDI_VISTA)
552 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
555 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
560 // Service Start Types
562 #define SERVICE_BOOT_START 0x00000000
563 #define SERVICE_SYSTEM_START 0x00000001
564 #define SERVICE_AUTO_START 0x00000002
565 #define SERVICE_DEMAND_START 0x00000003
566 #define SERVICE_DISABLED 0x00000004
571 // Architecture Defined Contexts
574 #define SIZE_OF_80387_REGISTERS 80
575 #define CONTEXT_i386 0x10000
576 #define CONTEXT_i486 0x10000
577 #define CONTEXT_CONTROL (CONTEXT_i386|0x00000001L)
578 #define CONTEXT_INTEGER (CONTEXT_i386|0x00000002L)
579 #define CONTEXT_SEGMENTS (CONTEXT_i386|0x00000004L)
580 #define CONTEXT_FLOATING_POINT (CONTEXT_i386|0x00000008L)
581 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386|0x00000010L)
582 #define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L)
583 #define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS)
584 #define MAXIMUM_SUPPORTED_EXTENSION 512
586 #define EXCEPTION_READ_FAULT 0
587 #define EXCEPTION_WRITE_FAULT 1
588 #define EXCEPTION_EXECUTE_FAULT 8
590 typedef struct _FLOATING_SAVE_AREA
{
598 UCHAR RegisterArea
[SIZE_OF_80387_REGISTERS
];
600 } FLOATING_SAVE_AREA
, *PFLOATING_SAVE_AREA
;
602 typedef struct _CONTEXT
{
610 FLOATING_SAVE_AREA FloatSave
;
627 UCHAR ExtendedRegisters
[MAXIMUM_SUPPORTED_EXTENSION
];
630 #elif defined(_M_AMD64)
631 //#error FIXME-TODO: 64-bit
632 #elif defined(_M_ARM)
635 // FIXME: Move to armddk.h?
638 /* The following flags control the contents of the CONTEXT structure. */
640 #define CONTEXT_ARM 0x0000040
641 #define CONTEXT_CONTROL (CONTEXT_ARM | 0x00000001L)
642 #define CONTEXT_INTEGER (CONTEXT_ARM | 0x00000002L)
644 #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER)
646 typedef struct _CONTEXT
{
647 /* The flags values within this flag control the contents of
650 If the context record is used as an input parameter, then
651 for each portion of the context record controlled by a flag
652 whose value is set, it is assumed that that portion of the
653 context record contains valid context. If the context record
654 is being used to modify a thread's context, then only that
655 portion of the threads context will be modified.
657 If the context record is used as an IN OUT parameter to capture
658 the context of a thread, then only those portions of the thread's
659 context corresponding to set flags will be returned.
661 The context record is never used as an OUT only parameter. */
665 /* This section is specified/returned if the ContextFlags word contains
666 the flag CONTEXT_INTEGER. */
688 #error "Undefined processor architecture"
696 #define EXCEPTION_NONCONTINUABLE 1
697 #define EXCEPTION_MAXIMUM_PARAMETERS 15
699 typedef struct _EXCEPTION_RECORD
{
700 NTSTATUS ExceptionCode
;
701 ULONG ExceptionFlags
;
702 struct _EXCEPTION_RECORD
*ExceptionRecord
;
703 PVOID ExceptionAddress
;
704 ULONG NumberParameters
;
705 ULONG_PTR ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
706 } EXCEPTION_RECORD
, *PEXCEPTION_RECORD
;
708 typedef struct _EXCEPTION_RECORD32
{
709 NTSTATUS ExceptionCode
;
710 ULONG ExceptionFlags
;
711 ULONG ExceptionRecord
;
712 ULONG ExceptionAddress
;
713 ULONG NumberParameters
;
714 ULONG ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
715 } EXCEPTION_RECORD32
, *PEXCEPTION_RECORD32
;
717 typedef struct _EXCEPTION_RECORD64
{
718 NTSTATUS ExceptionCode
;
719 ULONG ExceptionFlags
;
720 ULONG64 ExceptionRecord
;
721 ULONG64 ExceptionAddress
;
722 ULONG NumberParameters
;
723 ULONG __unusedAlignment
;
724 ULONG64 ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
725 } EXCEPTION_RECORD64
, *PEXCEPTION_RECORD64
;
727 typedef struct _EXCEPTION_POINTERS
{
728 PEXCEPTION_RECORD ExceptionRecord
;
729 PCONTEXT ContextRecord
;
730 } EXCEPTION_POINTERS
, *PEXCEPTION_POINTERS
;
737 typedef struct _QUOTA_LIMITS
{
738 SIZE_T PagedPoolLimit
;
739 SIZE_T NonPagedPoolLimit
;
740 SIZE_T MinimumWorkingSetSize
;
741 SIZE_T MaximumWorkingSetSize
;
742 SIZE_T PagefileLimit
;
743 LARGE_INTEGER TimeLimit
;
744 } QUOTA_LIMITS
, *PQUOTA_LIMITS
;
746 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
747 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
748 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
749 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
750 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010