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))
78 #ifndef __IID_ALIGNED__
79 #define __IID_ALIGNED__
81 inline int IsEqualGUIDAligned(REFGUID guid1
, REFGUID guid2
)
83 return ((*(PLONGLONG
)(&guid1
) == *(PLONGLONG
)(&guid2
)) && (*((PLONGLONG
)(&guid1
) + 1) == *((PLONGLONG
)(&guid2
) + 1)));
86 #define IsEqualGUIDAligned(guid1, guid2) \
87 ((*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && (*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1)))
92 ** Forward declarations
101 struct _DEVICE_OBJECT
;
102 struct _DRIVER_OBJECT
;
103 struct _IO_STATUS_BLOCK
;
104 struct _DEVICE_DESCRIPTION
;
105 struct _SCATTER_GATHER_LIST
;
106 struct _DRIVE_LAYOUT_INFORMATION
;
114 typedef UCHAR KIRQL
, *PKIRQL
;
123 #define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )
124 #define ZwCurrentProcess() NtCurrentProcess()
125 #define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )
126 #define ZwCurrentThread() NtCurrentThread()
129 #define KIP0PCRADDRESS 0xffdff000
133 #define MAXIMUM_PROCESSORS 64
135 #define MAXIMUM_PROCESSORS 32
138 #define MAXIMUM_WAIT_OBJECTS 64
140 #define EX_RUNDOWN_ACTIVE 0x1
141 #define EX_RUNDOWN_COUNT_SHIFT 0x1
142 #define EX_RUNDOWN_COUNT_INC (1 << EX_RUNDOWN_COUNT_SHIFT)
144 #define METHOD_BUFFERED 0
145 #define METHOD_IN_DIRECT 1
146 #define METHOD_OUT_DIRECT 2
147 #define METHOD_NEITHER 3
149 #define LOW_PRIORITY 0
150 #define LOW_REALTIME_PRIORITY 16
151 #define HIGH_PRIORITY 31
152 #define MAXIMUM_PRIORITY 32
154 #define MAXIMUM_SUSPEND_COUNT MAXCHAR
156 #define MAXIMUM_FILENAME_LENGTH 256
158 #define FILE_SUPERSEDED 0x00000000
159 #define FILE_OPENED 0x00000001
160 #define FILE_CREATED 0x00000002
161 #define FILE_OVERWRITTEN 0x00000003
162 #define FILE_EXISTS 0x00000004
163 #define FILE_DOES_NOT_EXIST 0x00000005
165 #define FILE_USE_FILE_POINTER_POSITION 0xfffffffe
166 #define FILE_WRITE_TO_END_OF_FILE 0xffffffff
169 typedef UCHAR KPROCESSOR_MODE
;
170 typedef LONG KPRIORITY
;
171 typedef PVOID PSECURITY_DESCRIPTOR
;
172 typedef ULONG SECURITY_INFORMATION
, *PSECURITY_INFORMATION
;
174 /* Structures not exposed to drivers */
175 typedef struct _OBJECT_TYPE
*POBJECT_TYPE
;
176 typedef struct _HAL_DISPATCH_TABLE
*PHAL_DISPATCH_TABLE
;
177 typedef struct _HAL_PRIVATE_DISPATCH_TABLE
*PHAL_PRIVATE_DISPATCH_TABLE
;
178 typedef struct _DEVICE_HANDLER_OBJECT
*PDEVICE_HANDLER_OBJECT
;
179 typedef struct _BUS_HANDLER
*PBUS_HANDLER
;
181 typedef struct _ADAPTER_OBJECT
*PADAPTER_OBJECT
;
182 typedef struct _CALLBACK_OBJECT
*PCALLBACK_OBJECT
;
183 typedef struct _ETHREAD
*PETHREAD
;
184 typedef struct _EPROCESS
*PEPROCESS
;
185 typedef struct _IO_TIMER
*PIO_TIMER
;
186 typedef struct _KINTERRUPT
*PKINTERRUPT
;
187 typedef struct _KPROCESS
*PKPROCESS
;
188 typedef struct _KTHREAD
*PKTHREAD
, *PRKTHREAD
;
191 typedef struct _CONTEXT
*PCONTEXT
;
194 // Resource list definitions
196 typedef int CM_RESOURCE_TYPE
;
198 #define CmResourceTypeNull 0
199 #define CmResourceTypePort 1
200 #define CmResourceTypeInterrupt 2
201 #define CmResourceTypeMemory 3
202 #define CmResourceTypeDma 4
203 #define CmResourceTypeDeviceSpecific 5
204 #define CmResourceTypeBusNumber 6
205 #define CmResourceTypeNonArbitrated 128
206 #define CmResourceTypeConfigData 128
207 #define CmResourceTypeDevicePrivate 129
208 #define CmResourceTypePcCardConfig 130
209 #define CmResourceTypeMfCardConfig 131
211 typedef enum _INTERFACE_TYPE
{
212 InterfaceTypeUndefined
= -1,
230 } INTERFACE_TYPE
, *PINTERFACE_TYPE
;
232 /* IO_RESOURCE_DESCRIPTOR.Option */
234 #define IO_RESOURCE_PREFERRED 0x01
235 #define IO_RESOURCE_DEFAULT 0x02
236 #define IO_RESOURCE_ALTERNATIVE 0x08
238 typedef struct _IO_RESOURCE_DESCRIPTOR
{
241 UCHAR ShareDisposition
;
249 PHYSICAL_ADDRESS MinimumAddress
;
250 PHYSICAL_ADDRESS MaximumAddress
;
255 PHYSICAL_ADDRESS MinimumAddress
;
256 PHYSICAL_ADDRESS MaximumAddress
;
263 ULONG MinimumChannel
;
264 ULONG MaximumChannel
;
269 PHYSICAL_ADDRESS MinimumAddress
;
270 PHYSICAL_ADDRESS MaximumAddress
;
287 } IO_RESOURCE_DESCRIPTOR
, *PIO_RESOURCE_DESCRIPTOR
;
289 typedef struct _IO_RESOURCE_LIST
{
293 IO_RESOURCE_DESCRIPTOR Descriptors
[1];
294 } IO_RESOURCE_LIST
, *PIO_RESOURCE_LIST
;
296 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST
{
298 INTERFACE_TYPE InterfaceType
;
302 ULONG AlternativeLists
;
303 IO_RESOURCE_LIST List
[1];
304 } IO_RESOURCE_REQUIREMENTS_LIST
, *PIO_RESOURCE_REQUIREMENTS_LIST
;
309 extern ULONG NtGlobalFlag
;
312 #include <pshpack4.h>
313 typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR
{
315 UCHAR ShareDisposition
;
319 PHYSICAL_ADDRESS Start
;
323 PHYSICAL_ADDRESS Start
;
331 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
333 __GNU_EXTENSION
union {
349 PHYSICAL_ADDRESS Start
;
369 } DeviceSpecificData
;
370 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
372 PHYSICAL_ADDRESS Start
;
376 PHYSICAL_ADDRESS Start
;
380 PHYSICAL_ADDRESS Start
;
385 } CM_PARTIAL_RESOURCE_DESCRIPTOR
, *PCM_PARTIAL_RESOURCE_DESCRIPTOR
;
389 // Section map options
391 typedef enum _SECTION_INHERIT
{
397 // Section access rights
399 #define SECTION_QUERY 0x0001
400 #define SECTION_MAP_WRITE 0x0002
401 #define SECTION_MAP_READ 0x0004
402 #define SECTION_MAP_EXECUTE 0x0008
403 #define SECTION_EXTEND_SIZE 0x0010
404 #define SECTION_MAP_EXECUTE_EXPLICIT 0x0020
406 #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
407 SECTION_MAP_WRITE | \
409 SECTION_MAP_EXECUTE | \
412 #define SESSION_QUERY_ACCESS 0x0001
413 #define SESSION_MODIFY_ACCESS 0x0002
415 #define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
416 SESSION_QUERY_ACCESS | \
417 SESSION_MODIFY_ACCESS)
421 #define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
423 #define PAGE_NOACCESS 0x01
424 #define PAGE_READONLY 0x02
425 #define PAGE_READWRITE 0x04
426 #define PAGE_WRITECOPY 0x08
427 #define PAGE_EXECUTE 0x10
428 #define PAGE_EXECUTE_READ 0x20
429 #define PAGE_EXECUTE_READWRITE 0x40
430 #define PAGE_EXECUTE_WRITECOPY 0x80
431 #define PAGE_GUARD 0x100
432 #define PAGE_NOCACHE 0x200
433 #define PAGE_WRITECOMBINE 0x400
435 #define MEM_COMMIT 0x1000
436 #define MEM_RESERVE 0x2000
437 #define MEM_DECOMMIT 0x4000
438 #define MEM_RELEASE 0x8000
439 #define MEM_FREE 0x10000
440 #define MEM_PRIVATE 0x20000
441 #define MEM_MAPPED 0x40000
442 #define MEM_RESET 0x80000
443 #define MEM_TOP_DOWN 0x100000
444 #define MEM_LARGE_PAGES 0x20000000
445 #define MEM_4MB_PAGES 0x80000000
447 #define SEC_RESERVE 0x4000000
448 #define SEC_LARGE_PAGES 0x80000000
450 #define PROCESS_DUP_HANDLE (0x0040)
452 #if (NTDDI_VERSION >= NTDDI_VISTA)
453 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
456 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
463 // Processor features
465 #define PF_FLOATING_POINT_PRECISION_ERRATA 0
466 #define PF_FLOATING_POINT_EMULATED 1
467 #define PF_COMPARE_EXCHANGE_DOUBLE 2
468 #define PF_MMX_INSTRUCTIONS_AVAILABLE 3
469 #define PF_PPC_MOVEMEM_64BIT_OK 4
470 #define PF_ALPHA_BYTE_INSTRUCTIONS 5
471 #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
472 #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
473 #define PF_RDTSC_INSTRUCTION_AVAILABLE 8
474 #define PF_PAE_ENABLED 9
475 #define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
476 #define PF_SSE_DAZ_MODE_AVAILABLE 11
477 #define PF_NX_ENABLED 12
478 #define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
479 #define PF_COMPARE_EXCHANGE128 14
480 #define PF_COMPARE64_EXCHANGE128 15
481 #define PF_CHANNELS_ENABLED 16
486 // Intrinsics (note: taken from our winnt.h)
489 #if defined(__GNUC__)
491 static __inline__ BOOLEAN
492 InterlockedBitTestAndSet(IN LONG
volatile *Base
,
497 __asm__
__volatile__("lock "
500 :"=r" (OldBit
),"+m" (*Base
)
505 return (_InterlockedOr(Base
, 1 << Bit
) >> Bit
) & 1;
509 static __inline__ BOOLEAN
510 InterlockedBitTestAndReset(IN LONG
volatile *Base
,
515 __asm__
__volatile__("lock "
518 :"=r" (OldBit
),"+m" (*Base
)
523 return (_InterlockedAnd(Base
, ~(1 << Bit
)) >> Bit
) & 1;
529 #define BitScanForward _BitScanForward
530 #define BitScanReverse _BitScanReverse
532 #define BitTest _bittest
533 #define BitTestAndComplement _bittestandcomplement
534 #define BitTestAndSet _bittestandset
535 #define BitTestAndReset _bittestandreset
536 #define InterlockedBitTestAndSet _interlockedbittestandset
537 #define InterlockedBitTestAndReset _interlockedbittestandreset
540 /** INTERLOCKED FUNCTIONS *****************************************************/
542 #if !defined(__INTERLOCKED_DECLARED)
543 #define __INTERLOCKED_DECLARED
546 #if defined(NO_INTERLOCKED_INTRINSICS)
550 InterlockedIncrement(
551 IN OUT LONG
volatile *Addend
);
556 InterlockedDecrement(
557 IN OUT LONG
volatile *Addend
);
562 InterlockedCompareExchange(
563 IN OUT LONG
volatile *Destination
,
571 IN OUT LONG
volatile *Destination
,
577 InterlockedExchangeAdd(
578 IN OUT LONG
volatile *Addend
,
581 #else // !defined(NO_INTERLOCKED_INTRINSICS)
583 #define InterlockedExchange _InterlockedExchange
584 #define InterlockedIncrement _InterlockedIncrement
585 #define InterlockedDecrement _InterlockedDecrement
586 #define InterlockedExchangeAdd _InterlockedExchangeAdd
587 #define InterlockedCompareExchange _InterlockedCompareExchange
588 #define InterlockedOr _InterlockedOr
589 #define InterlockedAnd _InterlockedAnd
590 #define InterlockedXor _InterlockedXor
592 #endif // !defined(NO_INTERLOCKED_INTRINSICS)
594 #endif // defined (_X86_)
596 #if !defined (_WIN64)
599 * InterlockedExchangePointer(
600 * IN OUT PVOID volatile *Target,
603 #define InterlockedExchangePointer(Target, Value) \
604 ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
608 * InterlockedCompareExchangePointer(
609 * IN OUT PVOID *Destination,
611 * IN PVOID Comparand)
613 #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
614 ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
616 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
617 #define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
618 #define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
620 #endif // !defined (_WIN64)
622 #if defined (_M_AMD64)
624 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONGLONG *)a, (LONGLONG)b)
625 #define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONGLONG *)a)
626 #define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONGLONG *)a)
627 #define InterlockedAnd _InterlockedAnd
628 #define InterlockedOr _InterlockedOr
629 #define InterlockedXor _InterlockedXor
630 #define InterlockedIncrement _InterlockedIncrement
631 #define InterlockedDecrement _InterlockedDecrement
632 #define InterlockedAdd _InterlockedAdd
633 #define InterlockedExchange _InterlockedExchange
634 #define InterlockedExchangeAdd _InterlockedExchangeAdd
635 #define InterlockedCompareExchange _InterlockedCompareExchange
636 #define InterlockedAnd64 _InterlockedAnd64
637 #define InterlockedOr64 _InterlockedOr64
638 #define InterlockedXor64 _InterlockedXor64
639 #define InterlockedIncrement64 _InterlockedIncrement64
640 #define InterlockedDecrement64 _InterlockedDecrement64
641 #define InterlockedAdd64 _InterlockedAdd64
642 #define InterlockedExchange64 _InterlockedExchange64
643 #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
644 #define InterlockedCompareExchange64 _InterlockedCompareExchange64
645 #define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
646 #define InterlockedExchangePointer _InterlockedExchangePointer
647 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
648 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
652 #if defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
653 //#if !defined(_X86AMD64_) // FIXME: what's _X86AMD64_ used for?
657 IN OUT LONG64
volatile *Addend
,
660 return InterlockedExchangeAdd64(Addend
, Value
) + Value
;
665 #endif /* !__INTERLOCKED_DECLARED */
668 #define YieldProcessor _mm_pause
669 #elif defined (_M_AMD64)
670 #define YieldProcessor _mm_pause
671 #elif defined(_M_PPC)
672 #define YieldProcessor() __asm__ __volatile__("nop");
673 #elif defined(_M_MIPS)
674 #define YieldProcessor() __asm__ __volatile__("nop");
675 #elif defined(_M_ARM)
676 #define YieldProcessor()
678 #error Unknown architecture
686 #ifndef _SLIST_HEADER_
687 #define _SLIST_HEADER_
690 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY
*PSLIST_ENTRY
;
691 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY
{
694 typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER
{
701 ULONGLONG Sequence
:9;
702 ULONGLONG NextEntry
:39;
703 ULONGLONG HeaderType
:1;
705 ULONGLONG Reserved
:59;
710 ULONGLONG Sequence
:48;
711 ULONGLONG HeaderType
:1;
713 ULONGLONG Reserved
:2;
714 ULONGLONG NextEntry
:60;
716 } SLIST_HEADER
, *PSLIST_HEADER
;
718 #define SLIST_ENTRY SINGLE_LIST_ENTRY
719 #define _SLIST_ENTRY _SINGLE_LIST_ENTRY
720 #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
721 typedef union _SLIST_HEADER
{
728 } SLIST_HEADER
, *PSLIST_HEADER
;
731 #endif /* _SLIST_HEADER_ */
736 // Power States/Levels
738 typedef enum _SYSTEM_POWER_STATE
{
739 PowerSystemUnspecified
,
741 PowerSystemSleeping1
,
742 PowerSystemSleeping2
,
743 PowerSystemSleeping3
,
744 PowerSystemHibernate
,
747 } SYSTEM_POWER_STATE
, *PSYSTEM_POWER_STATE
;
749 #define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
751 typedef enum _POWER_INFORMATION_LEVEL
{
754 VerifySystemPolicyAc
,
755 VerifySystemPolicyDc
,
756 SystemPowerCapabilities
,
758 SystemPowerStateHandler
,
759 ProcessorStateHandler
,
760 SystemPowerPolicyCurrent
,
761 AdministratorPowerPolicy
,
762 SystemReserveHiberFile
,
763 ProcessorInformation
,
764 SystemPowerInformation
,
765 ProcessorStateHandler2
,
768 SystemExecutionState
,
769 SystemPowerStateNotifyHandler
,
770 ProcessorPowerPolicyAc
,
771 ProcessorPowerPolicyDc
,
772 VerifyProcessorPowerPolicyAc
,
773 VerifyProcessorPowerPolicyDc
,
774 ProcessorPowerPolicyCurrent
775 } POWER_INFORMATION_LEVEL
;
781 PowerActionHibernate
,
783 PowerActionShutdownReset
,
784 PowerActionShutdownOff
,
786 } POWER_ACTION
, *PPOWER_ACTION
;
788 typedef enum _DEVICE_POWER_STATE
{
789 PowerDeviceUnspecified
,
795 } DEVICE_POWER_STATE
, *PDEVICE_POWER_STATE
;
797 #define ES_SYSTEM_REQUIRED 0x00000001
798 #define ES_DISPLAY_REQUIRED 0x00000002
799 #define ES_USER_PRESENT 0x00000004
800 #define ES_CONTINUOUS 0x80000000
802 typedef ULONG EXECUTION_STATE
;
812 // Access/Security Stuff
814 typedef ULONG ACCESS_MASK
, *PACCESS_MASK
;
815 typedef PVOID PACCESS_TOKEN
;
817 #define DELETE 0x00010000L
818 #define READ_CONTROL 0x00020000L
819 #define WRITE_DAC 0x00040000L
820 #define WRITE_OWNER 0x00080000L
821 #define SYNCHRONIZE 0x00100000L
822 #define STANDARD_RIGHTS_REQUIRED 0x000F0000L
823 #define STANDARD_RIGHTS_READ READ_CONTROL
824 #define STANDARD_RIGHTS_WRITE READ_CONTROL
825 #define STANDARD_RIGHTS_EXECUTE READ_CONTROL
826 #define STANDARD_RIGHTS_ALL 0x001F0000L
827 #define SPECIFIC_RIGHTS_ALL 0x0000FFFFL
828 #define ACCESS_SYSTEM_SECURITY 0x01000000L
829 #define MAXIMUM_ALLOWED 0x02000000L
830 #define GENERIC_READ 0x80000000L
831 #define GENERIC_WRITE 0x40000000L
832 #define GENERIC_EXECUTE 0x20000000L
833 #define GENERIC_ALL 0x10000000L
835 typedef struct _GENERIC_MAPPING
{
836 ACCESS_MASK GenericRead
;
837 ACCESS_MASK GenericWrite
;
838 ACCESS_MASK GenericExecute
;
839 ACCESS_MASK GenericAll
;
840 } GENERIC_MAPPING
, *PGENERIC_MAPPING
;
842 #define ACL_REVISION 2
843 #define ACL_REVISION_DS 4
845 #define ACL_REVISION1 1
846 #define ACL_REVISION2 2
847 #define ACL_REVISION3 3
848 #define ACL_REVISION4 4
849 #define MIN_ACL_REVISION ACL_REVISION2
850 #define MAX_ACL_REVISION ACL_REVISION4
852 typedef struct _ACL
{
863 // Current security descriptor revision value
865 #define SECURITY_DESCRIPTOR_REVISION (1)
866 #define SECURITY_DESCRIPTOR_REVISION1 (1)
869 // Privilege attributes
871 #define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
872 #define SE_PRIVILEGE_ENABLED (0x00000002L)
873 #define SE_PRIVILEGE_REMOVED (0X00000004L)
874 #define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
876 #define SE_PRIVILEGE_VALID_ATTRIBUTES (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
877 SE_PRIVILEGE_ENABLED | \
878 SE_PRIVILEGE_REMOVED | \
879 SE_PRIVILEGE_USED_FOR_ACCESS)
881 #include <pshpack4.h>
882 typedef struct _LUID_AND_ATTRIBUTES
{
885 } LUID_AND_ATTRIBUTES
, *PLUID_AND_ATTRIBUTES
;
887 typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY
[ANYSIZE_ARRAY
];
888 typedef LUID_AND_ATTRIBUTES_ARRAY
*PLUID_AND_ATTRIBUTES_ARRAY
;
895 #define PRIVILEGE_SET_ALL_NECESSARY (1)
897 typedef struct _PRIVILEGE_SET
{
898 ULONG PrivilegeCount
;
900 LUID_AND_ATTRIBUTES Privilege
[ANYSIZE_ARRAY
];
901 } PRIVILEGE_SET
,*PPRIVILEGE_SET
;
903 typedef enum _SECURITY_IMPERSONATION_LEVEL
{
905 SecurityIdentification
,
906 SecurityImpersonation
,
908 } SECURITY_IMPERSONATION_LEVEL
, * PSECURITY_IMPERSONATION_LEVEL
;
910 #define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
911 #define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
912 #define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
913 #define VALID_IMPERSONATION_LEVEL(Level) (((Level) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((Level) <= SECURITY_MAX_IMPERSONATION_LEVEL))
915 #define SECURITY_DYNAMIC_TRACKING (TRUE)
916 #define SECURITY_STATIC_TRACKING (FALSE)
918 typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE
, *PSECURITY_CONTEXT_TRACKING_MODE
;
920 typedef struct _SECURITY_QUALITY_OF_SERVICE
{
922 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
;
923 SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode
;
924 BOOLEAN EffectiveOnly
;
925 } SECURITY_QUALITY_OF_SERVICE
, *PSECURITY_QUALITY_OF_SERVICE
;
927 typedef struct _SE_IMPERSONATION_STATE
{
930 BOOLEAN EffectiveOnly
;
931 SECURITY_IMPERSONATION_LEVEL Level
;
932 } SE_IMPERSONATION_STATE
, *PSE_IMPERSONATION_STATE
;
934 #define OWNER_SECURITY_INFORMATION (0x00000001L)
935 #define GROUP_SECURITY_INFORMATION (0x00000002L)
936 #define DACL_SECURITY_INFORMATION (0x00000004L)
937 #define SACL_SECURITY_INFORMATION (0x00000008L)
938 #define LABEL_SECURITY_INFORMATION (0x00000010L)
940 #define PROTECTED_DACL_SECURITY_INFORMATION (0x80000000L)
941 #define PROTECTED_SACL_SECURITY_INFORMATION (0x40000000L)
942 #define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L)
943 #define UNPROTECTED_SACL_SECURITY_INFORMATION (0x10000000L)
948 // Registry Access Rights
950 #define KEY_QUERY_VALUE (0x0001)
951 #define KEY_SET_VALUE (0x0002)
952 #define KEY_CREATE_SUB_KEY (0x0004)
953 #define KEY_ENUMERATE_SUB_KEYS (0x0008)
954 #define KEY_NOTIFY (0x0010)
955 #define KEY_CREATE_LINK (0x0020)
956 #define KEY_WOW64_32KEY (0x0200)
957 #define KEY_WOW64_64KEY (0x0100)
958 #define KEY_WOW64_RES (0x0300)
960 #define KEY_READ ((STANDARD_RIGHTS_READ |\
962 KEY_ENUMERATE_SUB_KEYS |\
967 #define KEY_WRITE ((STANDARD_RIGHTS_WRITE |\
969 KEY_CREATE_SUB_KEY) \
973 #define KEY_EXECUTE ((KEY_READ) \
977 #define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL |\
980 KEY_CREATE_SUB_KEY |\
981 KEY_ENUMERATE_SUB_KEYS |\
988 // Registry Open/Create Options
990 #define REG_OPTION_RESERVED (0x00000000L)
991 #define REG_OPTION_NON_VOLATILE (0x00000000L)
992 #define REG_OPTION_VOLATILE (0x00000001L)
993 #define REG_OPTION_CREATE_LINK (0x00000002L)
994 #define REG_OPTION_BACKUP_RESTORE (0x00000004L)
995 #define REG_OPTION_OPEN_LINK (0x00000008L)
997 #define REG_LEGAL_OPTION \
998 (REG_OPTION_RESERVED |\
999 REG_OPTION_NON_VOLATILE |\
1000 REG_OPTION_VOLATILE |\
1001 REG_OPTION_CREATE_LINK |\
1002 REG_OPTION_BACKUP_RESTORE |\
1003 REG_OPTION_OPEN_LINK)
1006 // Key creation/open disposition
1008 #define REG_CREATED_NEW_KEY (0x00000001L)
1009 #define REG_OPENED_EXISTING_KEY (0x00000002L)
1012 // Key restore & hive load flags
1014 #define REG_WHOLE_HIVE_VOLATILE (0x00000001L)
1015 #define REG_REFRESH_HIVE (0x00000002L)
1016 #define REG_NO_LAZY_FLUSH (0x00000004L)
1017 #define REG_FORCE_RESTORE (0x00000008L)
1018 #define REG_APP_HIVE (0x00000010L)
1019 #define REG_PROCESS_PRIVATE (0x00000020L)
1020 #define REG_START_JOURNAL (0x00000040L)
1021 #define REG_HIVE_EXACT_FILE_GROWTH (0x00000080L)
1022 #define REG_HIVE_NO_RM (0x00000100L)
1023 #define REG_HIVE_SINGLE_LOG (0x00000200L)
1028 #define REG_FORCE_UNLOAD 1
1031 // Notify Filter Values
1033 #define REG_NOTIFY_CHANGE_NAME (0x00000001L)
1034 #define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L)
1035 #define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L)
1036 #define REG_NOTIFY_CHANGE_SECURITY (0x00000008L)
1038 #define REG_LEGAL_CHANGE_FILTER \
1039 (REG_NOTIFY_CHANGE_NAME |\
1040 REG_NOTIFY_CHANGE_ATTRIBUTES |\
1041 REG_NOTIFY_CHANGE_LAST_SET |\
1042 REG_NOTIFY_CHANGE_SECURITY)
1047 // Thread Access Rights
1049 #define THREAD_TERMINATE (0x0001)
1050 #define THREAD_SUSPEND_RESUME (0x0002)
1051 #define THREAD_ALERT (0x0004)
1052 #define THREAD_GET_CONTEXT (0x0008)
1053 #define THREAD_SET_CONTEXT (0x0010)
1054 #define THREAD_SET_INFORMATION (0x0020)
1055 #define THREAD_SET_LIMITED_INFORMATION (0x0400)
1056 #define THREAD_QUERY_LIMITED_INFORMATION (0x0800)
1057 #if (NTDDI_VERSION >= NTDDI_VISTA)
1058 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
1061 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
1066 // Service Start Types
1068 #define SERVICE_BOOT_START 0x00000000
1069 #define SERVICE_SYSTEM_START 0x00000001
1070 #define SERVICE_AUTO_START 0x00000002
1071 #define SERVICE_DEMAND_START 0x00000003
1072 #define SERVICE_DISABLED 0x00000004
1075 // Exception Records
1077 #define EXCEPTION_NONCONTINUABLE 1
1078 #define EXCEPTION_MAXIMUM_PARAMETERS 15
1080 typedef struct _EXCEPTION_RECORD
{
1081 NTSTATUS ExceptionCode
;
1082 ULONG ExceptionFlags
;
1083 struct _EXCEPTION_RECORD
*ExceptionRecord
;
1084 PVOID ExceptionAddress
;
1085 ULONG NumberParameters
;
1086 ULONG_PTR ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
1087 } EXCEPTION_RECORD
, *PEXCEPTION_RECORD
;
1089 typedef struct _EXCEPTION_RECORD32
{
1090 NTSTATUS ExceptionCode
;
1091 ULONG ExceptionFlags
;
1092 ULONG ExceptionRecord
;
1093 ULONG ExceptionAddress
;
1094 ULONG NumberParameters
;
1095 ULONG ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
1096 } EXCEPTION_RECORD32
, *PEXCEPTION_RECORD32
;
1098 typedef struct _EXCEPTION_RECORD64
{
1099 NTSTATUS ExceptionCode
;
1100 ULONG ExceptionFlags
;
1101 ULONG64 ExceptionRecord
;
1102 ULONG64 ExceptionAddress
;
1103 ULONG NumberParameters
;
1104 ULONG __unusedAlignment
;
1105 ULONG64 ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
1106 } EXCEPTION_RECORD64
, *PEXCEPTION_RECORD64
;
1108 typedef struct _EXCEPTION_POINTERS
{
1109 PEXCEPTION_RECORD ExceptionRecord
;
1110 PCONTEXT ContextRecord
;
1111 } EXCEPTION_POINTERS
, *PEXCEPTION_POINTERS
;
1118 typedef struct _QUOTA_LIMITS
{
1119 SIZE_T PagedPoolLimit
;
1120 SIZE_T NonPagedPoolLimit
;
1121 SIZE_T MinimumWorkingSetSize
;
1122 SIZE_T MaximumWorkingSetSize
;
1123 SIZE_T PagefileLimit
;
1124 LARGE_INTEGER TimeLimit
;
1125 } QUOTA_LIMITS
, *PQUOTA_LIMITS
;
1127 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
1128 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
1129 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
1130 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
1131 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
1134 /******************************************************************************
1135 * WINBASE Functions *
1136 ******************************************************************************/
1137 #if !defined(_WINBASE_)
1141 #define InterlockedPopEntrySList(Head) \
1142 ExpInterlockedPopEntrySList(Head)
1144 #define InterlockedPushEntrySList(Head, Entry) \
1145 ExpInterlockedPushEntrySList(Head, Entry)
1147 #define InterlockedFlushSList(Head) \
1148 ExpInterlockedFlushSList(Head)
1150 #define QueryDepthSList(Head) \
1151 ExQueryDepthSList(Head)
1153 #else // !defined(_WIN64)
1158 InterlockedPopEntrySList(
1159 IN PSLIST_HEADER ListHead
);
1164 InterlockedPushEntrySList(
1165 IN PSLIST_HEADER ListHead
,
1166 IN PSLIST_ENTRY ListEntry
);
1168 #define InterlockedFlushSList(ListHead) \
1169 ExInterlockedFlushSList(ListHead)
1171 #define QueryDepthSList(Head) \
1172 ExQueryDepthSList(Head)
1174 #endif // !defined(_WIN64)
1176 #endif // !defined(_WINBASE_)
1179 /******************************************************************************
1181 ******************************************************************************/
1183 typedef struct _DISPATCHER_HEADER
1185 __GNU_EXTENSION
union
1187 __GNU_EXTENSION
struct
1190 __GNU_EXTENSION
union
1195 __GNU_EXTENSION
union
1200 __GNU_EXTENSION
union
1203 BOOLEAN DebugActive
;
1209 LIST_ENTRY WaitListHead
;
1210 } DISPATCHER_HEADER
, *PDISPATCHER_HEADER
;
1212 typedef ULONG_PTR KSPIN_LOCK
, *PKSPIN_LOCK
;
1214 typedef struct _KEVENT
{
1215 DISPATCHER_HEADER Header
;
1216 } KEVENT
, *PKEVENT
, *RESTRICTED_POINTER PRKEVENT
;
1218 typedef struct _KSEMAPHORE
{
1219 DISPATCHER_HEADER Header
;
1221 } KSEMAPHORE
, *PKSEMAPHORE
, *RESTRICTED_POINTER PRKSEMAPHORE
;
1223 /******************************************************************************
1225 ******************************************************************************/
1227 #define RTL_REGISTRY_ABSOLUTE 0
1228 #define RTL_REGISTRY_SERVICES 1
1229 #define RTL_REGISTRY_CONTROL 2
1230 #define RTL_REGISTRY_WINDOWS_NT 3
1231 #define RTL_REGISTRY_DEVICEMAP 4
1232 #define RTL_REGISTRY_USER 5
1233 #define RTL_REGISTRY_MAXIMUM 6
1234 #define RTL_REGISTRY_HANDLE 0x40000000
1235 #define RTL_REGISTRY_OPTIONAL 0x80000000
1237 /* RTL_QUERY_REGISTRY_TABLE.Flags */
1238 #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001
1239 #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002
1240 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004
1241 #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008
1242 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010
1243 #define RTL_QUERY_REGISTRY_DIRECT 0x00000020
1244 #define RTL_QUERY_REGISTRY_DELETE 0x00000040
1246 typedef struct _RTL_BITMAP
{
1249 } RTL_BITMAP
, *PRTL_BITMAP
;
1251 typedef struct _RTL_BITMAP_RUN
{
1252 ULONG StartingIndex
;
1254 } RTL_BITMAP_RUN
, *PRTL_BITMAP_RUN
;
1257 (DDKAPI
*PRTL_QUERY_REGISTRY_ROUTINE
)(
1261 IN ULONG ValueLength
,
1263 IN PVOID EntryContext
);
1265 typedef struct _RTL_QUERY_REGISTRY_TABLE
{
1266 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine
;
1272 ULONG DefaultLength
;
1273 } RTL_QUERY_REGISTRY_TABLE
, *PRTL_QUERY_REGISTRY_TABLE
;
1275 typedef struct _TIME_FIELDS
{
1282 CSHORT Milliseconds
;
1284 } TIME_FIELDS
, *PTIME_FIELDS
;
1287 /******************************************************************************
1289 ******************************************************************************/
1295 IN PVOID FailedAssertion
,
1297 IN ULONG LineNumber
,
1302 * IN VOID UNALIGNED *Destination,
1303 * IN CONST VOID UNALIGNED *Source,
1306 #define RtlCopyMemory(Destination, Source, Length) \
1307 memcpy(Destination, Source, Length)
1309 #define RtlCopyBytes RtlCopyMemory
1311 #if defined(_M_AMD64)
1315 RtlCopyMemoryNonTemporal(
1316 VOID UNALIGNED
*Destination
,
1317 CONST VOID UNALIGNED
*Source
,
1320 #define RtlCopyMemoryNonTemporal RtlCopyMemory
1328 #define RtlEqualLuid(Luid1, Luid2) \
1329 (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
1333 * IN VOID UNALIGNED *Destination,
1334 * IN CONST VOID UNALIGNED *Source,
1337 #define RtlEqualMemory(Destination, Source, Length) \
1338 (!memcmp(Destination, Source, Length))
1342 * IN VOID UNALIGNED *Destination,
1346 #define RtlFillMemory(Destination, Length, Fill) \
1347 memset(Destination, Fill, Length)
1349 #define RtlFillBytes RtlFillMemory
1354 RtlFreeUnicodeString(
1355 IN PUNICODE_STRING UnicodeString
);
1361 IN PUNICODE_STRING GuidString
,
1367 RtlInitUnicodeString(
1368 IN OUT PUNICODE_STRING DestinationString
,
1369 IN PCWSTR SourceString
);
1373 * IN VOID UNALIGNED *Destination,
1374 * IN CONST VOID UNALIGNED *Source,
1377 #define RtlMoveMemory(Destination, Source, Length) \
1378 memmove(Destination, Source, Length)
1385 OUT PUNICODE_STRING GuidString
);
1389 * IN VOID UNALIGNED *Destination,
1392 #define RtlZeroMemory(Destination, Length) \
1393 memset(Destination, 0, Length)
1395 #define RtlZeroBytes RtlZeroMemory
1398 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1403 IN PRTL_BITMAP BitMapHeader
,
1404 IN ULONG StartingIndex
,
1411 IN PRTL_BITMAP BitMapHeader
,
1412 IN ULONG StartingIndex
,
1418 RtlAnsiStringToUnicodeString(
1419 IN OUT PUNICODE_STRING DestinationString
,
1420 IN PANSI_STRING SourceString
,
1421 IN BOOLEAN AllocateDestinationString
);
1426 RtlxAnsiStringToUnicodeSize(
1427 IN PCANSI_STRING AnsiString
);
1429 #define RtlAnsiStringToUnicodeSize(String) ( \
1430 NLS_MB_CODE_PAGE_TAG ? \
1431 RtlxAnsiStringToUnicodeSize(String) : \
1432 ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
1438 RtlAppendUnicodeStringToString(
1439 IN OUT PUNICODE_STRING Destination
,
1440 IN PCUNICODE_STRING Source
);
1445 RtlAppendUnicodeToString(
1446 IN OUT PUNICODE_STRING Destination
,
1452 RtlCheckRegistryKey(
1453 IN ULONG RelativeTo
,
1460 IN PRTL_BITMAP BitMapHeader
);
1466 IN PRTL_BITMAP BitMapHeader
,
1467 IN ULONG StartingIndex
,
1468 IN ULONG NumberToClear
);
1474 IN CONST VOID
*Source1
,
1475 IN CONST VOID
*Source2
,
1481 RtlCompareUnicodeString(
1482 IN PCUNICODE_STRING String1
,
1483 IN PCUNICODE_STRING String2
,
1484 IN BOOLEAN CaseInSensitive
);
1489 RtlCompareUnicodeStrings(
1491 IN SIZE_T String1Length
,
1493 IN SIZE_T String2Length
,
1494 IN BOOLEAN CaseInSensitive
);
1499 RtlCopyUnicodeString(
1500 IN OUT PUNICODE_STRING DestinationString
,
1501 IN PCUNICODE_STRING SourceString
);
1506 RtlCreateRegistryKey(
1507 IN ULONG RelativeTo
,
1513 RtlCreateSecurityDescriptor(
1514 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
1520 RtlDeleteRegistryValue(
1521 IN ULONG RelativeTo
,
1523 IN PCWSTR ValueName
);
1528 RtlEqualUnicodeString(
1529 IN CONST UNICODE_STRING
*String1
,
1530 IN CONST UNICODE_STRING
*String2
,
1531 IN BOOLEAN CaseInSensitive
);
1533 #if !defined(_AMD64_) && !defined(_IA64_)
1537 RtlExtendedIntegerMultiply(
1538 IN LARGE_INTEGER Multiplicand
,
1539 IN LONG Multiplier
);
1544 RtlExtendedLargeIntegerDivide(
1545 IN LARGE_INTEGER Dividend
,
1547 IN OUT PULONG Remainder
);
1550 #if defined(_X86_) || defined(_IA64_)
1554 RtlExtendedMagicDivide(
1555 IN LARGE_INTEGER Dividend
,
1556 IN LARGE_INTEGER MagicDivisor
,
1557 IN CCHAR ShiftCount
);
1564 IN PANSI_STRING AnsiString
);
1570 IN PRTL_BITMAP BitMapHeader
,
1571 IN ULONG NumberToFind
,
1572 IN ULONG HintIndex
);
1577 RtlFindClearBitsAndSet(
1578 IN PRTL_BITMAP BitMapHeader
,
1579 IN ULONG NumberToFind
,
1580 IN ULONG HintIndex
);
1585 RtlFindFirstRunClear(
1586 IN PRTL_BITMAP BitMapHeader
,
1587 OUT PULONG StartingIndex
);
1593 IN PRTL_BITMAP BitMapHeader
,
1594 OUT PRTL_BITMAP_RUN RunArray
,
1595 IN ULONG SizeOfRunArray
,
1596 IN BOOLEAN LocateLongestRuns
);
1601 RtlFindLastBackwardRunClear(
1602 IN PRTL_BITMAP BitMapHeader
,
1604 OUT PULONG StartingRunIndex
);
1609 RtlFindLeastSignificantBit(
1615 RtlFindLongestRunClear(
1616 IN PRTL_BITMAP BitMapHeader
,
1617 OUT PULONG StartingIndex
);
1622 RtlFindMostSignificantBit(
1628 RtlFindNextForwardRunClear(
1629 IN PRTL_BITMAP BitMapHeader
,
1631 OUT PULONG StartingRunIndex
);
1637 IN PRTL_BITMAP BitMapHeader
,
1638 IN ULONG NumberToFind
,
1639 IN ULONG HintIndex
);
1644 RtlFindSetBitsAndClear(
1645 IN PRTL_BITMAP BitMapHeader
,
1646 IN ULONG NumberToFind
,
1647 IN ULONG HintIndex
);
1652 RtlHashUnicodeString(
1653 IN CONST UNICODE_STRING
*String
,
1654 IN BOOLEAN CaseInSensitive
,
1655 IN ULONG HashAlgorithm
,
1656 OUT PULONG HashValue
);
1662 IN OUT PANSI_STRING DestinationString
,
1663 IN PCSZ SourceString
);
1668 RtlInitializeBitMap(
1669 IN PRTL_BITMAP BitMapHeader
,
1670 IN PULONG BitMapBuffer
,
1671 IN ULONG SizeOfBitMap
);
1677 IN OUT PSTRING DestinationString
,
1678 IN PCSZ SourceString
);
1683 RtlIntegerToUnicodeString(
1685 IN ULONG Base OPTIONAL
,
1686 IN OUT PUNICODE_STRING String
);
1691 RtlInt64ToUnicodeString(
1693 IN ULONG Base OPTIONAL
,
1694 IN OUT PUNICODE_STRING String
);
1697 #define RtlIntPtrToUnicodeString(Value, Base, String) \
1698 RtlInt64ToUnicodeString(Value, Base, String)
1700 #define RtlIntPtrToUnicodeString(Value, Base, String) \
1701 RtlIntegerToUnicodeString(Value, Base, String)
1708 #define RtlIsZeroLuid(_L1) \
1709 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
1714 RtlLengthSecurityDescriptor(
1715 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
1720 RtlNumberOfClearBits(
1721 IN PRTL_BITMAP BitMapHeader
);
1727 IN PRTL_BITMAP BitMapHeader
);
1732 RtlQueryRegistryValues(
1733 IN ULONG RelativeTo
,
1735 IN PRTL_QUERY_REGISTRY_TABLE QueryTable
,
1737 IN PVOID Environment OPTIONAL
);
1739 #define LONG_SIZE (sizeof(LONG))
1740 #define LONG_MASK (LONG_SIZE - 1)
1744 * PULONG DestinationAddress,
1745 * PULONG SourceAddress);
1747 #if defined(_AMD64_)
1748 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
1749 *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
1751 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
1752 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
1754 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
1755 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
1756 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
1757 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
1761 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
1766 * RtlRetrieveUshort(
1767 * PUSHORT DestinationAddress,
1768 * PUSHORT SourceAddress);
1770 #if defined(_AMD64_)
1771 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
1772 *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
1774 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
1775 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
1777 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
1778 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
1782 *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
1790 IN PRTL_BITMAP BitMapHeader
);
1796 IN PRTL_BITMAP BitMapHeader
,
1797 IN ULONG StartingIndex
,
1798 IN ULONG NumberToSet
);
1803 RtlSetDaclSecurityDescriptor(
1804 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
1805 IN BOOLEAN DaclPresent
,
1806 IN PACL Dacl OPTIONAL
,
1807 IN BOOLEAN DaclDefaulted OPTIONAL
);
1811 * IN PULONG Address,
1814 #if defined(_AMD64_)
1815 #define RtlStoreUlong(Address,Value) \
1816 *(ULONG UNALIGNED *)(Address) = (Value)
1818 #define RtlStoreUlong(Address,Value) \
1819 if ((ULONG_PTR)(Address) & LONG_MASK) { \
1820 ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
1821 ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
1822 ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
1823 ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT] = (UCHAR)(FOURTHBYTE(Value)); \
1826 *((PULONG)(Address)) = (ULONG) (Value); \
1831 * RtlStoreUlonglong(
1832 * IN OUT PULONGLONG Address,
1835 #if defined(_AMD64_)
1836 #define RtlStoreUlonglong(Address,Value) \
1837 *(ULONGLONG UNALIGNED *)(Address) = (Value)
1839 #define RtlStoreUlonglong(Address,Value) \
1840 if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
1841 RtlStoreUlong((ULONG_PTR)(Address), \
1842 (ULONGLONG)(Value) & 0xFFFFFFFF); \
1843 RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
1844 (ULONGLONG)(Value) >> 32); \
1846 *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
1852 * IN OUT PULONG_PTR Address,
1853 * IN ULONG_PTR Value);
1856 #define RtlStoreUlongPtr(Address,Value) \
1857 RtlStoreUlonglong(Address,Value)
1859 #define RtlStoreUlongPtr(Address,Value) \
1860 RtlStoreUlong(Address,Value)
1865 * IN PUSHORT Address,
1868 #if defined(_AMD64_)
1869 #define RtlStoreUshort(Address,Value) \
1870 *(USHORT UNALIGNED *)(Address) = (Value)
1872 #define RtlStoreUshort(Address,Value) \
1873 if ((ULONG_PTR)(Address) & SHORT_MASK) { \
1874 ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
1875 ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
1878 *((PUSHORT) (Address)) = (USHORT)Value; \
1885 RtlTimeFieldsToTime(
1886 IN PTIME_FIELDS TimeFields
,
1887 IN PLARGE_INTEGER Time
);
1892 RtlTimeToTimeFields(
1893 IN PLARGE_INTEGER Time
,
1894 IN PTIME_FIELDS TimeFields
);
1905 RtlUlonglongByteSwap(
1906 IN ULONGLONG Source
);
1911 RtlUnicodeStringToAnsiString(
1912 IN OUT PANSI_STRING DestinationString
,
1913 IN PCUNICODE_STRING SourceString
,
1914 IN BOOLEAN AllocateDestinationString
);
1919 RtlxUnicodeStringToAnsiSize(
1920 IN PCUNICODE_STRING UnicodeString
);
1922 #define RtlUnicodeStringToAnsiSize(String) ( \
1923 NLS_MB_CODE_PAGE_TAG ? \
1924 RtlxUnicodeStringToAnsiSize(String) : \
1925 ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
1931 RtlUnicodeStringToInteger(
1932 IN PCUNICODE_STRING String
,
1933 IN ULONG Base OPTIONAL
,
1939 RtlUpcaseUnicodeChar(
1940 IN WCHAR SourceCharacter
);
1951 RtlValidRelativeSecurityDescriptor(
1952 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput
,
1953 IN ULONG SecurityDescriptorLength
,
1954 IN SECURITY_INFORMATION RequiredInformation
);
1959 RtlValidSecurityDescriptor(
1960 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
1965 RtlWriteRegistryValue(
1966 IN ULONG RelativeTo
,
1968 IN PCWSTR ValueName
,
1971 IN ULONG ValueLength
);
1973 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
1975 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
1979 RtlPrefetchMemoryNonTemporal(
1984 #if (NTDDI_VERSION >= NTDDI_WINXP)
1989 PRTL_BITMAP BitMapHeader
,
1995 RtlDowncaseUnicodeChar(
1996 IN WCHAR SourceCharacter
);
2002 PRTL_BITMAP BitMapHeader
,
2009 IN PRTL_BITMAP BitMapHeader
,
2010 IN ULONG BitNumber
);
2012 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
2014 #if (NTDDI_VERSION >= NTDDI_VISTA)
2018 RtlNumberOfSetBitsUlongPtr(
2019 IN ULONG_PTR Target
);
2024 RtlIoDecodeMemIoResource (
2025 IN PIO_RESOURCE_DESCRIPTOR Descriptor
,
2026 OUT PULONGLONG Alignment OPTIONAL
,
2027 OUT PULONGLONG MinimumAddress OPTIONAL
,
2028 OUT PULONGLONG MaximumAddress OPTIONAL
);
2033 RtlIoEncodeMemIoResource(
2034 IN PIO_RESOURCE_DESCRIPTOR Descriptor
,
2036 IN ULONGLONG Length
,
2037 IN ULONGLONG Alignment
,
2038 IN ULONGLONG MinimumAddress
,
2039 IN ULONGLONG MaximumAddress
);
2044 RtlCmDecodeMemIoResource(
2045 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor
,
2046 OUT PULONGLONG Start OPTIONAL
);
2051 RtlFindClosestEncodableLength(
2052 IN ULONGLONG SourceLength
,
2053 OUT PULONGLONG TargetLength
);
2057 #if !defined(MIDL_PASS)
2058 /* inline funftions */
2059 //DECLSPEC_DEPRECATED_DDK_WINXP
2063 RtlConvertLongToLargeInteger(LONG SignedInteger
)
2066 ret
.QuadPart
= SignedInteger
;
2070 //DECLSPEC_DEPRECATED_DDK_WINXP
2074 RtlConvertUlongToLargeInteger(
2075 ULONG UnsignedInteger
)
2078 ret
.QuadPart
= UnsignedInteger
;
2082 //DECLSPEC_DEPRECATED_DDK
2086 RtlEnlargedUnsignedDivide(
2087 IN ULARGE_INTEGER Dividend
,
2089 IN OUT PULONG Remainder
)
2092 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
2093 return (ULONG
)(Dividend
.QuadPart
/ Divisor
);
2096 //DECLSPEC_DEPRECATED_DDK
2100 RtlEnlargedUnsignedMultiply(
2101 IN ULONG Multiplicand
,
2102 IN ULONG Multiplier
)
2105 ret
.QuadPart
= (ULONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
2109 //DECLSPEC_DEPRECATED_DDK
2113 RtlEnlargedIntegerMultiply(
2114 IN LONG Multiplicand
,
2118 ret
.QuadPart
= (LONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
2124 RtlInitEmptyAnsiString(OUT PANSI_STRING AnsiString
,
2126 IN USHORT BufferSize
)
2128 AnsiString
->Length
= 0;
2129 AnsiString
->MaximumLength
= BufferSize
;
2130 AnsiString
->Buffer
= Buffer
;
2135 RtlInitEmptyUnicodeString(
2136 OUT PUNICODE_STRING UnicodeString
,
2138 IN USHORT BufferSize
)
2140 UnicodeString
->Length
= 0;
2141 UnicodeString
->MaximumLength
= BufferSize
;
2142 UnicodeString
->Buffer
= Buffer
;
2145 #if defined(_AMD64_) || defined(_IA64_)
2149 RtlExtendedIntegerMultiply(
2150 LARGE_INTEGER Multiplicand
,
2154 ret
.QuadPart
= Multiplicand
.QuadPart
* Multiplier
;
2161 RtlExtendedLargeIntegerDivide(
2162 LARGE_INTEGER Dividend
,
2167 ret
.QuadPart
= (ULONG64
)Dividend
.QuadPart
/ Divisor
;
2169 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
2174 #if defined(_AMD64_)
2176 #define MultiplyHigh __mulh
2177 #define UnsignedMultiplyHigh __umulh
2179 //DECLSPEC_DEPRECATED_DDK
2183 RtlExtendedMagicDivide(
2184 IN LARGE_INTEGER Dividend
,
2185 IN LARGE_INTEGER MagicDivisor
,
2186 IN CCHAR ShiftCount
)
2191 Pos
= (Dividend
.QuadPart
>= 0);
2192 ret64
= UnsignedMultiplyHigh(Pos
? Dividend
.QuadPart
: -Dividend
.QuadPart
,
2193 MagicDivisor
.QuadPart
);
2194 ret64
>>= ShiftCount
;
2195 ret
.QuadPart
= Pos
? ret64
: -ret64
;
2200 //DECLSPEC_DEPRECATED_DDK
2205 IN LARGE_INTEGER Addend1
,
2206 IN LARGE_INTEGER Addend2
)
2209 ret
.QuadPart
= Addend1
.QuadPart
+ Addend2
.QuadPart
;
2214 * RtlLargeIntegerAnd(
2215 * IN OUT LARGE_INTEGER Result,
2216 * IN LARGE_INTEGER Source,
2217 * IN LARGE_INTEGER Mask);
2219 #define RtlLargeIntegerAnd(Result, Source, Mask) \
2220 Result.QuadPart = Source.QuadPart & Mask.QuadPart
2222 //DECLSPEC_DEPRECATED_DDK
2226 RtlLargeIntegerArithmeticShift(
2227 IN LARGE_INTEGER LargeInteger
,
2228 IN CCHAR ShiftCount
)
2231 ret
.QuadPart
= LargeInteger
.QuadPart
>> ShiftCount
;
2236 * RtlLargeIntegerEqualTo(
2237 * IN LARGE_INTEGER Operand1,
2238 * IN LARGE_INTEGER Operand2);
2240 #define RtlLargeIntegerEqualTo(X,Y) \
2241 (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
2245 RtlSecureZeroMemory(
2249 volatile char* vptr
= (volatile char*)Pointer
;
2250 #if defined(_M_AMD64)
2251 __stosb((PUCHAR
)vptr
, 0, Size
);
2253 char * endptr
= (char *)vptr
+ Size
;
2254 while (vptr
< endptr
)
2262 #if defined(_M_AMD64)
2266 IN PRTL_BITMAP BitMapHeader
,
2267 IN ULONG BitPosition
)
2269 return BitTest((LONG CONST
*)BitMapHeader
->Buffer
, BitPosition
);
2272 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
2273 #endif // defined(_M_AMD64)
2275 #endif // !defined(MIDL_PASS)
2278 // Byte Swap Functions
2280 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \
2281 ((defined(_M_AMD64) || defined(_M_IA64)) \
2282 && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))
2284 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
2285 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
2286 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
2290 /******************************************************************************
2291 * Memory manager Types *
2292 ******************************************************************************/
2294 typedef struct _MDL
{
2298 struct _EPROCESS
*Process
;
2299 PVOID MappedSystemVa
;
2306 /******************************************************************************
2307 * Memory manager Functions *
2308 ******************************************************************************/
2310 /* PVOID MmGetSystemAddressForMdl(
2313 #define MmGetSystemAddressForMdl(Mdl) \
2314 (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
2315 MDL_SOURCE_IS_NONPAGED_POOL)) ? \
2316 ((Mdl)->MappedSystemVa) : \
2317 (MmMapLockedPages((Mdl), KernelMode)))
2320 * MmGetSystemAddressForMdlSafe(
2322 * IN MM_PAGE_PRIORITY Priority)
2324 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
2325 (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
2326 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
2327 (_Mdl)->MappedSystemVa : \
2328 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
2329 KernelMode, MmCached, NULL, FALSE, (_Priority)))
2331 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2336 IN PMDL MemoryDescriptorList OPTIONAL
,
2343 /******************************************************************************
2344 * I/O Manager Functions *
2345 ******************************************************************************/
2347 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
2348 (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
2350 #define DMA_MACROS_DEFINED
2354 IoAllocateAdapterChannel(
2355 IN PADAPTER_OBJECT AdapterObject
,
2356 IN PDEVICE_OBJECT DeviceObject
,
2357 IN ULONG NumberOfMapRegisters
,
2358 IN PDRIVER_CONTROL ExecutionRoutine
,
2361 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel
;
2362 AllocateAdapterChannel
=
2363 *(DmaAdapter
)->DmaOperations
->AllocateAdapterChannel
;
2364 ASSERT(AllocateAdapterChannel
);
2365 return AllocateAdapterChannel(DmaAdapter
,
2367 NumberOfMapRegisters
,
2374 IoFlushAdapterBuffers(
2375 IN PADAPTER_OBJECT AdapterObject
,
2377 IN PVOID MapRegisterBase
,
2380 IN BOOLEAN WriteToDevice
)
2382 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers
;
2383 FlushAdapterBuffers
= *(DmaAdapter
)->DmaOperations
->FlushAdapterBuffers
;
2384 ASSERT(FlushAdapterBuffers
);
2385 return FlushAdapterBuffers(DmaAdapter
,
2395 IoFreeAdapterChannel(
2396 IN PADAPTER_OBJECT AdapterObject
)
2398 PFREE_ADAPTER_CHANNEL FreeAdapterChannel
;
2399 FreeAdapterChannel
= *(DmaAdapter
)->DmaOperations
->FreeAdapterChannel
;
2400 ASSERT(FreeAdapterChannel
);
2401 FreeAdapterChannel(DmaAdapter
);
2407 IN PADAPTER_OBJECT AdapterObject
,
2408 IN PVOID MapRegisterBase
,
2409 IN ULONG NumberOfMapRegisters
)
2411 PFREE_MAP_REGISTERS FreeMapRegisters
;
2412 FreeMapRegisters
= *(DmaAdapter
)->DmaOperations
->FreeMapRegisters
;
2413 ASSERT(FreeMapRegisters
);
2414 FreeMapRegisters(DmaAdapter
, MapRegisterBase
, NumberOfMapRegisters
);
2420 IN PDMA_ADAPTER DmaAdapter
,
2422 IN PVOID MapRegisterBase
,
2424 IN OUT PULONG Length
,
2425 IN BOOLEAN WriteToDevice
)
2427 PMAP_TRANSFER MapTransfer
;
2429 MapTransfer
= *(DmaAdapter
)->DmaOperations
->MapTransfer
;
2430 ASSERT(MapTransfer
);
2431 return MapTransfer(DmaAdapter
,
2441 /******************************************************************************
2443 ******************************************************************************/
2445 typedef enum _POOL_TYPE
{
2448 NonPagedPoolMustSucceed
,
2450 NonPagedPoolCacheAligned
,
2451 PagedPoolCacheAligned
,
2452 NonPagedPoolCacheAlignedMustS
,
2454 NonPagedPoolSession
= 32,
2456 NonPagedPoolMustSucceedSession
,
2457 DontUseThisTypeSession
,
2458 NonPagedPoolCacheAlignedSession
,
2459 PagedPoolCacheAlignedSession
,
2460 NonPagedPoolCacheAlignedMustSSession
2463 typedef enum _SUITE_TYPE
{
2467 CommunicationServer
,
2469 SmallBusinessRestricted
,
2478 typedef enum _EX_POOL_PRIORITY
{
2480 LowPoolPrioritySpecialPoolOverrun
= 8,
2481 LowPoolPrioritySpecialPoolUnderrun
= 9,
2482 NormalPoolPriority
= 16,
2483 NormalPoolPrioritySpecialPoolOverrun
= 24,
2484 NormalPoolPrioritySpecialPoolUnderrun
= 25,
2485 HighPoolPriority
= 32,
2486 HighPoolPrioritySpecialPoolOverrun
= 40,
2487 HighPoolPrioritySpecialPoolUnderrun
= 41
2490 typedef struct _FAST_MUTEX
2497 } FAST_MUTEX
, *PFAST_MUTEX
;
2499 typedef ULONG_PTR ERESOURCE_THREAD
, *PERESOURCE_THREAD
;
2501 typedef struct _OWNER_ENTRY
{
2502 ERESOURCE_THREAD OwnerThread
;
2503 _ANONYMOUS_UNION
union {
2507 } OWNER_ENTRY
, *POWNER_ENTRY
;
2509 typedef struct _ERESOURCE
2511 LIST_ENTRY SystemResourcesList
;
2512 POWNER_ENTRY OwnerTable
;
2515 volatile PKSEMAPHORE SharedWaiters
;
2516 volatile PKEVENT ExclusiveWaiters
;
2517 OWNER_ENTRY OwnerEntry
;
2518 ULONG ActiveEntries
;
2519 ULONG ContentionCount
;
2520 ULONG NumberOfSharedWaiters
;
2521 ULONG NumberOfExclusiveWaiters
;
2522 __GNU_EXTENSION
union
2525 ULONG_PTR CreatorBackTraceIndex
;
2527 KSPIN_LOCK SpinLock
;
2528 } ERESOURCE
, *PERESOURCE
;
2530 #if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
2531 #define LOOKASIDE_ALIGN
2533 #define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */
2536 typedef struct _LOOKASIDE_LIST_EX
*PLOOKASIDE_LIST_EX
;
2539 (DDKAPI
*PALLOCATE_FUNCTION
)(
2540 IN POOL_TYPE PoolType
,
2541 IN SIZE_T NumberOfBytes
,
2545 (DDKAPI
*PALLOCATE_FUNCTION_EX
)(
2546 IN POOL_TYPE PoolType
,
2547 IN SIZE_T NumberOfBytes
,
2549 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
2552 (DDKAPI
*PFREE_FUNCTION
)(
2556 (DDKAPI
*PFREE_FUNCTION_EX
)(
2558 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
2561 (DDKAPI
*PCALLBACK_FUNCTION
)(
2562 IN PVOID CallbackContext
,
2564 IN PVOID Argument2
);
2566 typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE
{
2568 SLIST_HEADER ListHead
;
2569 SINGLE_LIST_ENTRY SingleListHead
;
2572 USHORT MaximumDepth
;
2573 ULONG TotalAllocates
;
2575 ULONG AllocateMisses
;
2587 PALLOCATE_FUNCTION_EX AllocateEx
;
2588 PALLOCATE_FUNCTION Allocate
;
2591 PFREE_FUNCTION_EX FreeEx
;
2592 PFREE_FUNCTION Free
;
2594 LIST_ENTRY ListEntry
;
2595 ULONG LastTotalAllocates
;
2597 ULONG LastAllocateMisses
;
2598 ULONG LastAllocateHits
;
2601 } GENERAL_LOOKASIDE
, *PGENERAL_LOOKASIDE
;
2603 typedef struct _PAGED_LOOKASIDE_LIST
{
2604 GENERAL_LOOKASIDE L
;
2605 #if !defined(_AMD64_) && !defined(_IA64_)
2606 FAST_MUTEX Lock__ObsoleteButDoNotDelete
;
2608 } PAGED_LOOKASIDE_LIST
, *PPAGED_LOOKASIDE_LIST
;
2610 typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST
{
2611 GENERAL_LOOKASIDE L
;
2612 #if !defined(_AMD64_) && !defined(_IA64_)
2613 KSPIN_LOCK Lock__ObsoleteButDoNotDelete
;
2615 } NPAGED_LOOKASIDE_LIST
, *PNPAGED_LOOKASIDE_LIST
;
2617 //typedef struct _LOOKASIDE_LIST_EX {
2618 // GENERAL_LOOKASIDE_POOL L;
2619 //} LOOKASIDE_LIST_EX, *PLOOKASIDE_LIST_EX;
2621 typedef struct _EX_RUNDOWN_REF
{
2622 __GNU_EXTENSION
union {
2623 volatile ULONG_PTR Count
;
2626 } EX_RUNDOWN_REF
, *PEX_RUNDOWN_REF
;
2628 typedef struct _EX_RUNDOWN_REF_CACHE_AWARE
*PEX_RUNDOWN_REF_CACHE_AWARE
;
2630 typedef enum _WORK_QUEUE_TYPE
{
2633 HyperCriticalWorkQueue
,
2638 (DDKAPI
*PWORKER_THREAD_ROUTINE
)(
2639 IN PVOID Parameter
);
2641 typedef struct _WORK_QUEUE_ITEM
{
2643 PWORKER_THREAD_ROUTINE WorkerRoutine
;
2644 volatile PVOID Parameter
;
2645 } WORK_QUEUE_ITEM
, *PWORK_QUEUE_ITEM
;
2648 /******************************************************************************
2649 * Executive Functions *
2650 ******************************************************************************/
2653 #if defined(_NTHAL_)
2654 #define ExAcquireFastMutex ExiAcquireFastMutex
2655 #define ExReleaseFastMutex ExiReleaseFastMutex
2656 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
2658 #define ExInterlockedAddUlong ExfInterlockedAddUlong
2659 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
2660 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
2661 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
2662 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
2663 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
2668 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
2669 defined(_NTHAL_) || defined(_NTOSP_)
2672 ExQueryDepthSList(IN PSLIST_HEADER ListHead
);
2676 ExQueryDepthSList(IN PSLIST_HEADER ListHead
)
2678 return (USHORT
)(ListHead
->Alignment
& 0xffff);
2684 ExpInterlockedFlushSList(
2685 PSLIST_HEADER ListHead
);
2689 ExpInterlockedPopEntrySList(
2690 PSLIST_HEADER ListHead
);
2694 ExpInterlockedPushEntrySList(
2695 PSLIST_HEADER ListHead
,
2696 PSLIST_ENTRY ListEntry
);
2698 #define ExInterlockedFlushSList(Head) \
2699 ExpInterlockedFlushSList(Head)
2700 #define ExInterlockedPopEntrySList(Head, Lock) \
2701 ExpInterlockedPopEntrySList(Head)
2702 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
2703 ExpInterlockedPushEntrySList(Head, Entry)
2705 #else // !defined(_WIN64)
2707 #define ExQueryDepthSList(listhead) (listhead)->Depth
2712 ExInterlockedFlushSList(
2713 IN PSLIST_HEADER ListHead
);
2715 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
2719 ExInterlockedPopEntrySList(
2720 IN PSLIST_HEADER ListHead
,
2721 IN PKSPIN_LOCK Lock
);
2726 ExInterlockedPushEntrySList(
2727 IN PSLIST_HEADER ListHead
,
2728 IN PSINGLE_LIST_ENTRY ListEntry
,
2729 IN PKSPIN_LOCK Lock
);
2731 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
2732 InterlockedPopEntrySList(_ListHead)
2733 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
2734 InterlockedPushEntrySList(_ListHead, _ListEntry)
2735 #endif // _WIN2K_COMPAT_SLIST_USAGE
2737 #endif // !defined(_WIN64)
2740 * ExGetCurrentResourceThread(
2743 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread())
2745 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
2748 * ExInitializeWorkItem(
2749 * IN PWORK_QUEUE_ITEM Item,
2750 * IN PWORKER_THREAD_ROUTINE Routine,
2753 #define ExInitializeWorkItem(Item, Routine, Context) \
2755 (Item)->WorkerRoutine = Routine; \
2756 (Item)->Parameter = Context; \
2757 (Item)->List.Flink = NULL; \
2760 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2766 IN OUT PFAST_MUTEX FastMutex
);
2772 IN OUT PFAST_MUTEX FastMutex
);
2777 ExTryToAcquireFastMutex(
2778 IN OUT PFAST_MUTEX FastMutex
);
2783 ExAcquireFastMutexUnsafe(
2784 IN OUT PFAST_MUTEX FastMutex
);
2789 ExReleaseFastMutexUnsafe(
2790 IN OUT PFAST_MUTEX FastMutex
);
2795 ExAcquireResourceExclusiveLite(
2796 IN PERESOURCE Resource
,
2802 ExAcquireResourceSharedLite(
2803 IN PERESOURCE Resource
,
2809 ExAcquireSharedStarveExclusive(
2810 IN PERESOURCE Resource
,
2816 ExAcquireSharedWaitForExclusive(
2817 IN PERESOURCE Resource
,
2824 IN POOL_TYPE PoolType
,
2825 IN SIZE_T NumberOfBytes
);
2828 #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
2829 #endif /* POOL_TAGGING */
2834 ExAllocatePoolWithQuota(
2835 IN POOL_TYPE PoolType
,
2836 IN SIZE_T NumberOfBytes
);
2839 #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
2840 #endif /* POOL_TAGGING */
2845 ExAllocatePoolWithQuotaTag(
2846 IN POOL_TYPE PoolType
,
2847 IN SIZE_T NumberOfBytes
,
2850 #ifndef POOL_TAGGING
2851 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
2852 #endif /* POOL_TAGGING */
2857 ExAllocatePoolWithTag(
2858 IN POOL_TYPE PoolType
,
2859 IN SIZE_T NumberOfBytes
,
2865 ExAllocatePoolWithTagPriority(
2866 IN POOL_TYPE PoolType
,
2867 IN SIZE_T NumberOfBytes
,
2869 IN EX_POOL_PRIORITY Priority
);
2874 ExConvertExclusiveToSharedLite(
2875 IN PERESOURCE Resource
);
2881 OUT PCALLBACK_OBJECT
*CallbackObject
,
2882 IN POBJECT_ATTRIBUTES ObjectAttributes
,
2884 IN BOOLEAN AllowMultipleCallbacks
);
2889 ExDeleteNPagedLookasideList(
2890 IN PNPAGED_LOOKASIDE_LIST Lookaside
);
2895 ExDeletePagedLookasideList(
2896 IN PPAGED_LOOKASIDE_LIST Lookaside
);
2901 ExDeleteResourceLite(
2902 IN PERESOURCE Resource
);
2911 #define ExFreePool(P) ExFreePoolWithTag(P, 0)
2924 ExGetExclusiveWaiterCount(
2925 IN PERESOURCE Resource
);
2936 ExGetSharedWaiterCount(
2937 IN PERESOURCE Resource
);
2942 ExInitializeNPagedLookasideList(
2943 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
2944 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
2945 IN PFREE_FUNCTION Free OPTIONAL
,
2954 ExInitializePagedLookasideList(
2955 IN PPAGED_LOOKASIDE_LIST Lookaside
,
2956 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
2957 IN PFREE_FUNCTION Free OPTIONAL
,
2966 ExInitializeResourceLite(
2967 IN PERESOURCE Resource
);
2972 ExInterlockedAddLargeInteger(
2973 IN PLARGE_INTEGER Addend
,
2974 IN LARGE_INTEGER Increment
,
2975 IN PKSPIN_LOCK Lock
);
2978 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
2979 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
2981 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
2982 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
2988 ExInterlockedAddUlong(
2993 #if defined(_AMD64_) || defined(_IA64_)
2994 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
2995 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
2996 #elif defined(_X86_)
3000 ExfInterlockedCompareExchange64(
3001 IN OUT LONGLONG
volatile *Destination
,
3002 IN PLONGLONG Exchange
,
3003 IN PLONGLONG Comperand
);
3004 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
3005 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
3010 ExInterlockedCompareExchange64(
3011 IN OUT LONGLONG
volatile *Destination
,
3012 IN PLONGLONG Exchange
,
3013 IN PLONGLONG Comparand
,
3014 IN PKSPIN_LOCK Lock
);
3020 ExInterlockedInsertHeadList(
3021 IN PLIST_ENTRY ListHead
,
3022 IN PLIST_ENTRY ListEntry
,
3023 IN PKSPIN_LOCK Lock
);
3028 ExInterlockedInsertTailList(
3029 IN PLIST_ENTRY ListHead
,
3030 IN PLIST_ENTRY ListEntry
,
3031 IN PKSPIN_LOCK Lock
);
3036 ExInterlockedPopEntryList(
3037 IN PSINGLE_LIST_ENTRY ListHead
,
3038 IN PKSPIN_LOCK Lock
);
3043 ExInterlockedPushEntryList(
3044 IN PSINGLE_LIST_ENTRY ListHead
,
3045 IN PSINGLE_LIST_ENTRY ListEntry
,
3046 IN PKSPIN_LOCK Lock
);
3051 ExInterlockedRemoveHeadList(
3052 IN PLIST_ENTRY ListHead
,
3053 IN PKSPIN_LOCK Lock
);
3058 ExIsProcessorFeaturePresent(
3059 IN ULONG ProcessorFeature
);
3064 ExIsResourceAcquiredExclusiveLite(
3065 IN PERESOURCE Resource
);
3070 ExIsResourceAcquiredSharedLite(
3071 IN PERESOURCE Resource
);
3073 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
3078 ExLocalTimeToSystemTime(
3079 IN PLARGE_INTEGER LocalTime
,
3080 OUT PLARGE_INTEGER SystemTime
);
3086 IN PCALLBACK_OBJECT CallbackObject
,
3088 IN PVOID Argument2
);
3094 IN PWORK_QUEUE_ITEM WorkItem
,
3095 IN WORK_QUEUE_TYPE QueueType
);
3102 IN NTSTATUS Status
);
3108 IN PCALLBACK_OBJECT CallbackObject
,
3109 IN PCALLBACK_FUNCTION CallbackFunction
,
3110 IN PVOID CallbackContext
);
3115 ExReinitializeResourceLite(
3116 IN PERESOURCE Resource
);
3121 ExReleaseResourceForThreadLite(
3122 IN PERESOURCE Resource
,
3123 IN ERESOURCE_THREAD ResourceThreadId
);
3128 ExReleaseResourceLite(
3129 IN PERESOURCE Resource
);
3134 ExSetResourceOwnerPointer(
3135 IN PERESOURCE Resource
,
3136 IN PVOID OwnerPointer
);
3141 ExSetTimerResolution(
3142 IN ULONG DesiredTime
,
3143 IN BOOLEAN SetResolution
);
3148 ExSystemTimeToLocalTime(
3149 IN PLARGE_INTEGER SystemTime
,
3150 OUT PLARGE_INTEGER LocalTime
);
3155 ExUnregisterCallback(
3156 IN PVOID CbRegistration
);
3159 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
3161 #if (NTDDI_VERSION >= NTDDI_WINXP)
3165 ExAcquireRundownProtection(
3166 IN OUT PEX_RUNDOWN_REF RunRef
);
3171 ExInitializeRundownProtection(
3172 OUT PEX_RUNDOWN_REF RunRef
);
3177 ExReInitializeRundownProtection(
3178 OUT PEX_RUNDOWN_REF RunRef
);
3183 ExReleaseRundownProtection(
3184 IN OUT PEX_RUNDOWN_REF RunRef
);
3190 OUT PEX_RUNDOWN_REF RunRef
);
3196 IN SUITE_TYPE SuiteType
);
3201 ExWaitForRundownProtectionRelease(
3202 IN OUT PEX_RUNDOWN_REF RunRef
);
3204 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
3206 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
3210 ExAcquireRundownProtectionEx(
3211 IN OUT PEX_RUNDOWN_REF RunRef
,
3217 ExReleaseRundownProtectionEx(
3218 IN OUT PEX_RUNDOWN_REF RunRef
,
3220 #endif // (NTDDI_VERSION >= NTDDI_WINXPSP2)
3222 #if (NTDDI_VERSION >= NTDDI_WS03)
3224 #endif // (NTDDI_VERSION >= NTDDI_WS03)
3226 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
3228 PEX_RUNDOWN_REF_CACHE_AWARE
3229 ExAllocateCacheAwareRundownProtection(
3230 IN POOL_TYPE PoolType
,
3235 ExSizeOfRundownProtectionCacheAware(VOID
);
3237 #endif // (NTDDI_VERSION >= NTDDI_WS03SP1)
3239 #if (NTDDI_VERSION >= NTDDI_VISTA)
3242 ExInitializeLookasideListEx(
3243 OUT PLOOKASIDE_LIST_EX Lookaside
,
3244 IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL
,
3245 IN PFREE_FUNCTION_EX Free OPTIONAL
,
3246 IN POOL_TYPE PoolType
,
3254 #if !defined(MIDL_PASS)
3256 static __inline PVOID
3257 ExAllocateFromNPagedLookasideList(
3258 IN PNPAGED_LOOKASIDE_LIST Lookaside
)
3262 Lookaside
->L
.TotalAllocates
++;
3263 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
3264 if (Entry
== NULL
) {
3265 Lookaside
->L
.AllocateMisses
++;
3266 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
3273 static __inline PVOID
3274 ExAllocateFromPagedLookasideList(
3275 IN PPAGED_LOOKASIDE_LIST Lookaside
)
3279 Lookaside
->L
.TotalAllocates
++;
3280 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
3281 if (Entry
== NULL
) {
3282 Lookaside
->L
.AllocateMisses
++;
3283 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
3290 static __inline VOID
3291 ExFreeToNPagedLookasideList(
3292 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
3295 Lookaside
->L
.TotalFrees
++;
3296 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
3297 Lookaside
->L
.FreeMisses
++;
3298 (Lookaside
->L
.Free
)(Entry
);
3300 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
3304 static __inline VOID
3305 ExFreeToPagedLookasideList(
3306 IN PPAGED_LOOKASIDE_LIST Lookaside
,
3309 Lookaside
->L
.TotalFrees
++;
3310 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
3311 Lookaside
->L
.FreeMisses
++;
3312 (Lookaside
->L
.Free
)(Entry
);
3314 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
3319 #endif // !defined(MIDL_PASS)