14 #endif /* GUID_DEFINED */
25 /* HACKHACKHACK!!! We shouldn't include this header from ntoskrnl! */
28 #define NTKERNELAPI DECLSPEC_IMPORT
32 #define PORT_MAXIMUM_MESSAGE_LENGTH 512
34 #define PORT_MAXIMUM_MESSAGE_LENGTH 256
39 typedef UCHAR KPROCESSOR_MODE
;
40 typedef LONG KPRIORITY
;
41 typedef PVOID PSECURITY_DESCRIPTOR
;
42 typedef ULONG SECURITY_INFORMATION
, *PSECURITY_INFORMATION
;
44 /* Structures not exposed to drivers */
45 typedef struct _OBJECT_TYPE
*POBJECT_TYPE
;
46 typedef struct _HAL_DISPATCH_TABLE
*PHAL_DISPATCH_TABLE
;
47 typedef struct _HAL_PRIVATE_DISPATCH_TABLE
*PHAL_PRIVATE_DISPATCH_TABLE
;
48 typedef struct _DEVICE_HANDLER_OBJECT
*PDEVICE_HANDLER_OBJECT
;
49 typedef struct _BUS_HANDLER
*PBUS_HANDLER
;
51 typedef struct _ADAPTER_OBJECT
*PADAPTER_OBJECT
;
52 typedef struct _CALLBACK_OBJECT
*PCALLBACK_OBJECT
;
53 typedef struct _ETHREAD
*PETHREAD
;
54 typedef struct _EPROCESS
*PEPROCESS
;
55 typedef struct _IO_TIMER
*PIO_TIMER
;
56 typedef struct _KINTERRUPT
*PKINTERRUPT
;
57 typedef struct _KPROCESS
*PKPROCESS
;
58 typedef struct _KTHREAD
*PKTHREAD
, *PRKTHREAD
;
61 typedef struct _CONTEXT
*PCONTEXT
;
64 // Resource list definitions
66 typedef int CM_RESOURCE_TYPE
;
68 #define CmResourceTypeNull 0
69 #define CmResourceTypePort 1
70 #define CmResourceTypeInterrupt 2
71 #define CmResourceTypeMemory 3
72 #define CmResourceTypeDma 4
73 #define CmResourceTypeDeviceSpecific 5
74 #define CmResourceTypeBusNumber 6
75 #define CmResourceTypeNonArbitrated 128
76 #define CmResourceTypeConfigData 128
77 #define CmResourceTypeDevicePrivate 129
78 #define CmResourceTypePcCardConfig 130
79 #define CmResourceTypeMfCardConfig 131
81 typedef enum _INTERFACE_TYPE
{
82 InterfaceTypeUndefined
= -1,
100 } INTERFACE_TYPE
, *PINTERFACE_TYPE
;
102 /* IO_RESOURCE_DESCRIPTOR.Option */
104 #define IO_RESOURCE_PREFERRED 0x01
105 #define IO_RESOURCE_DEFAULT 0x02
106 #define IO_RESOURCE_ALTERNATIVE 0x08
108 typedef struct _IO_RESOURCE_DESCRIPTOR
{
111 UCHAR ShareDisposition
;
119 PHYSICAL_ADDRESS MinimumAddress
;
120 PHYSICAL_ADDRESS MaximumAddress
;
125 PHYSICAL_ADDRESS MinimumAddress
;
126 PHYSICAL_ADDRESS MaximumAddress
;
133 ULONG MinimumChannel
;
134 ULONG MaximumChannel
;
139 PHYSICAL_ADDRESS MinimumAddress
;
140 PHYSICAL_ADDRESS MaximumAddress
;
157 } IO_RESOURCE_DESCRIPTOR
, *PIO_RESOURCE_DESCRIPTOR
;
159 typedef struct _IO_RESOURCE_LIST
{
163 IO_RESOURCE_DESCRIPTOR Descriptors
[1];
164 } IO_RESOURCE_LIST
, *PIO_RESOURCE_LIST
;
166 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST
{
168 INTERFACE_TYPE InterfaceType
;
172 ULONG AlternativeLists
;
173 IO_RESOURCE_LIST List
[1];
174 } IO_RESOURCE_REQUIREMENTS_LIST
, *PIO_RESOURCE_REQUIREMENTS_LIST
;
179 extern ULONG NtGlobalFlag
;
182 #include <pshpack4.h>
183 typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR
{
185 UCHAR ShareDisposition
;
189 PHYSICAL_ADDRESS Start
;
193 PHYSICAL_ADDRESS Start
;
201 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
219 PHYSICAL_ADDRESS Start
;
239 } DeviceSpecificData
;
240 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
242 PHYSICAL_ADDRESS Start
;
246 PHYSICAL_ADDRESS Start
;
250 PHYSICAL_ADDRESS Start
;
255 } CM_PARTIAL_RESOURCE_DESCRIPTOR
, *PCM_PARTIAL_RESOURCE_DESCRIPTOR
;
259 // Section map options
261 typedef enum _SECTION_INHERIT
{
267 // Section access rights
269 #define SECTION_QUERY 0x0001
270 #define SECTION_MAP_WRITE 0x0002
271 #define SECTION_MAP_READ 0x0004
272 #define SECTION_MAP_EXECUTE 0x0008
273 #define SECTION_EXTEND_SIZE 0x0010
274 #define SECTION_MAP_EXECUTE_EXPLICIT 0x0020
276 #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
277 SECTION_MAP_WRITE | \
279 SECTION_MAP_EXECUTE | \
282 #define SESSION_QUERY_ACCESS 0x0001
283 #define SESSION_MODIFY_ACCESS 0x0002
285 #define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
286 SESSION_QUERY_ACCESS | \
287 SESSION_MODIFY_ACCESS)
291 #define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
293 #define PAGE_NOACCESS 0x01
294 #define PAGE_READONLY 0x02
295 #define PAGE_READWRITE 0x04
296 #define PAGE_WRITECOPY 0x08
297 #define PAGE_EXECUTE 0x10
298 #define PAGE_EXECUTE_READ 0x20
299 #define PAGE_EXECUTE_READWRITE 0x40
300 #define PAGE_EXECUTE_WRITECOPY 0x80
301 #define PAGE_GUARD 0x100
302 #define PAGE_NOCACHE 0x200
303 #define PAGE_WRITECOMBINE 0x400
305 #define MEM_COMMIT 0x1000
306 #define MEM_RESERVE 0x2000
307 #define MEM_DECOMMIT 0x4000
308 #define MEM_RELEASE 0x8000
309 #define MEM_FREE 0x10000
310 #define MEM_PRIVATE 0x20000
311 #define MEM_MAPPED 0x40000
312 #define MEM_RESET 0x80000
313 #define MEM_TOP_DOWN 0x100000
314 #define MEM_LARGE_PAGES 0x20000000
315 #define MEM_4MB_PAGES 0x80000000
317 #define SEC_RESERVE 0x4000000
318 #define SEC_LARGE_PAGES 0x80000000
320 #define PROCESS_DUP_HANDLE (0x0040)
322 #if (NTDDI_VERSION >= NTDDI_VISTA)
323 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
326 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
333 // Processor features
335 #define PF_FLOATING_POINT_PRECISION_ERRATA 0
336 #define PF_FLOATING_POINT_EMULATED 1
337 #define PF_COMPARE_EXCHANGE_DOUBLE 2
338 #define PF_MMX_INSTRUCTIONS_AVAILABLE 3
339 #define PF_PPC_MOVEMEM_64BIT_OK 4
340 #define PF_ALPHA_BYTE_INSTRUCTIONS 5
341 #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
342 #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
343 #define PF_RDTSC_INSTRUCTION_AVAILABLE 8
344 #define PF_PAE_ENABLED 9
345 #define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
346 #define PF_SSE_DAZ_MODE_AVAILABLE 11
347 #define PF_NX_ENABLED 12
348 #define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
349 #define PF_COMPARE_EXCHANGE128 14
350 #define PF_COMPARE64_EXCHANGE128 15
351 #define PF_CHANNELS_ENABLED 16
356 // Intrinsics (note: taken from our winnt.h)
359 #if defined(__GNUC__)
361 static __inline__ BOOLEAN
362 InterlockedBitTestAndSet(IN LONG
volatile *Base
,
367 __asm__
__volatile__("lock "
370 :"=r" (OldBit
),"+m" (*Base
)
375 return (_InterlockedOr(Base
, 1 << Bit
) >> Bit
) & 1;
379 static __inline__ BOOLEAN
380 InterlockedBitTestAndReset(IN LONG
volatile *Base
,
385 __asm__
__volatile__("lock "
388 :"=r" (OldBit
),"+m" (*Base
)
393 return (_InterlockedAnd(Base
, ~(1 << Bit
)) >> Bit
) & 1;
399 #define BitScanForward _BitScanForward
400 #define BitScanReverse _BitScanReverse
402 #define BitTest _bittest
403 #define BitTestAndComplement _bittestandcomplement
404 #define BitTestAndSet _bittestandset
405 #define BitTestAndReset _bittestandreset
406 #define InterlockedBitTestAndSet _interlockedbittestandset
407 #define InterlockedBitTestAndReset _interlockedbittestandreset
410 /** INTERLOCKED FUNCTIONS *****************************************************/
412 #if !defined(__INTERLOCKED_DECLARED)
413 #define __INTERLOCKED_DECLARED
416 #if defined(NO_INTERLOCKED_INTRINSICS)
420 InterlockedIncrement(
421 IN OUT LONG
volatile *Addend
);
426 InterlockedDecrement(
427 IN OUT LONG
volatile *Addend
);
432 InterlockedCompareExchange(
433 IN OUT LONG
volatile *Destination
,
441 IN OUT LONG
volatile *Destination
,
447 InterlockedExchangeAdd(
448 IN OUT LONG
volatile *Addend
,
451 #else // !defined(NO_INTERLOCKED_INTRINSICS)
453 #define InterlockedExchange _InterlockedExchange
454 #define InterlockedIncrement _InterlockedIncrement
455 #define InterlockedDecrement _InterlockedDecrement
456 #define InterlockedExchangeAdd _InterlockedExchangeAdd
457 #define InterlockedCompareExchange _InterlockedCompareExchange
458 #define InterlockedOr _InterlockedOr
459 #define InterlockedAnd _InterlockedAnd
460 #define InterlockedXor _InterlockedXor
462 #endif // !defined(NO_INTERLOCKED_INTRINSICS)
464 #endif // defined (_X86_)
466 #if !defined (_WIN64)
469 * InterlockedExchangePointer(
470 * IN OUT PVOID VOLATILE *Target,
473 #define InterlockedExchangePointer(Target, Value) \
474 ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
478 * InterlockedCompareExchangePointer(
479 * IN OUT PVOID *Destination,
481 * IN PVOID Comparand)
483 #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
484 ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
486 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
487 #define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
488 #define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
490 #endif // !defined (_WIN64)
492 #if defined (_M_AMD64)
494 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONGLONG *)a, (LONGLONG)b)
495 #define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONGLONG *)a)
496 #define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONGLONG *)a)
497 #define InterlockedAnd _InterlockedAnd
498 #define InterlockedOr _InterlockedOr
499 #define InterlockedXor _InterlockedXor
500 #define InterlockedIncrement _InterlockedIncrement
501 #define InterlockedDecrement _InterlockedDecrement
502 #define InterlockedAdd _InterlockedAdd
503 #define InterlockedExchange _InterlockedExchange
504 #define InterlockedExchangeAdd _InterlockedExchangeAdd
505 #define InterlockedCompareExchange _InterlockedCompareExchange
506 #define InterlockedAnd64 _InterlockedAnd64
507 #define InterlockedOr64 _InterlockedOr64
508 #define InterlockedXor64 _InterlockedXor64
509 #define InterlockedIncrement64 _InterlockedIncrement64
510 #define InterlockedDecrement64 _InterlockedDecrement64
511 #define InterlockedAdd64 _InterlockedAdd64
512 #define InterlockedExchange64 _InterlockedExchange64
513 #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
514 #define InterlockedCompareExchange64 _InterlockedCompareExchange64
515 #define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
516 #define InterlockedExchangePointer _InterlockedExchangePointer
517 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
518 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
522 #if defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
523 //#if !defined(_X86AMD64_) // FIXME: what's _X86AMD64_ used for?
527 IN OUT LONG64
volatile *Addend
,
530 return InterlockedExchangeAdd64(Addend
, Value
) + Value
;
535 #endif /* !__INTERLOCKED_DECLARED */
538 #define YieldProcessor _mm_pause
539 #elif defined (_M_AMD64)
540 #define YieldProcessor _mm_pause
541 #elif defined(_M_PPC)
542 #define YieldProcessor() __asm__ __volatile__("nop");
543 #elif defined(_M_MIPS)
544 #define YieldProcessor() __asm__ __volatile__("nop");
545 #elif defined(_M_ARM)
546 #define YieldProcessor()
548 #error Unknown architecture
556 #ifndef _SLIST_HEADER_
557 #define _SLIST_HEADER_
559 #define SLIST_ENTRY SINGLE_LIST_ENTRY
560 #define _SLIST_ENTRY _SINGLE_LIST_ENTRY
561 #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
564 typedef union _SLIST_HEADER
{
571 ULONGLONG Sequence
:9;
572 ULONGLONG NextEntry
:39;
573 ULONGLONG HeaderType
:1;
575 ULONGLONG Reserved
:59;
579 ULONGLONG Sequence
:48;
580 ULONGLONG HeaderType
:1;
582 ULONGLONG Reserved
:2;
583 ULONGLONG NextEntry
:60;
586 } SLIST_HEADER
, *PSLIST_HEADER
;
588 typedef union _SLIST_HEADER
{
595 } SLIST_HEADER
, *PSLIST_HEADER
;
598 #endif /* _SLIST_HEADER_ */
603 // Power States/Levels
605 typedef enum _SYSTEM_POWER_STATE
{
606 PowerSystemUnspecified
,
608 PowerSystemSleeping1
,
609 PowerSystemSleeping2
,
610 PowerSystemSleeping3
,
611 PowerSystemHibernate
,
614 } SYSTEM_POWER_STATE
, *PSYSTEM_POWER_STATE
;
616 #define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
618 typedef enum _POWER_INFORMATION_LEVEL
{
621 VerifySystemPolicyAc
,
622 VerifySystemPolicyDc
,
623 SystemPowerCapabilities
,
625 SystemPowerStateHandler
,
626 ProcessorStateHandler
,
627 SystemPowerPolicyCurrent
,
628 AdministratorPowerPolicy
,
629 SystemReserveHiberFile
,
630 ProcessorInformation
,
631 SystemPowerInformation
,
632 ProcessorStateHandler2
,
635 SystemExecutionState
,
636 SystemPowerStateNotifyHandler
,
637 ProcessorPowerPolicyAc
,
638 ProcessorPowerPolicyDc
,
639 VerifyProcessorPowerPolicyAc
,
640 VerifyProcessorPowerPolicyDc
,
641 ProcessorPowerPolicyCurrent
642 } POWER_INFORMATION_LEVEL
;
648 PowerActionHibernate
,
650 PowerActionShutdownReset
,
651 PowerActionShutdownOff
,
653 } POWER_ACTION
, *PPOWER_ACTION
;
655 typedef enum _DEVICE_POWER_STATE
{
656 PowerDeviceUnspecified
,
662 } DEVICE_POWER_STATE
, *PDEVICE_POWER_STATE
;
664 #define ES_SYSTEM_REQUIRED 0x00000001
665 #define ES_DISPLAY_REQUIRED 0x00000002
666 #define ES_USER_PRESENT 0x00000004
667 #define ES_CONTINUOUS 0x80000000
669 typedef ULONG EXECUTION_STATE
;
679 // Access/Security Stuff
681 typedef ULONG ACCESS_MASK
, *PACCESS_MASK
;
682 typedef PVOID PACCESS_TOKEN
;
684 #define DELETE 0x00010000L
685 #define READ_CONTROL 0x00020000L
686 #define WRITE_DAC 0x00040000L
687 #define WRITE_OWNER 0x00080000L
688 #define SYNCHRONIZE 0x00100000L
689 #define STANDARD_RIGHTS_REQUIRED 0x000F0000L
690 #define STANDARD_RIGHTS_READ READ_CONTROL
691 #define STANDARD_RIGHTS_WRITE READ_CONTROL
692 #define STANDARD_RIGHTS_EXECUTE READ_CONTROL
693 #define STANDARD_RIGHTS_ALL 0x001F0000L
694 #define SPECIFIC_RIGHTS_ALL 0x0000FFFFL
695 #define ACCESS_SYSTEM_SECURITY 0x01000000L
696 #define MAXIMUM_ALLOWED 0x02000000L
697 #define GENERIC_READ 0x80000000L
698 #define GENERIC_WRITE 0x40000000L
699 #define GENERIC_EXECUTE 0x20000000L
700 #define GENERIC_ALL 0x10000000L
702 typedef struct _GENERIC_MAPPING
{
703 ACCESS_MASK GenericRead
;
704 ACCESS_MASK GenericWrite
;
705 ACCESS_MASK GenericExecute
;
706 ACCESS_MASK GenericAll
;
707 } GENERIC_MAPPING
, *PGENERIC_MAPPING
;
709 #define ACL_REVISION 2
710 #define ACL_REVISION_DS 4
712 #define ACL_REVISION1 1
713 #define ACL_REVISION2 2
714 #define ACL_REVISION3 3
715 #define ACL_REVISION4 4
716 #define MIN_ACL_REVISION ACL_REVISION2
717 #define MAX_ACL_REVISION ACL_REVISION4
719 typedef struct _ACL
{
730 // Current security descriptor revision value
732 #define SECURITY_DESCRIPTOR_REVISION (1)
733 #define SECURITY_DESCRIPTOR_REVISION1 (1)
736 // Privilege attributes
738 #define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
739 #define SE_PRIVILEGE_ENABLED (0x00000002L)
740 #define SE_PRIVILEGE_REMOVED (0X00000004L)
741 #define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
743 #define SE_PRIVILEGE_VALID_ATTRIBUTES (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
744 SE_PRIVILEGE_ENABLED | \
745 SE_PRIVILEGE_REMOVED | \
746 SE_PRIVILEGE_USED_FOR_ACCESS)
748 #include <pshpack4.h>
749 typedef struct _LUID_AND_ATTRIBUTES
{
752 } LUID_AND_ATTRIBUTES
, *PLUID_AND_ATTRIBUTES
;
754 typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY
[ANYSIZE_ARRAY
];
755 typedef LUID_AND_ATTRIBUTES_ARRAY
*PLUID_AND_ATTRIBUTES_ARRAY
;
762 #define PRIVILEGE_SET_ALL_NECESSARY (1)
764 typedef struct _PRIVILEGE_SET
{
765 ULONG PrivilegeCount
;
767 LUID_AND_ATTRIBUTES Privilege
[ANYSIZE_ARRAY
];
768 } PRIVILEGE_SET
,*PPRIVILEGE_SET
;
770 typedef enum _SECURITY_IMPERSONATION_LEVEL
{
772 SecurityIdentification
,
773 SecurityImpersonation
,
775 } SECURITY_IMPERSONATION_LEVEL
, * PSECURITY_IMPERSONATION_LEVEL
;
777 #define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
778 #define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
779 #define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
780 #define VALID_IMPERSONATION_LEVEL(Level) (((Level) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((Level) <= SECURITY_MAX_IMPERSONATION_LEVEL))
782 #define SECURITY_DYNAMIC_TRACKING (TRUE)
783 #define SECURITY_STATIC_TRACKING (FALSE)
785 typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE
, *PSECURITY_CONTEXT_TRACKING_MODE
;
787 typedef struct _SECURITY_QUALITY_OF_SERVICE
{
789 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
;
790 SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode
;
791 BOOLEAN EffectiveOnly
;
792 } SECURITY_QUALITY_OF_SERVICE
, *PSECURITY_QUALITY_OF_SERVICE
;
794 typedef struct _SE_IMPERSONATION_STATE
{
797 BOOLEAN EffectiveOnly
;
798 SECURITY_IMPERSONATION_LEVEL Level
;
799 } SE_IMPERSONATION_STATE
, *PSE_IMPERSONATION_STATE
;
801 #define OWNER_SECURITY_INFORMATION (0x00000001L)
802 #define GROUP_SECURITY_INFORMATION (0x00000002L)
803 #define DACL_SECURITY_INFORMATION (0x00000004L)
804 #define SACL_SECURITY_INFORMATION (0x00000008L)
805 #define LABEL_SECURITY_INFORMATION (0x00000010L)
807 #define PROTECTED_DACL_SECURITY_INFORMATION (0x80000000L)
808 #define PROTECTED_SACL_SECURITY_INFORMATION (0x40000000L)
809 #define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L)
810 #define UNPROTECTED_SACL_SECURITY_INFORMATION (0x10000000L)
815 // Registry Access Rights
817 #define KEY_QUERY_VALUE (0x0001)
818 #define KEY_SET_VALUE (0x0002)
819 #define KEY_CREATE_SUB_KEY (0x0004)
820 #define KEY_ENUMERATE_SUB_KEYS (0x0008)
821 #define KEY_NOTIFY (0x0010)
822 #define KEY_CREATE_LINK (0x0020)
823 #define KEY_WOW64_32KEY (0x0200)
824 #define KEY_WOW64_64KEY (0x0100)
825 #define KEY_WOW64_RES (0x0300)
827 #define KEY_READ ((STANDARD_RIGHTS_READ |\
829 KEY_ENUMERATE_SUB_KEYS |\
834 #define KEY_WRITE ((STANDARD_RIGHTS_WRITE |\
836 KEY_CREATE_SUB_KEY) \
840 #define KEY_EXECUTE ((KEY_READ) \
844 #define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL |\
847 KEY_CREATE_SUB_KEY |\
848 KEY_ENUMERATE_SUB_KEYS |\
855 // Registry Open/Create Options
857 #define REG_OPTION_RESERVED (0x00000000L)
858 #define REG_OPTION_NON_VOLATILE (0x00000000L)
859 #define REG_OPTION_VOLATILE (0x00000001L)
860 #define REG_OPTION_CREATE_LINK (0x00000002L)
861 #define REG_OPTION_BACKUP_RESTORE (0x00000004L)
862 #define REG_OPTION_OPEN_LINK (0x00000008L)
864 #define REG_LEGAL_OPTION \
865 (REG_OPTION_RESERVED |\
866 REG_OPTION_NON_VOLATILE |\
867 REG_OPTION_VOLATILE |\
868 REG_OPTION_CREATE_LINK |\
869 REG_OPTION_BACKUP_RESTORE |\
870 REG_OPTION_OPEN_LINK)
873 // Key creation/open disposition
875 #define REG_CREATED_NEW_KEY (0x00000001L)
876 #define REG_OPENED_EXISTING_KEY (0x00000002L)
879 // Key restore & hive load flags
881 #define REG_WHOLE_HIVE_VOLATILE (0x00000001L)
882 #define REG_REFRESH_HIVE (0x00000002L)
883 #define REG_NO_LAZY_FLUSH (0x00000004L)
884 #define REG_FORCE_RESTORE (0x00000008L)
885 #define REG_APP_HIVE (0x00000010L)
886 #define REG_PROCESS_PRIVATE (0x00000020L)
887 #define REG_START_JOURNAL (0x00000040L)
888 #define REG_HIVE_EXACT_FILE_GROWTH (0x00000080L)
889 #define REG_HIVE_NO_RM (0x00000100L)
890 #define REG_HIVE_SINGLE_LOG (0x00000200L)
895 #define REG_FORCE_UNLOAD 1
898 // Notify Filter Values
900 #define REG_NOTIFY_CHANGE_NAME (0x00000001L)
901 #define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L)
902 #define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L)
903 #define REG_NOTIFY_CHANGE_SECURITY (0x00000008L)
905 #define REG_LEGAL_CHANGE_FILTER \
906 (REG_NOTIFY_CHANGE_NAME |\
907 REG_NOTIFY_CHANGE_ATTRIBUTES |\
908 REG_NOTIFY_CHANGE_LAST_SET |\
909 REG_NOTIFY_CHANGE_SECURITY)
914 // Thread Access Rights
916 #define THREAD_TERMINATE (0x0001)
917 #define THREAD_SUSPEND_RESUME (0x0002)
918 #define THREAD_ALERT (0x0004)
919 #define THREAD_GET_CONTEXT (0x0008)
920 #define THREAD_SET_CONTEXT (0x0010)
921 #define THREAD_SET_INFORMATION (0x0020)
922 #define THREAD_SET_LIMITED_INFORMATION (0x0400)
923 #define THREAD_QUERY_LIMITED_INFORMATION (0x0800)
924 #if (NTDDI_VERSION >= NTDDI_VISTA)
925 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
928 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
933 // Service Start Types
935 #define SERVICE_BOOT_START 0x00000000
936 #define SERVICE_SYSTEM_START 0x00000001
937 #define SERVICE_AUTO_START 0x00000002
938 #define SERVICE_DEMAND_START 0x00000003
939 #define SERVICE_DISABLED 0x00000004
944 #define EXCEPTION_NONCONTINUABLE 1
945 #define EXCEPTION_MAXIMUM_PARAMETERS 15
947 typedef struct _EXCEPTION_RECORD
{
948 NTSTATUS ExceptionCode
;
949 ULONG ExceptionFlags
;
950 struct _EXCEPTION_RECORD
*ExceptionRecord
;
951 PVOID ExceptionAddress
;
952 ULONG NumberParameters
;
953 ULONG_PTR ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
954 } EXCEPTION_RECORD
, *PEXCEPTION_RECORD
;
956 typedef struct _EXCEPTION_RECORD32
{
957 NTSTATUS ExceptionCode
;
958 ULONG ExceptionFlags
;
959 ULONG ExceptionRecord
;
960 ULONG ExceptionAddress
;
961 ULONG NumberParameters
;
962 ULONG ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
963 } EXCEPTION_RECORD32
, *PEXCEPTION_RECORD32
;
965 typedef struct _EXCEPTION_RECORD64
{
966 NTSTATUS ExceptionCode
;
967 ULONG ExceptionFlags
;
968 ULONG64 ExceptionRecord
;
969 ULONG64 ExceptionAddress
;
970 ULONG NumberParameters
;
971 ULONG __unusedAlignment
;
972 ULONG64 ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
973 } EXCEPTION_RECORD64
, *PEXCEPTION_RECORD64
;
975 typedef struct _EXCEPTION_POINTERS
{
976 PEXCEPTION_RECORD ExceptionRecord
;
977 PCONTEXT ContextRecord
;
978 } EXCEPTION_POINTERS
, *PEXCEPTION_POINTERS
;
985 typedef struct _QUOTA_LIMITS
{
986 SIZE_T PagedPoolLimit
;
987 SIZE_T NonPagedPoolLimit
;
988 SIZE_T MinimumWorkingSetSize
;
989 SIZE_T MaximumWorkingSetSize
;
990 SIZE_T PagefileLimit
;
991 LARGE_INTEGER TimeLimit
;
992 } QUOTA_LIMITS
, *PQUOTA_LIMITS
;
994 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
995 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
996 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
997 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
998 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
1001 /******************************************************************************
1002 * WINBASE Functions *
1003 ******************************************************************************/
1004 #if !defined(_WINBASE_)
1008 #define InterlockedPopEntrySList(Head) \
1009 ExpInterlockedPopEntrySList(Head)
1011 #define InterlockedPushEntrySList(Head, Entry) \
1012 ExpInterlockedPushEntrySList(Head, Entry)
1014 #define InterlockedFlushSList(Head) \
1015 ExpInterlockedFlushSList(Head)
1017 #define QueryDepthSList(Head) \
1018 ExQueryDepthSList(Head)
1020 #else // !defined(_WIN64)
1025 InterlockedPopEntrySList(
1026 IN PSLIST_HEADER ListHead
);
1031 InterlockedPushEntrySList(
1032 IN PSLIST_HEADER ListHead
,
1033 IN PSLIST_ENTRY ListEntry
);
1035 #define InterlockedFlushSList(ListHead) \
1036 ExInterlockedFlushSList(ListHead)
1038 #define QueryDepthSList(Head) \
1039 ExQueryDepthSList(Head)
1041 #endif // !defined(_WIN64)
1043 #endif // !defined(_WINBASE_)
1046 /******************************************************************************
1048 ******************************************************************************/
1050 typedef struct _DISPATCHER_HEADER
1070 BOOLEAN DebugActive
;
1076 LIST_ENTRY WaitListHead
;
1077 } DISPATCHER_HEADER
, *PDISPATCHER_HEADER
;
1079 typedef ULONG_PTR KSPIN_LOCK
, *PKSPIN_LOCK
;
1081 typedef struct _KEVENT
{
1082 DISPATCHER_HEADER Header
;
1083 } KEVENT
, *PKEVENT
, *RESTRICTED_POINTER PRKEVENT
;
1085 typedef struct _KSEMAPHORE
{
1086 DISPATCHER_HEADER Header
;
1088 } KSEMAPHORE
, *PKSEMAPHORE
, *RESTRICTED_POINTER PRKSEMAPHORE
;
1090 /******************************************************************************
1092 ******************************************************************************/
1094 #define RTL_REGISTRY_ABSOLUTE 0
1095 #define RTL_REGISTRY_SERVICES 1
1096 #define RTL_REGISTRY_CONTROL 2
1097 #define RTL_REGISTRY_WINDOWS_NT 3
1098 #define RTL_REGISTRY_DEVICEMAP 4
1099 #define RTL_REGISTRY_USER 5
1100 #define RTL_REGISTRY_MAXIMUM 6
1101 #define RTL_REGISTRY_HANDLE 0x40000000
1102 #define RTL_REGISTRY_OPTIONAL 0x80000000
1104 /* RTL_QUERY_REGISTRY_TABLE.Flags */
1105 #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001
1106 #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002
1107 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004
1108 #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008
1109 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010
1110 #define RTL_QUERY_REGISTRY_DIRECT 0x00000020
1111 #define RTL_QUERY_REGISTRY_DELETE 0x00000040
1113 typedef struct _RTL_BITMAP
{
1116 } RTL_BITMAP
, *PRTL_BITMAP
;
1118 typedef struct _RTL_BITMAP_RUN
{
1119 ULONG StartingIndex
;
1121 } RTL_BITMAP_RUN
, *PRTL_BITMAP_RUN
;
1124 (DDKAPI
*PRTL_QUERY_REGISTRY_ROUTINE
)(
1128 IN ULONG ValueLength
,
1130 IN PVOID EntryContext
);
1132 typedef struct _RTL_QUERY_REGISTRY_TABLE
{
1133 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine
;
1139 ULONG DefaultLength
;
1140 } RTL_QUERY_REGISTRY_TABLE
, *PRTL_QUERY_REGISTRY_TABLE
;
1142 typedef struct _TIME_FIELDS
{
1149 CSHORT Milliseconds
;
1151 } TIME_FIELDS
, *PTIME_FIELDS
;
1154 /******************************************************************************
1156 ******************************************************************************/
1162 IN PVOID FailedAssertion
,
1164 IN ULONG LineNumber
,
1169 * IN VOID UNALIGNED *Destination,
1170 * IN CONST VOID UNALIGNED *Source,
1173 #define RtlCopyMemory(Destination, Source, Length) \
1174 memcpy(Destination, Source, Length)
1176 #define RtlCopyBytes RtlCopyMemory
1178 #if defined(_M_AMD64)
1182 RtlCopyMemoryNonTemporal(
1183 VOID UNALIGNED
*Destination
,
1184 CONST VOID UNALIGNED
*Source
,
1187 #define RtlCopyMemoryNonTemporal RtlCopyMemory
1195 #define RtlEqualLuid(Luid1, Luid2) \
1196 (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
1200 * IN VOID UNALIGNED *Destination,
1201 * IN CONST VOID UNALIGNED *Source,
1204 #define RtlEqualMemory(Destination, Source, Length) \
1205 (!memcmp(Destination, Source, Length))
1209 * IN VOID UNALIGNED *Destination,
1213 #define RtlFillMemory(Destination, Length, Fill) \
1214 memset(Destination, Fill, Length)
1216 #define RtlFillBytes RtlFillMemory
1221 RtlFreeUnicodeString(
1222 IN PUNICODE_STRING UnicodeString
);
1228 IN PUNICODE_STRING GuidString
,
1234 RtlInitUnicodeString(
1235 IN OUT PUNICODE_STRING DestinationString
,
1236 IN PCWSTR SourceString
);
1240 * IN VOID UNALIGNED *Destination,
1241 * IN CONST VOID UNALIGNED *Source,
1244 #define RtlMoveMemory(Destination, Source, Length) \
1245 memmove(Destination, Source, Length)
1252 OUT PUNICODE_STRING GuidString
);
1256 * IN VOID UNALIGNED *Destination,
1259 #define RtlZeroMemory(Destination, Length) \
1260 memset(Destination, 0, Length)
1262 #define RtlZeroBytes RtlZeroMemory
1265 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1270 IN PRTL_BITMAP BitMapHeader
,
1271 IN ULONG StartingIndex
,
1278 IN PRTL_BITMAP BitMapHeader
,
1279 IN ULONG StartingIndex
,
1285 RtlAnsiStringToUnicodeString(
1286 IN OUT PUNICODE_STRING DestinationString
,
1287 IN PANSI_STRING SourceString
,
1288 IN BOOLEAN AllocateDestinationString
);
1293 RtlxAnsiStringToUnicodeSize(
1294 IN PCANSI_STRING AnsiString
);
1296 #define RtlAnsiStringToUnicodeSize(String) ( \
1297 NLS_MB_CODE_PAGE_TAG ? \
1298 RtlxAnsiStringToUnicodeSize(String) : \
1299 ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
1305 RtlAppendUnicodeStringToString(
1306 IN OUT PUNICODE_STRING Destination
,
1307 IN PCUNICODE_STRING Source
);
1312 RtlAppendUnicodeToString(
1313 IN OUT PUNICODE_STRING Destination
,
1319 RtlCheckRegistryKey(
1320 IN ULONG RelativeTo
,
1327 IN PRTL_BITMAP BitMapHeader
);
1333 IN PRTL_BITMAP BitMapHeader
,
1334 IN ULONG StartingIndex
,
1335 IN ULONG NumberToClear
);
1341 IN CONST VOID
*Source1
,
1342 IN CONST VOID
*Source2
,
1348 RtlCompareUnicodeString(
1349 IN PCUNICODE_STRING String1
,
1350 IN PCUNICODE_STRING String2
,
1351 IN BOOLEAN CaseInSensitive
);
1356 RtlCompareUnicodeStrings(
1358 IN SIZE_T String1Length
,
1360 IN SIZE_T String2Length
,
1361 IN BOOLEAN CaseInSensitive
);
1366 RtlCopyUnicodeString(
1367 IN OUT PUNICODE_STRING DestinationString
,
1368 IN PCUNICODE_STRING SourceString
);
1373 RtlCreateRegistryKey(
1374 IN ULONG RelativeTo
,
1380 RtlCreateSecurityDescriptor(
1381 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
1387 RtlDeleteRegistryValue(
1388 IN ULONG RelativeTo
,
1390 IN PCWSTR ValueName
);
1395 RtlEqualUnicodeString(
1396 IN CONST UNICODE_STRING
*String1
,
1397 IN CONST UNICODE_STRING
*String2
,
1398 IN BOOLEAN CaseInSensitive
);
1400 #if !defined(_AMD64_) && !defined(_IA64_)
1404 RtlExtendedIntegerMultiply(
1405 IN LARGE_INTEGER Multiplicand
,
1406 IN LONG Multiplier
);
1411 RtlExtendedLargeIntegerDivide(
1412 IN LARGE_INTEGER Dividend
,
1414 IN OUT PULONG Remainder
);
1417 #if defined(_X86_) || defined(_IA64_)
1421 RtlExtendedMagicDivide(
1422 IN LARGE_INTEGER Dividend
,
1423 IN LARGE_INTEGER MagicDivisor
,
1424 IN CCHAR ShiftCount
);
1431 IN PANSI_STRING AnsiString
);
1437 IN PRTL_BITMAP BitMapHeader
,
1438 IN ULONG NumberToFind
,
1439 IN ULONG HintIndex
);
1444 RtlFindClearBitsAndSet(
1445 IN PRTL_BITMAP BitMapHeader
,
1446 IN ULONG NumberToFind
,
1447 IN ULONG HintIndex
);
1452 RtlFindFirstRunClear(
1453 IN PRTL_BITMAP BitMapHeader
,
1454 OUT PULONG StartingIndex
);
1460 IN PRTL_BITMAP BitMapHeader
,
1461 OUT PRTL_BITMAP_RUN RunArray
,
1462 IN ULONG SizeOfRunArray
,
1463 IN BOOLEAN LocateLongestRuns
);
1468 RtlFindLastBackwardRunClear(
1469 IN PRTL_BITMAP BitMapHeader
,
1471 OUT PULONG StartingRunIndex
);
1476 RtlFindLeastSignificantBit(
1482 RtlFindLongestRunClear(
1483 IN PRTL_BITMAP BitMapHeader
,
1484 OUT PULONG StartingIndex
);
1489 RtlFindMostSignificantBit(
1495 RtlFindNextForwardRunClear(
1496 IN PRTL_BITMAP BitMapHeader
,
1498 OUT PULONG StartingRunIndex
);
1504 IN PRTL_BITMAP BitMapHeader
,
1505 IN ULONG NumberToFind
,
1506 IN ULONG HintIndex
);
1511 RtlFindSetBitsAndClear(
1512 IN PRTL_BITMAP BitMapHeader
,
1513 IN ULONG NumberToFind
,
1514 IN ULONG HintIndex
);
1519 RtlHashUnicodeString(
1520 IN CONST UNICODE_STRING
*String
,
1521 IN BOOLEAN CaseInSensitive
,
1522 IN ULONG HashAlgorithm
,
1523 OUT PULONG HashValue
);
1529 IN OUT PANSI_STRING DestinationString
,
1530 IN PCSZ SourceString
);
1535 RtlInitializeBitMap(
1536 IN PRTL_BITMAP BitMapHeader
,
1537 IN PULONG BitMapBuffer
,
1538 IN ULONG SizeOfBitMap
);
1544 IN OUT PSTRING DestinationString
,
1545 IN PCSZ SourceString
);
1550 RtlIntegerToUnicodeString(
1552 IN ULONG Base OPTIONAL
,
1553 IN OUT PUNICODE_STRING String
);
1558 RtlInt64ToUnicodeString(
1560 IN ULONG Base OPTIONAL
,
1561 IN OUT PUNICODE_STRING String
);
1564 #define RtlIntPtrToUnicodeString(Value, Base, String) \
1565 RtlInt64ToUnicodeString(Value, Base, String)
1567 #define RtlIntPtrToUnicodeString(Value, Base, String) \
1568 RtlIntegerToUnicodeString(Value, Base, String)
1575 #define RtlIsZeroLuid(_L1) \
1576 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
1581 RtlLengthSecurityDescriptor(
1582 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
1587 RtlNumberOfClearBits(
1588 IN PRTL_BITMAP BitMapHeader
);
1594 IN PRTL_BITMAP BitMapHeader
);
1599 RtlQueryRegistryValues(
1600 IN ULONG RelativeTo
,
1602 IN PRTL_QUERY_REGISTRY_TABLE QueryTable
,
1604 IN PVOID Environment OPTIONAL
);
1606 #define LONG_SIZE (sizeof(LONG))
1607 #define LONG_MASK (LONG_SIZE - 1)
1611 * PULONG DestinationAddress,
1612 * PULONG SourceAddress);
1614 #if defined(_AMD64_)
1615 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
1616 *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
1618 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
1619 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
1621 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
1622 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
1623 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
1624 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
1628 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
1633 * RtlRetrieveUshort(
1634 * PUSHORT DestinationAddress,
1635 * PUSHORT SourceAddress);
1637 #if defined(_AMD64_)
1638 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
1639 *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
1641 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
1642 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
1644 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
1645 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
1649 *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
1657 IN PRTL_BITMAP BitMapHeader
);
1663 IN PRTL_BITMAP BitMapHeader
,
1664 IN ULONG StartingIndex
,
1665 IN ULONG NumberToSet
);
1670 RtlSetDaclSecurityDescriptor(
1671 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
1672 IN BOOLEAN DaclPresent
,
1673 IN PACL Dacl OPTIONAL
,
1674 IN BOOLEAN DaclDefaulted OPTIONAL
);
1678 * IN PULONG Address,
1681 #if defined(_AMD64_)
1682 #define RtlStoreUlong(Address,Value) \
1683 *(ULONG UNALIGNED *)(Address) = (Value)
1685 #define RtlStoreUlong(Address,Value) \
1686 if ((ULONG_PTR)(Address) & LONG_MASK) { \
1687 ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
1688 ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
1689 ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
1690 ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT] = (UCHAR)(FOURTHBYTE(Value)); \
1693 *((PULONG)(Address)) = (ULONG) (Value); \
1698 * RtlStoreUlonglong(
1699 * IN OUT PULONGLONG Address,
1702 #if defined(_AMD64_)
1703 #define RtlStoreUlonglong(Address,Value) \
1704 *(ULONGLONG UNALIGNED *)(Address) = (Value)
1706 #define RtlStoreUlonglong(Address,Value) \
1707 if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
1708 RtlStoreUlong((ULONG_PTR)(Address), \
1709 (ULONGLONG)(Value) & 0xFFFFFFFF); \
1710 RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
1711 (ULONGLONG)(Value) >> 32); \
1713 *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
1719 * IN OUT PULONG_PTR Address,
1720 * IN ULONG_PTR Value);
1723 #define RtlStoreUlongPtr(Address,Value) \
1724 RtlStoreUlonglong(Address,Value)
1726 #define RtlStoreUlongPtr(Address,Value) \
1727 RtlStoreUlong(Address,Value)
1732 * IN PUSHORT Address,
1735 #if defined(_AMD64_)
1736 #define RtlStoreUshort(Address,Value) \
1737 *(USHORT UNALIGNED *)(Address) = (Value)
1739 #define RtlStoreUshort(Address,Value) \
1740 if ((ULONG_PTR)(Address) & SHORT_MASK) { \
1741 ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
1742 ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
1745 *((PUSHORT) (Address)) = (USHORT)Value; \
1752 RtlTimeFieldsToTime(
1753 IN PTIME_FIELDS TimeFields
,
1754 IN PLARGE_INTEGER Time
);
1759 RtlTimeToTimeFields(
1760 IN PLARGE_INTEGER Time
,
1761 IN PTIME_FIELDS TimeFields
);
1772 RtlUlonglongByteSwap(
1773 IN ULONGLONG Source
);
1778 RtlUnicodeStringToAnsiString(
1779 IN OUT PANSI_STRING DestinationString
,
1780 IN PCUNICODE_STRING SourceString
,
1781 IN BOOLEAN AllocateDestinationString
);
1786 RtlxUnicodeStringToAnsiSize(
1787 IN PCUNICODE_STRING UnicodeString
);
1789 #define RtlUnicodeStringToAnsiSize(String) ( \
1790 NLS_MB_CODE_PAGE_TAG ? \
1791 RtlxUnicodeStringToAnsiSize(String) : \
1792 ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
1798 RtlUnicodeStringToInteger(
1799 IN PCUNICODE_STRING String
,
1800 IN ULONG Base OPTIONAL
,
1806 RtlUpcaseUnicodeChar(
1807 IN WCHAR SourceCharacter
);
1818 RtlValidRelativeSecurityDescriptor(
1819 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput
,
1820 IN ULONG SecurityDescriptorLength
,
1821 IN SECURITY_INFORMATION RequiredInformation
);
1826 RtlValidSecurityDescriptor(
1827 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
1832 RtlWriteRegistryValue(
1833 IN ULONG RelativeTo
,
1835 IN PCWSTR ValueName
,
1838 IN ULONG ValueLength
);
1840 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
1842 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
1846 RtlPrefetchMemoryNonTemporal(
1851 #if (NTDDI_VERSION >= NTDDI_WINXP)
1856 PRTL_BITMAP BitMapHeader
,
1862 RtlDowncaseUnicodeChar(
1863 IN WCHAR SourceCharacter
);
1869 PRTL_BITMAP BitMapHeader
,
1876 IN PRTL_BITMAP BitMapHeader
,
1877 IN ULONG BitNumber
);
1879 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
1881 #if (NTDDI_VERSION >= NTDDI_VISTA)
1885 RtlNumberOfSetBitsUlongPtr(
1886 IN ULONG_PTR Target
);
1891 RtlIoDecodeMemIoResource (
1892 IN PIO_RESOURCE_DESCRIPTOR Descriptor
,
1893 OUT PULONGLONG Alignment OPTIONAL
,
1894 OUT PULONGLONG MinimumAddress OPTIONAL
,
1895 OUT PULONGLONG MaximumAddress OPTIONAL
);
1900 RtlIoEncodeMemIoResource(
1901 IN PIO_RESOURCE_DESCRIPTOR Descriptor
,
1903 IN ULONGLONG Length
,
1904 IN ULONGLONG Alignment
,
1905 IN ULONGLONG MinimumAddress
,
1906 IN ULONGLONG MaximumAddress
);
1911 RtlCmDecodeMemIoResource(
1912 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor
,
1913 OUT PULONGLONG Start OPTIONAL
);
1918 RtlFindClosestEncodableLength(
1919 IN ULONGLONG SourceLength
,
1920 OUT PULONGLONG TargetLength
);
1924 #if !defined(MIDL_PASS)
1925 /* inline funftions */
1926 //DECLSPEC_DEPRECATED_DDK_WINXP
1930 RtlConvertLongToLargeInteger(LONG SignedInteger
)
1933 ret
.QuadPart
= SignedInteger
;
1937 //DECLSPEC_DEPRECATED_DDK_WINXP
1941 RtlConvertUlongToLargeInteger(
1942 ULONG UnsignedInteger
)
1945 ret
.QuadPart
= UnsignedInteger
;
1949 //DECLSPEC_DEPRECATED_DDK
1953 RtlEnlargedUnsignedDivide(
1954 IN ULARGE_INTEGER Dividend
,
1956 IN OUT PULONG Remainder
)
1959 *Remainder
= Dividend
.QuadPart
% Divisor
;
1960 return Dividend
.QuadPart
/ Divisor
;
1963 //DECLSPEC_DEPRECATED_DDK
1967 RtlEnlargedUnsignedMultiply(
1968 IN ULONG Multiplicand
,
1969 IN ULONG Multiplier
)
1972 ret
.QuadPart
= (ULONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
1976 //DECLSPEC_DEPRECATED_DDK
1980 RtlEnlargedIntegerMultiply(
1981 IN LONG Multiplicand
,
1985 ret
.QuadPart
= (LONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
1991 RtlInitEmptyAnsiString(OUT PANSI_STRING AnsiString
,
1993 IN USHORT BufferSize
)
1995 AnsiString
->Length
= 0;
1996 AnsiString
->MaximumLength
= BufferSize
;
1997 AnsiString
->Buffer
= Buffer
;
2002 RtlInitEmptyUnicodeString(
2003 OUT PUNICODE_STRING UnicodeString
,
2005 IN USHORT BufferSize
)
2007 UnicodeString
->Length
= 0;
2008 UnicodeString
->MaximumLength
= BufferSize
;
2009 UnicodeString
->Buffer
= Buffer
;
2012 #if defined(_AMD64_) || defined(_IA64_)
2016 RtlExtendedIntegerMultiply(
2017 LARGE_INTEGER Multiplicand
,
2021 ret
.QuadPart
= Multiplicand
.QuadPart
* Multiplier
;
2028 RtlExtendedLargeIntegerDivide(
2029 LARGE_INTEGER Dividend
,
2034 ret
.QuadPart
= (ULONG64
)Dividend
.QuadPart
/ Divisor
;
2036 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
2041 #if defined(_AMD64_)
2043 #define MultiplyHigh __mulh
2044 #define UnsignedMultiplyHigh __umulh
2046 //DECLSPEC_DEPRECATED_DDK
2050 RtlExtendedMagicDivide(
2051 IN LARGE_INTEGER Dividend
,
2052 IN LARGE_INTEGER MagicDivisor
,
2053 IN CCHAR ShiftCount
)
2058 Pos
= (Dividend
.QuadPart
>= 0);
2059 ret64
= UnsignedMultiplyHigh(Pos
? Dividend
.QuadPart
: -Dividend
.QuadPart
,
2060 MagicDivisor
.QuadPart
);
2061 ret64
>>= ShiftCount
;
2062 ret
.QuadPart
= Pos
? ret64
: -ret64
;
2067 //DECLSPEC_DEPRECATED_DDK
2072 IN LARGE_INTEGER Addend1
,
2073 IN LARGE_INTEGER Addend2
)
2076 ret
.QuadPart
= Addend1
.QuadPart
+ Addend2
.QuadPart
;
2081 * RtlLargeIntegerAnd(
2082 * IN OUT LARGE_INTEGER Result,
2083 * IN LARGE_INTEGER Source,
2084 * IN LARGE_INTEGER Mask);
2086 #define RtlLargeIntegerAnd(Result, Source, Mask) \
2087 Result.QuadPart = Source.QuadPart & Mask.QuadPart
2089 //DECLSPEC_DEPRECATED_DDK
2093 RtlLargeIntegerArithmeticShift(
2094 IN LARGE_INTEGER LargeInteger
,
2095 IN CCHAR ShiftCount
)
2098 ret
.QuadPart
= LargeInteger
.QuadPart
>> ShiftCount
;
2103 * RtlLargeIntegerEqualTo(
2104 * IN LARGE_INTEGER Operand1,
2105 * IN LARGE_INTEGER Operand2);
2107 #define RtlLargeIntegerEqualTo(X,Y) \
2108 (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
2112 RtlSecureZeroMemory(
2116 volatile char* vptr
= (volatile char*)Pointer
;
2117 #if defined(_M_AMD64)
2118 __stosb((PUCHAR
)vptr
, 0, Size
);
2120 char * endptr
= (char *)vptr
+ Size
;
2121 while (vptr
< endptr
)
2129 #if defined(_M_AMD64)
2133 IN PRTL_BITMAP BitMapHeader
,
2134 IN ULONG BitPosition
)
2136 return BitTest((LONG CONST
*)BitMapHeader
->Buffer
, BitPosition
);
2139 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
2140 #endif // defined(_M_AMD64)
2142 #endif // !defined(MIDL_PASS)
2145 // Byte Swap Functions
2147 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \
2148 ((defined(_M_AMD64) || defined(_M_IA64)) \
2149 && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))
2151 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
2152 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
2153 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
2157 /******************************************************************************
2158 * Memory manager Types *
2159 ******************************************************************************/
2161 typedef struct _MDL
{
2165 struct _EPROCESS
*Process
;
2166 PVOID MappedSystemVa
;
2173 /******************************************************************************
2174 * Memory manager Functions *
2175 ******************************************************************************/
2177 /* PVOID MmGetSystemAddressForMdl(
2180 #define MmGetSystemAddressForMdl(Mdl) \
2181 (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
2182 MDL_SOURCE_IS_NONPAGED_POOL)) ? \
2183 ((Mdl)->MappedSystemVa) : \
2184 (MmMapLockedPages((Mdl), KernelMode)))
2187 * MmGetSystemAddressForMdlSafe(
2189 * IN MM_PAGE_PRIORITY Priority)
2191 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
2192 (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
2193 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
2194 (_Mdl)->MappedSystemVa : \
2195 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
2196 KernelMode, MmCached, NULL, FALSE, (_Priority)))
2198 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2203 IN PMDL MemoryDescriptorList OPTIONAL
,
2210 /******************************************************************************
2211 * I/O Manager Functions *
2212 ******************************************************************************/
2214 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
2215 (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
2217 #define DMA_MACROS_DEFINED
2221 IoAllocateAdapterChannel(
2222 IN PADAPTER_OBJECT AdapterObject
,
2223 IN PDEVICE_OBJECT DeviceObject
,
2224 IN ULONG NumberOfMapRegisters
,
2225 IN PDRIVER_CONTROL ExecutionRoutine
,
2228 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel
;
2229 AllocateAdapterChannel
=
2230 *(DmaAdapter
)->DmaOperations
->AllocateAdapterChannel
;
2231 ASSERT(AllocateAdapterChannel
);
2232 return AllocateAdapterChannel(DmaAdapter
,
2234 NumberOfMapRegisters
,
2241 IoFlushAdapterBuffers(
2242 IN PADAPTER_OBJECT AdapterObject
,
2244 IN PVOID MapRegisterBase
,
2247 IN BOOLEAN WriteToDevice
)
2249 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers
;
2250 FlushAdapterBuffers
= *(DmaAdapter
)->DmaOperations
->FlushAdapterBuffers
;
2251 ASSERT(FlushAdapterBuffers
);
2252 return FlushAdapterBuffers(DmaAdapter
,
2262 IoFreeAdapterChannel(
2263 IN PADAPTER_OBJECT AdapterObject
)
2265 PFREE_ADAPTER_CHANNEL FreeAdapterChannel
;
2266 FreeAdapterChannel
= *(DmaAdapter
)->DmaOperations
->FreeAdapterChannel
;
2267 ASSERT(FreeAdapterChannel
);
2268 FreeAdapterChannel(DmaAdapter
);
2274 IN PADAPTER_OBJECT AdapterObject
,
2275 IN PVOID MapRegisterBase
,
2276 IN ULONG NumberOfMapRegisters
)
2278 PFREE_MAP_REGISTERS FreeMapRegisters
;
2279 FreeMapRegisters
= *(DmaAdapter
)->DmaOperations
->FreeMapRegisters
;
2280 ASSERT(FreeMapRegisters
);
2281 FreeMapRegisters(DmaAdapter
, MapRegisterBase
, NumberOfMapRegisters
);
2287 IN PDMA_ADAPTER DmaAdapter
,
2289 IN PVOID MapRegisterBase
,
2291 IN OUT PULONG Length
,
2292 IN BOOLEAN WriteToDevice
)
2294 PMAP_TRANSFER MapTransfer
;
2296 MapTransfer
= *(DmaAdapter
)->DmaOperations
->MapTransfer
;
2297 ASSERT(MapTransfer
);
2298 return MapTransfer(DmaAdapter
,
2308 /******************************************************************************
2310 ******************************************************************************/
2312 typedef enum _POOL_TYPE
{
2315 NonPagedPoolMustSucceed
,
2317 NonPagedPoolCacheAligned
,
2318 PagedPoolCacheAligned
,
2319 NonPagedPoolCacheAlignedMustS
,
2321 NonPagedPoolSession
= 32,
2323 NonPagedPoolMustSucceedSession
,
2324 DontUseThisTypeSession
,
2325 NonPagedPoolCacheAlignedSession
,
2326 PagedPoolCacheAlignedSession
,
2327 NonPagedPoolCacheAlignedMustSSession
2330 typedef enum _SUITE_TYPE
{
2334 CommunicationServer
,
2336 SmallBusinessRestricted
,
2345 typedef enum _EX_POOL_PRIORITY
{
2347 LowPoolPrioritySpecialPoolOverrun
= 8,
2348 LowPoolPrioritySpecialPoolUnderrun
= 9,
2349 NormalPoolPriority
= 16,
2350 NormalPoolPrioritySpecialPoolOverrun
= 24,
2351 NormalPoolPrioritySpecialPoolUnderrun
= 25,
2352 HighPoolPriority
= 32,
2353 HighPoolPrioritySpecialPoolOverrun
= 40,
2354 HighPoolPrioritySpecialPoolUnderrun
= 41
2357 typedef struct _FAST_MUTEX
2364 } FAST_MUTEX
, *PFAST_MUTEX
;
2366 typedef ULONG_PTR ERESOURCE_THREAD
, *PERESOURCE_THREAD
;
2368 typedef struct _OWNER_ENTRY
{
2369 ERESOURCE_THREAD OwnerThread
;
2370 _ANONYMOUS_UNION
union {
2374 } OWNER_ENTRY
, *POWNER_ENTRY
;
2376 typedef struct _ERESOURCE
2378 LIST_ENTRY SystemResourcesList
;
2379 POWNER_ENTRY OwnerTable
;
2382 volatile PKSEMAPHORE SharedWaiters
;
2383 volatile PKEVENT ExclusiveWaiters
;
2384 OWNER_ENTRY OwnerEntry
;
2385 ULONG ActiveEntries
;
2386 ULONG ContentionCount
;
2387 ULONG NumberOfSharedWaiters
;
2388 ULONG NumberOfExclusiveWaiters
;
2392 ULONG_PTR CreatorBackTraceIndex
;
2394 KSPIN_LOCK SpinLock
;
2395 } ERESOURCE
, *PERESOURCE
;
2397 #if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
2398 #define LOOKASIDE_ALIGN
2400 #define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */
2403 typedef struct _LOOKASIDE_LIST_EX
*PLOOKASIDE_LIST_EX
;
2406 (DDKAPI
*PALLOCATE_FUNCTION
)(
2407 IN POOL_TYPE PoolType
,
2408 IN SIZE_T NumberOfBytes
,
2412 (DDKAPI
*PALLOCATE_FUNCTION_EX
)(
2413 IN POOL_TYPE PoolType
,
2414 IN SIZE_T NumberOfBytes
,
2416 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
2419 (DDKAPI
*PFREE_FUNCTION
)(
2423 (DDKAPI
*PFREE_FUNCTION_EX
)(
2425 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
2428 (DDKAPI
*PCALLBACK_FUNCTION
)(
2429 IN PVOID CallbackContext
,
2431 IN PVOID Argument2
);
2433 typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE
{
2435 SLIST_HEADER ListHead
;
2436 SINGLE_LIST_ENTRY SingleListHead
;
2439 USHORT MaximumDepth
;
2440 ULONG TotalAllocates
;
2442 ULONG AllocateMisses
;
2454 PALLOCATE_FUNCTION_EX AllocateEx
;
2455 PALLOCATE_FUNCTION Allocate
;
2458 PFREE_FUNCTION_EX FreeEx
;
2459 PFREE_FUNCTION Free
;
2461 LIST_ENTRY ListEntry
;
2462 ULONG LastTotalAllocates
;
2464 ULONG LastAllocateMisses
;
2465 ULONG LastAllocateHits
;
2468 } GENERAL_LOOKASIDE
, *PGENERAL_LOOKASIDE
;
2470 typedef struct _PAGED_LOOKASIDE_LIST
{
2471 GENERAL_LOOKASIDE L
;
2472 #if !defined(_AMD64_) && !defined(_IA64_)
2473 FAST_MUTEX Lock__ObsoleteButDoNotDelete
;
2475 } PAGED_LOOKASIDE_LIST
, *PPAGED_LOOKASIDE_LIST
;
2477 typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST
{
2478 GENERAL_LOOKASIDE L
;
2479 #if !defined(_AMD64_) && !defined(_IA64_)
2480 KSPIN_LOCK Lock__ObsoleteButDoNotDelete
;
2482 } NPAGED_LOOKASIDE_LIST
, *PNPAGED_LOOKASIDE_LIST
;
2484 //typedef struct _LOOKASIDE_LIST_EX {
2485 // GENERAL_LOOKASIDE_POOL L;
2486 //} LOOKASIDE_LIST_EX, *PLOOKASIDE_LIST_EX;
2488 typedef struct _EX_RUNDOWN_REF
{
2490 volatile ULONG_PTR Count
;
2493 } EX_RUNDOWN_REF
, *PEX_RUNDOWN_REF
;
2495 typedef struct _EX_RUNDOWN_REF_CACHE_AWARE
*PEX_RUNDOWN_REF_CACHE_AWARE
;
2497 typedef enum _WORK_QUEUE_TYPE
{
2500 HyperCriticalWorkQueue
,
2505 (DDKAPI
*PWORKER_THREAD_ROUTINE
)(
2506 IN PVOID Parameter
);
2508 typedef struct _WORK_QUEUE_ITEM
{
2510 PWORKER_THREAD_ROUTINE WorkerRoutine
;
2511 volatile PVOID Parameter
;
2512 } WORK_QUEUE_ITEM
, *PWORK_QUEUE_ITEM
;
2515 /******************************************************************************
2516 * Executive Functions *
2517 ******************************************************************************/
2520 #if defined(_NTHAL_)
2521 #define ExAcquireFastMutex ExiAcquireFastMutex
2522 #define ExReleaseFastMutex ExiReleaseFastMutex
2523 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
2525 #define ExInterlockedAddUlong ExfInterlockedAddUlong
2526 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
2527 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
2528 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
2529 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
2530 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
2535 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
2536 defined(_NTHAL_) || defined(_NTOSP_)
2539 ExQueryDepthSList(IN PSLIST_HEADER ListHead
);
2543 ExQueryDepthSList(IN PSLIST_HEADER ListHead
)
2545 return (USHORT
)(ListHead
->Alignment
& 0xffff);
2551 ExpInterlockedFlushSList(
2552 PSLIST_HEADER ListHead
);
2556 ExpInterlockedPopEntrySList(
2557 PSLIST_HEADER ListHead
);
2561 ExpInterlockedPushEntrySList(
2562 PSLIST_HEADER ListHead
,
2563 PSLIST_ENTRY ListEntry
);
2565 #define ExInterlockedFlushSList(Head) \
2566 ExpInterlockedFlushSList(Head)
2567 #define ExInterlockedPopEntrySList(Head, Lock) \
2568 ExpInterlockedPopEntrySList(Head)
2569 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
2570 ExpInterlockedPushEntrySList(Head, Entry)
2572 #else // !defined(_WIN64)
2574 #define ExQueryDepthSList(listhead) (listhead)->Depth
2579 ExInterlockedFlushSList(
2580 IN PSLIST_HEADER ListHead
);
2582 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
2586 ExInterlockedPopEntrySList(
2587 IN PSLIST_HEADER ListHead
,
2588 IN PKSPIN_LOCK Lock
);
2593 ExInterlockedPushEntrySList(
2594 IN PSLIST_HEADER ListHead
,
2595 IN PSINGLE_LIST_ENTRY ListEntry
,
2596 IN PKSPIN_LOCK Lock
);
2598 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
2599 InterlockedPopEntrySList(_ListHead)
2600 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
2601 InterlockedPushEntrySList(_ListHead, _ListEntry)
2602 #endif // _WIN2K_COMPAT_SLIST_USAGE
2604 #endif // !defined(_WIN64)
2607 * ExGetCurrentResourceThread(
2610 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread())
2612 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
2615 * ExInitializeWorkItem(
2616 * IN PWORK_QUEUE_ITEM Item,
2617 * IN PWORKER_THREAD_ROUTINE Routine,
2620 #define ExInitializeWorkItem(Item, Routine, Context) \
2622 (Item)->WorkerRoutine = Routine; \
2623 (Item)->Parameter = Context; \
2624 (Item)->List.Flink = NULL; \
2627 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2633 IN OUT PFAST_MUTEX FastMutex
);
2639 IN OUT PFAST_MUTEX FastMutex
);
2644 ExTryToAcquireFastMutex(
2645 IN OUT PFAST_MUTEX FastMutex
);
2650 ExAcquireFastMutexUnsafe(
2651 IN OUT PFAST_MUTEX FastMutex
);
2656 ExReleaseFastMutexUnsafe(
2657 IN OUT PFAST_MUTEX FastMutex
);
2662 ExAcquireResourceExclusiveLite(
2663 IN PERESOURCE Resource
,
2669 ExAcquireResourceSharedLite(
2670 IN PERESOURCE Resource
,
2676 ExAcquireSharedStarveExclusive(
2677 IN PERESOURCE Resource
,
2683 ExAcquireSharedWaitForExclusive(
2684 IN PERESOURCE Resource
,
2691 IN POOL_TYPE PoolType
,
2692 IN SIZE_T NumberOfBytes
);
2695 #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
2696 #endif /* POOL_TAGGING */
2701 ExAllocatePoolWithQuota(
2702 IN POOL_TYPE PoolType
,
2703 IN SIZE_T NumberOfBytes
);
2706 #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
2707 #endif /* POOL_TAGGING */
2712 ExAllocatePoolWithQuotaTag(
2713 IN POOL_TYPE PoolType
,
2714 IN SIZE_T NumberOfBytes
,
2717 #ifndef POOL_TAGGING
2718 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
2719 #endif /* POOL_TAGGING */
2724 ExAllocatePoolWithTag(
2725 IN POOL_TYPE PoolType
,
2726 IN SIZE_T NumberOfBytes
,
2732 ExAllocatePoolWithTagPriority(
2733 IN POOL_TYPE PoolType
,
2734 IN SIZE_T NumberOfBytes
,
2736 IN EX_POOL_PRIORITY Priority
);
2741 ExConvertExclusiveToSharedLite(
2742 IN PERESOURCE Resource
);
2748 OUT PCALLBACK_OBJECT
*CallbackObject
,
2749 IN POBJECT_ATTRIBUTES ObjectAttributes
,
2751 IN BOOLEAN AllowMultipleCallbacks
);
2756 ExDeleteNPagedLookasideList(
2757 IN PNPAGED_LOOKASIDE_LIST Lookaside
);
2762 ExDeletePagedLookasideList(
2763 IN PPAGED_LOOKASIDE_LIST Lookaside
);
2768 ExDeleteResourceLite(
2769 IN PERESOURCE Resource
);
2778 #define ExFreePool(P) ExFreePoolWithTag(P, 0)
2791 ExGetExclusiveWaiterCount(
2792 IN PERESOURCE Resource
);
2803 ExGetSharedWaiterCount(
2804 IN PERESOURCE Resource
);
2809 ExInitializeNPagedLookasideList(
2810 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
2811 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
2812 IN PFREE_FUNCTION Free OPTIONAL
,
2821 ExInitializePagedLookasideList(
2822 IN PPAGED_LOOKASIDE_LIST Lookaside
,
2823 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
2824 IN PFREE_FUNCTION Free OPTIONAL
,
2833 ExInitializeResourceLite(
2834 IN PERESOURCE Resource
);
2839 ExInterlockedAddLargeInteger(
2840 IN PLARGE_INTEGER Addend
,
2841 IN LARGE_INTEGER Increment
,
2842 IN PKSPIN_LOCK Lock
);
2845 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
2846 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
2848 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
2849 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
2855 ExInterlockedAddUlong(
2860 #if defined(_AMD64_) || defined(_IA64_)
2861 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
2862 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
2863 #elif defined(_X86_)
2867 ExfInterlockedCompareExchange64(
2868 IN OUT LONGLONG
volatile *Destination
,
2869 IN PLONGLONG Exchange
,
2870 IN PLONGLONG Comperand
);
2871 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
2872 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
2877 ExInterlockedCompareExchange64(
2878 IN OUT LONGLONG
volatile *Destination
,
2879 IN PLONGLONG Exchange
,
2880 IN PLONGLONG Comparand
,
2881 IN PKSPIN_LOCK Lock
);
2887 ExInterlockedInsertHeadList(
2888 IN PLIST_ENTRY ListHead
,
2889 IN PLIST_ENTRY ListEntry
,
2890 IN PKSPIN_LOCK Lock
);
2895 ExInterlockedInsertTailList(
2896 IN PLIST_ENTRY ListHead
,
2897 IN PLIST_ENTRY ListEntry
,
2898 IN PKSPIN_LOCK Lock
);
2903 ExInterlockedPopEntryList(
2904 IN PSINGLE_LIST_ENTRY ListHead
,
2905 IN PKSPIN_LOCK Lock
);
2910 ExInterlockedPushEntryList(
2911 IN PSINGLE_LIST_ENTRY ListHead
,
2912 IN PSINGLE_LIST_ENTRY ListEntry
,
2913 IN PKSPIN_LOCK Lock
);
2918 ExInterlockedRemoveHeadList(
2919 IN PLIST_ENTRY ListHead
,
2920 IN PKSPIN_LOCK Lock
);
2925 ExIsProcessorFeaturePresent(
2926 IN ULONG ProcessorFeature
);
2931 ExIsResourceAcquiredExclusiveLite(
2932 IN PERESOURCE Resource
);
2937 ExIsResourceAcquiredSharedLite(
2938 IN PERESOURCE Resource
);
2940 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
2945 ExLocalTimeToSystemTime(
2946 IN PLARGE_INTEGER LocalTime
,
2947 OUT PLARGE_INTEGER SystemTime
);
2953 IN PCALLBACK_OBJECT CallbackObject
,
2955 IN PVOID Argument2
);
2961 IN PWORK_QUEUE_ITEM WorkItem
,
2962 IN WORK_QUEUE_TYPE QueueType
);
2969 IN NTSTATUS Status
);
2975 IN PCALLBACK_OBJECT CallbackObject
,
2976 IN PCALLBACK_FUNCTION CallbackFunction
,
2977 IN PVOID CallbackContext
);
2982 ExReinitializeResourceLite(
2983 IN PERESOURCE Resource
);
2988 ExReleaseResourceForThreadLite(
2989 IN PERESOURCE Resource
,
2990 IN ERESOURCE_THREAD ResourceThreadId
);
2995 ExReleaseResourceLite(
2996 IN PERESOURCE Resource
);
3001 ExSetResourceOwnerPointer(
3002 IN PERESOURCE Resource
,
3003 IN PVOID OwnerPointer
);
3008 ExSetTimerResolution(
3009 IN ULONG DesiredTime
,
3010 IN BOOLEAN SetResolution
);
3015 ExSystemTimeToLocalTime(
3016 IN PLARGE_INTEGER SystemTime
,
3017 OUT PLARGE_INTEGER LocalTime
);
3022 ExUnregisterCallback(
3023 IN PVOID CbRegistration
);
3026 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
3028 #if (NTDDI_VERSION >= NTDDI_WINXP)
3032 ExAcquireRundownProtection(
3033 IN OUT PEX_RUNDOWN_REF RunRef
);
3038 ExInitializeRundownProtection(
3039 OUT PEX_RUNDOWN_REF RunRef
);
3044 ExReInitializeRundownProtection(
3045 OUT PEX_RUNDOWN_REF RunRef
);
3050 ExReleaseRundownProtection(
3051 IN OUT PEX_RUNDOWN_REF RunRef
);
3057 OUT PEX_RUNDOWN_REF RunRef
);
3063 IN SUITE_TYPE SuiteType
);
3068 ExWaitForRundownProtectionRelease(
3069 IN OUT PEX_RUNDOWN_REF RunRef
);
3071 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
3073 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
3077 ExAcquireRundownProtectionEx(
3078 IN OUT PEX_RUNDOWN_REF RunRef
,
3084 ExReleaseRundownProtectionEx(
3085 IN OUT PEX_RUNDOWN_REF RunRef
,
3087 #endif // (NTDDI_VERSION >= NTDDI_WINXPSP2)
3089 #if (NTDDI_VERSION >= NTDDI_WS03)
3091 #endif // (NTDDI_VERSION >= NTDDI_WS03)
3093 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
3095 PEX_RUNDOWN_REF_CACHE_AWARE
3096 ExAllocateCacheAwareRundownProtection(
3097 IN POOL_TYPE PoolType
,
3102 ExSizeOfRundownProtectionCacheAware(VOID
);
3104 #endif // (NTDDI_VERSION >= NTDDI_WS03SP1)
3106 #if (NTDDI_VERSION >= NTDDI_VISTA)
3109 ExInitializeLookasideListEx(
3110 OUT PLOOKASIDE_LIST_EX Lookaside
,
3111 IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL
,
3112 IN PFREE_FUNCTION_EX Free OPTIONAL
,
3113 IN POOL_TYPE PoolType
,
3121 #if !defined(MIDL_PASS)
3123 static __inline PVOID
3124 ExAllocateFromNPagedLookasideList(
3125 IN PNPAGED_LOOKASIDE_LIST Lookaside
)
3129 Lookaside
->L
.TotalAllocates
++;
3130 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
3131 if (Entry
== NULL
) {
3132 Lookaside
->L
.AllocateMisses
++;
3133 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
3140 static __inline PVOID
3141 ExAllocateFromPagedLookasideList(
3142 IN PPAGED_LOOKASIDE_LIST Lookaside
)
3146 Lookaside
->L
.TotalAllocates
++;
3147 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
3148 if (Entry
== NULL
) {
3149 Lookaside
->L
.AllocateMisses
++;
3150 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
3157 static __inline VOID
3158 ExFreeToNPagedLookasideList(
3159 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
3162 Lookaside
->L
.TotalFrees
++;
3163 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
3164 Lookaside
->L
.FreeMisses
++;
3165 (Lookaside
->L
.Free
)(Entry
);
3167 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
3171 static __inline VOID
3172 ExFreeToPagedLookasideList(
3173 IN PPAGED_LOOKASIDE_LIST Lookaside
,
3176 Lookaside
->L
.TotalFrees
++;
3177 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
3178 Lookaside
->L
.FreeMisses
++;
3179 (Lookaside
->L
.Free
)(Entry
);
3181 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
3186 #endif // !defined(MIDL_PASS)