4 /* Helper macro to enable gcc's extension. */
5 #ifndef __GNU_EXTENSION
7 #define __GNU_EXTENSION __extension__
9 #define __GNU_EXTENSION
23 #endif /* GUID_DEFINED */
31 #define NTKERNELAPI DECLSPEC_IMPORT
34 #define PORT_MAXIMUM_MESSAGE_LENGTH 512
36 #define PORT_MAXIMUM_MESSAGE_LENGTH 256
43 // Indicate if #pragma alloc_text() is supported
45 #if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_IA64)
46 #define ALLOC_PRAGMA 1
50 // Indicate if #pragma data_seg() is supported
52 #if defined(_M_IX86) || defined(_M_AMD64)
53 #define ALLOC_DATA_PRAGMA 1
62 #define ALIGN_DOWN(s, t) \
63 ((ULONG)(s) & ~(sizeof(t) - 1))
65 #define ALIGN_UP(s, t) \
66 (ALIGN_DOWN(((ULONG)(s) + sizeof(t) - 1), t))
68 #define ALIGN_DOWN_POINTER(p, t) \
69 ((PVOID)((ULONG_PTR)(p) & ~((ULONG_PTR)sizeof(t) - 1)))
71 #define ALIGN_UP_POINTER(p, t) \
72 (ALIGN_DOWN_POINTER(((ULONG_PTR)(p) + sizeof(t) - 1), t))
76 typedef UCHAR KPROCESSOR_MODE
;
77 typedef LONG KPRIORITY
;
78 typedef PVOID PSECURITY_DESCRIPTOR
;
79 typedef ULONG SECURITY_INFORMATION
, *PSECURITY_INFORMATION
;
81 /* Structures not exposed to drivers */
82 typedef struct _OBJECT_TYPE
*POBJECT_TYPE
;
83 typedef struct _HAL_DISPATCH_TABLE
*PHAL_DISPATCH_TABLE
;
84 typedef struct _HAL_PRIVATE_DISPATCH_TABLE
*PHAL_PRIVATE_DISPATCH_TABLE
;
85 typedef struct _DEVICE_HANDLER_OBJECT
*PDEVICE_HANDLER_OBJECT
;
86 typedef struct _BUS_HANDLER
*PBUS_HANDLER
;
88 typedef struct _ADAPTER_OBJECT
*PADAPTER_OBJECT
;
89 typedef struct _CALLBACK_OBJECT
*PCALLBACK_OBJECT
;
90 typedef struct _ETHREAD
*PETHREAD
;
91 typedef struct _EPROCESS
*PEPROCESS
;
92 typedef struct _IO_TIMER
*PIO_TIMER
;
93 typedef struct _KINTERRUPT
*PKINTERRUPT
;
94 typedef struct _KPROCESS
*PKPROCESS
;
95 typedef struct _KTHREAD
*PKTHREAD
, *PRKTHREAD
;
98 typedef struct _CONTEXT
*PCONTEXT
;
101 // Resource list definitions
103 typedef int CM_RESOURCE_TYPE
;
105 #define CmResourceTypeNull 0
106 #define CmResourceTypePort 1
107 #define CmResourceTypeInterrupt 2
108 #define CmResourceTypeMemory 3
109 #define CmResourceTypeDma 4
110 #define CmResourceTypeDeviceSpecific 5
111 #define CmResourceTypeBusNumber 6
112 #define CmResourceTypeNonArbitrated 128
113 #define CmResourceTypeConfigData 128
114 #define CmResourceTypeDevicePrivate 129
115 #define CmResourceTypePcCardConfig 130
116 #define CmResourceTypeMfCardConfig 131
118 typedef enum _INTERFACE_TYPE
{
119 InterfaceTypeUndefined
= -1,
137 } INTERFACE_TYPE
, *PINTERFACE_TYPE
;
139 /* IO_RESOURCE_DESCRIPTOR.Option */
141 #define IO_RESOURCE_PREFERRED 0x01
142 #define IO_RESOURCE_DEFAULT 0x02
143 #define IO_RESOURCE_ALTERNATIVE 0x08
145 typedef struct _IO_RESOURCE_DESCRIPTOR
{
148 UCHAR ShareDisposition
;
156 PHYSICAL_ADDRESS MinimumAddress
;
157 PHYSICAL_ADDRESS MaximumAddress
;
162 PHYSICAL_ADDRESS MinimumAddress
;
163 PHYSICAL_ADDRESS MaximumAddress
;
170 ULONG MinimumChannel
;
171 ULONG MaximumChannel
;
176 PHYSICAL_ADDRESS MinimumAddress
;
177 PHYSICAL_ADDRESS MaximumAddress
;
194 } IO_RESOURCE_DESCRIPTOR
, *PIO_RESOURCE_DESCRIPTOR
;
196 typedef struct _IO_RESOURCE_LIST
{
200 IO_RESOURCE_DESCRIPTOR Descriptors
[1];
201 } IO_RESOURCE_LIST
, *PIO_RESOURCE_LIST
;
203 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST
{
205 INTERFACE_TYPE InterfaceType
;
209 ULONG AlternativeLists
;
210 IO_RESOURCE_LIST List
[1];
211 } IO_RESOURCE_REQUIREMENTS_LIST
, *PIO_RESOURCE_REQUIREMENTS_LIST
;
216 extern ULONG NtGlobalFlag
;
219 #include <pshpack4.h>
220 typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR
{
222 UCHAR ShareDisposition
;
226 PHYSICAL_ADDRESS Start
;
230 PHYSICAL_ADDRESS Start
;
238 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
240 __GNU_EXTENSION
union {
256 PHYSICAL_ADDRESS Start
;
276 } DeviceSpecificData
;
277 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
279 PHYSICAL_ADDRESS Start
;
283 PHYSICAL_ADDRESS Start
;
287 PHYSICAL_ADDRESS Start
;
292 } CM_PARTIAL_RESOURCE_DESCRIPTOR
, *PCM_PARTIAL_RESOURCE_DESCRIPTOR
;
296 // Section map options
298 typedef enum _SECTION_INHERIT
{
304 // Section access rights
306 #define SECTION_QUERY 0x0001
307 #define SECTION_MAP_WRITE 0x0002
308 #define SECTION_MAP_READ 0x0004
309 #define SECTION_MAP_EXECUTE 0x0008
310 #define SECTION_EXTEND_SIZE 0x0010
311 #define SECTION_MAP_EXECUTE_EXPLICIT 0x0020
313 #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
314 SECTION_MAP_WRITE | \
316 SECTION_MAP_EXECUTE | \
319 #define SESSION_QUERY_ACCESS 0x0001
320 #define SESSION_MODIFY_ACCESS 0x0002
322 #define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
323 SESSION_QUERY_ACCESS | \
324 SESSION_MODIFY_ACCESS)
328 #define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
330 #define PAGE_NOACCESS 0x01
331 #define PAGE_READONLY 0x02
332 #define PAGE_READWRITE 0x04
333 #define PAGE_WRITECOPY 0x08
334 #define PAGE_EXECUTE 0x10
335 #define PAGE_EXECUTE_READ 0x20
336 #define PAGE_EXECUTE_READWRITE 0x40
337 #define PAGE_EXECUTE_WRITECOPY 0x80
338 #define PAGE_GUARD 0x100
339 #define PAGE_NOCACHE 0x200
340 #define PAGE_WRITECOMBINE 0x400
342 #define MEM_COMMIT 0x1000
343 #define MEM_RESERVE 0x2000
344 #define MEM_DECOMMIT 0x4000
345 #define MEM_RELEASE 0x8000
346 #define MEM_FREE 0x10000
347 #define MEM_PRIVATE 0x20000
348 #define MEM_MAPPED 0x40000
349 #define MEM_RESET 0x80000
350 #define MEM_TOP_DOWN 0x100000
351 #define MEM_LARGE_PAGES 0x20000000
352 #define MEM_4MB_PAGES 0x80000000
354 #define SEC_RESERVE 0x4000000
355 #define SEC_LARGE_PAGES 0x80000000
357 #define PROCESS_DUP_HANDLE (0x0040)
359 #if (NTDDI_VERSION >= NTDDI_VISTA)
360 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
363 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
370 // Processor features
372 #define PF_FLOATING_POINT_PRECISION_ERRATA 0
373 #define PF_FLOATING_POINT_EMULATED 1
374 #define PF_COMPARE_EXCHANGE_DOUBLE 2
375 #define PF_MMX_INSTRUCTIONS_AVAILABLE 3
376 #define PF_PPC_MOVEMEM_64BIT_OK 4
377 #define PF_ALPHA_BYTE_INSTRUCTIONS 5
378 #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
379 #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
380 #define PF_RDTSC_INSTRUCTION_AVAILABLE 8
381 #define PF_PAE_ENABLED 9
382 #define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
383 #define PF_SSE_DAZ_MODE_AVAILABLE 11
384 #define PF_NX_ENABLED 12
385 #define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
386 #define PF_COMPARE_EXCHANGE128 14
387 #define PF_COMPARE64_EXCHANGE128 15
388 #define PF_CHANNELS_ENABLED 16
393 // Intrinsics (note: taken from our winnt.h)
396 #if defined(__GNUC__)
398 static __inline__ BOOLEAN
399 InterlockedBitTestAndSet(IN LONG
volatile *Base
,
404 __asm__
__volatile__("lock "
407 :"=r" (OldBit
),"+m" (*Base
)
412 return (_InterlockedOr(Base
, 1 << Bit
) >> Bit
) & 1;
416 static __inline__ BOOLEAN
417 InterlockedBitTestAndReset(IN LONG
volatile *Base
,
422 __asm__
__volatile__("lock "
425 :"=r" (OldBit
),"+m" (*Base
)
430 return (_InterlockedAnd(Base
, ~(1 << Bit
)) >> Bit
) & 1;
436 #define BitScanForward _BitScanForward
437 #define BitScanReverse _BitScanReverse
439 #define BitTest _bittest
440 #define BitTestAndComplement _bittestandcomplement
441 #define BitTestAndSet _bittestandset
442 #define BitTestAndReset _bittestandreset
443 #define InterlockedBitTestAndSet _interlockedbittestandset
444 #define InterlockedBitTestAndReset _interlockedbittestandreset
447 /** INTERLOCKED FUNCTIONS *****************************************************/
449 #if !defined(__INTERLOCKED_DECLARED)
450 #define __INTERLOCKED_DECLARED
453 #if defined(NO_INTERLOCKED_INTRINSICS)
457 InterlockedIncrement(
458 IN OUT LONG
volatile *Addend
);
463 InterlockedDecrement(
464 IN OUT LONG
volatile *Addend
);
469 InterlockedCompareExchange(
470 IN OUT LONG
volatile *Destination
,
478 IN OUT LONG
volatile *Destination
,
484 InterlockedExchangeAdd(
485 IN OUT LONG
volatile *Addend
,
488 #else // !defined(NO_INTERLOCKED_INTRINSICS)
490 #define InterlockedExchange _InterlockedExchange
491 #define InterlockedIncrement _InterlockedIncrement
492 #define InterlockedDecrement _InterlockedDecrement
493 #define InterlockedExchangeAdd _InterlockedExchangeAdd
494 #define InterlockedCompareExchange _InterlockedCompareExchange
495 #define InterlockedOr _InterlockedOr
496 #define InterlockedAnd _InterlockedAnd
497 #define InterlockedXor _InterlockedXor
499 #endif // !defined(NO_INTERLOCKED_INTRINSICS)
501 #endif // defined (_X86_)
503 #if !defined (_WIN64)
506 * InterlockedExchangePointer(
507 * IN OUT PVOID volatile *Target,
510 #define InterlockedExchangePointer(Target, Value) \
511 ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
515 * InterlockedCompareExchangePointer(
516 * IN OUT PVOID *Destination,
518 * IN PVOID Comparand)
520 #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
521 ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
523 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
524 #define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
525 #define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
527 #endif // !defined (_WIN64)
529 #if defined (_M_AMD64)
531 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONGLONG *)a, (LONGLONG)b)
532 #define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONGLONG *)a)
533 #define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONGLONG *)a)
534 #define InterlockedAnd _InterlockedAnd
535 #define InterlockedOr _InterlockedOr
536 #define InterlockedXor _InterlockedXor
537 #define InterlockedIncrement _InterlockedIncrement
538 #define InterlockedDecrement _InterlockedDecrement
539 #define InterlockedAdd _InterlockedAdd
540 #define InterlockedExchange _InterlockedExchange
541 #define InterlockedExchangeAdd _InterlockedExchangeAdd
542 #define InterlockedCompareExchange _InterlockedCompareExchange
543 #define InterlockedAnd64 _InterlockedAnd64
544 #define InterlockedOr64 _InterlockedOr64
545 #define InterlockedXor64 _InterlockedXor64
546 #define InterlockedIncrement64 _InterlockedIncrement64
547 #define InterlockedDecrement64 _InterlockedDecrement64
548 #define InterlockedAdd64 _InterlockedAdd64
549 #define InterlockedExchange64 _InterlockedExchange64
550 #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
551 #define InterlockedCompareExchange64 _InterlockedCompareExchange64
552 #define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
553 #define InterlockedExchangePointer _InterlockedExchangePointer
554 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
555 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
559 #if defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
560 //#if !defined(_X86AMD64_) // FIXME: what's _X86AMD64_ used for?
564 IN OUT LONG64
volatile *Addend
,
567 return InterlockedExchangeAdd64(Addend
, Value
) + Value
;
572 #endif /* !__INTERLOCKED_DECLARED */
575 #define YieldProcessor _mm_pause
576 #elif defined (_M_AMD64)
577 #define YieldProcessor _mm_pause
578 #elif defined(_M_PPC)
579 #define YieldProcessor() __asm__ __volatile__("nop");
580 #elif defined(_M_MIPS)
581 #define YieldProcessor() __asm__ __volatile__("nop");
582 #elif defined(_M_ARM)
583 #define YieldProcessor()
585 #error Unknown architecture
593 #ifndef _SLIST_HEADER_
594 #define _SLIST_HEADER_
597 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY
*PSLIST_ENTRY
;
598 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY
{
601 typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER
{
608 ULONGLONG Sequence
:9;
609 ULONGLONG NextEntry
:39;
610 ULONGLONG HeaderType
:1;
612 ULONGLONG Reserved
:59;
617 ULONGLONG Sequence
:48;
618 ULONGLONG HeaderType
:1;
620 ULONGLONG Reserved
:2;
621 ULONGLONG NextEntry
:60;
623 } SLIST_HEADER
, *PSLIST_HEADER
;
625 #define SLIST_ENTRY SINGLE_LIST_ENTRY
626 #define _SLIST_ENTRY _SINGLE_LIST_ENTRY
627 #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
628 typedef union _SLIST_HEADER
{
635 } SLIST_HEADER
, *PSLIST_HEADER
;
638 #endif /* _SLIST_HEADER_ */
643 // Power States/Levels
645 typedef enum _SYSTEM_POWER_STATE
{
646 PowerSystemUnspecified
,
648 PowerSystemSleeping1
,
649 PowerSystemSleeping2
,
650 PowerSystemSleeping3
,
651 PowerSystemHibernate
,
654 } SYSTEM_POWER_STATE
, *PSYSTEM_POWER_STATE
;
656 #define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
658 typedef enum _POWER_INFORMATION_LEVEL
{
661 VerifySystemPolicyAc
,
662 VerifySystemPolicyDc
,
663 SystemPowerCapabilities
,
665 SystemPowerStateHandler
,
666 ProcessorStateHandler
,
667 SystemPowerPolicyCurrent
,
668 AdministratorPowerPolicy
,
669 SystemReserveHiberFile
,
670 ProcessorInformation
,
671 SystemPowerInformation
,
672 ProcessorStateHandler2
,
675 SystemExecutionState
,
676 SystemPowerStateNotifyHandler
,
677 ProcessorPowerPolicyAc
,
678 ProcessorPowerPolicyDc
,
679 VerifyProcessorPowerPolicyAc
,
680 VerifyProcessorPowerPolicyDc
,
681 ProcessorPowerPolicyCurrent
682 } POWER_INFORMATION_LEVEL
;
688 PowerActionHibernate
,
690 PowerActionShutdownReset
,
691 PowerActionShutdownOff
,
693 } POWER_ACTION
, *PPOWER_ACTION
;
695 typedef enum _DEVICE_POWER_STATE
{
696 PowerDeviceUnspecified
,
702 } DEVICE_POWER_STATE
, *PDEVICE_POWER_STATE
;
704 #define ES_SYSTEM_REQUIRED 0x00000001
705 #define ES_DISPLAY_REQUIRED 0x00000002
706 #define ES_USER_PRESENT 0x00000004
707 #define ES_CONTINUOUS 0x80000000
709 typedef ULONG EXECUTION_STATE
;
719 // Access/Security Stuff
721 typedef ULONG ACCESS_MASK
, *PACCESS_MASK
;
722 typedef PVOID PACCESS_TOKEN
;
724 #define DELETE 0x00010000L
725 #define READ_CONTROL 0x00020000L
726 #define WRITE_DAC 0x00040000L
727 #define WRITE_OWNER 0x00080000L
728 #define SYNCHRONIZE 0x00100000L
729 #define STANDARD_RIGHTS_REQUIRED 0x000F0000L
730 #define STANDARD_RIGHTS_READ READ_CONTROL
731 #define STANDARD_RIGHTS_WRITE READ_CONTROL
732 #define STANDARD_RIGHTS_EXECUTE READ_CONTROL
733 #define STANDARD_RIGHTS_ALL 0x001F0000L
734 #define SPECIFIC_RIGHTS_ALL 0x0000FFFFL
735 #define ACCESS_SYSTEM_SECURITY 0x01000000L
736 #define MAXIMUM_ALLOWED 0x02000000L
737 #define GENERIC_READ 0x80000000L
738 #define GENERIC_WRITE 0x40000000L
739 #define GENERIC_EXECUTE 0x20000000L
740 #define GENERIC_ALL 0x10000000L
742 typedef struct _GENERIC_MAPPING
{
743 ACCESS_MASK GenericRead
;
744 ACCESS_MASK GenericWrite
;
745 ACCESS_MASK GenericExecute
;
746 ACCESS_MASK GenericAll
;
747 } GENERIC_MAPPING
, *PGENERIC_MAPPING
;
749 #define ACL_REVISION 2
750 #define ACL_REVISION_DS 4
752 #define ACL_REVISION1 1
753 #define ACL_REVISION2 2
754 #define ACL_REVISION3 3
755 #define ACL_REVISION4 4
756 #define MIN_ACL_REVISION ACL_REVISION2
757 #define MAX_ACL_REVISION ACL_REVISION4
759 typedef struct _ACL
{
770 // Current security descriptor revision value
772 #define SECURITY_DESCRIPTOR_REVISION (1)
773 #define SECURITY_DESCRIPTOR_REVISION1 (1)
776 // Privilege attributes
778 #define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
779 #define SE_PRIVILEGE_ENABLED (0x00000002L)
780 #define SE_PRIVILEGE_REMOVED (0X00000004L)
781 #define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
783 #define SE_PRIVILEGE_VALID_ATTRIBUTES (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
784 SE_PRIVILEGE_ENABLED | \
785 SE_PRIVILEGE_REMOVED | \
786 SE_PRIVILEGE_USED_FOR_ACCESS)
788 #include <pshpack4.h>
789 typedef struct _LUID_AND_ATTRIBUTES
{
792 } LUID_AND_ATTRIBUTES
, *PLUID_AND_ATTRIBUTES
;
794 typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY
[ANYSIZE_ARRAY
];
795 typedef LUID_AND_ATTRIBUTES_ARRAY
*PLUID_AND_ATTRIBUTES_ARRAY
;
802 #define PRIVILEGE_SET_ALL_NECESSARY (1)
804 typedef struct _PRIVILEGE_SET
{
805 ULONG PrivilegeCount
;
807 LUID_AND_ATTRIBUTES Privilege
[ANYSIZE_ARRAY
];
808 } PRIVILEGE_SET
,*PPRIVILEGE_SET
;
810 typedef enum _SECURITY_IMPERSONATION_LEVEL
{
812 SecurityIdentification
,
813 SecurityImpersonation
,
815 } SECURITY_IMPERSONATION_LEVEL
, * PSECURITY_IMPERSONATION_LEVEL
;
817 #define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
818 #define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
819 #define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
820 #define VALID_IMPERSONATION_LEVEL(Level) (((Level) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((Level) <= SECURITY_MAX_IMPERSONATION_LEVEL))
822 #define SECURITY_DYNAMIC_TRACKING (TRUE)
823 #define SECURITY_STATIC_TRACKING (FALSE)
825 typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE
, *PSECURITY_CONTEXT_TRACKING_MODE
;
827 typedef struct _SECURITY_QUALITY_OF_SERVICE
{
829 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
;
830 SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode
;
831 BOOLEAN EffectiveOnly
;
832 } SECURITY_QUALITY_OF_SERVICE
, *PSECURITY_QUALITY_OF_SERVICE
;
834 typedef struct _SE_IMPERSONATION_STATE
{
837 BOOLEAN EffectiveOnly
;
838 SECURITY_IMPERSONATION_LEVEL Level
;
839 } SE_IMPERSONATION_STATE
, *PSE_IMPERSONATION_STATE
;
841 #define OWNER_SECURITY_INFORMATION (0x00000001L)
842 #define GROUP_SECURITY_INFORMATION (0x00000002L)
843 #define DACL_SECURITY_INFORMATION (0x00000004L)
844 #define SACL_SECURITY_INFORMATION (0x00000008L)
845 #define LABEL_SECURITY_INFORMATION (0x00000010L)
847 #define PROTECTED_DACL_SECURITY_INFORMATION (0x80000000L)
848 #define PROTECTED_SACL_SECURITY_INFORMATION (0x40000000L)
849 #define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L)
850 #define UNPROTECTED_SACL_SECURITY_INFORMATION (0x10000000L)
855 // Registry Access Rights
857 #define KEY_QUERY_VALUE (0x0001)
858 #define KEY_SET_VALUE (0x0002)
859 #define KEY_CREATE_SUB_KEY (0x0004)
860 #define KEY_ENUMERATE_SUB_KEYS (0x0008)
861 #define KEY_NOTIFY (0x0010)
862 #define KEY_CREATE_LINK (0x0020)
863 #define KEY_WOW64_32KEY (0x0200)
864 #define KEY_WOW64_64KEY (0x0100)
865 #define KEY_WOW64_RES (0x0300)
867 #define KEY_READ ((STANDARD_RIGHTS_READ |\
869 KEY_ENUMERATE_SUB_KEYS |\
874 #define KEY_WRITE ((STANDARD_RIGHTS_WRITE |\
876 KEY_CREATE_SUB_KEY) \
880 #define KEY_EXECUTE ((KEY_READ) \
884 #define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL |\
887 KEY_CREATE_SUB_KEY |\
888 KEY_ENUMERATE_SUB_KEYS |\
895 // Registry Open/Create Options
897 #define REG_OPTION_RESERVED (0x00000000L)
898 #define REG_OPTION_NON_VOLATILE (0x00000000L)
899 #define REG_OPTION_VOLATILE (0x00000001L)
900 #define REG_OPTION_CREATE_LINK (0x00000002L)
901 #define REG_OPTION_BACKUP_RESTORE (0x00000004L)
902 #define REG_OPTION_OPEN_LINK (0x00000008L)
904 #define REG_LEGAL_OPTION \
905 (REG_OPTION_RESERVED |\
906 REG_OPTION_NON_VOLATILE |\
907 REG_OPTION_VOLATILE |\
908 REG_OPTION_CREATE_LINK |\
909 REG_OPTION_BACKUP_RESTORE |\
910 REG_OPTION_OPEN_LINK)
913 // Key creation/open disposition
915 #define REG_CREATED_NEW_KEY (0x00000001L)
916 #define REG_OPENED_EXISTING_KEY (0x00000002L)
919 // Key restore & hive load flags
921 #define REG_WHOLE_HIVE_VOLATILE (0x00000001L)
922 #define REG_REFRESH_HIVE (0x00000002L)
923 #define REG_NO_LAZY_FLUSH (0x00000004L)
924 #define REG_FORCE_RESTORE (0x00000008L)
925 #define REG_APP_HIVE (0x00000010L)
926 #define REG_PROCESS_PRIVATE (0x00000020L)
927 #define REG_START_JOURNAL (0x00000040L)
928 #define REG_HIVE_EXACT_FILE_GROWTH (0x00000080L)
929 #define REG_HIVE_NO_RM (0x00000100L)
930 #define REG_HIVE_SINGLE_LOG (0x00000200L)
935 #define REG_FORCE_UNLOAD 1
938 // Notify Filter Values
940 #define REG_NOTIFY_CHANGE_NAME (0x00000001L)
941 #define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L)
942 #define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L)
943 #define REG_NOTIFY_CHANGE_SECURITY (0x00000008L)
945 #define REG_LEGAL_CHANGE_FILTER \
946 (REG_NOTIFY_CHANGE_NAME |\
947 REG_NOTIFY_CHANGE_ATTRIBUTES |\
948 REG_NOTIFY_CHANGE_LAST_SET |\
949 REG_NOTIFY_CHANGE_SECURITY)
954 // Thread Access Rights
956 #define THREAD_TERMINATE (0x0001)
957 #define THREAD_SUSPEND_RESUME (0x0002)
958 #define THREAD_ALERT (0x0004)
959 #define THREAD_GET_CONTEXT (0x0008)
960 #define THREAD_SET_CONTEXT (0x0010)
961 #define THREAD_SET_INFORMATION (0x0020)
962 #define THREAD_SET_LIMITED_INFORMATION (0x0400)
963 #define THREAD_QUERY_LIMITED_INFORMATION (0x0800)
964 #if (NTDDI_VERSION >= NTDDI_VISTA)
965 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
968 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
973 // Service Start Types
975 #define SERVICE_BOOT_START 0x00000000
976 #define SERVICE_SYSTEM_START 0x00000001
977 #define SERVICE_AUTO_START 0x00000002
978 #define SERVICE_DEMAND_START 0x00000003
979 #define SERVICE_DISABLED 0x00000004
984 #define EXCEPTION_NONCONTINUABLE 1
985 #define EXCEPTION_MAXIMUM_PARAMETERS 15
987 typedef struct _EXCEPTION_RECORD
{
988 NTSTATUS ExceptionCode
;
989 ULONG ExceptionFlags
;
990 struct _EXCEPTION_RECORD
*ExceptionRecord
;
991 PVOID ExceptionAddress
;
992 ULONG NumberParameters
;
993 ULONG_PTR ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
994 } EXCEPTION_RECORD
, *PEXCEPTION_RECORD
;
996 typedef struct _EXCEPTION_RECORD32
{
997 NTSTATUS ExceptionCode
;
998 ULONG ExceptionFlags
;
999 ULONG ExceptionRecord
;
1000 ULONG ExceptionAddress
;
1001 ULONG NumberParameters
;
1002 ULONG ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
1003 } EXCEPTION_RECORD32
, *PEXCEPTION_RECORD32
;
1005 typedef struct _EXCEPTION_RECORD64
{
1006 NTSTATUS ExceptionCode
;
1007 ULONG ExceptionFlags
;
1008 ULONG64 ExceptionRecord
;
1009 ULONG64 ExceptionAddress
;
1010 ULONG NumberParameters
;
1011 ULONG __unusedAlignment
;
1012 ULONG64 ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
1013 } EXCEPTION_RECORD64
, *PEXCEPTION_RECORD64
;
1015 typedef struct _EXCEPTION_POINTERS
{
1016 PEXCEPTION_RECORD ExceptionRecord
;
1017 PCONTEXT ContextRecord
;
1018 } EXCEPTION_POINTERS
, *PEXCEPTION_POINTERS
;
1025 typedef struct _QUOTA_LIMITS
{
1026 SIZE_T PagedPoolLimit
;
1027 SIZE_T NonPagedPoolLimit
;
1028 SIZE_T MinimumWorkingSetSize
;
1029 SIZE_T MaximumWorkingSetSize
;
1030 SIZE_T PagefileLimit
;
1031 LARGE_INTEGER TimeLimit
;
1032 } QUOTA_LIMITS
, *PQUOTA_LIMITS
;
1034 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
1035 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
1036 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
1037 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
1038 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
1041 /******************************************************************************
1042 * WINBASE Functions *
1043 ******************************************************************************/
1044 #if !defined(_WINBASE_)
1048 #define InterlockedPopEntrySList(Head) \
1049 ExpInterlockedPopEntrySList(Head)
1051 #define InterlockedPushEntrySList(Head, Entry) \
1052 ExpInterlockedPushEntrySList(Head, Entry)
1054 #define InterlockedFlushSList(Head) \
1055 ExpInterlockedFlushSList(Head)
1057 #define QueryDepthSList(Head) \
1058 ExQueryDepthSList(Head)
1060 #else // !defined(_WIN64)
1065 InterlockedPopEntrySList(
1066 IN PSLIST_HEADER ListHead
);
1071 InterlockedPushEntrySList(
1072 IN PSLIST_HEADER ListHead
,
1073 IN PSLIST_ENTRY ListEntry
);
1075 #define InterlockedFlushSList(ListHead) \
1076 ExInterlockedFlushSList(ListHead)
1078 #define QueryDepthSList(Head) \
1079 ExQueryDepthSList(Head)
1081 #endif // !defined(_WIN64)
1083 #endif // !defined(_WINBASE_)
1086 /******************************************************************************
1088 ******************************************************************************/
1090 typedef struct _DISPATCHER_HEADER
1092 __GNU_EXTENSION
union
1094 __GNU_EXTENSION
struct
1097 __GNU_EXTENSION
union
1102 __GNU_EXTENSION
union
1107 __GNU_EXTENSION
union
1110 BOOLEAN DebugActive
;
1116 LIST_ENTRY WaitListHead
;
1117 } DISPATCHER_HEADER
, *PDISPATCHER_HEADER
;
1119 typedef ULONG_PTR KSPIN_LOCK
, *PKSPIN_LOCK
;
1121 typedef struct _KEVENT
{
1122 DISPATCHER_HEADER Header
;
1123 } KEVENT
, *PKEVENT
, *RESTRICTED_POINTER PRKEVENT
;
1125 typedef struct _KSEMAPHORE
{
1126 DISPATCHER_HEADER Header
;
1128 } KSEMAPHORE
, *PKSEMAPHORE
, *RESTRICTED_POINTER PRKSEMAPHORE
;
1130 /******************************************************************************
1132 ******************************************************************************/
1134 #define RTL_REGISTRY_ABSOLUTE 0
1135 #define RTL_REGISTRY_SERVICES 1
1136 #define RTL_REGISTRY_CONTROL 2
1137 #define RTL_REGISTRY_WINDOWS_NT 3
1138 #define RTL_REGISTRY_DEVICEMAP 4
1139 #define RTL_REGISTRY_USER 5
1140 #define RTL_REGISTRY_MAXIMUM 6
1141 #define RTL_REGISTRY_HANDLE 0x40000000
1142 #define RTL_REGISTRY_OPTIONAL 0x80000000
1144 /* RTL_QUERY_REGISTRY_TABLE.Flags */
1145 #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001
1146 #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002
1147 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004
1148 #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008
1149 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010
1150 #define RTL_QUERY_REGISTRY_DIRECT 0x00000020
1151 #define RTL_QUERY_REGISTRY_DELETE 0x00000040
1153 typedef struct _RTL_BITMAP
{
1156 } RTL_BITMAP
, *PRTL_BITMAP
;
1158 typedef struct _RTL_BITMAP_RUN
{
1159 ULONG StartingIndex
;
1161 } RTL_BITMAP_RUN
, *PRTL_BITMAP_RUN
;
1164 (DDKAPI
*PRTL_QUERY_REGISTRY_ROUTINE
)(
1168 IN ULONG ValueLength
,
1170 IN PVOID EntryContext
);
1172 typedef struct _RTL_QUERY_REGISTRY_TABLE
{
1173 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine
;
1179 ULONG DefaultLength
;
1180 } RTL_QUERY_REGISTRY_TABLE
, *PRTL_QUERY_REGISTRY_TABLE
;
1182 typedef struct _TIME_FIELDS
{
1189 CSHORT Milliseconds
;
1191 } TIME_FIELDS
, *PTIME_FIELDS
;
1194 /******************************************************************************
1196 ******************************************************************************/
1202 IN PVOID FailedAssertion
,
1204 IN ULONG LineNumber
,
1209 * IN VOID UNALIGNED *Destination,
1210 * IN CONST VOID UNALIGNED *Source,
1213 #define RtlCopyMemory(Destination, Source, Length) \
1214 memcpy(Destination, Source, Length)
1216 #define RtlCopyBytes RtlCopyMemory
1218 #if defined(_M_AMD64)
1222 RtlCopyMemoryNonTemporal(
1223 VOID UNALIGNED
*Destination
,
1224 CONST VOID UNALIGNED
*Source
,
1227 #define RtlCopyMemoryNonTemporal RtlCopyMemory
1235 #define RtlEqualLuid(Luid1, Luid2) \
1236 (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
1240 * IN VOID UNALIGNED *Destination,
1241 * IN CONST VOID UNALIGNED *Source,
1244 #define RtlEqualMemory(Destination, Source, Length) \
1245 (!memcmp(Destination, Source, Length))
1249 * IN VOID UNALIGNED *Destination,
1253 #define RtlFillMemory(Destination, Length, Fill) \
1254 memset(Destination, Fill, Length)
1256 #define RtlFillBytes RtlFillMemory
1261 RtlFreeUnicodeString(
1262 IN PUNICODE_STRING UnicodeString
);
1268 IN PUNICODE_STRING GuidString
,
1274 RtlInitUnicodeString(
1275 IN OUT PUNICODE_STRING DestinationString
,
1276 IN PCWSTR SourceString
);
1280 * IN VOID UNALIGNED *Destination,
1281 * IN CONST VOID UNALIGNED *Source,
1284 #define RtlMoveMemory(Destination, Source, Length) \
1285 memmove(Destination, Source, Length)
1292 OUT PUNICODE_STRING GuidString
);
1296 * IN VOID UNALIGNED *Destination,
1299 #define RtlZeroMemory(Destination, Length) \
1300 memset(Destination, 0, Length)
1302 #define RtlZeroBytes RtlZeroMemory
1305 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1310 IN PRTL_BITMAP BitMapHeader
,
1311 IN ULONG StartingIndex
,
1318 IN PRTL_BITMAP BitMapHeader
,
1319 IN ULONG StartingIndex
,
1325 RtlAnsiStringToUnicodeString(
1326 IN OUT PUNICODE_STRING DestinationString
,
1327 IN PANSI_STRING SourceString
,
1328 IN BOOLEAN AllocateDestinationString
);
1333 RtlxAnsiStringToUnicodeSize(
1334 IN PCANSI_STRING AnsiString
);
1336 #define RtlAnsiStringToUnicodeSize(String) ( \
1337 NLS_MB_CODE_PAGE_TAG ? \
1338 RtlxAnsiStringToUnicodeSize(String) : \
1339 ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
1345 RtlAppendUnicodeStringToString(
1346 IN OUT PUNICODE_STRING Destination
,
1347 IN PCUNICODE_STRING Source
);
1352 RtlAppendUnicodeToString(
1353 IN OUT PUNICODE_STRING Destination
,
1359 RtlCheckRegistryKey(
1360 IN ULONG RelativeTo
,
1367 IN PRTL_BITMAP BitMapHeader
);
1373 IN PRTL_BITMAP BitMapHeader
,
1374 IN ULONG StartingIndex
,
1375 IN ULONG NumberToClear
);
1381 IN CONST VOID
*Source1
,
1382 IN CONST VOID
*Source2
,
1388 RtlCompareUnicodeString(
1389 IN PCUNICODE_STRING String1
,
1390 IN PCUNICODE_STRING String2
,
1391 IN BOOLEAN CaseInSensitive
);
1396 RtlCompareUnicodeStrings(
1398 IN SIZE_T String1Length
,
1400 IN SIZE_T String2Length
,
1401 IN BOOLEAN CaseInSensitive
);
1406 RtlCopyUnicodeString(
1407 IN OUT PUNICODE_STRING DestinationString
,
1408 IN PCUNICODE_STRING SourceString
);
1413 RtlCreateRegistryKey(
1414 IN ULONG RelativeTo
,
1420 RtlCreateSecurityDescriptor(
1421 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
1427 RtlDeleteRegistryValue(
1428 IN ULONG RelativeTo
,
1430 IN PCWSTR ValueName
);
1435 RtlEqualUnicodeString(
1436 IN CONST UNICODE_STRING
*String1
,
1437 IN CONST UNICODE_STRING
*String2
,
1438 IN BOOLEAN CaseInSensitive
);
1440 #if !defined(_AMD64_) && !defined(_IA64_)
1444 RtlExtendedIntegerMultiply(
1445 IN LARGE_INTEGER Multiplicand
,
1446 IN LONG Multiplier
);
1451 RtlExtendedLargeIntegerDivide(
1452 IN LARGE_INTEGER Dividend
,
1454 IN OUT PULONG Remainder
);
1457 #if defined(_X86_) || defined(_IA64_)
1461 RtlExtendedMagicDivide(
1462 IN LARGE_INTEGER Dividend
,
1463 IN LARGE_INTEGER MagicDivisor
,
1464 IN CCHAR ShiftCount
);
1471 IN PANSI_STRING AnsiString
);
1477 IN PRTL_BITMAP BitMapHeader
,
1478 IN ULONG NumberToFind
,
1479 IN ULONG HintIndex
);
1484 RtlFindClearBitsAndSet(
1485 IN PRTL_BITMAP BitMapHeader
,
1486 IN ULONG NumberToFind
,
1487 IN ULONG HintIndex
);
1492 RtlFindFirstRunClear(
1493 IN PRTL_BITMAP BitMapHeader
,
1494 OUT PULONG StartingIndex
);
1500 IN PRTL_BITMAP BitMapHeader
,
1501 OUT PRTL_BITMAP_RUN RunArray
,
1502 IN ULONG SizeOfRunArray
,
1503 IN BOOLEAN LocateLongestRuns
);
1508 RtlFindLastBackwardRunClear(
1509 IN PRTL_BITMAP BitMapHeader
,
1511 OUT PULONG StartingRunIndex
);
1516 RtlFindLeastSignificantBit(
1522 RtlFindLongestRunClear(
1523 IN PRTL_BITMAP BitMapHeader
,
1524 OUT PULONG StartingIndex
);
1529 RtlFindMostSignificantBit(
1535 RtlFindNextForwardRunClear(
1536 IN PRTL_BITMAP BitMapHeader
,
1538 OUT PULONG StartingRunIndex
);
1544 IN PRTL_BITMAP BitMapHeader
,
1545 IN ULONG NumberToFind
,
1546 IN ULONG HintIndex
);
1551 RtlFindSetBitsAndClear(
1552 IN PRTL_BITMAP BitMapHeader
,
1553 IN ULONG NumberToFind
,
1554 IN ULONG HintIndex
);
1559 RtlHashUnicodeString(
1560 IN CONST UNICODE_STRING
*String
,
1561 IN BOOLEAN CaseInSensitive
,
1562 IN ULONG HashAlgorithm
,
1563 OUT PULONG HashValue
);
1569 IN OUT PANSI_STRING DestinationString
,
1570 IN PCSZ SourceString
);
1575 RtlInitializeBitMap(
1576 IN PRTL_BITMAP BitMapHeader
,
1577 IN PULONG BitMapBuffer
,
1578 IN ULONG SizeOfBitMap
);
1584 IN OUT PSTRING DestinationString
,
1585 IN PCSZ SourceString
);
1590 RtlIntegerToUnicodeString(
1592 IN ULONG Base OPTIONAL
,
1593 IN OUT PUNICODE_STRING String
);
1598 RtlInt64ToUnicodeString(
1600 IN ULONG Base OPTIONAL
,
1601 IN OUT PUNICODE_STRING String
);
1604 #define RtlIntPtrToUnicodeString(Value, Base, String) \
1605 RtlInt64ToUnicodeString(Value, Base, String)
1607 #define RtlIntPtrToUnicodeString(Value, Base, String) \
1608 RtlIntegerToUnicodeString(Value, Base, String)
1615 #define RtlIsZeroLuid(_L1) \
1616 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
1621 RtlLengthSecurityDescriptor(
1622 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
1627 RtlNumberOfClearBits(
1628 IN PRTL_BITMAP BitMapHeader
);
1634 IN PRTL_BITMAP BitMapHeader
);
1639 RtlQueryRegistryValues(
1640 IN ULONG RelativeTo
,
1642 IN PRTL_QUERY_REGISTRY_TABLE QueryTable
,
1644 IN PVOID Environment OPTIONAL
);
1646 #define LONG_SIZE (sizeof(LONG))
1647 #define LONG_MASK (LONG_SIZE - 1)
1651 * PULONG DestinationAddress,
1652 * PULONG SourceAddress);
1654 #if defined(_AMD64_)
1655 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
1656 *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
1658 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
1659 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
1661 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
1662 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
1663 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
1664 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
1668 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
1673 * RtlRetrieveUshort(
1674 * PUSHORT DestinationAddress,
1675 * PUSHORT SourceAddress);
1677 #if defined(_AMD64_)
1678 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
1679 *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
1681 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
1682 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
1684 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
1685 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
1689 *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
1697 IN PRTL_BITMAP BitMapHeader
);
1703 IN PRTL_BITMAP BitMapHeader
,
1704 IN ULONG StartingIndex
,
1705 IN ULONG NumberToSet
);
1710 RtlSetDaclSecurityDescriptor(
1711 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
1712 IN BOOLEAN DaclPresent
,
1713 IN PACL Dacl OPTIONAL
,
1714 IN BOOLEAN DaclDefaulted OPTIONAL
);
1718 * IN PULONG Address,
1721 #if defined(_AMD64_)
1722 #define RtlStoreUlong(Address,Value) \
1723 *(ULONG UNALIGNED *)(Address) = (Value)
1725 #define RtlStoreUlong(Address,Value) \
1726 if ((ULONG_PTR)(Address) & LONG_MASK) { \
1727 ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
1728 ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
1729 ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
1730 ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT] = (UCHAR)(FOURTHBYTE(Value)); \
1733 *((PULONG)(Address)) = (ULONG) (Value); \
1738 * RtlStoreUlonglong(
1739 * IN OUT PULONGLONG Address,
1742 #if defined(_AMD64_)
1743 #define RtlStoreUlonglong(Address,Value) \
1744 *(ULONGLONG UNALIGNED *)(Address) = (Value)
1746 #define RtlStoreUlonglong(Address,Value) \
1747 if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
1748 RtlStoreUlong((ULONG_PTR)(Address), \
1749 (ULONGLONG)(Value) & 0xFFFFFFFF); \
1750 RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
1751 (ULONGLONG)(Value) >> 32); \
1753 *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
1759 * IN OUT PULONG_PTR Address,
1760 * IN ULONG_PTR Value);
1763 #define RtlStoreUlongPtr(Address,Value) \
1764 RtlStoreUlonglong(Address,Value)
1766 #define RtlStoreUlongPtr(Address,Value) \
1767 RtlStoreUlong(Address,Value)
1772 * IN PUSHORT Address,
1775 #if defined(_AMD64_)
1776 #define RtlStoreUshort(Address,Value) \
1777 *(USHORT UNALIGNED *)(Address) = (Value)
1779 #define RtlStoreUshort(Address,Value) \
1780 if ((ULONG_PTR)(Address) & SHORT_MASK) { \
1781 ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
1782 ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
1785 *((PUSHORT) (Address)) = (USHORT)Value; \
1792 RtlTimeFieldsToTime(
1793 IN PTIME_FIELDS TimeFields
,
1794 IN PLARGE_INTEGER Time
);
1799 RtlTimeToTimeFields(
1800 IN PLARGE_INTEGER Time
,
1801 IN PTIME_FIELDS TimeFields
);
1812 RtlUlonglongByteSwap(
1813 IN ULONGLONG Source
);
1818 RtlUnicodeStringToAnsiString(
1819 IN OUT PANSI_STRING DestinationString
,
1820 IN PCUNICODE_STRING SourceString
,
1821 IN BOOLEAN AllocateDestinationString
);
1826 RtlxUnicodeStringToAnsiSize(
1827 IN PCUNICODE_STRING UnicodeString
);
1829 #define RtlUnicodeStringToAnsiSize(String) ( \
1830 NLS_MB_CODE_PAGE_TAG ? \
1831 RtlxUnicodeStringToAnsiSize(String) : \
1832 ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
1838 RtlUnicodeStringToInteger(
1839 IN PCUNICODE_STRING String
,
1840 IN ULONG Base OPTIONAL
,
1846 RtlUpcaseUnicodeChar(
1847 IN WCHAR SourceCharacter
);
1858 RtlValidRelativeSecurityDescriptor(
1859 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput
,
1860 IN ULONG SecurityDescriptorLength
,
1861 IN SECURITY_INFORMATION RequiredInformation
);
1866 RtlValidSecurityDescriptor(
1867 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
1872 RtlWriteRegistryValue(
1873 IN ULONG RelativeTo
,
1875 IN PCWSTR ValueName
,
1878 IN ULONG ValueLength
);
1880 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
1882 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
1886 RtlPrefetchMemoryNonTemporal(
1891 #if (NTDDI_VERSION >= NTDDI_WINXP)
1896 PRTL_BITMAP BitMapHeader
,
1902 RtlDowncaseUnicodeChar(
1903 IN WCHAR SourceCharacter
);
1909 PRTL_BITMAP BitMapHeader
,
1916 IN PRTL_BITMAP BitMapHeader
,
1917 IN ULONG BitNumber
);
1919 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
1921 #if (NTDDI_VERSION >= NTDDI_VISTA)
1925 RtlNumberOfSetBitsUlongPtr(
1926 IN ULONG_PTR Target
);
1931 RtlIoDecodeMemIoResource (
1932 IN PIO_RESOURCE_DESCRIPTOR Descriptor
,
1933 OUT PULONGLONG Alignment OPTIONAL
,
1934 OUT PULONGLONG MinimumAddress OPTIONAL
,
1935 OUT PULONGLONG MaximumAddress OPTIONAL
);
1940 RtlIoEncodeMemIoResource(
1941 IN PIO_RESOURCE_DESCRIPTOR Descriptor
,
1943 IN ULONGLONG Length
,
1944 IN ULONGLONG Alignment
,
1945 IN ULONGLONG MinimumAddress
,
1946 IN ULONGLONG MaximumAddress
);
1951 RtlCmDecodeMemIoResource(
1952 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor
,
1953 OUT PULONGLONG Start OPTIONAL
);
1958 RtlFindClosestEncodableLength(
1959 IN ULONGLONG SourceLength
,
1960 OUT PULONGLONG TargetLength
);
1964 #if !defined(MIDL_PASS)
1965 /* inline funftions */
1966 //DECLSPEC_DEPRECATED_DDK_WINXP
1970 RtlConvertLongToLargeInteger(LONG SignedInteger
)
1973 ret
.QuadPart
= SignedInteger
;
1977 //DECLSPEC_DEPRECATED_DDK_WINXP
1981 RtlConvertUlongToLargeInteger(
1982 ULONG UnsignedInteger
)
1985 ret
.QuadPart
= UnsignedInteger
;
1989 //DECLSPEC_DEPRECATED_DDK
1993 RtlEnlargedUnsignedDivide(
1994 IN ULARGE_INTEGER Dividend
,
1996 IN OUT PULONG Remainder
)
1999 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
2000 return (ULONG
)(Dividend
.QuadPart
/ Divisor
);
2003 //DECLSPEC_DEPRECATED_DDK
2007 RtlEnlargedUnsignedMultiply(
2008 IN ULONG Multiplicand
,
2009 IN ULONG Multiplier
)
2012 ret
.QuadPart
= (ULONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
2016 //DECLSPEC_DEPRECATED_DDK
2020 RtlEnlargedIntegerMultiply(
2021 IN LONG Multiplicand
,
2025 ret
.QuadPart
= (LONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
2031 RtlInitEmptyAnsiString(OUT PANSI_STRING AnsiString
,
2033 IN USHORT BufferSize
)
2035 AnsiString
->Length
= 0;
2036 AnsiString
->MaximumLength
= BufferSize
;
2037 AnsiString
->Buffer
= Buffer
;
2042 RtlInitEmptyUnicodeString(
2043 OUT PUNICODE_STRING UnicodeString
,
2045 IN USHORT BufferSize
)
2047 UnicodeString
->Length
= 0;
2048 UnicodeString
->MaximumLength
= BufferSize
;
2049 UnicodeString
->Buffer
= Buffer
;
2052 #if defined(_AMD64_) || defined(_IA64_)
2056 RtlExtendedIntegerMultiply(
2057 LARGE_INTEGER Multiplicand
,
2061 ret
.QuadPart
= Multiplicand
.QuadPart
* Multiplier
;
2068 RtlExtendedLargeIntegerDivide(
2069 LARGE_INTEGER Dividend
,
2074 ret
.QuadPart
= (ULONG64
)Dividend
.QuadPart
/ Divisor
;
2076 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
2081 #if defined(_AMD64_)
2083 #define MultiplyHigh __mulh
2084 #define UnsignedMultiplyHigh __umulh
2086 //DECLSPEC_DEPRECATED_DDK
2090 RtlExtendedMagicDivide(
2091 IN LARGE_INTEGER Dividend
,
2092 IN LARGE_INTEGER MagicDivisor
,
2093 IN CCHAR ShiftCount
)
2098 Pos
= (Dividend
.QuadPart
>= 0);
2099 ret64
= UnsignedMultiplyHigh(Pos
? Dividend
.QuadPart
: -Dividend
.QuadPart
,
2100 MagicDivisor
.QuadPart
);
2101 ret64
>>= ShiftCount
;
2102 ret
.QuadPart
= Pos
? ret64
: -ret64
;
2107 //DECLSPEC_DEPRECATED_DDK
2112 IN LARGE_INTEGER Addend1
,
2113 IN LARGE_INTEGER Addend2
)
2116 ret
.QuadPart
= Addend1
.QuadPart
+ Addend2
.QuadPart
;
2121 * RtlLargeIntegerAnd(
2122 * IN OUT LARGE_INTEGER Result,
2123 * IN LARGE_INTEGER Source,
2124 * IN LARGE_INTEGER Mask);
2126 #define RtlLargeIntegerAnd(Result, Source, Mask) \
2127 Result.QuadPart = Source.QuadPart & Mask.QuadPart
2129 //DECLSPEC_DEPRECATED_DDK
2133 RtlLargeIntegerArithmeticShift(
2134 IN LARGE_INTEGER LargeInteger
,
2135 IN CCHAR ShiftCount
)
2138 ret
.QuadPart
= LargeInteger
.QuadPart
>> ShiftCount
;
2143 * RtlLargeIntegerEqualTo(
2144 * IN LARGE_INTEGER Operand1,
2145 * IN LARGE_INTEGER Operand2);
2147 #define RtlLargeIntegerEqualTo(X,Y) \
2148 (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
2152 RtlSecureZeroMemory(
2156 volatile char* vptr
= (volatile char*)Pointer
;
2157 #if defined(_M_AMD64)
2158 __stosb((PUCHAR
)vptr
, 0, Size
);
2160 char * endptr
= (char *)vptr
+ Size
;
2161 while (vptr
< endptr
)
2169 #if defined(_M_AMD64)
2173 IN PRTL_BITMAP BitMapHeader
,
2174 IN ULONG BitPosition
)
2176 return BitTest((LONG CONST
*)BitMapHeader
->Buffer
, BitPosition
);
2179 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
2180 #endif // defined(_M_AMD64)
2182 #endif // !defined(MIDL_PASS)
2185 // Byte Swap Functions
2187 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \
2188 ((defined(_M_AMD64) || defined(_M_IA64)) \
2189 && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))
2191 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
2192 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
2193 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
2197 /******************************************************************************
2198 * Memory manager Types *
2199 ******************************************************************************/
2201 typedef struct _MDL
{
2205 struct _EPROCESS
*Process
;
2206 PVOID MappedSystemVa
;
2213 /******************************************************************************
2214 * Memory manager Functions *
2215 ******************************************************************************/
2217 /* PVOID MmGetSystemAddressForMdl(
2220 #define MmGetSystemAddressForMdl(Mdl) \
2221 (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
2222 MDL_SOURCE_IS_NONPAGED_POOL)) ? \
2223 ((Mdl)->MappedSystemVa) : \
2224 (MmMapLockedPages((Mdl), KernelMode)))
2227 * MmGetSystemAddressForMdlSafe(
2229 * IN MM_PAGE_PRIORITY Priority)
2231 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
2232 (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
2233 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
2234 (_Mdl)->MappedSystemVa : \
2235 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
2236 KernelMode, MmCached, NULL, FALSE, (_Priority)))
2238 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2243 IN PMDL MemoryDescriptorList OPTIONAL
,
2250 /******************************************************************************
2251 * I/O Manager Functions *
2252 ******************************************************************************/
2254 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
2255 (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
2257 #define DMA_MACROS_DEFINED
2261 IoAllocateAdapterChannel(
2262 IN PADAPTER_OBJECT AdapterObject
,
2263 IN PDEVICE_OBJECT DeviceObject
,
2264 IN ULONG NumberOfMapRegisters
,
2265 IN PDRIVER_CONTROL ExecutionRoutine
,
2268 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel
;
2269 AllocateAdapterChannel
=
2270 *(DmaAdapter
)->DmaOperations
->AllocateAdapterChannel
;
2271 ASSERT(AllocateAdapterChannel
);
2272 return AllocateAdapterChannel(DmaAdapter
,
2274 NumberOfMapRegisters
,
2281 IoFlushAdapterBuffers(
2282 IN PADAPTER_OBJECT AdapterObject
,
2284 IN PVOID MapRegisterBase
,
2287 IN BOOLEAN WriteToDevice
)
2289 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers
;
2290 FlushAdapterBuffers
= *(DmaAdapter
)->DmaOperations
->FlushAdapterBuffers
;
2291 ASSERT(FlushAdapterBuffers
);
2292 return FlushAdapterBuffers(DmaAdapter
,
2302 IoFreeAdapterChannel(
2303 IN PADAPTER_OBJECT AdapterObject
)
2305 PFREE_ADAPTER_CHANNEL FreeAdapterChannel
;
2306 FreeAdapterChannel
= *(DmaAdapter
)->DmaOperations
->FreeAdapterChannel
;
2307 ASSERT(FreeAdapterChannel
);
2308 FreeAdapterChannel(DmaAdapter
);
2314 IN PADAPTER_OBJECT AdapterObject
,
2315 IN PVOID MapRegisterBase
,
2316 IN ULONG NumberOfMapRegisters
)
2318 PFREE_MAP_REGISTERS FreeMapRegisters
;
2319 FreeMapRegisters
= *(DmaAdapter
)->DmaOperations
->FreeMapRegisters
;
2320 ASSERT(FreeMapRegisters
);
2321 FreeMapRegisters(DmaAdapter
, MapRegisterBase
, NumberOfMapRegisters
);
2327 IN PDMA_ADAPTER DmaAdapter
,
2329 IN PVOID MapRegisterBase
,
2331 IN OUT PULONG Length
,
2332 IN BOOLEAN WriteToDevice
)
2334 PMAP_TRANSFER MapTransfer
;
2336 MapTransfer
= *(DmaAdapter
)->DmaOperations
->MapTransfer
;
2337 ASSERT(MapTransfer
);
2338 return MapTransfer(DmaAdapter
,
2348 /******************************************************************************
2350 ******************************************************************************/
2352 typedef enum _POOL_TYPE
{
2355 NonPagedPoolMustSucceed
,
2357 NonPagedPoolCacheAligned
,
2358 PagedPoolCacheAligned
,
2359 NonPagedPoolCacheAlignedMustS
,
2361 NonPagedPoolSession
= 32,
2363 NonPagedPoolMustSucceedSession
,
2364 DontUseThisTypeSession
,
2365 NonPagedPoolCacheAlignedSession
,
2366 PagedPoolCacheAlignedSession
,
2367 NonPagedPoolCacheAlignedMustSSession
2370 typedef enum _SUITE_TYPE
{
2374 CommunicationServer
,
2376 SmallBusinessRestricted
,
2385 typedef enum _EX_POOL_PRIORITY
{
2387 LowPoolPrioritySpecialPoolOverrun
= 8,
2388 LowPoolPrioritySpecialPoolUnderrun
= 9,
2389 NormalPoolPriority
= 16,
2390 NormalPoolPrioritySpecialPoolOverrun
= 24,
2391 NormalPoolPrioritySpecialPoolUnderrun
= 25,
2392 HighPoolPriority
= 32,
2393 HighPoolPrioritySpecialPoolOverrun
= 40,
2394 HighPoolPrioritySpecialPoolUnderrun
= 41
2397 typedef struct _FAST_MUTEX
2404 } FAST_MUTEX
, *PFAST_MUTEX
;
2406 typedef ULONG_PTR ERESOURCE_THREAD
, *PERESOURCE_THREAD
;
2408 typedef struct _OWNER_ENTRY
{
2409 ERESOURCE_THREAD OwnerThread
;
2410 _ANONYMOUS_UNION
union {
2414 } OWNER_ENTRY
, *POWNER_ENTRY
;
2416 typedef struct _ERESOURCE
2418 LIST_ENTRY SystemResourcesList
;
2419 POWNER_ENTRY OwnerTable
;
2422 volatile PKSEMAPHORE SharedWaiters
;
2423 volatile PKEVENT ExclusiveWaiters
;
2424 OWNER_ENTRY OwnerEntry
;
2425 ULONG ActiveEntries
;
2426 ULONG ContentionCount
;
2427 ULONG NumberOfSharedWaiters
;
2428 ULONG NumberOfExclusiveWaiters
;
2429 __GNU_EXTENSION
union
2432 ULONG_PTR CreatorBackTraceIndex
;
2434 KSPIN_LOCK SpinLock
;
2435 } ERESOURCE
, *PERESOURCE
;
2437 #if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
2438 #define LOOKASIDE_ALIGN
2440 #define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */
2443 typedef struct _LOOKASIDE_LIST_EX
*PLOOKASIDE_LIST_EX
;
2446 (DDKAPI
*PALLOCATE_FUNCTION
)(
2447 IN POOL_TYPE PoolType
,
2448 IN SIZE_T NumberOfBytes
,
2452 (DDKAPI
*PALLOCATE_FUNCTION_EX
)(
2453 IN POOL_TYPE PoolType
,
2454 IN SIZE_T NumberOfBytes
,
2456 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
2459 (DDKAPI
*PFREE_FUNCTION
)(
2463 (DDKAPI
*PFREE_FUNCTION_EX
)(
2465 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
2468 (DDKAPI
*PCALLBACK_FUNCTION
)(
2469 IN PVOID CallbackContext
,
2471 IN PVOID Argument2
);
2473 typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE
{
2475 SLIST_HEADER ListHead
;
2476 SINGLE_LIST_ENTRY SingleListHead
;
2479 USHORT MaximumDepth
;
2480 ULONG TotalAllocates
;
2482 ULONG AllocateMisses
;
2494 PALLOCATE_FUNCTION_EX AllocateEx
;
2495 PALLOCATE_FUNCTION Allocate
;
2498 PFREE_FUNCTION_EX FreeEx
;
2499 PFREE_FUNCTION Free
;
2501 LIST_ENTRY ListEntry
;
2502 ULONG LastTotalAllocates
;
2504 ULONG LastAllocateMisses
;
2505 ULONG LastAllocateHits
;
2508 } GENERAL_LOOKASIDE
, *PGENERAL_LOOKASIDE
;
2510 typedef struct _PAGED_LOOKASIDE_LIST
{
2511 GENERAL_LOOKASIDE L
;
2512 #if !defined(_AMD64_) && !defined(_IA64_)
2513 FAST_MUTEX Lock__ObsoleteButDoNotDelete
;
2515 } PAGED_LOOKASIDE_LIST
, *PPAGED_LOOKASIDE_LIST
;
2517 typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST
{
2518 GENERAL_LOOKASIDE L
;
2519 #if !defined(_AMD64_) && !defined(_IA64_)
2520 KSPIN_LOCK Lock__ObsoleteButDoNotDelete
;
2522 } NPAGED_LOOKASIDE_LIST
, *PNPAGED_LOOKASIDE_LIST
;
2524 //typedef struct _LOOKASIDE_LIST_EX {
2525 // GENERAL_LOOKASIDE_POOL L;
2526 //} LOOKASIDE_LIST_EX, *PLOOKASIDE_LIST_EX;
2528 typedef struct _EX_RUNDOWN_REF
{
2529 __GNU_EXTENSION
union {
2530 volatile ULONG_PTR Count
;
2533 } EX_RUNDOWN_REF
, *PEX_RUNDOWN_REF
;
2535 typedef struct _EX_RUNDOWN_REF_CACHE_AWARE
*PEX_RUNDOWN_REF_CACHE_AWARE
;
2537 typedef enum _WORK_QUEUE_TYPE
{
2540 HyperCriticalWorkQueue
,
2545 (DDKAPI
*PWORKER_THREAD_ROUTINE
)(
2546 IN PVOID Parameter
);
2548 typedef struct _WORK_QUEUE_ITEM
{
2550 PWORKER_THREAD_ROUTINE WorkerRoutine
;
2551 volatile PVOID Parameter
;
2552 } WORK_QUEUE_ITEM
, *PWORK_QUEUE_ITEM
;
2555 /******************************************************************************
2556 * Executive Functions *
2557 ******************************************************************************/
2560 #if defined(_NTHAL_)
2561 #define ExAcquireFastMutex ExiAcquireFastMutex
2562 #define ExReleaseFastMutex ExiReleaseFastMutex
2563 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
2565 #define ExInterlockedAddUlong ExfInterlockedAddUlong
2566 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
2567 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
2568 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
2569 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
2570 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
2575 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
2576 defined(_NTHAL_) || defined(_NTOSP_)
2579 ExQueryDepthSList(IN PSLIST_HEADER ListHead
);
2583 ExQueryDepthSList(IN PSLIST_HEADER ListHead
)
2585 return (USHORT
)(ListHead
->Alignment
& 0xffff);
2591 ExpInterlockedFlushSList(
2592 PSLIST_HEADER ListHead
);
2596 ExpInterlockedPopEntrySList(
2597 PSLIST_HEADER ListHead
);
2601 ExpInterlockedPushEntrySList(
2602 PSLIST_HEADER ListHead
,
2603 PSLIST_ENTRY ListEntry
);
2605 #define ExInterlockedFlushSList(Head) \
2606 ExpInterlockedFlushSList(Head)
2607 #define ExInterlockedPopEntrySList(Head, Lock) \
2608 ExpInterlockedPopEntrySList(Head)
2609 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
2610 ExpInterlockedPushEntrySList(Head, Entry)
2612 #else // !defined(_WIN64)
2614 #define ExQueryDepthSList(listhead) (listhead)->Depth
2619 ExInterlockedFlushSList(
2620 IN PSLIST_HEADER ListHead
);
2622 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
2626 ExInterlockedPopEntrySList(
2627 IN PSLIST_HEADER ListHead
,
2628 IN PKSPIN_LOCK Lock
);
2633 ExInterlockedPushEntrySList(
2634 IN PSLIST_HEADER ListHead
,
2635 IN PSINGLE_LIST_ENTRY ListEntry
,
2636 IN PKSPIN_LOCK Lock
);
2638 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
2639 InterlockedPopEntrySList(_ListHead)
2640 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
2641 InterlockedPushEntrySList(_ListHead, _ListEntry)
2642 #endif // _WIN2K_COMPAT_SLIST_USAGE
2644 #endif // !defined(_WIN64)
2647 * ExGetCurrentResourceThread(
2650 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread())
2652 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
2655 * ExInitializeWorkItem(
2656 * IN PWORK_QUEUE_ITEM Item,
2657 * IN PWORKER_THREAD_ROUTINE Routine,
2660 #define ExInitializeWorkItem(Item, Routine, Context) \
2662 (Item)->WorkerRoutine = Routine; \
2663 (Item)->Parameter = Context; \
2664 (Item)->List.Flink = NULL; \
2667 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2673 IN OUT PFAST_MUTEX FastMutex
);
2679 IN OUT PFAST_MUTEX FastMutex
);
2684 ExTryToAcquireFastMutex(
2685 IN OUT PFAST_MUTEX FastMutex
);
2690 ExAcquireFastMutexUnsafe(
2691 IN OUT PFAST_MUTEX FastMutex
);
2696 ExReleaseFastMutexUnsafe(
2697 IN OUT PFAST_MUTEX FastMutex
);
2702 ExAcquireResourceExclusiveLite(
2703 IN PERESOURCE Resource
,
2709 ExAcquireResourceSharedLite(
2710 IN PERESOURCE Resource
,
2716 ExAcquireSharedStarveExclusive(
2717 IN PERESOURCE Resource
,
2723 ExAcquireSharedWaitForExclusive(
2724 IN PERESOURCE Resource
,
2731 IN POOL_TYPE PoolType
,
2732 IN SIZE_T NumberOfBytes
);
2735 #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
2736 #endif /* POOL_TAGGING */
2741 ExAllocatePoolWithQuota(
2742 IN POOL_TYPE PoolType
,
2743 IN SIZE_T NumberOfBytes
);
2746 #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
2747 #endif /* POOL_TAGGING */
2752 ExAllocatePoolWithQuotaTag(
2753 IN POOL_TYPE PoolType
,
2754 IN SIZE_T NumberOfBytes
,
2757 #ifndef POOL_TAGGING
2758 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
2759 #endif /* POOL_TAGGING */
2764 ExAllocatePoolWithTag(
2765 IN POOL_TYPE PoolType
,
2766 IN SIZE_T NumberOfBytes
,
2772 ExAllocatePoolWithTagPriority(
2773 IN POOL_TYPE PoolType
,
2774 IN SIZE_T NumberOfBytes
,
2776 IN EX_POOL_PRIORITY Priority
);
2781 ExConvertExclusiveToSharedLite(
2782 IN PERESOURCE Resource
);
2788 OUT PCALLBACK_OBJECT
*CallbackObject
,
2789 IN POBJECT_ATTRIBUTES ObjectAttributes
,
2791 IN BOOLEAN AllowMultipleCallbacks
);
2796 ExDeleteNPagedLookasideList(
2797 IN PNPAGED_LOOKASIDE_LIST Lookaside
);
2802 ExDeletePagedLookasideList(
2803 IN PPAGED_LOOKASIDE_LIST Lookaside
);
2808 ExDeleteResourceLite(
2809 IN PERESOURCE Resource
);
2818 #define ExFreePool(P) ExFreePoolWithTag(P, 0)
2831 ExGetExclusiveWaiterCount(
2832 IN PERESOURCE Resource
);
2843 ExGetSharedWaiterCount(
2844 IN PERESOURCE Resource
);
2849 ExInitializeNPagedLookasideList(
2850 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
2851 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
2852 IN PFREE_FUNCTION Free OPTIONAL
,
2861 ExInitializePagedLookasideList(
2862 IN PPAGED_LOOKASIDE_LIST Lookaside
,
2863 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
2864 IN PFREE_FUNCTION Free OPTIONAL
,
2873 ExInitializeResourceLite(
2874 IN PERESOURCE Resource
);
2879 ExInterlockedAddLargeInteger(
2880 IN PLARGE_INTEGER Addend
,
2881 IN LARGE_INTEGER Increment
,
2882 IN PKSPIN_LOCK Lock
);
2885 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
2886 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
2888 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
2889 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
2895 ExInterlockedAddUlong(
2900 #if defined(_AMD64_) || defined(_IA64_)
2901 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
2902 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
2903 #elif defined(_X86_)
2907 ExfInterlockedCompareExchange64(
2908 IN OUT LONGLONG
volatile *Destination
,
2909 IN PLONGLONG Exchange
,
2910 IN PLONGLONG Comperand
);
2911 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
2912 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
2917 ExInterlockedCompareExchange64(
2918 IN OUT LONGLONG
volatile *Destination
,
2919 IN PLONGLONG Exchange
,
2920 IN PLONGLONG Comparand
,
2921 IN PKSPIN_LOCK Lock
);
2927 ExInterlockedInsertHeadList(
2928 IN PLIST_ENTRY ListHead
,
2929 IN PLIST_ENTRY ListEntry
,
2930 IN PKSPIN_LOCK Lock
);
2935 ExInterlockedInsertTailList(
2936 IN PLIST_ENTRY ListHead
,
2937 IN PLIST_ENTRY ListEntry
,
2938 IN PKSPIN_LOCK Lock
);
2943 ExInterlockedPopEntryList(
2944 IN PSINGLE_LIST_ENTRY ListHead
,
2945 IN PKSPIN_LOCK Lock
);
2950 ExInterlockedPushEntryList(
2951 IN PSINGLE_LIST_ENTRY ListHead
,
2952 IN PSINGLE_LIST_ENTRY ListEntry
,
2953 IN PKSPIN_LOCK Lock
);
2958 ExInterlockedRemoveHeadList(
2959 IN PLIST_ENTRY ListHead
,
2960 IN PKSPIN_LOCK Lock
);
2965 ExIsProcessorFeaturePresent(
2966 IN ULONG ProcessorFeature
);
2971 ExIsResourceAcquiredExclusiveLite(
2972 IN PERESOURCE Resource
);
2977 ExIsResourceAcquiredSharedLite(
2978 IN PERESOURCE Resource
);
2980 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
2985 ExLocalTimeToSystemTime(
2986 IN PLARGE_INTEGER LocalTime
,
2987 OUT PLARGE_INTEGER SystemTime
);
2993 IN PCALLBACK_OBJECT CallbackObject
,
2995 IN PVOID Argument2
);
3001 IN PWORK_QUEUE_ITEM WorkItem
,
3002 IN WORK_QUEUE_TYPE QueueType
);
3009 IN NTSTATUS Status
);
3015 IN PCALLBACK_OBJECT CallbackObject
,
3016 IN PCALLBACK_FUNCTION CallbackFunction
,
3017 IN PVOID CallbackContext
);
3022 ExReinitializeResourceLite(
3023 IN PERESOURCE Resource
);
3028 ExReleaseResourceForThreadLite(
3029 IN PERESOURCE Resource
,
3030 IN ERESOURCE_THREAD ResourceThreadId
);
3035 ExReleaseResourceLite(
3036 IN PERESOURCE Resource
);
3041 ExSetResourceOwnerPointer(
3042 IN PERESOURCE Resource
,
3043 IN PVOID OwnerPointer
);
3048 ExSetTimerResolution(
3049 IN ULONG DesiredTime
,
3050 IN BOOLEAN SetResolution
);
3055 ExSystemTimeToLocalTime(
3056 IN PLARGE_INTEGER SystemTime
,
3057 OUT PLARGE_INTEGER LocalTime
);
3062 ExUnregisterCallback(
3063 IN PVOID CbRegistration
);
3066 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
3068 #if (NTDDI_VERSION >= NTDDI_WINXP)
3072 ExAcquireRundownProtection(
3073 IN OUT PEX_RUNDOWN_REF RunRef
);
3078 ExInitializeRundownProtection(
3079 OUT PEX_RUNDOWN_REF RunRef
);
3084 ExReInitializeRundownProtection(
3085 OUT PEX_RUNDOWN_REF RunRef
);
3090 ExReleaseRundownProtection(
3091 IN OUT PEX_RUNDOWN_REF RunRef
);
3097 OUT PEX_RUNDOWN_REF RunRef
);
3103 IN SUITE_TYPE SuiteType
);
3108 ExWaitForRundownProtectionRelease(
3109 IN OUT PEX_RUNDOWN_REF RunRef
);
3111 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
3113 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
3117 ExAcquireRundownProtectionEx(
3118 IN OUT PEX_RUNDOWN_REF RunRef
,
3124 ExReleaseRundownProtectionEx(
3125 IN OUT PEX_RUNDOWN_REF RunRef
,
3127 #endif // (NTDDI_VERSION >= NTDDI_WINXPSP2)
3129 #if (NTDDI_VERSION >= NTDDI_WS03)
3131 #endif // (NTDDI_VERSION >= NTDDI_WS03)
3133 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
3135 PEX_RUNDOWN_REF_CACHE_AWARE
3136 ExAllocateCacheAwareRundownProtection(
3137 IN POOL_TYPE PoolType
,
3142 ExSizeOfRundownProtectionCacheAware(VOID
);
3144 #endif // (NTDDI_VERSION >= NTDDI_WS03SP1)
3146 #if (NTDDI_VERSION >= NTDDI_VISTA)
3149 ExInitializeLookasideListEx(
3150 OUT PLOOKASIDE_LIST_EX Lookaside
,
3151 IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL
,
3152 IN PFREE_FUNCTION_EX Free OPTIONAL
,
3153 IN POOL_TYPE PoolType
,
3161 #if !defined(MIDL_PASS)
3163 static __inline PVOID
3164 ExAllocateFromNPagedLookasideList(
3165 IN PNPAGED_LOOKASIDE_LIST Lookaside
)
3169 Lookaside
->L
.TotalAllocates
++;
3170 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
3171 if (Entry
== NULL
) {
3172 Lookaside
->L
.AllocateMisses
++;
3173 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
3180 static __inline PVOID
3181 ExAllocateFromPagedLookasideList(
3182 IN PPAGED_LOOKASIDE_LIST Lookaside
)
3186 Lookaside
->L
.TotalAllocates
++;
3187 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
3188 if (Entry
== NULL
) {
3189 Lookaside
->L
.AllocateMisses
++;
3190 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
3197 static __inline VOID
3198 ExFreeToNPagedLookasideList(
3199 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
3202 Lookaside
->L
.TotalFrees
++;
3203 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
3204 Lookaside
->L
.FreeMisses
++;
3205 (Lookaside
->L
.Free
)(Entry
);
3207 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
3211 static __inline VOID
3212 ExFreeToPagedLookasideList(
3213 IN PPAGED_LOOKASIDE_LIST Lookaside
,
3216 Lookaside
->L
.TotalFrees
++;
3217 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
3218 Lookaside
->L
.FreeMisses
++;
3219 (Lookaside
->L
.Free
)(Entry
);
3221 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
3226 #endif // !defined(MIDL_PASS)