14 #endif /* GUID_DEFINED */
24 #define NTKERNELAPI DECLSPEC_IMPORT
27 #define PORT_MAXIMUM_MESSAGE_LENGTH 512
29 #define PORT_MAXIMUM_MESSAGE_LENGTH 256
34 typedef UCHAR KPROCESSOR_MODE
;
35 typedef LONG KPRIORITY
;
36 typedef PVOID PSECURITY_DESCRIPTOR
;
37 typedef ULONG SECURITY_INFORMATION
, *PSECURITY_INFORMATION
;
39 /* Structures not exposed to drivers */
40 typedef struct _OBJECT_TYPE
*POBJECT_TYPE
;
41 typedef struct _HAL_DISPATCH_TABLE
*PHAL_DISPATCH_TABLE
;
42 typedef struct _HAL_PRIVATE_DISPATCH_TABLE
*PHAL_PRIVATE_DISPATCH_TABLE
;
43 typedef struct _DEVICE_HANDLER_OBJECT
*PDEVICE_HANDLER_OBJECT
;
44 typedef struct _BUS_HANDLER
*PBUS_HANDLER
;
46 typedef struct _ADAPTER_OBJECT
*PADAPTER_OBJECT
;
47 typedef struct _CALLBACK_OBJECT
*PCALLBACK_OBJECT
;
48 typedef struct _ETHREAD
*PETHREAD
;
49 typedef struct _EPROCESS
*PEPROCESS
;
50 typedef struct _IO_TIMER
*PIO_TIMER
;
51 typedef struct _KINTERRUPT
*PKINTERRUPT
;
52 typedef struct _KPROCESS
*PKPROCESS
;
53 typedef struct _KTHREAD
*PKTHREAD
, *PRKTHREAD
;
56 typedef struct _CONTEXT
*PCONTEXT
;
59 // Resource list definitions
61 typedef int CM_RESOURCE_TYPE
;
63 #define CmResourceTypeNull 0
64 #define CmResourceTypePort 1
65 #define CmResourceTypeInterrupt 2
66 #define CmResourceTypeMemory 3
67 #define CmResourceTypeDma 4
68 #define CmResourceTypeDeviceSpecific 5
69 #define CmResourceTypeBusNumber 6
70 #define CmResourceTypeNonArbitrated 128
71 #define CmResourceTypeConfigData 128
72 #define CmResourceTypeDevicePrivate 129
73 #define CmResourceTypePcCardConfig 130
74 #define CmResourceTypeMfCardConfig 131
76 typedef enum _INTERFACE_TYPE
{
77 InterfaceTypeUndefined
= -1,
95 } INTERFACE_TYPE
, *PINTERFACE_TYPE
;
97 /* IO_RESOURCE_DESCRIPTOR.Option */
99 #define IO_RESOURCE_PREFERRED 0x01
100 #define IO_RESOURCE_DEFAULT 0x02
101 #define IO_RESOURCE_ALTERNATIVE 0x08
103 typedef struct _IO_RESOURCE_DESCRIPTOR
{
106 UCHAR ShareDisposition
;
114 PHYSICAL_ADDRESS MinimumAddress
;
115 PHYSICAL_ADDRESS MaximumAddress
;
120 PHYSICAL_ADDRESS MinimumAddress
;
121 PHYSICAL_ADDRESS MaximumAddress
;
128 ULONG MinimumChannel
;
129 ULONG MaximumChannel
;
134 PHYSICAL_ADDRESS MinimumAddress
;
135 PHYSICAL_ADDRESS MaximumAddress
;
152 } IO_RESOURCE_DESCRIPTOR
, *PIO_RESOURCE_DESCRIPTOR
;
154 typedef struct _IO_RESOURCE_LIST
{
158 IO_RESOURCE_DESCRIPTOR Descriptors
[1];
159 } IO_RESOURCE_LIST
, *PIO_RESOURCE_LIST
;
161 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST
{
163 INTERFACE_TYPE InterfaceType
;
167 ULONG AlternativeLists
;
168 IO_RESOURCE_LIST List
[1];
169 } IO_RESOURCE_REQUIREMENTS_LIST
, *PIO_RESOURCE_REQUIREMENTS_LIST
;
174 extern ULONG NtGlobalFlag
;
177 #include <pshpack4.h>
178 typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR
{
180 UCHAR ShareDisposition
;
184 PHYSICAL_ADDRESS Start
;
188 PHYSICAL_ADDRESS Start
;
196 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
214 PHYSICAL_ADDRESS Start
;
234 } DeviceSpecificData
;
235 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
237 PHYSICAL_ADDRESS Start
;
241 PHYSICAL_ADDRESS Start
;
245 PHYSICAL_ADDRESS Start
;
250 } CM_PARTIAL_RESOURCE_DESCRIPTOR
, *PCM_PARTIAL_RESOURCE_DESCRIPTOR
;
254 // Section map options
256 typedef enum _SECTION_INHERIT
{
262 // Section access rights
264 #define SECTION_QUERY 0x0001
265 #define SECTION_MAP_WRITE 0x0002
266 #define SECTION_MAP_READ 0x0004
267 #define SECTION_MAP_EXECUTE 0x0008
268 #define SECTION_EXTEND_SIZE 0x0010
269 #define SECTION_MAP_EXECUTE_EXPLICIT 0x0020
271 #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
272 SECTION_MAP_WRITE | \
274 SECTION_MAP_EXECUTE | \
277 #define SESSION_QUERY_ACCESS 0x0001
278 #define SESSION_MODIFY_ACCESS 0x0002
280 #define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
281 SESSION_QUERY_ACCESS | \
282 SESSION_MODIFY_ACCESS)
286 #define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
288 #define PAGE_NOACCESS 0x01
289 #define PAGE_READONLY 0x02
290 #define PAGE_READWRITE 0x04
291 #define PAGE_WRITECOPY 0x08
292 #define PAGE_EXECUTE 0x10
293 #define PAGE_EXECUTE_READ 0x20
294 #define PAGE_EXECUTE_READWRITE 0x40
295 #define PAGE_EXECUTE_WRITECOPY 0x80
296 #define PAGE_GUARD 0x100
297 #define PAGE_NOCACHE 0x200
298 #define PAGE_WRITECOMBINE 0x400
300 #define MEM_COMMIT 0x1000
301 #define MEM_RESERVE 0x2000
302 #define MEM_DECOMMIT 0x4000
303 #define MEM_RELEASE 0x8000
304 #define MEM_FREE 0x10000
305 #define MEM_PRIVATE 0x20000
306 #define MEM_MAPPED 0x40000
307 #define MEM_RESET 0x80000
308 #define MEM_TOP_DOWN 0x100000
309 #define MEM_LARGE_PAGES 0x20000000
310 #define MEM_4MB_PAGES 0x80000000
312 #define SEC_RESERVE 0x4000000
313 #define SEC_LARGE_PAGES 0x80000000
315 #define PROCESS_DUP_HANDLE (0x0040)
317 #if (NTDDI_VERSION >= NTDDI_VISTA)
318 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
321 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
328 // Processor features
330 #define PF_FLOATING_POINT_PRECISION_ERRATA 0
331 #define PF_FLOATING_POINT_EMULATED 1
332 #define PF_COMPARE_EXCHANGE_DOUBLE 2
333 #define PF_MMX_INSTRUCTIONS_AVAILABLE 3
334 #define PF_PPC_MOVEMEM_64BIT_OK 4
335 #define PF_ALPHA_BYTE_INSTRUCTIONS 5
336 #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
337 #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
338 #define PF_RDTSC_INSTRUCTION_AVAILABLE 8
339 #define PF_PAE_ENABLED 9
340 #define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
341 #define PF_SSE_DAZ_MODE_AVAILABLE 11
342 #define PF_NX_ENABLED 12
343 #define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
344 #define PF_COMPARE_EXCHANGE128 14
345 #define PF_COMPARE64_EXCHANGE128 15
346 #define PF_CHANNELS_ENABLED 16
351 // Intrinsics (note: taken from our winnt.h)
354 #if defined(__GNUC__)
356 static __inline__ BOOLEAN
357 InterlockedBitTestAndSet(IN LONG
volatile *Base
,
362 __asm__
__volatile__("lock "
365 :"=r" (OldBit
),"+m" (*Base
)
370 return (_InterlockedOr(Base
, 1 << Bit
) >> Bit
) & 1;
374 static __inline__ BOOLEAN
375 InterlockedBitTestAndReset(IN LONG
volatile *Base
,
380 __asm__
__volatile__("lock "
383 :"=r" (OldBit
),"+m" (*Base
)
388 return (_InterlockedAnd(Base
, ~(1 << Bit
)) >> Bit
) & 1;
394 #define BitScanForward _BitScanForward
395 #define BitScanReverse _BitScanReverse
397 #define BitTest _bittest
398 #define BitTestAndComplement _bittestandcomplement
399 #define BitTestAndSet _bittestandset
400 #define BitTestAndReset _bittestandreset
401 #define InterlockedBitTestAndSet _interlockedbittestandset
402 #define InterlockedBitTestAndReset _interlockedbittestandreset
405 /** INTERLOCKED FUNCTIONS *****************************************************/
407 #if !defined(__INTERLOCKED_DECLARED)
408 #define __INTERLOCKED_DECLARED
411 #if defined(NO_INTERLOCKED_INTRINSICS)
415 InterlockedIncrement(
416 IN OUT LONG
volatile *Addend
);
421 InterlockedDecrement(
422 IN OUT LONG
volatile *Addend
);
427 InterlockedCompareExchange(
428 IN OUT LONG
volatile *Destination
,
436 IN OUT LONG
volatile *Destination
,
442 InterlockedExchangeAdd(
443 IN OUT LONG
volatile *Addend
,
446 #else // !defined(NO_INTERLOCKED_INTRINSICS)
448 #define InterlockedExchange _InterlockedExchange
449 #define InterlockedIncrement _InterlockedIncrement
450 #define InterlockedDecrement _InterlockedDecrement
451 #define InterlockedExchangeAdd _InterlockedExchangeAdd
452 #define InterlockedCompareExchange _InterlockedCompareExchange
453 #define InterlockedOr _InterlockedOr
454 #define InterlockedAnd _InterlockedAnd
455 #define InterlockedXor _InterlockedXor
457 #endif // !defined(NO_INTERLOCKED_INTRINSICS)
459 #endif // defined (_X86_)
461 #if !defined (_WIN64)
464 * InterlockedExchangePointer(
465 * IN OUT PVOID volatile *Target,
468 #define InterlockedExchangePointer(Target, Value) \
469 ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
473 * InterlockedCompareExchangePointer(
474 * IN OUT PVOID *Destination,
476 * IN PVOID Comparand)
478 #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
479 ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
481 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
482 #define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
483 #define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
485 #endif // !defined (_WIN64)
487 #if defined (_M_AMD64)
489 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONGLONG *)a, (LONGLONG)b)
490 #define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONGLONG *)a)
491 #define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONGLONG *)a)
492 #define InterlockedAnd _InterlockedAnd
493 #define InterlockedOr _InterlockedOr
494 #define InterlockedXor _InterlockedXor
495 #define InterlockedIncrement _InterlockedIncrement
496 #define InterlockedDecrement _InterlockedDecrement
497 #define InterlockedAdd _InterlockedAdd
498 #define InterlockedExchange _InterlockedExchange
499 #define InterlockedExchangeAdd _InterlockedExchangeAdd
500 #define InterlockedCompareExchange _InterlockedCompareExchange
501 #define InterlockedAnd64 _InterlockedAnd64
502 #define InterlockedOr64 _InterlockedOr64
503 #define InterlockedXor64 _InterlockedXor64
504 #define InterlockedIncrement64 _InterlockedIncrement64
505 #define InterlockedDecrement64 _InterlockedDecrement64
506 #define InterlockedAdd64 _InterlockedAdd64
507 #define InterlockedExchange64 _InterlockedExchange64
508 #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
509 #define InterlockedCompareExchange64 _InterlockedCompareExchange64
510 #define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
511 #define InterlockedExchangePointer _InterlockedExchangePointer
512 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
513 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
517 #if defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
518 //#if !defined(_X86AMD64_) // FIXME: what's _X86AMD64_ used for?
522 IN OUT LONG64
volatile *Addend
,
525 return InterlockedExchangeAdd64(Addend
, Value
) + Value
;
530 #endif /* !__INTERLOCKED_DECLARED */
533 #define YieldProcessor _mm_pause
534 #elif defined (_M_AMD64)
535 #define YieldProcessor _mm_pause
536 #elif defined(_M_PPC)
537 #define YieldProcessor() __asm__ __volatile__("nop");
538 #elif defined(_M_MIPS)
539 #define YieldProcessor() __asm__ __volatile__("nop");
540 #elif defined(_M_ARM)
541 #define YieldProcessor()
543 #error Unknown architecture
551 #ifndef _SLIST_HEADER_
552 #define _SLIST_HEADER_
554 #define SLIST_ENTRY SINGLE_LIST_ENTRY
555 #define _SLIST_ENTRY _SINGLE_LIST_ENTRY
556 #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
559 typedef union _SLIST_HEADER
{
566 ULONGLONG Sequence
:9;
567 ULONGLONG NextEntry
:39;
568 ULONGLONG HeaderType
:1;
570 ULONGLONG Reserved
:59;
575 ULONGLONG Sequence
:48;
576 ULONGLONG HeaderType
:1;
578 ULONGLONG Reserved
:2;
579 ULONGLONG NextEntry
:60;
581 } SLIST_HEADER
, *PSLIST_HEADER
;
583 typedef union _SLIST_HEADER
{
590 } SLIST_HEADER
, *PSLIST_HEADER
;
593 #endif /* _SLIST_HEADER_ */
598 // Power States/Levels
600 typedef enum _SYSTEM_POWER_STATE
{
601 PowerSystemUnspecified
,
603 PowerSystemSleeping1
,
604 PowerSystemSleeping2
,
605 PowerSystemSleeping3
,
606 PowerSystemHibernate
,
609 } SYSTEM_POWER_STATE
, *PSYSTEM_POWER_STATE
;
611 #define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
613 typedef enum _POWER_INFORMATION_LEVEL
{
616 VerifySystemPolicyAc
,
617 VerifySystemPolicyDc
,
618 SystemPowerCapabilities
,
620 SystemPowerStateHandler
,
621 ProcessorStateHandler
,
622 SystemPowerPolicyCurrent
,
623 AdministratorPowerPolicy
,
624 SystemReserveHiberFile
,
625 ProcessorInformation
,
626 SystemPowerInformation
,
627 ProcessorStateHandler2
,
630 SystemExecutionState
,
631 SystemPowerStateNotifyHandler
,
632 ProcessorPowerPolicyAc
,
633 ProcessorPowerPolicyDc
,
634 VerifyProcessorPowerPolicyAc
,
635 VerifyProcessorPowerPolicyDc
,
636 ProcessorPowerPolicyCurrent
637 } POWER_INFORMATION_LEVEL
;
643 PowerActionHibernate
,
645 PowerActionShutdownReset
,
646 PowerActionShutdownOff
,
648 } POWER_ACTION
, *PPOWER_ACTION
;
650 typedef enum _DEVICE_POWER_STATE
{
651 PowerDeviceUnspecified
,
657 } DEVICE_POWER_STATE
, *PDEVICE_POWER_STATE
;
659 #define ES_SYSTEM_REQUIRED 0x00000001
660 #define ES_DISPLAY_REQUIRED 0x00000002
661 #define ES_USER_PRESENT 0x00000004
662 #define ES_CONTINUOUS 0x80000000
664 typedef ULONG EXECUTION_STATE
;
674 // Access/Security Stuff
676 typedef ULONG ACCESS_MASK
, *PACCESS_MASK
;
677 typedef PVOID PACCESS_TOKEN
;
679 #define DELETE 0x00010000L
680 #define READ_CONTROL 0x00020000L
681 #define WRITE_DAC 0x00040000L
682 #define WRITE_OWNER 0x00080000L
683 #define SYNCHRONIZE 0x00100000L
684 #define STANDARD_RIGHTS_REQUIRED 0x000F0000L
685 #define STANDARD_RIGHTS_READ READ_CONTROL
686 #define STANDARD_RIGHTS_WRITE READ_CONTROL
687 #define STANDARD_RIGHTS_EXECUTE READ_CONTROL
688 #define STANDARD_RIGHTS_ALL 0x001F0000L
689 #define SPECIFIC_RIGHTS_ALL 0x0000FFFFL
690 #define ACCESS_SYSTEM_SECURITY 0x01000000L
691 #define MAXIMUM_ALLOWED 0x02000000L
692 #define GENERIC_READ 0x80000000L
693 #define GENERIC_WRITE 0x40000000L
694 #define GENERIC_EXECUTE 0x20000000L
695 #define GENERIC_ALL 0x10000000L
697 typedef struct _GENERIC_MAPPING
{
698 ACCESS_MASK GenericRead
;
699 ACCESS_MASK GenericWrite
;
700 ACCESS_MASK GenericExecute
;
701 ACCESS_MASK GenericAll
;
702 } GENERIC_MAPPING
, *PGENERIC_MAPPING
;
704 #define ACL_REVISION 2
705 #define ACL_REVISION_DS 4
707 #define ACL_REVISION1 1
708 #define ACL_REVISION2 2
709 #define ACL_REVISION3 3
710 #define ACL_REVISION4 4
711 #define MIN_ACL_REVISION ACL_REVISION2
712 #define MAX_ACL_REVISION ACL_REVISION4
714 typedef struct _ACL
{
725 // Current security descriptor revision value
727 #define SECURITY_DESCRIPTOR_REVISION (1)
728 #define SECURITY_DESCRIPTOR_REVISION1 (1)
731 // Privilege attributes
733 #define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
734 #define SE_PRIVILEGE_ENABLED (0x00000002L)
735 #define SE_PRIVILEGE_REMOVED (0X00000004L)
736 #define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
738 #define SE_PRIVILEGE_VALID_ATTRIBUTES (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
739 SE_PRIVILEGE_ENABLED | \
740 SE_PRIVILEGE_REMOVED | \
741 SE_PRIVILEGE_USED_FOR_ACCESS)
743 #include <pshpack4.h>
744 typedef struct _LUID_AND_ATTRIBUTES
{
747 } LUID_AND_ATTRIBUTES
, *PLUID_AND_ATTRIBUTES
;
749 typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY
[ANYSIZE_ARRAY
];
750 typedef LUID_AND_ATTRIBUTES_ARRAY
*PLUID_AND_ATTRIBUTES_ARRAY
;
757 #define PRIVILEGE_SET_ALL_NECESSARY (1)
759 typedef struct _PRIVILEGE_SET
{
760 ULONG PrivilegeCount
;
762 LUID_AND_ATTRIBUTES Privilege
[ANYSIZE_ARRAY
];
763 } PRIVILEGE_SET
,*PPRIVILEGE_SET
;
765 typedef enum _SECURITY_IMPERSONATION_LEVEL
{
767 SecurityIdentification
,
768 SecurityImpersonation
,
770 } SECURITY_IMPERSONATION_LEVEL
, * PSECURITY_IMPERSONATION_LEVEL
;
772 #define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
773 #define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
774 #define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
775 #define VALID_IMPERSONATION_LEVEL(Level) (((Level) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((Level) <= SECURITY_MAX_IMPERSONATION_LEVEL))
777 #define SECURITY_DYNAMIC_TRACKING (TRUE)
778 #define SECURITY_STATIC_TRACKING (FALSE)
780 typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE
, *PSECURITY_CONTEXT_TRACKING_MODE
;
782 typedef struct _SECURITY_QUALITY_OF_SERVICE
{
784 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
;
785 SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode
;
786 BOOLEAN EffectiveOnly
;
787 } SECURITY_QUALITY_OF_SERVICE
, *PSECURITY_QUALITY_OF_SERVICE
;
789 typedef struct _SE_IMPERSONATION_STATE
{
792 BOOLEAN EffectiveOnly
;
793 SECURITY_IMPERSONATION_LEVEL Level
;
794 } SE_IMPERSONATION_STATE
, *PSE_IMPERSONATION_STATE
;
796 #define OWNER_SECURITY_INFORMATION (0x00000001L)
797 #define GROUP_SECURITY_INFORMATION (0x00000002L)
798 #define DACL_SECURITY_INFORMATION (0x00000004L)
799 #define SACL_SECURITY_INFORMATION (0x00000008L)
800 #define LABEL_SECURITY_INFORMATION (0x00000010L)
802 #define PROTECTED_DACL_SECURITY_INFORMATION (0x80000000L)
803 #define PROTECTED_SACL_SECURITY_INFORMATION (0x40000000L)
804 #define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L)
805 #define UNPROTECTED_SACL_SECURITY_INFORMATION (0x10000000L)
810 // Registry Access Rights
812 #define KEY_QUERY_VALUE (0x0001)
813 #define KEY_SET_VALUE (0x0002)
814 #define KEY_CREATE_SUB_KEY (0x0004)
815 #define KEY_ENUMERATE_SUB_KEYS (0x0008)
816 #define KEY_NOTIFY (0x0010)
817 #define KEY_CREATE_LINK (0x0020)
818 #define KEY_WOW64_32KEY (0x0200)
819 #define KEY_WOW64_64KEY (0x0100)
820 #define KEY_WOW64_RES (0x0300)
822 #define KEY_READ ((STANDARD_RIGHTS_READ |\
824 KEY_ENUMERATE_SUB_KEYS |\
829 #define KEY_WRITE ((STANDARD_RIGHTS_WRITE |\
831 KEY_CREATE_SUB_KEY) \
835 #define KEY_EXECUTE ((KEY_READ) \
839 #define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL |\
842 KEY_CREATE_SUB_KEY |\
843 KEY_ENUMERATE_SUB_KEYS |\
850 // Registry Open/Create Options
852 #define REG_OPTION_RESERVED (0x00000000L)
853 #define REG_OPTION_NON_VOLATILE (0x00000000L)
854 #define REG_OPTION_VOLATILE (0x00000001L)
855 #define REG_OPTION_CREATE_LINK (0x00000002L)
856 #define REG_OPTION_BACKUP_RESTORE (0x00000004L)
857 #define REG_OPTION_OPEN_LINK (0x00000008L)
859 #define REG_LEGAL_OPTION \
860 (REG_OPTION_RESERVED |\
861 REG_OPTION_NON_VOLATILE |\
862 REG_OPTION_VOLATILE |\
863 REG_OPTION_CREATE_LINK |\
864 REG_OPTION_BACKUP_RESTORE |\
865 REG_OPTION_OPEN_LINK)
868 // Key creation/open disposition
870 #define REG_CREATED_NEW_KEY (0x00000001L)
871 #define REG_OPENED_EXISTING_KEY (0x00000002L)
874 // Key restore & hive load flags
876 #define REG_WHOLE_HIVE_VOLATILE (0x00000001L)
877 #define REG_REFRESH_HIVE (0x00000002L)
878 #define REG_NO_LAZY_FLUSH (0x00000004L)
879 #define REG_FORCE_RESTORE (0x00000008L)
880 #define REG_APP_HIVE (0x00000010L)
881 #define REG_PROCESS_PRIVATE (0x00000020L)
882 #define REG_START_JOURNAL (0x00000040L)
883 #define REG_HIVE_EXACT_FILE_GROWTH (0x00000080L)
884 #define REG_HIVE_NO_RM (0x00000100L)
885 #define REG_HIVE_SINGLE_LOG (0x00000200L)
890 #define REG_FORCE_UNLOAD 1
893 // Notify Filter Values
895 #define REG_NOTIFY_CHANGE_NAME (0x00000001L)
896 #define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L)
897 #define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L)
898 #define REG_NOTIFY_CHANGE_SECURITY (0x00000008L)
900 #define REG_LEGAL_CHANGE_FILTER \
901 (REG_NOTIFY_CHANGE_NAME |\
902 REG_NOTIFY_CHANGE_ATTRIBUTES |\
903 REG_NOTIFY_CHANGE_LAST_SET |\
904 REG_NOTIFY_CHANGE_SECURITY)
909 // Thread Access Rights
911 #define THREAD_TERMINATE (0x0001)
912 #define THREAD_SUSPEND_RESUME (0x0002)
913 #define THREAD_ALERT (0x0004)
914 #define THREAD_GET_CONTEXT (0x0008)
915 #define THREAD_SET_CONTEXT (0x0010)
916 #define THREAD_SET_INFORMATION (0x0020)
917 #define THREAD_SET_LIMITED_INFORMATION (0x0400)
918 #define THREAD_QUERY_LIMITED_INFORMATION (0x0800)
919 #if (NTDDI_VERSION >= NTDDI_VISTA)
920 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
923 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
928 // Service Start Types
930 #define SERVICE_BOOT_START 0x00000000
931 #define SERVICE_SYSTEM_START 0x00000001
932 #define SERVICE_AUTO_START 0x00000002
933 #define SERVICE_DEMAND_START 0x00000003
934 #define SERVICE_DISABLED 0x00000004
939 #define EXCEPTION_NONCONTINUABLE 1
940 #define EXCEPTION_MAXIMUM_PARAMETERS 15
942 typedef struct _EXCEPTION_RECORD
{
943 NTSTATUS ExceptionCode
;
944 ULONG ExceptionFlags
;
945 struct _EXCEPTION_RECORD
*ExceptionRecord
;
946 PVOID ExceptionAddress
;
947 ULONG NumberParameters
;
948 ULONG_PTR ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
949 } EXCEPTION_RECORD
, *PEXCEPTION_RECORD
;
951 typedef struct _EXCEPTION_RECORD32
{
952 NTSTATUS ExceptionCode
;
953 ULONG ExceptionFlags
;
954 ULONG ExceptionRecord
;
955 ULONG ExceptionAddress
;
956 ULONG NumberParameters
;
957 ULONG ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
958 } EXCEPTION_RECORD32
, *PEXCEPTION_RECORD32
;
960 typedef struct _EXCEPTION_RECORD64
{
961 NTSTATUS ExceptionCode
;
962 ULONG ExceptionFlags
;
963 ULONG64 ExceptionRecord
;
964 ULONG64 ExceptionAddress
;
965 ULONG NumberParameters
;
966 ULONG __unusedAlignment
;
967 ULONG64 ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
968 } EXCEPTION_RECORD64
, *PEXCEPTION_RECORD64
;
970 typedef struct _EXCEPTION_POINTERS
{
971 PEXCEPTION_RECORD ExceptionRecord
;
972 PCONTEXT ContextRecord
;
973 } EXCEPTION_POINTERS
, *PEXCEPTION_POINTERS
;
980 typedef struct _QUOTA_LIMITS
{
981 SIZE_T PagedPoolLimit
;
982 SIZE_T NonPagedPoolLimit
;
983 SIZE_T MinimumWorkingSetSize
;
984 SIZE_T MaximumWorkingSetSize
;
985 SIZE_T PagefileLimit
;
986 LARGE_INTEGER TimeLimit
;
987 } QUOTA_LIMITS
, *PQUOTA_LIMITS
;
989 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
990 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
991 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
992 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
993 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
996 /******************************************************************************
997 * WINBASE Functions *
998 ******************************************************************************/
999 #if !defined(_WINBASE_)
1003 #define InterlockedPopEntrySList(Head) \
1004 ExpInterlockedPopEntrySList(Head)
1006 #define InterlockedPushEntrySList(Head, Entry) \
1007 ExpInterlockedPushEntrySList(Head, Entry)
1009 #define InterlockedFlushSList(Head) \
1010 ExpInterlockedFlushSList(Head)
1012 #define QueryDepthSList(Head) \
1013 ExQueryDepthSList(Head)
1015 #else // !defined(_WIN64)
1020 InterlockedPopEntrySList(
1021 IN PSLIST_HEADER ListHead
);
1026 InterlockedPushEntrySList(
1027 IN PSLIST_HEADER ListHead
,
1028 IN PSLIST_ENTRY ListEntry
);
1030 #define InterlockedFlushSList(ListHead) \
1031 ExInterlockedFlushSList(ListHead)
1033 #define QueryDepthSList(Head) \
1034 ExQueryDepthSList(Head)
1036 #endif // !defined(_WIN64)
1038 #endif // !defined(_WINBASE_)
1041 /******************************************************************************
1043 ******************************************************************************/
1045 typedef struct _DISPATCHER_HEADER
1065 BOOLEAN DebugActive
;
1071 LIST_ENTRY WaitListHead
;
1072 } DISPATCHER_HEADER
, *PDISPATCHER_HEADER
;
1074 typedef ULONG_PTR KSPIN_LOCK
, *PKSPIN_LOCK
;
1076 typedef struct _KEVENT
{
1077 DISPATCHER_HEADER Header
;
1078 } KEVENT
, *PKEVENT
, *RESTRICTED_POINTER PRKEVENT
;
1080 typedef struct _KSEMAPHORE
{
1081 DISPATCHER_HEADER Header
;
1083 } KSEMAPHORE
, *PKSEMAPHORE
, *RESTRICTED_POINTER PRKSEMAPHORE
;
1085 /******************************************************************************
1087 ******************************************************************************/
1089 #define RTL_REGISTRY_ABSOLUTE 0
1090 #define RTL_REGISTRY_SERVICES 1
1091 #define RTL_REGISTRY_CONTROL 2
1092 #define RTL_REGISTRY_WINDOWS_NT 3
1093 #define RTL_REGISTRY_DEVICEMAP 4
1094 #define RTL_REGISTRY_USER 5
1095 #define RTL_REGISTRY_MAXIMUM 6
1096 #define RTL_REGISTRY_HANDLE 0x40000000
1097 #define RTL_REGISTRY_OPTIONAL 0x80000000
1099 /* RTL_QUERY_REGISTRY_TABLE.Flags */
1100 #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001
1101 #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002
1102 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004
1103 #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008
1104 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010
1105 #define RTL_QUERY_REGISTRY_DIRECT 0x00000020
1106 #define RTL_QUERY_REGISTRY_DELETE 0x00000040
1108 typedef struct _RTL_BITMAP
{
1111 } RTL_BITMAP
, *PRTL_BITMAP
;
1113 typedef struct _RTL_BITMAP_RUN
{
1114 ULONG StartingIndex
;
1116 } RTL_BITMAP_RUN
, *PRTL_BITMAP_RUN
;
1119 (DDKAPI
*PRTL_QUERY_REGISTRY_ROUTINE
)(
1123 IN ULONG ValueLength
,
1125 IN PVOID EntryContext
);
1127 typedef struct _RTL_QUERY_REGISTRY_TABLE
{
1128 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine
;
1134 ULONG DefaultLength
;
1135 } RTL_QUERY_REGISTRY_TABLE
, *PRTL_QUERY_REGISTRY_TABLE
;
1137 typedef struct _TIME_FIELDS
{
1144 CSHORT Milliseconds
;
1146 } TIME_FIELDS
, *PTIME_FIELDS
;
1149 /******************************************************************************
1151 ******************************************************************************/
1157 IN PVOID FailedAssertion
,
1159 IN ULONG LineNumber
,
1164 * IN VOID UNALIGNED *Destination,
1165 * IN CONST VOID UNALIGNED *Source,
1168 #define RtlCopyMemory(Destination, Source, Length) \
1169 memcpy(Destination, Source, Length)
1171 #define RtlCopyBytes RtlCopyMemory
1173 #if defined(_M_AMD64)
1177 RtlCopyMemoryNonTemporal(
1178 VOID UNALIGNED
*Destination
,
1179 CONST VOID UNALIGNED
*Source
,
1182 #define RtlCopyMemoryNonTemporal RtlCopyMemory
1190 #define RtlEqualLuid(Luid1, Luid2) \
1191 (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
1195 * IN VOID UNALIGNED *Destination,
1196 * IN CONST VOID UNALIGNED *Source,
1199 #define RtlEqualMemory(Destination, Source, Length) \
1200 (!memcmp(Destination, Source, Length))
1204 * IN VOID UNALIGNED *Destination,
1208 #define RtlFillMemory(Destination, Length, Fill) \
1209 memset(Destination, Fill, Length)
1211 #define RtlFillBytes RtlFillMemory
1216 RtlFreeUnicodeString(
1217 IN PUNICODE_STRING UnicodeString
);
1223 IN PUNICODE_STRING GuidString
,
1229 RtlInitUnicodeString(
1230 IN OUT PUNICODE_STRING DestinationString
,
1231 IN PCWSTR SourceString
);
1235 * IN VOID UNALIGNED *Destination,
1236 * IN CONST VOID UNALIGNED *Source,
1239 #define RtlMoveMemory(Destination, Source, Length) \
1240 memmove(Destination, Source, Length)
1247 OUT PUNICODE_STRING GuidString
);
1251 * IN VOID UNALIGNED *Destination,
1254 #define RtlZeroMemory(Destination, Length) \
1255 memset(Destination, 0, Length)
1257 #define RtlZeroBytes RtlZeroMemory
1260 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1265 IN PRTL_BITMAP BitMapHeader
,
1266 IN ULONG StartingIndex
,
1273 IN PRTL_BITMAP BitMapHeader
,
1274 IN ULONG StartingIndex
,
1280 RtlAnsiStringToUnicodeString(
1281 IN OUT PUNICODE_STRING DestinationString
,
1282 IN PANSI_STRING SourceString
,
1283 IN BOOLEAN AllocateDestinationString
);
1288 RtlxAnsiStringToUnicodeSize(
1289 IN PCANSI_STRING AnsiString
);
1291 #define RtlAnsiStringToUnicodeSize(String) ( \
1292 NLS_MB_CODE_PAGE_TAG ? \
1293 RtlxAnsiStringToUnicodeSize(String) : \
1294 ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
1300 RtlAppendUnicodeStringToString(
1301 IN OUT PUNICODE_STRING Destination
,
1302 IN PCUNICODE_STRING Source
);
1307 RtlAppendUnicodeToString(
1308 IN OUT PUNICODE_STRING Destination
,
1314 RtlCheckRegistryKey(
1315 IN ULONG RelativeTo
,
1322 IN PRTL_BITMAP BitMapHeader
);
1328 IN PRTL_BITMAP BitMapHeader
,
1329 IN ULONG StartingIndex
,
1330 IN ULONG NumberToClear
);
1336 IN CONST VOID
*Source1
,
1337 IN CONST VOID
*Source2
,
1343 RtlCompareUnicodeString(
1344 IN PCUNICODE_STRING String1
,
1345 IN PCUNICODE_STRING String2
,
1346 IN BOOLEAN CaseInSensitive
);
1351 RtlCompareUnicodeStrings(
1353 IN SIZE_T String1Length
,
1355 IN SIZE_T String2Length
,
1356 IN BOOLEAN CaseInSensitive
);
1361 RtlCopyUnicodeString(
1362 IN OUT PUNICODE_STRING DestinationString
,
1363 IN PCUNICODE_STRING SourceString
);
1368 RtlCreateRegistryKey(
1369 IN ULONG RelativeTo
,
1375 RtlCreateSecurityDescriptor(
1376 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
1382 RtlDeleteRegistryValue(
1383 IN ULONG RelativeTo
,
1385 IN PCWSTR ValueName
);
1390 RtlEqualUnicodeString(
1391 IN CONST UNICODE_STRING
*String1
,
1392 IN CONST UNICODE_STRING
*String2
,
1393 IN BOOLEAN CaseInSensitive
);
1395 #if !defined(_AMD64_) && !defined(_IA64_)
1399 RtlExtendedIntegerMultiply(
1400 IN LARGE_INTEGER Multiplicand
,
1401 IN LONG Multiplier
);
1406 RtlExtendedLargeIntegerDivide(
1407 IN LARGE_INTEGER Dividend
,
1409 IN OUT PULONG Remainder
);
1412 #if defined(_X86_) || defined(_IA64_)
1416 RtlExtendedMagicDivide(
1417 IN LARGE_INTEGER Dividend
,
1418 IN LARGE_INTEGER MagicDivisor
,
1419 IN CCHAR ShiftCount
);
1426 IN PANSI_STRING AnsiString
);
1432 IN PRTL_BITMAP BitMapHeader
,
1433 IN ULONG NumberToFind
,
1434 IN ULONG HintIndex
);
1439 RtlFindClearBitsAndSet(
1440 IN PRTL_BITMAP BitMapHeader
,
1441 IN ULONG NumberToFind
,
1442 IN ULONG HintIndex
);
1447 RtlFindFirstRunClear(
1448 IN PRTL_BITMAP BitMapHeader
,
1449 OUT PULONG StartingIndex
);
1455 IN PRTL_BITMAP BitMapHeader
,
1456 OUT PRTL_BITMAP_RUN RunArray
,
1457 IN ULONG SizeOfRunArray
,
1458 IN BOOLEAN LocateLongestRuns
);
1463 RtlFindLastBackwardRunClear(
1464 IN PRTL_BITMAP BitMapHeader
,
1466 OUT PULONG StartingRunIndex
);
1471 RtlFindLeastSignificantBit(
1477 RtlFindLongestRunClear(
1478 IN PRTL_BITMAP BitMapHeader
,
1479 OUT PULONG StartingIndex
);
1484 RtlFindMostSignificantBit(
1490 RtlFindNextForwardRunClear(
1491 IN PRTL_BITMAP BitMapHeader
,
1493 OUT PULONG StartingRunIndex
);
1499 IN PRTL_BITMAP BitMapHeader
,
1500 IN ULONG NumberToFind
,
1501 IN ULONG HintIndex
);
1506 RtlFindSetBitsAndClear(
1507 IN PRTL_BITMAP BitMapHeader
,
1508 IN ULONG NumberToFind
,
1509 IN ULONG HintIndex
);
1514 RtlHashUnicodeString(
1515 IN CONST UNICODE_STRING
*String
,
1516 IN BOOLEAN CaseInSensitive
,
1517 IN ULONG HashAlgorithm
,
1518 OUT PULONG HashValue
);
1524 IN OUT PANSI_STRING DestinationString
,
1525 IN PCSZ SourceString
);
1530 RtlInitializeBitMap(
1531 IN PRTL_BITMAP BitMapHeader
,
1532 IN PULONG BitMapBuffer
,
1533 IN ULONG SizeOfBitMap
);
1539 IN OUT PSTRING DestinationString
,
1540 IN PCSZ SourceString
);
1545 RtlIntegerToUnicodeString(
1547 IN ULONG Base OPTIONAL
,
1548 IN OUT PUNICODE_STRING String
);
1553 RtlInt64ToUnicodeString(
1555 IN ULONG Base OPTIONAL
,
1556 IN OUT PUNICODE_STRING String
);
1559 #define RtlIntPtrToUnicodeString(Value, Base, String) \
1560 RtlInt64ToUnicodeString(Value, Base, String)
1562 #define RtlIntPtrToUnicodeString(Value, Base, String) \
1563 RtlIntegerToUnicodeString(Value, Base, String)
1570 #define RtlIsZeroLuid(_L1) \
1571 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
1576 RtlLengthSecurityDescriptor(
1577 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
1582 RtlNumberOfClearBits(
1583 IN PRTL_BITMAP BitMapHeader
);
1589 IN PRTL_BITMAP BitMapHeader
);
1594 RtlQueryRegistryValues(
1595 IN ULONG RelativeTo
,
1597 IN PRTL_QUERY_REGISTRY_TABLE QueryTable
,
1599 IN PVOID Environment OPTIONAL
);
1601 #define LONG_SIZE (sizeof(LONG))
1602 #define LONG_MASK (LONG_SIZE - 1)
1606 * PULONG DestinationAddress,
1607 * PULONG SourceAddress);
1609 #if defined(_AMD64_)
1610 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
1611 *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
1613 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
1614 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
1616 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
1617 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
1618 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
1619 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
1623 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
1628 * RtlRetrieveUshort(
1629 * PUSHORT DestinationAddress,
1630 * PUSHORT SourceAddress);
1632 #if defined(_AMD64_)
1633 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
1634 *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
1636 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
1637 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
1639 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
1640 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
1644 *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
1652 IN PRTL_BITMAP BitMapHeader
);
1658 IN PRTL_BITMAP BitMapHeader
,
1659 IN ULONG StartingIndex
,
1660 IN ULONG NumberToSet
);
1665 RtlSetDaclSecurityDescriptor(
1666 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
1667 IN BOOLEAN DaclPresent
,
1668 IN PACL Dacl OPTIONAL
,
1669 IN BOOLEAN DaclDefaulted OPTIONAL
);
1673 * IN PULONG Address,
1676 #if defined(_AMD64_)
1677 #define RtlStoreUlong(Address,Value) \
1678 *(ULONG UNALIGNED *)(Address) = (Value)
1680 #define RtlStoreUlong(Address,Value) \
1681 if ((ULONG_PTR)(Address) & LONG_MASK) { \
1682 ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
1683 ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
1684 ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
1685 ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT] = (UCHAR)(FOURTHBYTE(Value)); \
1688 *((PULONG)(Address)) = (ULONG) (Value); \
1693 * RtlStoreUlonglong(
1694 * IN OUT PULONGLONG Address,
1697 #if defined(_AMD64_)
1698 #define RtlStoreUlonglong(Address,Value) \
1699 *(ULONGLONG UNALIGNED *)(Address) = (Value)
1701 #define RtlStoreUlonglong(Address,Value) \
1702 if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
1703 RtlStoreUlong((ULONG_PTR)(Address), \
1704 (ULONGLONG)(Value) & 0xFFFFFFFF); \
1705 RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
1706 (ULONGLONG)(Value) >> 32); \
1708 *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
1714 * IN OUT PULONG_PTR Address,
1715 * IN ULONG_PTR Value);
1718 #define RtlStoreUlongPtr(Address,Value) \
1719 RtlStoreUlonglong(Address,Value)
1721 #define RtlStoreUlongPtr(Address,Value) \
1722 RtlStoreUlong(Address,Value)
1727 * IN PUSHORT Address,
1730 #if defined(_AMD64_)
1731 #define RtlStoreUshort(Address,Value) \
1732 *(USHORT UNALIGNED *)(Address) = (Value)
1734 #define RtlStoreUshort(Address,Value) \
1735 if ((ULONG_PTR)(Address) & SHORT_MASK) { \
1736 ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
1737 ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
1740 *((PUSHORT) (Address)) = (USHORT)Value; \
1747 RtlTimeFieldsToTime(
1748 IN PTIME_FIELDS TimeFields
,
1749 IN PLARGE_INTEGER Time
);
1754 RtlTimeToTimeFields(
1755 IN PLARGE_INTEGER Time
,
1756 IN PTIME_FIELDS TimeFields
);
1767 RtlUlonglongByteSwap(
1768 IN ULONGLONG Source
);
1773 RtlUnicodeStringToAnsiString(
1774 IN OUT PANSI_STRING DestinationString
,
1775 IN PCUNICODE_STRING SourceString
,
1776 IN BOOLEAN AllocateDestinationString
);
1781 RtlxUnicodeStringToAnsiSize(
1782 IN PCUNICODE_STRING UnicodeString
);
1784 #define RtlUnicodeStringToAnsiSize(String) ( \
1785 NLS_MB_CODE_PAGE_TAG ? \
1786 RtlxUnicodeStringToAnsiSize(String) : \
1787 ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
1793 RtlUnicodeStringToInteger(
1794 IN PCUNICODE_STRING String
,
1795 IN ULONG Base OPTIONAL
,
1801 RtlUpcaseUnicodeChar(
1802 IN WCHAR SourceCharacter
);
1813 RtlValidRelativeSecurityDescriptor(
1814 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput
,
1815 IN ULONG SecurityDescriptorLength
,
1816 IN SECURITY_INFORMATION RequiredInformation
);
1821 RtlValidSecurityDescriptor(
1822 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
1827 RtlWriteRegistryValue(
1828 IN ULONG RelativeTo
,
1830 IN PCWSTR ValueName
,
1833 IN ULONG ValueLength
);
1835 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
1837 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
1841 RtlPrefetchMemoryNonTemporal(
1846 #if (NTDDI_VERSION >= NTDDI_WINXP)
1851 PRTL_BITMAP BitMapHeader
,
1857 RtlDowncaseUnicodeChar(
1858 IN WCHAR SourceCharacter
);
1864 PRTL_BITMAP BitMapHeader
,
1871 IN PRTL_BITMAP BitMapHeader
,
1872 IN ULONG BitNumber
);
1874 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
1876 #if (NTDDI_VERSION >= NTDDI_VISTA)
1880 RtlNumberOfSetBitsUlongPtr(
1881 IN ULONG_PTR Target
);
1886 RtlIoDecodeMemIoResource (
1887 IN PIO_RESOURCE_DESCRIPTOR Descriptor
,
1888 OUT PULONGLONG Alignment OPTIONAL
,
1889 OUT PULONGLONG MinimumAddress OPTIONAL
,
1890 OUT PULONGLONG MaximumAddress OPTIONAL
);
1895 RtlIoEncodeMemIoResource(
1896 IN PIO_RESOURCE_DESCRIPTOR Descriptor
,
1898 IN ULONGLONG Length
,
1899 IN ULONGLONG Alignment
,
1900 IN ULONGLONG MinimumAddress
,
1901 IN ULONGLONG MaximumAddress
);
1906 RtlCmDecodeMemIoResource(
1907 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor
,
1908 OUT PULONGLONG Start OPTIONAL
);
1913 RtlFindClosestEncodableLength(
1914 IN ULONGLONG SourceLength
,
1915 OUT PULONGLONG TargetLength
);
1919 #if !defined(MIDL_PASS)
1920 /* inline funftions */
1921 //DECLSPEC_DEPRECATED_DDK_WINXP
1925 RtlConvertLongToLargeInteger(LONG SignedInteger
)
1928 ret
.QuadPart
= SignedInteger
;
1932 //DECLSPEC_DEPRECATED_DDK_WINXP
1936 RtlConvertUlongToLargeInteger(
1937 ULONG UnsignedInteger
)
1940 ret
.QuadPart
= UnsignedInteger
;
1944 //DECLSPEC_DEPRECATED_DDK
1948 RtlEnlargedUnsignedDivide(
1949 IN ULARGE_INTEGER Dividend
,
1951 IN OUT PULONG Remainder
)
1954 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
1955 return (ULONG
)(Dividend
.QuadPart
/ Divisor
);
1958 //DECLSPEC_DEPRECATED_DDK
1962 RtlEnlargedUnsignedMultiply(
1963 IN ULONG Multiplicand
,
1964 IN ULONG Multiplier
)
1967 ret
.QuadPart
= (ULONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
1971 //DECLSPEC_DEPRECATED_DDK
1975 RtlEnlargedIntegerMultiply(
1976 IN LONG Multiplicand
,
1980 ret
.QuadPart
= (LONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
1986 RtlInitEmptyAnsiString(OUT PANSI_STRING AnsiString
,
1988 IN USHORT BufferSize
)
1990 AnsiString
->Length
= 0;
1991 AnsiString
->MaximumLength
= BufferSize
;
1992 AnsiString
->Buffer
= Buffer
;
1997 RtlInitEmptyUnicodeString(
1998 OUT PUNICODE_STRING UnicodeString
,
2000 IN USHORT BufferSize
)
2002 UnicodeString
->Length
= 0;
2003 UnicodeString
->MaximumLength
= BufferSize
;
2004 UnicodeString
->Buffer
= Buffer
;
2007 #if defined(_AMD64_) || defined(_IA64_)
2011 RtlExtendedIntegerMultiply(
2012 LARGE_INTEGER Multiplicand
,
2016 ret
.QuadPart
= Multiplicand
.QuadPart
* Multiplier
;
2023 RtlExtendedLargeIntegerDivide(
2024 LARGE_INTEGER Dividend
,
2029 ret
.QuadPart
= (ULONG64
)Dividend
.QuadPart
/ Divisor
;
2031 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
2036 #if defined(_AMD64_)
2038 #define MultiplyHigh __mulh
2039 #define UnsignedMultiplyHigh __umulh
2041 //DECLSPEC_DEPRECATED_DDK
2045 RtlExtendedMagicDivide(
2046 IN LARGE_INTEGER Dividend
,
2047 IN LARGE_INTEGER MagicDivisor
,
2048 IN CCHAR ShiftCount
)
2053 Pos
= (Dividend
.QuadPart
>= 0);
2054 ret64
= UnsignedMultiplyHigh(Pos
? Dividend
.QuadPart
: -Dividend
.QuadPart
,
2055 MagicDivisor
.QuadPart
);
2056 ret64
>>= ShiftCount
;
2057 ret
.QuadPart
= Pos
? ret64
: -ret64
;
2062 //DECLSPEC_DEPRECATED_DDK
2067 IN LARGE_INTEGER Addend1
,
2068 IN LARGE_INTEGER Addend2
)
2071 ret
.QuadPart
= Addend1
.QuadPart
+ Addend2
.QuadPart
;
2076 * RtlLargeIntegerAnd(
2077 * IN OUT LARGE_INTEGER Result,
2078 * IN LARGE_INTEGER Source,
2079 * IN LARGE_INTEGER Mask);
2081 #define RtlLargeIntegerAnd(Result, Source, Mask) \
2082 Result.QuadPart = Source.QuadPart & Mask.QuadPart
2084 //DECLSPEC_DEPRECATED_DDK
2088 RtlLargeIntegerArithmeticShift(
2089 IN LARGE_INTEGER LargeInteger
,
2090 IN CCHAR ShiftCount
)
2093 ret
.QuadPart
= LargeInteger
.QuadPart
>> ShiftCount
;
2098 * RtlLargeIntegerEqualTo(
2099 * IN LARGE_INTEGER Operand1,
2100 * IN LARGE_INTEGER Operand2);
2102 #define RtlLargeIntegerEqualTo(X,Y) \
2103 (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
2107 RtlSecureZeroMemory(
2111 volatile char* vptr
= (volatile char*)Pointer
;
2112 #if defined(_M_AMD64)
2113 __stosb((PUCHAR
)vptr
, 0, Size
);
2115 char * endptr
= (char *)vptr
+ Size
;
2116 while (vptr
< endptr
)
2124 #if defined(_M_AMD64)
2128 IN PRTL_BITMAP BitMapHeader
,
2129 IN ULONG BitPosition
)
2131 return BitTest((LONG CONST
*)BitMapHeader
->Buffer
, BitPosition
);
2134 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
2135 #endif // defined(_M_AMD64)
2137 #endif // !defined(MIDL_PASS)
2140 // Byte Swap Functions
2142 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \
2143 ((defined(_M_AMD64) || defined(_M_IA64)) \
2144 && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))
2146 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
2147 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
2148 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
2152 /******************************************************************************
2153 * Memory manager Types *
2154 ******************************************************************************/
2156 typedef struct _MDL
{
2160 struct _EPROCESS
*Process
;
2161 PVOID MappedSystemVa
;
2168 /******************************************************************************
2169 * Memory manager Functions *
2170 ******************************************************************************/
2172 /* PVOID MmGetSystemAddressForMdl(
2175 #define MmGetSystemAddressForMdl(Mdl) \
2176 (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
2177 MDL_SOURCE_IS_NONPAGED_POOL)) ? \
2178 ((Mdl)->MappedSystemVa) : \
2179 (MmMapLockedPages((Mdl), KernelMode)))
2182 * MmGetSystemAddressForMdlSafe(
2184 * IN MM_PAGE_PRIORITY Priority)
2186 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
2187 (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
2188 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
2189 (_Mdl)->MappedSystemVa : \
2190 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
2191 KernelMode, MmCached, NULL, FALSE, (_Priority)))
2193 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2198 IN PMDL MemoryDescriptorList OPTIONAL
,
2205 /******************************************************************************
2206 * I/O Manager Functions *
2207 ******************************************************************************/
2209 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
2210 (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
2212 #define DMA_MACROS_DEFINED
2216 IoAllocateAdapterChannel(
2217 IN PADAPTER_OBJECT AdapterObject
,
2218 IN PDEVICE_OBJECT DeviceObject
,
2219 IN ULONG NumberOfMapRegisters
,
2220 IN PDRIVER_CONTROL ExecutionRoutine
,
2223 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel
;
2224 AllocateAdapterChannel
=
2225 *(DmaAdapter
)->DmaOperations
->AllocateAdapterChannel
;
2226 ASSERT(AllocateAdapterChannel
);
2227 return AllocateAdapterChannel(DmaAdapter
,
2229 NumberOfMapRegisters
,
2236 IoFlushAdapterBuffers(
2237 IN PADAPTER_OBJECT AdapterObject
,
2239 IN PVOID MapRegisterBase
,
2242 IN BOOLEAN WriteToDevice
)
2244 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers
;
2245 FlushAdapterBuffers
= *(DmaAdapter
)->DmaOperations
->FlushAdapterBuffers
;
2246 ASSERT(FlushAdapterBuffers
);
2247 return FlushAdapterBuffers(DmaAdapter
,
2257 IoFreeAdapterChannel(
2258 IN PADAPTER_OBJECT AdapterObject
)
2260 PFREE_ADAPTER_CHANNEL FreeAdapterChannel
;
2261 FreeAdapterChannel
= *(DmaAdapter
)->DmaOperations
->FreeAdapterChannel
;
2262 ASSERT(FreeAdapterChannel
);
2263 FreeAdapterChannel(DmaAdapter
);
2269 IN PADAPTER_OBJECT AdapterObject
,
2270 IN PVOID MapRegisterBase
,
2271 IN ULONG NumberOfMapRegisters
)
2273 PFREE_MAP_REGISTERS FreeMapRegisters
;
2274 FreeMapRegisters
= *(DmaAdapter
)->DmaOperations
->FreeMapRegisters
;
2275 ASSERT(FreeMapRegisters
);
2276 FreeMapRegisters(DmaAdapter
, MapRegisterBase
, NumberOfMapRegisters
);
2282 IN PDMA_ADAPTER DmaAdapter
,
2284 IN PVOID MapRegisterBase
,
2286 IN OUT PULONG Length
,
2287 IN BOOLEAN WriteToDevice
)
2289 PMAP_TRANSFER MapTransfer
;
2291 MapTransfer
= *(DmaAdapter
)->DmaOperations
->MapTransfer
;
2292 ASSERT(MapTransfer
);
2293 return MapTransfer(DmaAdapter
,
2303 /******************************************************************************
2305 ******************************************************************************/
2307 typedef enum _POOL_TYPE
{
2310 NonPagedPoolMustSucceed
,
2312 NonPagedPoolCacheAligned
,
2313 PagedPoolCacheAligned
,
2314 NonPagedPoolCacheAlignedMustS
,
2316 NonPagedPoolSession
= 32,
2318 NonPagedPoolMustSucceedSession
,
2319 DontUseThisTypeSession
,
2320 NonPagedPoolCacheAlignedSession
,
2321 PagedPoolCacheAlignedSession
,
2322 NonPagedPoolCacheAlignedMustSSession
2325 typedef enum _SUITE_TYPE
{
2329 CommunicationServer
,
2331 SmallBusinessRestricted
,
2340 typedef enum _EX_POOL_PRIORITY
{
2342 LowPoolPrioritySpecialPoolOverrun
= 8,
2343 LowPoolPrioritySpecialPoolUnderrun
= 9,
2344 NormalPoolPriority
= 16,
2345 NormalPoolPrioritySpecialPoolOverrun
= 24,
2346 NormalPoolPrioritySpecialPoolUnderrun
= 25,
2347 HighPoolPriority
= 32,
2348 HighPoolPrioritySpecialPoolOverrun
= 40,
2349 HighPoolPrioritySpecialPoolUnderrun
= 41
2352 typedef struct _FAST_MUTEX
2359 } FAST_MUTEX
, *PFAST_MUTEX
;
2361 typedef ULONG_PTR ERESOURCE_THREAD
, *PERESOURCE_THREAD
;
2363 typedef struct _OWNER_ENTRY
{
2364 ERESOURCE_THREAD OwnerThread
;
2365 _ANONYMOUS_UNION
union {
2369 } OWNER_ENTRY
, *POWNER_ENTRY
;
2371 typedef struct _ERESOURCE
2373 LIST_ENTRY SystemResourcesList
;
2374 POWNER_ENTRY OwnerTable
;
2377 volatile PKSEMAPHORE SharedWaiters
;
2378 volatile PKEVENT ExclusiveWaiters
;
2379 OWNER_ENTRY OwnerEntry
;
2380 ULONG ActiveEntries
;
2381 ULONG ContentionCount
;
2382 ULONG NumberOfSharedWaiters
;
2383 ULONG NumberOfExclusiveWaiters
;
2387 ULONG_PTR CreatorBackTraceIndex
;
2389 KSPIN_LOCK SpinLock
;
2390 } ERESOURCE
, *PERESOURCE
;
2392 #if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
2393 #define LOOKASIDE_ALIGN
2395 #define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */
2398 typedef struct _LOOKASIDE_LIST_EX
*PLOOKASIDE_LIST_EX
;
2401 (DDKAPI
*PALLOCATE_FUNCTION
)(
2402 IN POOL_TYPE PoolType
,
2403 IN SIZE_T NumberOfBytes
,
2407 (DDKAPI
*PALLOCATE_FUNCTION_EX
)(
2408 IN POOL_TYPE PoolType
,
2409 IN SIZE_T NumberOfBytes
,
2411 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
2414 (DDKAPI
*PFREE_FUNCTION
)(
2418 (DDKAPI
*PFREE_FUNCTION_EX
)(
2420 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
2423 (DDKAPI
*PCALLBACK_FUNCTION
)(
2424 IN PVOID CallbackContext
,
2426 IN PVOID Argument2
);
2428 typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE
{
2430 SLIST_HEADER ListHead
;
2431 SINGLE_LIST_ENTRY SingleListHead
;
2434 USHORT MaximumDepth
;
2435 ULONG TotalAllocates
;
2437 ULONG AllocateMisses
;
2449 PALLOCATE_FUNCTION_EX AllocateEx
;
2450 PALLOCATE_FUNCTION Allocate
;
2453 PFREE_FUNCTION_EX FreeEx
;
2454 PFREE_FUNCTION Free
;
2456 LIST_ENTRY ListEntry
;
2457 ULONG LastTotalAllocates
;
2459 ULONG LastAllocateMisses
;
2460 ULONG LastAllocateHits
;
2463 } GENERAL_LOOKASIDE
, *PGENERAL_LOOKASIDE
;
2465 typedef struct _PAGED_LOOKASIDE_LIST
{
2466 GENERAL_LOOKASIDE L
;
2467 #if !defined(_AMD64_) && !defined(_IA64_)
2468 FAST_MUTEX Lock__ObsoleteButDoNotDelete
;
2470 } PAGED_LOOKASIDE_LIST
, *PPAGED_LOOKASIDE_LIST
;
2472 typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST
{
2473 GENERAL_LOOKASIDE L
;
2474 #if !defined(_AMD64_) && !defined(_IA64_)
2475 KSPIN_LOCK Lock__ObsoleteButDoNotDelete
;
2477 } NPAGED_LOOKASIDE_LIST
, *PNPAGED_LOOKASIDE_LIST
;
2479 //typedef struct _LOOKASIDE_LIST_EX {
2480 // GENERAL_LOOKASIDE_POOL L;
2481 //} LOOKASIDE_LIST_EX, *PLOOKASIDE_LIST_EX;
2483 typedef struct _EX_RUNDOWN_REF
{
2485 volatile ULONG_PTR Count
;
2488 } EX_RUNDOWN_REF
, *PEX_RUNDOWN_REF
;
2490 typedef struct _EX_RUNDOWN_REF_CACHE_AWARE
*PEX_RUNDOWN_REF_CACHE_AWARE
;
2492 typedef enum _WORK_QUEUE_TYPE
{
2495 HyperCriticalWorkQueue
,
2500 (DDKAPI
*PWORKER_THREAD_ROUTINE
)(
2501 IN PVOID Parameter
);
2503 typedef struct _WORK_QUEUE_ITEM
{
2505 PWORKER_THREAD_ROUTINE WorkerRoutine
;
2506 volatile PVOID Parameter
;
2507 } WORK_QUEUE_ITEM
, *PWORK_QUEUE_ITEM
;
2510 /******************************************************************************
2511 * Executive Functions *
2512 ******************************************************************************/
2515 #if defined(_NTHAL_)
2516 #define ExAcquireFastMutex ExiAcquireFastMutex
2517 #define ExReleaseFastMutex ExiReleaseFastMutex
2518 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
2520 #define ExInterlockedAddUlong ExfInterlockedAddUlong
2521 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
2522 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
2523 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
2524 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
2525 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
2530 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
2531 defined(_NTHAL_) || defined(_NTOSP_)
2534 ExQueryDepthSList(IN PSLIST_HEADER ListHead
);
2538 ExQueryDepthSList(IN PSLIST_HEADER ListHead
)
2540 return (USHORT
)(ListHead
->Alignment
& 0xffff);
2546 ExpInterlockedFlushSList(
2547 PSLIST_HEADER ListHead
);
2551 ExpInterlockedPopEntrySList(
2552 PSLIST_HEADER ListHead
);
2556 ExpInterlockedPushEntrySList(
2557 PSLIST_HEADER ListHead
,
2558 PSLIST_ENTRY ListEntry
);
2560 #define ExInterlockedFlushSList(Head) \
2561 ExpInterlockedFlushSList(Head)
2562 #define ExInterlockedPopEntrySList(Head, Lock) \
2563 ExpInterlockedPopEntrySList(Head)
2564 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
2565 ExpInterlockedPushEntrySList(Head, Entry)
2567 #else // !defined(_WIN64)
2569 #define ExQueryDepthSList(listhead) (listhead)->Depth
2574 ExInterlockedFlushSList(
2575 IN PSLIST_HEADER ListHead
);
2577 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
2581 ExInterlockedPopEntrySList(
2582 IN PSLIST_HEADER ListHead
,
2583 IN PKSPIN_LOCK Lock
);
2588 ExInterlockedPushEntrySList(
2589 IN PSLIST_HEADER ListHead
,
2590 IN PSINGLE_LIST_ENTRY ListEntry
,
2591 IN PKSPIN_LOCK Lock
);
2593 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
2594 InterlockedPopEntrySList(_ListHead)
2595 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
2596 InterlockedPushEntrySList(_ListHead, _ListEntry)
2597 #endif // _WIN2K_COMPAT_SLIST_USAGE
2599 #endif // !defined(_WIN64)
2602 * ExGetCurrentResourceThread(
2605 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread())
2607 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
2610 * ExInitializeWorkItem(
2611 * IN PWORK_QUEUE_ITEM Item,
2612 * IN PWORKER_THREAD_ROUTINE Routine,
2615 #define ExInitializeWorkItem(Item, Routine, Context) \
2617 (Item)->WorkerRoutine = Routine; \
2618 (Item)->Parameter = Context; \
2619 (Item)->List.Flink = NULL; \
2622 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2628 IN OUT PFAST_MUTEX FastMutex
);
2634 IN OUT PFAST_MUTEX FastMutex
);
2639 ExTryToAcquireFastMutex(
2640 IN OUT PFAST_MUTEX FastMutex
);
2645 ExAcquireFastMutexUnsafe(
2646 IN OUT PFAST_MUTEX FastMutex
);
2651 ExReleaseFastMutexUnsafe(
2652 IN OUT PFAST_MUTEX FastMutex
);
2657 ExAcquireResourceExclusiveLite(
2658 IN PERESOURCE Resource
,
2664 ExAcquireResourceSharedLite(
2665 IN PERESOURCE Resource
,
2671 ExAcquireSharedStarveExclusive(
2672 IN PERESOURCE Resource
,
2678 ExAcquireSharedWaitForExclusive(
2679 IN PERESOURCE Resource
,
2686 IN POOL_TYPE PoolType
,
2687 IN SIZE_T NumberOfBytes
);
2690 #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
2691 #endif /* POOL_TAGGING */
2696 ExAllocatePoolWithQuota(
2697 IN POOL_TYPE PoolType
,
2698 IN SIZE_T NumberOfBytes
);
2701 #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
2702 #endif /* POOL_TAGGING */
2707 ExAllocatePoolWithQuotaTag(
2708 IN POOL_TYPE PoolType
,
2709 IN SIZE_T NumberOfBytes
,
2712 #ifndef POOL_TAGGING
2713 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
2714 #endif /* POOL_TAGGING */
2719 ExAllocatePoolWithTag(
2720 IN POOL_TYPE PoolType
,
2721 IN SIZE_T NumberOfBytes
,
2727 ExAllocatePoolWithTagPriority(
2728 IN POOL_TYPE PoolType
,
2729 IN SIZE_T NumberOfBytes
,
2731 IN EX_POOL_PRIORITY Priority
);
2736 ExConvertExclusiveToSharedLite(
2737 IN PERESOURCE Resource
);
2743 OUT PCALLBACK_OBJECT
*CallbackObject
,
2744 IN POBJECT_ATTRIBUTES ObjectAttributes
,
2746 IN BOOLEAN AllowMultipleCallbacks
);
2751 ExDeleteNPagedLookasideList(
2752 IN PNPAGED_LOOKASIDE_LIST Lookaside
);
2757 ExDeletePagedLookasideList(
2758 IN PPAGED_LOOKASIDE_LIST Lookaside
);
2763 ExDeleteResourceLite(
2764 IN PERESOURCE Resource
);
2773 #define ExFreePool(P) ExFreePoolWithTag(P, 0)
2786 ExGetExclusiveWaiterCount(
2787 IN PERESOURCE Resource
);
2798 ExGetSharedWaiterCount(
2799 IN PERESOURCE Resource
);
2804 ExInitializeNPagedLookasideList(
2805 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
2806 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
2807 IN PFREE_FUNCTION Free OPTIONAL
,
2816 ExInitializePagedLookasideList(
2817 IN PPAGED_LOOKASIDE_LIST Lookaside
,
2818 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
2819 IN PFREE_FUNCTION Free OPTIONAL
,
2828 ExInitializeResourceLite(
2829 IN PERESOURCE Resource
);
2834 ExInterlockedAddLargeInteger(
2835 IN PLARGE_INTEGER Addend
,
2836 IN LARGE_INTEGER Increment
,
2837 IN PKSPIN_LOCK Lock
);
2840 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
2841 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
2843 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
2844 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
2850 ExInterlockedAddUlong(
2855 #if defined(_AMD64_) || defined(_IA64_)
2856 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
2857 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
2858 #elif defined(_X86_)
2862 ExfInterlockedCompareExchange64(
2863 IN OUT LONGLONG
volatile *Destination
,
2864 IN PLONGLONG Exchange
,
2865 IN PLONGLONG Comperand
);
2866 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
2867 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
2872 ExInterlockedCompareExchange64(
2873 IN OUT LONGLONG
volatile *Destination
,
2874 IN PLONGLONG Exchange
,
2875 IN PLONGLONG Comparand
,
2876 IN PKSPIN_LOCK Lock
);
2882 ExInterlockedInsertHeadList(
2883 IN PLIST_ENTRY ListHead
,
2884 IN PLIST_ENTRY ListEntry
,
2885 IN PKSPIN_LOCK Lock
);
2890 ExInterlockedInsertTailList(
2891 IN PLIST_ENTRY ListHead
,
2892 IN PLIST_ENTRY ListEntry
,
2893 IN PKSPIN_LOCK Lock
);
2898 ExInterlockedPopEntryList(
2899 IN PSINGLE_LIST_ENTRY ListHead
,
2900 IN PKSPIN_LOCK Lock
);
2905 ExInterlockedPushEntryList(
2906 IN PSINGLE_LIST_ENTRY ListHead
,
2907 IN PSINGLE_LIST_ENTRY ListEntry
,
2908 IN PKSPIN_LOCK Lock
);
2913 ExInterlockedRemoveHeadList(
2914 IN PLIST_ENTRY ListHead
,
2915 IN PKSPIN_LOCK Lock
);
2920 ExIsProcessorFeaturePresent(
2921 IN ULONG ProcessorFeature
);
2926 ExIsResourceAcquiredExclusiveLite(
2927 IN PERESOURCE Resource
);
2932 ExIsResourceAcquiredSharedLite(
2933 IN PERESOURCE Resource
);
2935 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
2940 ExLocalTimeToSystemTime(
2941 IN PLARGE_INTEGER LocalTime
,
2942 OUT PLARGE_INTEGER SystemTime
);
2948 IN PCALLBACK_OBJECT CallbackObject
,
2950 IN PVOID Argument2
);
2956 IN PWORK_QUEUE_ITEM WorkItem
,
2957 IN WORK_QUEUE_TYPE QueueType
);
2964 IN NTSTATUS Status
);
2970 IN PCALLBACK_OBJECT CallbackObject
,
2971 IN PCALLBACK_FUNCTION CallbackFunction
,
2972 IN PVOID CallbackContext
);
2977 ExReinitializeResourceLite(
2978 IN PERESOURCE Resource
);
2983 ExReleaseResourceForThreadLite(
2984 IN PERESOURCE Resource
,
2985 IN ERESOURCE_THREAD ResourceThreadId
);
2990 ExReleaseResourceLite(
2991 IN PERESOURCE Resource
);
2996 ExSetResourceOwnerPointer(
2997 IN PERESOURCE Resource
,
2998 IN PVOID OwnerPointer
);
3003 ExSetTimerResolution(
3004 IN ULONG DesiredTime
,
3005 IN BOOLEAN SetResolution
);
3010 ExSystemTimeToLocalTime(
3011 IN PLARGE_INTEGER SystemTime
,
3012 OUT PLARGE_INTEGER LocalTime
);
3017 ExUnregisterCallback(
3018 IN PVOID CbRegistration
);
3021 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
3023 #if (NTDDI_VERSION >= NTDDI_WINXP)
3027 ExAcquireRundownProtection(
3028 IN OUT PEX_RUNDOWN_REF RunRef
);
3033 ExInitializeRundownProtection(
3034 OUT PEX_RUNDOWN_REF RunRef
);
3039 ExReInitializeRundownProtection(
3040 OUT PEX_RUNDOWN_REF RunRef
);
3045 ExReleaseRundownProtection(
3046 IN OUT PEX_RUNDOWN_REF RunRef
);
3052 OUT PEX_RUNDOWN_REF RunRef
);
3058 IN SUITE_TYPE SuiteType
);
3063 ExWaitForRundownProtectionRelease(
3064 IN OUT PEX_RUNDOWN_REF RunRef
);
3066 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
3068 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
3072 ExAcquireRundownProtectionEx(
3073 IN OUT PEX_RUNDOWN_REF RunRef
,
3079 ExReleaseRundownProtectionEx(
3080 IN OUT PEX_RUNDOWN_REF RunRef
,
3082 #endif // (NTDDI_VERSION >= NTDDI_WINXPSP2)
3084 #if (NTDDI_VERSION >= NTDDI_WS03)
3086 #endif // (NTDDI_VERSION >= NTDDI_WS03)
3088 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
3090 PEX_RUNDOWN_REF_CACHE_AWARE
3091 ExAllocateCacheAwareRundownProtection(
3092 IN POOL_TYPE PoolType
,
3097 ExSizeOfRundownProtectionCacheAware(VOID
);
3099 #endif // (NTDDI_VERSION >= NTDDI_WS03SP1)
3101 #if (NTDDI_VERSION >= NTDDI_VISTA)
3104 ExInitializeLookasideListEx(
3105 OUT PLOOKASIDE_LIST_EX Lookaside
,
3106 IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL
,
3107 IN PFREE_FUNCTION_EX Free OPTIONAL
,
3108 IN POOL_TYPE PoolType
,
3116 #if !defined(MIDL_PASS)
3118 static __inline PVOID
3119 ExAllocateFromNPagedLookasideList(
3120 IN PNPAGED_LOOKASIDE_LIST Lookaside
)
3124 Lookaside
->L
.TotalAllocates
++;
3125 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
3126 if (Entry
== NULL
) {
3127 Lookaside
->L
.AllocateMisses
++;
3128 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
3135 static __inline PVOID
3136 ExAllocateFromPagedLookasideList(
3137 IN PPAGED_LOOKASIDE_LIST Lookaside
)
3141 Lookaside
->L
.TotalAllocates
++;
3142 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
3143 if (Entry
== NULL
) {
3144 Lookaside
->L
.AllocateMisses
++;
3145 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
3152 static __inline VOID
3153 ExFreeToNPagedLookasideList(
3154 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
3157 Lookaside
->L
.TotalFrees
++;
3158 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
3159 Lookaside
->L
.FreeMisses
++;
3160 (Lookaside
->L
.Free
)(Entry
);
3162 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
3166 static __inline VOID
3167 ExFreeToPagedLookasideList(
3168 IN PPAGED_LOOKASIDE_LIST Lookaside
,
3171 Lookaside
->L
.TotalFrees
++;
3172 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
3173 Lookaside
->L
.FreeMisses
++;
3174 (Lookaside
->L
.Free
)(Entry
);
3176 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
3181 #endif // !defined(MIDL_PASS)