14 #endif /* GUID_DEFINED */
22 #define NTKERNELAPI DECLSPEC_IMPORT
25 #define PORT_MAXIMUM_MESSAGE_LENGTH 512
27 #define PORT_MAXIMUM_MESSAGE_LENGTH 256
32 typedef UCHAR KPROCESSOR_MODE
;
33 typedef LONG KPRIORITY
;
34 typedef PVOID PSECURITY_DESCRIPTOR
;
35 typedef ULONG SECURITY_INFORMATION
, *PSECURITY_INFORMATION
;
37 /* Structures not exposed to drivers */
38 typedef struct _OBJECT_TYPE
*POBJECT_TYPE
;
39 typedef struct _HAL_DISPATCH_TABLE
*PHAL_DISPATCH_TABLE
;
40 typedef struct _HAL_PRIVATE_DISPATCH_TABLE
*PHAL_PRIVATE_DISPATCH_TABLE
;
41 typedef struct _DEVICE_HANDLER_OBJECT
*PDEVICE_HANDLER_OBJECT
;
42 typedef struct _BUS_HANDLER
*PBUS_HANDLER
;
44 typedef struct _ADAPTER_OBJECT
*PADAPTER_OBJECT
;
45 typedef struct _CALLBACK_OBJECT
*PCALLBACK_OBJECT
;
46 typedef struct _ETHREAD
*PETHREAD
;
47 typedef struct _EPROCESS
*PEPROCESS
;
48 typedef struct _IO_TIMER
*PIO_TIMER
;
49 typedef struct _KINTERRUPT
*PKINTERRUPT
;
50 typedef struct _KPROCESS
*PKPROCESS
;
51 typedef struct _KTHREAD
*PKTHREAD
, *PRKTHREAD
;
54 typedef struct _CONTEXT
*PCONTEXT
;
57 // Resource list definitions
59 typedef int CM_RESOURCE_TYPE
;
61 #define CmResourceTypeNull 0
62 #define CmResourceTypePort 1
63 #define CmResourceTypeInterrupt 2
64 #define CmResourceTypeMemory 3
65 #define CmResourceTypeDma 4
66 #define CmResourceTypeDeviceSpecific 5
67 #define CmResourceTypeBusNumber 6
68 #define CmResourceTypeNonArbitrated 128
69 #define CmResourceTypeConfigData 128
70 #define CmResourceTypeDevicePrivate 129
71 #define CmResourceTypePcCardConfig 130
72 #define CmResourceTypeMfCardConfig 131
74 typedef enum _INTERFACE_TYPE
{
75 InterfaceTypeUndefined
= -1,
93 } INTERFACE_TYPE
, *PINTERFACE_TYPE
;
95 /* IO_RESOURCE_DESCRIPTOR.Option */
97 #define IO_RESOURCE_PREFERRED 0x01
98 #define IO_RESOURCE_DEFAULT 0x02
99 #define IO_RESOURCE_ALTERNATIVE 0x08
101 typedef struct _IO_RESOURCE_DESCRIPTOR
{
104 UCHAR ShareDisposition
;
112 PHYSICAL_ADDRESS MinimumAddress
;
113 PHYSICAL_ADDRESS MaximumAddress
;
118 PHYSICAL_ADDRESS MinimumAddress
;
119 PHYSICAL_ADDRESS MaximumAddress
;
126 ULONG MinimumChannel
;
127 ULONG MaximumChannel
;
132 PHYSICAL_ADDRESS MinimumAddress
;
133 PHYSICAL_ADDRESS MaximumAddress
;
150 } IO_RESOURCE_DESCRIPTOR
, *PIO_RESOURCE_DESCRIPTOR
;
152 typedef struct _IO_RESOURCE_LIST
{
156 IO_RESOURCE_DESCRIPTOR Descriptors
[1];
157 } IO_RESOURCE_LIST
, *PIO_RESOURCE_LIST
;
159 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST
{
161 INTERFACE_TYPE InterfaceType
;
165 ULONG AlternativeLists
;
166 IO_RESOURCE_LIST List
[1];
167 } IO_RESOURCE_REQUIREMENTS_LIST
, *PIO_RESOURCE_REQUIREMENTS_LIST
;
172 extern ULONG NtGlobalFlag
;
175 #include <pshpack4.h>
176 typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR
{
178 UCHAR ShareDisposition
;
182 PHYSICAL_ADDRESS Start
;
186 PHYSICAL_ADDRESS Start
;
194 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
212 PHYSICAL_ADDRESS Start
;
232 } DeviceSpecificData
;
233 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
235 PHYSICAL_ADDRESS Start
;
239 PHYSICAL_ADDRESS Start
;
243 PHYSICAL_ADDRESS Start
;
248 } CM_PARTIAL_RESOURCE_DESCRIPTOR
, *PCM_PARTIAL_RESOURCE_DESCRIPTOR
;
252 // Section map options
254 typedef enum _SECTION_INHERIT
{
260 // Section access rights
262 #define SECTION_QUERY 0x0001
263 #define SECTION_MAP_WRITE 0x0002
264 #define SECTION_MAP_READ 0x0004
265 #define SECTION_MAP_EXECUTE 0x0008
266 #define SECTION_EXTEND_SIZE 0x0010
267 #define SECTION_MAP_EXECUTE_EXPLICIT 0x0020
269 #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
270 SECTION_MAP_WRITE | \
272 SECTION_MAP_EXECUTE | \
275 #define SESSION_QUERY_ACCESS 0x0001
276 #define SESSION_MODIFY_ACCESS 0x0002
278 #define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
279 SESSION_QUERY_ACCESS | \
280 SESSION_MODIFY_ACCESS)
284 #define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
286 #define PAGE_NOACCESS 0x01
287 #define PAGE_READONLY 0x02
288 #define PAGE_READWRITE 0x04
289 #define PAGE_WRITECOPY 0x08
290 #define PAGE_EXECUTE 0x10
291 #define PAGE_EXECUTE_READ 0x20
292 #define PAGE_EXECUTE_READWRITE 0x40
293 #define PAGE_EXECUTE_WRITECOPY 0x80
294 #define PAGE_GUARD 0x100
295 #define PAGE_NOCACHE 0x200
296 #define PAGE_WRITECOMBINE 0x400
298 #define MEM_COMMIT 0x1000
299 #define MEM_RESERVE 0x2000
300 #define MEM_DECOMMIT 0x4000
301 #define MEM_RELEASE 0x8000
302 #define MEM_FREE 0x10000
303 #define MEM_PRIVATE 0x20000
304 #define MEM_MAPPED 0x40000
305 #define MEM_RESET 0x80000
306 #define MEM_TOP_DOWN 0x100000
307 #define MEM_LARGE_PAGES 0x20000000
308 #define MEM_4MB_PAGES 0x80000000
310 #define SEC_RESERVE 0x4000000
311 #define SEC_LARGE_PAGES 0x80000000
313 #define PROCESS_DUP_HANDLE (0x0040)
315 #if (NTDDI_VERSION >= NTDDI_VISTA)
316 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
319 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
326 // Processor features
328 #define PF_FLOATING_POINT_PRECISION_ERRATA 0
329 #define PF_FLOATING_POINT_EMULATED 1
330 #define PF_COMPARE_EXCHANGE_DOUBLE 2
331 #define PF_MMX_INSTRUCTIONS_AVAILABLE 3
332 #define PF_PPC_MOVEMEM_64BIT_OK 4
333 #define PF_ALPHA_BYTE_INSTRUCTIONS 5
334 #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
335 #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
336 #define PF_RDTSC_INSTRUCTION_AVAILABLE 8
337 #define PF_PAE_ENABLED 9
338 #define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
339 #define PF_SSE_DAZ_MODE_AVAILABLE 11
340 #define PF_NX_ENABLED 12
341 #define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
342 #define PF_COMPARE_EXCHANGE128 14
343 #define PF_COMPARE64_EXCHANGE128 15
344 #define PF_CHANNELS_ENABLED 16
349 // Intrinsics (note: taken from our winnt.h)
352 #if defined(__GNUC__)
354 static __inline__ BOOLEAN
355 InterlockedBitTestAndSet(IN LONG
volatile *Base
,
360 __asm__
__volatile__("lock "
363 :"=r" (OldBit
),"+m" (*Base
)
368 return (_InterlockedOr(Base
, 1 << Bit
) >> Bit
) & 1;
372 static __inline__ BOOLEAN
373 InterlockedBitTestAndReset(IN LONG
volatile *Base
,
378 __asm__
__volatile__("lock "
381 :"=r" (OldBit
),"+m" (*Base
)
386 return (_InterlockedAnd(Base
, ~(1 << Bit
)) >> Bit
) & 1;
392 #define BitScanForward _BitScanForward
393 #define BitScanReverse _BitScanReverse
395 #define BitTest _bittest
396 #define BitTestAndComplement _bittestandcomplement
397 #define BitTestAndSet _bittestandset
398 #define BitTestAndReset _bittestandreset
399 #define InterlockedBitTestAndSet _interlockedbittestandset
400 #define InterlockedBitTestAndReset _interlockedbittestandreset
403 /** INTERLOCKED FUNCTIONS *****************************************************/
405 #if !defined(__INTERLOCKED_DECLARED)
406 #define __INTERLOCKED_DECLARED
409 #if defined(NO_INTERLOCKED_INTRINSICS)
413 InterlockedIncrement(
414 IN OUT LONG
volatile *Addend
);
419 InterlockedDecrement(
420 IN OUT LONG
volatile *Addend
);
425 InterlockedCompareExchange(
426 IN OUT LONG
volatile *Destination
,
434 IN OUT LONG
volatile *Destination
,
440 InterlockedExchangeAdd(
441 IN OUT LONG
volatile *Addend
,
444 #else // !defined(NO_INTERLOCKED_INTRINSICS)
446 #define InterlockedExchange _InterlockedExchange
447 #define InterlockedIncrement _InterlockedIncrement
448 #define InterlockedDecrement _InterlockedDecrement
449 #define InterlockedExchangeAdd _InterlockedExchangeAdd
450 #define InterlockedCompareExchange _InterlockedCompareExchange
451 #define InterlockedOr _InterlockedOr
452 #define InterlockedAnd _InterlockedAnd
453 #define InterlockedXor _InterlockedXor
455 #endif // !defined(NO_INTERLOCKED_INTRINSICS)
457 #endif // defined (_X86_)
459 #if !defined (_WIN64)
462 * InterlockedExchangePointer(
463 * IN OUT PVOID volatile *Target,
466 #define InterlockedExchangePointer(Target, Value) \
467 ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
471 * InterlockedCompareExchangePointer(
472 * IN OUT PVOID *Destination,
474 * IN PVOID Comparand)
476 #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
477 ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
479 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
480 #define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
481 #define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
483 #endif // !defined (_WIN64)
485 #if defined (_M_AMD64)
487 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONGLONG *)a, (LONGLONG)b)
488 #define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONGLONG *)a)
489 #define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONGLONG *)a)
490 #define InterlockedAnd _InterlockedAnd
491 #define InterlockedOr _InterlockedOr
492 #define InterlockedXor _InterlockedXor
493 #define InterlockedIncrement _InterlockedIncrement
494 #define InterlockedDecrement _InterlockedDecrement
495 #define InterlockedAdd _InterlockedAdd
496 #define InterlockedExchange _InterlockedExchange
497 #define InterlockedExchangeAdd _InterlockedExchangeAdd
498 #define InterlockedCompareExchange _InterlockedCompareExchange
499 #define InterlockedAnd64 _InterlockedAnd64
500 #define InterlockedOr64 _InterlockedOr64
501 #define InterlockedXor64 _InterlockedXor64
502 #define InterlockedIncrement64 _InterlockedIncrement64
503 #define InterlockedDecrement64 _InterlockedDecrement64
504 #define InterlockedAdd64 _InterlockedAdd64
505 #define InterlockedExchange64 _InterlockedExchange64
506 #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
507 #define InterlockedCompareExchange64 _InterlockedCompareExchange64
508 #define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
509 #define InterlockedExchangePointer _InterlockedExchangePointer
510 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
511 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
515 #if defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
516 //#if !defined(_X86AMD64_) // FIXME: what's _X86AMD64_ used for?
520 IN OUT LONG64
volatile *Addend
,
523 return InterlockedExchangeAdd64(Addend
, Value
) + Value
;
528 #endif /* !__INTERLOCKED_DECLARED */
531 #define YieldProcessor _mm_pause
532 #elif defined (_M_AMD64)
533 #define YieldProcessor _mm_pause
534 #elif defined(_M_PPC)
535 #define YieldProcessor() __asm__ __volatile__("nop");
536 #elif defined(_M_MIPS)
537 #define YieldProcessor() __asm__ __volatile__("nop");
538 #elif defined(_M_ARM)
539 #define YieldProcessor()
541 #error Unknown architecture
549 #ifndef _SLIST_HEADER_
550 #define _SLIST_HEADER_
552 #define SLIST_ENTRY SINGLE_LIST_ENTRY
553 #define _SLIST_ENTRY _SINGLE_LIST_ENTRY
554 #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
557 typedef union _SLIST_HEADER
{
564 ULONGLONG Sequence
:9;
565 ULONGLONG NextEntry
:39;
566 ULONGLONG HeaderType
:1;
568 ULONGLONG Reserved
:59;
573 ULONGLONG Sequence
:48;
574 ULONGLONG HeaderType
:1;
576 ULONGLONG Reserved
:2;
577 ULONGLONG NextEntry
:60;
579 } SLIST_HEADER
, *PSLIST_HEADER
;
581 typedef union _SLIST_HEADER
{
588 } SLIST_HEADER
, *PSLIST_HEADER
;
591 #endif /* _SLIST_HEADER_ */
596 // Power States/Levels
598 typedef enum _SYSTEM_POWER_STATE
{
599 PowerSystemUnspecified
,
601 PowerSystemSleeping1
,
602 PowerSystemSleeping2
,
603 PowerSystemSleeping3
,
604 PowerSystemHibernate
,
607 } SYSTEM_POWER_STATE
, *PSYSTEM_POWER_STATE
;
609 #define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
611 typedef enum _POWER_INFORMATION_LEVEL
{
614 VerifySystemPolicyAc
,
615 VerifySystemPolicyDc
,
616 SystemPowerCapabilities
,
618 SystemPowerStateHandler
,
619 ProcessorStateHandler
,
620 SystemPowerPolicyCurrent
,
621 AdministratorPowerPolicy
,
622 SystemReserveHiberFile
,
623 ProcessorInformation
,
624 SystemPowerInformation
,
625 ProcessorStateHandler2
,
628 SystemExecutionState
,
629 SystemPowerStateNotifyHandler
,
630 ProcessorPowerPolicyAc
,
631 ProcessorPowerPolicyDc
,
632 VerifyProcessorPowerPolicyAc
,
633 VerifyProcessorPowerPolicyDc
,
634 ProcessorPowerPolicyCurrent
635 } POWER_INFORMATION_LEVEL
;
641 PowerActionHibernate
,
643 PowerActionShutdownReset
,
644 PowerActionShutdownOff
,
646 } POWER_ACTION
, *PPOWER_ACTION
;
648 typedef enum _DEVICE_POWER_STATE
{
649 PowerDeviceUnspecified
,
655 } DEVICE_POWER_STATE
, *PDEVICE_POWER_STATE
;
657 #define ES_SYSTEM_REQUIRED 0x00000001
658 #define ES_DISPLAY_REQUIRED 0x00000002
659 #define ES_USER_PRESENT 0x00000004
660 #define ES_CONTINUOUS 0x80000000
662 typedef ULONG EXECUTION_STATE
;
672 // Access/Security Stuff
674 typedef ULONG ACCESS_MASK
, *PACCESS_MASK
;
675 typedef PVOID PACCESS_TOKEN
;
677 #define DELETE 0x00010000L
678 #define READ_CONTROL 0x00020000L
679 #define WRITE_DAC 0x00040000L
680 #define WRITE_OWNER 0x00080000L
681 #define SYNCHRONIZE 0x00100000L
682 #define STANDARD_RIGHTS_REQUIRED 0x000F0000L
683 #define STANDARD_RIGHTS_READ READ_CONTROL
684 #define STANDARD_RIGHTS_WRITE READ_CONTROL
685 #define STANDARD_RIGHTS_EXECUTE READ_CONTROL
686 #define STANDARD_RIGHTS_ALL 0x001F0000L
687 #define SPECIFIC_RIGHTS_ALL 0x0000FFFFL
688 #define ACCESS_SYSTEM_SECURITY 0x01000000L
689 #define MAXIMUM_ALLOWED 0x02000000L
690 #define GENERIC_READ 0x80000000L
691 #define GENERIC_WRITE 0x40000000L
692 #define GENERIC_EXECUTE 0x20000000L
693 #define GENERIC_ALL 0x10000000L
695 typedef struct _GENERIC_MAPPING
{
696 ACCESS_MASK GenericRead
;
697 ACCESS_MASK GenericWrite
;
698 ACCESS_MASK GenericExecute
;
699 ACCESS_MASK GenericAll
;
700 } GENERIC_MAPPING
, *PGENERIC_MAPPING
;
702 #define ACL_REVISION 2
703 #define ACL_REVISION_DS 4
705 #define ACL_REVISION1 1
706 #define ACL_REVISION2 2
707 #define ACL_REVISION3 3
708 #define ACL_REVISION4 4
709 #define MIN_ACL_REVISION ACL_REVISION2
710 #define MAX_ACL_REVISION ACL_REVISION4
712 typedef struct _ACL
{
723 // Current security descriptor revision value
725 #define SECURITY_DESCRIPTOR_REVISION (1)
726 #define SECURITY_DESCRIPTOR_REVISION1 (1)
729 // Privilege attributes
731 #define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
732 #define SE_PRIVILEGE_ENABLED (0x00000002L)
733 #define SE_PRIVILEGE_REMOVED (0X00000004L)
734 #define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
736 #define SE_PRIVILEGE_VALID_ATTRIBUTES (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
737 SE_PRIVILEGE_ENABLED | \
738 SE_PRIVILEGE_REMOVED | \
739 SE_PRIVILEGE_USED_FOR_ACCESS)
741 #include <pshpack4.h>
742 typedef struct _LUID_AND_ATTRIBUTES
{
745 } LUID_AND_ATTRIBUTES
, *PLUID_AND_ATTRIBUTES
;
747 typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY
[ANYSIZE_ARRAY
];
748 typedef LUID_AND_ATTRIBUTES_ARRAY
*PLUID_AND_ATTRIBUTES_ARRAY
;
755 #define PRIVILEGE_SET_ALL_NECESSARY (1)
757 typedef struct _PRIVILEGE_SET
{
758 ULONG PrivilegeCount
;
760 LUID_AND_ATTRIBUTES Privilege
[ANYSIZE_ARRAY
];
761 } PRIVILEGE_SET
,*PPRIVILEGE_SET
;
763 typedef enum _SECURITY_IMPERSONATION_LEVEL
{
765 SecurityIdentification
,
766 SecurityImpersonation
,
768 } SECURITY_IMPERSONATION_LEVEL
, * PSECURITY_IMPERSONATION_LEVEL
;
770 #define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
771 #define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
772 #define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
773 #define VALID_IMPERSONATION_LEVEL(Level) (((Level) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((Level) <= SECURITY_MAX_IMPERSONATION_LEVEL))
775 #define SECURITY_DYNAMIC_TRACKING (TRUE)
776 #define SECURITY_STATIC_TRACKING (FALSE)
778 typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE
, *PSECURITY_CONTEXT_TRACKING_MODE
;
780 typedef struct _SECURITY_QUALITY_OF_SERVICE
{
782 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
;
783 SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode
;
784 BOOLEAN EffectiveOnly
;
785 } SECURITY_QUALITY_OF_SERVICE
, *PSECURITY_QUALITY_OF_SERVICE
;
787 typedef struct _SE_IMPERSONATION_STATE
{
790 BOOLEAN EffectiveOnly
;
791 SECURITY_IMPERSONATION_LEVEL Level
;
792 } SE_IMPERSONATION_STATE
, *PSE_IMPERSONATION_STATE
;
794 #define OWNER_SECURITY_INFORMATION (0x00000001L)
795 #define GROUP_SECURITY_INFORMATION (0x00000002L)
796 #define DACL_SECURITY_INFORMATION (0x00000004L)
797 #define SACL_SECURITY_INFORMATION (0x00000008L)
798 #define LABEL_SECURITY_INFORMATION (0x00000010L)
800 #define PROTECTED_DACL_SECURITY_INFORMATION (0x80000000L)
801 #define PROTECTED_SACL_SECURITY_INFORMATION (0x40000000L)
802 #define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L)
803 #define UNPROTECTED_SACL_SECURITY_INFORMATION (0x10000000L)
808 // Registry Access Rights
810 #define KEY_QUERY_VALUE (0x0001)
811 #define KEY_SET_VALUE (0x0002)
812 #define KEY_CREATE_SUB_KEY (0x0004)
813 #define KEY_ENUMERATE_SUB_KEYS (0x0008)
814 #define KEY_NOTIFY (0x0010)
815 #define KEY_CREATE_LINK (0x0020)
816 #define KEY_WOW64_32KEY (0x0200)
817 #define KEY_WOW64_64KEY (0x0100)
818 #define KEY_WOW64_RES (0x0300)
820 #define KEY_READ ((STANDARD_RIGHTS_READ |\
822 KEY_ENUMERATE_SUB_KEYS |\
827 #define KEY_WRITE ((STANDARD_RIGHTS_WRITE |\
829 KEY_CREATE_SUB_KEY) \
833 #define KEY_EXECUTE ((KEY_READ) \
837 #define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL |\
840 KEY_CREATE_SUB_KEY |\
841 KEY_ENUMERATE_SUB_KEYS |\
848 // Registry Open/Create Options
850 #define REG_OPTION_RESERVED (0x00000000L)
851 #define REG_OPTION_NON_VOLATILE (0x00000000L)
852 #define REG_OPTION_VOLATILE (0x00000001L)
853 #define REG_OPTION_CREATE_LINK (0x00000002L)
854 #define REG_OPTION_BACKUP_RESTORE (0x00000004L)
855 #define REG_OPTION_OPEN_LINK (0x00000008L)
857 #define REG_LEGAL_OPTION \
858 (REG_OPTION_RESERVED |\
859 REG_OPTION_NON_VOLATILE |\
860 REG_OPTION_VOLATILE |\
861 REG_OPTION_CREATE_LINK |\
862 REG_OPTION_BACKUP_RESTORE |\
863 REG_OPTION_OPEN_LINK)
866 // Key creation/open disposition
868 #define REG_CREATED_NEW_KEY (0x00000001L)
869 #define REG_OPENED_EXISTING_KEY (0x00000002L)
872 // Key restore & hive load flags
874 #define REG_WHOLE_HIVE_VOLATILE (0x00000001L)
875 #define REG_REFRESH_HIVE (0x00000002L)
876 #define REG_NO_LAZY_FLUSH (0x00000004L)
877 #define REG_FORCE_RESTORE (0x00000008L)
878 #define REG_APP_HIVE (0x00000010L)
879 #define REG_PROCESS_PRIVATE (0x00000020L)
880 #define REG_START_JOURNAL (0x00000040L)
881 #define REG_HIVE_EXACT_FILE_GROWTH (0x00000080L)
882 #define REG_HIVE_NO_RM (0x00000100L)
883 #define REG_HIVE_SINGLE_LOG (0x00000200L)
888 #define REG_FORCE_UNLOAD 1
891 // Notify Filter Values
893 #define REG_NOTIFY_CHANGE_NAME (0x00000001L)
894 #define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L)
895 #define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L)
896 #define REG_NOTIFY_CHANGE_SECURITY (0x00000008L)
898 #define REG_LEGAL_CHANGE_FILTER \
899 (REG_NOTIFY_CHANGE_NAME |\
900 REG_NOTIFY_CHANGE_ATTRIBUTES |\
901 REG_NOTIFY_CHANGE_LAST_SET |\
902 REG_NOTIFY_CHANGE_SECURITY)
907 // Thread Access Rights
909 #define THREAD_TERMINATE (0x0001)
910 #define THREAD_SUSPEND_RESUME (0x0002)
911 #define THREAD_ALERT (0x0004)
912 #define THREAD_GET_CONTEXT (0x0008)
913 #define THREAD_SET_CONTEXT (0x0010)
914 #define THREAD_SET_INFORMATION (0x0020)
915 #define THREAD_SET_LIMITED_INFORMATION (0x0400)
916 #define THREAD_QUERY_LIMITED_INFORMATION (0x0800)
917 #if (NTDDI_VERSION >= NTDDI_VISTA)
918 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
921 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
926 // Service Start Types
928 #define SERVICE_BOOT_START 0x00000000
929 #define SERVICE_SYSTEM_START 0x00000001
930 #define SERVICE_AUTO_START 0x00000002
931 #define SERVICE_DEMAND_START 0x00000003
932 #define SERVICE_DISABLED 0x00000004
937 #define EXCEPTION_NONCONTINUABLE 1
938 #define EXCEPTION_MAXIMUM_PARAMETERS 15
940 typedef struct _EXCEPTION_RECORD
{
941 NTSTATUS ExceptionCode
;
942 ULONG ExceptionFlags
;
943 struct _EXCEPTION_RECORD
*ExceptionRecord
;
944 PVOID ExceptionAddress
;
945 ULONG NumberParameters
;
946 ULONG_PTR ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
947 } EXCEPTION_RECORD
, *PEXCEPTION_RECORD
;
949 typedef struct _EXCEPTION_RECORD32
{
950 NTSTATUS ExceptionCode
;
951 ULONG ExceptionFlags
;
952 ULONG ExceptionRecord
;
953 ULONG ExceptionAddress
;
954 ULONG NumberParameters
;
955 ULONG ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
956 } EXCEPTION_RECORD32
, *PEXCEPTION_RECORD32
;
958 typedef struct _EXCEPTION_RECORD64
{
959 NTSTATUS ExceptionCode
;
960 ULONG ExceptionFlags
;
961 ULONG64 ExceptionRecord
;
962 ULONG64 ExceptionAddress
;
963 ULONG NumberParameters
;
964 ULONG __unusedAlignment
;
965 ULONG64 ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
966 } EXCEPTION_RECORD64
, *PEXCEPTION_RECORD64
;
968 typedef struct _EXCEPTION_POINTERS
{
969 PEXCEPTION_RECORD ExceptionRecord
;
970 PCONTEXT ContextRecord
;
971 } EXCEPTION_POINTERS
, *PEXCEPTION_POINTERS
;
978 typedef struct _QUOTA_LIMITS
{
979 SIZE_T PagedPoolLimit
;
980 SIZE_T NonPagedPoolLimit
;
981 SIZE_T MinimumWorkingSetSize
;
982 SIZE_T MaximumWorkingSetSize
;
983 SIZE_T PagefileLimit
;
984 LARGE_INTEGER TimeLimit
;
985 } QUOTA_LIMITS
, *PQUOTA_LIMITS
;
987 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
988 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
989 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
990 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
991 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
994 /******************************************************************************
995 * WINBASE Functions *
996 ******************************************************************************/
997 #if !defined(_WINBASE_)
1001 #define InterlockedPopEntrySList(Head) \
1002 ExpInterlockedPopEntrySList(Head)
1004 #define InterlockedPushEntrySList(Head, Entry) \
1005 ExpInterlockedPushEntrySList(Head, Entry)
1007 #define InterlockedFlushSList(Head) \
1008 ExpInterlockedFlushSList(Head)
1010 #define QueryDepthSList(Head) \
1011 ExQueryDepthSList(Head)
1013 #else // !defined(_WIN64)
1018 InterlockedPopEntrySList(
1019 IN PSLIST_HEADER ListHead
);
1024 InterlockedPushEntrySList(
1025 IN PSLIST_HEADER ListHead
,
1026 IN PSLIST_ENTRY ListEntry
);
1028 #define InterlockedFlushSList(ListHead) \
1029 ExInterlockedFlushSList(ListHead)
1031 #define QueryDepthSList(Head) \
1032 ExQueryDepthSList(Head)
1034 #endif // !defined(_WIN64)
1036 #endif // !defined(_WINBASE_)
1039 /******************************************************************************
1041 ******************************************************************************/
1043 typedef struct _DISPATCHER_HEADER
1063 BOOLEAN DebugActive
;
1069 LIST_ENTRY WaitListHead
;
1070 } DISPATCHER_HEADER
, *PDISPATCHER_HEADER
;
1072 typedef ULONG_PTR KSPIN_LOCK
, *PKSPIN_LOCK
;
1074 typedef struct _KEVENT
{
1075 DISPATCHER_HEADER Header
;
1076 } KEVENT
, *PKEVENT
, *RESTRICTED_POINTER PRKEVENT
;
1078 typedef struct _KSEMAPHORE
{
1079 DISPATCHER_HEADER Header
;
1081 } KSEMAPHORE
, *PKSEMAPHORE
, *RESTRICTED_POINTER PRKSEMAPHORE
;
1083 /******************************************************************************
1085 ******************************************************************************/
1087 #define RTL_REGISTRY_ABSOLUTE 0
1088 #define RTL_REGISTRY_SERVICES 1
1089 #define RTL_REGISTRY_CONTROL 2
1090 #define RTL_REGISTRY_WINDOWS_NT 3
1091 #define RTL_REGISTRY_DEVICEMAP 4
1092 #define RTL_REGISTRY_USER 5
1093 #define RTL_REGISTRY_MAXIMUM 6
1094 #define RTL_REGISTRY_HANDLE 0x40000000
1095 #define RTL_REGISTRY_OPTIONAL 0x80000000
1097 /* RTL_QUERY_REGISTRY_TABLE.Flags */
1098 #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001
1099 #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002
1100 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004
1101 #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008
1102 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010
1103 #define RTL_QUERY_REGISTRY_DIRECT 0x00000020
1104 #define RTL_QUERY_REGISTRY_DELETE 0x00000040
1106 typedef struct _RTL_BITMAP
{
1109 } RTL_BITMAP
, *PRTL_BITMAP
;
1111 typedef struct _RTL_BITMAP_RUN
{
1112 ULONG StartingIndex
;
1114 } RTL_BITMAP_RUN
, *PRTL_BITMAP_RUN
;
1117 (DDKAPI
*PRTL_QUERY_REGISTRY_ROUTINE
)(
1121 IN ULONG ValueLength
,
1123 IN PVOID EntryContext
);
1125 typedef struct _RTL_QUERY_REGISTRY_TABLE
{
1126 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine
;
1132 ULONG DefaultLength
;
1133 } RTL_QUERY_REGISTRY_TABLE
, *PRTL_QUERY_REGISTRY_TABLE
;
1135 typedef struct _TIME_FIELDS
{
1142 CSHORT Milliseconds
;
1144 } TIME_FIELDS
, *PTIME_FIELDS
;
1147 /******************************************************************************
1149 ******************************************************************************/
1155 IN PVOID FailedAssertion
,
1157 IN ULONG LineNumber
,
1162 * IN VOID UNALIGNED *Destination,
1163 * IN CONST VOID UNALIGNED *Source,
1166 #define RtlCopyMemory(Destination, Source, Length) \
1167 memcpy(Destination, Source, Length)
1169 #define RtlCopyBytes RtlCopyMemory
1171 #if defined(_M_AMD64)
1175 RtlCopyMemoryNonTemporal(
1176 VOID UNALIGNED
*Destination
,
1177 CONST VOID UNALIGNED
*Source
,
1180 #define RtlCopyMemoryNonTemporal RtlCopyMemory
1188 #define RtlEqualLuid(Luid1, Luid2) \
1189 (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
1193 * IN VOID UNALIGNED *Destination,
1194 * IN CONST VOID UNALIGNED *Source,
1197 #define RtlEqualMemory(Destination, Source, Length) \
1198 (!memcmp(Destination, Source, Length))
1202 * IN VOID UNALIGNED *Destination,
1206 #define RtlFillMemory(Destination, Length, Fill) \
1207 memset(Destination, Fill, Length)
1209 #define RtlFillBytes RtlFillMemory
1214 RtlFreeUnicodeString(
1215 IN PUNICODE_STRING UnicodeString
);
1221 IN PUNICODE_STRING GuidString
,
1227 RtlInitUnicodeString(
1228 IN OUT PUNICODE_STRING DestinationString
,
1229 IN PCWSTR SourceString
);
1233 * IN VOID UNALIGNED *Destination,
1234 * IN CONST VOID UNALIGNED *Source,
1237 #define RtlMoveMemory(Destination, Source, Length) \
1238 memmove(Destination, Source, Length)
1245 OUT PUNICODE_STRING GuidString
);
1249 * IN VOID UNALIGNED *Destination,
1252 #define RtlZeroMemory(Destination, Length) \
1253 memset(Destination, 0, Length)
1255 #define RtlZeroBytes RtlZeroMemory
1258 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1263 IN PRTL_BITMAP BitMapHeader
,
1264 IN ULONG StartingIndex
,
1271 IN PRTL_BITMAP BitMapHeader
,
1272 IN ULONG StartingIndex
,
1278 RtlAnsiStringToUnicodeString(
1279 IN OUT PUNICODE_STRING DestinationString
,
1280 IN PANSI_STRING SourceString
,
1281 IN BOOLEAN AllocateDestinationString
);
1286 RtlxAnsiStringToUnicodeSize(
1287 IN PCANSI_STRING AnsiString
);
1289 #define RtlAnsiStringToUnicodeSize(String) ( \
1290 NLS_MB_CODE_PAGE_TAG ? \
1291 RtlxAnsiStringToUnicodeSize(String) : \
1292 ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
1298 RtlAppendUnicodeStringToString(
1299 IN OUT PUNICODE_STRING Destination
,
1300 IN PCUNICODE_STRING Source
);
1305 RtlAppendUnicodeToString(
1306 IN OUT PUNICODE_STRING Destination
,
1312 RtlCheckRegistryKey(
1313 IN ULONG RelativeTo
,
1320 IN PRTL_BITMAP BitMapHeader
);
1326 IN PRTL_BITMAP BitMapHeader
,
1327 IN ULONG StartingIndex
,
1328 IN ULONG NumberToClear
);
1334 IN CONST VOID
*Source1
,
1335 IN CONST VOID
*Source2
,
1341 RtlCompareUnicodeString(
1342 IN PCUNICODE_STRING String1
,
1343 IN PCUNICODE_STRING String2
,
1344 IN BOOLEAN CaseInSensitive
);
1349 RtlCompareUnicodeStrings(
1351 IN SIZE_T String1Length
,
1353 IN SIZE_T String2Length
,
1354 IN BOOLEAN CaseInSensitive
);
1359 RtlCopyUnicodeString(
1360 IN OUT PUNICODE_STRING DestinationString
,
1361 IN PCUNICODE_STRING SourceString
);
1366 RtlCreateRegistryKey(
1367 IN ULONG RelativeTo
,
1373 RtlCreateSecurityDescriptor(
1374 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
1380 RtlDeleteRegistryValue(
1381 IN ULONG RelativeTo
,
1383 IN PCWSTR ValueName
);
1388 RtlEqualUnicodeString(
1389 IN CONST UNICODE_STRING
*String1
,
1390 IN CONST UNICODE_STRING
*String2
,
1391 IN BOOLEAN CaseInSensitive
);
1393 #if !defined(_AMD64_) && !defined(_IA64_)
1397 RtlExtendedIntegerMultiply(
1398 IN LARGE_INTEGER Multiplicand
,
1399 IN LONG Multiplier
);
1404 RtlExtendedLargeIntegerDivide(
1405 IN LARGE_INTEGER Dividend
,
1407 IN OUT PULONG Remainder
);
1410 #if defined(_X86_) || defined(_IA64_)
1414 RtlExtendedMagicDivide(
1415 IN LARGE_INTEGER Dividend
,
1416 IN LARGE_INTEGER MagicDivisor
,
1417 IN CCHAR ShiftCount
);
1424 IN PANSI_STRING AnsiString
);
1430 IN PRTL_BITMAP BitMapHeader
,
1431 IN ULONG NumberToFind
,
1432 IN ULONG HintIndex
);
1437 RtlFindClearBitsAndSet(
1438 IN PRTL_BITMAP BitMapHeader
,
1439 IN ULONG NumberToFind
,
1440 IN ULONG HintIndex
);
1445 RtlFindFirstRunClear(
1446 IN PRTL_BITMAP BitMapHeader
,
1447 OUT PULONG StartingIndex
);
1453 IN PRTL_BITMAP BitMapHeader
,
1454 OUT PRTL_BITMAP_RUN RunArray
,
1455 IN ULONG SizeOfRunArray
,
1456 IN BOOLEAN LocateLongestRuns
);
1461 RtlFindLastBackwardRunClear(
1462 IN PRTL_BITMAP BitMapHeader
,
1464 OUT PULONG StartingRunIndex
);
1469 RtlFindLeastSignificantBit(
1475 RtlFindLongestRunClear(
1476 IN PRTL_BITMAP BitMapHeader
,
1477 OUT PULONG StartingIndex
);
1482 RtlFindMostSignificantBit(
1488 RtlFindNextForwardRunClear(
1489 IN PRTL_BITMAP BitMapHeader
,
1491 OUT PULONG StartingRunIndex
);
1497 IN PRTL_BITMAP BitMapHeader
,
1498 IN ULONG NumberToFind
,
1499 IN ULONG HintIndex
);
1504 RtlFindSetBitsAndClear(
1505 IN PRTL_BITMAP BitMapHeader
,
1506 IN ULONG NumberToFind
,
1507 IN ULONG HintIndex
);
1512 RtlHashUnicodeString(
1513 IN CONST UNICODE_STRING
*String
,
1514 IN BOOLEAN CaseInSensitive
,
1515 IN ULONG HashAlgorithm
,
1516 OUT PULONG HashValue
);
1522 IN OUT PANSI_STRING DestinationString
,
1523 IN PCSZ SourceString
);
1528 RtlInitializeBitMap(
1529 IN PRTL_BITMAP BitMapHeader
,
1530 IN PULONG BitMapBuffer
,
1531 IN ULONG SizeOfBitMap
);
1537 IN OUT PSTRING DestinationString
,
1538 IN PCSZ SourceString
);
1543 RtlIntegerToUnicodeString(
1545 IN ULONG Base OPTIONAL
,
1546 IN OUT PUNICODE_STRING String
);
1551 RtlInt64ToUnicodeString(
1553 IN ULONG Base OPTIONAL
,
1554 IN OUT PUNICODE_STRING String
);
1557 #define RtlIntPtrToUnicodeString(Value, Base, String) \
1558 RtlInt64ToUnicodeString(Value, Base, String)
1560 #define RtlIntPtrToUnicodeString(Value, Base, String) \
1561 RtlIntegerToUnicodeString(Value, Base, String)
1568 #define RtlIsZeroLuid(_L1) \
1569 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
1574 RtlLengthSecurityDescriptor(
1575 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
1580 RtlNumberOfClearBits(
1581 IN PRTL_BITMAP BitMapHeader
);
1587 IN PRTL_BITMAP BitMapHeader
);
1592 RtlQueryRegistryValues(
1593 IN ULONG RelativeTo
,
1595 IN PRTL_QUERY_REGISTRY_TABLE QueryTable
,
1597 IN PVOID Environment OPTIONAL
);
1599 #define LONG_SIZE (sizeof(LONG))
1600 #define LONG_MASK (LONG_SIZE - 1)
1604 * PULONG DestinationAddress,
1605 * PULONG SourceAddress);
1607 #if defined(_AMD64_)
1608 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
1609 *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
1611 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
1612 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
1614 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
1615 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
1616 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
1617 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
1621 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
1626 * RtlRetrieveUshort(
1627 * PUSHORT DestinationAddress,
1628 * PUSHORT SourceAddress);
1630 #if defined(_AMD64_)
1631 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
1632 *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
1634 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
1635 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
1637 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
1638 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
1642 *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
1650 IN PRTL_BITMAP BitMapHeader
);
1656 IN PRTL_BITMAP BitMapHeader
,
1657 IN ULONG StartingIndex
,
1658 IN ULONG NumberToSet
);
1663 RtlSetDaclSecurityDescriptor(
1664 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
1665 IN BOOLEAN DaclPresent
,
1666 IN PACL Dacl OPTIONAL
,
1667 IN BOOLEAN DaclDefaulted OPTIONAL
);
1671 * IN PULONG Address,
1674 #if defined(_AMD64_)
1675 #define RtlStoreUlong(Address,Value) \
1676 *(ULONG UNALIGNED *)(Address) = (Value)
1678 #define RtlStoreUlong(Address,Value) \
1679 if ((ULONG_PTR)(Address) & LONG_MASK) { \
1680 ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
1681 ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
1682 ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
1683 ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT] = (UCHAR)(FOURTHBYTE(Value)); \
1686 *((PULONG)(Address)) = (ULONG) (Value); \
1691 * RtlStoreUlonglong(
1692 * IN OUT PULONGLONG Address,
1695 #if defined(_AMD64_)
1696 #define RtlStoreUlonglong(Address,Value) \
1697 *(ULONGLONG UNALIGNED *)(Address) = (Value)
1699 #define RtlStoreUlonglong(Address,Value) \
1700 if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
1701 RtlStoreUlong((ULONG_PTR)(Address), \
1702 (ULONGLONG)(Value) & 0xFFFFFFFF); \
1703 RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
1704 (ULONGLONG)(Value) >> 32); \
1706 *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
1712 * IN OUT PULONG_PTR Address,
1713 * IN ULONG_PTR Value);
1716 #define RtlStoreUlongPtr(Address,Value) \
1717 RtlStoreUlonglong(Address,Value)
1719 #define RtlStoreUlongPtr(Address,Value) \
1720 RtlStoreUlong(Address,Value)
1725 * IN PUSHORT Address,
1728 #if defined(_AMD64_)
1729 #define RtlStoreUshort(Address,Value) \
1730 *(USHORT UNALIGNED *)(Address) = (Value)
1732 #define RtlStoreUshort(Address,Value) \
1733 if ((ULONG_PTR)(Address) & SHORT_MASK) { \
1734 ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
1735 ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
1738 *((PUSHORT) (Address)) = (USHORT)Value; \
1745 RtlTimeFieldsToTime(
1746 IN PTIME_FIELDS TimeFields
,
1747 IN PLARGE_INTEGER Time
);
1752 RtlTimeToTimeFields(
1753 IN PLARGE_INTEGER Time
,
1754 IN PTIME_FIELDS TimeFields
);
1765 RtlUlonglongByteSwap(
1766 IN ULONGLONG Source
);
1771 RtlUnicodeStringToAnsiString(
1772 IN OUT PANSI_STRING DestinationString
,
1773 IN PCUNICODE_STRING SourceString
,
1774 IN BOOLEAN AllocateDestinationString
);
1779 RtlxUnicodeStringToAnsiSize(
1780 IN PCUNICODE_STRING UnicodeString
);
1782 #define RtlUnicodeStringToAnsiSize(String) ( \
1783 NLS_MB_CODE_PAGE_TAG ? \
1784 RtlxUnicodeStringToAnsiSize(String) : \
1785 ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
1791 RtlUnicodeStringToInteger(
1792 IN PCUNICODE_STRING String
,
1793 IN ULONG Base OPTIONAL
,
1799 RtlUpcaseUnicodeChar(
1800 IN WCHAR SourceCharacter
);
1811 RtlValidRelativeSecurityDescriptor(
1812 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput
,
1813 IN ULONG SecurityDescriptorLength
,
1814 IN SECURITY_INFORMATION RequiredInformation
);
1819 RtlValidSecurityDescriptor(
1820 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
1825 RtlWriteRegistryValue(
1826 IN ULONG RelativeTo
,
1828 IN PCWSTR ValueName
,
1831 IN ULONG ValueLength
);
1833 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
1835 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
1839 RtlPrefetchMemoryNonTemporal(
1844 #if (NTDDI_VERSION >= NTDDI_WINXP)
1849 PRTL_BITMAP BitMapHeader
,
1855 RtlDowncaseUnicodeChar(
1856 IN WCHAR SourceCharacter
);
1862 PRTL_BITMAP BitMapHeader
,
1869 IN PRTL_BITMAP BitMapHeader
,
1870 IN ULONG BitNumber
);
1872 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
1874 #if (NTDDI_VERSION >= NTDDI_VISTA)
1878 RtlNumberOfSetBitsUlongPtr(
1879 IN ULONG_PTR Target
);
1884 RtlIoDecodeMemIoResource (
1885 IN PIO_RESOURCE_DESCRIPTOR Descriptor
,
1886 OUT PULONGLONG Alignment OPTIONAL
,
1887 OUT PULONGLONG MinimumAddress OPTIONAL
,
1888 OUT PULONGLONG MaximumAddress OPTIONAL
);
1893 RtlIoEncodeMemIoResource(
1894 IN PIO_RESOURCE_DESCRIPTOR Descriptor
,
1896 IN ULONGLONG Length
,
1897 IN ULONGLONG Alignment
,
1898 IN ULONGLONG MinimumAddress
,
1899 IN ULONGLONG MaximumAddress
);
1904 RtlCmDecodeMemIoResource(
1905 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor
,
1906 OUT PULONGLONG Start OPTIONAL
);
1911 RtlFindClosestEncodableLength(
1912 IN ULONGLONG SourceLength
,
1913 OUT PULONGLONG TargetLength
);
1917 #if !defined(MIDL_PASS)
1918 /* inline funftions */
1919 //DECLSPEC_DEPRECATED_DDK_WINXP
1923 RtlConvertLongToLargeInteger(LONG SignedInteger
)
1926 ret
.QuadPart
= SignedInteger
;
1930 //DECLSPEC_DEPRECATED_DDK_WINXP
1934 RtlConvertUlongToLargeInteger(
1935 ULONG UnsignedInteger
)
1938 ret
.QuadPart
= UnsignedInteger
;
1942 //DECLSPEC_DEPRECATED_DDK
1946 RtlEnlargedUnsignedDivide(
1947 IN ULARGE_INTEGER Dividend
,
1949 IN OUT PULONG Remainder
)
1952 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
1953 return (ULONG
)(Dividend
.QuadPart
/ Divisor
);
1956 //DECLSPEC_DEPRECATED_DDK
1960 RtlEnlargedUnsignedMultiply(
1961 IN ULONG Multiplicand
,
1962 IN ULONG Multiplier
)
1965 ret
.QuadPart
= (ULONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
1969 //DECLSPEC_DEPRECATED_DDK
1973 RtlEnlargedIntegerMultiply(
1974 IN LONG Multiplicand
,
1978 ret
.QuadPart
= (LONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
1984 RtlInitEmptyAnsiString(OUT PANSI_STRING AnsiString
,
1986 IN USHORT BufferSize
)
1988 AnsiString
->Length
= 0;
1989 AnsiString
->MaximumLength
= BufferSize
;
1990 AnsiString
->Buffer
= Buffer
;
1995 RtlInitEmptyUnicodeString(
1996 OUT PUNICODE_STRING UnicodeString
,
1998 IN USHORT BufferSize
)
2000 UnicodeString
->Length
= 0;
2001 UnicodeString
->MaximumLength
= BufferSize
;
2002 UnicodeString
->Buffer
= Buffer
;
2005 #if defined(_AMD64_) || defined(_IA64_)
2009 RtlExtendedIntegerMultiply(
2010 LARGE_INTEGER Multiplicand
,
2014 ret
.QuadPart
= Multiplicand
.QuadPart
* Multiplier
;
2021 RtlExtendedLargeIntegerDivide(
2022 LARGE_INTEGER Dividend
,
2027 ret
.QuadPart
= (ULONG64
)Dividend
.QuadPart
/ Divisor
;
2029 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
2034 #if defined(_AMD64_)
2036 #define MultiplyHigh __mulh
2037 #define UnsignedMultiplyHigh __umulh
2039 //DECLSPEC_DEPRECATED_DDK
2043 RtlExtendedMagicDivide(
2044 IN LARGE_INTEGER Dividend
,
2045 IN LARGE_INTEGER MagicDivisor
,
2046 IN CCHAR ShiftCount
)
2051 Pos
= (Dividend
.QuadPart
>= 0);
2052 ret64
= UnsignedMultiplyHigh(Pos
? Dividend
.QuadPart
: -Dividend
.QuadPart
,
2053 MagicDivisor
.QuadPart
);
2054 ret64
>>= ShiftCount
;
2055 ret
.QuadPart
= Pos
? ret64
: -ret64
;
2060 //DECLSPEC_DEPRECATED_DDK
2065 IN LARGE_INTEGER Addend1
,
2066 IN LARGE_INTEGER Addend2
)
2069 ret
.QuadPart
= Addend1
.QuadPart
+ Addend2
.QuadPart
;
2074 * RtlLargeIntegerAnd(
2075 * IN OUT LARGE_INTEGER Result,
2076 * IN LARGE_INTEGER Source,
2077 * IN LARGE_INTEGER Mask);
2079 #define RtlLargeIntegerAnd(Result, Source, Mask) \
2080 Result.QuadPart = Source.QuadPart & Mask.QuadPart
2082 //DECLSPEC_DEPRECATED_DDK
2086 RtlLargeIntegerArithmeticShift(
2087 IN LARGE_INTEGER LargeInteger
,
2088 IN CCHAR ShiftCount
)
2091 ret
.QuadPart
= LargeInteger
.QuadPart
>> ShiftCount
;
2096 * RtlLargeIntegerEqualTo(
2097 * IN LARGE_INTEGER Operand1,
2098 * IN LARGE_INTEGER Operand2);
2100 #define RtlLargeIntegerEqualTo(X,Y) \
2101 (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
2105 RtlSecureZeroMemory(
2109 volatile char* vptr
= (volatile char*)Pointer
;
2110 #if defined(_M_AMD64)
2111 __stosb((PUCHAR
)vptr
, 0, Size
);
2113 char * endptr
= (char *)vptr
+ Size
;
2114 while (vptr
< endptr
)
2122 #if defined(_M_AMD64)
2126 IN PRTL_BITMAP BitMapHeader
,
2127 IN ULONG BitPosition
)
2129 return BitTest((LONG CONST
*)BitMapHeader
->Buffer
, BitPosition
);
2132 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
2133 #endif // defined(_M_AMD64)
2135 #endif // !defined(MIDL_PASS)
2138 // Byte Swap Functions
2140 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \
2141 ((defined(_M_AMD64) || defined(_M_IA64)) \
2142 && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))
2144 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
2145 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
2146 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
2150 /******************************************************************************
2151 * Memory manager Types *
2152 ******************************************************************************/
2154 typedef struct _MDL
{
2158 struct _EPROCESS
*Process
;
2159 PVOID MappedSystemVa
;
2166 /******************************************************************************
2167 * Memory manager Functions *
2168 ******************************************************************************/
2170 /* PVOID MmGetSystemAddressForMdl(
2173 #define MmGetSystemAddressForMdl(Mdl) \
2174 (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
2175 MDL_SOURCE_IS_NONPAGED_POOL)) ? \
2176 ((Mdl)->MappedSystemVa) : \
2177 (MmMapLockedPages((Mdl), KernelMode)))
2180 * MmGetSystemAddressForMdlSafe(
2182 * IN MM_PAGE_PRIORITY Priority)
2184 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
2185 (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
2186 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
2187 (_Mdl)->MappedSystemVa : \
2188 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
2189 KernelMode, MmCached, NULL, FALSE, (_Priority)))
2191 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2196 IN PMDL MemoryDescriptorList OPTIONAL
,
2203 /******************************************************************************
2204 * I/O Manager Functions *
2205 ******************************************************************************/
2207 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
2208 (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
2210 #define DMA_MACROS_DEFINED
2214 IoAllocateAdapterChannel(
2215 IN PADAPTER_OBJECT AdapterObject
,
2216 IN PDEVICE_OBJECT DeviceObject
,
2217 IN ULONG NumberOfMapRegisters
,
2218 IN PDRIVER_CONTROL ExecutionRoutine
,
2221 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel
;
2222 AllocateAdapterChannel
=
2223 *(DmaAdapter
)->DmaOperations
->AllocateAdapterChannel
;
2224 ASSERT(AllocateAdapterChannel
);
2225 return AllocateAdapterChannel(DmaAdapter
,
2227 NumberOfMapRegisters
,
2234 IoFlushAdapterBuffers(
2235 IN PADAPTER_OBJECT AdapterObject
,
2237 IN PVOID MapRegisterBase
,
2240 IN BOOLEAN WriteToDevice
)
2242 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers
;
2243 FlushAdapterBuffers
= *(DmaAdapter
)->DmaOperations
->FlushAdapterBuffers
;
2244 ASSERT(FlushAdapterBuffers
);
2245 return FlushAdapterBuffers(DmaAdapter
,
2255 IoFreeAdapterChannel(
2256 IN PADAPTER_OBJECT AdapterObject
)
2258 PFREE_ADAPTER_CHANNEL FreeAdapterChannel
;
2259 FreeAdapterChannel
= *(DmaAdapter
)->DmaOperations
->FreeAdapterChannel
;
2260 ASSERT(FreeAdapterChannel
);
2261 FreeAdapterChannel(DmaAdapter
);
2267 IN PADAPTER_OBJECT AdapterObject
,
2268 IN PVOID MapRegisterBase
,
2269 IN ULONG NumberOfMapRegisters
)
2271 PFREE_MAP_REGISTERS FreeMapRegisters
;
2272 FreeMapRegisters
= *(DmaAdapter
)->DmaOperations
->FreeMapRegisters
;
2273 ASSERT(FreeMapRegisters
);
2274 FreeMapRegisters(DmaAdapter
, MapRegisterBase
, NumberOfMapRegisters
);
2280 IN PDMA_ADAPTER DmaAdapter
,
2282 IN PVOID MapRegisterBase
,
2284 IN OUT PULONG Length
,
2285 IN BOOLEAN WriteToDevice
)
2287 PMAP_TRANSFER MapTransfer
;
2289 MapTransfer
= *(DmaAdapter
)->DmaOperations
->MapTransfer
;
2290 ASSERT(MapTransfer
);
2291 return MapTransfer(DmaAdapter
,
2301 /******************************************************************************
2303 ******************************************************************************/
2305 typedef enum _POOL_TYPE
{
2308 NonPagedPoolMustSucceed
,
2310 NonPagedPoolCacheAligned
,
2311 PagedPoolCacheAligned
,
2312 NonPagedPoolCacheAlignedMustS
,
2314 NonPagedPoolSession
= 32,
2316 NonPagedPoolMustSucceedSession
,
2317 DontUseThisTypeSession
,
2318 NonPagedPoolCacheAlignedSession
,
2319 PagedPoolCacheAlignedSession
,
2320 NonPagedPoolCacheAlignedMustSSession
2323 typedef enum _SUITE_TYPE
{
2327 CommunicationServer
,
2329 SmallBusinessRestricted
,
2338 typedef enum _EX_POOL_PRIORITY
{
2340 LowPoolPrioritySpecialPoolOverrun
= 8,
2341 LowPoolPrioritySpecialPoolUnderrun
= 9,
2342 NormalPoolPriority
= 16,
2343 NormalPoolPrioritySpecialPoolOverrun
= 24,
2344 NormalPoolPrioritySpecialPoolUnderrun
= 25,
2345 HighPoolPriority
= 32,
2346 HighPoolPrioritySpecialPoolOverrun
= 40,
2347 HighPoolPrioritySpecialPoolUnderrun
= 41
2350 typedef struct _FAST_MUTEX
2357 } FAST_MUTEX
, *PFAST_MUTEX
;
2359 typedef ULONG_PTR ERESOURCE_THREAD
, *PERESOURCE_THREAD
;
2361 typedef struct _OWNER_ENTRY
{
2362 ERESOURCE_THREAD OwnerThread
;
2363 _ANONYMOUS_UNION
union {
2367 } OWNER_ENTRY
, *POWNER_ENTRY
;
2369 typedef struct _ERESOURCE
2371 LIST_ENTRY SystemResourcesList
;
2372 POWNER_ENTRY OwnerTable
;
2375 volatile PKSEMAPHORE SharedWaiters
;
2376 volatile PKEVENT ExclusiveWaiters
;
2377 OWNER_ENTRY OwnerEntry
;
2378 ULONG ActiveEntries
;
2379 ULONG ContentionCount
;
2380 ULONG NumberOfSharedWaiters
;
2381 ULONG NumberOfExclusiveWaiters
;
2385 ULONG_PTR CreatorBackTraceIndex
;
2387 KSPIN_LOCK SpinLock
;
2388 } ERESOURCE
, *PERESOURCE
;
2390 #if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
2391 #define LOOKASIDE_ALIGN
2393 #define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */
2396 typedef struct _LOOKASIDE_LIST_EX
*PLOOKASIDE_LIST_EX
;
2399 (DDKAPI
*PALLOCATE_FUNCTION
)(
2400 IN POOL_TYPE PoolType
,
2401 IN SIZE_T NumberOfBytes
,
2405 (DDKAPI
*PALLOCATE_FUNCTION_EX
)(
2406 IN POOL_TYPE PoolType
,
2407 IN SIZE_T NumberOfBytes
,
2409 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
2412 (DDKAPI
*PFREE_FUNCTION
)(
2416 (DDKAPI
*PFREE_FUNCTION_EX
)(
2418 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
2421 (DDKAPI
*PCALLBACK_FUNCTION
)(
2422 IN PVOID CallbackContext
,
2424 IN PVOID Argument2
);
2426 typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE
{
2428 SLIST_HEADER ListHead
;
2429 SINGLE_LIST_ENTRY SingleListHead
;
2432 USHORT MaximumDepth
;
2433 ULONG TotalAllocates
;
2435 ULONG AllocateMisses
;
2447 PALLOCATE_FUNCTION_EX AllocateEx
;
2448 PALLOCATE_FUNCTION Allocate
;
2451 PFREE_FUNCTION_EX FreeEx
;
2452 PFREE_FUNCTION Free
;
2454 LIST_ENTRY ListEntry
;
2455 ULONG LastTotalAllocates
;
2457 ULONG LastAllocateMisses
;
2458 ULONG LastAllocateHits
;
2461 } GENERAL_LOOKASIDE
, *PGENERAL_LOOKASIDE
;
2463 typedef struct _PAGED_LOOKASIDE_LIST
{
2464 GENERAL_LOOKASIDE L
;
2465 #if !defined(_AMD64_) && !defined(_IA64_)
2466 FAST_MUTEX Lock__ObsoleteButDoNotDelete
;
2468 } PAGED_LOOKASIDE_LIST
, *PPAGED_LOOKASIDE_LIST
;
2470 typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST
{
2471 GENERAL_LOOKASIDE L
;
2472 #if !defined(_AMD64_) && !defined(_IA64_)
2473 KSPIN_LOCK Lock__ObsoleteButDoNotDelete
;
2475 } NPAGED_LOOKASIDE_LIST
, *PNPAGED_LOOKASIDE_LIST
;
2477 //typedef struct _LOOKASIDE_LIST_EX {
2478 // GENERAL_LOOKASIDE_POOL L;
2479 //} LOOKASIDE_LIST_EX, *PLOOKASIDE_LIST_EX;
2481 typedef struct _EX_RUNDOWN_REF
{
2483 volatile ULONG_PTR Count
;
2486 } EX_RUNDOWN_REF
, *PEX_RUNDOWN_REF
;
2488 typedef struct _EX_RUNDOWN_REF_CACHE_AWARE
*PEX_RUNDOWN_REF_CACHE_AWARE
;
2490 typedef enum _WORK_QUEUE_TYPE
{
2493 HyperCriticalWorkQueue
,
2498 (DDKAPI
*PWORKER_THREAD_ROUTINE
)(
2499 IN PVOID Parameter
);
2501 typedef struct _WORK_QUEUE_ITEM
{
2503 PWORKER_THREAD_ROUTINE WorkerRoutine
;
2504 volatile PVOID Parameter
;
2505 } WORK_QUEUE_ITEM
, *PWORK_QUEUE_ITEM
;
2508 /******************************************************************************
2509 * Executive Functions *
2510 ******************************************************************************/
2513 #if defined(_NTHAL_)
2514 #define ExAcquireFastMutex ExiAcquireFastMutex
2515 #define ExReleaseFastMutex ExiReleaseFastMutex
2516 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
2518 #define ExInterlockedAddUlong ExfInterlockedAddUlong
2519 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
2520 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
2521 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
2522 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
2523 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
2528 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
2529 defined(_NTHAL_) || defined(_NTOSP_)
2532 ExQueryDepthSList(IN PSLIST_HEADER ListHead
);
2536 ExQueryDepthSList(IN PSLIST_HEADER ListHead
)
2538 return (USHORT
)(ListHead
->Alignment
& 0xffff);
2544 ExpInterlockedFlushSList(
2545 PSLIST_HEADER ListHead
);
2549 ExpInterlockedPopEntrySList(
2550 PSLIST_HEADER ListHead
);
2554 ExpInterlockedPushEntrySList(
2555 PSLIST_HEADER ListHead
,
2556 PSLIST_ENTRY ListEntry
);
2558 #define ExInterlockedFlushSList(Head) \
2559 ExpInterlockedFlushSList(Head)
2560 #define ExInterlockedPopEntrySList(Head, Lock) \
2561 ExpInterlockedPopEntrySList(Head)
2562 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
2563 ExpInterlockedPushEntrySList(Head, Entry)
2565 #else // !defined(_WIN64)
2567 #define ExQueryDepthSList(listhead) (listhead)->Depth
2572 ExInterlockedFlushSList(
2573 IN PSLIST_HEADER ListHead
);
2575 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
2579 ExInterlockedPopEntrySList(
2580 IN PSLIST_HEADER ListHead
,
2581 IN PKSPIN_LOCK Lock
);
2586 ExInterlockedPushEntrySList(
2587 IN PSLIST_HEADER ListHead
,
2588 IN PSINGLE_LIST_ENTRY ListEntry
,
2589 IN PKSPIN_LOCK Lock
);
2591 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
2592 InterlockedPopEntrySList(_ListHead)
2593 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
2594 InterlockedPushEntrySList(_ListHead, _ListEntry)
2595 #endif // _WIN2K_COMPAT_SLIST_USAGE
2597 #endif // !defined(_WIN64)
2600 * ExGetCurrentResourceThread(
2603 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread())
2605 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
2608 * ExInitializeWorkItem(
2609 * IN PWORK_QUEUE_ITEM Item,
2610 * IN PWORKER_THREAD_ROUTINE Routine,
2613 #define ExInitializeWorkItem(Item, Routine, Context) \
2615 (Item)->WorkerRoutine = Routine; \
2616 (Item)->Parameter = Context; \
2617 (Item)->List.Flink = NULL; \
2620 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2626 IN OUT PFAST_MUTEX FastMutex
);
2632 IN OUT PFAST_MUTEX FastMutex
);
2637 ExTryToAcquireFastMutex(
2638 IN OUT PFAST_MUTEX FastMutex
);
2643 ExAcquireFastMutexUnsafe(
2644 IN OUT PFAST_MUTEX FastMutex
);
2649 ExReleaseFastMutexUnsafe(
2650 IN OUT PFAST_MUTEX FastMutex
);
2655 ExAcquireResourceExclusiveLite(
2656 IN PERESOURCE Resource
,
2662 ExAcquireResourceSharedLite(
2663 IN PERESOURCE Resource
,
2669 ExAcquireSharedStarveExclusive(
2670 IN PERESOURCE Resource
,
2676 ExAcquireSharedWaitForExclusive(
2677 IN PERESOURCE Resource
,
2684 IN POOL_TYPE PoolType
,
2685 IN SIZE_T NumberOfBytes
);
2688 #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
2689 #endif /* POOL_TAGGING */
2694 ExAllocatePoolWithQuota(
2695 IN POOL_TYPE PoolType
,
2696 IN SIZE_T NumberOfBytes
);
2699 #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
2700 #endif /* POOL_TAGGING */
2705 ExAllocatePoolWithQuotaTag(
2706 IN POOL_TYPE PoolType
,
2707 IN SIZE_T NumberOfBytes
,
2710 #ifndef POOL_TAGGING
2711 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
2712 #endif /* POOL_TAGGING */
2717 ExAllocatePoolWithTag(
2718 IN POOL_TYPE PoolType
,
2719 IN SIZE_T NumberOfBytes
,
2725 ExAllocatePoolWithTagPriority(
2726 IN POOL_TYPE PoolType
,
2727 IN SIZE_T NumberOfBytes
,
2729 IN EX_POOL_PRIORITY Priority
);
2734 ExConvertExclusiveToSharedLite(
2735 IN PERESOURCE Resource
);
2741 OUT PCALLBACK_OBJECT
*CallbackObject
,
2742 IN POBJECT_ATTRIBUTES ObjectAttributes
,
2744 IN BOOLEAN AllowMultipleCallbacks
);
2749 ExDeleteNPagedLookasideList(
2750 IN PNPAGED_LOOKASIDE_LIST Lookaside
);
2755 ExDeletePagedLookasideList(
2756 IN PPAGED_LOOKASIDE_LIST Lookaside
);
2761 ExDeleteResourceLite(
2762 IN PERESOURCE Resource
);
2771 #define ExFreePool(P) ExFreePoolWithTag(P, 0)
2784 ExGetExclusiveWaiterCount(
2785 IN PERESOURCE Resource
);
2796 ExGetSharedWaiterCount(
2797 IN PERESOURCE Resource
);
2802 ExInitializeNPagedLookasideList(
2803 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
2804 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
2805 IN PFREE_FUNCTION Free OPTIONAL
,
2814 ExInitializePagedLookasideList(
2815 IN PPAGED_LOOKASIDE_LIST Lookaside
,
2816 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
2817 IN PFREE_FUNCTION Free OPTIONAL
,
2826 ExInitializeResourceLite(
2827 IN PERESOURCE Resource
);
2832 ExInterlockedAddLargeInteger(
2833 IN PLARGE_INTEGER Addend
,
2834 IN LARGE_INTEGER Increment
,
2835 IN PKSPIN_LOCK Lock
);
2838 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
2839 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
2841 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
2842 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
2848 ExInterlockedAddUlong(
2853 #if defined(_AMD64_) || defined(_IA64_)
2854 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
2855 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
2856 #elif defined(_X86_)
2860 ExfInterlockedCompareExchange64(
2861 IN OUT LONGLONG
volatile *Destination
,
2862 IN PLONGLONG Exchange
,
2863 IN PLONGLONG Comperand
);
2864 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
2865 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
2870 ExInterlockedCompareExchange64(
2871 IN OUT LONGLONG
volatile *Destination
,
2872 IN PLONGLONG Exchange
,
2873 IN PLONGLONG Comparand
,
2874 IN PKSPIN_LOCK Lock
);
2880 ExInterlockedInsertHeadList(
2881 IN PLIST_ENTRY ListHead
,
2882 IN PLIST_ENTRY ListEntry
,
2883 IN PKSPIN_LOCK Lock
);
2888 ExInterlockedInsertTailList(
2889 IN PLIST_ENTRY ListHead
,
2890 IN PLIST_ENTRY ListEntry
,
2891 IN PKSPIN_LOCK Lock
);
2896 ExInterlockedPopEntryList(
2897 IN PSINGLE_LIST_ENTRY ListHead
,
2898 IN PKSPIN_LOCK Lock
);
2903 ExInterlockedPushEntryList(
2904 IN PSINGLE_LIST_ENTRY ListHead
,
2905 IN PSINGLE_LIST_ENTRY ListEntry
,
2906 IN PKSPIN_LOCK Lock
);
2911 ExInterlockedRemoveHeadList(
2912 IN PLIST_ENTRY ListHead
,
2913 IN PKSPIN_LOCK Lock
);
2918 ExIsProcessorFeaturePresent(
2919 IN ULONG ProcessorFeature
);
2924 ExIsResourceAcquiredExclusiveLite(
2925 IN PERESOURCE Resource
);
2930 ExIsResourceAcquiredSharedLite(
2931 IN PERESOURCE Resource
);
2933 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
2938 ExLocalTimeToSystemTime(
2939 IN PLARGE_INTEGER LocalTime
,
2940 OUT PLARGE_INTEGER SystemTime
);
2946 IN PCALLBACK_OBJECT CallbackObject
,
2948 IN PVOID Argument2
);
2954 IN PWORK_QUEUE_ITEM WorkItem
,
2955 IN WORK_QUEUE_TYPE QueueType
);
2962 IN NTSTATUS Status
);
2968 IN PCALLBACK_OBJECT CallbackObject
,
2969 IN PCALLBACK_FUNCTION CallbackFunction
,
2970 IN PVOID CallbackContext
);
2975 ExReinitializeResourceLite(
2976 IN PERESOURCE Resource
);
2981 ExReleaseResourceForThreadLite(
2982 IN PERESOURCE Resource
,
2983 IN ERESOURCE_THREAD ResourceThreadId
);
2988 ExReleaseResourceLite(
2989 IN PERESOURCE Resource
);
2994 ExSetResourceOwnerPointer(
2995 IN PERESOURCE Resource
,
2996 IN PVOID OwnerPointer
);
3001 ExSetTimerResolution(
3002 IN ULONG DesiredTime
,
3003 IN BOOLEAN SetResolution
);
3008 ExSystemTimeToLocalTime(
3009 IN PLARGE_INTEGER SystemTime
,
3010 OUT PLARGE_INTEGER LocalTime
);
3015 ExUnregisterCallback(
3016 IN PVOID CbRegistration
);
3019 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
3021 #if (NTDDI_VERSION >= NTDDI_WINXP)
3025 ExAcquireRundownProtection(
3026 IN OUT PEX_RUNDOWN_REF RunRef
);
3031 ExInitializeRundownProtection(
3032 OUT PEX_RUNDOWN_REF RunRef
);
3037 ExReInitializeRundownProtection(
3038 OUT PEX_RUNDOWN_REF RunRef
);
3043 ExReleaseRundownProtection(
3044 IN OUT PEX_RUNDOWN_REF RunRef
);
3050 OUT PEX_RUNDOWN_REF RunRef
);
3056 IN SUITE_TYPE SuiteType
);
3061 ExWaitForRundownProtectionRelease(
3062 IN OUT PEX_RUNDOWN_REF RunRef
);
3064 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
3066 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
3070 ExAcquireRundownProtectionEx(
3071 IN OUT PEX_RUNDOWN_REF RunRef
,
3077 ExReleaseRundownProtectionEx(
3078 IN OUT PEX_RUNDOWN_REF RunRef
,
3080 #endif // (NTDDI_VERSION >= NTDDI_WINXPSP2)
3082 #if (NTDDI_VERSION >= NTDDI_WS03)
3084 #endif // (NTDDI_VERSION >= NTDDI_WS03)
3086 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
3088 PEX_RUNDOWN_REF_CACHE_AWARE
3089 ExAllocateCacheAwareRundownProtection(
3090 IN POOL_TYPE PoolType
,
3095 ExSizeOfRundownProtectionCacheAware(VOID
);
3097 #endif // (NTDDI_VERSION >= NTDDI_WS03SP1)
3099 #if (NTDDI_VERSION >= NTDDI_VISTA)
3102 ExInitializeLookasideListEx(
3103 OUT PLOOKASIDE_LIST_EX Lookaside
,
3104 IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL
,
3105 IN PFREE_FUNCTION_EX Free OPTIONAL
,
3106 IN POOL_TYPE PoolType
,
3114 #if !defined(MIDL_PASS)
3116 static __inline PVOID
3117 ExAllocateFromNPagedLookasideList(
3118 IN PNPAGED_LOOKASIDE_LIST Lookaside
)
3122 Lookaside
->L
.TotalAllocates
++;
3123 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
3124 if (Entry
== NULL
) {
3125 Lookaside
->L
.AllocateMisses
++;
3126 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
3133 static __inline PVOID
3134 ExAllocateFromPagedLookasideList(
3135 IN PPAGED_LOOKASIDE_LIST Lookaside
)
3139 Lookaside
->L
.TotalAllocates
++;
3140 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
3141 if (Entry
== NULL
) {
3142 Lookaside
->L
.AllocateMisses
++;
3143 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
3150 static __inline VOID
3151 ExFreeToNPagedLookasideList(
3152 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
3155 Lookaside
->L
.TotalFrees
++;
3156 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
3157 Lookaside
->L
.FreeMisses
++;
3158 (Lookaside
->L
.Free
)(Entry
);
3160 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
3164 static __inline VOID
3165 ExFreeToPagedLookasideList(
3166 IN PPAGED_LOOKASIDE_LIST Lookaside
,
3169 Lookaside
->L
.TotalFrees
++;
3170 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
3171 Lookaside
->L
.FreeMisses
++;
3172 (Lookaside
->L
.Free
)(Entry
);
3174 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
3179 #endif // !defined(MIDL_PASS)