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
60 typedef UCHAR KPROCESSOR_MODE
;
61 typedef LONG KPRIORITY
;
62 typedef PVOID PSECURITY_DESCRIPTOR
;
63 typedef ULONG SECURITY_INFORMATION
, *PSECURITY_INFORMATION
;
65 /* Structures not exposed to drivers */
66 typedef struct _OBJECT_TYPE
*POBJECT_TYPE
;
67 typedef struct _HAL_DISPATCH_TABLE
*PHAL_DISPATCH_TABLE
;
68 typedef struct _HAL_PRIVATE_DISPATCH_TABLE
*PHAL_PRIVATE_DISPATCH_TABLE
;
69 typedef struct _DEVICE_HANDLER_OBJECT
*PDEVICE_HANDLER_OBJECT
;
70 typedef struct _BUS_HANDLER
*PBUS_HANDLER
;
72 typedef struct _ADAPTER_OBJECT
*PADAPTER_OBJECT
;
73 typedef struct _CALLBACK_OBJECT
*PCALLBACK_OBJECT
;
74 typedef struct _ETHREAD
*PETHREAD
;
75 typedef struct _EPROCESS
*PEPROCESS
;
76 typedef struct _IO_TIMER
*PIO_TIMER
;
77 typedef struct _KINTERRUPT
*PKINTERRUPT
;
78 typedef struct _KPROCESS
*PKPROCESS
;
79 typedef struct _KTHREAD
*PKTHREAD
, *PRKTHREAD
;
82 typedef struct _CONTEXT
*PCONTEXT
;
85 // Resource list definitions
87 typedef int CM_RESOURCE_TYPE
;
89 #define CmResourceTypeNull 0
90 #define CmResourceTypePort 1
91 #define CmResourceTypeInterrupt 2
92 #define CmResourceTypeMemory 3
93 #define CmResourceTypeDma 4
94 #define CmResourceTypeDeviceSpecific 5
95 #define CmResourceTypeBusNumber 6
96 #define CmResourceTypeNonArbitrated 128
97 #define CmResourceTypeConfigData 128
98 #define CmResourceTypeDevicePrivate 129
99 #define CmResourceTypePcCardConfig 130
100 #define CmResourceTypeMfCardConfig 131
102 typedef enum _INTERFACE_TYPE
{
103 InterfaceTypeUndefined
= -1,
121 } INTERFACE_TYPE
, *PINTERFACE_TYPE
;
123 /* IO_RESOURCE_DESCRIPTOR.Option */
125 #define IO_RESOURCE_PREFERRED 0x01
126 #define IO_RESOURCE_DEFAULT 0x02
127 #define IO_RESOURCE_ALTERNATIVE 0x08
129 typedef struct _IO_RESOURCE_DESCRIPTOR
{
132 UCHAR ShareDisposition
;
140 PHYSICAL_ADDRESS MinimumAddress
;
141 PHYSICAL_ADDRESS MaximumAddress
;
146 PHYSICAL_ADDRESS MinimumAddress
;
147 PHYSICAL_ADDRESS MaximumAddress
;
154 ULONG MinimumChannel
;
155 ULONG MaximumChannel
;
160 PHYSICAL_ADDRESS MinimumAddress
;
161 PHYSICAL_ADDRESS MaximumAddress
;
178 } IO_RESOURCE_DESCRIPTOR
, *PIO_RESOURCE_DESCRIPTOR
;
180 typedef struct _IO_RESOURCE_LIST
{
184 IO_RESOURCE_DESCRIPTOR Descriptors
[1];
185 } IO_RESOURCE_LIST
, *PIO_RESOURCE_LIST
;
187 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST
{
189 INTERFACE_TYPE InterfaceType
;
193 ULONG AlternativeLists
;
194 IO_RESOURCE_LIST List
[1];
195 } IO_RESOURCE_REQUIREMENTS_LIST
, *PIO_RESOURCE_REQUIREMENTS_LIST
;
200 extern ULONG NtGlobalFlag
;
203 #include <pshpack4.h>
204 typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR
{
206 UCHAR ShareDisposition
;
210 PHYSICAL_ADDRESS Start
;
214 PHYSICAL_ADDRESS Start
;
222 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
224 __GNU_EXTENSION
union {
240 PHYSICAL_ADDRESS Start
;
260 } DeviceSpecificData
;
261 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
263 PHYSICAL_ADDRESS Start
;
267 PHYSICAL_ADDRESS Start
;
271 PHYSICAL_ADDRESS Start
;
276 } CM_PARTIAL_RESOURCE_DESCRIPTOR
, *PCM_PARTIAL_RESOURCE_DESCRIPTOR
;
280 // Section map options
282 typedef enum _SECTION_INHERIT
{
288 // Section access rights
290 #define SECTION_QUERY 0x0001
291 #define SECTION_MAP_WRITE 0x0002
292 #define SECTION_MAP_READ 0x0004
293 #define SECTION_MAP_EXECUTE 0x0008
294 #define SECTION_EXTEND_SIZE 0x0010
295 #define SECTION_MAP_EXECUTE_EXPLICIT 0x0020
297 #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
298 SECTION_MAP_WRITE | \
300 SECTION_MAP_EXECUTE | \
303 #define SESSION_QUERY_ACCESS 0x0001
304 #define SESSION_MODIFY_ACCESS 0x0002
306 #define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
307 SESSION_QUERY_ACCESS | \
308 SESSION_MODIFY_ACCESS)
312 #define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
314 #define PAGE_NOACCESS 0x01
315 #define PAGE_READONLY 0x02
316 #define PAGE_READWRITE 0x04
317 #define PAGE_WRITECOPY 0x08
318 #define PAGE_EXECUTE 0x10
319 #define PAGE_EXECUTE_READ 0x20
320 #define PAGE_EXECUTE_READWRITE 0x40
321 #define PAGE_EXECUTE_WRITECOPY 0x80
322 #define PAGE_GUARD 0x100
323 #define PAGE_NOCACHE 0x200
324 #define PAGE_WRITECOMBINE 0x400
326 #define MEM_COMMIT 0x1000
327 #define MEM_RESERVE 0x2000
328 #define MEM_DECOMMIT 0x4000
329 #define MEM_RELEASE 0x8000
330 #define MEM_FREE 0x10000
331 #define MEM_PRIVATE 0x20000
332 #define MEM_MAPPED 0x40000
333 #define MEM_RESET 0x80000
334 #define MEM_TOP_DOWN 0x100000
335 #define MEM_LARGE_PAGES 0x20000000
336 #define MEM_4MB_PAGES 0x80000000
338 #define SEC_RESERVE 0x4000000
339 #define SEC_LARGE_PAGES 0x80000000
341 #define PROCESS_DUP_HANDLE (0x0040)
343 #if (NTDDI_VERSION >= NTDDI_VISTA)
344 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
347 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
354 // Processor features
356 #define PF_FLOATING_POINT_PRECISION_ERRATA 0
357 #define PF_FLOATING_POINT_EMULATED 1
358 #define PF_COMPARE_EXCHANGE_DOUBLE 2
359 #define PF_MMX_INSTRUCTIONS_AVAILABLE 3
360 #define PF_PPC_MOVEMEM_64BIT_OK 4
361 #define PF_ALPHA_BYTE_INSTRUCTIONS 5
362 #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
363 #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
364 #define PF_RDTSC_INSTRUCTION_AVAILABLE 8
365 #define PF_PAE_ENABLED 9
366 #define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
367 #define PF_SSE_DAZ_MODE_AVAILABLE 11
368 #define PF_NX_ENABLED 12
369 #define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
370 #define PF_COMPARE_EXCHANGE128 14
371 #define PF_COMPARE64_EXCHANGE128 15
372 #define PF_CHANNELS_ENABLED 16
377 // Intrinsics (note: taken from our winnt.h)
380 #if defined(__GNUC__)
382 static __inline__ BOOLEAN
383 InterlockedBitTestAndSet(IN LONG
volatile *Base
,
388 __asm__
__volatile__("lock "
391 :"=r" (OldBit
),"+m" (*Base
)
396 return (_InterlockedOr(Base
, 1 << Bit
) >> Bit
) & 1;
400 static __inline__ BOOLEAN
401 InterlockedBitTestAndReset(IN LONG
volatile *Base
,
406 __asm__
__volatile__("lock "
409 :"=r" (OldBit
),"+m" (*Base
)
414 return (_InterlockedAnd(Base
, ~(1 << Bit
)) >> Bit
) & 1;
420 #define BitScanForward _BitScanForward
421 #define BitScanReverse _BitScanReverse
423 #define BitTest _bittest
424 #define BitTestAndComplement _bittestandcomplement
425 #define BitTestAndSet _bittestandset
426 #define BitTestAndReset _bittestandreset
427 #define InterlockedBitTestAndSet _interlockedbittestandset
428 #define InterlockedBitTestAndReset _interlockedbittestandreset
431 /** INTERLOCKED FUNCTIONS *****************************************************/
433 #if !defined(__INTERLOCKED_DECLARED)
434 #define __INTERLOCKED_DECLARED
437 #if defined(NO_INTERLOCKED_INTRINSICS)
441 InterlockedIncrement(
442 IN OUT LONG
volatile *Addend
);
447 InterlockedDecrement(
448 IN OUT LONG
volatile *Addend
);
453 InterlockedCompareExchange(
454 IN OUT LONG
volatile *Destination
,
462 IN OUT LONG
volatile *Destination
,
468 InterlockedExchangeAdd(
469 IN OUT LONG
volatile *Addend
,
472 #else // !defined(NO_INTERLOCKED_INTRINSICS)
474 #define InterlockedExchange _InterlockedExchange
475 #define InterlockedIncrement _InterlockedIncrement
476 #define InterlockedDecrement _InterlockedDecrement
477 #define InterlockedExchangeAdd _InterlockedExchangeAdd
478 #define InterlockedCompareExchange _InterlockedCompareExchange
479 #define InterlockedOr _InterlockedOr
480 #define InterlockedAnd _InterlockedAnd
481 #define InterlockedXor _InterlockedXor
483 #endif // !defined(NO_INTERLOCKED_INTRINSICS)
485 #endif // defined (_X86_)
487 #if !defined (_WIN64)
490 * InterlockedExchangePointer(
491 * IN OUT PVOID volatile *Target,
494 #define InterlockedExchangePointer(Target, Value) \
495 ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
499 * InterlockedCompareExchangePointer(
500 * IN OUT PVOID *Destination,
502 * IN PVOID Comparand)
504 #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
505 ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
507 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
508 #define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
509 #define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
511 #endif // !defined (_WIN64)
513 #if defined (_M_AMD64)
515 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONGLONG *)a, (LONGLONG)b)
516 #define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONGLONG *)a)
517 #define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONGLONG *)a)
518 #define InterlockedAnd _InterlockedAnd
519 #define InterlockedOr _InterlockedOr
520 #define InterlockedXor _InterlockedXor
521 #define InterlockedIncrement _InterlockedIncrement
522 #define InterlockedDecrement _InterlockedDecrement
523 #define InterlockedAdd _InterlockedAdd
524 #define InterlockedExchange _InterlockedExchange
525 #define InterlockedExchangeAdd _InterlockedExchangeAdd
526 #define InterlockedCompareExchange _InterlockedCompareExchange
527 #define InterlockedAnd64 _InterlockedAnd64
528 #define InterlockedOr64 _InterlockedOr64
529 #define InterlockedXor64 _InterlockedXor64
530 #define InterlockedIncrement64 _InterlockedIncrement64
531 #define InterlockedDecrement64 _InterlockedDecrement64
532 #define InterlockedAdd64 _InterlockedAdd64
533 #define InterlockedExchange64 _InterlockedExchange64
534 #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
535 #define InterlockedCompareExchange64 _InterlockedCompareExchange64
536 #define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
537 #define InterlockedExchangePointer _InterlockedExchangePointer
538 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
539 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
543 #if defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
544 //#if !defined(_X86AMD64_) // FIXME: what's _X86AMD64_ used for?
548 IN OUT LONG64
volatile *Addend
,
551 return InterlockedExchangeAdd64(Addend
, Value
) + Value
;
556 #endif /* !__INTERLOCKED_DECLARED */
559 #define YieldProcessor _mm_pause
560 #elif defined (_M_AMD64)
561 #define YieldProcessor _mm_pause
562 #elif defined(_M_PPC)
563 #define YieldProcessor() __asm__ __volatile__("nop");
564 #elif defined(_M_MIPS)
565 #define YieldProcessor() __asm__ __volatile__("nop");
566 #elif defined(_M_ARM)
567 #define YieldProcessor()
569 #error Unknown architecture
577 #ifndef _SLIST_HEADER_
578 #define _SLIST_HEADER_
581 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY
*PSLIST_ENTRY
;
582 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY
{
585 typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER
{
592 ULONGLONG Sequence
:9;
593 ULONGLONG NextEntry
:39;
594 ULONGLONG HeaderType
:1;
596 ULONGLONG Reserved
:59;
601 ULONGLONG Sequence
:48;
602 ULONGLONG HeaderType
:1;
604 ULONGLONG Reserved
:2;
605 ULONGLONG NextEntry
:60;
607 } SLIST_HEADER
, *PSLIST_HEADER
;
609 #define SLIST_ENTRY SINGLE_LIST_ENTRY
610 #define _SLIST_ENTRY _SINGLE_LIST_ENTRY
611 #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
612 typedef union _SLIST_HEADER
{
619 } SLIST_HEADER
, *PSLIST_HEADER
;
622 #endif /* _SLIST_HEADER_ */
627 // Power States/Levels
629 typedef enum _SYSTEM_POWER_STATE
{
630 PowerSystemUnspecified
,
632 PowerSystemSleeping1
,
633 PowerSystemSleeping2
,
634 PowerSystemSleeping3
,
635 PowerSystemHibernate
,
638 } SYSTEM_POWER_STATE
, *PSYSTEM_POWER_STATE
;
640 #define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
642 typedef enum _POWER_INFORMATION_LEVEL
{
645 VerifySystemPolicyAc
,
646 VerifySystemPolicyDc
,
647 SystemPowerCapabilities
,
649 SystemPowerStateHandler
,
650 ProcessorStateHandler
,
651 SystemPowerPolicyCurrent
,
652 AdministratorPowerPolicy
,
653 SystemReserveHiberFile
,
654 ProcessorInformation
,
655 SystemPowerInformation
,
656 ProcessorStateHandler2
,
659 SystemExecutionState
,
660 SystemPowerStateNotifyHandler
,
661 ProcessorPowerPolicyAc
,
662 ProcessorPowerPolicyDc
,
663 VerifyProcessorPowerPolicyAc
,
664 VerifyProcessorPowerPolicyDc
,
665 ProcessorPowerPolicyCurrent
666 } POWER_INFORMATION_LEVEL
;
672 PowerActionHibernate
,
674 PowerActionShutdownReset
,
675 PowerActionShutdownOff
,
677 } POWER_ACTION
, *PPOWER_ACTION
;
679 typedef enum _DEVICE_POWER_STATE
{
680 PowerDeviceUnspecified
,
686 } DEVICE_POWER_STATE
, *PDEVICE_POWER_STATE
;
688 #define ES_SYSTEM_REQUIRED 0x00000001
689 #define ES_DISPLAY_REQUIRED 0x00000002
690 #define ES_USER_PRESENT 0x00000004
691 #define ES_CONTINUOUS 0x80000000
693 typedef ULONG EXECUTION_STATE
;
703 // Access/Security Stuff
705 typedef ULONG ACCESS_MASK
, *PACCESS_MASK
;
706 typedef PVOID PACCESS_TOKEN
;
708 #define DELETE 0x00010000L
709 #define READ_CONTROL 0x00020000L
710 #define WRITE_DAC 0x00040000L
711 #define WRITE_OWNER 0x00080000L
712 #define SYNCHRONIZE 0x00100000L
713 #define STANDARD_RIGHTS_REQUIRED 0x000F0000L
714 #define STANDARD_RIGHTS_READ READ_CONTROL
715 #define STANDARD_RIGHTS_WRITE READ_CONTROL
716 #define STANDARD_RIGHTS_EXECUTE READ_CONTROL
717 #define STANDARD_RIGHTS_ALL 0x001F0000L
718 #define SPECIFIC_RIGHTS_ALL 0x0000FFFFL
719 #define ACCESS_SYSTEM_SECURITY 0x01000000L
720 #define MAXIMUM_ALLOWED 0x02000000L
721 #define GENERIC_READ 0x80000000L
722 #define GENERIC_WRITE 0x40000000L
723 #define GENERIC_EXECUTE 0x20000000L
724 #define GENERIC_ALL 0x10000000L
726 typedef struct _GENERIC_MAPPING
{
727 ACCESS_MASK GenericRead
;
728 ACCESS_MASK GenericWrite
;
729 ACCESS_MASK GenericExecute
;
730 ACCESS_MASK GenericAll
;
731 } GENERIC_MAPPING
, *PGENERIC_MAPPING
;
733 #define ACL_REVISION 2
734 #define ACL_REVISION_DS 4
736 #define ACL_REVISION1 1
737 #define ACL_REVISION2 2
738 #define ACL_REVISION3 3
739 #define ACL_REVISION4 4
740 #define MIN_ACL_REVISION ACL_REVISION2
741 #define MAX_ACL_REVISION ACL_REVISION4
743 typedef struct _ACL
{
754 // Current security descriptor revision value
756 #define SECURITY_DESCRIPTOR_REVISION (1)
757 #define SECURITY_DESCRIPTOR_REVISION1 (1)
760 // Privilege attributes
762 #define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
763 #define SE_PRIVILEGE_ENABLED (0x00000002L)
764 #define SE_PRIVILEGE_REMOVED (0X00000004L)
765 #define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
767 #define SE_PRIVILEGE_VALID_ATTRIBUTES (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
768 SE_PRIVILEGE_ENABLED | \
769 SE_PRIVILEGE_REMOVED | \
770 SE_PRIVILEGE_USED_FOR_ACCESS)
772 #include <pshpack4.h>
773 typedef struct _LUID_AND_ATTRIBUTES
{
776 } LUID_AND_ATTRIBUTES
, *PLUID_AND_ATTRIBUTES
;
778 typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY
[ANYSIZE_ARRAY
];
779 typedef LUID_AND_ATTRIBUTES_ARRAY
*PLUID_AND_ATTRIBUTES_ARRAY
;
786 #define PRIVILEGE_SET_ALL_NECESSARY (1)
788 typedef struct _PRIVILEGE_SET
{
789 ULONG PrivilegeCount
;
791 LUID_AND_ATTRIBUTES Privilege
[ANYSIZE_ARRAY
];
792 } PRIVILEGE_SET
,*PPRIVILEGE_SET
;
794 typedef enum _SECURITY_IMPERSONATION_LEVEL
{
796 SecurityIdentification
,
797 SecurityImpersonation
,
799 } SECURITY_IMPERSONATION_LEVEL
, * PSECURITY_IMPERSONATION_LEVEL
;
801 #define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
802 #define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
803 #define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
804 #define VALID_IMPERSONATION_LEVEL(Level) (((Level) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((Level) <= SECURITY_MAX_IMPERSONATION_LEVEL))
806 #define SECURITY_DYNAMIC_TRACKING (TRUE)
807 #define SECURITY_STATIC_TRACKING (FALSE)
809 typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE
, *PSECURITY_CONTEXT_TRACKING_MODE
;
811 typedef struct _SECURITY_QUALITY_OF_SERVICE
{
813 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
;
814 SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode
;
815 BOOLEAN EffectiveOnly
;
816 } SECURITY_QUALITY_OF_SERVICE
, *PSECURITY_QUALITY_OF_SERVICE
;
818 typedef struct _SE_IMPERSONATION_STATE
{
821 BOOLEAN EffectiveOnly
;
822 SECURITY_IMPERSONATION_LEVEL Level
;
823 } SE_IMPERSONATION_STATE
, *PSE_IMPERSONATION_STATE
;
825 #define OWNER_SECURITY_INFORMATION (0x00000001L)
826 #define GROUP_SECURITY_INFORMATION (0x00000002L)
827 #define DACL_SECURITY_INFORMATION (0x00000004L)
828 #define SACL_SECURITY_INFORMATION (0x00000008L)
829 #define LABEL_SECURITY_INFORMATION (0x00000010L)
831 #define PROTECTED_DACL_SECURITY_INFORMATION (0x80000000L)
832 #define PROTECTED_SACL_SECURITY_INFORMATION (0x40000000L)
833 #define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L)
834 #define UNPROTECTED_SACL_SECURITY_INFORMATION (0x10000000L)
839 // Registry Access Rights
841 #define KEY_QUERY_VALUE (0x0001)
842 #define KEY_SET_VALUE (0x0002)
843 #define KEY_CREATE_SUB_KEY (0x0004)
844 #define KEY_ENUMERATE_SUB_KEYS (0x0008)
845 #define KEY_NOTIFY (0x0010)
846 #define KEY_CREATE_LINK (0x0020)
847 #define KEY_WOW64_32KEY (0x0200)
848 #define KEY_WOW64_64KEY (0x0100)
849 #define KEY_WOW64_RES (0x0300)
851 #define KEY_READ ((STANDARD_RIGHTS_READ |\
853 KEY_ENUMERATE_SUB_KEYS |\
858 #define KEY_WRITE ((STANDARD_RIGHTS_WRITE |\
860 KEY_CREATE_SUB_KEY) \
864 #define KEY_EXECUTE ((KEY_READ) \
868 #define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL |\
871 KEY_CREATE_SUB_KEY |\
872 KEY_ENUMERATE_SUB_KEYS |\
879 // Registry Open/Create Options
881 #define REG_OPTION_RESERVED (0x00000000L)
882 #define REG_OPTION_NON_VOLATILE (0x00000000L)
883 #define REG_OPTION_VOLATILE (0x00000001L)
884 #define REG_OPTION_CREATE_LINK (0x00000002L)
885 #define REG_OPTION_BACKUP_RESTORE (0x00000004L)
886 #define REG_OPTION_OPEN_LINK (0x00000008L)
888 #define REG_LEGAL_OPTION \
889 (REG_OPTION_RESERVED |\
890 REG_OPTION_NON_VOLATILE |\
891 REG_OPTION_VOLATILE |\
892 REG_OPTION_CREATE_LINK |\
893 REG_OPTION_BACKUP_RESTORE |\
894 REG_OPTION_OPEN_LINK)
897 // Key creation/open disposition
899 #define REG_CREATED_NEW_KEY (0x00000001L)
900 #define REG_OPENED_EXISTING_KEY (0x00000002L)
903 // Key restore & hive load flags
905 #define REG_WHOLE_HIVE_VOLATILE (0x00000001L)
906 #define REG_REFRESH_HIVE (0x00000002L)
907 #define REG_NO_LAZY_FLUSH (0x00000004L)
908 #define REG_FORCE_RESTORE (0x00000008L)
909 #define REG_APP_HIVE (0x00000010L)
910 #define REG_PROCESS_PRIVATE (0x00000020L)
911 #define REG_START_JOURNAL (0x00000040L)
912 #define REG_HIVE_EXACT_FILE_GROWTH (0x00000080L)
913 #define REG_HIVE_NO_RM (0x00000100L)
914 #define REG_HIVE_SINGLE_LOG (0x00000200L)
919 #define REG_FORCE_UNLOAD 1
922 // Notify Filter Values
924 #define REG_NOTIFY_CHANGE_NAME (0x00000001L)
925 #define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L)
926 #define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L)
927 #define REG_NOTIFY_CHANGE_SECURITY (0x00000008L)
929 #define REG_LEGAL_CHANGE_FILTER \
930 (REG_NOTIFY_CHANGE_NAME |\
931 REG_NOTIFY_CHANGE_ATTRIBUTES |\
932 REG_NOTIFY_CHANGE_LAST_SET |\
933 REG_NOTIFY_CHANGE_SECURITY)
938 // Thread Access Rights
940 #define THREAD_TERMINATE (0x0001)
941 #define THREAD_SUSPEND_RESUME (0x0002)
942 #define THREAD_ALERT (0x0004)
943 #define THREAD_GET_CONTEXT (0x0008)
944 #define THREAD_SET_CONTEXT (0x0010)
945 #define THREAD_SET_INFORMATION (0x0020)
946 #define THREAD_SET_LIMITED_INFORMATION (0x0400)
947 #define THREAD_QUERY_LIMITED_INFORMATION (0x0800)
948 #if (NTDDI_VERSION >= NTDDI_VISTA)
949 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
952 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
957 // Service Start Types
959 #define SERVICE_BOOT_START 0x00000000
960 #define SERVICE_SYSTEM_START 0x00000001
961 #define SERVICE_AUTO_START 0x00000002
962 #define SERVICE_DEMAND_START 0x00000003
963 #define SERVICE_DISABLED 0x00000004
968 #define EXCEPTION_NONCONTINUABLE 1
969 #define EXCEPTION_MAXIMUM_PARAMETERS 15
971 typedef struct _EXCEPTION_RECORD
{
972 NTSTATUS ExceptionCode
;
973 ULONG ExceptionFlags
;
974 struct _EXCEPTION_RECORD
*ExceptionRecord
;
975 PVOID ExceptionAddress
;
976 ULONG NumberParameters
;
977 ULONG_PTR ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
978 } EXCEPTION_RECORD
, *PEXCEPTION_RECORD
;
980 typedef struct _EXCEPTION_RECORD32
{
981 NTSTATUS ExceptionCode
;
982 ULONG ExceptionFlags
;
983 ULONG ExceptionRecord
;
984 ULONG ExceptionAddress
;
985 ULONG NumberParameters
;
986 ULONG ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
987 } EXCEPTION_RECORD32
, *PEXCEPTION_RECORD32
;
989 typedef struct _EXCEPTION_RECORD64
{
990 NTSTATUS ExceptionCode
;
991 ULONG ExceptionFlags
;
992 ULONG64 ExceptionRecord
;
993 ULONG64 ExceptionAddress
;
994 ULONG NumberParameters
;
995 ULONG __unusedAlignment
;
996 ULONG64 ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
997 } EXCEPTION_RECORD64
, *PEXCEPTION_RECORD64
;
999 typedef struct _EXCEPTION_POINTERS
{
1000 PEXCEPTION_RECORD ExceptionRecord
;
1001 PCONTEXT ContextRecord
;
1002 } EXCEPTION_POINTERS
, *PEXCEPTION_POINTERS
;
1009 typedef struct _QUOTA_LIMITS
{
1010 SIZE_T PagedPoolLimit
;
1011 SIZE_T NonPagedPoolLimit
;
1012 SIZE_T MinimumWorkingSetSize
;
1013 SIZE_T MaximumWorkingSetSize
;
1014 SIZE_T PagefileLimit
;
1015 LARGE_INTEGER TimeLimit
;
1016 } QUOTA_LIMITS
, *PQUOTA_LIMITS
;
1018 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
1019 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
1020 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
1021 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
1022 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
1025 /******************************************************************************
1026 * WINBASE Functions *
1027 ******************************************************************************/
1028 #if !defined(_WINBASE_)
1032 #define InterlockedPopEntrySList(Head) \
1033 ExpInterlockedPopEntrySList(Head)
1035 #define InterlockedPushEntrySList(Head, Entry) \
1036 ExpInterlockedPushEntrySList(Head, Entry)
1038 #define InterlockedFlushSList(Head) \
1039 ExpInterlockedFlushSList(Head)
1041 #define QueryDepthSList(Head) \
1042 ExQueryDepthSList(Head)
1044 #else // !defined(_WIN64)
1049 InterlockedPopEntrySList(
1050 IN PSLIST_HEADER ListHead
);
1055 InterlockedPushEntrySList(
1056 IN PSLIST_HEADER ListHead
,
1057 IN PSLIST_ENTRY ListEntry
);
1059 #define InterlockedFlushSList(ListHead) \
1060 ExInterlockedFlushSList(ListHead)
1062 #define QueryDepthSList(Head) \
1063 ExQueryDepthSList(Head)
1065 #endif // !defined(_WIN64)
1067 #endif // !defined(_WINBASE_)
1070 /******************************************************************************
1072 ******************************************************************************/
1074 typedef struct _DISPATCHER_HEADER
1076 __GNU_EXTENSION
union
1078 __GNU_EXTENSION
struct
1081 __GNU_EXTENSION
union
1086 __GNU_EXTENSION
union
1091 __GNU_EXTENSION
union
1094 BOOLEAN DebugActive
;
1100 LIST_ENTRY WaitListHead
;
1101 } DISPATCHER_HEADER
, *PDISPATCHER_HEADER
;
1103 typedef ULONG_PTR KSPIN_LOCK
, *PKSPIN_LOCK
;
1105 typedef struct _KEVENT
{
1106 DISPATCHER_HEADER Header
;
1107 } KEVENT
, *PKEVENT
, *RESTRICTED_POINTER PRKEVENT
;
1109 typedef struct _KSEMAPHORE
{
1110 DISPATCHER_HEADER Header
;
1112 } KSEMAPHORE
, *PKSEMAPHORE
, *RESTRICTED_POINTER PRKSEMAPHORE
;
1114 /******************************************************************************
1116 ******************************************************************************/
1118 #define RTL_REGISTRY_ABSOLUTE 0
1119 #define RTL_REGISTRY_SERVICES 1
1120 #define RTL_REGISTRY_CONTROL 2
1121 #define RTL_REGISTRY_WINDOWS_NT 3
1122 #define RTL_REGISTRY_DEVICEMAP 4
1123 #define RTL_REGISTRY_USER 5
1124 #define RTL_REGISTRY_MAXIMUM 6
1125 #define RTL_REGISTRY_HANDLE 0x40000000
1126 #define RTL_REGISTRY_OPTIONAL 0x80000000
1128 /* RTL_QUERY_REGISTRY_TABLE.Flags */
1129 #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001
1130 #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002
1131 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004
1132 #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008
1133 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010
1134 #define RTL_QUERY_REGISTRY_DIRECT 0x00000020
1135 #define RTL_QUERY_REGISTRY_DELETE 0x00000040
1137 typedef struct _RTL_BITMAP
{
1140 } RTL_BITMAP
, *PRTL_BITMAP
;
1142 typedef struct _RTL_BITMAP_RUN
{
1143 ULONG StartingIndex
;
1145 } RTL_BITMAP_RUN
, *PRTL_BITMAP_RUN
;
1148 (DDKAPI
*PRTL_QUERY_REGISTRY_ROUTINE
)(
1152 IN ULONG ValueLength
,
1154 IN PVOID EntryContext
);
1156 typedef struct _RTL_QUERY_REGISTRY_TABLE
{
1157 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine
;
1163 ULONG DefaultLength
;
1164 } RTL_QUERY_REGISTRY_TABLE
, *PRTL_QUERY_REGISTRY_TABLE
;
1166 typedef struct _TIME_FIELDS
{
1173 CSHORT Milliseconds
;
1175 } TIME_FIELDS
, *PTIME_FIELDS
;
1178 /******************************************************************************
1180 ******************************************************************************/
1186 IN PVOID FailedAssertion
,
1188 IN ULONG LineNumber
,
1193 * IN VOID UNALIGNED *Destination,
1194 * IN CONST VOID UNALIGNED *Source,
1197 #define RtlCopyMemory(Destination, Source, Length) \
1198 memcpy(Destination, Source, Length)
1200 #define RtlCopyBytes RtlCopyMemory
1202 #if defined(_M_AMD64)
1206 RtlCopyMemoryNonTemporal(
1207 VOID UNALIGNED
*Destination
,
1208 CONST VOID UNALIGNED
*Source
,
1211 #define RtlCopyMemoryNonTemporal RtlCopyMemory
1219 #define RtlEqualLuid(Luid1, Luid2) \
1220 (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
1224 * IN VOID UNALIGNED *Destination,
1225 * IN CONST VOID UNALIGNED *Source,
1228 #define RtlEqualMemory(Destination, Source, Length) \
1229 (!memcmp(Destination, Source, Length))
1233 * IN VOID UNALIGNED *Destination,
1237 #define RtlFillMemory(Destination, Length, Fill) \
1238 memset(Destination, Fill, Length)
1240 #define RtlFillBytes RtlFillMemory
1245 RtlFreeUnicodeString(
1246 IN PUNICODE_STRING UnicodeString
);
1252 IN PUNICODE_STRING GuidString
,
1258 RtlInitUnicodeString(
1259 IN OUT PUNICODE_STRING DestinationString
,
1260 IN PCWSTR SourceString
);
1264 * IN VOID UNALIGNED *Destination,
1265 * IN CONST VOID UNALIGNED *Source,
1268 #define RtlMoveMemory(Destination, Source, Length) \
1269 memmove(Destination, Source, Length)
1276 OUT PUNICODE_STRING GuidString
);
1280 * IN VOID UNALIGNED *Destination,
1283 #define RtlZeroMemory(Destination, Length) \
1284 memset(Destination, 0, Length)
1286 #define RtlZeroBytes RtlZeroMemory
1289 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1294 IN PRTL_BITMAP BitMapHeader
,
1295 IN ULONG StartingIndex
,
1302 IN PRTL_BITMAP BitMapHeader
,
1303 IN ULONG StartingIndex
,
1309 RtlAnsiStringToUnicodeString(
1310 IN OUT PUNICODE_STRING DestinationString
,
1311 IN PANSI_STRING SourceString
,
1312 IN BOOLEAN AllocateDestinationString
);
1317 RtlxAnsiStringToUnicodeSize(
1318 IN PCANSI_STRING AnsiString
);
1320 #define RtlAnsiStringToUnicodeSize(String) ( \
1321 NLS_MB_CODE_PAGE_TAG ? \
1322 RtlxAnsiStringToUnicodeSize(String) : \
1323 ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
1329 RtlAppendUnicodeStringToString(
1330 IN OUT PUNICODE_STRING Destination
,
1331 IN PCUNICODE_STRING Source
);
1336 RtlAppendUnicodeToString(
1337 IN OUT PUNICODE_STRING Destination
,
1343 RtlCheckRegistryKey(
1344 IN ULONG RelativeTo
,
1351 IN PRTL_BITMAP BitMapHeader
);
1357 IN PRTL_BITMAP BitMapHeader
,
1358 IN ULONG StartingIndex
,
1359 IN ULONG NumberToClear
);
1365 IN CONST VOID
*Source1
,
1366 IN CONST VOID
*Source2
,
1372 RtlCompareUnicodeString(
1373 IN PCUNICODE_STRING String1
,
1374 IN PCUNICODE_STRING String2
,
1375 IN BOOLEAN CaseInSensitive
);
1380 RtlCompareUnicodeStrings(
1382 IN SIZE_T String1Length
,
1384 IN SIZE_T String2Length
,
1385 IN BOOLEAN CaseInSensitive
);
1390 RtlCopyUnicodeString(
1391 IN OUT PUNICODE_STRING DestinationString
,
1392 IN PCUNICODE_STRING SourceString
);
1397 RtlCreateRegistryKey(
1398 IN ULONG RelativeTo
,
1404 RtlCreateSecurityDescriptor(
1405 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
1411 RtlDeleteRegistryValue(
1412 IN ULONG RelativeTo
,
1414 IN PCWSTR ValueName
);
1419 RtlEqualUnicodeString(
1420 IN CONST UNICODE_STRING
*String1
,
1421 IN CONST UNICODE_STRING
*String2
,
1422 IN BOOLEAN CaseInSensitive
);
1424 #if !defined(_AMD64_) && !defined(_IA64_)
1428 RtlExtendedIntegerMultiply(
1429 IN LARGE_INTEGER Multiplicand
,
1430 IN LONG Multiplier
);
1435 RtlExtendedLargeIntegerDivide(
1436 IN LARGE_INTEGER Dividend
,
1438 IN OUT PULONG Remainder
);
1441 #if defined(_X86_) || defined(_IA64_)
1445 RtlExtendedMagicDivide(
1446 IN LARGE_INTEGER Dividend
,
1447 IN LARGE_INTEGER MagicDivisor
,
1448 IN CCHAR ShiftCount
);
1455 IN PANSI_STRING AnsiString
);
1461 IN PRTL_BITMAP BitMapHeader
,
1462 IN ULONG NumberToFind
,
1463 IN ULONG HintIndex
);
1468 RtlFindClearBitsAndSet(
1469 IN PRTL_BITMAP BitMapHeader
,
1470 IN ULONG NumberToFind
,
1471 IN ULONG HintIndex
);
1476 RtlFindFirstRunClear(
1477 IN PRTL_BITMAP BitMapHeader
,
1478 OUT PULONG StartingIndex
);
1484 IN PRTL_BITMAP BitMapHeader
,
1485 OUT PRTL_BITMAP_RUN RunArray
,
1486 IN ULONG SizeOfRunArray
,
1487 IN BOOLEAN LocateLongestRuns
);
1492 RtlFindLastBackwardRunClear(
1493 IN PRTL_BITMAP BitMapHeader
,
1495 OUT PULONG StartingRunIndex
);
1500 RtlFindLeastSignificantBit(
1506 RtlFindLongestRunClear(
1507 IN PRTL_BITMAP BitMapHeader
,
1508 OUT PULONG StartingIndex
);
1513 RtlFindMostSignificantBit(
1519 RtlFindNextForwardRunClear(
1520 IN PRTL_BITMAP BitMapHeader
,
1522 OUT PULONG StartingRunIndex
);
1528 IN PRTL_BITMAP BitMapHeader
,
1529 IN ULONG NumberToFind
,
1530 IN ULONG HintIndex
);
1535 RtlFindSetBitsAndClear(
1536 IN PRTL_BITMAP BitMapHeader
,
1537 IN ULONG NumberToFind
,
1538 IN ULONG HintIndex
);
1543 RtlHashUnicodeString(
1544 IN CONST UNICODE_STRING
*String
,
1545 IN BOOLEAN CaseInSensitive
,
1546 IN ULONG HashAlgorithm
,
1547 OUT PULONG HashValue
);
1553 IN OUT PANSI_STRING DestinationString
,
1554 IN PCSZ SourceString
);
1559 RtlInitializeBitMap(
1560 IN PRTL_BITMAP BitMapHeader
,
1561 IN PULONG BitMapBuffer
,
1562 IN ULONG SizeOfBitMap
);
1568 IN OUT PSTRING DestinationString
,
1569 IN PCSZ SourceString
);
1574 RtlIntegerToUnicodeString(
1576 IN ULONG Base OPTIONAL
,
1577 IN OUT PUNICODE_STRING String
);
1582 RtlInt64ToUnicodeString(
1584 IN ULONG Base OPTIONAL
,
1585 IN OUT PUNICODE_STRING String
);
1588 #define RtlIntPtrToUnicodeString(Value, Base, String) \
1589 RtlInt64ToUnicodeString(Value, Base, String)
1591 #define RtlIntPtrToUnicodeString(Value, Base, String) \
1592 RtlIntegerToUnicodeString(Value, Base, String)
1599 #define RtlIsZeroLuid(_L1) \
1600 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
1605 RtlLengthSecurityDescriptor(
1606 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
1611 RtlNumberOfClearBits(
1612 IN PRTL_BITMAP BitMapHeader
);
1618 IN PRTL_BITMAP BitMapHeader
);
1623 RtlQueryRegistryValues(
1624 IN ULONG RelativeTo
,
1626 IN PRTL_QUERY_REGISTRY_TABLE QueryTable
,
1628 IN PVOID Environment OPTIONAL
);
1630 #define LONG_SIZE (sizeof(LONG))
1631 #define LONG_MASK (LONG_SIZE - 1)
1635 * PULONG DestinationAddress,
1636 * PULONG SourceAddress);
1638 #if defined(_AMD64_)
1639 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
1640 *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
1642 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
1643 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
1645 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
1646 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
1647 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
1648 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
1652 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
1657 * RtlRetrieveUshort(
1658 * PUSHORT DestinationAddress,
1659 * PUSHORT SourceAddress);
1661 #if defined(_AMD64_)
1662 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
1663 *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
1665 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
1666 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
1668 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
1669 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
1673 *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
1681 IN PRTL_BITMAP BitMapHeader
);
1687 IN PRTL_BITMAP BitMapHeader
,
1688 IN ULONG StartingIndex
,
1689 IN ULONG NumberToSet
);
1694 RtlSetDaclSecurityDescriptor(
1695 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
1696 IN BOOLEAN DaclPresent
,
1697 IN PACL Dacl OPTIONAL
,
1698 IN BOOLEAN DaclDefaulted OPTIONAL
);
1702 * IN PULONG Address,
1705 #if defined(_AMD64_)
1706 #define RtlStoreUlong(Address,Value) \
1707 *(ULONG UNALIGNED *)(Address) = (Value)
1709 #define RtlStoreUlong(Address,Value) \
1710 if ((ULONG_PTR)(Address) & LONG_MASK) { \
1711 ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
1712 ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
1713 ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
1714 ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT] = (UCHAR)(FOURTHBYTE(Value)); \
1717 *((PULONG)(Address)) = (ULONG) (Value); \
1722 * RtlStoreUlonglong(
1723 * IN OUT PULONGLONG Address,
1726 #if defined(_AMD64_)
1727 #define RtlStoreUlonglong(Address,Value) \
1728 *(ULONGLONG UNALIGNED *)(Address) = (Value)
1730 #define RtlStoreUlonglong(Address,Value) \
1731 if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
1732 RtlStoreUlong((ULONG_PTR)(Address), \
1733 (ULONGLONG)(Value) & 0xFFFFFFFF); \
1734 RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
1735 (ULONGLONG)(Value) >> 32); \
1737 *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
1743 * IN OUT PULONG_PTR Address,
1744 * IN ULONG_PTR Value);
1747 #define RtlStoreUlongPtr(Address,Value) \
1748 RtlStoreUlonglong(Address,Value)
1750 #define RtlStoreUlongPtr(Address,Value) \
1751 RtlStoreUlong(Address,Value)
1756 * IN PUSHORT Address,
1759 #if defined(_AMD64_)
1760 #define RtlStoreUshort(Address,Value) \
1761 *(USHORT UNALIGNED *)(Address) = (Value)
1763 #define RtlStoreUshort(Address,Value) \
1764 if ((ULONG_PTR)(Address) & SHORT_MASK) { \
1765 ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
1766 ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
1769 *((PUSHORT) (Address)) = (USHORT)Value; \
1776 RtlTimeFieldsToTime(
1777 IN PTIME_FIELDS TimeFields
,
1778 IN PLARGE_INTEGER Time
);
1783 RtlTimeToTimeFields(
1784 IN PLARGE_INTEGER Time
,
1785 IN PTIME_FIELDS TimeFields
);
1796 RtlUlonglongByteSwap(
1797 IN ULONGLONG Source
);
1802 RtlUnicodeStringToAnsiString(
1803 IN OUT PANSI_STRING DestinationString
,
1804 IN PCUNICODE_STRING SourceString
,
1805 IN BOOLEAN AllocateDestinationString
);
1810 RtlxUnicodeStringToAnsiSize(
1811 IN PCUNICODE_STRING UnicodeString
);
1813 #define RtlUnicodeStringToAnsiSize(String) ( \
1814 NLS_MB_CODE_PAGE_TAG ? \
1815 RtlxUnicodeStringToAnsiSize(String) : \
1816 ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
1822 RtlUnicodeStringToInteger(
1823 IN PCUNICODE_STRING String
,
1824 IN ULONG Base OPTIONAL
,
1830 RtlUpcaseUnicodeChar(
1831 IN WCHAR SourceCharacter
);
1842 RtlValidRelativeSecurityDescriptor(
1843 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput
,
1844 IN ULONG SecurityDescriptorLength
,
1845 IN SECURITY_INFORMATION RequiredInformation
);
1850 RtlValidSecurityDescriptor(
1851 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
1856 RtlWriteRegistryValue(
1857 IN ULONG RelativeTo
,
1859 IN PCWSTR ValueName
,
1862 IN ULONG ValueLength
);
1864 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
1866 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
1870 RtlPrefetchMemoryNonTemporal(
1875 #if (NTDDI_VERSION >= NTDDI_WINXP)
1880 PRTL_BITMAP BitMapHeader
,
1886 RtlDowncaseUnicodeChar(
1887 IN WCHAR SourceCharacter
);
1893 PRTL_BITMAP BitMapHeader
,
1900 IN PRTL_BITMAP BitMapHeader
,
1901 IN ULONG BitNumber
);
1903 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
1905 #if (NTDDI_VERSION >= NTDDI_VISTA)
1909 RtlNumberOfSetBitsUlongPtr(
1910 IN ULONG_PTR Target
);
1915 RtlIoDecodeMemIoResource (
1916 IN PIO_RESOURCE_DESCRIPTOR Descriptor
,
1917 OUT PULONGLONG Alignment OPTIONAL
,
1918 OUT PULONGLONG MinimumAddress OPTIONAL
,
1919 OUT PULONGLONG MaximumAddress OPTIONAL
);
1924 RtlIoEncodeMemIoResource(
1925 IN PIO_RESOURCE_DESCRIPTOR Descriptor
,
1927 IN ULONGLONG Length
,
1928 IN ULONGLONG Alignment
,
1929 IN ULONGLONG MinimumAddress
,
1930 IN ULONGLONG MaximumAddress
);
1935 RtlCmDecodeMemIoResource(
1936 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor
,
1937 OUT PULONGLONG Start OPTIONAL
);
1942 RtlFindClosestEncodableLength(
1943 IN ULONGLONG SourceLength
,
1944 OUT PULONGLONG TargetLength
);
1948 #if !defined(MIDL_PASS)
1949 /* inline funftions */
1950 //DECLSPEC_DEPRECATED_DDK_WINXP
1954 RtlConvertLongToLargeInteger(LONG SignedInteger
)
1957 ret
.QuadPart
= SignedInteger
;
1961 //DECLSPEC_DEPRECATED_DDK_WINXP
1965 RtlConvertUlongToLargeInteger(
1966 ULONG UnsignedInteger
)
1969 ret
.QuadPart
= UnsignedInteger
;
1973 //DECLSPEC_DEPRECATED_DDK
1977 RtlEnlargedUnsignedDivide(
1978 IN ULARGE_INTEGER Dividend
,
1980 IN OUT PULONG Remainder
)
1983 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
1984 return (ULONG
)(Dividend
.QuadPart
/ Divisor
);
1987 //DECLSPEC_DEPRECATED_DDK
1991 RtlEnlargedUnsignedMultiply(
1992 IN ULONG Multiplicand
,
1993 IN ULONG Multiplier
)
1996 ret
.QuadPart
= (ULONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
2000 //DECLSPEC_DEPRECATED_DDK
2004 RtlEnlargedIntegerMultiply(
2005 IN LONG Multiplicand
,
2009 ret
.QuadPart
= (LONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
2015 RtlInitEmptyAnsiString(OUT PANSI_STRING AnsiString
,
2017 IN USHORT BufferSize
)
2019 AnsiString
->Length
= 0;
2020 AnsiString
->MaximumLength
= BufferSize
;
2021 AnsiString
->Buffer
= Buffer
;
2026 RtlInitEmptyUnicodeString(
2027 OUT PUNICODE_STRING UnicodeString
,
2029 IN USHORT BufferSize
)
2031 UnicodeString
->Length
= 0;
2032 UnicodeString
->MaximumLength
= BufferSize
;
2033 UnicodeString
->Buffer
= Buffer
;
2036 #if defined(_AMD64_) || defined(_IA64_)
2040 RtlExtendedIntegerMultiply(
2041 LARGE_INTEGER Multiplicand
,
2045 ret
.QuadPart
= Multiplicand
.QuadPart
* Multiplier
;
2052 RtlExtendedLargeIntegerDivide(
2053 LARGE_INTEGER Dividend
,
2058 ret
.QuadPart
= (ULONG64
)Dividend
.QuadPart
/ Divisor
;
2060 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
2065 #if defined(_AMD64_)
2067 #define MultiplyHigh __mulh
2068 #define UnsignedMultiplyHigh __umulh
2070 //DECLSPEC_DEPRECATED_DDK
2074 RtlExtendedMagicDivide(
2075 IN LARGE_INTEGER Dividend
,
2076 IN LARGE_INTEGER MagicDivisor
,
2077 IN CCHAR ShiftCount
)
2082 Pos
= (Dividend
.QuadPart
>= 0);
2083 ret64
= UnsignedMultiplyHigh(Pos
? Dividend
.QuadPart
: -Dividend
.QuadPart
,
2084 MagicDivisor
.QuadPart
);
2085 ret64
>>= ShiftCount
;
2086 ret
.QuadPart
= Pos
? ret64
: -ret64
;
2091 //DECLSPEC_DEPRECATED_DDK
2096 IN LARGE_INTEGER Addend1
,
2097 IN LARGE_INTEGER Addend2
)
2100 ret
.QuadPart
= Addend1
.QuadPart
+ Addend2
.QuadPart
;
2105 * RtlLargeIntegerAnd(
2106 * IN OUT LARGE_INTEGER Result,
2107 * IN LARGE_INTEGER Source,
2108 * IN LARGE_INTEGER Mask);
2110 #define RtlLargeIntegerAnd(Result, Source, Mask) \
2111 Result.QuadPart = Source.QuadPart & Mask.QuadPart
2113 //DECLSPEC_DEPRECATED_DDK
2117 RtlLargeIntegerArithmeticShift(
2118 IN LARGE_INTEGER LargeInteger
,
2119 IN CCHAR ShiftCount
)
2122 ret
.QuadPart
= LargeInteger
.QuadPart
>> ShiftCount
;
2127 * RtlLargeIntegerEqualTo(
2128 * IN LARGE_INTEGER Operand1,
2129 * IN LARGE_INTEGER Operand2);
2131 #define RtlLargeIntegerEqualTo(X,Y) \
2132 (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
2136 RtlSecureZeroMemory(
2140 volatile char* vptr
= (volatile char*)Pointer
;
2141 #if defined(_M_AMD64)
2142 __stosb((PUCHAR
)vptr
, 0, Size
);
2144 char * endptr
= (char *)vptr
+ Size
;
2145 while (vptr
< endptr
)
2153 #if defined(_M_AMD64)
2157 IN PRTL_BITMAP BitMapHeader
,
2158 IN ULONG BitPosition
)
2160 return BitTest((LONG CONST
*)BitMapHeader
->Buffer
, BitPosition
);
2163 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
2164 #endif // defined(_M_AMD64)
2166 #endif // !defined(MIDL_PASS)
2169 // Byte Swap Functions
2171 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \
2172 ((defined(_M_AMD64) || defined(_M_IA64)) \
2173 && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))
2175 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
2176 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
2177 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
2181 /******************************************************************************
2182 * Memory manager Types *
2183 ******************************************************************************/
2185 typedef struct _MDL
{
2189 struct _EPROCESS
*Process
;
2190 PVOID MappedSystemVa
;
2197 /******************************************************************************
2198 * Memory manager Functions *
2199 ******************************************************************************/
2201 /* PVOID MmGetSystemAddressForMdl(
2204 #define MmGetSystemAddressForMdl(Mdl) \
2205 (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
2206 MDL_SOURCE_IS_NONPAGED_POOL)) ? \
2207 ((Mdl)->MappedSystemVa) : \
2208 (MmMapLockedPages((Mdl), KernelMode)))
2211 * MmGetSystemAddressForMdlSafe(
2213 * IN MM_PAGE_PRIORITY Priority)
2215 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
2216 (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
2217 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
2218 (_Mdl)->MappedSystemVa : \
2219 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
2220 KernelMode, MmCached, NULL, FALSE, (_Priority)))
2222 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2227 IN PMDL MemoryDescriptorList OPTIONAL
,
2234 /******************************************************************************
2235 * I/O Manager Functions *
2236 ******************************************************************************/
2238 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
2239 (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
2241 #define DMA_MACROS_DEFINED
2245 IoAllocateAdapterChannel(
2246 IN PADAPTER_OBJECT AdapterObject
,
2247 IN PDEVICE_OBJECT DeviceObject
,
2248 IN ULONG NumberOfMapRegisters
,
2249 IN PDRIVER_CONTROL ExecutionRoutine
,
2252 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel
;
2253 AllocateAdapterChannel
=
2254 *(DmaAdapter
)->DmaOperations
->AllocateAdapterChannel
;
2255 ASSERT(AllocateAdapterChannel
);
2256 return AllocateAdapterChannel(DmaAdapter
,
2258 NumberOfMapRegisters
,
2265 IoFlushAdapterBuffers(
2266 IN PADAPTER_OBJECT AdapterObject
,
2268 IN PVOID MapRegisterBase
,
2271 IN BOOLEAN WriteToDevice
)
2273 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers
;
2274 FlushAdapterBuffers
= *(DmaAdapter
)->DmaOperations
->FlushAdapterBuffers
;
2275 ASSERT(FlushAdapterBuffers
);
2276 return FlushAdapterBuffers(DmaAdapter
,
2286 IoFreeAdapterChannel(
2287 IN PADAPTER_OBJECT AdapterObject
)
2289 PFREE_ADAPTER_CHANNEL FreeAdapterChannel
;
2290 FreeAdapterChannel
= *(DmaAdapter
)->DmaOperations
->FreeAdapterChannel
;
2291 ASSERT(FreeAdapterChannel
);
2292 FreeAdapterChannel(DmaAdapter
);
2298 IN PADAPTER_OBJECT AdapterObject
,
2299 IN PVOID MapRegisterBase
,
2300 IN ULONG NumberOfMapRegisters
)
2302 PFREE_MAP_REGISTERS FreeMapRegisters
;
2303 FreeMapRegisters
= *(DmaAdapter
)->DmaOperations
->FreeMapRegisters
;
2304 ASSERT(FreeMapRegisters
);
2305 FreeMapRegisters(DmaAdapter
, MapRegisterBase
, NumberOfMapRegisters
);
2311 IN PDMA_ADAPTER DmaAdapter
,
2313 IN PVOID MapRegisterBase
,
2315 IN OUT PULONG Length
,
2316 IN BOOLEAN WriteToDevice
)
2318 PMAP_TRANSFER MapTransfer
;
2320 MapTransfer
= *(DmaAdapter
)->DmaOperations
->MapTransfer
;
2321 ASSERT(MapTransfer
);
2322 return MapTransfer(DmaAdapter
,
2332 /******************************************************************************
2334 ******************************************************************************/
2336 typedef enum _POOL_TYPE
{
2339 NonPagedPoolMustSucceed
,
2341 NonPagedPoolCacheAligned
,
2342 PagedPoolCacheAligned
,
2343 NonPagedPoolCacheAlignedMustS
,
2345 NonPagedPoolSession
= 32,
2347 NonPagedPoolMustSucceedSession
,
2348 DontUseThisTypeSession
,
2349 NonPagedPoolCacheAlignedSession
,
2350 PagedPoolCacheAlignedSession
,
2351 NonPagedPoolCacheAlignedMustSSession
2354 typedef enum _SUITE_TYPE
{
2358 CommunicationServer
,
2360 SmallBusinessRestricted
,
2369 typedef enum _EX_POOL_PRIORITY
{
2371 LowPoolPrioritySpecialPoolOverrun
= 8,
2372 LowPoolPrioritySpecialPoolUnderrun
= 9,
2373 NormalPoolPriority
= 16,
2374 NormalPoolPrioritySpecialPoolOverrun
= 24,
2375 NormalPoolPrioritySpecialPoolUnderrun
= 25,
2376 HighPoolPriority
= 32,
2377 HighPoolPrioritySpecialPoolOverrun
= 40,
2378 HighPoolPrioritySpecialPoolUnderrun
= 41
2381 typedef struct _FAST_MUTEX
2388 } FAST_MUTEX
, *PFAST_MUTEX
;
2390 typedef ULONG_PTR ERESOURCE_THREAD
, *PERESOURCE_THREAD
;
2392 typedef struct _OWNER_ENTRY
{
2393 ERESOURCE_THREAD OwnerThread
;
2394 _ANONYMOUS_UNION
union {
2398 } OWNER_ENTRY
, *POWNER_ENTRY
;
2400 typedef struct _ERESOURCE
2402 LIST_ENTRY SystemResourcesList
;
2403 POWNER_ENTRY OwnerTable
;
2406 volatile PKSEMAPHORE SharedWaiters
;
2407 volatile PKEVENT ExclusiveWaiters
;
2408 OWNER_ENTRY OwnerEntry
;
2409 ULONG ActiveEntries
;
2410 ULONG ContentionCount
;
2411 ULONG NumberOfSharedWaiters
;
2412 ULONG NumberOfExclusiveWaiters
;
2413 __GNU_EXTENSION
union
2416 ULONG_PTR CreatorBackTraceIndex
;
2418 KSPIN_LOCK SpinLock
;
2419 } ERESOURCE
, *PERESOURCE
;
2421 #if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
2422 #define LOOKASIDE_ALIGN
2424 #define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */
2427 typedef struct _LOOKASIDE_LIST_EX
*PLOOKASIDE_LIST_EX
;
2430 (DDKAPI
*PALLOCATE_FUNCTION
)(
2431 IN POOL_TYPE PoolType
,
2432 IN SIZE_T NumberOfBytes
,
2436 (DDKAPI
*PALLOCATE_FUNCTION_EX
)(
2437 IN POOL_TYPE PoolType
,
2438 IN SIZE_T NumberOfBytes
,
2440 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
2443 (DDKAPI
*PFREE_FUNCTION
)(
2447 (DDKAPI
*PFREE_FUNCTION_EX
)(
2449 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
2452 (DDKAPI
*PCALLBACK_FUNCTION
)(
2453 IN PVOID CallbackContext
,
2455 IN PVOID Argument2
);
2457 typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE
{
2459 SLIST_HEADER ListHead
;
2460 SINGLE_LIST_ENTRY SingleListHead
;
2463 USHORT MaximumDepth
;
2464 ULONG TotalAllocates
;
2466 ULONG AllocateMisses
;
2478 PALLOCATE_FUNCTION_EX AllocateEx
;
2479 PALLOCATE_FUNCTION Allocate
;
2482 PFREE_FUNCTION_EX FreeEx
;
2483 PFREE_FUNCTION Free
;
2485 LIST_ENTRY ListEntry
;
2486 ULONG LastTotalAllocates
;
2488 ULONG LastAllocateMisses
;
2489 ULONG LastAllocateHits
;
2492 } GENERAL_LOOKASIDE
, *PGENERAL_LOOKASIDE
;
2494 typedef struct _PAGED_LOOKASIDE_LIST
{
2495 GENERAL_LOOKASIDE L
;
2496 #if !defined(_AMD64_) && !defined(_IA64_)
2497 FAST_MUTEX Lock__ObsoleteButDoNotDelete
;
2499 } PAGED_LOOKASIDE_LIST
, *PPAGED_LOOKASIDE_LIST
;
2501 typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST
{
2502 GENERAL_LOOKASIDE L
;
2503 #if !defined(_AMD64_) && !defined(_IA64_)
2504 KSPIN_LOCK Lock__ObsoleteButDoNotDelete
;
2506 } NPAGED_LOOKASIDE_LIST
, *PNPAGED_LOOKASIDE_LIST
;
2508 //typedef struct _LOOKASIDE_LIST_EX {
2509 // GENERAL_LOOKASIDE_POOL L;
2510 //} LOOKASIDE_LIST_EX, *PLOOKASIDE_LIST_EX;
2512 typedef struct _EX_RUNDOWN_REF
{
2513 __GNU_EXTENSION
union {
2514 volatile ULONG_PTR Count
;
2517 } EX_RUNDOWN_REF
, *PEX_RUNDOWN_REF
;
2519 typedef struct _EX_RUNDOWN_REF_CACHE_AWARE
*PEX_RUNDOWN_REF_CACHE_AWARE
;
2521 typedef enum _WORK_QUEUE_TYPE
{
2524 HyperCriticalWorkQueue
,
2529 (DDKAPI
*PWORKER_THREAD_ROUTINE
)(
2530 IN PVOID Parameter
);
2532 typedef struct _WORK_QUEUE_ITEM
{
2534 PWORKER_THREAD_ROUTINE WorkerRoutine
;
2535 volatile PVOID Parameter
;
2536 } WORK_QUEUE_ITEM
, *PWORK_QUEUE_ITEM
;
2539 /******************************************************************************
2540 * Executive Functions *
2541 ******************************************************************************/
2544 #if defined(_NTHAL_)
2545 #define ExAcquireFastMutex ExiAcquireFastMutex
2546 #define ExReleaseFastMutex ExiReleaseFastMutex
2547 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
2549 #define ExInterlockedAddUlong ExfInterlockedAddUlong
2550 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
2551 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
2552 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
2553 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
2554 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
2559 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
2560 defined(_NTHAL_) || defined(_NTOSP_)
2563 ExQueryDepthSList(IN PSLIST_HEADER ListHead
);
2567 ExQueryDepthSList(IN PSLIST_HEADER ListHead
)
2569 return (USHORT
)(ListHead
->Alignment
& 0xffff);
2575 ExpInterlockedFlushSList(
2576 PSLIST_HEADER ListHead
);
2580 ExpInterlockedPopEntrySList(
2581 PSLIST_HEADER ListHead
);
2585 ExpInterlockedPushEntrySList(
2586 PSLIST_HEADER ListHead
,
2587 PSLIST_ENTRY ListEntry
);
2589 #define ExInterlockedFlushSList(Head) \
2590 ExpInterlockedFlushSList(Head)
2591 #define ExInterlockedPopEntrySList(Head, Lock) \
2592 ExpInterlockedPopEntrySList(Head)
2593 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
2594 ExpInterlockedPushEntrySList(Head, Entry)
2596 #else // !defined(_WIN64)
2598 #define ExQueryDepthSList(listhead) (listhead)->Depth
2603 ExInterlockedFlushSList(
2604 IN PSLIST_HEADER ListHead
);
2606 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
2610 ExInterlockedPopEntrySList(
2611 IN PSLIST_HEADER ListHead
,
2612 IN PKSPIN_LOCK Lock
);
2617 ExInterlockedPushEntrySList(
2618 IN PSLIST_HEADER ListHead
,
2619 IN PSINGLE_LIST_ENTRY ListEntry
,
2620 IN PKSPIN_LOCK Lock
);
2622 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
2623 InterlockedPopEntrySList(_ListHead)
2624 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
2625 InterlockedPushEntrySList(_ListHead, _ListEntry)
2626 #endif // _WIN2K_COMPAT_SLIST_USAGE
2628 #endif // !defined(_WIN64)
2631 * ExGetCurrentResourceThread(
2634 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread())
2636 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
2639 * ExInitializeWorkItem(
2640 * IN PWORK_QUEUE_ITEM Item,
2641 * IN PWORKER_THREAD_ROUTINE Routine,
2644 #define ExInitializeWorkItem(Item, Routine, Context) \
2646 (Item)->WorkerRoutine = Routine; \
2647 (Item)->Parameter = Context; \
2648 (Item)->List.Flink = NULL; \
2651 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2657 IN OUT PFAST_MUTEX FastMutex
);
2663 IN OUT PFAST_MUTEX FastMutex
);
2668 ExTryToAcquireFastMutex(
2669 IN OUT PFAST_MUTEX FastMutex
);
2674 ExAcquireFastMutexUnsafe(
2675 IN OUT PFAST_MUTEX FastMutex
);
2680 ExReleaseFastMutexUnsafe(
2681 IN OUT PFAST_MUTEX FastMutex
);
2686 ExAcquireResourceExclusiveLite(
2687 IN PERESOURCE Resource
,
2693 ExAcquireResourceSharedLite(
2694 IN PERESOURCE Resource
,
2700 ExAcquireSharedStarveExclusive(
2701 IN PERESOURCE Resource
,
2707 ExAcquireSharedWaitForExclusive(
2708 IN PERESOURCE Resource
,
2715 IN POOL_TYPE PoolType
,
2716 IN SIZE_T NumberOfBytes
);
2719 #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
2720 #endif /* POOL_TAGGING */
2725 ExAllocatePoolWithQuota(
2726 IN POOL_TYPE PoolType
,
2727 IN SIZE_T NumberOfBytes
);
2730 #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
2731 #endif /* POOL_TAGGING */
2736 ExAllocatePoolWithQuotaTag(
2737 IN POOL_TYPE PoolType
,
2738 IN SIZE_T NumberOfBytes
,
2741 #ifndef POOL_TAGGING
2742 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
2743 #endif /* POOL_TAGGING */
2748 ExAllocatePoolWithTag(
2749 IN POOL_TYPE PoolType
,
2750 IN SIZE_T NumberOfBytes
,
2756 ExAllocatePoolWithTagPriority(
2757 IN POOL_TYPE PoolType
,
2758 IN SIZE_T NumberOfBytes
,
2760 IN EX_POOL_PRIORITY Priority
);
2765 ExConvertExclusiveToSharedLite(
2766 IN PERESOURCE Resource
);
2772 OUT PCALLBACK_OBJECT
*CallbackObject
,
2773 IN POBJECT_ATTRIBUTES ObjectAttributes
,
2775 IN BOOLEAN AllowMultipleCallbacks
);
2780 ExDeleteNPagedLookasideList(
2781 IN PNPAGED_LOOKASIDE_LIST Lookaside
);
2786 ExDeletePagedLookasideList(
2787 IN PPAGED_LOOKASIDE_LIST Lookaside
);
2792 ExDeleteResourceLite(
2793 IN PERESOURCE Resource
);
2802 #define ExFreePool(P) ExFreePoolWithTag(P, 0)
2815 ExGetExclusiveWaiterCount(
2816 IN PERESOURCE Resource
);
2827 ExGetSharedWaiterCount(
2828 IN PERESOURCE Resource
);
2833 ExInitializeNPagedLookasideList(
2834 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
2835 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
2836 IN PFREE_FUNCTION Free OPTIONAL
,
2845 ExInitializePagedLookasideList(
2846 IN PPAGED_LOOKASIDE_LIST Lookaside
,
2847 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
2848 IN PFREE_FUNCTION Free OPTIONAL
,
2857 ExInitializeResourceLite(
2858 IN PERESOURCE Resource
);
2863 ExInterlockedAddLargeInteger(
2864 IN PLARGE_INTEGER Addend
,
2865 IN LARGE_INTEGER Increment
,
2866 IN PKSPIN_LOCK Lock
);
2869 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
2870 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
2872 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
2873 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
2879 ExInterlockedAddUlong(
2884 #if defined(_AMD64_) || defined(_IA64_)
2885 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
2886 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
2887 #elif defined(_X86_)
2891 ExfInterlockedCompareExchange64(
2892 IN OUT LONGLONG
volatile *Destination
,
2893 IN PLONGLONG Exchange
,
2894 IN PLONGLONG Comperand
);
2895 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
2896 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
2901 ExInterlockedCompareExchange64(
2902 IN OUT LONGLONG
volatile *Destination
,
2903 IN PLONGLONG Exchange
,
2904 IN PLONGLONG Comparand
,
2905 IN PKSPIN_LOCK Lock
);
2911 ExInterlockedInsertHeadList(
2912 IN PLIST_ENTRY ListHead
,
2913 IN PLIST_ENTRY ListEntry
,
2914 IN PKSPIN_LOCK Lock
);
2919 ExInterlockedInsertTailList(
2920 IN PLIST_ENTRY ListHead
,
2921 IN PLIST_ENTRY ListEntry
,
2922 IN PKSPIN_LOCK Lock
);
2927 ExInterlockedPopEntryList(
2928 IN PSINGLE_LIST_ENTRY ListHead
,
2929 IN PKSPIN_LOCK Lock
);
2934 ExInterlockedPushEntryList(
2935 IN PSINGLE_LIST_ENTRY ListHead
,
2936 IN PSINGLE_LIST_ENTRY ListEntry
,
2937 IN PKSPIN_LOCK Lock
);
2942 ExInterlockedRemoveHeadList(
2943 IN PLIST_ENTRY ListHead
,
2944 IN PKSPIN_LOCK Lock
);
2949 ExIsProcessorFeaturePresent(
2950 IN ULONG ProcessorFeature
);
2955 ExIsResourceAcquiredExclusiveLite(
2956 IN PERESOURCE Resource
);
2961 ExIsResourceAcquiredSharedLite(
2962 IN PERESOURCE Resource
);
2964 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
2969 ExLocalTimeToSystemTime(
2970 IN PLARGE_INTEGER LocalTime
,
2971 OUT PLARGE_INTEGER SystemTime
);
2977 IN PCALLBACK_OBJECT CallbackObject
,
2979 IN PVOID Argument2
);
2985 IN PWORK_QUEUE_ITEM WorkItem
,
2986 IN WORK_QUEUE_TYPE QueueType
);
2993 IN NTSTATUS Status
);
2999 IN PCALLBACK_OBJECT CallbackObject
,
3000 IN PCALLBACK_FUNCTION CallbackFunction
,
3001 IN PVOID CallbackContext
);
3006 ExReinitializeResourceLite(
3007 IN PERESOURCE Resource
);
3012 ExReleaseResourceForThreadLite(
3013 IN PERESOURCE Resource
,
3014 IN ERESOURCE_THREAD ResourceThreadId
);
3019 ExReleaseResourceLite(
3020 IN PERESOURCE Resource
);
3025 ExSetResourceOwnerPointer(
3026 IN PERESOURCE Resource
,
3027 IN PVOID OwnerPointer
);
3032 ExSetTimerResolution(
3033 IN ULONG DesiredTime
,
3034 IN BOOLEAN SetResolution
);
3039 ExSystemTimeToLocalTime(
3040 IN PLARGE_INTEGER SystemTime
,
3041 OUT PLARGE_INTEGER LocalTime
);
3046 ExUnregisterCallback(
3047 IN PVOID CbRegistration
);
3050 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
3052 #if (NTDDI_VERSION >= NTDDI_WINXP)
3056 ExAcquireRundownProtection(
3057 IN OUT PEX_RUNDOWN_REF RunRef
);
3062 ExInitializeRundownProtection(
3063 OUT PEX_RUNDOWN_REF RunRef
);
3068 ExReInitializeRundownProtection(
3069 OUT PEX_RUNDOWN_REF RunRef
);
3074 ExReleaseRundownProtection(
3075 IN OUT PEX_RUNDOWN_REF RunRef
);
3081 OUT PEX_RUNDOWN_REF RunRef
);
3087 IN SUITE_TYPE SuiteType
);
3092 ExWaitForRundownProtectionRelease(
3093 IN OUT PEX_RUNDOWN_REF RunRef
);
3095 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
3097 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
3101 ExAcquireRundownProtectionEx(
3102 IN OUT PEX_RUNDOWN_REF RunRef
,
3108 ExReleaseRundownProtectionEx(
3109 IN OUT PEX_RUNDOWN_REF RunRef
,
3111 #endif // (NTDDI_VERSION >= NTDDI_WINXPSP2)
3113 #if (NTDDI_VERSION >= NTDDI_WS03)
3115 #endif // (NTDDI_VERSION >= NTDDI_WS03)
3117 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
3119 PEX_RUNDOWN_REF_CACHE_AWARE
3120 ExAllocateCacheAwareRundownProtection(
3121 IN POOL_TYPE PoolType
,
3126 ExSizeOfRundownProtectionCacheAware(VOID
);
3128 #endif // (NTDDI_VERSION >= NTDDI_WS03SP1)
3130 #if (NTDDI_VERSION >= NTDDI_VISTA)
3133 ExInitializeLookasideListEx(
3134 OUT PLOOKASIDE_LIST_EX Lookaside
,
3135 IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL
,
3136 IN PFREE_FUNCTION_EX Free OPTIONAL
,
3137 IN POOL_TYPE PoolType
,
3145 #if !defined(MIDL_PASS)
3147 static __inline PVOID
3148 ExAllocateFromNPagedLookasideList(
3149 IN PNPAGED_LOOKASIDE_LIST Lookaside
)
3153 Lookaside
->L
.TotalAllocates
++;
3154 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
3155 if (Entry
== NULL
) {
3156 Lookaside
->L
.AllocateMisses
++;
3157 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
3164 static __inline PVOID
3165 ExAllocateFromPagedLookasideList(
3166 IN PPAGED_LOOKASIDE_LIST Lookaside
)
3170 Lookaside
->L
.TotalAllocates
++;
3171 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
3172 if (Entry
== NULL
) {
3173 Lookaside
->L
.AllocateMisses
++;
3174 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
3181 static __inline VOID
3182 ExFreeToNPagedLookasideList(
3183 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
3186 Lookaside
->L
.TotalFrees
++;
3187 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
3188 Lookaside
->L
.FreeMisses
++;
3189 (Lookaside
->L
.Free
)(Entry
);
3191 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
3195 static __inline VOID
3196 ExFreeToPagedLookasideList(
3197 IN PPAGED_LOOKASIDE_LIST Lookaside
,
3200 Lookaside
->L
.TotalFrees
++;
3201 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
3202 Lookaside
->L
.FreeMisses
++;
3203 (Lookaside
->L
.Free
)(Entry
);
3205 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
3210 #endif // !defined(MIDL_PASS)