14 #endif /* GUID_DEFINED */
25 /* HACKHACKHACK!!! We shouldn't include this header from ntoskrnl! */
28 #define NTKERNELAPI DECLSPEC_IMPORT
32 typedef UCHAR KPROCESSOR_MODE
;
33 typedef LONG KPRIORITY
;
34 typedef PVOID PSECURITY_DESCRIPTOR
;
35 typedef ULONG SECURITY_INFORMATION
, *PSECURITY_INFORMATION
;
37 /* Structures not exposed to drivers */
38 typedef struct _OBJECT_TYPE
*POBJECT_TYPE
;
39 typedef struct _HAL_DISPATCH_TABLE
*PHAL_DISPATCH_TABLE
;
40 typedef struct _HAL_PRIVATE_DISPATCH_TABLE
*PHAL_PRIVATE_DISPATCH_TABLE
;
41 typedef struct _DEVICE_HANDLER_OBJECT
*PDEVICE_HANDLER_OBJECT
;
42 typedef struct _BUS_HANDLER
*PBUS_HANDLER
;
44 typedef struct _ADAPTER_OBJECT
*PADAPTER_OBJECT
;
45 typedef struct _CALLBACK_OBJECT
*PCALLBACK_OBJECT
;
46 typedef struct _ETHREAD
*PETHREAD
;
47 typedef struct _EPROCESS
*PEPROCESS
;
48 typedef struct _IO_TIMER
*PIO_TIMER
;
49 typedef struct _KINTERRUPT
*PKINTERRUPT
;
50 typedef struct _KPROCESS
*PKPROCESS
;
51 typedef struct _KTHREAD
*PKTHREAD
, *PRKTHREAD
;
54 typedef struct _CONTEXT
*PCONTEXT
;
57 // Resource list definitions
59 typedef int CM_RESOURCE_TYPE
;
61 #define CmResourceTypeNull 0
62 #define CmResourceTypePort 1
63 #define CmResourceTypeInterrupt 2
64 #define CmResourceTypeMemory 3
65 #define CmResourceTypeDma 4
66 #define CmResourceTypeDeviceSpecific 5
67 #define CmResourceTypeBusNumber 6
68 #define CmResourceTypeNonArbitrated 128
69 #define CmResourceTypeConfigData 128
70 #define CmResourceTypeDevicePrivate 129
71 #define CmResourceTypePcCardConfig 130
72 #define CmResourceTypeMfCardConfig 131
79 extern ULONG NtGlobalFlag
;
84 // Section map options
86 typedef enum _SECTION_INHERIT
{
92 // Section access rights
94 #define SECTION_QUERY 0x0001
95 #define SECTION_MAP_WRITE 0x0002
96 #define SECTION_MAP_READ 0x0004
97 #define SECTION_MAP_EXECUTE 0x0008
98 #define SECTION_EXTEND_SIZE 0x0010
99 #define SECTION_MAP_EXECUTE_EXPLICIT 0x0020
101 #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
102 SECTION_MAP_WRITE | \
104 SECTION_MAP_EXECUTE | \
107 #define SESSION_QUERY_ACCESS 0x0001
108 #define SESSION_MODIFY_ACCESS 0x0002
110 #define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
111 SESSION_QUERY_ACCESS | \
112 SESSION_MODIFY_ACCESS)
116 #define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
118 #define PAGE_NOACCESS 0x01
119 #define PAGE_READONLY 0x02
120 #define PAGE_READWRITE 0x04
121 #define PAGE_WRITECOPY 0x08
122 #define PAGE_EXECUTE 0x10
123 #define PAGE_EXECUTE_READ 0x20
124 #define PAGE_EXECUTE_READWRITE 0x40
125 #define PAGE_EXECUTE_WRITECOPY 0x80
126 #define PAGE_GUARD 0x100
127 #define PAGE_NOCACHE 0x200
128 #define PAGE_WRITECOMBINE 0x400
130 #define MEM_COMMIT 0x1000
131 #define MEM_RESERVE 0x2000
132 #define MEM_DECOMMIT 0x4000
133 #define MEM_RELEASE 0x8000
134 #define MEM_FREE 0x10000
135 #define MEM_PRIVATE 0x20000
136 #define MEM_MAPPED 0x40000
137 #define MEM_RESET 0x80000
138 #define MEM_TOP_DOWN 0x100000
139 #define MEM_LARGE_PAGES 0x20000000
140 #define MEM_4MB_PAGES 0x80000000
142 #define SEC_RESERVE 0x4000000
143 #define SEC_LARGE_PAGES 0x80000000
145 #define PROCESS_DUP_HANDLE (0x0040)
147 #if (NTDDI_VERSION >= NTDDI_VISTA)
148 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
151 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
158 // Processor features
160 #define PF_FLOATING_POINT_PRECISION_ERRATA 0
161 #define PF_FLOATING_POINT_EMULATED 1
162 #define PF_COMPARE_EXCHANGE_DOUBLE 2
163 #define PF_MMX_INSTRUCTIONS_AVAILABLE 3
164 #define PF_PPC_MOVEMEM_64BIT_OK 4
165 #define PF_ALPHA_BYTE_INSTRUCTIONS 5
166 #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
167 #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
168 #define PF_RDTSC_INSTRUCTION_AVAILABLE 8
169 #define PF_PAE_ENABLED 9
170 #define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
171 #define PF_SSE_DAZ_MODE_AVAILABLE 11
172 #define PF_NX_ENABLED 12
173 #define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
174 #define PF_COMPARE_EXCHANGE128 14
175 #define PF_COMPARE64_EXCHANGE128 15
176 #define PF_CHANNELS_ENABLED 16
181 // Intrinsics (note: taken from our winnt.h)
184 #if defined(__GNUC__)
186 static __inline__ BOOLEAN
187 InterlockedBitTestAndSet(IN LONG
volatile *Base
,
192 __asm__
__volatile__("lock "
195 :"=r" (OldBit
),"+m" (*Base
)
200 return (_InterlockedOr(Base
, 1 << Bit
) >> Bit
) & 1;
204 static __inline__ BOOLEAN
205 InterlockedBitTestAndReset(IN LONG
volatile *Base
,
210 __asm__
__volatile__("lock "
213 :"=r" (OldBit
),"+m" (*Base
)
218 return (_InterlockedAnd(Base
, ~(1 << Bit
)) >> Bit
) & 1;
224 #define BitScanForward _BitScanForward
225 #define BitScanReverse _BitScanReverse
227 #define BitTest _bittest
228 #define BitTestAndComplement _bittestandcomplement
229 #define BitTestAndSet _bittestandset
230 #define BitTestAndReset _bittestandreset
231 #define InterlockedBitTestAndSet _interlockedbittestandset
232 #define InterlockedBitTestAndReset _interlockedbittestandreset
235 /** INTERLOCKED FUNCTIONS *****************************************************/
237 #if !defined(__INTERLOCKED_DECLARED)
238 #define __INTERLOCKED_DECLARED
241 #if defined(NO_INTERLOCKED_INTRINSICS)
245 InterlockedIncrement(
246 IN OUT LONG
volatile *Addend
);
251 InterlockedDecrement(
252 IN OUT LONG
volatile *Addend
);
257 InterlockedCompareExchange(
258 IN OUT LONG
volatile *Destination
,
266 IN OUT LONG
volatile *Destination
,
272 InterlockedExchangeAdd(
273 IN OUT LONG
volatile *Addend
,
276 #else // !defined(NO_INTERLOCKED_INTRINSICS)
278 #define InterlockedExchange _InterlockedExchange
279 #define InterlockedIncrement _InterlockedIncrement
280 #define InterlockedDecrement _InterlockedDecrement
281 #define InterlockedExchangeAdd _InterlockedExchangeAdd
282 #define InterlockedCompareExchange _InterlockedCompareExchange
283 #define InterlockedOr _InterlockedOr
284 #define InterlockedAnd _InterlockedAnd
285 #define InterlockedXor _InterlockedXor
287 #endif // !defined(NO_INTERLOCKED_INTRINSICS)
289 #endif // defined (_X86_)
291 #if !defined (_WIN64)
294 * InterlockedExchangePointer(
295 * IN OUT PVOID VOLATILE *Target,
298 #define InterlockedExchangePointer(Target, Value) \
299 ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
303 * InterlockedCompareExchangePointer(
304 * IN OUT PVOID *Destination,
306 * IN PVOID Comparand)
308 #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
309 ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
311 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
312 #define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
313 #define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
315 #endif // !defined (_WIN64)
317 #if defined (_M_AMD64)
319 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONGLONG *)a, (LONGLONG)b)
320 #define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONGLONG *)a)
321 #define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONGLONG *)a)
322 #define InterlockedAnd _InterlockedAnd
323 #define InterlockedOr _InterlockedOr
324 #define InterlockedXor _InterlockedXor
325 #define InterlockedIncrement _InterlockedIncrement
326 #define InterlockedDecrement _InterlockedDecrement
327 #define InterlockedAdd _InterlockedAdd
328 #define InterlockedExchange _InterlockedExchange
329 #define InterlockedExchangeAdd _InterlockedExchangeAdd
330 #define InterlockedCompareExchange _InterlockedCompareExchange
331 #define InterlockedAnd64 _InterlockedAnd64
332 #define InterlockedOr64 _InterlockedOr64
333 #define InterlockedXor64 _InterlockedXor64
334 #define InterlockedIncrement64 _InterlockedIncrement64
335 #define InterlockedDecrement64 _InterlockedDecrement64
336 #define InterlockedAdd64 _InterlockedAdd64
337 #define InterlockedExchange64 _InterlockedExchange64
338 #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
339 #define InterlockedCompareExchange64 _InterlockedCompareExchange64
340 #define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
341 #define InterlockedExchangePointer _InterlockedExchangePointer
342 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
343 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
347 #if defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
348 //#if !defined(_X86AMD64_) // FIXME: what's _X86AMD64_ used for?
352 IN OUT LONG64
volatile *Addend
,
355 return InterlockedExchangeAdd64(Addend
, Value
) + Value
;
358 #define BitScanForward _BitScanForward
359 #define BitScanReverse _BitScanReverse
363 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
364 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
367 #endif /* !__INTERLOCKED_DECLARED */
370 #define YieldProcessor _mm_pause
371 #elif defined (_M_AMD64)
372 #define YieldProcessor _mm_pause
373 #elif defined(_M_PPC)
374 #define YieldProcessor() __asm__ __volatile__("nop");
375 #elif defined(_M_MIPS)
376 #define YieldProcessor() __asm__ __volatile__("nop");
377 #elif defined(_M_ARM)
378 #define YieldProcessor()
380 #error Unknown architecture
388 #ifndef _SLIST_HEADER_
389 #define _SLIST_HEADER_
391 #define SLIST_ENTRY SINGLE_LIST_ENTRY
392 #define _SLIST_ENTRY _SINGLE_LIST_ENTRY
393 #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
396 typedef union _SLIST_HEADER
{
403 ULONGLONG Sequence
:9;
404 ULONGLONG NextEntry
:39;
405 ULONGLONG HeaderType
:1;
407 ULONGLONG Reserved
:59;
411 ULONGLONG Sequence
:48;
412 ULONGLONG HeaderType
:1;
414 ULONGLONG Reserved
:2;
415 ULONGLONG NextEntry
:60;
418 } SLIST_HEADER
, *PSLIST_HEADER
;
420 typedef union _SLIST_HEADER
{
427 } SLIST_HEADER
, *PSLIST_HEADER
;
430 #endif /* _SLIST_HEADER_ */
435 // Power States/Levels
437 typedef enum _SYSTEM_POWER_STATE
{
438 PowerSystemUnspecified
,
440 PowerSystemSleeping1
,
441 PowerSystemSleeping2
,
442 PowerSystemSleeping3
,
443 PowerSystemHibernate
,
446 } SYSTEM_POWER_STATE
, *PSYSTEM_POWER_STATE
;
448 #define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
450 typedef enum _POWER_INFORMATION_LEVEL
{
453 VerifySystemPolicyAc
,
454 VerifySystemPolicyDc
,
455 SystemPowerCapabilities
,
457 SystemPowerStateHandler
,
458 ProcessorStateHandler
,
459 SystemPowerPolicyCurrent
,
460 AdministratorPowerPolicy
,
461 SystemReserveHiberFile
,
462 ProcessorInformation
,
463 SystemPowerInformation
,
464 ProcessorStateHandler2
,
467 SystemExecutionState
,
468 SystemPowerStateNotifyHandler
,
469 ProcessorPowerPolicyAc
,
470 ProcessorPowerPolicyDc
,
471 VerifyProcessorPowerPolicyAc
,
472 VerifyProcessorPowerPolicyDc
,
473 ProcessorPowerPolicyCurrent
474 } POWER_INFORMATION_LEVEL
;
480 PowerActionHibernate
,
482 PowerActionShutdownReset
,
483 PowerActionShutdownOff
,
485 } POWER_ACTION
, *PPOWER_ACTION
;
487 typedef enum _DEVICE_POWER_STATE
{
488 PowerDeviceUnspecified
,
494 } DEVICE_POWER_STATE
, *PDEVICE_POWER_STATE
;
496 #define ES_SYSTEM_REQUIRED 0x00000001
497 #define ES_DISPLAY_REQUIRED 0x00000002
498 #define ES_USER_PRESENT 0x00000004
499 #define ES_CONTINUOUS 0x80000000
501 typedef ULONG EXECUTION_STATE
;
511 // Access/Security Stuff
513 typedef ULONG ACCESS_MASK
, *PACCESS_MASK
;
514 typedef PVOID PACCESS_TOKEN
;
516 #define DELETE 0x00010000L
517 #define READ_CONTROL 0x00020000L
518 #define WRITE_DAC 0x00040000L
519 #define WRITE_OWNER 0x00080000L
520 #define SYNCHRONIZE 0x00100000L
521 #define STANDARD_RIGHTS_REQUIRED 0x000F0000L
522 #define STANDARD_RIGHTS_READ READ_CONTROL
523 #define STANDARD_RIGHTS_WRITE READ_CONTROL
524 #define STANDARD_RIGHTS_EXECUTE READ_CONTROL
525 #define STANDARD_RIGHTS_ALL 0x001F0000L
526 #define SPECIFIC_RIGHTS_ALL 0x0000FFFFL
527 #define ACCESS_SYSTEM_SECURITY 0x01000000L
528 #define MAXIMUM_ALLOWED 0x02000000L
529 #define GENERIC_READ 0x80000000L
530 #define GENERIC_WRITE 0x40000000L
531 #define GENERIC_EXECUTE 0x20000000L
532 #define GENERIC_ALL 0x10000000L
534 typedef struct _GENERIC_MAPPING
{
535 ACCESS_MASK GenericRead
;
536 ACCESS_MASK GenericWrite
;
537 ACCESS_MASK GenericExecute
;
538 ACCESS_MASK GenericAll
;
539 } GENERIC_MAPPING
, *PGENERIC_MAPPING
;
541 #define ACL_REVISION 2
542 #define ACL_REVISION_DS 4
544 #define ACL_REVISION1 1
545 #define ACL_REVISION2 2
546 #define ACL_REVISION3 3
547 #define ACL_REVISION4 4
548 #define MIN_ACL_REVISION ACL_REVISION2
549 #define MAX_ACL_REVISION ACL_REVISION4
551 typedef struct _ACL
{
562 // Current security descriptor revision value
564 #define SECURITY_DESCRIPTOR_REVISION (1)
565 #define SECURITY_DESCRIPTOR_REVISION1 (1)
568 // Privilege attributes
570 #define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
571 #define SE_PRIVILEGE_ENABLED (0x00000002L)
572 #define SE_PRIVILEGE_REMOVED (0X00000004L)
573 #define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
575 #define SE_PRIVILEGE_VALID_ATTRIBUTES (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
576 SE_PRIVILEGE_ENABLED | \
577 SE_PRIVILEGE_REMOVED | \
578 SE_PRIVILEGE_USED_FOR_ACCESS)
580 #include <pshpack4.h>
581 typedef struct _LUID_AND_ATTRIBUTES
{
584 } LUID_AND_ATTRIBUTES
, *PLUID_AND_ATTRIBUTES
;
586 typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY
[ANYSIZE_ARRAY
];
587 typedef LUID_AND_ATTRIBUTES_ARRAY
*PLUID_AND_ATTRIBUTES_ARRAY
;
594 #define PRIVILEGE_SET_ALL_NECESSARY (1)
596 typedef struct _PRIVILEGE_SET
{
597 ULONG PrivilegeCount
;
599 LUID_AND_ATTRIBUTES Privilege
[ANYSIZE_ARRAY
];
600 } PRIVILEGE_SET
,*PPRIVILEGE_SET
;
602 typedef enum _SECURITY_IMPERSONATION_LEVEL
{
604 SecurityIdentification
,
605 SecurityImpersonation
,
607 } SECURITY_IMPERSONATION_LEVEL
, * PSECURITY_IMPERSONATION_LEVEL
;
609 #define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
610 #define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
611 #define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
612 #define VALID_IMPERSONATION_LEVEL(Level) (((Level) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((Level) <= SECURITY_MAX_IMPERSONATION_LEVEL))
614 #define SECURITY_DYNAMIC_TRACKING (TRUE)
615 #define SECURITY_STATIC_TRACKING (FALSE)
617 typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE
, *PSECURITY_CONTEXT_TRACKING_MODE
;
619 typedef struct _SECURITY_QUALITY_OF_SERVICE
{
621 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
;
622 SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode
;
623 BOOLEAN EffectiveOnly
;
624 } SECURITY_QUALITY_OF_SERVICE
, *PSECURITY_QUALITY_OF_SERVICE
;
626 typedef struct _SE_IMPERSONATION_STATE
{
629 BOOLEAN EffectiveOnly
;
630 SECURITY_IMPERSONATION_LEVEL Level
;
631 } SE_IMPERSONATION_STATE
, *PSE_IMPERSONATION_STATE
;
633 #define OWNER_SECURITY_INFORMATION (0x00000001L)
634 #define GROUP_SECURITY_INFORMATION (0x00000002L)
635 #define DACL_SECURITY_INFORMATION (0x00000004L)
636 #define SACL_SECURITY_INFORMATION (0x00000008L)
637 #define LABEL_SECURITY_INFORMATION (0x00000010L)
639 #define PROTECTED_DACL_SECURITY_INFORMATION (0x80000000L)
640 #define PROTECTED_SACL_SECURITY_INFORMATION (0x40000000L)
641 #define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L)
642 #define UNPROTECTED_SACL_SECURITY_INFORMATION (0x10000000L)
647 // Registry Access Rights
649 #define KEY_QUERY_VALUE (0x0001)
650 #define KEY_SET_VALUE (0x0002)
651 #define KEY_CREATE_SUB_KEY (0x0004)
652 #define KEY_ENUMERATE_SUB_KEYS (0x0008)
653 #define KEY_NOTIFY (0x0010)
654 #define KEY_CREATE_LINK (0x0020)
655 #define KEY_WOW64_32KEY (0x0200)
656 #define KEY_WOW64_64KEY (0x0100)
657 #define KEY_WOW64_RES (0x0300)
659 #define KEY_READ ((STANDARD_RIGHTS_READ |\
661 KEY_ENUMERATE_SUB_KEYS |\
666 #define KEY_WRITE ((STANDARD_RIGHTS_WRITE |\
668 KEY_CREATE_SUB_KEY) \
672 #define KEY_EXECUTE ((KEY_READ) \
676 #define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL |\
679 KEY_CREATE_SUB_KEY |\
680 KEY_ENUMERATE_SUB_KEYS |\
687 // Registry Open/Create Options
689 #define REG_OPTION_RESERVED (0x00000000L)
690 #define REG_OPTION_NON_VOLATILE (0x00000000L)
691 #define REG_OPTION_VOLATILE (0x00000001L)
692 #define REG_OPTION_CREATE_LINK (0x00000002L)
693 #define REG_OPTION_BACKUP_RESTORE (0x00000004L)
694 #define REG_OPTION_OPEN_LINK (0x00000008L)
696 #define REG_LEGAL_OPTION \
697 (REG_OPTION_RESERVED |\
698 REG_OPTION_NON_VOLATILE |\
699 REG_OPTION_VOLATILE |\
700 REG_OPTION_CREATE_LINK |\
701 REG_OPTION_BACKUP_RESTORE |\
702 REG_OPTION_OPEN_LINK)
705 // Key creation/open disposition
707 #define REG_CREATED_NEW_KEY (0x00000001L)
708 #define REG_OPENED_EXISTING_KEY (0x00000002L)
711 // Key restore & hive load flags
713 #define REG_WHOLE_HIVE_VOLATILE (0x00000001L)
714 #define REG_REFRESH_HIVE (0x00000002L)
715 #define REG_NO_LAZY_FLUSH (0x00000004L)
716 #define REG_FORCE_RESTORE (0x00000008L)
717 #define REG_APP_HIVE (0x00000010L)
718 #define REG_PROCESS_PRIVATE (0x00000020L)
719 #define REG_START_JOURNAL (0x00000040L)
720 #define REG_HIVE_EXACT_FILE_GROWTH (0x00000080L)
721 #define REG_HIVE_NO_RM (0x00000100L)
722 #define REG_HIVE_SINGLE_LOG (0x00000200L)
727 #define REG_FORCE_UNLOAD 1
730 // Notify Filter Values
732 #define REG_NOTIFY_CHANGE_NAME (0x00000001L)
733 #define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L)
734 #define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L)
735 #define REG_NOTIFY_CHANGE_SECURITY (0x00000008L)
737 #define REG_LEGAL_CHANGE_FILTER \
738 (REG_NOTIFY_CHANGE_NAME |\
739 REG_NOTIFY_CHANGE_ATTRIBUTES |\
740 REG_NOTIFY_CHANGE_LAST_SET |\
741 REG_NOTIFY_CHANGE_SECURITY)
746 // Thread Access Rights
748 #define THREAD_TERMINATE (0x0001)
749 #define THREAD_SUSPEND_RESUME (0x0002)
750 #define THREAD_ALERT (0x0004)
751 #define THREAD_GET_CONTEXT (0x0008)
752 #define THREAD_SET_CONTEXT (0x0010)
753 #define THREAD_SET_INFORMATION (0x0020)
754 #define THREAD_SET_LIMITED_INFORMATION (0x0400)
755 #define THREAD_QUERY_LIMITED_INFORMATION (0x0800)
756 #if (NTDDI_VERSION >= NTDDI_VISTA)
757 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
760 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
765 // Service Start Types
767 #define SERVICE_BOOT_START 0x00000000
768 #define SERVICE_SYSTEM_START 0x00000001
769 #define SERVICE_AUTO_START 0x00000002
770 #define SERVICE_DEMAND_START 0x00000003
771 #define SERVICE_DISABLED 0x00000004
776 #define EXCEPTION_NONCONTINUABLE 1
777 #define EXCEPTION_MAXIMUM_PARAMETERS 15
779 typedef struct _EXCEPTION_RECORD
{
780 NTSTATUS ExceptionCode
;
781 ULONG ExceptionFlags
;
782 struct _EXCEPTION_RECORD
*ExceptionRecord
;
783 PVOID ExceptionAddress
;
784 ULONG NumberParameters
;
785 ULONG_PTR ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
786 } EXCEPTION_RECORD
, *PEXCEPTION_RECORD
;
788 typedef struct _EXCEPTION_RECORD32
{
789 NTSTATUS ExceptionCode
;
790 ULONG ExceptionFlags
;
791 ULONG ExceptionRecord
;
792 ULONG ExceptionAddress
;
793 ULONG NumberParameters
;
794 ULONG ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
795 } EXCEPTION_RECORD32
, *PEXCEPTION_RECORD32
;
797 typedef struct _EXCEPTION_RECORD64
{
798 NTSTATUS ExceptionCode
;
799 ULONG ExceptionFlags
;
800 ULONG64 ExceptionRecord
;
801 ULONG64 ExceptionAddress
;
802 ULONG NumberParameters
;
803 ULONG __unusedAlignment
;
804 ULONG64 ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
805 } EXCEPTION_RECORD64
, *PEXCEPTION_RECORD64
;
807 typedef struct _EXCEPTION_POINTERS
{
808 PEXCEPTION_RECORD ExceptionRecord
;
809 PCONTEXT ContextRecord
;
810 } EXCEPTION_POINTERS
, *PEXCEPTION_POINTERS
;
817 typedef struct _QUOTA_LIMITS
{
818 SIZE_T PagedPoolLimit
;
819 SIZE_T NonPagedPoolLimit
;
820 SIZE_T MinimumWorkingSetSize
;
821 SIZE_T MaximumWorkingSetSize
;
822 SIZE_T PagefileLimit
;
823 LARGE_INTEGER TimeLimit
;
824 } QUOTA_LIMITS
, *PQUOTA_LIMITS
;
826 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
827 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
828 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
829 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
830 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
833 /******************************************************************************
834 * WINBASE Functions *
835 ******************************************************************************/
836 #if !defined(_WINBASE_)
840 #define InterlockedPopEntrySList(Head) \
841 ExpInterlockedPopEntrySList(Head)
843 #define InterlockedPushEntrySList(Head, Entry) \
844 ExpInterlockedPushEntrySList(Head, Entry)
846 #define InterlockedFlushSList(Head) \
847 ExpInterlockedFlushSList(Head)
849 #define QueryDepthSList(Head) \
850 ExQueryDepthSList(Head)
852 #else // !defined(_WIN64)
857 InterlockedPopEntrySList(
858 IN PSLIST_HEADER ListHead
);
863 InterlockedPushEntrySList(
864 IN PSLIST_HEADER ListHead
,
865 IN PSLIST_ENTRY ListEntry
);
867 #define InterlockedFlushSList(ListHead) \
868 ExInterlockedFlushSList(ListHead)
870 #define QueryDepthSList(Head) \
871 ExQueryDepthSList(Head)
873 #endif // !defined(_WIN64)
875 #endif // !defined(_WINBASE_)
878 /******************************************************************************
880 ******************************************************************************/
882 typedef struct _DISPATCHER_HEADER
908 LIST_ENTRY WaitListHead
;
909 } DISPATCHER_HEADER
, *PDISPATCHER_HEADER
;
911 typedef ULONG_PTR KSPIN_LOCK
, *PKSPIN_LOCK
;
913 typedef struct _KEVENT
{
914 DISPATCHER_HEADER Header
;
915 } KEVENT
, *PKEVENT
, *RESTRICTED_POINTER PRKEVENT
;
917 typedef struct _KSEMAPHORE
{
918 DISPATCHER_HEADER Header
;
920 } KSEMAPHORE
, *PKSEMAPHORE
, *RESTRICTED_POINTER PRKSEMAPHORE
;
922 /******************************************************************************
924 ******************************************************************************/
926 #define RTL_REGISTRY_ABSOLUTE 0
927 #define RTL_REGISTRY_SERVICES 1
928 #define RTL_REGISTRY_CONTROL 2
929 #define RTL_REGISTRY_WINDOWS_NT 3
930 #define RTL_REGISTRY_DEVICEMAP 4
931 #define RTL_REGISTRY_USER 5
932 #define RTL_REGISTRY_MAXIMUM 6
933 #define RTL_REGISTRY_HANDLE 0x40000000
934 #define RTL_REGISTRY_OPTIONAL 0x80000000
936 /* RTL_QUERY_REGISTRY_TABLE.Flags */
937 #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001
938 #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002
939 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004
940 #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008
941 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010
942 #define RTL_QUERY_REGISTRY_DIRECT 0x00000020
943 #define RTL_QUERY_REGISTRY_DELETE 0x00000040
945 typedef struct _RTL_BITMAP
{
948 } RTL_BITMAP
, *PRTL_BITMAP
;
950 typedef struct _RTL_BITMAP_RUN
{
953 } RTL_BITMAP_RUN
, *PRTL_BITMAP_RUN
;
956 (DDKAPI
*PRTL_QUERY_REGISTRY_ROUTINE
)(
960 IN ULONG ValueLength
,
962 IN PVOID EntryContext
);
964 typedef struct _RTL_QUERY_REGISTRY_TABLE
{
965 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine
;
972 } RTL_QUERY_REGISTRY_TABLE
, *PRTL_QUERY_REGISTRY_TABLE
;
974 typedef struct _TIME_FIELDS
{
983 } TIME_FIELDS
, *PTIME_FIELDS
;
986 /******************************************************************************
988 ******************************************************************************/
994 IN PVOID FailedAssertion
,
1001 * IN VOID UNALIGNED *Destination,
1002 * IN CONST VOID UNALIGNED *Source,
1005 #define RtlCopyMemory(Destination, Source, Length) \
1006 memcpy(Destination, Source, Length)
1008 #define RtlCopyBytes RtlCopyMemory
1010 #if defined(_M_AMD64)
1014 RtlCopyMemoryNonTemporal(
1015 VOID UNALIGNED
*Destination
,
1016 CONST VOID UNALIGNED
*Source
,
1019 #define RtlCopyMemoryNonTemporal RtlCopyMemory
1027 #define RtlEqualLuid(Luid1, Luid2) \
1028 (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
1032 * IN VOID UNALIGNED *Destination,
1033 * IN CONST VOID UNALIGNED *Source,
1036 #define RtlEqualMemory(Destination, Source, Length) \
1037 (!memcmp(Destination, Source, Length))
1041 * IN VOID UNALIGNED *Destination,
1045 #define RtlFillMemory(Destination, Length, Fill) \
1046 memset(Destination, Fill, Length)
1048 #define RtlFillBytes RtlFillMemory
1053 RtlFreeUnicodeString(
1054 IN PUNICODE_STRING UnicodeString
);
1060 IN PUNICODE_STRING GuidString
,
1066 RtlInitUnicodeString(
1067 IN OUT PUNICODE_STRING DestinationString
,
1068 IN PCWSTR SourceString
);
1072 * IN VOID UNALIGNED *Destination,
1073 * IN CONST VOID UNALIGNED *Source,
1076 #define RtlMoveMemory(Destination, Source, Length) \
1077 memmove(Destination, Source, Length)
1084 OUT PUNICODE_STRING GuidString
);
1088 * IN VOID UNALIGNED *Destination,
1091 #define RtlZeroMemory(Destination, Length) \
1092 memset(Destination, 0, Length)
1094 #define RtlZeroBytes RtlZeroMemory
1097 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1102 IN PRTL_BITMAP BitMapHeader
,
1103 IN ULONG StartingIndex
,
1110 IN PRTL_BITMAP BitMapHeader
,
1111 IN ULONG StartingIndex
,
1117 RtlAnsiStringToUnicodeString(
1118 IN OUT PUNICODE_STRING DestinationString
,
1119 IN PANSI_STRING SourceString
,
1120 IN BOOLEAN AllocateDestinationString
);
1125 RtlxAnsiStringToUnicodeSize(
1126 IN PCANSI_STRING AnsiString
);
1128 #define RtlAnsiStringToUnicodeSize(String) ( \
1129 NLS_MB_CODE_PAGE_TAG ? \
1130 RtlxAnsiStringToUnicodeSize(String) : \
1131 ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
1137 RtlAppendUnicodeStringToString(
1138 IN OUT PUNICODE_STRING Destination
,
1139 IN PCUNICODE_STRING Source
);
1144 RtlAppendUnicodeToString(
1145 IN OUT PUNICODE_STRING Destination
,
1151 RtlCheckRegistryKey(
1152 IN ULONG RelativeTo
,
1159 IN PRTL_BITMAP BitMapHeader
);
1165 IN PRTL_BITMAP BitMapHeader
,
1166 IN ULONG StartingIndex
,
1167 IN ULONG NumberToClear
);
1173 IN CONST VOID
*Source1
,
1174 IN CONST VOID
*Source2
,
1180 RtlCompareUnicodeString(
1181 IN PCUNICODE_STRING String1
,
1182 IN PCUNICODE_STRING String2
,
1183 IN BOOLEAN CaseInSensitive
);
1188 RtlCompareUnicodeStrings(
1190 IN SIZE_T String1Length
,
1192 IN SIZE_T String2Length
,
1193 IN BOOLEAN CaseInSensitive
);
1198 RtlCopyUnicodeString(
1199 IN OUT PUNICODE_STRING DestinationString
,
1200 IN PCUNICODE_STRING SourceString
);
1205 RtlCreateRegistryKey(
1206 IN ULONG RelativeTo
,
1212 RtlCreateSecurityDescriptor(
1213 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
1219 RtlDeleteRegistryValue(
1220 IN ULONG RelativeTo
,
1222 IN PCWSTR ValueName
);
1227 RtlEqualUnicodeString(
1228 IN CONST UNICODE_STRING
*String1
,
1229 IN CONST UNICODE_STRING
*String2
,
1230 IN BOOLEAN CaseInSensitive
);
1232 #if !defined(_AMD64_) && !defined(_IA64_)
1236 RtlExtendedIntegerMultiply(
1237 IN LARGE_INTEGER Multiplicand
,
1238 IN LONG Multiplier
);
1243 RtlExtendedLargeIntegerDivide(
1244 IN LARGE_INTEGER Dividend
,
1246 IN OUT PULONG Remainder
);
1249 #if defined(_X86_) || defined(_IA64_)
1253 RtlExtendedMagicDivide(
1254 IN LARGE_INTEGER Dividend
,
1255 IN LARGE_INTEGER MagicDivisor
,
1256 IN CCHAR ShiftCount
);
1263 IN PANSI_STRING AnsiString
);
1269 IN PRTL_BITMAP BitMapHeader
,
1270 IN ULONG NumberToFind
,
1271 IN ULONG HintIndex
);
1276 RtlFindClearBitsAndSet(
1277 IN PRTL_BITMAP BitMapHeader
,
1278 IN ULONG NumberToFind
,
1279 IN ULONG HintIndex
);
1284 RtlFindFirstRunClear(
1285 IN PRTL_BITMAP BitMapHeader
,
1286 OUT PULONG StartingIndex
);
1292 IN PRTL_BITMAP BitMapHeader
,
1293 OUT PRTL_BITMAP_RUN RunArray
,
1294 IN ULONG SizeOfRunArray
,
1295 IN BOOLEAN LocateLongestRuns
);
1300 RtlFindLastBackwardRunClear(
1301 IN PRTL_BITMAP BitMapHeader
,
1303 OUT PULONG StartingRunIndex
);
1308 RtlFindLeastSignificantBit(
1314 RtlFindLongestRunClear(
1315 IN PRTL_BITMAP BitMapHeader
,
1316 OUT PULONG StartingIndex
);
1321 RtlFindMostSignificantBit(
1327 RtlFindNextForwardRunClear(
1328 IN PRTL_BITMAP BitMapHeader
,
1330 OUT PULONG StartingRunIndex
);
1336 IN PRTL_BITMAP BitMapHeader
,
1337 IN ULONG NumberToFind
,
1338 IN ULONG HintIndex
);
1343 RtlFindSetBitsAndClear(
1344 IN PRTL_BITMAP BitMapHeader
,
1345 IN ULONG NumberToFind
,
1346 IN ULONG HintIndex
);
1351 RtlHashUnicodeString(
1352 IN CONST UNICODE_STRING
*String
,
1353 IN BOOLEAN CaseInSensitive
,
1354 IN ULONG HashAlgorithm
,
1355 OUT PULONG HashValue
);
1361 IN OUT PANSI_STRING DestinationString
,
1362 IN PCSZ SourceString
);
1367 RtlInitializeBitMap(
1368 IN PRTL_BITMAP BitMapHeader
,
1369 IN PULONG BitMapBuffer
,
1370 IN ULONG SizeOfBitMap
);
1376 IN OUT PSTRING DestinationString
,
1377 IN PCSZ SourceString
);
1382 RtlIntegerToUnicodeString(
1384 IN ULONG Base OPTIONAL
,
1385 IN OUT PUNICODE_STRING String
);
1390 RtlInt64ToUnicodeString(
1392 IN ULONG Base OPTIONAL
,
1393 IN OUT PUNICODE_STRING String
);
1396 #define RtlIntPtrToUnicodeString(Value, Base, String) \
1397 RtlInt64ToUnicodeString(Value, Base, String)
1399 #define RtlIntPtrToUnicodeString(Value, Base, String) \
1400 RtlIntegerToUnicodeString(Value, Base, String)
1407 #define RtlIsZeroLuid(_L1) \
1408 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
1413 RtlLengthSecurityDescriptor(
1414 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
1419 RtlNumberOfClearBits(
1420 IN PRTL_BITMAP BitMapHeader
);
1426 IN PRTL_BITMAP BitMapHeader
);
1431 RtlQueryRegistryValues(
1432 IN ULONG RelativeTo
,
1434 IN PRTL_QUERY_REGISTRY_TABLE QueryTable
,
1436 IN PVOID Environment OPTIONAL
);
1438 #define LONG_SIZE (sizeof(LONG))
1439 #define LONG_MASK (LONG_SIZE - 1)
1443 * PULONG DestinationAddress,
1444 * PULONG SourceAddress);
1446 #if defined(_AMD64_)
1447 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
1448 *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
1450 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
1451 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
1453 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
1454 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
1455 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
1456 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
1460 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
1465 * RtlRetrieveUshort(
1466 * PUSHORT DestinationAddress,
1467 * PUSHORT SourceAddress);
1469 #if defined(_AMD64_)
1470 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
1471 *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
1473 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
1474 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
1476 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
1477 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
1481 *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
1489 IN PRTL_BITMAP BitMapHeader
);
1495 IN PRTL_BITMAP BitMapHeader
,
1496 IN ULONG StartingIndex
,
1497 IN ULONG NumberToSet
);
1502 RtlSetDaclSecurityDescriptor(
1503 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
1504 IN BOOLEAN DaclPresent
,
1505 IN PACL Dacl OPTIONAL
,
1506 IN BOOLEAN DaclDefaulted OPTIONAL
);
1510 * IN PULONG Address,
1513 #if defined(_AMD64_)
1514 #define RtlStoreUlong(Address,Value) \
1515 *(ULONG UNALIGNED *)(Address) = (Value)
1517 #define RtlStoreUlong(Address,Value) \
1518 if ((ULONG_PTR)(Address) & LONG_MASK) { \
1519 ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
1520 ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
1521 ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
1522 ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT] = (UCHAR)(FOURTHBYTE(Value)); \
1525 *((PULONG)(Address)) = (ULONG) (Value); \
1530 * RtlStoreUlonglong(
1531 * IN OUT PULONGLONG Address,
1534 #if defined(_AMD64_)
1535 #define RtlStoreUlonglong(Address,Value) \
1536 *(ULONGLONG UNALIGNED *)(Address) = (Value)
1538 #define RtlStoreUlonglong(Address,Value) \
1539 if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
1540 RtlStoreUlong((ULONG_PTR)(Address), \
1541 (ULONGLONG)(Value) & 0xFFFFFFFF); \
1542 RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
1543 (ULONGLONG)(Value) >> 32); \
1545 *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
1551 * IN OUT PULONG_PTR Address,
1552 * IN ULONG_PTR Value);
1555 #define RtlStoreUlongPtr(Address,Value) \
1556 RtlStoreUlonglong(Address,Value)
1558 #define RtlStoreUlongPtr(Address,Value) \
1559 RtlStoreUlong(Address,Value)
1564 * IN PUSHORT Address,
1567 #if defined(_AMD64_)
1568 #define RtlStoreUshort(Address,Value) \
1569 *(USHORT UNALIGNED *)(Address) = (Value)
1571 #define RtlStoreUshort(Address,Value) \
1572 if ((ULONG_PTR)(Address) & SHORT_MASK) { \
1573 ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
1574 ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
1577 *((PUSHORT) (Address)) = (USHORT)Value; \
1584 RtlTimeFieldsToTime(
1585 IN PTIME_FIELDS TimeFields
,
1586 IN PLARGE_INTEGER Time
);
1591 RtlTimeToTimeFields(
1592 IN PLARGE_INTEGER Time
,
1593 IN PTIME_FIELDS TimeFields
);
1604 RtlUlonglongByteSwap(
1605 IN ULONGLONG Source
);
1610 RtlUnicodeStringToAnsiString(
1611 IN OUT PANSI_STRING DestinationString
,
1612 IN PCUNICODE_STRING SourceString
,
1613 IN BOOLEAN AllocateDestinationString
);
1618 RtlxUnicodeStringToAnsiSize(
1619 IN PCUNICODE_STRING UnicodeString
);
1621 #define RtlUnicodeStringToAnsiSize(String) ( \
1622 NLS_MB_CODE_PAGE_TAG ? \
1623 RtlxUnicodeStringToAnsiSize(String) : \
1624 ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
1630 RtlUnicodeStringToInteger(
1631 IN PCUNICODE_STRING String
,
1632 IN ULONG Base OPTIONAL
,
1638 RtlUpcaseUnicodeChar(
1639 IN WCHAR SourceCharacter
);
1650 RtlValidRelativeSecurityDescriptor(
1651 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput
,
1652 IN ULONG SecurityDescriptorLength
,
1653 IN SECURITY_INFORMATION RequiredInformation
);
1658 RtlValidSecurityDescriptor(
1659 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
1664 RtlWriteRegistryValue(
1665 IN ULONG RelativeTo
,
1667 IN PCWSTR ValueName
,
1670 IN ULONG ValueLength
);
1672 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
1674 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
1678 RtlPrefetchMemoryNonTemporal(
1683 #if (NTDDI_VERSION >= NTDDI_WINXP)
1688 PRTL_BITMAP BitMapHeader
,
1694 RtlDowncaseUnicodeChar(
1695 IN WCHAR SourceCharacter
);
1701 PRTL_BITMAP BitMapHeader
,
1708 IN PRTL_BITMAP BitMapHeader
,
1709 IN ULONG BitNumber
);
1711 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
1713 #if (NTDDI_VERSION >= NTDDI_VISTA)
1717 RtlNumberOfSetBitsUlongPtr(
1718 IN ULONG_PTR Target
);
1723 RtlIoDecodeMemIoResource (
1724 IN PIO_RESOURCE_DESCRIPTOR Descriptor
,
1725 OUT PULONGLONG Alignment OPTIONAL
,
1726 OUT PULONGLONG MinimumAddress OPTIONAL
,
1727 OUT PULONGLONG MaximumAddress OPTIONAL
);
1732 RtlIoEncodeMemIoResource(
1733 IN PIO_RESOURCE_DESCRIPTOR Descriptor
,
1735 IN ULONGLONG Length
,
1736 IN ULONGLONG Alignment
,
1737 IN ULONGLONG MinimumAddress
,
1738 IN ULONGLONG MaximumAddress
);
1743 RtlCmDecodeMemIoResource(
1744 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor
,
1745 OUT PULONGLONG Start OPTIONAL
);
1750 RtlFindClosestEncodableLength(
1751 IN ULONGLONG SourceLength
,
1752 OUT PULONGLONG TargetLength
);
1756 #if !defined(MIDL_PASS)
1757 /* inline funftions */
1758 //DECLSPEC_DEPRECATED_DDK_WINXP
1762 RtlConvertLongToLargeInteger(LONG SignedInteger
)
1765 ret
.QuadPart
= SignedInteger
;
1769 //DECLSPEC_DEPRECATED_DDK_WINXP
1773 RtlConvertUlongToLargeInteger(
1774 ULONG UnsignedInteger
)
1777 ret
.QuadPart
= UnsignedInteger
;
1781 //DECLSPEC_DEPRECATED_DDK
1785 RtlEnlargedUnsignedDivide(
1786 IN ULARGE_INTEGER Dividend
,
1788 IN OUT PULONG Remainder
)
1791 *Remainder
= Dividend
.QuadPart
% Divisor
;
1792 return Dividend
.QuadPart
/ Divisor
;
1795 //DECLSPEC_DEPRECATED_DDK
1799 RtlEnlargedUnsignedMultiply(
1800 IN ULONG Multiplicand
,
1801 IN ULONG Multiplier
)
1804 ret
.QuadPart
= (ULONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
1808 //DECLSPEC_DEPRECATED_DDK
1812 RtlEnlargedIntegerMultiply(
1813 IN LONG Multiplicand
,
1817 ret
.QuadPart
= (LONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
1823 RtlInitEmptyAnsiString(OUT PANSI_STRING AnsiString
,
1825 IN USHORT BufferSize
)
1827 AnsiString
->Length
= 0;
1828 AnsiString
->MaximumLength
= BufferSize
;
1829 AnsiString
->Buffer
= Buffer
;
1834 RtlInitEmptyUnicodeString(
1835 OUT PUNICODE_STRING UnicodeString
,
1837 IN USHORT BufferSize
)
1839 UnicodeString
->Length
= 0;
1840 UnicodeString
->MaximumLength
= BufferSize
;
1841 UnicodeString
->Buffer
= Buffer
;
1844 #if defined(_AMD64_) || defined(_IA64_)
1848 RtlExtendedIntegerMultiply(
1849 LARGE_INTEGER Multiplicand
,
1853 ret
.QuadPart
= Multiplicand
.QuadPart
* Multiplier
;
1860 RtlExtendedLargeIntegerDivide(
1861 LARGE_INTEGER Dividend
,
1866 ret
.QuadPart
= (ULONG64
)Dividend
.QuadPart
/ Divisor
;
1868 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
1873 #if defined(_AMD64_)
1875 #define MultiplyHigh __mulh
1876 #define UnsignedMultiplyHigh __umulh
1878 //DECLSPEC_DEPRECATED_DDK
1882 RtlExtendedMagicDivide(
1883 IN LARGE_INTEGER Dividend
,
1884 IN LARGE_INTEGER MagicDivisor
,
1885 IN CCHAR ShiftCount
)
1890 Pos
= (Dividend
.QuadPart
>= 0);
1891 ret64
= UnsignedMultiplyHigh(Pos
? Dividend
.QuadPart
: -Dividend
.QuadPart
,
1892 MagicDivisor
.QuadPart
);
1893 ret64
>>= ShiftCount
;
1894 ret
.QuadPart
= Pos
? ret64
: -ret64
;
1899 //DECLSPEC_DEPRECATED_DDK
1904 IN LARGE_INTEGER Addend1
,
1905 IN LARGE_INTEGER Addend2
)
1908 ret
.QuadPart
= Addend1
.QuadPart
+ Addend2
.QuadPart
;
1913 * RtlLargeIntegerAnd(
1914 * IN OUT LARGE_INTEGER Result,
1915 * IN LARGE_INTEGER Source,
1916 * IN LARGE_INTEGER Mask);
1918 #define RtlLargeIntegerAnd(Result, Source, Mask) \
1919 Result.QuadPart = Source.QuadPart & Mask.QuadPart
1921 //DECLSPEC_DEPRECATED_DDK
1925 RtlLargeIntegerArithmeticShift(
1926 IN LARGE_INTEGER LargeInteger
,
1927 IN CCHAR ShiftCount
)
1930 ret
.QuadPart
= LargeInteger
.QuadPart
>> ShiftCount
;
1935 * RtlLargeIntegerEqualTo(
1936 * IN LARGE_INTEGER Operand1,
1937 * IN LARGE_INTEGER Operand2);
1939 #define RtlLargeIntegerEqualTo(X,Y) \
1940 (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
1944 RtlSecureZeroMemory(
1948 volatile char* vptr
= (volatile char*)Pointer
;
1949 #if defined(_M_AMD64)
1950 __stosb((PUCHAR
)vptr
, 0, Size
);
1952 char * endptr
= (char *)vptr
+ Size
;
1953 while (vptr
< endptr
)
1961 #if defined(_M_AMD64)
1965 IN PRTL_BITMAP BitMapHeader
,
1966 IN ULONG BitPosition
)
1968 return BitTest((LONG CONST
*)BitMapHeader
->Buffer
, BitPosition
);
1971 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
1972 #endif // defined(_M_AMD64)
1974 #endif // !defined(MIDL_PASS)
1977 // Byte Swap Functions
1979 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \
1980 ((defined(_M_AMD64) || defined(_M_IA64)) \
1981 && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))
1983 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
1984 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
1985 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
1989 /******************************************************************************
1990 * Memory manager Types *
1991 ******************************************************************************/
1993 typedef struct _MDL
{
1997 struct _EPROCESS
*Process
;
1998 PVOID MappedSystemVa
;
2005 /******************************************************************************
2006 * Memory manager Functions *
2007 ******************************************************************************/
2009 /* PVOID MmGetSystemAddressForMdl(
2012 #define MmGetSystemAddressForMdl(Mdl) \
2013 (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
2014 MDL_SOURCE_IS_NONPAGED_POOL)) ? \
2015 ((Mdl)->MappedSystemVa) : \
2016 (MmMapLockedPages((Mdl), KernelMode)))
2019 * MmGetSystemAddressForMdlSafe(
2021 * IN MM_PAGE_PRIORITY Priority)
2023 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
2024 (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
2025 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
2026 (_Mdl)->MappedSystemVa : \
2027 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
2028 KernelMode, MmCached, NULL, FALSE, (_Priority)))
2030 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2035 IN PMDL MemoryDescriptorList OPTIONAL
,
2042 /******************************************************************************
2043 * I/O Manager Functions *
2044 ******************************************************************************/
2046 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
2047 (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
2049 #define DMA_MACROS_DEFINED
2053 IoAllocateAdapterChannel(
2054 IN PADAPTER_OBJECT AdapterObject
,
2055 IN PDEVICE_OBJECT DeviceObject
,
2056 IN ULONG NumberOfMapRegisters
,
2057 IN PDRIVER_CONTROL ExecutionRoutine
,
2060 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel
;
2061 AllocateAdapterChannel
=
2062 *(DmaAdapter
)->DmaOperations
->AllocateAdapterChannel
;
2063 ASSERT(AllocateAdapterChannel
);
2064 return AllocateAdapterChannel(DmaAdapter
,
2066 NumberOfMapRegisters
,
2073 IoFlushAdapterBuffers(
2074 IN PADAPTER_OBJECT AdapterObject
,
2076 IN PVOID MapRegisterBase
,
2079 IN BOOLEAN WriteToDevice
)
2081 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers
;
2082 FlushAdapterBuffers
= *(DmaAdapter
)->DmaOperations
->FlushAdapterBuffers
;
2083 ASSERT(FlushAdapterBuffers
);
2084 return FlushAdapterBuffers(DmaAdapter
,
2094 IoFreeAdapterChannel(
2095 IN PADAPTER_OBJECT AdapterObject
)
2097 PFREE_ADAPTER_CHANNEL FreeAdapterChannel
;
2098 FreeAdapterChannel
= *(DmaAdapter
)->DmaOperations
->FreeAdapterChannel
;
2099 ASSERT(FreeAdapterChannel
);
2100 FreeAdapterChannel(DmaAdapter
);
2106 IN PADAPTER_OBJECT AdapterObject
,
2107 IN PVOID MapRegisterBase
,
2108 IN ULONG NumberOfMapRegisters
)
2110 PFREE_MAP_REGISTERS FreeMapRegisters
;
2111 FreeMapRegisters
= *(DmaAdapter
)->DmaOperations
->FreeMapRegisters
;
2112 ASSERT(FreeMapRegisters
);
2113 FreeMapRegisters(DmaAdapter
, MapRegisterBase
, NumberOfMapRegisters
);
2119 IN PDMA_ADAPTER DmaAdapter
,
2121 IN PVOID MapRegisterBase
,
2123 IN OUT PULONG Length
,
2124 IN BOOLEAN WriteToDevice
)
2126 PMAP_TRANSFER MapTransfer
;
2128 MapTransfer
= *(DmaAdapter
)->DmaOperations
->MapTransfer
;
2129 ASSERT(MapTransfer
);
2130 return MapTransfer(DmaAdapter
,
2140 /******************************************************************************
2142 ******************************************************************************/
2144 typedef enum _POOL_TYPE
{
2147 NonPagedPoolMustSucceed
,
2149 NonPagedPoolCacheAligned
,
2150 PagedPoolCacheAligned
,
2151 NonPagedPoolCacheAlignedMustS
,
2153 NonPagedPoolSession
= 32,
2155 NonPagedPoolMustSucceedSession
,
2156 DontUseThisTypeSession
,
2157 NonPagedPoolCacheAlignedSession
,
2158 PagedPoolCacheAlignedSession
,
2159 NonPagedPoolCacheAlignedMustSSession
2162 typedef enum _SUITE_TYPE
{
2166 CommunicationServer
,
2168 SmallBusinessRestricted
,
2177 typedef enum _EX_POOL_PRIORITY
{
2179 LowPoolPrioritySpecialPoolOverrun
= 8,
2180 LowPoolPrioritySpecialPoolUnderrun
= 9,
2181 NormalPoolPriority
= 16,
2182 NormalPoolPrioritySpecialPoolOverrun
= 24,
2183 NormalPoolPrioritySpecialPoolUnderrun
= 25,
2184 HighPoolPriority
= 32,
2185 HighPoolPrioritySpecialPoolOverrun
= 40,
2186 HighPoolPrioritySpecialPoolUnderrun
= 41
2189 typedef struct _FAST_MUTEX
2196 } FAST_MUTEX
, *PFAST_MUTEX
;
2198 typedef ULONG_PTR ERESOURCE_THREAD
, *PERESOURCE_THREAD
;
2200 typedef struct _OWNER_ENTRY
{
2201 ERESOURCE_THREAD OwnerThread
;
2202 _ANONYMOUS_UNION
union {
2206 } OWNER_ENTRY
, *POWNER_ENTRY
;
2208 typedef struct _ERESOURCE
2210 LIST_ENTRY SystemResourcesList
;
2211 POWNER_ENTRY OwnerTable
;
2214 volatile PKSEMAPHORE SharedWaiters
;
2215 volatile PKEVENT ExclusiveWaiters
;
2216 OWNER_ENTRY OwnerEntry
;
2217 ULONG ActiveEntries
;
2218 ULONG ContentionCount
;
2219 ULONG NumberOfSharedWaiters
;
2220 ULONG NumberOfExclusiveWaiters
;
2224 ULONG_PTR CreatorBackTraceIndex
;
2226 KSPIN_LOCK SpinLock
;
2227 } ERESOURCE
, *PERESOURCE
;
2229 #if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
2230 #define LOOKASIDE_ALIGN
2232 #define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */
2235 typedef struct _LOOKASIDE_LIST_EX
*PLOOKASIDE_LIST_EX
;
2238 (DDKAPI
*PALLOCATE_FUNCTION
)(
2239 IN POOL_TYPE PoolType
,
2240 IN SIZE_T NumberOfBytes
,
2244 (DDKAPI
*PALLOCATE_FUNCTION_EX
)(
2245 IN POOL_TYPE PoolType
,
2246 IN SIZE_T NumberOfBytes
,
2248 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
2251 (DDKAPI
*PFREE_FUNCTION
)(
2255 (DDKAPI
*PFREE_FUNCTION_EX
)(
2257 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
2260 (DDKAPI
*PCALLBACK_FUNCTION
)(
2261 IN PVOID CallbackContext
,
2263 IN PVOID Argument2
);
2265 typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE
{
2267 SLIST_HEADER ListHead
;
2268 SINGLE_LIST_ENTRY SingleListHead
;
2271 USHORT MaximumDepth
;
2272 ULONG TotalAllocates
;
2274 ULONG AllocateMisses
;
2286 PALLOCATE_FUNCTION_EX AllocateEx
;
2287 PALLOCATE_FUNCTION Allocate
;
2290 PFREE_FUNCTION_EX FreeEx
;
2291 PFREE_FUNCTION Free
;
2293 LIST_ENTRY ListEntry
;
2294 ULONG LastTotalAllocates
;
2296 ULONG LastAllocateMisses
;
2297 ULONG LastAllocateHits
;
2300 } GENERAL_LOOKASIDE
, *PGENERAL_LOOKASIDE
;
2302 typedef struct _PAGED_LOOKASIDE_LIST
{
2303 GENERAL_LOOKASIDE L
;
2304 #if !defined(_AMD64_) && !defined(_IA64_)
2305 FAST_MUTEX Lock__ObsoleteButDoNotDelete
;
2307 } PAGED_LOOKASIDE_LIST
, *PPAGED_LOOKASIDE_LIST
;
2309 typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST
{
2310 GENERAL_LOOKASIDE L
;
2311 #if !defined(_AMD64_) && !defined(_IA64_)
2312 KSPIN_LOCK Lock__ObsoleteButDoNotDelete
;
2314 } NPAGED_LOOKASIDE_LIST
, *PNPAGED_LOOKASIDE_LIST
;
2316 //typedef struct _LOOKASIDE_LIST_EX {
2317 // GENERAL_LOOKASIDE_POOL L;
2318 //} LOOKASIDE_LIST_EX, *PLOOKASIDE_LIST_EX;
2320 typedef struct _EX_RUNDOWN_REF
{
2322 volatile ULONG_PTR Count
;
2325 } EX_RUNDOWN_REF
, *PEX_RUNDOWN_REF
;
2327 typedef enum _WORK_QUEUE_TYPE
{
2330 HyperCriticalWorkQueue
,
2335 (DDKAPI
*PWORKER_THREAD_ROUTINE
)(
2336 IN PVOID Parameter
);
2338 typedef struct _WORK_QUEUE_ITEM
{
2340 PWORKER_THREAD_ROUTINE WorkerRoutine
;
2341 volatile PVOID Parameter
;
2342 } WORK_QUEUE_ITEM
, *PWORK_QUEUE_ITEM
;
2345 /******************************************************************************
2346 * Executive Functions *
2347 ******************************************************************************/
2350 #if defined(_NTHAL_)
2351 #define ExAcquireFastMutex ExiAcquireFastMutex
2352 #define ExReleaseFastMutex ExiReleaseFastMutex
2353 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
2355 #define ExInterlockedAddUlong ExfInterlockedAddUlong
2356 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
2357 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
2358 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
2359 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
2360 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
2365 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
2366 defined(_NTHAL_) || defined(_NTOSP_)
2369 ExQueryDepthSList(IN PSLIST_HEADER ListHead
);
2373 ExQueryDepthSList(IN PSLIST_HEADER ListHead
)
2375 return (USHORT
)(ListHead
->Alignment
& 0xffff);
2381 ExpInterlockedFlushSList(
2382 PSLIST_HEADER ListHead
);
2386 ExpInterlockedPopEntrySList(
2387 PSLIST_HEADER ListHead
);
2391 ExpInterlockedPushEntrySList(
2392 PSLIST_HEADER ListHead
,
2393 PSLIST_ENTRY ListEntry
);
2395 #define ExInterlockedFlushSList(Head) \
2396 ExpInterlockedFlushSList(Head)
2397 #define ExInterlockedPopEntrySList(Head, Lock) \
2398 ExpInterlockedPopEntrySList(Head)
2399 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
2400 ExpInterlockedPushEntrySList(Head, Entry)
2402 #else // !defined(_WIN64)
2404 #define ExQueryDepthSList(listhead) (listhead)->Depth
2409 ExInterlockedFlushSList(
2410 IN PSLIST_HEADER ListHead
);
2412 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
2416 ExInterlockedPopEntrySList(
2417 IN PSLIST_HEADER ListHead
,
2418 IN PKSPIN_LOCK Lock
);
2423 ExInterlockedPushEntrySList(
2424 IN PSLIST_HEADER ListHead
,
2425 IN PSINGLE_LIST_ENTRY ListEntry
,
2426 IN PKSPIN_LOCK Lock
);
2428 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
2429 InterlockedPopEntrySList(_ListHead)
2430 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
2431 InterlockedPushEntrySList(_ListHead, _ListEntry)
2432 #endif // _WIN2K_COMPAT_SLIST_USAGE
2434 #endif // !defined(_WIN64)
2437 * ExGetCurrentResourceThread(
2440 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread())
2442 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
2445 * ExInitializeWorkItem(
2446 * IN PWORK_QUEUE_ITEM Item,
2447 * IN PWORKER_THREAD_ROUTINE Routine,
2450 #define ExInitializeWorkItem(Item, Routine, Context) \
2452 (Item)->WorkerRoutine = Routine; \
2453 (Item)->Parameter = Context; \
2454 (Item)->List.Flink = NULL; \
2457 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2463 IN OUT PFAST_MUTEX FastMutex
);
2469 IN OUT PFAST_MUTEX FastMutex
);
2474 ExTryToAcquireFastMutex(
2475 IN OUT PFAST_MUTEX FastMutex
);
2480 ExAcquireFastMutexUnsafe(
2481 IN OUT PFAST_MUTEX FastMutex
);
2486 ExReleaseFastMutexUnsafe(
2487 IN OUT PFAST_MUTEX FastMutex
);
2492 ExAcquireResourceExclusiveLite(
2493 IN PERESOURCE Resource
,
2499 ExAcquireResourceSharedLite(
2500 IN PERESOURCE Resource
,
2506 ExAcquireSharedStarveExclusive(
2507 IN PERESOURCE Resource
,
2513 ExAcquireSharedWaitForExclusive(
2514 IN PERESOURCE Resource
,
2521 IN POOL_TYPE PoolType
,
2522 IN SIZE_T NumberOfBytes
);
2525 #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
2526 #endif /* POOL_TAGGING */
2531 ExAllocatePoolWithQuota(
2532 IN POOL_TYPE PoolType
,
2533 IN SIZE_T NumberOfBytes
);
2536 #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
2537 #endif /* POOL_TAGGING */
2542 ExAllocatePoolWithQuotaTag(
2543 IN POOL_TYPE PoolType
,
2544 IN SIZE_T NumberOfBytes
,
2547 #ifndef POOL_TAGGING
2548 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
2549 #endif /* POOL_TAGGING */
2554 ExAllocatePoolWithTag(
2555 IN POOL_TYPE PoolType
,
2556 IN SIZE_T NumberOfBytes
,
2562 ExAllocatePoolWithTagPriority(
2563 IN POOL_TYPE PoolType
,
2564 IN SIZE_T NumberOfBytes
,
2566 IN EX_POOL_PRIORITY Priority
);
2571 ExConvertExclusiveToSharedLite(
2572 IN PERESOURCE Resource
);
2578 OUT PCALLBACK_OBJECT
*CallbackObject
,
2579 IN POBJECT_ATTRIBUTES ObjectAttributes
,
2581 IN BOOLEAN AllowMultipleCallbacks
);
2586 ExDeleteNPagedLookasideList(
2587 IN PNPAGED_LOOKASIDE_LIST Lookaside
);
2592 ExDeletePagedLookasideList(
2593 IN PPAGED_LOOKASIDE_LIST Lookaside
);
2598 ExDeleteResourceLite(
2599 IN PERESOURCE Resource
);
2608 #define ExFreePool(P) ExFreePoolWithTag(P, 0)
2621 ExGetExclusiveWaiterCount(
2622 IN PERESOURCE Resource
);
2633 ExGetSharedWaiterCount(
2634 IN PERESOURCE Resource
);
2639 ExInitializeNPagedLookasideList(
2640 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
2641 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
2642 IN PFREE_FUNCTION Free OPTIONAL
,
2651 ExInitializePagedLookasideList(
2652 IN PPAGED_LOOKASIDE_LIST Lookaside
,
2653 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
2654 IN PFREE_FUNCTION Free OPTIONAL
,
2663 ExInitializeResourceLite(
2664 IN PERESOURCE Resource
);
2669 ExInterlockedAddLargeInteger(
2670 IN PLARGE_INTEGER Addend
,
2671 IN LARGE_INTEGER Increment
,
2672 IN PKSPIN_LOCK Lock
);
2675 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
2676 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
2678 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
2679 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
2685 ExInterlockedAddUlong(
2690 #if defined(_AMD64_) || defined(_IA64_)
2691 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
2692 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
2693 #elif defined(_X86_)
2697 ExfInterlockedCompareExchange64(
2698 IN OUT LONGLONG
volatile *Destination
,
2699 IN PLONGLONG Exchange
,
2700 IN PLONGLONG Comperand
);
2701 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
2702 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
2707 ExInterlockedCompareExchange64(
2708 IN OUT LONGLONG
volatile *Destination
,
2709 IN PLONGLONG Exchange
,
2710 IN PLONGLONG Comparand
,
2711 IN PKSPIN_LOCK Lock
);
2717 ExInterlockedInsertHeadList(
2718 IN PLIST_ENTRY ListHead
,
2719 IN PLIST_ENTRY ListEntry
,
2720 IN PKSPIN_LOCK Lock
);
2725 ExInterlockedInsertTailList(
2726 IN PLIST_ENTRY ListHead
,
2727 IN PLIST_ENTRY ListEntry
,
2728 IN PKSPIN_LOCK Lock
);
2733 ExInterlockedPopEntryList(
2734 IN PSINGLE_LIST_ENTRY ListHead
,
2735 IN PKSPIN_LOCK Lock
);
2740 ExInterlockedPushEntryList(
2741 IN PSINGLE_LIST_ENTRY ListHead
,
2742 IN PSINGLE_LIST_ENTRY ListEntry
,
2743 IN PKSPIN_LOCK Lock
);
2748 ExInterlockedRemoveHeadList(
2749 IN PLIST_ENTRY ListHead
,
2750 IN PKSPIN_LOCK Lock
);
2755 ExIsProcessorFeaturePresent(
2756 IN ULONG ProcessorFeature
);
2761 ExIsResourceAcquiredExclusiveLite(
2762 IN PERESOURCE Resource
);
2767 ExIsResourceAcquiredSharedLite(
2768 IN PERESOURCE Resource
);
2770 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
2775 ExLocalTimeToSystemTime(
2776 IN PLARGE_INTEGER LocalTime
,
2777 OUT PLARGE_INTEGER SystemTime
);
2783 IN PCALLBACK_OBJECT CallbackObject
,
2785 IN PVOID Argument2
);
2791 IN PWORK_QUEUE_ITEM WorkItem
,
2792 IN WORK_QUEUE_TYPE QueueType
);
2799 IN NTSTATUS Status
);
2805 IN PCALLBACK_OBJECT CallbackObject
,
2806 IN PCALLBACK_FUNCTION CallbackFunction
,
2807 IN PVOID CallbackContext
);
2812 ExReinitializeResourceLite(
2813 IN PERESOURCE Resource
);
2818 ExReleaseResourceForThreadLite(
2819 IN PERESOURCE Resource
,
2820 IN ERESOURCE_THREAD ResourceThreadId
);
2825 ExReleaseResourceLite(
2826 IN PERESOURCE Resource
);
2831 ExSetResourceOwnerPointer(
2832 IN PERESOURCE Resource
,
2833 IN PVOID OwnerPointer
);
2838 ExSetTimerResolution(
2839 IN ULONG DesiredTime
,
2840 IN BOOLEAN SetResolution
);
2845 ExSystemTimeToLocalTime(
2846 IN PLARGE_INTEGER SystemTime
,
2847 OUT PLARGE_INTEGER LocalTime
);
2852 ExUnregisterCallback(
2853 IN PVOID CbRegistration
);
2856 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
2858 #if (NTDDI_VERSION >= NTDDI_WINXP)
2862 ExAcquireRundownProtection(
2863 IN OUT PEX_RUNDOWN_REF RunRef
);
2868 ExInitializeRundownProtection(
2869 OUT PEX_RUNDOWN_REF RunRef
);
2874 ExReInitializeRundownProtection(
2875 OUT PEX_RUNDOWN_REF RunRef
);
2880 ExReleaseRundownProtection(
2881 IN OUT PEX_RUNDOWN_REF RunRef
);
2887 OUT PEX_RUNDOWN_REF RunRef
);
2893 IN SUITE_TYPE SuiteType
);
2898 ExWaitForRundownProtectionRelease(
2899 IN OUT PEX_RUNDOWN_REF RunRef
);
2901 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
2903 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
2907 ExAcquireRundownProtectionEx(
2908 IN OUT PEX_RUNDOWN_REF RunRef
,
2914 ExReleaseRundownProtectionEx(
2915 IN OUT PEX_RUNDOWN_REF RunRef
,
2917 #endif // (NTDDI_VERSION >= NTDDI_WINXPSP2)
2919 #if (NTDDI_VERSION >= NTDDI_WS03)
2921 #endif // (NTDDI_VERSION >= NTDDI_WS03)
2923 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
2925 PEX_RUNDOWN_REF_CACHE_AWARE
2926 ExAllocateCacheAwareRundownProtection(
2927 IN POOL_TYPE PoolType
,
2932 ExSizeOfRundownProtectionCacheAware(VOID
);
2934 #endif // (NTDDI_VERSION >= NTDDI_WS03SP1)
2936 #if (NTDDI_VERSION >= NTDDI_VISTA)
2939 ExInitializeLookasideListEx(
2940 OUT PLOOKASIDE_LIST_EX Lookaside
,
2941 IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL
,
2942 IN PFREE_FUNCTION_EX Free OPTIONAL
,
2943 IN POOL_TYPE PoolType
,
2951 #if !defined(MIDL_PASS)
2953 static __inline PVOID
2954 ExAllocateFromNPagedLookasideList(
2955 IN PNPAGED_LOOKASIDE_LIST Lookaside
)
2959 Lookaside
->L
.TotalAllocates
++;
2960 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
2961 if (Entry
== NULL
) {
2962 Lookaside
->L
.AllocateMisses
++;
2963 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
2970 static __inline PVOID
2971 ExAllocateFromPagedLookasideList(
2972 IN PPAGED_LOOKASIDE_LIST Lookaside
)
2976 Lookaside
->L
.TotalAllocates
++;
2977 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
2978 if (Entry
== NULL
) {
2979 Lookaside
->L
.AllocateMisses
++;
2980 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
2987 static __inline VOID
2988 ExFreeToNPagedLookasideList(
2989 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
2992 Lookaside
->L
.TotalFrees
++;
2993 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
2994 Lookaside
->L
.FreeMisses
++;
2995 (Lookaside
->L
.Free
)(Entry
);
2997 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
3001 static __inline VOID
3002 ExFreeToPagedLookasideList(
3003 IN PPAGED_LOOKASIDE_LIST Lookaside
,
3006 Lookaside
->L
.TotalFrees
++;
3007 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
3008 Lookaside
->L
.FreeMisses
++;
3009 (Lookaside
->L
.Free
)(Entry
);
3011 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
3016 #endif // !defined(MIDL_PASS)