14 #endif /* GUID_DEFINED */
22 #define NTKERNELAPI DECLSPEC_IMPORT
25 #define PORT_MAXIMUM_MESSAGE_LENGTH 512
27 #define PORT_MAXIMUM_MESSAGE_LENGTH 256
34 // Indicate if #pragma alloc_text() is supported
36 #if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_IA64)
37 #define ALLOC_PRAGMA 1
41 // Indicate if #pragma data_seg() is supported
43 #if defined(_M_IX86) || defined(_M_AMD64)
44 #define ALLOC_DATA_PRAGMA 1
51 typedef UCHAR KPROCESSOR_MODE
;
52 typedef LONG KPRIORITY
;
53 typedef PVOID PSECURITY_DESCRIPTOR
;
54 typedef ULONG SECURITY_INFORMATION
, *PSECURITY_INFORMATION
;
56 /* Structures not exposed to drivers */
57 typedef struct _OBJECT_TYPE
*POBJECT_TYPE
;
58 typedef struct _HAL_DISPATCH_TABLE
*PHAL_DISPATCH_TABLE
;
59 typedef struct _HAL_PRIVATE_DISPATCH_TABLE
*PHAL_PRIVATE_DISPATCH_TABLE
;
60 typedef struct _DEVICE_HANDLER_OBJECT
*PDEVICE_HANDLER_OBJECT
;
61 typedef struct _BUS_HANDLER
*PBUS_HANDLER
;
63 typedef struct _ADAPTER_OBJECT
*PADAPTER_OBJECT
;
64 typedef struct _CALLBACK_OBJECT
*PCALLBACK_OBJECT
;
65 typedef struct _ETHREAD
*PETHREAD
;
66 typedef struct _EPROCESS
*PEPROCESS
;
67 typedef struct _IO_TIMER
*PIO_TIMER
;
68 typedef struct _KINTERRUPT
*PKINTERRUPT
;
69 typedef struct _KPROCESS
*PKPROCESS
;
70 typedef struct _KTHREAD
*PKTHREAD
, *PRKTHREAD
;
73 typedef struct _CONTEXT
*PCONTEXT
;
76 // Resource list definitions
78 typedef int CM_RESOURCE_TYPE
;
80 #define CmResourceTypeNull 0
81 #define CmResourceTypePort 1
82 #define CmResourceTypeInterrupt 2
83 #define CmResourceTypeMemory 3
84 #define CmResourceTypeDma 4
85 #define CmResourceTypeDeviceSpecific 5
86 #define CmResourceTypeBusNumber 6
87 #define CmResourceTypeNonArbitrated 128
88 #define CmResourceTypeConfigData 128
89 #define CmResourceTypeDevicePrivate 129
90 #define CmResourceTypePcCardConfig 130
91 #define CmResourceTypeMfCardConfig 131
93 typedef enum _INTERFACE_TYPE
{
94 InterfaceTypeUndefined
= -1,
112 } INTERFACE_TYPE
, *PINTERFACE_TYPE
;
114 /* IO_RESOURCE_DESCRIPTOR.Option */
116 #define IO_RESOURCE_PREFERRED 0x01
117 #define IO_RESOURCE_DEFAULT 0x02
118 #define IO_RESOURCE_ALTERNATIVE 0x08
120 typedef struct _IO_RESOURCE_DESCRIPTOR
{
123 UCHAR ShareDisposition
;
131 PHYSICAL_ADDRESS MinimumAddress
;
132 PHYSICAL_ADDRESS MaximumAddress
;
137 PHYSICAL_ADDRESS MinimumAddress
;
138 PHYSICAL_ADDRESS MaximumAddress
;
145 ULONG MinimumChannel
;
146 ULONG MaximumChannel
;
151 PHYSICAL_ADDRESS MinimumAddress
;
152 PHYSICAL_ADDRESS MaximumAddress
;
169 } IO_RESOURCE_DESCRIPTOR
, *PIO_RESOURCE_DESCRIPTOR
;
171 typedef struct _IO_RESOURCE_LIST
{
175 IO_RESOURCE_DESCRIPTOR Descriptors
[1];
176 } IO_RESOURCE_LIST
, *PIO_RESOURCE_LIST
;
178 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST
{
180 INTERFACE_TYPE InterfaceType
;
184 ULONG AlternativeLists
;
185 IO_RESOURCE_LIST List
[1];
186 } IO_RESOURCE_REQUIREMENTS_LIST
, *PIO_RESOURCE_REQUIREMENTS_LIST
;
191 extern ULONG NtGlobalFlag
;
194 #include <pshpack4.h>
195 typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR
{
197 UCHAR ShareDisposition
;
201 PHYSICAL_ADDRESS Start
;
205 PHYSICAL_ADDRESS Start
;
213 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
231 PHYSICAL_ADDRESS Start
;
251 } DeviceSpecificData
;
252 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
254 PHYSICAL_ADDRESS Start
;
258 PHYSICAL_ADDRESS Start
;
262 PHYSICAL_ADDRESS Start
;
267 } CM_PARTIAL_RESOURCE_DESCRIPTOR
, *PCM_PARTIAL_RESOURCE_DESCRIPTOR
;
271 // Section map options
273 typedef enum _SECTION_INHERIT
{
279 // Section access rights
281 #define SECTION_QUERY 0x0001
282 #define SECTION_MAP_WRITE 0x0002
283 #define SECTION_MAP_READ 0x0004
284 #define SECTION_MAP_EXECUTE 0x0008
285 #define SECTION_EXTEND_SIZE 0x0010
286 #define SECTION_MAP_EXECUTE_EXPLICIT 0x0020
288 #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
289 SECTION_MAP_WRITE | \
291 SECTION_MAP_EXECUTE | \
294 #define SESSION_QUERY_ACCESS 0x0001
295 #define SESSION_MODIFY_ACCESS 0x0002
297 #define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
298 SESSION_QUERY_ACCESS | \
299 SESSION_MODIFY_ACCESS)
303 #define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
305 #define PAGE_NOACCESS 0x01
306 #define PAGE_READONLY 0x02
307 #define PAGE_READWRITE 0x04
308 #define PAGE_WRITECOPY 0x08
309 #define PAGE_EXECUTE 0x10
310 #define PAGE_EXECUTE_READ 0x20
311 #define PAGE_EXECUTE_READWRITE 0x40
312 #define PAGE_EXECUTE_WRITECOPY 0x80
313 #define PAGE_GUARD 0x100
314 #define PAGE_NOCACHE 0x200
315 #define PAGE_WRITECOMBINE 0x400
317 #define MEM_COMMIT 0x1000
318 #define MEM_RESERVE 0x2000
319 #define MEM_DECOMMIT 0x4000
320 #define MEM_RELEASE 0x8000
321 #define MEM_FREE 0x10000
322 #define MEM_PRIVATE 0x20000
323 #define MEM_MAPPED 0x40000
324 #define MEM_RESET 0x80000
325 #define MEM_TOP_DOWN 0x100000
326 #define MEM_LARGE_PAGES 0x20000000
327 #define MEM_4MB_PAGES 0x80000000
329 #define SEC_RESERVE 0x4000000
330 #define SEC_LARGE_PAGES 0x80000000
332 #define PROCESS_DUP_HANDLE (0x0040)
334 #if (NTDDI_VERSION >= NTDDI_VISTA)
335 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
338 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
345 // Processor features
347 #define PF_FLOATING_POINT_PRECISION_ERRATA 0
348 #define PF_FLOATING_POINT_EMULATED 1
349 #define PF_COMPARE_EXCHANGE_DOUBLE 2
350 #define PF_MMX_INSTRUCTIONS_AVAILABLE 3
351 #define PF_PPC_MOVEMEM_64BIT_OK 4
352 #define PF_ALPHA_BYTE_INSTRUCTIONS 5
353 #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
354 #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
355 #define PF_RDTSC_INSTRUCTION_AVAILABLE 8
356 #define PF_PAE_ENABLED 9
357 #define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
358 #define PF_SSE_DAZ_MODE_AVAILABLE 11
359 #define PF_NX_ENABLED 12
360 #define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
361 #define PF_COMPARE_EXCHANGE128 14
362 #define PF_COMPARE64_EXCHANGE128 15
363 #define PF_CHANNELS_ENABLED 16
368 // Intrinsics (note: taken from our winnt.h)
371 #if defined(__GNUC__)
373 static __inline__ BOOLEAN
374 InterlockedBitTestAndSet(IN LONG
volatile *Base
,
379 __asm__
__volatile__("lock "
382 :"=r" (OldBit
),"+m" (*Base
)
387 return (_InterlockedOr(Base
, 1 << Bit
) >> Bit
) & 1;
391 static __inline__ BOOLEAN
392 InterlockedBitTestAndReset(IN LONG
volatile *Base
,
397 __asm__
__volatile__("lock "
400 :"=r" (OldBit
),"+m" (*Base
)
405 return (_InterlockedAnd(Base
, ~(1 << Bit
)) >> Bit
) & 1;
411 #define BitScanForward _BitScanForward
412 #define BitScanReverse _BitScanReverse
414 #define BitTest _bittest
415 #define BitTestAndComplement _bittestandcomplement
416 #define BitTestAndSet _bittestandset
417 #define BitTestAndReset _bittestandreset
418 #define InterlockedBitTestAndSet _interlockedbittestandset
419 #define InterlockedBitTestAndReset _interlockedbittestandreset
422 /** INTERLOCKED FUNCTIONS *****************************************************/
424 #if !defined(__INTERLOCKED_DECLARED)
425 #define __INTERLOCKED_DECLARED
428 #if defined(NO_INTERLOCKED_INTRINSICS)
432 InterlockedIncrement(
433 IN OUT LONG
volatile *Addend
);
438 InterlockedDecrement(
439 IN OUT LONG
volatile *Addend
);
444 InterlockedCompareExchange(
445 IN OUT LONG
volatile *Destination
,
453 IN OUT LONG
volatile *Destination
,
459 InterlockedExchangeAdd(
460 IN OUT LONG
volatile *Addend
,
463 #else // !defined(NO_INTERLOCKED_INTRINSICS)
465 #define InterlockedExchange _InterlockedExchange
466 #define InterlockedIncrement _InterlockedIncrement
467 #define InterlockedDecrement _InterlockedDecrement
468 #define InterlockedExchangeAdd _InterlockedExchangeAdd
469 #define InterlockedCompareExchange _InterlockedCompareExchange
470 #define InterlockedOr _InterlockedOr
471 #define InterlockedAnd _InterlockedAnd
472 #define InterlockedXor _InterlockedXor
474 #endif // !defined(NO_INTERLOCKED_INTRINSICS)
476 #endif // defined (_X86_)
478 #if !defined (_WIN64)
481 * InterlockedExchangePointer(
482 * IN OUT PVOID volatile *Target,
485 #define InterlockedExchangePointer(Target, Value) \
486 ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
490 * InterlockedCompareExchangePointer(
491 * IN OUT PVOID *Destination,
493 * IN PVOID Comparand)
495 #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
496 ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
498 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
499 #define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
500 #define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
502 #endif // !defined (_WIN64)
504 #if defined (_M_AMD64)
506 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONGLONG *)a, (LONGLONG)b)
507 #define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONGLONG *)a)
508 #define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONGLONG *)a)
509 #define InterlockedAnd _InterlockedAnd
510 #define InterlockedOr _InterlockedOr
511 #define InterlockedXor _InterlockedXor
512 #define InterlockedIncrement _InterlockedIncrement
513 #define InterlockedDecrement _InterlockedDecrement
514 #define InterlockedAdd _InterlockedAdd
515 #define InterlockedExchange _InterlockedExchange
516 #define InterlockedExchangeAdd _InterlockedExchangeAdd
517 #define InterlockedCompareExchange _InterlockedCompareExchange
518 #define InterlockedAnd64 _InterlockedAnd64
519 #define InterlockedOr64 _InterlockedOr64
520 #define InterlockedXor64 _InterlockedXor64
521 #define InterlockedIncrement64 _InterlockedIncrement64
522 #define InterlockedDecrement64 _InterlockedDecrement64
523 #define InterlockedAdd64 _InterlockedAdd64
524 #define InterlockedExchange64 _InterlockedExchange64
525 #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
526 #define InterlockedCompareExchange64 _InterlockedCompareExchange64
527 #define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
528 #define InterlockedExchangePointer _InterlockedExchangePointer
529 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
530 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
534 #if defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
535 //#if !defined(_X86AMD64_) // FIXME: what's _X86AMD64_ used for?
539 IN OUT LONG64
volatile *Addend
,
542 return InterlockedExchangeAdd64(Addend
, Value
) + Value
;
545 #define BitScanForward _BitScanForward
546 #define BitScanReverse _BitScanReverse
550 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
551 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
554 #endif /* !__INTERLOCKED_DECLARED */
557 #define YieldProcessor _mm_pause
558 #elif defined (_M_AMD64)
559 #define YieldProcessor _mm_pause
560 #elif defined(_M_PPC)
561 #define YieldProcessor() __asm__ __volatile__("nop");
562 #elif defined(_M_MIPS)
563 #define YieldProcessor() __asm__ __volatile__("nop");
564 #elif defined(_M_ARM)
565 #define YieldProcessor()
567 #error Unknown architecture
575 #ifndef _SLIST_HEADER_
576 #define _SLIST_HEADER_
579 typedef struct _SLIST_ENTRY
*PSLIST_ENTRY
;
580 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY
{
583 typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER
{
590 ULONGLONG Sequence
:9;
591 ULONGLONG NextEntry
:39;
592 ULONGLONG HeaderType
:1;
594 ULONGLONG Reserved
:59;
599 ULONGLONG Sequence
:48;
600 ULONGLONG HeaderType
:1;
602 ULONGLONG Reserved
:2;
603 ULONGLONG NextEntry
:60;
605 } SLIST_HEADER
, *PSLIST_HEADER
;
607 #define SLIST_ENTRY SINGLE_LIST_ENTRY
608 #define _SLIST_ENTRY _SINGLE_LIST_ENTRY
609 #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
610 typedef union _SLIST_HEADER
{
617 } SLIST_HEADER
, *PSLIST_HEADER
;
620 #endif /* _SLIST_HEADER_ */
625 // Power States/Levels
627 typedef enum _SYSTEM_POWER_STATE
{
628 PowerSystemUnspecified
,
630 PowerSystemSleeping1
,
631 PowerSystemSleeping2
,
632 PowerSystemSleeping3
,
633 PowerSystemHibernate
,
636 } SYSTEM_POWER_STATE
, *PSYSTEM_POWER_STATE
;
638 #define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
640 typedef enum _POWER_INFORMATION_LEVEL
{
643 VerifySystemPolicyAc
,
644 VerifySystemPolicyDc
,
645 SystemPowerCapabilities
,
647 SystemPowerStateHandler
,
648 ProcessorStateHandler
,
649 SystemPowerPolicyCurrent
,
650 AdministratorPowerPolicy
,
651 SystemReserveHiberFile
,
652 ProcessorInformation
,
653 SystemPowerInformation
,
654 ProcessorStateHandler2
,
657 SystemExecutionState
,
658 SystemPowerStateNotifyHandler
,
659 ProcessorPowerPolicyAc
,
660 ProcessorPowerPolicyDc
,
661 VerifyProcessorPowerPolicyAc
,
662 VerifyProcessorPowerPolicyDc
,
663 ProcessorPowerPolicyCurrent
664 } POWER_INFORMATION_LEVEL
;
670 PowerActionHibernate
,
672 PowerActionShutdownReset
,
673 PowerActionShutdownOff
,
675 } POWER_ACTION
, *PPOWER_ACTION
;
677 typedef enum _DEVICE_POWER_STATE
{
678 PowerDeviceUnspecified
,
684 } DEVICE_POWER_STATE
, *PDEVICE_POWER_STATE
;
686 #define ES_SYSTEM_REQUIRED 0x00000001
687 #define ES_DISPLAY_REQUIRED 0x00000002
688 #define ES_USER_PRESENT 0x00000004
689 #define ES_CONTINUOUS 0x80000000
691 typedef ULONG EXECUTION_STATE
;
701 // Access/Security Stuff
703 typedef ULONG ACCESS_MASK
, *PACCESS_MASK
;
704 typedef PVOID PACCESS_TOKEN
;
706 #define DELETE 0x00010000L
707 #define READ_CONTROL 0x00020000L
708 #define WRITE_DAC 0x00040000L
709 #define WRITE_OWNER 0x00080000L
710 #define SYNCHRONIZE 0x00100000L
711 #define STANDARD_RIGHTS_REQUIRED 0x000F0000L
712 #define STANDARD_RIGHTS_READ READ_CONTROL
713 #define STANDARD_RIGHTS_WRITE READ_CONTROL
714 #define STANDARD_RIGHTS_EXECUTE READ_CONTROL
715 #define STANDARD_RIGHTS_ALL 0x001F0000L
716 #define SPECIFIC_RIGHTS_ALL 0x0000FFFFL
717 #define ACCESS_SYSTEM_SECURITY 0x01000000L
718 #define MAXIMUM_ALLOWED 0x02000000L
719 #define GENERIC_READ 0x80000000L
720 #define GENERIC_WRITE 0x40000000L
721 #define GENERIC_EXECUTE 0x20000000L
722 #define GENERIC_ALL 0x10000000L
724 typedef struct _GENERIC_MAPPING
{
725 ACCESS_MASK GenericRead
;
726 ACCESS_MASK GenericWrite
;
727 ACCESS_MASK GenericExecute
;
728 ACCESS_MASK GenericAll
;
729 } GENERIC_MAPPING
, *PGENERIC_MAPPING
;
731 #define ACL_REVISION 2
732 #define ACL_REVISION_DS 4
734 #define ACL_REVISION1 1
735 #define ACL_REVISION2 2
736 #define ACL_REVISION3 3
737 #define ACL_REVISION4 4
738 #define MIN_ACL_REVISION ACL_REVISION2
739 #define MAX_ACL_REVISION ACL_REVISION4
741 typedef struct _ACL
{
752 // Current security descriptor revision value
754 #define SECURITY_DESCRIPTOR_REVISION (1)
755 #define SECURITY_DESCRIPTOR_REVISION1 (1)
758 // Privilege attributes
760 #define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
761 #define SE_PRIVILEGE_ENABLED (0x00000002L)
762 #define SE_PRIVILEGE_REMOVED (0X00000004L)
763 #define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
765 #define SE_PRIVILEGE_VALID_ATTRIBUTES (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
766 SE_PRIVILEGE_ENABLED | \
767 SE_PRIVILEGE_REMOVED | \
768 SE_PRIVILEGE_USED_FOR_ACCESS)
770 #include <pshpack4.h>
771 typedef struct _LUID_AND_ATTRIBUTES
{
774 } LUID_AND_ATTRIBUTES
, *PLUID_AND_ATTRIBUTES
;
776 typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY
[ANYSIZE_ARRAY
];
777 typedef LUID_AND_ATTRIBUTES_ARRAY
*PLUID_AND_ATTRIBUTES_ARRAY
;
784 #define PRIVILEGE_SET_ALL_NECESSARY (1)
786 typedef struct _PRIVILEGE_SET
{
787 ULONG PrivilegeCount
;
789 LUID_AND_ATTRIBUTES Privilege
[ANYSIZE_ARRAY
];
790 } PRIVILEGE_SET
,*PPRIVILEGE_SET
;
792 typedef enum _SECURITY_IMPERSONATION_LEVEL
{
794 SecurityIdentification
,
795 SecurityImpersonation
,
797 } SECURITY_IMPERSONATION_LEVEL
, * PSECURITY_IMPERSONATION_LEVEL
;
799 #define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
800 #define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
801 #define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
802 #define VALID_IMPERSONATION_LEVEL(Level) (((Level) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((Level) <= SECURITY_MAX_IMPERSONATION_LEVEL))
804 #define SECURITY_DYNAMIC_TRACKING (TRUE)
805 #define SECURITY_STATIC_TRACKING (FALSE)
807 typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE
, *PSECURITY_CONTEXT_TRACKING_MODE
;
809 typedef struct _SECURITY_QUALITY_OF_SERVICE
{
811 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
;
812 SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode
;
813 BOOLEAN EffectiveOnly
;
814 } SECURITY_QUALITY_OF_SERVICE
, *PSECURITY_QUALITY_OF_SERVICE
;
816 typedef struct _SE_IMPERSONATION_STATE
{
819 BOOLEAN EffectiveOnly
;
820 SECURITY_IMPERSONATION_LEVEL Level
;
821 } SE_IMPERSONATION_STATE
, *PSE_IMPERSONATION_STATE
;
823 #define OWNER_SECURITY_INFORMATION (0x00000001L)
824 #define GROUP_SECURITY_INFORMATION (0x00000002L)
825 #define DACL_SECURITY_INFORMATION (0x00000004L)
826 #define SACL_SECURITY_INFORMATION (0x00000008L)
827 #define LABEL_SECURITY_INFORMATION (0x00000010L)
829 #define PROTECTED_DACL_SECURITY_INFORMATION (0x80000000L)
830 #define PROTECTED_SACL_SECURITY_INFORMATION (0x40000000L)
831 #define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L)
832 #define UNPROTECTED_SACL_SECURITY_INFORMATION (0x10000000L)
837 // Registry Access Rights
839 #define KEY_QUERY_VALUE (0x0001)
840 #define KEY_SET_VALUE (0x0002)
841 #define KEY_CREATE_SUB_KEY (0x0004)
842 #define KEY_ENUMERATE_SUB_KEYS (0x0008)
843 #define KEY_NOTIFY (0x0010)
844 #define KEY_CREATE_LINK (0x0020)
845 #define KEY_WOW64_32KEY (0x0200)
846 #define KEY_WOW64_64KEY (0x0100)
847 #define KEY_WOW64_RES (0x0300)
849 #define KEY_READ ((STANDARD_RIGHTS_READ |\
851 KEY_ENUMERATE_SUB_KEYS |\
856 #define KEY_WRITE ((STANDARD_RIGHTS_WRITE |\
858 KEY_CREATE_SUB_KEY) \
862 #define KEY_EXECUTE ((KEY_READ) \
866 #define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL |\
869 KEY_CREATE_SUB_KEY |\
870 KEY_ENUMERATE_SUB_KEYS |\
877 // Registry Open/Create Options
879 #define REG_OPTION_RESERVED (0x00000000L)
880 #define REG_OPTION_NON_VOLATILE (0x00000000L)
881 #define REG_OPTION_VOLATILE (0x00000001L)
882 #define REG_OPTION_CREATE_LINK (0x00000002L)
883 #define REG_OPTION_BACKUP_RESTORE (0x00000004L)
884 #define REG_OPTION_OPEN_LINK (0x00000008L)
886 #define REG_LEGAL_OPTION \
887 (REG_OPTION_RESERVED |\
888 REG_OPTION_NON_VOLATILE |\
889 REG_OPTION_VOLATILE |\
890 REG_OPTION_CREATE_LINK |\
891 REG_OPTION_BACKUP_RESTORE |\
892 REG_OPTION_OPEN_LINK)
895 // Key creation/open disposition
897 #define REG_CREATED_NEW_KEY (0x00000001L)
898 #define REG_OPENED_EXISTING_KEY (0x00000002L)
901 // Key restore & hive load flags
903 #define REG_WHOLE_HIVE_VOLATILE (0x00000001L)
904 #define REG_REFRESH_HIVE (0x00000002L)
905 #define REG_NO_LAZY_FLUSH (0x00000004L)
906 #define REG_FORCE_RESTORE (0x00000008L)
907 #define REG_APP_HIVE (0x00000010L)
908 #define REG_PROCESS_PRIVATE (0x00000020L)
909 #define REG_START_JOURNAL (0x00000040L)
910 #define REG_HIVE_EXACT_FILE_GROWTH (0x00000080L)
911 #define REG_HIVE_NO_RM (0x00000100L)
912 #define REG_HIVE_SINGLE_LOG (0x00000200L)
917 #define REG_FORCE_UNLOAD 1
920 // Notify Filter Values
922 #define REG_NOTIFY_CHANGE_NAME (0x00000001L)
923 #define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L)
924 #define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L)
925 #define REG_NOTIFY_CHANGE_SECURITY (0x00000008L)
927 #define REG_LEGAL_CHANGE_FILTER \
928 (REG_NOTIFY_CHANGE_NAME |\
929 REG_NOTIFY_CHANGE_ATTRIBUTES |\
930 REG_NOTIFY_CHANGE_LAST_SET |\
931 REG_NOTIFY_CHANGE_SECURITY)
936 // Thread Access Rights
938 #define THREAD_TERMINATE (0x0001)
939 #define THREAD_SUSPEND_RESUME (0x0002)
940 #define THREAD_ALERT (0x0004)
941 #define THREAD_GET_CONTEXT (0x0008)
942 #define THREAD_SET_CONTEXT (0x0010)
943 #define THREAD_SET_INFORMATION (0x0020)
944 #define THREAD_SET_LIMITED_INFORMATION (0x0400)
945 #define THREAD_QUERY_LIMITED_INFORMATION (0x0800)
946 #if (NTDDI_VERSION >= NTDDI_VISTA)
947 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
950 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
955 // Service Start Types
957 #define SERVICE_BOOT_START 0x00000000
958 #define SERVICE_SYSTEM_START 0x00000001
959 #define SERVICE_AUTO_START 0x00000002
960 #define SERVICE_DEMAND_START 0x00000003
961 #define SERVICE_DISABLED 0x00000004
966 #define EXCEPTION_NONCONTINUABLE 1
967 #define EXCEPTION_MAXIMUM_PARAMETERS 15
969 typedef struct _EXCEPTION_RECORD
{
970 NTSTATUS ExceptionCode
;
971 ULONG ExceptionFlags
;
972 struct _EXCEPTION_RECORD
*ExceptionRecord
;
973 PVOID ExceptionAddress
;
974 ULONG NumberParameters
;
975 ULONG_PTR ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
976 } EXCEPTION_RECORD
, *PEXCEPTION_RECORD
;
978 typedef struct _EXCEPTION_RECORD32
{
979 NTSTATUS ExceptionCode
;
980 ULONG ExceptionFlags
;
981 ULONG ExceptionRecord
;
982 ULONG ExceptionAddress
;
983 ULONG NumberParameters
;
984 ULONG ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
985 } EXCEPTION_RECORD32
, *PEXCEPTION_RECORD32
;
987 typedef struct _EXCEPTION_RECORD64
{
988 NTSTATUS ExceptionCode
;
989 ULONG ExceptionFlags
;
990 ULONG64 ExceptionRecord
;
991 ULONG64 ExceptionAddress
;
992 ULONG NumberParameters
;
993 ULONG __unusedAlignment
;
994 ULONG64 ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
995 } EXCEPTION_RECORD64
, *PEXCEPTION_RECORD64
;
997 typedef struct _EXCEPTION_POINTERS
{
998 PEXCEPTION_RECORD ExceptionRecord
;
999 PCONTEXT ContextRecord
;
1000 } EXCEPTION_POINTERS
, *PEXCEPTION_POINTERS
;
1007 typedef struct _QUOTA_LIMITS
{
1008 SIZE_T PagedPoolLimit
;
1009 SIZE_T NonPagedPoolLimit
;
1010 SIZE_T MinimumWorkingSetSize
;
1011 SIZE_T MaximumWorkingSetSize
;
1012 SIZE_T PagefileLimit
;
1013 LARGE_INTEGER TimeLimit
;
1014 } QUOTA_LIMITS
, *PQUOTA_LIMITS
;
1016 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
1017 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
1018 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
1019 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
1020 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
1023 /******************************************************************************
1024 * WINBASE Functions *
1025 ******************************************************************************/
1026 #if !defined(_WINBASE_)
1030 #define InterlockedPopEntrySList(Head) \
1031 ExpInterlockedPopEntrySList(Head)
1033 #define InterlockedPushEntrySList(Head, Entry) \
1034 ExpInterlockedPushEntrySList(Head, Entry)
1036 #define InterlockedFlushSList(Head) \
1037 ExpInterlockedFlushSList(Head)
1039 #define QueryDepthSList(Head) \
1040 ExQueryDepthSList(Head)
1042 #else // !defined(_WIN64)
1047 InterlockedPopEntrySList(
1048 IN PSLIST_HEADER ListHead
);
1053 InterlockedPushEntrySList(
1054 IN PSLIST_HEADER ListHead
,
1055 IN PSLIST_ENTRY ListEntry
);
1057 #define InterlockedFlushSList(ListHead) \
1058 ExInterlockedFlushSList(ListHead)
1060 #define QueryDepthSList(Head) \
1061 ExQueryDepthSList(Head)
1063 #endif // !defined(_WIN64)
1065 #endif // !defined(_WINBASE_)
1068 /******************************************************************************
1070 ******************************************************************************/
1072 typedef struct _DISPATCHER_HEADER
1092 BOOLEAN DebugActive
;
1098 LIST_ENTRY WaitListHead
;
1099 } DISPATCHER_HEADER
, *PDISPATCHER_HEADER
;
1101 typedef ULONG_PTR KSPIN_LOCK
, *PKSPIN_LOCK
;
1103 typedef struct _KEVENT
{
1104 DISPATCHER_HEADER Header
;
1105 } KEVENT
, *PKEVENT
, *RESTRICTED_POINTER PRKEVENT
;
1107 typedef struct _KSEMAPHORE
{
1108 DISPATCHER_HEADER Header
;
1110 } KSEMAPHORE
, *PKSEMAPHORE
, *RESTRICTED_POINTER PRKSEMAPHORE
;
1112 /******************************************************************************
1114 ******************************************************************************/
1116 #define RTL_REGISTRY_ABSOLUTE 0
1117 #define RTL_REGISTRY_SERVICES 1
1118 #define RTL_REGISTRY_CONTROL 2
1119 #define RTL_REGISTRY_WINDOWS_NT 3
1120 #define RTL_REGISTRY_DEVICEMAP 4
1121 #define RTL_REGISTRY_USER 5
1122 #define RTL_REGISTRY_MAXIMUM 6
1123 #define RTL_REGISTRY_HANDLE 0x40000000
1124 #define RTL_REGISTRY_OPTIONAL 0x80000000
1126 /* RTL_QUERY_REGISTRY_TABLE.Flags */
1127 #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001
1128 #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002
1129 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004
1130 #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008
1131 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010
1132 #define RTL_QUERY_REGISTRY_DIRECT 0x00000020
1133 #define RTL_QUERY_REGISTRY_DELETE 0x00000040
1135 typedef struct _RTL_BITMAP
{
1138 } RTL_BITMAP
, *PRTL_BITMAP
;
1140 typedef struct _RTL_BITMAP_RUN
{
1141 ULONG StartingIndex
;
1143 } RTL_BITMAP_RUN
, *PRTL_BITMAP_RUN
;
1146 (DDKAPI
*PRTL_QUERY_REGISTRY_ROUTINE
)(
1150 IN ULONG ValueLength
,
1152 IN PVOID EntryContext
);
1154 typedef struct _RTL_QUERY_REGISTRY_TABLE
{
1155 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine
;
1161 ULONG DefaultLength
;
1162 } RTL_QUERY_REGISTRY_TABLE
, *PRTL_QUERY_REGISTRY_TABLE
;
1164 typedef struct _TIME_FIELDS
{
1171 CSHORT Milliseconds
;
1173 } TIME_FIELDS
, *PTIME_FIELDS
;
1176 /******************************************************************************
1178 ******************************************************************************/
1184 IN PVOID FailedAssertion
,
1186 IN ULONG LineNumber
,
1191 * IN VOID UNALIGNED *Destination,
1192 * IN CONST VOID UNALIGNED *Source,
1195 #define RtlCopyMemory(Destination, Source, Length) \
1196 memcpy(Destination, Source, Length)
1198 #define RtlCopyBytes RtlCopyMemory
1200 #if defined(_M_AMD64)
1204 RtlCopyMemoryNonTemporal(
1205 VOID UNALIGNED
*Destination
,
1206 CONST VOID UNALIGNED
*Source
,
1209 #define RtlCopyMemoryNonTemporal RtlCopyMemory
1217 #define RtlEqualLuid(Luid1, Luid2) \
1218 (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
1222 * IN VOID UNALIGNED *Destination,
1223 * IN CONST VOID UNALIGNED *Source,
1226 #define RtlEqualMemory(Destination, Source, Length) \
1227 (!memcmp(Destination, Source, Length))
1231 * IN VOID UNALIGNED *Destination,
1235 #define RtlFillMemory(Destination, Length, Fill) \
1236 memset(Destination, Fill, Length)
1238 #define RtlFillBytes RtlFillMemory
1243 RtlFreeUnicodeString(
1244 IN PUNICODE_STRING UnicodeString
);
1250 IN PUNICODE_STRING GuidString
,
1256 RtlInitUnicodeString(
1257 IN OUT PUNICODE_STRING DestinationString
,
1258 IN PCWSTR SourceString
);
1262 * IN VOID UNALIGNED *Destination,
1263 * IN CONST VOID UNALIGNED *Source,
1266 #define RtlMoveMemory(Destination, Source, Length) \
1267 memmove(Destination, Source, Length)
1274 OUT PUNICODE_STRING GuidString
);
1278 * IN VOID UNALIGNED *Destination,
1281 #define RtlZeroMemory(Destination, Length) \
1282 memset(Destination, 0, Length)
1284 #define RtlZeroBytes RtlZeroMemory
1287 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1292 IN PRTL_BITMAP BitMapHeader
,
1293 IN ULONG StartingIndex
,
1300 IN PRTL_BITMAP BitMapHeader
,
1301 IN ULONG StartingIndex
,
1307 RtlAnsiStringToUnicodeString(
1308 IN OUT PUNICODE_STRING DestinationString
,
1309 IN PANSI_STRING SourceString
,
1310 IN BOOLEAN AllocateDestinationString
);
1315 RtlxAnsiStringToUnicodeSize(
1316 IN PCANSI_STRING AnsiString
);
1318 #define RtlAnsiStringToUnicodeSize(String) ( \
1319 NLS_MB_CODE_PAGE_TAG ? \
1320 RtlxAnsiStringToUnicodeSize(String) : \
1321 ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
1327 RtlAppendUnicodeStringToString(
1328 IN OUT PUNICODE_STRING Destination
,
1329 IN PCUNICODE_STRING Source
);
1334 RtlAppendUnicodeToString(
1335 IN OUT PUNICODE_STRING Destination
,
1341 RtlCheckRegistryKey(
1342 IN ULONG RelativeTo
,
1349 IN PRTL_BITMAP BitMapHeader
);
1355 IN PRTL_BITMAP BitMapHeader
,
1356 IN ULONG StartingIndex
,
1357 IN ULONG NumberToClear
);
1363 IN CONST VOID
*Source1
,
1364 IN CONST VOID
*Source2
,
1370 RtlCompareUnicodeString(
1371 IN PCUNICODE_STRING String1
,
1372 IN PCUNICODE_STRING String2
,
1373 IN BOOLEAN CaseInSensitive
);
1378 RtlCompareUnicodeStrings(
1380 IN SIZE_T String1Length
,
1382 IN SIZE_T String2Length
,
1383 IN BOOLEAN CaseInSensitive
);
1388 RtlCopyUnicodeString(
1389 IN OUT PUNICODE_STRING DestinationString
,
1390 IN PCUNICODE_STRING SourceString
);
1395 RtlCreateRegistryKey(
1396 IN ULONG RelativeTo
,
1402 RtlCreateSecurityDescriptor(
1403 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
1409 RtlDeleteRegistryValue(
1410 IN ULONG RelativeTo
,
1412 IN PCWSTR ValueName
);
1417 RtlEqualUnicodeString(
1418 IN CONST UNICODE_STRING
*String1
,
1419 IN CONST UNICODE_STRING
*String2
,
1420 IN BOOLEAN CaseInSensitive
);
1422 #if !defined(_AMD64_) && !defined(_IA64_)
1426 RtlExtendedIntegerMultiply(
1427 IN LARGE_INTEGER Multiplicand
,
1428 IN LONG Multiplier
);
1433 RtlExtendedLargeIntegerDivide(
1434 IN LARGE_INTEGER Dividend
,
1436 IN OUT PULONG Remainder
);
1439 #if defined(_X86_) || defined(_IA64_)
1443 RtlExtendedMagicDivide(
1444 IN LARGE_INTEGER Dividend
,
1445 IN LARGE_INTEGER MagicDivisor
,
1446 IN CCHAR ShiftCount
);
1453 IN PANSI_STRING AnsiString
);
1459 IN PRTL_BITMAP BitMapHeader
,
1460 IN ULONG NumberToFind
,
1461 IN ULONG HintIndex
);
1466 RtlFindClearBitsAndSet(
1467 IN PRTL_BITMAP BitMapHeader
,
1468 IN ULONG NumberToFind
,
1469 IN ULONG HintIndex
);
1474 RtlFindFirstRunClear(
1475 IN PRTL_BITMAP BitMapHeader
,
1476 OUT PULONG StartingIndex
);
1482 IN PRTL_BITMAP BitMapHeader
,
1483 OUT PRTL_BITMAP_RUN RunArray
,
1484 IN ULONG SizeOfRunArray
,
1485 IN BOOLEAN LocateLongestRuns
);
1490 RtlFindLastBackwardRunClear(
1491 IN PRTL_BITMAP BitMapHeader
,
1493 OUT PULONG StartingRunIndex
);
1498 RtlFindLeastSignificantBit(
1504 RtlFindLongestRunClear(
1505 IN PRTL_BITMAP BitMapHeader
,
1506 OUT PULONG StartingIndex
);
1511 RtlFindMostSignificantBit(
1517 RtlFindNextForwardRunClear(
1518 IN PRTL_BITMAP BitMapHeader
,
1520 OUT PULONG StartingRunIndex
);
1526 IN PRTL_BITMAP BitMapHeader
,
1527 IN ULONG NumberToFind
,
1528 IN ULONG HintIndex
);
1533 RtlFindSetBitsAndClear(
1534 IN PRTL_BITMAP BitMapHeader
,
1535 IN ULONG NumberToFind
,
1536 IN ULONG HintIndex
);
1541 RtlHashUnicodeString(
1542 IN CONST UNICODE_STRING
*String
,
1543 IN BOOLEAN CaseInSensitive
,
1544 IN ULONG HashAlgorithm
,
1545 OUT PULONG HashValue
);
1551 IN OUT PANSI_STRING DestinationString
,
1552 IN PCSZ SourceString
);
1557 RtlInitializeBitMap(
1558 IN PRTL_BITMAP BitMapHeader
,
1559 IN PULONG BitMapBuffer
,
1560 IN ULONG SizeOfBitMap
);
1566 IN OUT PSTRING DestinationString
,
1567 IN PCSZ SourceString
);
1572 RtlIntegerToUnicodeString(
1574 IN ULONG Base OPTIONAL
,
1575 IN OUT PUNICODE_STRING String
);
1580 RtlInt64ToUnicodeString(
1582 IN ULONG Base OPTIONAL
,
1583 IN OUT PUNICODE_STRING String
);
1586 #define RtlIntPtrToUnicodeString(Value, Base, String) \
1587 RtlInt64ToUnicodeString(Value, Base, String)
1589 #define RtlIntPtrToUnicodeString(Value, Base, String) \
1590 RtlIntegerToUnicodeString(Value, Base, String)
1597 #define RtlIsZeroLuid(_L1) \
1598 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
1603 RtlLengthSecurityDescriptor(
1604 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
1609 RtlNumberOfClearBits(
1610 IN PRTL_BITMAP BitMapHeader
);
1616 IN PRTL_BITMAP BitMapHeader
);
1621 RtlQueryRegistryValues(
1622 IN ULONG RelativeTo
,
1624 IN PRTL_QUERY_REGISTRY_TABLE QueryTable
,
1626 IN PVOID Environment OPTIONAL
);
1628 #define LONG_SIZE (sizeof(LONG))
1629 #define LONG_MASK (LONG_SIZE - 1)
1633 * PULONG DestinationAddress,
1634 * PULONG SourceAddress);
1636 #if defined(_AMD64_)
1637 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
1638 *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
1640 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
1641 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
1643 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
1644 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
1645 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
1646 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
1650 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
1655 * RtlRetrieveUshort(
1656 * PUSHORT DestinationAddress,
1657 * PUSHORT SourceAddress);
1659 #if defined(_AMD64_)
1660 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
1661 *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
1663 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
1664 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
1666 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
1667 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
1671 *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
1679 IN PRTL_BITMAP BitMapHeader
);
1685 IN PRTL_BITMAP BitMapHeader
,
1686 IN ULONG StartingIndex
,
1687 IN ULONG NumberToSet
);
1692 RtlSetDaclSecurityDescriptor(
1693 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
1694 IN BOOLEAN DaclPresent
,
1695 IN PACL Dacl OPTIONAL
,
1696 IN BOOLEAN DaclDefaulted OPTIONAL
);
1700 * IN PULONG Address,
1703 #if defined(_AMD64_)
1704 #define RtlStoreUlong(Address,Value) \
1705 *(ULONG UNALIGNED *)(Address) = (Value)
1707 #define RtlStoreUlong(Address,Value) \
1708 if ((ULONG_PTR)(Address) & LONG_MASK) { \
1709 ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
1710 ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
1711 ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
1712 ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT] = (UCHAR)(FOURTHBYTE(Value)); \
1715 *((PULONG)(Address)) = (ULONG) (Value); \
1720 * RtlStoreUlonglong(
1721 * IN OUT PULONGLONG Address,
1724 #if defined(_AMD64_)
1725 #define RtlStoreUlonglong(Address,Value) \
1726 *(ULONGLONG UNALIGNED *)(Address) = (Value)
1728 #define RtlStoreUlonglong(Address,Value) \
1729 if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
1730 RtlStoreUlong((ULONG_PTR)(Address), \
1731 (ULONGLONG)(Value) & 0xFFFFFFFF); \
1732 RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
1733 (ULONGLONG)(Value) >> 32); \
1735 *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
1741 * IN OUT PULONG_PTR Address,
1742 * IN ULONG_PTR Value);
1745 #define RtlStoreUlongPtr(Address,Value) \
1746 RtlStoreUlonglong(Address,Value)
1748 #define RtlStoreUlongPtr(Address,Value) \
1749 RtlStoreUlong(Address,Value)
1754 * IN PUSHORT Address,
1757 #if defined(_AMD64_)
1758 #define RtlStoreUshort(Address,Value) \
1759 *(USHORT UNALIGNED *)(Address) = (Value)
1761 #define RtlStoreUshort(Address,Value) \
1762 if ((ULONG_PTR)(Address) & SHORT_MASK) { \
1763 ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
1764 ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
1767 *((PUSHORT) (Address)) = (USHORT)Value; \
1774 RtlTimeFieldsToTime(
1775 IN PTIME_FIELDS TimeFields
,
1776 IN PLARGE_INTEGER Time
);
1781 RtlTimeToTimeFields(
1782 IN PLARGE_INTEGER Time
,
1783 IN PTIME_FIELDS TimeFields
);
1794 RtlUlonglongByteSwap(
1795 IN ULONGLONG Source
);
1800 RtlUnicodeStringToAnsiString(
1801 IN OUT PANSI_STRING DestinationString
,
1802 IN PCUNICODE_STRING SourceString
,
1803 IN BOOLEAN AllocateDestinationString
);
1808 RtlxUnicodeStringToAnsiSize(
1809 IN PCUNICODE_STRING UnicodeString
);
1811 #define RtlUnicodeStringToAnsiSize(String) ( \
1812 NLS_MB_CODE_PAGE_TAG ? \
1813 RtlxUnicodeStringToAnsiSize(String) : \
1814 ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
1820 RtlUnicodeStringToInteger(
1821 IN PCUNICODE_STRING String
,
1822 IN ULONG Base OPTIONAL
,
1828 RtlUpcaseUnicodeChar(
1829 IN WCHAR SourceCharacter
);
1840 RtlValidRelativeSecurityDescriptor(
1841 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput
,
1842 IN ULONG SecurityDescriptorLength
,
1843 IN SECURITY_INFORMATION RequiredInformation
);
1848 RtlValidSecurityDescriptor(
1849 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
1854 RtlWriteRegistryValue(
1855 IN ULONG RelativeTo
,
1857 IN PCWSTR ValueName
,
1860 IN ULONG ValueLength
);
1862 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
1864 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
1868 RtlPrefetchMemoryNonTemporal(
1873 #if (NTDDI_VERSION >= NTDDI_WINXP)
1878 PRTL_BITMAP BitMapHeader
,
1884 RtlDowncaseUnicodeChar(
1885 IN WCHAR SourceCharacter
);
1891 PRTL_BITMAP BitMapHeader
,
1898 IN PRTL_BITMAP BitMapHeader
,
1899 IN ULONG BitNumber
);
1901 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
1903 #if (NTDDI_VERSION >= NTDDI_VISTA)
1907 RtlNumberOfSetBitsUlongPtr(
1908 IN ULONG_PTR Target
);
1913 RtlIoDecodeMemIoResource (
1914 IN PIO_RESOURCE_DESCRIPTOR Descriptor
,
1915 OUT PULONGLONG Alignment OPTIONAL
,
1916 OUT PULONGLONG MinimumAddress OPTIONAL
,
1917 OUT PULONGLONG MaximumAddress OPTIONAL
);
1922 RtlIoEncodeMemIoResource(
1923 IN PIO_RESOURCE_DESCRIPTOR Descriptor
,
1925 IN ULONGLONG Length
,
1926 IN ULONGLONG Alignment
,
1927 IN ULONGLONG MinimumAddress
,
1928 IN ULONGLONG MaximumAddress
);
1933 RtlCmDecodeMemIoResource(
1934 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor
,
1935 OUT PULONGLONG Start OPTIONAL
);
1940 RtlFindClosestEncodableLength(
1941 IN ULONGLONG SourceLength
,
1942 OUT PULONGLONG TargetLength
);
1946 #if !defined(MIDL_PASS)
1947 /* inline funftions */
1948 //DECLSPEC_DEPRECATED_DDK_WINXP
1952 RtlConvertLongToLargeInteger(LONG SignedInteger
)
1955 ret
.QuadPart
= SignedInteger
;
1959 //DECLSPEC_DEPRECATED_DDK_WINXP
1963 RtlConvertUlongToLargeInteger(
1964 ULONG UnsignedInteger
)
1967 ret
.QuadPart
= UnsignedInteger
;
1971 //DECLSPEC_DEPRECATED_DDK
1975 RtlEnlargedUnsignedDivide(
1976 IN ULARGE_INTEGER Dividend
,
1978 IN OUT PULONG Remainder
)
1981 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
1982 return (ULONG
)(Dividend
.QuadPart
/ Divisor
);
1985 //DECLSPEC_DEPRECATED_DDK
1989 RtlEnlargedUnsignedMultiply(
1990 IN ULONG Multiplicand
,
1991 IN ULONG Multiplier
)
1994 ret
.QuadPart
= (ULONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
1998 //DECLSPEC_DEPRECATED_DDK
2002 RtlEnlargedIntegerMultiply(
2003 IN LONG Multiplicand
,
2007 ret
.QuadPart
= (LONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
2013 RtlInitEmptyAnsiString(OUT PANSI_STRING AnsiString
,
2015 IN USHORT BufferSize
)
2017 AnsiString
->Length
= 0;
2018 AnsiString
->MaximumLength
= BufferSize
;
2019 AnsiString
->Buffer
= Buffer
;
2024 RtlInitEmptyUnicodeString(
2025 OUT PUNICODE_STRING UnicodeString
,
2027 IN USHORT BufferSize
)
2029 UnicodeString
->Length
= 0;
2030 UnicodeString
->MaximumLength
= BufferSize
;
2031 UnicodeString
->Buffer
= Buffer
;
2034 #if defined(_AMD64_) || defined(_IA64_)
2038 RtlExtendedIntegerMultiply(
2039 LARGE_INTEGER Multiplicand
,
2043 ret
.QuadPart
= Multiplicand
.QuadPart
* Multiplier
;
2050 RtlExtendedLargeIntegerDivide(
2051 LARGE_INTEGER Dividend
,
2056 ret
.QuadPart
= (ULONG64
)Dividend
.QuadPart
/ Divisor
;
2058 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
2063 #if defined(_AMD64_)
2065 #define MultiplyHigh __mulh
2066 #define UnsignedMultiplyHigh __umulh
2068 //DECLSPEC_DEPRECATED_DDK
2072 RtlExtendedMagicDivide(
2073 IN LARGE_INTEGER Dividend
,
2074 IN LARGE_INTEGER MagicDivisor
,
2075 IN CCHAR ShiftCount
)
2080 Pos
= (Dividend
.QuadPart
>= 0);
2081 ret64
= UnsignedMultiplyHigh(Pos
? Dividend
.QuadPart
: -Dividend
.QuadPart
,
2082 MagicDivisor
.QuadPart
);
2083 ret64
>>= ShiftCount
;
2084 ret
.QuadPart
= Pos
? ret64
: -ret64
;
2089 //DECLSPEC_DEPRECATED_DDK
2094 IN LARGE_INTEGER Addend1
,
2095 IN LARGE_INTEGER Addend2
)
2098 ret
.QuadPart
= Addend1
.QuadPart
+ Addend2
.QuadPart
;
2103 * RtlLargeIntegerAnd(
2104 * IN OUT LARGE_INTEGER Result,
2105 * IN LARGE_INTEGER Source,
2106 * IN LARGE_INTEGER Mask);
2108 #define RtlLargeIntegerAnd(Result, Source, Mask) \
2109 Result.QuadPart = Source.QuadPart & Mask.QuadPart
2111 //DECLSPEC_DEPRECATED_DDK
2115 RtlLargeIntegerArithmeticShift(
2116 IN LARGE_INTEGER LargeInteger
,
2117 IN CCHAR ShiftCount
)
2120 ret
.QuadPart
= LargeInteger
.QuadPart
>> ShiftCount
;
2125 * RtlLargeIntegerEqualTo(
2126 * IN LARGE_INTEGER Operand1,
2127 * IN LARGE_INTEGER Operand2);
2129 #define RtlLargeIntegerEqualTo(X,Y) \
2130 (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
2134 RtlSecureZeroMemory(
2138 volatile char* vptr
= (volatile char*)Pointer
;
2139 #if defined(_M_AMD64)
2140 __stosb((PUCHAR
)vptr
, 0, Size
);
2142 char * endptr
= (char *)vptr
+ Size
;
2143 while (vptr
< endptr
)
2151 #if defined(_M_AMD64)
2155 IN PRTL_BITMAP BitMapHeader
,
2156 IN ULONG BitPosition
)
2158 return BitTest((LONG CONST
*)BitMapHeader
->Buffer
, BitPosition
);
2161 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
2162 #endif // defined(_M_AMD64)
2164 #endif // !defined(MIDL_PASS)
2167 // Byte Swap Functions
2169 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \
2170 ((defined(_M_AMD64) || defined(_M_IA64)) \
2171 && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))
2173 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
2174 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
2175 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
2179 /******************************************************************************
2180 * Memory manager Types *
2181 ******************************************************************************/
2183 typedef struct _MDL
{
2187 struct _EPROCESS
*Process
;
2188 PVOID MappedSystemVa
;
2195 /******************************************************************************
2196 * Memory manager Functions *
2197 ******************************************************************************/
2199 /* PVOID MmGetSystemAddressForMdl(
2202 #define MmGetSystemAddressForMdl(Mdl) \
2203 (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
2204 MDL_SOURCE_IS_NONPAGED_POOL)) ? \
2205 ((Mdl)->MappedSystemVa) : \
2206 (MmMapLockedPages((Mdl), KernelMode)))
2209 * MmGetSystemAddressForMdlSafe(
2211 * IN MM_PAGE_PRIORITY Priority)
2213 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
2214 (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
2215 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
2216 (_Mdl)->MappedSystemVa : \
2217 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
2218 KernelMode, MmCached, NULL, FALSE, (_Priority)))
2220 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2225 IN PMDL MemoryDescriptorList OPTIONAL
,
2232 /******************************************************************************
2233 * I/O Manager Functions *
2234 ******************************************************************************/
2236 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
2237 (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
2239 #define DMA_MACROS_DEFINED
2243 IoAllocateAdapterChannel(
2244 IN PADAPTER_OBJECT AdapterObject
,
2245 IN PDEVICE_OBJECT DeviceObject
,
2246 IN ULONG NumberOfMapRegisters
,
2247 IN PDRIVER_CONTROL ExecutionRoutine
,
2250 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel
;
2251 AllocateAdapterChannel
=
2252 *(DmaAdapter
)->DmaOperations
->AllocateAdapterChannel
;
2253 ASSERT(AllocateAdapterChannel
);
2254 return AllocateAdapterChannel(DmaAdapter
,
2256 NumberOfMapRegisters
,
2263 IoFlushAdapterBuffers(
2264 IN PADAPTER_OBJECT AdapterObject
,
2266 IN PVOID MapRegisterBase
,
2269 IN BOOLEAN WriteToDevice
)
2271 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers
;
2272 FlushAdapterBuffers
= *(DmaAdapter
)->DmaOperations
->FlushAdapterBuffers
;
2273 ASSERT(FlushAdapterBuffers
);
2274 return FlushAdapterBuffers(DmaAdapter
,
2284 IoFreeAdapterChannel(
2285 IN PADAPTER_OBJECT AdapterObject
)
2287 PFREE_ADAPTER_CHANNEL FreeAdapterChannel
;
2288 FreeAdapterChannel
= *(DmaAdapter
)->DmaOperations
->FreeAdapterChannel
;
2289 ASSERT(FreeAdapterChannel
);
2290 FreeAdapterChannel(DmaAdapter
);
2296 IN PADAPTER_OBJECT AdapterObject
,
2297 IN PVOID MapRegisterBase
,
2298 IN ULONG NumberOfMapRegisters
)
2300 PFREE_MAP_REGISTERS FreeMapRegisters
;
2301 FreeMapRegisters
= *(DmaAdapter
)->DmaOperations
->FreeMapRegisters
;
2302 ASSERT(FreeMapRegisters
);
2303 FreeMapRegisters(DmaAdapter
, MapRegisterBase
, NumberOfMapRegisters
);
2309 IN PDMA_ADAPTER DmaAdapter
,
2311 IN PVOID MapRegisterBase
,
2313 IN OUT PULONG Length
,
2314 IN BOOLEAN WriteToDevice
)
2316 PMAP_TRANSFER MapTransfer
;
2318 MapTransfer
= *(DmaAdapter
)->DmaOperations
->MapTransfer
;
2319 ASSERT(MapTransfer
);
2320 return MapTransfer(DmaAdapter
,
2330 /******************************************************************************
2332 ******************************************************************************/
2334 typedef enum _POOL_TYPE
{
2337 NonPagedPoolMustSucceed
,
2339 NonPagedPoolCacheAligned
,
2340 PagedPoolCacheAligned
,
2341 NonPagedPoolCacheAlignedMustS
,
2343 NonPagedPoolSession
= 32,
2345 NonPagedPoolMustSucceedSession
,
2346 DontUseThisTypeSession
,
2347 NonPagedPoolCacheAlignedSession
,
2348 PagedPoolCacheAlignedSession
,
2349 NonPagedPoolCacheAlignedMustSSession
2352 typedef enum _SUITE_TYPE
{
2356 CommunicationServer
,
2358 SmallBusinessRestricted
,
2367 typedef enum _EX_POOL_PRIORITY
{
2369 LowPoolPrioritySpecialPoolOverrun
= 8,
2370 LowPoolPrioritySpecialPoolUnderrun
= 9,
2371 NormalPoolPriority
= 16,
2372 NormalPoolPrioritySpecialPoolOverrun
= 24,
2373 NormalPoolPrioritySpecialPoolUnderrun
= 25,
2374 HighPoolPriority
= 32,
2375 HighPoolPrioritySpecialPoolOverrun
= 40,
2376 HighPoolPrioritySpecialPoolUnderrun
= 41
2379 typedef struct _FAST_MUTEX
2386 } FAST_MUTEX
, *PFAST_MUTEX
;
2388 typedef ULONG_PTR ERESOURCE_THREAD
, *PERESOURCE_THREAD
;
2390 typedef struct _OWNER_ENTRY
{
2391 ERESOURCE_THREAD OwnerThread
;
2392 _ANONYMOUS_UNION
union {
2396 } OWNER_ENTRY
, *POWNER_ENTRY
;
2398 typedef struct _ERESOURCE
2400 LIST_ENTRY SystemResourcesList
;
2401 POWNER_ENTRY OwnerTable
;
2404 volatile PKSEMAPHORE SharedWaiters
;
2405 volatile PKEVENT ExclusiveWaiters
;
2406 OWNER_ENTRY OwnerEntry
;
2407 ULONG ActiveEntries
;
2408 ULONG ContentionCount
;
2409 ULONG NumberOfSharedWaiters
;
2410 ULONG NumberOfExclusiveWaiters
;
2414 ULONG_PTR CreatorBackTraceIndex
;
2416 KSPIN_LOCK SpinLock
;
2417 } ERESOURCE
, *PERESOURCE
;
2419 #if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
2420 #define LOOKASIDE_ALIGN
2422 #define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */
2425 typedef struct _LOOKASIDE_LIST_EX
*PLOOKASIDE_LIST_EX
;
2428 (DDKAPI
*PALLOCATE_FUNCTION
)(
2429 IN POOL_TYPE PoolType
,
2430 IN SIZE_T NumberOfBytes
,
2434 (DDKAPI
*PALLOCATE_FUNCTION_EX
)(
2435 IN POOL_TYPE PoolType
,
2436 IN SIZE_T NumberOfBytes
,
2438 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
2441 (DDKAPI
*PFREE_FUNCTION
)(
2445 (DDKAPI
*PFREE_FUNCTION_EX
)(
2447 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
2450 (DDKAPI
*PCALLBACK_FUNCTION
)(
2451 IN PVOID CallbackContext
,
2453 IN PVOID Argument2
);
2455 typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE
{
2457 SLIST_HEADER ListHead
;
2458 SINGLE_LIST_ENTRY SingleListHead
;
2461 USHORT MaximumDepth
;
2462 ULONG TotalAllocates
;
2464 ULONG AllocateMisses
;
2476 PALLOCATE_FUNCTION_EX AllocateEx
;
2477 PALLOCATE_FUNCTION Allocate
;
2480 PFREE_FUNCTION_EX FreeEx
;
2481 PFREE_FUNCTION Free
;
2483 LIST_ENTRY ListEntry
;
2484 ULONG LastTotalAllocates
;
2486 ULONG LastAllocateMisses
;
2487 ULONG LastAllocateHits
;
2490 } GENERAL_LOOKASIDE
, *PGENERAL_LOOKASIDE
;
2492 typedef struct _PAGED_LOOKASIDE_LIST
{
2493 GENERAL_LOOKASIDE L
;
2494 #if !defined(_AMD64_) && !defined(_IA64_)
2495 FAST_MUTEX Lock__ObsoleteButDoNotDelete
;
2497 } PAGED_LOOKASIDE_LIST
, *PPAGED_LOOKASIDE_LIST
;
2499 typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST
{
2500 GENERAL_LOOKASIDE L
;
2501 #if !defined(_AMD64_) && !defined(_IA64_)
2502 KSPIN_LOCK Lock__ObsoleteButDoNotDelete
;
2504 } NPAGED_LOOKASIDE_LIST
, *PNPAGED_LOOKASIDE_LIST
;
2506 //typedef struct _LOOKASIDE_LIST_EX {
2507 // GENERAL_LOOKASIDE_POOL L;
2508 //} LOOKASIDE_LIST_EX, *PLOOKASIDE_LIST_EX;
2510 typedef struct _EX_RUNDOWN_REF
{
2512 volatile ULONG_PTR Count
;
2515 } EX_RUNDOWN_REF
, *PEX_RUNDOWN_REF
;
2517 typedef struct _EX_RUNDOWN_REF_CACHE_AWARE
*PEX_RUNDOWN_REF_CACHE_AWARE
;
2519 typedef enum _WORK_QUEUE_TYPE
{
2522 HyperCriticalWorkQueue
,
2527 (DDKAPI
*PWORKER_THREAD_ROUTINE
)(
2528 IN PVOID Parameter
);
2530 typedef struct _WORK_QUEUE_ITEM
{
2532 PWORKER_THREAD_ROUTINE WorkerRoutine
;
2533 volatile PVOID Parameter
;
2534 } WORK_QUEUE_ITEM
, *PWORK_QUEUE_ITEM
;
2537 /******************************************************************************
2538 * Executive Functions *
2539 ******************************************************************************/
2542 #if defined(_NTHAL_)
2543 #define ExAcquireFastMutex ExiAcquireFastMutex
2544 #define ExReleaseFastMutex ExiReleaseFastMutex
2545 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
2547 #define ExInterlockedAddUlong ExfInterlockedAddUlong
2548 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
2549 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
2550 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
2551 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
2552 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
2557 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
2558 defined(_NTHAL_) || defined(_NTOSP_)
2561 ExQueryDepthSList(IN PSLIST_HEADER ListHead
);
2565 ExQueryDepthSList(IN PSLIST_HEADER ListHead
)
2567 return (USHORT
)(ListHead
->Alignment
& 0xffff);
2573 ExpInterlockedFlushSList(
2574 PSLIST_HEADER ListHead
);
2578 ExpInterlockedPopEntrySList(
2579 PSLIST_HEADER ListHead
);
2583 ExpInterlockedPushEntrySList(
2584 PSLIST_HEADER ListHead
,
2585 PSLIST_ENTRY ListEntry
);
2587 #define ExInterlockedFlushSList(Head) \
2588 ExpInterlockedFlushSList(Head)
2589 #define ExInterlockedPopEntrySList(Head, Lock) \
2590 ExpInterlockedPopEntrySList(Head)
2591 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
2592 ExpInterlockedPushEntrySList(Head, Entry)
2594 #else // !defined(_WIN64)
2596 #define ExQueryDepthSList(listhead) (listhead)->Depth
2601 ExInterlockedFlushSList(
2602 IN PSLIST_HEADER ListHead
);
2604 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
2608 ExInterlockedPopEntrySList(
2609 IN PSLIST_HEADER ListHead
,
2610 IN PKSPIN_LOCK Lock
);
2615 ExInterlockedPushEntrySList(
2616 IN PSLIST_HEADER ListHead
,
2617 IN PSINGLE_LIST_ENTRY ListEntry
,
2618 IN PKSPIN_LOCK Lock
);
2620 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
2621 InterlockedPopEntrySList(_ListHead)
2622 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
2623 InterlockedPushEntrySList(_ListHead, _ListEntry)
2624 #endif // _WIN2K_COMPAT_SLIST_USAGE
2626 #endif // !defined(_WIN64)
2629 * ExGetCurrentResourceThread(
2632 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread())
2634 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
2637 * ExInitializeWorkItem(
2638 * IN PWORK_QUEUE_ITEM Item,
2639 * IN PWORKER_THREAD_ROUTINE Routine,
2642 #define ExInitializeWorkItem(Item, Routine, Context) \
2644 (Item)->WorkerRoutine = Routine; \
2645 (Item)->Parameter = Context; \
2646 (Item)->List.Flink = NULL; \
2649 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2655 IN OUT PFAST_MUTEX FastMutex
);
2661 IN OUT PFAST_MUTEX FastMutex
);
2666 ExTryToAcquireFastMutex(
2667 IN OUT PFAST_MUTEX FastMutex
);
2672 ExAcquireFastMutexUnsafe(
2673 IN OUT PFAST_MUTEX FastMutex
);
2678 ExReleaseFastMutexUnsafe(
2679 IN OUT PFAST_MUTEX FastMutex
);
2684 ExAcquireResourceExclusiveLite(
2685 IN PERESOURCE Resource
,
2691 ExAcquireResourceSharedLite(
2692 IN PERESOURCE Resource
,
2698 ExAcquireSharedStarveExclusive(
2699 IN PERESOURCE Resource
,
2705 ExAcquireSharedWaitForExclusive(
2706 IN PERESOURCE Resource
,
2713 IN POOL_TYPE PoolType
,
2714 IN SIZE_T NumberOfBytes
);
2717 #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
2718 #endif /* POOL_TAGGING */
2723 ExAllocatePoolWithQuota(
2724 IN POOL_TYPE PoolType
,
2725 IN SIZE_T NumberOfBytes
);
2728 #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
2729 #endif /* POOL_TAGGING */
2734 ExAllocatePoolWithQuotaTag(
2735 IN POOL_TYPE PoolType
,
2736 IN SIZE_T NumberOfBytes
,
2739 #ifndef POOL_TAGGING
2740 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
2741 #endif /* POOL_TAGGING */
2746 ExAllocatePoolWithTag(
2747 IN POOL_TYPE PoolType
,
2748 IN SIZE_T NumberOfBytes
,
2754 ExAllocatePoolWithTagPriority(
2755 IN POOL_TYPE PoolType
,
2756 IN SIZE_T NumberOfBytes
,
2758 IN EX_POOL_PRIORITY Priority
);
2763 ExConvertExclusiveToSharedLite(
2764 IN PERESOURCE Resource
);
2770 OUT PCALLBACK_OBJECT
*CallbackObject
,
2771 IN POBJECT_ATTRIBUTES ObjectAttributes
,
2773 IN BOOLEAN AllowMultipleCallbacks
);
2778 ExDeleteNPagedLookasideList(
2779 IN PNPAGED_LOOKASIDE_LIST Lookaside
);
2784 ExDeletePagedLookasideList(
2785 IN PPAGED_LOOKASIDE_LIST Lookaside
);
2790 ExDeleteResourceLite(
2791 IN PERESOURCE Resource
);
2800 #define ExFreePool(P) ExFreePoolWithTag(P, 0)
2813 ExGetExclusiveWaiterCount(
2814 IN PERESOURCE Resource
);
2825 ExGetSharedWaiterCount(
2826 IN PERESOURCE Resource
);
2831 ExInitializeNPagedLookasideList(
2832 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
2833 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
2834 IN PFREE_FUNCTION Free OPTIONAL
,
2843 ExInitializePagedLookasideList(
2844 IN PPAGED_LOOKASIDE_LIST Lookaside
,
2845 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
2846 IN PFREE_FUNCTION Free OPTIONAL
,
2855 ExInitializeResourceLite(
2856 IN PERESOURCE Resource
);
2861 ExInterlockedAddLargeInteger(
2862 IN PLARGE_INTEGER Addend
,
2863 IN LARGE_INTEGER Increment
,
2864 IN PKSPIN_LOCK Lock
);
2867 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
2868 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
2870 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
2871 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
2877 ExInterlockedAddUlong(
2882 #if defined(_AMD64_) || defined(_IA64_)
2883 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
2884 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
2885 #elif defined(_X86_)
2889 ExfInterlockedCompareExchange64(
2890 IN OUT LONGLONG
volatile *Destination
,
2891 IN PLONGLONG Exchange
,
2892 IN PLONGLONG Comperand
);
2893 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
2894 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
2899 ExInterlockedCompareExchange64(
2900 IN OUT LONGLONG
volatile *Destination
,
2901 IN PLONGLONG Exchange
,
2902 IN PLONGLONG Comparand
,
2903 IN PKSPIN_LOCK Lock
);
2909 ExInterlockedInsertHeadList(
2910 IN PLIST_ENTRY ListHead
,
2911 IN PLIST_ENTRY ListEntry
,
2912 IN PKSPIN_LOCK Lock
);
2917 ExInterlockedInsertTailList(
2918 IN PLIST_ENTRY ListHead
,
2919 IN PLIST_ENTRY ListEntry
,
2920 IN PKSPIN_LOCK Lock
);
2925 ExInterlockedPopEntryList(
2926 IN PSINGLE_LIST_ENTRY ListHead
,
2927 IN PKSPIN_LOCK Lock
);
2932 ExInterlockedPushEntryList(
2933 IN PSINGLE_LIST_ENTRY ListHead
,
2934 IN PSINGLE_LIST_ENTRY ListEntry
,
2935 IN PKSPIN_LOCK Lock
);
2940 ExInterlockedRemoveHeadList(
2941 IN PLIST_ENTRY ListHead
,
2942 IN PKSPIN_LOCK Lock
);
2947 ExIsProcessorFeaturePresent(
2948 IN ULONG ProcessorFeature
);
2953 ExIsResourceAcquiredExclusiveLite(
2954 IN PERESOURCE Resource
);
2959 ExIsResourceAcquiredSharedLite(
2960 IN PERESOURCE Resource
);
2962 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
2967 ExLocalTimeToSystemTime(
2968 IN PLARGE_INTEGER LocalTime
,
2969 OUT PLARGE_INTEGER SystemTime
);
2975 IN PCALLBACK_OBJECT CallbackObject
,
2977 IN PVOID Argument2
);
2983 IN PWORK_QUEUE_ITEM WorkItem
,
2984 IN WORK_QUEUE_TYPE QueueType
);
2991 IN NTSTATUS Status
);
2997 IN PCALLBACK_OBJECT CallbackObject
,
2998 IN PCALLBACK_FUNCTION CallbackFunction
,
2999 IN PVOID CallbackContext
);
3004 ExReinitializeResourceLite(
3005 IN PERESOURCE Resource
);
3010 ExReleaseResourceForThreadLite(
3011 IN PERESOURCE Resource
,
3012 IN ERESOURCE_THREAD ResourceThreadId
);
3017 ExReleaseResourceLite(
3018 IN PERESOURCE Resource
);
3023 ExSetResourceOwnerPointer(
3024 IN PERESOURCE Resource
,
3025 IN PVOID OwnerPointer
);
3030 ExSetTimerResolution(
3031 IN ULONG DesiredTime
,
3032 IN BOOLEAN SetResolution
);
3037 ExSystemTimeToLocalTime(
3038 IN PLARGE_INTEGER SystemTime
,
3039 OUT PLARGE_INTEGER LocalTime
);
3044 ExUnregisterCallback(
3045 IN PVOID CbRegistration
);
3048 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
3050 #if (NTDDI_VERSION >= NTDDI_WINXP)
3054 ExAcquireRundownProtection(
3055 IN OUT PEX_RUNDOWN_REF RunRef
);
3060 ExInitializeRundownProtection(
3061 OUT PEX_RUNDOWN_REF RunRef
);
3066 ExReInitializeRundownProtection(
3067 OUT PEX_RUNDOWN_REF RunRef
);
3072 ExReleaseRundownProtection(
3073 IN OUT PEX_RUNDOWN_REF RunRef
);
3079 OUT PEX_RUNDOWN_REF RunRef
);
3085 IN SUITE_TYPE SuiteType
);
3090 ExWaitForRundownProtectionRelease(
3091 IN OUT PEX_RUNDOWN_REF RunRef
);
3093 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
3095 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
3099 ExAcquireRundownProtectionEx(
3100 IN OUT PEX_RUNDOWN_REF RunRef
,
3106 ExReleaseRundownProtectionEx(
3107 IN OUT PEX_RUNDOWN_REF RunRef
,
3109 #endif // (NTDDI_VERSION >= NTDDI_WINXPSP2)
3111 #if (NTDDI_VERSION >= NTDDI_WS03)
3113 #endif // (NTDDI_VERSION >= NTDDI_WS03)
3115 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
3117 PEX_RUNDOWN_REF_CACHE_AWARE
3118 ExAllocateCacheAwareRundownProtection(
3119 IN POOL_TYPE PoolType
,
3124 ExSizeOfRundownProtectionCacheAware(VOID
);
3126 #endif // (NTDDI_VERSION >= NTDDI_WS03SP1)
3128 #if (NTDDI_VERSION >= NTDDI_VISTA)
3131 ExInitializeLookasideListEx(
3132 OUT PLOOKASIDE_LIST_EX Lookaside
,
3133 IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL
,
3134 IN PFREE_FUNCTION_EX Free OPTIONAL
,
3135 IN POOL_TYPE PoolType
,
3143 #if !defined(MIDL_PASS)
3145 static __inline PVOID
3146 ExAllocateFromNPagedLookasideList(
3147 IN PNPAGED_LOOKASIDE_LIST Lookaside
)
3151 Lookaside
->L
.TotalAllocates
++;
3152 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
3153 if (Entry
== NULL
) {
3154 Lookaside
->L
.AllocateMisses
++;
3155 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
3162 static __inline PVOID
3163 ExAllocateFromPagedLookasideList(
3164 IN PPAGED_LOOKASIDE_LIST Lookaside
)
3168 Lookaside
->L
.TotalAllocates
++;
3169 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
3170 if (Entry
== NULL
) {
3171 Lookaside
->L
.AllocateMisses
++;
3172 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
3179 static __inline VOID
3180 ExFreeToNPagedLookasideList(
3181 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
3184 Lookaside
->L
.TotalFrees
++;
3185 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
3186 Lookaside
->L
.FreeMisses
++;
3187 (Lookaside
->L
.Free
)(Entry
);
3189 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
3193 static __inline VOID
3194 ExFreeToPagedLookasideList(
3195 IN PPAGED_LOOKASIDE_LIST Lookaside
,
3198 Lookaside
->L
.TotalFrees
++;
3199 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
3200 Lookaside
->L
.FreeMisses
++;
3201 (Lookaside
->L
.Free
)(Entry
);
3203 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
3208 #endif // !defined(MIDL_PASS)