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 typedef UCHAR KPROCESSOR_MODE
;
93 typedef LONG KPRIORITY
;
94 typedef PVOID PSECURITY_DESCRIPTOR
;
95 typedef ULONG SECURITY_INFORMATION
, *PSECURITY_INFORMATION
;
97 /* Structures not exposed to drivers */
98 typedef struct _OBJECT_TYPE
*POBJECT_TYPE
;
99 typedef struct _HAL_DISPATCH_TABLE
*PHAL_DISPATCH_TABLE
;
100 typedef struct _HAL_PRIVATE_DISPATCH_TABLE
*PHAL_PRIVATE_DISPATCH_TABLE
;
101 typedef struct _DEVICE_HANDLER_OBJECT
*PDEVICE_HANDLER_OBJECT
;
102 typedef struct _BUS_HANDLER
*PBUS_HANDLER
;
104 typedef struct _ADAPTER_OBJECT
*PADAPTER_OBJECT
;
105 typedef struct _CALLBACK_OBJECT
*PCALLBACK_OBJECT
;
106 typedef struct _ETHREAD
*PETHREAD
;
107 typedef struct _EPROCESS
*PEPROCESS
;
108 typedef struct _IO_TIMER
*PIO_TIMER
;
109 typedef struct _KINTERRUPT
*PKINTERRUPT
;
110 typedef struct _KPROCESS
*PKPROCESS
;
111 typedef struct _KTHREAD
*PKTHREAD
, *PRKTHREAD
;
114 typedef struct _CONTEXT
*PCONTEXT
;
117 // Resource list definitions
119 typedef int CM_RESOURCE_TYPE
;
121 #define CmResourceTypeNull 0
122 #define CmResourceTypePort 1
123 #define CmResourceTypeInterrupt 2
124 #define CmResourceTypeMemory 3
125 #define CmResourceTypeDma 4
126 #define CmResourceTypeDeviceSpecific 5
127 #define CmResourceTypeBusNumber 6
128 #define CmResourceTypeNonArbitrated 128
129 #define CmResourceTypeConfigData 128
130 #define CmResourceTypeDevicePrivate 129
131 #define CmResourceTypePcCardConfig 130
132 #define CmResourceTypeMfCardConfig 131
134 typedef enum _INTERFACE_TYPE
{
135 InterfaceTypeUndefined
= -1,
153 } INTERFACE_TYPE
, *PINTERFACE_TYPE
;
155 /* IO_RESOURCE_DESCRIPTOR.Option */
157 #define IO_RESOURCE_PREFERRED 0x01
158 #define IO_RESOURCE_DEFAULT 0x02
159 #define IO_RESOURCE_ALTERNATIVE 0x08
161 typedef struct _IO_RESOURCE_DESCRIPTOR
{
164 UCHAR ShareDisposition
;
172 PHYSICAL_ADDRESS MinimumAddress
;
173 PHYSICAL_ADDRESS MaximumAddress
;
178 PHYSICAL_ADDRESS MinimumAddress
;
179 PHYSICAL_ADDRESS MaximumAddress
;
186 ULONG MinimumChannel
;
187 ULONG MaximumChannel
;
192 PHYSICAL_ADDRESS MinimumAddress
;
193 PHYSICAL_ADDRESS MaximumAddress
;
210 } IO_RESOURCE_DESCRIPTOR
, *PIO_RESOURCE_DESCRIPTOR
;
212 typedef struct _IO_RESOURCE_LIST
{
216 IO_RESOURCE_DESCRIPTOR Descriptors
[1];
217 } IO_RESOURCE_LIST
, *PIO_RESOURCE_LIST
;
219 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST
{
221 INTERFACE_TYPE InterfaceType
;
225 ULONG AlternativeLists
;
226 IO_RESOURCE_LIST List
[1];
227 } IO_RESOURCE_REQUIREMENTS_LIST
, *PIO_RESOURCE_REQUIREMENTS_LIST
;
232 extern ULONG NtGlobalFlag
;
235 #include <pshpack4.h>
236 typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR
{
238 UCHAR ShareDisposition
;
242 PHYSICAL_ADDRESS Start
;
246 PHYSICAL_ADDRESS Start
;
254 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
256 __GNU_EXTENSION
union {
272 PHYSICAL_ADDRESS Start
;
292 } DeviceSpecificData
;
293 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
295 PHYSICAL_ADDRESS Start
;
299 PHYSICAL_ADDRESS Start
;
303 PHYSICAL_ADDRESS Start
;
308 } CM_PARTIAL_RESOURCE_DESCRIPTOR
, *PCM_PARTIAL_RESOURCE_DESCRIPTOR
;
312 // Section map options
314 typedef enum _SECTION_INHERIT
{
320 // Section access rights
322 #define SECTION_QUERY 0x0001
323 #define SECTION_MAP_WRITE 0x0002
324 #define SECTION_MAP_READ 0x0004
325 #define SECTION_MAP_EXECUTE 0x0008
326 #define SECTION_EXTEND_SIZE 0x0010
327 #define SECTION_MAP_EXECUTE_EXPLICIT 0x0020
329 #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
330 SECTION_MAP_WRITE | \
332 SECTION_MAP_EXECUTE | \
335 #define SESSION_QUERY_ACCESS 0x0001
336 #define SESSION_MODIFY_ACCESS 0x0002
338 #define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
339 SESSION_QUERY_ACCESS | \
340 SESSION_MODIFY_ACCESS)
344 #define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
346 #define PAGE_NOACCESS 0x01
347 #define PAGE_READONLY 0x02
348 #define PAGE_READWRITE 0x04
349 #define PAGE_WRITECOPY 0x08
350 #define PAGE_EXECUTE 0x10
351 #define PAGE_EXECUTE_READ 0x20
352 #define PAGE_EXECUTE_READWRITE 0x40
353 #define PAGE_EXECUTE_WRITECOPY 0x80
354 #define PAGE_GUARD 0x100
355 #define PAGE_NOCACHE 0x200
356 #define PAGE_WRITECOMBINE 0x400
358 #define MEM_COMMIT 0x1000
359 #define MEM_RESERVE 0x2000
360 #define MEM_DECOMMIT 0x4000
361 #define MEM_RELEASE 0x8000
362 #define MEM_FREE 0x10000
363 #define MEM_PRIVATE 0x20000
364 #define MEM_MAPPED 0x40000
365 #define MEM_RESET 0x80000
366 #define MEM_TOP_DOWN 0x100000
367 #define MEM_LARGE_PAGES 0x20000000
368 #define MEM_4MB_PAGES 0x80000000
370 #define SEC_RESERVE 0x4000000
371 #define SEC_LARGE_PAGES 0x80000000
373 #define PROCESS_DUP_HANDLE (0x0040)
375 #if (NTDDI_VERSION >= NTDDI_VISTA)
376 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
379 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
386 // Processor features
388 #define PF_FLOATING_POINT_PRECISION_ERRATA 0
389 #define PF_FLOATING_POINT_EMULATED 1
390 #define PF_COMPARE_EXCHANGE_DOUBLE 2
391 #define PF_MMX_INSTRUCTIONS_AVAILABLE 3
392 #define PF_PPC_MOVEMEM_64BIT_OK 4
393 #define PF_ALPHA_BYTE_INSTRUCTIONS 5
394 #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
395 #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
396 #define PF_RDTSC_INSTRUCTION_AVAILABLE 8
397 #define PF_PAE_ENABLED 9
398 #define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
399 #define PF_SSE_DAZ_MODE_AVAILABLE 11
400 #define PF_NX_ENABLED 12
401 #define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
402 #define PF_COMPARE_EXCHANGE128 14
403 #define PF_COMPARE64_EXCHANGE128 15
404 #define PF_CHANNELS_ENABLED 16
409 // Intrinsics (note: taken from our winnt.h)
412 #if defined(__GNUC__)
414 static __inline__ BOOLEAN
415 InterlockedBitTestAndSet(IN LONG
volatile *Base
,
420 __asm__
__volatile__("lock "
423 :"=r" (OldBit
),"+m" (*Base
)
428 return (_InterlockedOr(Base
, 1 << Bit
) >> Bit
) & 1;
432 static __inline__ BOOLEAN
433 InterlockedBitTestAndReset(IN LONG
volatile *Base
,
438 __asm__
__volatile__("lock "
441 :"=r" (OldBit
),"+m" (*Base
)
446 return (_InterlockedAnd(Base
, ~(1 << Bit
)) >> Bit
) & 1;
452 #define BitScanForward _BitScanForward
453 #define BitScanReverse _BitScanReverse
455 #define BitTest _bittest
456 #define BitTestAndComplement _bittestandcomplement
457 #define BitTestAndSet _bittestandset
458 #define BitTestAndReset _bittestandreset
459 #define InterlockedBitTestAndSet _interlockedbittestandset
460 #define InterlockedBitTestAndReset _interlockedbittestandreset
463 /** INTERLOCKED FUNCTIONS *****************************************************/
465 #if !defined(__INTERLOCKED_DECLARED)
466 #define __INTERLOCKED_DECLARED
469 #if defined(NO_INTERLOCKED_INTRINSICS)
473 InterlockedIncrement(
474 IN OUT LONG
volatile *Addend
);
479 InterlockedDecrement(
480 IN OUT LONG
volatile *Addend
);
485 InterlockedCompareExchange(
486 IN OUT LONG
volatile *Destination
,
494 IN OUT LONG
volatile *Destination
,
500 InterlockedExchangeAdd(
501 IN OUT LONG
volatile *Addend
,
504 #else // !defined(NO_INTERLOCKED_INTRINSICS)
506 #define InterlockedExchange _InterlockedExchange
507 #define InterlockedIncrement _InterlockedIncrement
508 #define InterlockedDecrement _InterlockedDecrement
509 #define InterlockedExchangeAdd _InterlockedExchangeAdd
510 #define InterlockedCompareExchange _InterlockedCompareExchange
511 #define InterlockedOr _InterlockedOr
512 #define InterlockedAnd _InterlockedAnd
513 #define InterlockedXor _InterlockedXor
515 #endif // !defined(NO_INTERLOCKED_INTRINSICS)
517 #endif // defined (_X86_)
519 #if !defined (_WIN64)
522 * InterlockedExchangePointer(
523 * IN OUT PVOID volatile *Target,
526 #define InterlockedExchangePointer(Target, Value) \
527 ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
531 * InterlockedCompareExchangePointer(
532 * IN OUT PVOID *Destination,
534 * IN PVOID Comparand)
536 #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
537 ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
539 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
540 #define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
541 #define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
543 #endif // !defined (_WIN64)
545 #if defined (_M_AMD64)
547 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONGLONG *)a, (LONGLONG)b)
548 #define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONGLONG *)a)
549 #define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONGLONG *)a)
550 #define InterlockedAnd _InterlockedAnd
551 #define InterlockedOr _InterlockedOr
552 #define InterlockedXor _InterlockedXor
553 #define InterlockedIncrement _InterlockedIncrement
554 #define InterlockedDecrement _InterlockedDecrement
555 #define InterlockedAdd _InterlockedAdd
556 #define InterlockedExchange _InterlockedExchange
557 #define InterlockedExchangeAdd _InterlockedExchangeAdd
558 #define InterlockedCompareExchange _InterlockedCompareExchange
559 #define InterlockedAnd64 _InterlockedAnd64
560 #define InterlockedOr64 _InterlockedOr64
561 #define InterlockedXor64 _InterlockedXor64
562 #define InterlockedIncrement64 _InterlockedIncrement64
563 #define InterlockedDecrement64 _InterlockedDecrement64
564 #define InterlockedAdd64 _InterlockedAdd64
565 #define InterlockedExchange64 _InterlockedExchange64
566 #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
567 #define InterlockedCompareExchange64 _InterlockedCompareExchange64
568 #define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
569 #define InterlockedExchangePointer _InterlockedExchangePointer
570 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
571 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
575 #if defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
576 //#if !defined(_X86AMD64_) // FIXME: what's _X86AMD64_ used for?
580 IN OUT LONG64
volatile *Addend
,
583 return InterlockedExchangeAdd64(Addend
, Value
) + Value
;
588 #endif /* !__INTERLOCKED_DECLARED */
591 #define YieldProcessor _mm_pause
592 #elif defined (_M_AMD64)
593 #define YieldProcessor _mm_pause
594 #elif defined(_M_PPC)
595 #define YieldProcessor() __asm__ __volatile__("nop");
596 #elif defined(_M_MIPS)
597 #define YieldProcessor() __asm__ __volatile__("nop");
598 #elif defined(_M_ARM)
599 #define YieldProcessor()
601 #error Unknown architecture
609 #ifndef _SLIST_HEADER_
610 #define _SLIST_HEADER_
613 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY
*PSLIST_ENTRY
;
614 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY
{
617 typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER
{
624 ULONGLONG Sequence
:9;
625 ULONGLONG NextEntry
:39;
626 ULONGLONG HeaderType
:1;
628 ULONGLONG Reserved
:59;
633 ULONGLONG Sequence
:48;
634 ULONGLONG HeaderType
:1;
636 ULONGLONG Reserved
:2;
637 ULONGLONG NextEntry
:60;
639 } SLIST_HEADER
, *PSLIST_HEADER
;
641 #define SLIST_ENTRY SINGLE_LIST_ENTRY
642 #define _SLIST_ENTRY _SINGLE_LIST_ENTRY
643 #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
644 typedef union _SLIST_HEADER
{
651 } SLIST_HEADER
, *PSLIST_HEADER
;
654 #endif /* _SLIST_HEADER_ */
659 // Power States/Levels
661 typedef enum _SYSTEM_POWER_STATE
{
662 PowerSystemUnspecified
,
664 PowerSystemSleeping1
,
665 PowerSystemSleeping2
,
666 PowerSystemSleeping3
,
667 PowerSystemHibernate
,
670 } SYSTEM_POWER_STATE
, *PSYSTEM_POWER_STATE
;
672 #define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
674 typedef enum _POWER_INFORMATION_LEVEL
{
677 VerifySystemPolicyAc
,
678 VerifySystemPolicyDc
,
679 SystemPowerCapabilities
,
681 SystemPowerStateHandler
,
682 ProcessorStateHandler
,
683 SystemPowerPolicyCurrent
,
684 AdministratorPowerPolicy
,
685 SystemReserveHiberFile
,
686 ProcessorInformation
,
687 SystemPowerInformation
,
688 ProcessorStateHandler2
,
691 SystemExecutionState
,
692 SystemPowerStateNotifyHandler
,
693 ProcessorPowerPolicyAc
,
694 ProcessorPowerPolicyDc
,
695 VerifyProcessorPowerPolicyAc
,
696 VerifyProcessorPowerPolicyDc
,
697 ProcessorPowerPolicyCurrent
698 } POWER_INFORMATION_LEVEL
;
704 PowerActionHibernate
,
706 PowerActionShutdownReset
,
707 PowerActionShutdownOff
,
709 } POWER_ACTION
, *PPOWER_ACTION
;
711 typedef enum _DEVICE_POWER_STATE
{
712 PowerDeviceUnspecified
,
718 } DEVICE_POWER_STATE
, *PDEVICE_POWER_STATE
;
720 #define ES_SYSTEM_REQUIRED 0x00000001
721 #define ES_DISPLAY_REQUIRED 0x00000002
722 #define ES_USER_PRESENT 0x00000004
723 #define ES_CONTINUOUS 0x80000000
725 typedef ULONG EXECUTION_STATE
;
735 // Access/Security Stuff
737 typedef ULONG ACCESS_MASK
, *PACCESS_MASK
;
738 typedef PVOID PACCESS_TOKEN
;
740 #define DELETE 0x00010000L
741 #define READ_CONTROL 0x00020000L
742 #define WRITE_DAC 0x00040000L
743 #define WRITE_OWNER 0x00080000L
744 #define SYNCHRONIZE 0x00100000L
745 #define STANDARD_RIGHTS_REQUIRED 0x000F0000L
746 #define STANDARD_RIGHTS_READ READ_CONTROL
747 #define STANDARD_RIGHTS_WRITE READ_CONTROL
748 #define STANDARD_RIGHTS_EXECUTE READ_CONTROL
749 #define STANDARD_RIGHTS_ALL 0x001F0000L
750 #define SPECIFIC_RIGHTS_ALL 0x0000FFFFL
751 #define ACCESS_SYSTEM_SECURITY 0x01000000L
752 #define MAXIMUM_ALLOWED 0x02000000L
753 #define GENERIC_READ 0x80000000L
754 #define GENERIC_WRITE 0x40000000L
755 #define GENERIC_EXECUTE 0x20000000L
756 #define GENERIC_ALL 0x10000000L
758 typedef struct _GENERIC_MAPPING
{
759 ACCESS_MASK GenericRead
;
760 ACCESS_MASK GenericWrite
;
761 ACCESS_MASK GenericExecute
;
762 ACCESS_MASK GenericAll
;
763 } GENERIC_MAPPING
, *PGENERIC_MAPPING
;
765 #define ACL_REVISION 2
766 #define ACL_REVISION_DS 4
768 #define ACL_REVISION1 1
769 #define ACL_REVISION2 2
770 #define ACL_REVISION3 3
771 #define ACL_REVISION4 4
772 #define MIN_ACL_REVISION ACL_REVISION2
773 #define MAX_ACL_REVISION ACL_REVISION4
775 typedef struct _ACL
{
786 // Current security descriptor revision value
788 #define SECURITY_DESCRIPTOR_REVISION (1)
789 #define SECURITY_DESCRIPTOR_REVISION1 (1)
792 // Privilege attributes
794 #define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
795 #define SE_PRIVILEGE_ENABLED (0x00000002L)
796 #define SE_PRIVILEGE_REMOVED (0X00000004L)
797 #define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
799 #define SE_PRIVILEGE_VALID_ATTRIBUTES (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
800 SE_PRIVILEGE_ENABLED | \
801 SE_PRIVILEGE_REMOVED | \
802 SE_PRIVILEGE_USED_FOR_ACCESS)
804 #include <pshpack4.h>
805 typedef struct _LUID_AND_ATTRIBUTES
{
808 } LUID_AND_ATTRIBUTES
, *PLUID_AND_ATTRIBUTES
;
810 typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY
[ANYSIZE_ARRAY
];
811 typedef LUID_AND_ATTRIBUTES_ARRAY
*PLUID_AND_ATTRIBUTES_ARRAY
;
818 #define PRIVILEGE_SET_ALL_NECESSARY (1)
820 typedef struct _PRIVILEGE_SET
{
821 ULONG PrivilegeCount
;
823 LUID_AND_ATTRIBUTES Privilege
[ANYSIZE_ARRAY
];
824 } PRIVILEGE_SET
,*PPRIVILEGE_SET
;
826 typedef enum _SECURITY_IMPERSONATION_LEVEL
{
828 SecurityIdentification
,
829 SecurityImpersonation
,
831 } SECURITY_IMPERSONATION_LEVEL
, * PSECURITY_IMPERSONATION_LEVEL
;
833 #define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
834 #define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
835 #define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
836 #define VALID_IMPERSONATION_LEVEL(Level) (((Level) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((Level) <= SECURITY_MAX_IMPERSONATION_LEVEL))
838 #define SECURITY_DYNAMIC_TRACKING (TRUE)
839 #define SECURITY_STATIC_TRACKING (FALSE)
841 typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE
, *PSECURITY_CONTEXT_TRACKING_MODE
;
843 typedef struct _SECURITY_QUALITY_OF_SERVICE
{
845 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
;
846 SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode
;
847 BOOLEAN EffectiveOnly
;
848 } SECURITY_QUALITY_OF_SERVICE
, *PSECURITY_QUALITY_OF_SERVICE
;
850 typedef struct _SE_IMPERSONATION_STATE
{
853 BOOLEAN EffectiveOnly
;
854 SECURITY_IMPERSONATION_LEVEL Level
;
855 } SE_IMPERSONATION_STATE
, *PSE_IMPERSONATION_STATE
;
857 #define OWNER_SECURITY_INFORMATION (0x00000001L)
858 #define GROUP_SECURITY_INFORMATION (0x00000002L)
859 #define DACL_SECURITY_INFORMATION (0x00000004L)
860 #define SACL_SECURITY_INFORMATION (0x00000008L)
861 #define LABEL_SECURITY_INFORMATION (0x00000010L)
863 #define PROTECTED_DACL_SECURITY_INFORMATION (0x80000000L)
864 #define PROTECTED_SACL_SECURITY_INFORMATION (0x40000000L)
865 #define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L)
866 #define UNPROTECTED_SACL_SECURITY_INFORMATION (0x10000000L)
871 // Registry Access Rights
873 #define KEY_QUERY_VALUE (0x0001)
874 #define KEY_SET_VALUE (0x0002)
875 #define KEY_CREATE_SUB_KEY (0x0004)
876 #define KEY_ENUMERATE_SUB_KEYS (0x0008)
877 #define KEY_NOTIFY (0x0010)
878 #define KEY_CREATE_LINK (0x0020)
879 #define KEY_WOW64_32KEY (0x0200)
880 #define KEY_WOW64_64KEY (0x0100)
881 #define KEY_WOW64_RES (0x0300)
883 #define KEY_READ ((STANDARD_RIGHTS_READ |\
885 KEY_ENUMERATE_SUB_KEYS |\
890 #define KEY_WRITE ((STANDARD_RIGHTS_WRITE |\
892 KEY_CREATE_SUB_KEY) \
896 #define KEY_EXECUTE ((KEY_READ) \
900 #define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL |\
903 KEY_CREATE_SUB_KEY |\
904 KEY_ENUMERATE_SUB_KEYS |\
911 // Registry Open/Create Options
913 #define REG_OPTION_RESERVED (0x00000000L)
914 #define REG_OPTION_NON_VOLATILE (0x00000000L)
915 #define REG_OPTION_VOLATILE (0x00000001L)
916 #define REG_OPTION_CREATE_LINK (0x00000002L)
917 #define REG_OPTION_BACKUP_RESTORE (0x00000004L)
918 #define REG_OPTION_OPEN_LINK (0x00000008L)
920 #define REG_LEGAL_OPTION \
921 (REG_OPTION_RESERVED |\
922 REG_OPTION_NON_VOLATILE |\
923 REG_OPTION_VOLATILE |\
924 REG_OPTION_CREATE_LINK |\
925 REG_OPTION_BACKUP_RESTORE |\
926 REG_OPTION_OPEN_LINK)
929 // Key creation/open disposition
931 #define REG_CREATED_NEW_KEY (0x00000001L)
932 #define REG_OPENED_EXISTING_KEY (0x00000002L)
935 // Key restore & hive load flags
937 #define REG_WHOLE_HIVE_VOLATILE (0x00000001L)
938 #define REG_REFRESH_HIVE (0x00000002L)
939 #define REG_NO_LAZY_FLUSH (0x00000004L)
940 #define REG_FORCE_RESTORE (0x00000008L)
941 #define REG_APP_HIVE (0x00000010L)
942 #define REG_PROCESS_PRIVATE (0x00000020L)
943 #define REG_START_JOURNAL (0x00000040L)
944 #define REG_HIVE_EXACT_FILE_GROWTH (0x00000080L)
945 #define REG_HIVE_NO_RM (0x00000100L)
946 #define REG_HIVE_SINGLE_LOG (0x00000200L)
951 #define REG_FORCE_UNLOAD 1
954 // Notify Filter Values
956 #define REG_NOTIFY_CHANGE_NAME (0x00000001L)
957 #define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L)
958 #define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L)
959 #define REG_NOTIFY_CHANGE_SECURITY (0x00000008L)
961 #define REG_LEGAL_CHANGE_FILTER \
962 (REG_NOTIFY_CHANGE_NAME |\
963 REG_NOTIFY_CHANGE_ATTRIBUTES |\
964 REG_NOTIFY_CHANGE_LAST_SET |\
965 REG_NOTIFY_CHANGE_SECURITY)
970 // Thread Access Rights
972 #define THREAD_TERMINATE (0x0001)
973 #define THREAD_SUSPEND_RESUME (0x0002)
974 #define THREAD_ALERT (0x0004)
975 #define THREAD_GET_CONTEXT (0x0008)
976 #define THREAD_SET_CONTEXT (0x0010)
977 #define THREAD_SET_INFORMATION (0x0020)
978 #define THREAD_SET_LIMITED_INFORMATION (0x0400)
979 #define THREAD_QUERY_LIMITED_INFORMATION (0x0800)
980 #if (NTDDI_VERSION >= NTDDI_VISTA)
981 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
984 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
989 // Service Start Types
991 #define SERVICE_BOOT_START 0x00000000
992 #define SERVICE_SYSTEM_START 0x00000001
993 #define SERVICE_AUTO_START 0x00000002
994 #define SERVICE_DEMAND_START 0x00000003
995 #define SERVICE_DISABLED 0x00000004
1000 #define EXCEPTION_NONCONTINUABLE 1
1001 #define EXCEPTION_MAXIMUM_PARAMETERS 15
1003 typedef struct _EXCEPTION_RECORD
{
1004 NTSTATUS ExceptionCode
;
1005 ULONG ExceptionFlags
;
1006 struct _EXCEPTION_RECORD
*ExceptionRecord
;
1007 PVOID ExceptionAddress
;
1008 ULONG NumberParameters
;
1009 ULONG_PTR ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
1010 } EXCEPTION_RECORD
, *PEXCEPTION_RECORD
;
1012 typedef struct _EXCEPTION_RECORD32
{
1013 NTSTATUS ExceptionCode
;
1014 ULONG ExceptionFlags
;
1015 ULONG ExceptionRecord
;
1016 ULONG ExceptionAddress
;
1017 ULONG NumberParameters
;
1018 ULONG ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
1019 } EXCEPTION_RECORD32
, *PEXCEPTION_RECORD32
;
1021 typedef struct _EXCEPTION_RECORD64
{
1022 NTSTATUS ExceptionCode
;
1023 ULONG ExceptionFlags
;
1024 ULONG64 ExceptionRecord
;
1025 ULONG64 ExceptionAddress
;
1026 ULONG NumberParameters
;
1027 ULONG __unusedAlignment
;
1028 ULONG64 ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
1029 } EXCEPTION_RECORD64
, *PEXCEPTION_RECORD64
;
1031 typedef struct _EXCEPTION_POINTERS
{
1032 PEXCEPTION_RECORD ExceptionRecord
;
1033 PCONTEXT ContextRecord
;
1034 } EXCEPTION_POINTERS
, *PEXCEPTION_POINTERS
;
1041 typedef struct _QUOTA_LIMITS
{
1042 SIZE_T PagedPoolLimit
;
1043 SIZE_T NonPagedPoolLimit
;
1044 SIZE_T MinimumWorkingSetSize
;
1045 SIZE_T MaximumWorkingSetSize
;
1046 SIZE_T PagefileLimit
;
1047 LARGE_INTEGER TimeLimit
;
1048 } QUOTA_LIMITS
, *PQUOTA_LIMITS
;
1050 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
1051 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
1052 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
1053 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
1054 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
1057 /******************************************************************************
1058 * WINBASE Functions *
1059 ******************************************************************************/
1060 #if !defined(_WINBASE_)
1064 #define InterlockedPopEntrySList(Head) \
1065 ExpInterlockedPopEntrySList(Head)
1067 #define InterlockedPushEntrySList(Head, Entry) \
1068 ExpInterlockedPushEntrySList(Head, Entry)
1070 #define InterlockedFlushSList(Head) \
1071 ExpInterlockedFlushSList(Head)
1073 #define QueryDepthSList(Head) \
1074 ExQueryDepthSList(Head)
1076 #else // !defined(_WIN64)
1081 InterlockedPopEntrySList(
1082 IN PSLIST_HEADER ListHead
);
1087 InterlockedPushEntrySList(
1088 IN PSLIST_HEADER ListHead
,
1089 IN PSLIST_ENTRY ListEntry
);
1091 #define InterlockedFlushSList(ListHead) \
1092 ExInterlockedFlushSList(ListHead)
1094 #define QueryDepthSList(Head) \
1095 ExQueryDepthSList(Head)
1097 #endif // !defined(_WIN64)
1099 #endif // !defined(_WINBASE_)
1102 /******************************************************************************
1104 ******************************************************************************/
1106 typedef struct _DISPATCHER_HEADER
1108 __GNU_EXTENSION
union
1110 __GNU_EXTENSION
struct
1113 __GNU_EXTENSION
union
1118 __GNU_EXTENSION
union
1123 __GNU_EXTENSION
union
1126 BOOLEAN DebugActive
;
1132 LIST_ENTRY WaitListHead
;
1133 } DISPATCHER_HEADER
, *PDISPATCHER_HEADER
;
1135 typedef ULONG_PTR KSPIN_LOCK
, *PKSPIN_LOCK
;
1137 typedef struct _KEVENT
{
1138 DISPATCHER_HEADER Header
;
1139 } KEVENT
, *PKEVENT
, *RESTRICTED_POINTER PRKEVENT
;
1141 typedef struct _KSEMAPHORE
{
1142 DISPATCHER_HEADER Header
;
1144 } KSEMAPHORE
, *PKSEMAPHORE
, *RESTRICTED_POINTER PRKSEMAPHORE
;
1146 /******************************************************************************
1148 ******************************************************************************/
1150 #define RTL_REGISTRY_ABSOLUTE 0
1151 #define RTL_REGISTRY_SERVICES 1
1152 #define RTL_REGISTRY_CONTROL 2
1153 #define RTL_REGISTRY_WINDOWS_NT 3
1154 #define RTL_REGISTRY_DEVICEMAP 4
1155 #define RTL_REGISTRY_USER 5
1156 #define RTL_REGISTRY_MAXIMUM 6
1157 #define RTL_REGISTRY_HANDLE 0x40000000
1158 #define RTL_REGISTRY_OPTIONAL 0x80000000
1160 /* RTL_QUERY_REGISTRY_TABLE.Flags */
1161 #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001
1162 #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002
1163 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004
1164 #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008
1165 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010
1166 #define RTL_QUERY_REGISTRY_DIRECT 0x00000020
1167 #define RTL_QUERY_REGISTRY_DELETE 0x00000040
1169 typedef struct _RTL_BITMAP
{
1172 } RTL_BITMAP
, *PRTL_BITMAP
;
1174 typedef struct _RTL_BITMAP_RUN
{
1175 ULONG StartingIndex
;
1177 } RTL_BITMAP_RUN
, *PRTL_BITMAP_RUN
;
1180 (DDKAPI
*PRTL_QUERY_REGISTRY_ROUTINE
)(
1184 IN ULONG ValueLength
,
1186 IN PVOID EntryContext
);
1188 typedef struct _RTL_QUERY_REGISTRY_TABLE
{
1189 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine
;
1195 ULONG DefaultLength
;
1196 } RTL_QUERY_REGISTRY_TABLE
, *PRTL_QUERY_REGISTRY_TABLE
;
1198 typedef struct _TIME_FIELDS
{
1205 CSHORT Milliseconds
;
1207 } TIME_FIELDS
, *PTIME_FIELDS
;
1210 /******************************************************************************
1212 ******************************************************************************/
1218 IN PVOID FailedAssertion
,
1220 IN ULONG LineNumber
,
1225 * IN VOID UNALIGNED *Destination,
1226 * IN CONST VOID UNALIGNED *Source,
1229 #define RtlCopyMemory(Destination, Source, Length) \
1230 memcpy(Destination, Source, Length)
1232 #define RtlCopyBytes RtlCopyMemory
1234 #if defined(_M_AMD64)
1238 RtlCopyMemoryNonTemporal(
1239 VOID UNALIGNED
*Destination
,
1240 CONST VOID UNALIGNED
*Source
,
1243 #define RtlCopyMemoryNonTemporal RtlCopyMemory
1251 #define RtlEqualLuid(Luid1, Luid2) \
1252 (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
1256 * IN VOID UNALIGNED *Destination,
1257 * IN CONST VOID UNALIGNED *Source,
1260 #define RtlEqualMemory(Destination, Source, Length) \
1261 (!memcmp(Destination, Source, Length))
1265 * IN VOID UNALIGNED *Destination,
1269 #define RtlFillMemory(Destination, Length, Fill) \
1270 memset(Destination, Fill, Length)
1272 #define RtlFillBytes RtlFillMemory
1277 RtlFreeUnicodeString(
1278 IN PUNICODE_STRING UnicodeString
);
1284 IN PUNICODE_STRING GuidString
,
1290 RtlInitUnicodeString(
1291 IN OUT PUNICODE_STRING DestinationString
,
1292 IN PCWSTR SourceString
);
1296 * IN VOID UNALIGNED *Destination,
1297 * IN CONST VOID UNALIGNED *Source,
1300 #define RtlMoveMemory(Destination, Source, Length) \
1301 memmove(Destination, Source, Length)
1308 OUT PUNICODE_STRING GuidString
);
1312 * IN VOID UNALIGNED *Destination,
1315 #define RtlZeroMemory(Destination, Length) \
1316 memset(Destination, 0, Length)
1318 #define RtlZeroBytes RtlZeroMemory
1321 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1326 IN PRTL_BITMAP BitMapHeader
,
1327 IN ULONG StartingIndex
,
1334 IN PRTL_BITMAP BitMapHeader
,
1335 IN ULONG StartingIndex
,
1341 RtlAnsiStringToUnicodeString(
1342 IN OUT PUNICODE_STRING DestinationString
,
1343 IN PANSI_STRING SourceString
,
1344 IN BOOLEAN AllocateDestinationString
);
1349 RtlxAnsiStringToUnicodeSize(
1350 IN PCANSI_STRING AnsiString
);
1352 #define RtlAnsiStringToUnicodeSize(String) ( \
1353 NLS_MB_CODE_PAGE_TAG ? \
1354 RtlxAnsiStringToUnicodeSize(String) : \
1355 ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
1361 RtlAppendUnicodeStringToString(
1362 IN OUT PUNICODE_STRING Destination
,
1363 IN PCUNICODE_STRING Source
);
1368 RtlAppendUnicodeToString(
1369 IN OUT PUNICODE_STRING Destination
,
1375 RtlCheckRegistryKey(
1376 IN ULONG RelativeTo
,
1383 IN PRTL_BITMAP BitMapHeader
);
1389 IN PRTL_BITMAP BitMapHeader
,
1390 IN ULONG StartingIndex
,
1391 IN ULONG NumberToClear
);
1397 IN CONST VOID
*Source1
,
1398 IN CONST VOID
*Source2
,
1404 RtlCompareUnicodeString(
1405 IN PCUNICODE_STRING String1
,
1406 IN PCUNICODE_STRING String2
,
1407 IN BOOLEAN CaseInSensitive
);
1412 RtlCompareUnicodeStrings(
1414 IN SIZE_T String1Length
,
1416 IN SIZE_T String2Length
,
1417 IN BOOLEAN CaseInSensitive
);
1422 RtlCopyUnicodeString(
1423 IN OUT PUNICODE_STRING DestinationString
,
1424 IN PCUNICODE_STRING SourceString
);
1429 RtlCreateRegistryKey(
1430 IN ULONG RelativeTo
,
1436 RtlCreateSecurityDescriptor(
1437 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
1443 RtlDeleteRegistryValue(
1444 IN ULONG RelativeTo
,
1446 IN PCWSTR ValueName
);
1451 RtlEqualUnicodeString(
1452 IN CONST UNICODE_STRING
*String1
,
1453 IN CONST UNICODE_STRING
*String2
,
1454 IN BOOLEAN CaseInSensitive
);
1456 #if !defined(_AMD64_) && !defined(_IA64_)
1460 RtlExtendedIntegerMultiply(
1461 IN LARGE_INTEGER Multiplicand
,
1462 IN LONG Multiplier
);
1467 RtlExtendedLargeIntegerDivide(
1468 IN LARGE_INTEGER Dividend
,
1470 IN OUT PULONG Remainder
);
1473 #if defined(_X86_) || defined(_IA64_)
1477 RtlExtendedMagicDivide(
1478 IN LARGE_INTEGER Dividend
,
1479 IN LARGE_INTEGER MagicDivisor
,
1480 IN CCHAR ShiftCount
);
1487 IN PANSI_STRING AnsiString
);
1493 IN PRTL_BITMAP BitMapHeader
,
1494 IN ULONG NumberToFind
,
1495 IN ULONG HintIndex
);
1500 RtlFindClearBitsAndSet(
1501 IN PRTL_BITMAP BitMapHeader
,
1502 IN ULONG NumberToFind
,
1503 IN ULONG HintIndex
);
1508 RtlFindFirstRunClear(
1509 IN PRTL_BITMAP BitMapHeader
,
1510 OUT PULONG StartingIndex
);
1516 IN PRTL_BITMAP BitMapHeader
,
1517 OUT PRTL_BITMAP_RUN RunArray
,
1518 IN ULONG SizeOfRunArray
,
1519 IN BOOLEAN LocateLongestRuns
);
1524 RtlFindLastBackwardRunClear(
1525 IN PRTL_BITMAP BitMapHeader
,
1527 OUT PULONG StartingRunIndex
);
1532 RtlFindLeastSignificantBit(
1538 RtlFindLongestRunClear(
1539 IN PRTL_BITMAP BitMapHeader
,
1540 OUT PULONG StartingIndex
);
1545 RtlFindMostSignificantBit(
1551 RtlFindNextForwardRunClear(
1552 IN PRTL_BITMAP BitMapHeader
,
1554 OUT PULONG StartingRunIndex
);
1560 IN PRTL_BITMAP BitMapHeader
,
1561 IN ULONG NumberToFind
,
1562 IN ULONG HintIndex
);
1567 RtlFindSetBitsAndClear(
1568 IN PRTL_BITMAP BitMapHeader
,
1569 IN ULONG NumberToFind
,
1570 IN ULONG HintIndex
);
1575 RtlHashUnicodeString(
1576 IN CONST UNICODE_STRING
*String
,
1577 IN BOOLEAN CaseInSensitive
,
1578 IN ULONG HashAlgorithm
,
1579 OUT PULONG HashValue
);
1585 IN OUT PANSI_STRING DestinationString
,
1586 IN PCSZ SourceString
);
1591 RtlInitializeBitMap(
1592 IN PRTL_BITMAP BitMapHeader
,
1593 IN PULONG BitMapBuffer
,
1594 IN ULONG SizeOfBitMap
);
1600 IN OUT PSTRING DestinationString
,
1601 IN PCSZ SourceString
);
1606 RtlIntegerToUnicodeString(
1608 IN ULONG Base OPTIONAL
,
1609 IN OUT PUNICODE_STRING String
);
1614 RtlInt64ToUnicodeString(
1616 IN ULONG Base OPTIONAL
,
1617 IN OUT PUNICODE_STRING String
);
1620 #define RtlIntPtrToUnicodeString(Value, Base, String) \
1621 RtlInt64ToUnicodeString(Value, Base, String)
1623 #define RtlIntPtrToUnicodeString(Value, Base, String) \
1624 RtlIntegerToUnicodeString(Value, Base, String)
1631 #define RtlIsZeroLuid(_L1) \
1632 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
1637 RtlLengthSecurityDescriptor(
1638 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
1643 RtlNumberOfClearBits(
1644 IN PRTL_BITMAP BitMapHeader
);
1650 IN PRTL_BITMAP BitMapHeader
);
1655 RtlQueryRegistryValues(
1656 IN ULONG RelativeTo
,
1658 IN PRTL_QUERY_REGISTRY_TABLE QueryTable
,
1660 IN PVOID Environment OPTIONAL
);
1662 #define LONG_SIZE (sizeof(LONG))
1663 #define LONG_MASK (LONG_SIZE - 1)
1667 * PULONG DestinationAddress,
1668 * PULONG SourceAddress);
1670 #if defined(_AMD64_)
1671 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
1672 *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
1674 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
1675 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
1677 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
1678 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
1679 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
1680 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
1684 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
1689 * RtlRetrieveUshort(
1690 * PUSHORT DestinationAddress,
1691 * PUSHORT SourceAddress);
1693 #if defined(_AMD64_)
1694 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
1695 *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
1697 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
1698 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
1700 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
1701 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
1705 *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
1713 IN PRTL_BITMAP BitMapHeader
);
1719 IN PRTL_BITMAP BitMapHeader
,
1720 IN ULONG StartingIndex
,
1721 IN ULONG NumberToSet
);
1726 RtlSetDaclSecurityDescriptor(
1727 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
1728 IN BOOLEAN DaclPresent
,
1729 IN PACL Dacl OPTIONAL
,
1730 IN BOOLEAN DaclDefaulted OPTIONAL
);
1734 * IN PULONG Address,
1737 #if defined(_AMD64_)
1738 #define RtlStoreUlong(Address,Value) \
1739 *(ULONG UNALIGNED *)(Address) = (Value)
1741 #define RtlStoreUlong(Address,Value) \
1742 if ((ULONG_PTR)(Address) & LONG_MASK) { \
1743 ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
1744 ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
1745 ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
1746 ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT] = (UCHAR)(FOURTHBYTE(Value)); \
1749 *((PULONG)(Address)) = (ULONG) (Value); \
1754 * RtlStoreUlonglong(
1755 * IN OUT PULONGLONG Address,
1758 #if defined(_AMD64_)
1759 #define RtlStoreUlonglong(Address,Value) \
1760 *(ULONGLONG UNALIGNED *)(Address) = (Value)
1762 #define RtlStoreUlonglong(Address,Value) \
1763 if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
1764 RtlStoreUlong((ULONG_PTR)(Address), \
1765 (ULONGLONG)(Value) & 0xFFFFFFFF); \
1766 RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
1767 (ULONGLONG)(Value) >> 32); \
1769 *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
1775 * IN OUT PULONG_PTR Address,
1776 * IN ULONG_PTR Value);
1779 #define RtlStoreUlongPtr(Address,Value) \
1780 RtlStoreUlonglong(Address,Value)
1782 #define RtlStoreUlongPtr(Address,Value) \
1783 RtlStoreUlong(Address,Value)
1788 * IN PUSHORT Address,
1791 #if defined(_AMD64_)
1792 #define RtlStoreUshort(Address,Value) \
1793 *(USHORT UNALIGNED *)(Address) = (Value)
1795 #define RtlStoreUshort(Address,Value) \
1796 if ((ULONG_PTR)(Address) & SHORT_MASK) { \
1797 ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
1798 ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
1801 *((PUSHORT) (Address)) = (USHORT)Value; \
1808 RtlTimeFieldsToTime(
1809 IN PTIME_FIELDS TimeFields
,
1810 IN PLARGE_INTEGER Time
);
1815 RtlTimeToTimeFields(
1816 IN PLARGE_INTEGER Time
,
1817 IN PTIME_FIELDS TimeFields
);
1828 RtlUlonglongByteSwap(
1829 IN ULONGLONG Source
);
1834 RtlUnicodeStringToAnsiString(
1835 IN OUT PANSI_STRING DestinationString
,
1836 IN PCUNICODE_STRING SourceString
,
1837 IN BOOLEAN AllocateDestinationString
);
1842 RtlxUnicodeStringToAnsiSize(
1843 IN PCUNICODE_STRING UnicodeString
);
1845 #define RtlUnicodeStringToAnsiSize(String) ( \
1846 NLS_MB_CODE_PAGE_TAG ? \
1847 RtlxUnicodeStringToAnsiSize(String) : \
1848 ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
1854 RtlUnicodeStringToInteger(
1855 IN PCUNICODE_STRING String
,
1856 IN ULONG Base OPTIONAL
,
1862 RtlUpcaseUnicodeChar(
1863 IN WCHAR SourceCharacter
);
1874 RtlValidRelativeSecurityDescriptor(
1875 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput
,
1876 IN ULONG SecurityDescriptorLength
,
1877 IN SECURITY_INFORMATION RequiredInformation
);
1882 RtlValidSecurityDescriptor(
1883 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
1888 RtlWriteRegistryValue(
1889 IN ULONG RelativeTo
,
1891 IN PCWSTR ValueName
,
1894 IN ULONG ValueLength
);
1896 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
1898 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
1902 RtlPrefetchMemoryNonTemporal(
1907 #if (NTDDI_VERSION >= NTDDI_WINXP)
1912 PRTL_BITMAP BitMapHeader
,
1918 RtlDowncaseUnicodeChar(
1919 IN WCHAR SourceCharacter
);
1925 PRTL_BITMAP BitMapHeader
,
1932 IN PRTL_BITMAP BitMapHeader
,
1933 IN ULONG BitNumber
);
1935 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
1937 #if (NTDDI_VERSION >= NTDDI_VISTA)
1941 RtlNumberOfSetBitsUlongPtr(
1942 IN ULONG_PTR Target
);
1947 RtlIoDecodeMemIoResource (
1948 IN PIO_RESOURCE_DESCRIPTOR Descriptor
,
1949 OUT PULONGLONG Alignment OPTIONAL
,
1950 OUT PULONGLONG MinimumAddress OPTIONAL
,
1951 OUT PULONGLONG MaximumAddress OPTIONAL
);
1956 RtlIoEncodeMemIoResource(
1957 IN PIO_RESOURCE_DESCRIPTOR Descriptor
,
1959 IN ULONGLONG Length
,
1960 IN ULONGLONG Alignment
,
1961 IN ULONGLONG MinimumAddress
,
1962 IN ULONGLONG MaximumAddress
);
1967 RtlCmDecodeMemIoResource(
1968 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor
,
1969 OUT PULONGLONG Start OPTIONAL
);
1974 RtlFindClosestEncodableLength(
1975 IN ULONGLONG SourceLength
,
1976 OUT PULONGLONG TargetLength
);
1980 #if !defined(MIDL_PASS)
1981 /* inline funftions */
1982 //DECLSPEC_DEPRECATED_DDK_WINXP
1986 RtlConvertLongToLargeInteger(LONG SignedInteger
)
1989 ret
.QuadPart
= SignedInteger
;
1993 //DECLSPEC_DEPRECATED_DDK_WINXP
1997 RtlConvertUlongToLargeInteger(
1998 ULONG UnsignedInteger
)
2001 ret
.QuadPart
= UnsignedInteger
;
2005 //DECLSPEC_DEPRECATED_DDK
2009 RtlEnlargedUnsignedDivide(
2010 IN ULARGE_INTEGER Dividend
,
2012 IN OUT PULONG Remainder
)
2015 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
2016 return (ULONG
)(Dividend
.QuadPart
/ Divisor
);
2019 //DECLSPEC_DEPRECATED_DDK
2023 RtlEnlargedUnsignedMultiply(
2024 IN ULONG Multiplicand
,
2025 IN ULONG Multiplier
)
2028 ret
.QuadPart
= (ULONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
2032 //DECLSPEC_DEPRECATED_DDK
2036 RtlEnlargedIntegerMultiply(
2037 IN LONG Multiplicand
,
2041 ret
.QuadPart
= (LONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
2047 RtlInitEmptyAnsiString(OUT PANSI_STRING AnsiString
,
2049 IN USHORT BufferSize
)
2051 AnsiString
->Length
= 0;
2052 AnsiString
->MaximumLength
= BufferSize
;
2053 AnsiString
->Buffer
= Buffer
;
2058 RtlInitEmptyUnicodeString(
2059 OUT PUNICODE_STRING UnicodeString
,
2061 IN USHORT BufferSize
)
2063 UnicodeString
->Length
= 0;
2064 UnicodeString
->MaximumLength
= BufferSize
;
2065 UnicodeString
->Buffer
= Buffer
;
2068 #if defined(_AMD64_) || defined(_IA64_)
2072 RtlExtendedIntegerMultiply(
2073 LARGE_INTEGER Multiplicand
,
2077 ret
.QuadPart
= Multiplicand
.QuadPart
* Multiplier
;
2084 RtlExtendedLargeIntegerDivide(
2085 LARGE_INTEGER Dividend
,
2090 ret
.QuadPart
= (ULONG64
)Dividend
.QuadPart
/ Divisor
;
2092 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
2097 #if defined(_AMD64_)
2099 #define MultiplyHigh __mulh
2100 #define UnsignedMultiplyHigh __umulh
2102 //DECLSPEC_DEPRECATED_DDK
2106 RtlExtendedMagicDivide(
2107 IN LARGE_INTEGER Dividend
,
2108 IN LARGE_INTEGER MagicDivisor
,
2109 IN CCHAR ShiftCount
)
2114 Pos
= (Dividend
.QuadPart
>= 0);
2115 ret64
= UnsignedMultiplyHigh(Pos
? Dividend
.QuadPart
: -Dividend
.QuadPart
,
2116 MagicDivisor
.QuadPart
);
2117 ret64
>>= ShiftCount
;
2118 ret
.QuadPart
= Pos
? ret64
: -ret64
;
2123 //DECLSPEC_DEPRECATED_DDK
2128 IN LARGE_INTEGER Addend1
,
2129 IN LARGE_INTEGER Addend2
)
2132 ret
.QuadPart
= Addend1
.QuadPart
+ Addend2
.QuadPart
;
2137 * RtlLargeIntegerAnd(
2138 * IN OUT LARGE_INTEGER Result,
2139 * IN LARGE_INTEGER Source,
2140 * IN LARGE_INTEGER Mask);
2142 #define RtlLargeIntegerAnd(Result, Source, Mask) \
2143 Result.QuadPart = Source.QuadPart & Mask.QuadPart
2145 //DECLSPEC_DEPRECATED_DDK
2149 RtlLargeIntegerArithmeticShift(
2150 IN LARGE_INTEGER LargeInteger
,
2151 IN CCHAR ShiftCount
)
2154 ret
.QuadPart
= LargeInteger
.QuadPart
>> ShiftCount
;
2159 * RtlLargeIntegerEqualTo(
2160 * IN LARGE_INTEGER Operand1,
2161 * IN LARGE_INTEGER Operand2);
2163 #define RtlLargeIntegerEqualTo(X,Y) \
2164 (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
2168 RtlSecureZeroMemory(
2172 volatile char* vptr
= (volatile char*)Pointer
;
2173 #if defined(_M_AMD64)
2174 __stosb((PUCHAR
)vptr
, 0, Size
);
2176 char * endptr
= (char *)vptr
+ Size
;
2177 while (vptr
< endptr
)
2185 #if defined(_M_AMD64)
2189 IN PRTL_BITMAP BitMapHeader
,
2190 IN ULONG BitPosition
)
2192 return BitTest((LONG CONST
*)BitMapHeader
->Buffer
, BitPosition
);
2195 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
2196 #endif // defined(_M_AMD64)
2198 #endif // !defined(MIDL_PASS)
2201 // Byte Swap Functions
2203 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \
2204 ((defined(_M_AMD64) || defined(_M_IA64)) \
2205 && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))
2207 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
2208 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
2209 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
2213 /******************************************************************************
2214 * Memory manager Types *
2215 ******************************************************************************/
2217 typedef struct _MDL
{
2221 struct _EPROCESS
*Process
;
2222 PVOID MappedSystemVa
;
2229 /******************************************************************************
2230 * Memory manager Functions *
2231 ******************************************************************************/
2233 /* PVOID MmGetSystemAddressForMdl(
2236 #define MmGetSystemAddressForMdl(Mdl) \
2237 (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
2238 MDL_SOURCE_IS_NONPAGED_POOL)) ? \
2239 ((Mdl)->MappedSystemVa) : \
2240 (MmMapLockedPages((Mdl), KernelMode)))
2243 * MmGetSystemAddressForMdlSafe(
2245 * IN MM_PAGE_PRIORITY Priority)
2247 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
2248 (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
2249 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
2250 (_Mdl)->MappedSystemVa : \
2251 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
2252 KernelMode, MmCached, NULL, FALSE, (_Priority)))
2254 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2259 IN PMDL MemoryDescriptorList OPTIONAL
,
2266 /******************************************************************************
2267 * I/O Manager Functions *
2268 ******************************************************************************/
2270 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
2271 (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
2273 #define DMA_MACROS_DEFINED
2277 IoAllocateAdapterChannel(
2278 IN PADAPTER_OBJECT AdapterObject
,
2279 IN PDEVICE_OBJECT DeviceObject
,
2280 IN ULONG NumberOfMapRegisters
,
2281 IN PDRIVER_CONTROL ExecutionRoutine
,
2284 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel
;
2285 AllocateAdapterChannel
=
2286 *(DmaAdapter
)->DmaOperations
->AllocateAdapterChannel
;
2287 ASSERT(AllocateAdapterChannel
);
2288 return AllocateAdapterChannel(DmaAdapter
,
2290 NumberOfMapRegisters
,
2297 IoFlushAdapterBuffers(
2298 IN PADAPTER_OBJECT AdapterObject
,
2300 IN PVOID MapRegisterBase
,
2303 IN BOOLEAN WriteToDevice
)
2305 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers
;
2306 FlushAdapterBuffers
= *(DmaAdapter
)->DmaOperations
->FlushAdapterBuffers
;
2307 ASSERT(FlushAdapterBuffers
);
2308 return FlushAdapterBuffers(DmaAdapter
,
2318 IoFreeAdapterChannel(
2319 IN PADAPTER_OBJECT AdapterObject
)
2321 PFREE_ADAPTER_CHANNEL FreeAdapterChannel
;
2322 FreeAdapterChannel
= *(DmaAdapter
)->DmaOperations
->FreeAdapterChannel
;
2323 ASSERT(FreeAdapterChannel
);
2324 FreeAdapterChannel(DmaAdapter
);
2330 IN PADAPTER_OBJECT AdapterObject
,
2331 IN PVOID MapRegisterBase
,
2332 IN ULONG NumberOfMapRegisters
)
2334 PFREE_MAP_REGISTERS FreeMapRegisters
;
2335 FreeMapRegisters
= *(DmaAdapter
)->DmaOperations
->FreeMapRegisters
;
2336 ASSERT(FreeMapRegisters
);
2337 FreeMapRegisters(DmaAdapter
, MapRegisterBase
, NumberOfMapRegisters
);
2343 IN PDMA_ADAPTER DmaAdapter
,
2345 IN PVOID MapRegisterBase
,
2347 IN OUT PULONG Length
,
2348 IN BOOLEAN WriteToDevice
)
2350 PMAP_TRANSFER MapTransfer
;
2352 MapTransfer
= *(DmaAdapter
)->DmaOperations
->MapTransfer
;
2353 ASSERT(MapTransfer
);
2354 return MapTransfer(DmaAdapter
,
2364 /******************************************************************************
2366 ******************************************************************************/
2368 typedef enum _POOL_TYPE
{
2371 NonPagedPoolMustSucceed
,
2373 NonPagedPoolCacheAligned
,
2374 PagedPoolCacheAligned
,
2375 NonPagedPoolCacheAlignedMustS
,
2377 NonPagedPoolSession
= 32,
2379 NonPagedPoolMustSucceedSession
,
2380 DontUseThisTypeSession
,
2381 NonPagedPoolCacheAlignedSession
,
2382 PagedPoolCacheAlignedSession
,
2383 NonPagedPoolCacheAlignedMustSSession
2386 typedef enum _SUITE_TYPE
{
2390 CommunicationServer
,
2392 SmallBusinessRestricted
,
2401 typedef enum _EX_POOL_PRIORITY
{
2403 LowPoolPrioritySpecialPoolOverrun
= 8,
2404 LowPoolPrioritySpecialPoolUnderrun
= 9,
2405 NormalPoolPriority
= 16,
2406 NormalPoolPrioritySpecialPoolOverrun
= 24,
2407 NormalPoolPrioritySpecialPoolUnderrun
= 25,
2408 HighPoolPriority
= 32,
2409 HighPoolPrioritySpecialPoolOverrun
= 40,
2410 HighPoolPrioritySpecialPoolUnderrun
= 41
2413 typedef struct _FAST_MUTEX
2420 } FAST_MUTEX
, *PFAST_MUTEX
;
2422 typedef ULONG_PTR ERESOURCE_THREAD
, *PERESOURCE_THREAD
;
2424 typedef struct _OWNER_ENTRY
{
2425 ERESOURCE_THREAD OwnerThread
;
2426 _ANONYMOUS_UNION
union {
2430 } OWNER_ENTRY
, *POWNER_ENTRY
;
2432 typedef struct _ERESOURCE
2434 LIST_ENTRY SystemResourcesList
;
2435 POWNER_ENTRY OwnerTable
;
2438 volatile PKSEMAPHORE SharedWaiters
;
2439 volatile PKEVENT ExclusiveWaiters
;
2440 OWNER_ENTRY OwnerEntry
;
2441 ULONG ActiveEntries
;
2442 ULONG ContentionCount
;
2443 ULONG NumberOfSharedWaiters
;
2444 ULONG NumberOfExclusiveWaiters
;
2445 __GNU_EXTENSION
union
2448 ULONG_PTR CreatorBackTraceIndex
;
2450 KSPIN_LOCK SpinLock
;
2451 } ERESOURCE
, *PERESOURCE
;
2453 #if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
2454 #define LOOKASIDE_ALIGN
2456 #define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */
2459 typedef struct _LOOKASIDE_LIST_EX
*PLOOKASIDE_LIST_EX
;
2462 (DDKAPI
*PALLOCATE_FUNCTION
)(
2463 IN POOL_TYPE PoolType
,
2464 IN SIZE_T NumberOfBytes
,
2468 (DDKAPI
*PALLOCATE_FUNCTION_EX
)(
2469 IN POOL_TYPE PoolType
,
2470 IN SIZE_T NumberOfBytes
,
2472 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
2475 (DDKAPI
*PFREE_FUNCTION
)(
2479 (DDKAPI
*PFREE_FUNCTION_EX
)(
2481 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
2484 (DDKAPI
*PCALLBACK_FUNCTION
)(
2485 IN PVOID CallbackContext
,
2487 IN PVOID Argument2
);
2489 typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE
{
2491 SLIST_HEADER ListHead
;
2492 SINGLE_LIST_ENTRY SingleListHead
;
2495 USHORT MaximumDepth
;
2496 ULONG TotalAllocates
;
2498 ULONG AllocateMisses
;
2510 PALLOCATE_FUNCTION_EX AllocateEx
;
2511 PALLOCATE_FUNCTION Allocate
;
2514 PFREE_FUNCTION_EX FreeEx
;
2515 PFREE_FUNCTION Free
;
2517 LIST_ENTRY ListEntry
;
2518 ULONG LastTotalAllocates
;
2520 ULONG LastAllocateMisses
;
2521 ULONG LastAllocateHits
;
2524 } GENERAL_LOOKASIDE
, *PGENERAL_LOOKASIDE
;
2526 typedef struct _PAGED_LOOKASIDE_LIST
{
2527 GENERAL_LOOKASIDE L
;
2528 #if !defined(_AMD64_) && !defined(_IA64_)
2529 FAST_MUTEX Lock__ObsoleteButDoNotDelete
;
2531 } PAGED_LOOKASIDE_LIST
, *PPAGED_LOOKASIDE_LIST
;
2533 typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST
{
2534 GENERAL_LOOKASIDE L
;
2535 #if !defined(_AMD64_) && !defined(_IA64_)
2536 KSPIN_LOCK Lock__ObsoleteButDoNotDelete
;
2538 } NPAGED_LOOKASIDE_LIST
, *PNPAGED_LOOKASIDE_LIST
;
2540 //typedef struct _LOOKASIDE_LIST_EX {
2541 // GENERAL_LOOKASIDE_POOL L;
2542 //} LOOKASIDE_LIST_EX, *PLOOKASIDE_LIST_EX;
2544 typedef struct _EX_RUNDOWN_REF
{
2545 __GNU_EXTENSION
union {
2546 volatile ULONG_PTR Count
;
2549 } EX_RUNDOWN_REF
, *PEX_RUNDOWN_REF
;
2551 typedef struct _EX_RUNDOWN_REF_CACHE_AWARE
*PEX_RUNDOWN_REF_CACHE_AWARE
;
2553 typedef enum _WORK_QUEUE_TYPE
{
2556 HyperCriticalWorkQueue
,
2561 (DDKAPI
*PWORKER_THREAD_ROUTINE
)(
2562 IN PVOID Parameter
);
2564 typedef struct _WORK_QUEUE_ITEM
{
2566 PWORKER_THREAD_ROUTINE WorkerRoutine
;
2567 volatile PVOID Parameter
;
2568 } WORK_QUEUE_ITEM
, *PWORK_QUEUE_ITEM
;
2571 /******************************************************************************
2572 * Executive Functions *
2573 ******************************************************************************/
2576 #if defined(_NTHAL_)
2577 #define ExAcquireFastMutex ExiAcquireFastMutex
2578 #define ExReleaseFastMutex ExiReleaseFastMutex
2579 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
2581 #define ExInterlockedAddUlong ExfInterlockedAddUlong
2582 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
2583 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
2584 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
2585 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
2586 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
2591 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
2592 defined(_NTHAL_) || defined(_NTOSP_)
2595 ExQueryDepthSList(IN PSLIST_HEADER ListHead
);
2599 ExQueryDepthSList(IN PSLIST_HEADER ListHead
)
2601 return (USHORT
)(ListHead
->Alignment
& 0xffff);
2607 ExpInterlockedFlushSList(
2608 PSLIST_HEADER ListHead
);
2612 ExpInterlockedPopEntrySList(
2613 PSLIST_HEADER ListHead
);
2617 ExpInterlockedPushEntrySList(
2618 PSLIST_HEADER ListHead
,
2619 PSLIST_ENTRY ListEntry
);
2621 #define ExInterlockedFlushSList(Head) \
2622 ExpInterlockedFlushSList(Head)
2623 #define ExInterlockedPopEntrySList(Head, Lock) \
2624 ExpInterlockedPopEntrySList(Head)
2625 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
2626 ExpInterlockedPushEntrySList(Head, Entry)
2628 #else // !defined(_WIN64)
2630 #define ExQueryDepthSList(listhead) (listhead)->Depth
2635 ExInterlockedFlushSList(
2636 IN PSLIST_HEADER ListHead
);
2638 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
2642 ExInterlockedPopEntrySList(
2643 IN PSLIST_HEADER ListHead
,
2644 IN PKSPIN_LOCK Lock
);
2649 ExInterlockedPushEntrySList(
2650 IN PSLIST_HEADER ListHead
,
2651 IN PSINGLE_LIST_ENTRY ListEntry
,
2652 IN PKSPIN_LOCK Lock
);
2654 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
2655 InterlockedPopEntrySList(_ListHead)
2656 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
2657 InterlockedPushEntrySList(_ListHead, _ListEntry)
2658 #endif // _WIN2K_COMPAT_SLIST_USAGE
2660 #endif // !defined(_WIN64)
2663 * ExGetCurrentResourceThread(
2666 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread())
2668 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
2671 * ExInitializeWorkItem(
2672 * IN PWORK_QUEUE_ITEM Item,
2673 * IN PWORKER_THREAD_ROUTINE Routine,
2676 #define ExInitializeWorkItem(Item, Routine, Context) \
2678 (Item)->WorkerRoutine = Routine; \
2679 (Item)->Parameter = Context; \
2680 (Item)->List.Flink = NULL; \
2683 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2689 IN OUT PFAST_MUTEX FastMutex
);
2695 IN OUT PFAST_MUTEX FastMutex
);
2700 ExTryToAcquireFastMutex(
2701 IN OUT PFAST_MUTEX FastMutex
);
2706 ExAcquireFastMutexUnsafe(
2707 IN OUT PFAST_MUTEX FastMutex
);
2712 ExReleaseFastMutexUnsafe(
2713 IN OUT PFAST_MUTEX FastMutex
);
2718 ExAcquireResourceExclusiveLite(
2719 IN PERESOURCE Resource
,
2725 ExAcquireResourceSharedLite(
2726 IN PERESOURCE Resource
,
2732 ExAcquireSharedStarveExclusive(
2733 IN PERESOURCE Resource
,
2739 ExAcquireSharedWaitForExclusive(
2740 IN PERESOURCE Resource
,
2747 IN POOL_TYPE PoolType
,
2748 IN SIZE_T NumberOfBytes
);
2751 #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
2752 #endif /* POOL_TAGGING */
2757 ExAllocatePoolWithQuota(
2758 IN POOL_TYPE PoolType
,
2759 IN SIZE_T NumberOfBytes
);
2762 #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
2763 #endif /* POOL_TAGGING */
2768 ExAllocatePoolWithQuotaTag(
2769 IN POOL_TYPE PoolType
,
2770 IN SIZE_T NumberOfBytes
,
2773 #ifndef POOL_TAGGING
2774 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
2775 #endif /* POOL_TAGGING */
2780 ExAllocatePoolWithTag(
2781 IN POOL_TYPE PoolType
,
2782 IN SIZE_T NumberOfBytes
,
2788 ExAllocatePoolWithTagPriority(
2789 IN POOL_TYPE PoolType
,
2790 IN SIZE_T NumberOfBytes
,
2792 IN EX_POOL_PRIORITY Priority
);
2797 ExConvertExclusiveToSharedLite(
2798 IN PERESOURCE Resource
);
2804 OUT PCALLBACK_OBJECT
*CallbackObject
,
2805 IN POBJECT_ATTRIBUTES ObjectAttributes
,
2807 IN BOOLEAN AllowMultipleCallbacks
);
2812 ExDeleteNPagedLookasideList(
2813 IN PNPAGED_LOOKASIDE_LIST Lookaside
);
2818 ExDeletePagedLookasideList(
2819 IN PPAGED_LOOKASIDE_LIST Lookaside
);
2824 ExDeleteResourceLite(
2825 IN PERESOURCE Resource
);
2834 #define ExFreePool(P) ExFreePoolWithTag(P, 0)
2847 ExGetExclusiveWaiterCount(
2848 IN PERESOURCE Resource
);
2859 ExGetSharedWaiterCount(
2860 IN PERESOURCE Resource
);
2865 ExInitializeNPagedLookasideList(
2866 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
2867 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
2868 IN PFREE_FUNCTION Free OPTIONAL
,
2877 ExInitializePagedLookasideList(
2878 IN PPAGED_LOOKASIDE_LIST Lookaside
,
2879 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
2880 IN PFREE_FUNCTION Free OPTIONAL
,
2889 ExInitializeResourceLite(
2890 IN PERESOURCE Resource
);
2895 ExInterlockedAddLargeInteger(
2896 IN PLARGE_INTEGER Addend
,
2897 IN LARGE_INTEGER Increment
,
2898 IN PKSPIN_LOCK Lock
);
2901 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
2902 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
2904 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
2905 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
2911 ExInterlockedAddUlong(
2916 #if defined(_AMD64_) || defined(_IA64_)
2917 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
2918 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
2919 #elif defined(_X86_)
2923 ExfInterlockedCompareExchange64(
2924 IN OUT LONGLONG
volatile *Destination
,
2925 IN PLONGLONG Exchange
,
2926 IN PLONGLONG Comperand
);
2927 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
2928 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
2933 ExInterlockedCompareExchange64(
2934 IN OUT LONGLONG
volatile *Destination
,
2935 IN PLONGLONG Exchange
,
2936 IN PLONGLONG Comparand
,
2937 IN PKSPIN_LOCK Lock
);
2943 ExInterlockedInsertHeadList(
2944 IN PLIST_ENTRY ListHead
,
2945 IN PLIST_ENTRY ListEntry
,
2946 IN PKSPIN_LOCK Lock
);
2951 ExInterlockedInsertTailList(
2952 IN PLIST_ENTRY ListHead
,
2953 IN PLIST_ENTRY ListEntry
,
2954 IN PKSPIN_LOCK Lock
);
2959 ExInterlockedPopEntryList(
2960 IN PSINGLE_LIST_ENTRY ListHead
,
2961 IN PKSPIN_LOCK Lock
);
2966 ExInterlockedPushEntryList(
2967 IN PSINGLE_LIST_ENTRY ListHead
,
2968 IN PSINGLE_LIST_ENTRY ListEntry
,
2969 IN PKSPIN_LOCK Lock
);
2974 ExInterlockedRemoveHeadList(
2975 IN PLIST_ENTRY ListHead
,
2976 IN PKSPIN_LOCK Lock
);
2981 ExIsProcessorFeaturePresent(
2982 IN ULONG ProcessorFeature
);
2987 ExIsResourceAcquiredExclusiveLite(
2988 IN PERESOURCE Resource
);
2993 ExIsResourceAcquiredSharedLite(
2994 IN PERESOURCE Resource
);
2996 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
3001 ExLocalTimeToSystemTime(
3002 IN PLARGE_INTEGER LocalTime
,
3003 OUT PLARGE_INTEGER SystemTime
);
3009 IN PCALLBACK_OBJECT CallbackObject
,
3011 IN PVOID Argument2
);
3017 IN PWORK_QUEUE_ITEM WorkItem
,
3018 IN WORK_QUEUE_TYPE QueueType
);
3025 IN NTSTATUS Status
);
3031 IN PCALLBACK_OBJECT CallbackObject
,
3032 IN PCALLBACK_FUNCTION CallbackFunction
,
3033 IN PVOID CallbackContext
);
3038 ExReinitializeResourceLite(
3039 IN PERESOURCE Resource
);
3044 ExReleaseResourceForThreadLite(
3045 IN PERESOURCE Resource
,
3046 IN ERESOURCE_THREAD ResourceThreadId
);
3051 ExReleaseResourceLite(
3052 IN PERESOURCE Resource
);
3057 ExSetResourceOwnerPointer(
3058 IN PERESOURCE Resource
,
3059 IN PVOID OwnerPointer
);
3064 ExSetTimerResolution(
3065 IN ULONG DesiredTime
,
3066 IN BOOLEAN SetResolution
);
3071 ExSystemTimeToLocalTime(
3072 IN PLARGE_INTEGER SystemTime
,
3073 OUT PLARGE_INTEGER LocalTime
);
3078 ExUnregisterCallback(
3079 IN PVOID CbRegistration
);
3082 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
3084 #if (NTDDI_VERSION >= NTDDI_WINXP)
3088 ExAcquireRundownProtection(
3089 IN OUT PEX_RUNDOWN_REF RunRef
);
3094 ExInitializeRundownProtection(
3095 OUT PEX_RUNDOWN_REF RunRef
);
3100 ExReInitializeRundownProtection(
3101 OUT PEX_RUNDOWN_REF RunRef
);
3106 ExReleaseRundownProtection(
3107 IN OUT PEX_RUNDOWN_REF RunRef
);
3113 OUT PEX_RUNDOWN_REF RunRef
);
3119 IN SUITE_TYPE SuiteType
);
3124 ExWaitForRundownProtectionRelease(
3125 IN OUT PEX_RUNDOWN_REF RunRef
);
3127 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
3129 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
3133 ExAcquireRundownProtectionEx(
3134 IN OUT PEX_RUNDOWN_REF RunRef
,
3140 ExReleaseRundownProtectionEx(
3141 IN OUT PEX_RUNDOWN_REF RunRef
,
3143 #endif // (NTDDI_VERSION >= NTDDI_WINXPSP2)
3145 #if (NTDDI_VERSION >= NTDDI_WS03)
3147 #endif // (NTDDI_VERSION >= NTDDI_WS03)
3149 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
3151 PEX_RUNDOWN_REF_CACHE_AWARE
3152 ExAllocateCacheAwareRundownProtection(
3153 IN POOL_TYPE PoolType
,
3158 ExSizeOfRundownProtectionCacheAware(VOID
);
3160 #endif // (NTDDI_VERSION >= NTDDI_WS03SP1)
3162 #if (NTDDI_VERSION >= NTDDI_VISTA)
3165 ExInitializeLookasideListEx(
3166 OUT PLOOKASIDE_LIST_EX Lookaside
,
3167 IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL
,
3168 IN PFREE_FUNCTION_EX Free OPTIONAL
,
3169 IN POOL_TYPE PoolType
,
3177 #if !defined(MIDL_PASS)
3179 static __inline PVOID
3180 ExAllocateFromNPagedLookasideList(
3181 IN PNPAGED_LOOKASIDE_LIST Lookaside
)
3185 Lookaside
->L
.TotalAllocates
++;
3186 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
3187 if (Entry
== NULL
) {
3188 Lookaside
->L
.AllocateMisses
++;
3189 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
3196 static __inline PVOID
3197 ExAllocateFromPagedLookasideList(
3198 IN PPAGED_LOOKASIDE_LIST Lookaside
)
3202 Lookaside
->L
.TotalAllocates
++;
3203 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
3204 if (Entry
== NULL
) {
3205 Lookaside
->L
.AllocateMisses
++;
3206 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
3213 static __inline VOID
3214 ExFreeToNPagedLookasideList(
3215 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
3218 Lookaside
->L
.TotalFrees
++;
3219 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
3220 Lookaside
->L
.FreeMisses
++;
3221 (Lookaside
->L
.Free
)(Entry
);
3223 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
3227 static __inline VOID
3228 ExFreeToPagedLookasideList(
3229 IN PPAGED_LOOKASIDE_LIST Lookaside
,
3232 Lookaside
->L
.TotalFrees
++;
3233 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
3234 Lookaside
->L
.FreeMisses
++;
3235 (Lookaside
->L
.Free
)(Entry
);
3237 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
3242 #endif // !defined(MIDL_PASS)