4 /* Helper macro to enable gcc's extension. */
5 #ifndef __GNU_EXTENSION
7 #define __GNU_EXTENSION __extension__
9 #define __GNU_EXTENSION
23 #endif /* GUID_DEFINED */
31 #define NTKERNELAPI DECLSPEC_IMPORT
34 #define PORT_MAXIMUM_MESSAGE_LENGTH 512
36 #define PORT_MAXIMUM_MESSAGE_LENGTH 256
43 // Indicate if #pragma alloc_text() is supported
45 #if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_IA64)
46 #define ALLOC_PRAGMA 1
50 // Indicate if #pragma data_seg() is supported
52 #if defined(_M_IX86) || defined(_M_AMD64)
53 #define ALLOC_DATA_PRAGMA 1
62 #define ALIGN_DOWN(s, t) \
63 ((ULONG)(s) & ~(sizeof(t) - 1))
65 #define ALIGN_UP(s, t) \
66 (ALIGN_DOWN(((ULONG)(s) + sizeof(t) - 1), t))
68 #define ALIGN_DOWN_POINTER(p, t) \
69 ((PVOID)((ULONG_PTR)(p) & ~((ULONG_PTR)sizeof(t) - 1)))
71 #define ALIGN_UP_POINTER(p, t) \
72 (ALIGN_DOWN_POINTER(((ULONG_PTR)(p) + sizeof(t) - 1), t))
78 #ifndef __IID_ALIGNED__
79 #define __IID_ALIGNED__
81 inline int IsEqualGUIDAligned(REFGUID guid1
, REFGUID guid2
)
83 return ((*(PLONGLONG
)(&guid1
) == *(PLONGLONG
)(&guid2
)) && (*((PLONGLONG
)(&guid1
) + 1) == *((PLONGLONG
)(&guid2
) + 1)));
86 #define IsEqualGUIDAligned(guid1, guid2) \
87 ((*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && (*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1)))
92 ** Forward declarations
101 struct _DEVICE_OBJECT
;
102 struct _DRIVER_OBJECT
;
103 struct _IO_STATUS_BLOCK
;
104 struct _DEVICE_DESCRIPTION
;
105 struct _SCATTER_GATHER_LIST
;
106 struct _DRIVE_LAYOUT_INFORMATION
;
114 typedef UCHAR KIRQL
, *PKIRQL
;
123 #define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )
124 #define ZwCurrentProcess() NtCurrentProcess()
125 #define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )
126 #define ZwCurrentThread() NtCurrentThread()
129 #define KIP0PCRADDRESS 0xffdff000
133 #define MAXIMUM_PROCESSORS 64
135 #define MAXIMUM_PROCESSORS 32
138 #define MAXIMUM_WAIT_OBJECTS 64
140 #define EX_RUNDOWN_ACTIVE 0x1
141 #define EX_RUNDOWN_COUNT_SHIFT 0x1
142 #define EX_RUNDOWN_COUNT_INC (1 << EX_RUNDOWN_COUNT_SHIFT)
144 #define METHOD_BUFFERED 0
145 #define METHOD_IN_DIRECT 1
146 #define METHOD_OUT_DIRECT 2
147 #define METHOD_NEITHER 3
149 #define LOW_PRIORITY 0
150 #define LOW_REALTIME_PRIORITY 16
151 #define HIGH_PRIORITY 31
152 #define MAXIMUM_PRIORITY 32
154 #define MAXIMUM_SUSPEND_COUNT MAXCHAR
156 #define MAXIMUM_FILENAME_LENGTH 256
158 #define FILE_SUPERSEDED 0x00000000
159 #define FILE_OPENED 0x00000001
160 #define FILE_CREATED 0x00000002
161 #define FILE_OVERWRITTEN 0x00000003
162 #define FILE_EXISTS 0x00000004
163 #define FILE_DOES_NOT_EXIST 0x00000005
165 #define FILE_USE_FILE_POINTER_POSITION 0xfffffffe
166 #define FILE_WRITE_TO_END_OF_FILE 0xffffffff
168 /* also in winnt.h */
169 #define FILE_LIST_DIRECTORY 0x00000001
170 #define FILE_READ_DATA 0x00000001
171 #define FILE_ADD_FILE 0x00000002
172 #define FILE_WRITE_DATA 0x00000002
173 #define FILE_ADD_SUBDIRECTORY 0x00000004
174 #define FILE_APPEND_DATA 0x00000004
175 #define FILE_CREATE_PIPE_INSTANCE 0x00000004
176 #define FILE_READ_EA 0x00000008
177 #define FILE_WRITE_EA 0x00000010
178 #define FILE_EXECUTE 0x00000020
179 #define FILE_TRAVERSE 0x00000020
180 #define FILE_DELETE_CHILD 0x00000040
181 #define FILE_READ_ATTRIBUTES 0x00000080
182 #define FILE_WRITE_ATTRIBUTES 0x00000100
184 #define FILE_SHARE_READ 0x00000001
185 #define FILE_SHARE_WRITE 0x00000002
186 #define FILE_SHARE_DELETE 0x00000004
187 #define FILE_SHARE_VALID_FLAGS 0x00000007
189 #define FILE_ATTRIBUTE_READONLY 0x00000001
190 #define FILE_ATTRIBUTE_HIDDEN 0x00000002
191 #define FILE_ATTRIBUTE_SYSTEM 0x00000004
192 #define FILE_ATTRIBUTE_DIRECTORY 0x00000010
193 #define FILE_ATTRIBUTE_ARCHIVE 0x00000020
194 #define FILE_ATTRIBUTE_DEVICE 0x00000040
195 #define FILE_ATTRIBUTE_NORMAL 0x00000080
196 #define FILE_ATTRIBUTE_TEMPORARY 0x00000100
197 #define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
198 #define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
199 #define FILE_ATTRIBUTE_COMPRESSED 0x00000800
200 #define FILE_ATTRIBUTE_OFFLINE 0x00001000
201 #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
202 #define FILE_ATTRIBUTE_ENCRYPTED 0x00004000
204 #define FILE_ATTRIBUTE_VALID_FLAGS 0x00007fb7
205 #define FILE_ATTRIBUTE_VALID_SET_FLAGS 0x000031a7
207 #define FILE_VALID_OPTION_FLAGS 0x00ffffff
208 #define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032
209 #define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032
210 #define FILE_VALID_SET_FLAGS 0x00000036
212 #define FILE_SUPERSEDE 0x00000000
213 #define FILE_OPEN 0x00000001
214 #define FILE_CREATE 0x00000002
215 #define FILE_OPEN_IF 0x00000003
216 #define FILE_OVERWRITE 0x00000004
217 #define FILE_OVERWRITE_IF 0x00000005
218 #define FILE_MAXIMUM_DISPOSITION 0x00000005
220 #define FILE_DIRECTORY_FILE 0x00000001
221 #define FILE_WRITE_THROUGH 0x00000002
222 #define FILE_SEQUENTIAL_ONLY 0x00000004
223 #define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008
224 #define FILE_SYNCHRONOUS_IO_ALERT 0x00000010
225 #define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020
226 #define FILE_NON_DIRECTORY_FILE 0x00000040
227 #define FILE_CREATE_TREE_CONNECTION 0x00000080
228 #define FILE_COMPLETE_IF_OPLOCKED 0x00000100
229 #define FILE_NO_EA_KNOWLEDGE 0x00000200
230 #define FILE_OPEN_REMOTE_INSTANCE 0x00000400
231 #define FILE_RANDOM_ACCESS 0x00000800
232 #define FILE_DELETE_ON_CLOSE 0x00001000
233 #define FILE_OPEN_BY_FILE_ID 0x00002000
234 #define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000
235 #define FILE_NO_COMPRESSION 0x00008000
236 #define FILE_RESERVE_OPFILTER 0x00100000
237 #define FILE_OPEN_REPARSE_POINT 0x00200000
238 #define FILE_OPEN_NO_RECALL 0x00400000
239 #define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000
241 #define FILE_ANY_ACCESS 0x00000000
242 #define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS
243 #define FILE_READ_ACCESS 0x00000001
244 #define FILE_WRITE_ACCESS 0x00000002
246 #define FILE_ALL_ACCESS \
247 (STANDARD_RIGHTS_REQUIRED | \
251 #define FILE_GENERIC_EXECUTE \
252 (STANDARD_RIGHTS_EXECUTE | \
253 FILE_READ_ATTRIBUTES | \
257 #define FILE_GENERIC_READ \
258 (STANDARD_RIGHTS_READ | \
260 FILE_READ_ATTRIBUTES | \
264 #define FILE_GENERIC_WRITE \
265 (STANDARD_RIGHTS_WRITE | \
267 FILE_WRITE_ATTRIBUTES | \
274 #define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\')
276 #define OBJECT_TYPE_CREATE (0x0001)
277 #define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
279 #define DIRECTORY_QUERY (0x0001)
280 #define DIRECTORY_TRAVERSE (0x0002)
281 #define DIRECTORY_CREATE_OBJECT (0x0004)
282 #define DIRECTORY_CREATE_SUBDIRECTORY (0x0008)
283 #define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
285 #define EVENT_QUERY_STATE (0x0001)
286 #define EVENT_MODIFY_STATE (0x0002)
287 #define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
289 #define SEMAPHORE_QUERY_STATE (0x0001)
290 #define SEMAPHORE_MODIFY_STATE (0x0002)
291 #define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
293 #define FM_LOCK_BIT (0x1)
294 #define FM_LOCK_BIT_V (0x0)
295 #define FM_LOCK_WAITER_WOKEN (0x2)
296 #define FM_LOCK_WAITER_INC (0x4)
298 #define PROCESSOR_FEATURE_MAX 64
300 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
305 } ALTERNATIVE_ARCHITECTURE_TYPE
;
307 typedef struct _KSYSTEM_TIME
312 } KSYSTEM_TIME
, *PKSYSTEM_TIME
;
315 ** IRP function codes
318 #define IRP_MJ_CREATE 0x00
319 #define IRP_MJ_CREATE_NAMED_PIPE 0x01
320 #define IRP_MJ_CLOSE 0x02
321 #define IRP_MJ_READ 0x03
322 #define IRP_MJ_WRITE 0x04
323 #define IRP_MJ_QUERY_INFORMATION 0x05
324 #define IRP_MJ_SET_INFORMATION 0x06
325 #define IRP_MJ_QUERY_EA 0x07
326 #define IRP_MJ_SET_EA 0x08
327 #define IRP_MJ_FLUSH_BUFFERS 0x09
328 #define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0a
329 #define IRP_MJ_SET_VOLUME_INFORMATION 0x0b
330 #define IRP_MJ_DIRECTORY_CONTROL 0x0c
331 #define IRP_MJ_FILE_SYSTEM_CONTROL 0x0d
332 #define IRP_MJ_DEVICE_CONTROL 0x0e
333 #define IRP_MJ_INTERNAL_DEVICE_CONTROL 0x0f
334 #define IRP_MJ_SCSI 0x0f
335 #define IRP_MJ_SHUTDOWN 0x10
336 #define IRP_MJ_LOCK_CONTROL 0x11
337 #define IRP_MJ_CLEANUP 0x12
338 #define IRP_MJ_CREATE_MAILSLOT 0x13
339 #define IRP_MJ_QUERY_SECURITY 0x14
340 #define IRP_MJ_SET_SECURITY 0x15
341 #define IRP_MJ_POWER 0x16
342 #define IRP_MJ_SYSTEM_CONTROL 0x17
343 #define IRP_MJ_DEVICE_CHANGE 0x18
344 #define IRP_MJ_QUERY_QUOTA 0x19
345 #define IRP_MJ_SET_QUOTA 0x1a
346 #define IRP_MJ_PNP 0x1b
347 #define IRP_MJ_PNP_POWER 0x1b
348 #define IRP_MJ_MAXIMUM_FUNCTION 0x1b
350 #define IRP_MN_SCSI_CLASS 0x01
352 #define IRP_MN_START_DEVICE 0x00
353 #define IRP_MN_QUERY_REMOVE_DEVICE 0x01
354 #define IRP_MN_REMOVE_DEVICE 0x02
355 #define IRP_MN_CANCEL_REMOVE_DEVICE 0x03
356 #define IRP_MN_STOP_DEVICE 0x04
357 #define IRP_MN_QUERY_STOP_DEVICE 0x05
358 #define IRP_MN_CANCEL_STOP_DEVICE 0x06
360 #define IRP_MN_QUERY_DEVICE_RELATIONS 0x07
361 #define IRP_MN_QUERY_INTERFACE 0x08
362 #define IRP_MN_QUERY_CAPABILITIES 0x09
363 #define IRP_MN_QUERY_RESOURCES 0x0A
364 #define IRP_MN_QUERY_RESOURCE_REQUIREMENTS 0x0B
365 #define IRP_MN_QUERY_DEVICE_TEXT 0x0C
366 #define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
368 #define IRP_MN_READ_CONFIG 0x0F
369 #define IRP_MN_WRITE_CONFIG 0x10
370 #define IRP_MN_EJECT 0x11
371 #define IRP_MN_SET_LOCK 0x12
372 #define IRP_MN_QUERY_ID 0x13
373 #define IRP_MN_QUERY_PNP_DEVICE_STATE 0x14
374 #define IRP_MN_QUERY_BUS_INFORMATION 0x15
375 #define IRP_MN_DEVICE_USAGE_NOTIFICATION 0x16
376 #define IRP_MN_SURPRISE_REMOVAL 0x17
378 #define IRP_MN_WAIT_WAKE 0x00
379 #define IRP_MN_POWER_SEQUENCE 0x01
380 #define IRP_MN_SET_POWER 0x02
381 #define IRP_MN_QUERY_POWER 0x03
383 #define IRP_MN_QUERY_ALL_DATA 0x00
384 #define IRP_MN_QUERY_SINGLE_INSTANCE 0x01
385 #define IRP_MN_CHANGE_SINGLE_INSTANCE 0x02
386 #define IRP_MN_CHANGE_SINGLE_ITEM 0x03
387 #define IRP_MN_ENABLE_EVENTS 0x04
388 #define IRP_MN_DISABLE_EVENTS 0x05
389 #define IRP_MN_ENABLE_COLLECTION 0x06
390 #define IRP_MN_DISABLE_COLLECTION 0x07
391 #define IRP_MN_REGINFO 0x08
392 #define IRP_MN_EXECUTE_METHOD 0x09
394 #define IRP_MN_REGINFO_EX 0x0b
396 typedef enum _IO_PAGING_PRIORITY
{
397 IoPagingPriorityInvalid
,
398 IoPagingPriorityNormal
,
399 IoPagingPriorityHigh
,
400 IoPagingPriorityReserved1
,
401 IoPagingPriorityReserved2
402 } IO_PAGING_PRIORITY
;
404 typedef enum _IO_ALLOCATION_ACTION
{
407 DeallocateObjectKeepRegisters
408 } IO_ALLOCATION_ACTION
, *PIO_ALLOCATION_ACTION
;
410 typedef IO_ALLOCATION_ACTION
411 (DDKAPI
*PDRIVER_CONTROL
)(
412 IN
struct _DEVICE_OBJECT
*DeviceObject
,
414 IN PVOID MapRegisterBase
,
418 (DDKAPI
*PDRIVER_LIST_CONTROL
)(
419 IN
struct _DEVICE_OBJECT
*DeviceObject
,
421 IN
struct _SCATTER_GATHER_LIST
*ScatterGather
,
425 (DDKAPI DRIVER_ADD_DEVICE
)(
426 IN
struct _DRIVER_OBJECT
*DriverObject
,
427 IN
struct _DEVICE_OBJECT
*PhysicalDeviceObject
);
428 typedef DRIVER_ADD_DEVICE
*PDRIVER_ADD_DEVICE
;
431 (DDKAPI IO_COMPLETION_ROUTINE
)(
432 IN
struct _DEVICE_OBJECT
*DeviceObject
,
435 typedef IO_COMPLETION_ROUTINE
*PIO_COMPLETION_ROUTINE
;
438 (DDKAPI DRIVER_CANCEL
)(
439 IN
struct _DEVICE_OBJECT
*DeviceObject
,
440 IN
struct _IRP
*Irp
);
441 typedef DRIVER_CANCEL
*PDRIVER_CANCEL
;
444 (DDKAPI
*PKDEFERRED_ROUTINE
)(
445 IN
struct _KDPC
*Dpc
,
446 IN PVOID DeferredContext
,
447 IN PVOID SystemArgument1
,
448 IN PVOID SystemArgument2
);
451 (DDKAPI DRIVER_DISPATCH
)(
452 IN
struct _DEVICE_OBJECT
*DeviceObject
,
453 IN
struct _IRP
*Irp
);
454 typedef DRIVER_DISPATCH
*PDRIVER_DISPATCH
;
457 (DDKAPI
*PIO_DPC_ROUTINE
)(
458 IN
struct _KDPC
*Dpc
,
459 IN
struct _DEVICE_OBJECT
*DeviceObject
,
464 (DDKAPI
*PMM_DLL_INITIALIZE
)(
465 IN PUNICODE_STRING RegistryPath
);
468 (DDKAPI
*PMM_DLL_UNLOAD
)(
472 (DDKAPI DRIVER_INITIALIZE
)(
473 IN
struct _DRIVER_OBJECT
*DriverObject
,
474 IN PUNICODE_STRING RegistryPath
);
475 typedef DRIVER_INITIALIZE
*PDRIVER_INITIALIZE
;
478 (DDKAPI KSERVICE_ROUTINE
)(
479 IN
struct _KINTERRUPT
*Interrupt
,
480 IN PVOID ServiceContext
);
481 typedef KSERVICE_ROUTINE
*PKSERVICE_ROUTINE
;
484 typedef UCHAR KPROCESSOR_MODE
;
485 typedef LONG KPRIORITY
;
486 typedef PVOID PSECURITY_DESCRIPTOR
;
487 typedef ULONG SECURITY_INFORMATION
, *PSECURITY_INFORMATION
;
489 /* Structures not exposed to drivers */
490 typedef struct _OBJECT_TYPE
*POBJECT_TYPE
;
491 typedef struct _HAL_DISPATCH_TABLE
*PHAL_DISPATCH_TABLE
;
492 typedef struct _HAL_PRIVATE_DISPATCH_TABLE
*PHAL_PRIVATE_DISPATCH_TABLE
;
493 typedef struct _DEVICE_HANDLER_OBJECT
*PDEVICE_HANDLER_OBJECT
;
494 typedef struct _BUS_HANDLER
*PBUS_HANDLER
;
496 typedef struct _ADAPTER_OBJECT
*PADAPTER_OBJECT
;
497 typedef struct _CALLBACK_OBJECT
*PCALLBACK_OBJECT
;
498 typedef struct _ETHREAD
*PETHREAD
;
499 typedef struct _EPROCESS
*PEPROCESS
;
500 typedef struct _IO_TIMER
*PIO_TIMER
;
501 typedef struct _KINTERRUPT
*PKINTERRUPT
;
502 typedef struct _KPROCESS
*PKPROCESS
;
503 typedef struct _KTHREAD
*PKTHREAD
, *PRKTHREAD
;
506 typedef struct _CONTEXT
*PCONTEXT
;
509 // Resource list definitions
511 typedef int CM_RESOURCE_TYPE
;
513 #define CmResourceTypeNull 0
514 #define CmResourceTypePort 1
515 #define CmResourceTypeInterrupt 2
516 #define CmResourceTypeMemory 3
517 #define CmResourceTypeDma 4
518 #define CmResourceTypeDeviceSpecific 5
519 #define CmResourceTypeBusNumber 6
520 #define CmResourceTypeNonArbitrated 128
521 #define CmResourceTypeConfigData 128
522 #define CmResourceTypeDevicePrivate 129
523 #define CmResourceTypePcCardConfig 130
524 #define CmResourceTypeMfCardConfig 131
526 typedef enum _INTERFACE_TYPE
{
527 InterfaceTypeUndefined
= -1,
545 } INTERFACE_TYPE
, *PINTERFACE_TYPE
;
547 /* IO_RESOURCE_DESCRIPTOR.Option */
549 #define IO_RESOURCE_PREFERRED 0x01
550 #define IO_RESOURCE_DEFAULT 0x02
551 #define IO_RESOURCE_ALTERNATIVE 0x08
553 typedef struct _IO_RESOURCE_DESCRIPTOR
{
556 UCHAR ShareDisposition
;
564 PHYSICAL_ADDRESS MinimumAddress
;
565 PHYSICAL_ADDRESS MaximumAddress
;
570 PHYSICAL_ADDRESS MinimumAddress
;
571 PHYSICAL_ADDRESS MaximumAddress
;
578 ULONG MinimumChannel
;
579 ULONG MaximumChannel
;
584 PHYSICAL_ADDRESS MinimumAddress
;
585 PHYSICAL_ADDRESS MaximumAddress
;
602 } IO_RESOURCE_DESCRIPTOR
, *PIO_RESOURCE_DESCRIPTOR
;
604 typedef struct _IO_RESOURCE_LIST
{
608 IO_RESOURCE_DESCRIPTOR Descriptors
[1];
609 } IO_RESOURCE_LIST
, *PIO_RESOURCE_LIST
;
611 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST
{
613 INTERFACE_TYPE InterfaceType
;
617 ULONG AlternativeLists
;
618 IO_RESOURCE_LIST List
[1];
619 } IO_RESOURCE_REQUIREMENTS_LIST
, *PIO_RESOURCE_REQUIREMENTS_LIST
;
624 extern ULONG NtGlobalFlag
;
627 #include <pshpack4.h>
628 typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR
{
630 UCHAR ShareDisposition
;
634 PHYSICAL_ADDRESS Start
;
638 PHYSICAL_ADDRESS Start
;
646 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
648 __GNU_EXTENSION
union {
664 PHYSICAL_ADDRESS Start
;
684 } DeviceSpecificData
;
685 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
687 PHYSICAL_ADDRESS Start
;
691 PHYSICAL_ADDRESS Start
;
695 PHYSICAL_ADDRESS Start
;
700 } CM_PARTIAL_RESOURCE_DESCRIPTOR
, *PCM_PARTIAL_RESOURCE_DESCRIPTOR
;
704 // Section map options
706 typedef enum _SECTION_INHERIT
{
712 // Section access rights
714 #define SECTION_QUERY 0x0001
715 #define SECTION_MAP_WRITE 0x0002
716 #define SECTION_MAP_READ 0x0004
717 #define SECTION_MAP_EXECUTE 0x0008
718 #define SECTION_EXTEND_SIZE 0x0010
719 #define SECTION_MAP_EXECUTE_EXPLICIT 0x0020
721 #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
722 SECTION_MAP_WRITE | \
724 SECTION_MAP_EXECUTE | \
727 #define SESSION_QUERY_ACCESS 0x0001
728 #define SESSION_MODIFY_ACCESS 0x0002
730 #define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
731 SESSION_QUERY_ACCESS | \
732 SESSION_MODIFY_ACCESS)
736 #define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
738 #define PAGE_NOACCESS 0x01
739 #define PAGE_READONLY 0x02
740 #define PAGE_READWRITE 0x04
741 #define PAGE_WRITECOPY 0x08
742 #define PAGE_EXECUTE 0x10
743 #define PAGE_EXECUTE_READ 0x20
744 #define PAGE_EXECUTE_READWRITE 0x40
745 #define PAGE_EXECUTE_WRITECOPY 0x80
746 #define PAGE_GUARD 0x100
747 #define PAGE_NOCACHE 0x200
748 #define PAGE_WRITECOMBINE 0x400
750 #define MEM_COMMIT 0x1000
751 #define MEM_RESERVE 0x2000
752 #define MEM_DECOMMIT 0x4000
753 #define MEM_RELEASE 0x8000
754 #define MEM_FREE 0x10000
755 #define MEM_PRIVATE 0x20000
756 #define MEM_MAPPED 0x40000
757 #define MEM_RESET 0x80000
758 #define MEM_TOP_DOWN 0x100000
759 #define MEM_LARGE_PAGES 0x20000000
760 #define MEM_4MB_PAGES 0x80000000
762 #define SEC_RESERVE 0x4000000
763 #define SEC_LARGE_PAGES 0x80000000
765 #define PROCESS_DUP_HANDLE (0x0040)
767 #if (NTDDI_VERSION >= NTDDI_VISTA)
768 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
771 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
778 // Processor features
780 #define PF_FLOATING_POINT_PRECISION_ERRATA 0
781 #define PF_FLOATING_POINT_EMULATED 1
782 #define PF_COMPARE_EXCHANGE_DOUBLE 2
783 #define PF_MMX_INSTRUCTIONS_AVAILABLE 3
784 #define PF_PPC_MOVEMEM_64BIT_OK 4
785 #define PF_ALPHA_BYTE_INSTRUCTIONS 5
786 #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
787 #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
788 #define PF_RDTSC_INSTRUCTION_AVAILABLE 8
789 #define PF_PAE_ENABLED 9
790 #define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
791 #define PF_SSE_DAZ_MODE_AVAILABLE 11
792 #define PF_NX_ENABLED 12
793 #define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
794 #define PF_COMPARE_EXCHANGE128 14
795 #define PF_COMPARE64_EXCHANGE128 15
796 #define PF_CHANNELS_ENABLED 16
801 // Intrinsics (note: taken from our winnt.h)
804 #if defined(__GNUC__)
806 static __inline__ BOOLEAN
807 InterlockedBitTestAndSet(IN LONG
volatile *Base
,
812 __asm__
__volatile__("lock "
815 :"=r" (OldBit
),"+m" (*Base
)
820 return (_InterlockedOr(Base
, 1 << Bit
) >> Bit
) & 1;
824 static __inline__ BOOLEAN
825 InterlockedBitTestAndReset(IN LONG
volatile *Base
,
830 __asm__
__volatile__("lock "
833 :"=r" (OldBit
),"+m" (*Base
)
838 return (_InterlockedAnd(Base
, ~(1 << Bit
)) >> Bit
) & 1;
844 #define BitScanForward _BitScanForward
845 #define BitScanReverse _BitScanReverse
847 #define BitTest _bittest
848 #define BitTestAndComplement _bittestandcomplement
849 #define BitTestAndSet _bittestandset
850 #define BitTestAndReset _bittestandreset
851 #define InterlockedBitTestAndSet _interlockedbittestandset
852 #define InterlockedBitTestAndReset _interlockedbittestandreset
855 /** INTERLOCKED FUNCTIONS *****************************************************/
857 #if !defined(__INTERLOCKED_DECLARED)
858 #define __INTERLOCKED_DECLARED
861 #if defined(NO_INTERLOCKED_INTRINSICS)
865 InterlockedIncrement(
866 IN OUT LONG
volatile *Addend
);
871 InterlockedDecrement(
872 IN OUT LONG
volatile *Addend
);
877 InterlockedCompareExchange(
878 IN OUT LONG
volatile *Destination
,
886 IN OUT LONG
volatile *Destination
,
892 InterlockedExchangeAdd(
893 IN OUT LONG
volatile *Addend
,
896 #else // !defined(NO_INTERLOCKED_INTRINSICS)
898 #define InterlockedExchange _InterlockedExchange
899 #define InterlockedIncrement _InterlockedIncrement
900 #define InterlockedDecrement _InterlockedDecrement
901 #define InterlockedExchangeAdd _InterlockedExchangeAdd
902 #define InterlockedCompareExchange _InterlockedCompareExchange
903 #define InterlockedOr _InterlockedOr
904 #define InterlockedAnd _InterlockedAnd
905 #define InterlockedXor _InterlockedXor
907 #endif // !defined(NO_INTERLOCKED_INTRINSICS)
909 #endif // defined (_X86_)
911 #if !defined (_WIN64)
914 * InterlockedExchangePointer(
915 * IN OUT PVOID volatile *Target,
918 #define InterlockedExchangePointer(Target, Value) \
919 ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
923 * InterlockedCompareExchangePointer(
924 * IN OUT PVOID *Destination,
926 * IN PVOID Comparand)
928 #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
929 ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
931 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
932 #define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
933 #define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
935 #endif // !defined (_WIN64)
937 #if defined (_M_AMD64)
939 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONGLONG *)a, (LONGLONG)b)
940 #define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONGLONG *)a)
941 #define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONGLONG *)a)
942 #define InterlockedAnd _InterlockedAnd
943 #define InterlockedOr _InterlockedOr
944 #define InterlockedXor _InterlockedXor
945 #define InterlockedIncrement _InterlockedIncrement
946 #define InterlockedDecrement _InterlockedDecrement
947 #define InterlockedAdd _InterlockedAdd
948 #define InterlockedExchange _InterlockedExchange
949 #define InterlockedExchangeAdd _InterlockedExchangeAdd
950 #define InterlockedCompareExchange _InterlockedCompareExchange
951 #define InterlockedAnd64 _InterlockedAnd64
952 #define InterlockedOr64 _InterlockedOr64
953 #define InterlockedXor64 _InterlockedXor64
954 #define InterlockedIncrement64 _InterlockedIncrement64
955 #define InterlockedDecrement64 _InterlockedDecrement64
956 #define InterlockedAdd64 _InterlockedAdd64
957 #define InterlockedExchange64 _InterlockedExchange64
958 #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
959 #define InterlockedCompareExchange64 _InterlockedCompareExchange64
960 #define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
961 #define InterlockedExchangePointer _InterlockedExchangePointer
962 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
963 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
967 #if defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
968 //#if !defined(_X86AMD64_) // FIXME: what's _X86AMD64_ used for?
972 IN OUT LONG64
volatile *Addend
,
975 return InterlockedExchangeAdd64(Addend
, Value
) + Value
;
980 #endif /* !__INTERLOCKED_DECLARED */
983 #define YieldProcessor _mm_pause
984 #elif defined (_M_AMD64)
985 #define YieldProcessor _mm_pause
986 #elif defined(_M_PPC)
987 #define YieldProcessor() __asm__ __volatile__("nop");
988 #elif defined(_M_MIPS)
989 #define YieldProcessor() __asm__ __volatile__("nop");
990 #elif defined(_M_ARM)
991 #define YieldProcessor()
993 #error Unknown architecture
1001 #ifndef _SLIST_HEADER_
1002 #define _SLIST_HEADER_
1005 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY
*PSLIST_ENTRY
;
1006 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY
{
1009 typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER
{
1011 ULONGLONG Alignment
;
1016 ULONGLONG Sequence
:9;
1017 ULONGLONG NextEntry
:39;
1018 ULONGLONG HeaderType
:1;
1020 ULONGLONG Reserved
:59;
1025 ULONGLONG Sequence
:48;
1026 ULONGLONG HeaderType
:1;
1028 ULONGLONG Reserved
:2;
1029 ULONGLONG NextEntry
:60;
1031 } SLIST_HEADER
, *PSLIST_HEADER
;
1033 #define SLIST_ENTRY SINGLE_LIST_ENTRY
1034 #define _SLIST_ENTRY _SINGLE_LIST_ENTRY
1035 #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
1036 typedef union _SLIST_HEADER
{
1037 ULONGLONG Alignment
;
1043 } SLIST_HEADER
, *PSLIST_HEADER
;
1046 #endif /* _SLIST_HEADER_ */
1051 // Power States/Levels
1053 typedef enum _SYSTEM_POWER_STATE
{
1054 PowerSystemUnspecified
,
1056 PowerSystemSleeping1
,
1057 PowerSystemSleeping2
,
1058 PowerSystemSleeping3
,
1059 PowerSystemHibernate
,
1060 PowerSystemShutdown
,
1062 } SYSTEM_POWER_STATE
, *PSYSTEM_POWER_STATE
;
1064 #define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
1066 typedef enum _POWER_INFORMATION_LEVEL
{
1067 SystemPowerPolicyAc
,
1068 SystemPowerPolicyDc
,
1069 VerifySystemPolicyAc
,
1070 VerifySystemPolicyDc
,
1071 SystemPowerCapabilities
,
1073 SystemPowerStateHandler
,
1074 ProcessorStateHandler
,
1075 SystemPowerPolicyCurrent
,
1076 AdministratorPowerPolicy
,
1077 SystemReserveHiberFile
,
1078 ProcessorInformation
,
1079 SystemPowerInformation
,
1080 ProcessorStateHandler2
,
1083 SystemExecutionState
,
1084 SystemPowerStateNotifyHandler
,
1085 ProcessorPowerPolicyAc
,
1086 ProcessorPowerPolicyDc
,
1087 VerifyProcessorPowerPolicyAc
,
1088 VerifyProcessorPowerPolicyDc
,
1089 ProcessorPowerPolicyCurrent
1090 } POWER_INFORMATION_LEVEL
;
1094 PowerActionReserved
,
1096 PowerActionHibernate
,
1097 PowerActionShutdown
,
1098 PowerActionShutdownReset
,
1099 PowerActionShutdownOff
,
1100 PowerActionWarmEject
1101 } POWER_ACTION
, *PPOWER_ACTION
;
1103 typedef enum _DEVICE_POWER_STATE
{
1104 PowerDeviceUnspecified
,
1110 } DEVICE_POWER_STATE
, *PDEVICE_POWER_STATE
;
1112 #define ES_SYSTEM_REQUIRED 0x00000001
1113 #define ES_DISPLAY_REQUIRED 0x00000002
1114 #define ES_USER_PRESENT 0x00000004
1115 #define ES_CONTINUOUS 0x80000000
1117 typedef ULONG EXECUTION_STATE
;
1127 // Access/Security Stuff
1129 typedef ULONG ACCESS_MASK
, *PACCESS_MASK
;
1130 typedef PVOID PACCESS_TOKEN
;
1132 #define DELETE 0x00010000L
1133 #define READ_CONTROL 0x00020000L
1134 #define WRITE_DAC 0x00040000L
1135 #define WRITE_OWNER 0x00080000L
1136 #define SYNCHRONIZE 0x00100000L
1137 #define STANDARD_RIGHTS_REQUIRED 0x000F0000L
1138 #define STANDARD_RIGHTS_READ READ_CONTROL
1139 #define STANDARD_RIGHTS_WRITE READ_CONTROL
1140 #define STANDARD_RIGHTS_EXECUTE READ_CONTROL
1141 #define STANDARD_RIGHTS_ALL 0x001F0000L
1142 #define SPECIFIC_RIGHTS_ALL 0x0000FFFFL
1143 #define ACCESS_SYSTEM_SECURITY 0x01000000L
1144 #define MAXIMUM_ALLOWED 0x02000000L
1145 #define GENERIC_READ 0x80000000L
1146 #define GENERIC_WRITE 0x40000000L
1147 #define GENERIC_EXECUTE 0x20000000L
1148 #define GENERIC_ALL 0x10000000L
1150 typedef struct _GENERIC_MAPPING
{
1151 ACCESS_MASK GenericRead
;
1152 ACCESS_MASK GenericWrite
;
1153 ACCESS_MASK GenericExecute
;
1154 ACCESS_MASK GenericAll
;
1155 } GENERIC_MAPPING
, *PGENERIC_MAPPING
;
1157 #define ACL_REVISION 2
1158 #define ACL_REVISION_DS 4
1160 #define ACL_REVISION1 1
1161 #define ACL_REVISION2 2
1162 #define ACL_REVISION3 3
1163 #define ACL_REVISION4 4
1164 #define MIN_ACL_REVISION ACL_REVISION2
1165 #define MAX_ACL_REVISION ACL_REVISION4
1167 typedef struct _ACL
{
1178 // Current security descriptor revision value
1180 #define SECURITY_DESCRIPTOR_REVISION (1)
1181 #define SECURITY_DESCRIPTOR_REVISION1 (1)
1184 // Privilege attributes
1186 #define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
1187 #define SE_PRIVILEGE_ENABLED (0x00000002L)
1188 #define SE_PRIVILEGE_REMOVED (0X00000004L)
1189 #define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
1191 #define SE_PRIVILEGE_VALID_ATTRIBUTES (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
1192 SE_PRIVILEGE_ENABLED | \
1193 SE_PRIVILEGE_REMOVED | \
1194 SE_PRIVILEGE_USED_FOR_ACCESS)
1196 #include <pshpack4.h>
1197 typedef struct _LUID_AND_ATTRIBUTES
{
1200 } LUID_AND_ATTRIBUTES
, *PLUID_AND_ATTRIBUTES
;
1201 #include <poppack.h>
1202 typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY
[ANYSIZE_ARRAY
];
1203 typedef LUID_AND_ATTRIBUTES_ARRAY
*PLUID_AND_ATTRIBUTES_ARRAY
;
1210 #define PRIVILEGE_SET_ALL_NECESSARY (1)
1212 typedef struct _PRIVILEGE_SET
{
1213 ULONG PrivilegeCount
;
1215 LUID_AND_ATTRIBUTES Privilege
[ANYSIZE_ARRAY
];
1216 } PRIVILEGE_SET
,*PPRIVILEGE_SET
;
1218 typedef enum _SECURITY_IMPERSONATION_LEVEL
{
1220 SecurityIdentification
,
1221 SecurityImpersonation
,
1223 } SECURITY_IMPERSONATION_LEVEL
, * PSECURITY_IMPERSONATION_LEVEL
;
1225 #define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
1226 #define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
1227 #define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
1228 #define VALID_IMPERSONATION_LEVEL(Level) (((Level) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((Level) <= SECURITY_MAX_IMPERSONATION_LEVEL))
1230 #define SECURITY_DYNAMIC_TRACKING (TRUE)
1231 #define SECURITY_STATIC_TRACKING (FALSE)
1233 typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE
, *PSECURITY_CONTEXT_TRACKING_MODE
;
1235 typedef struct _SECURITY_QUALITY_OF_SERVICE
{
1237 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
;
1238 SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode
;
1239 BOOLEAN EffectiveOnly
;
1240 } SECURITY_QUALITY_OF_SERVICE
, *PSECURITY_QUALITY_OF_SERVICE
;
1242 typedef struct _SE_IMPERSONATION_STATE
{
1243 PACCESS_TOKEN Token
;
1245 BOOLEAN EffectiveOnly
;
1246 SECURITY_IMPERSONATION_LEVEL Level
;
1247 } SE_IMPERSONATION_STATE
, *PSE_IMPERSONATION_STATE
;
1249 #define OWNER_SECURITY_INFORMATION (0x00000001L)
1250 #define GROUP_SECURITY_INFORMATION (0x00000002L)
1251 #define DACL_SECURITY_INFORMATION (0x00000004L)
1252 #define SACL_SECURITY_INFORMATION (0x00000008L)
1253 #define LABEL_SECURITY_INFORMATION (0x00000010L)
1255 #define PROTECTED_DACL_SECURITY_INFORMATION (0x80000000L)
1256 #define PROTECTED_SACL_SECURITY_INFORMATION (0x40000000L)
1257 #define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L)
1258 #define UNPROTECTED_SACL_SECURITY_INFORMATION (0x10000000L)
1263 // Registry Access Rights
1265 #define KEY_QUERY_VALUE (0x0001)
1266 #define KEY_SET_VALUE (0x0002)
1267 #define KEY_CREATE_SUB_KEY (0x0004)
1268 #define KEY_ENUMERATE_SUB_KEYS (0x0008)
1269 #define KEY_NOTIFY (0x0010)
1270 #define KEY_CREATE_LINK (0x0020)
1271 #define KEY_WOW64_32KEY (0x0200)
1272 #define KEY_WOW64_64KEY (0x0100)
1273 #define KEY_WOW64_RES (0x0300)
1275 #define KEY_READ ((STANDARD_RIGHTS_READ |\
1277 KEY_ENUMERATE_SUB_KEYS |\
1282 #define KEY_WRITE ((STANDARD_RIGHTS_WRITE |\
1284 KEY_CREATE_SUB_KEY) \
1288 #define KEY_EXECUTE ((KEY_READ) \
1292 #define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL |\
1295 KEY_CREATE_SUB_KEY |\
1296 KEY_ENUMERATE_SUB_KEYS |\
1303 // Registry Open/Create Options
1305 #define REG_OPTION_RESERVED (0x00000000L)
1306 #define REG_OPTION_NON_VOLATILE (0x00000000L)
1307 #define REG_OPTION_VOLATILE (0x00000001L)
1308 #define REG_OPTION_CREATE_LINK (0x00000002L)
1309 #define REG_OPTION_BACKUP_RESTORE (0x00000004L)
1310 #define REG_OPTION_OPEN_LINK (0x00000008L)
1312 #define REG_LEGAL_OPTION \
1313 (REG_OPTION_RESERVED |\
1314 REG_OPTION_NON_VOLATILE |\
1315 REG_OPTION_VOLATILE |\
1316 REG_OPTION_CREATE_LINK |\
1317 REG_OPTION_BACKUP_RESTORE |\
1318 REG_OPTION_OPEN_LINK)
1321 // Key creation/open disposition
1323 #define REG_CREATED_NEW_KEY (0x00000001L)
1324 #define REG_OPENED_EXISTING_KEY (0x00000002L)
1327 // Key restore & hive load flags
1329 #define REG_WHOLE_HIVE_VOLATILE (0x00000001L)
1330 #define REG_REFRESH_HIVE (0x00000002L)
1331 #define REG_NO_LAZY_FLUSH (0x00000004L)
1332 #define REG_FORCE_RESTORE (0x00000008L)
1333 #define REG_APP_HIVE (0x00000010L)
1334 #define REG_PROCESS_PRIVATE (0x00000020L)
1335 #define REG_START_JOURNAL (0x00000040L)
1336 #define REG_HIVE_EXACT_FILE_GROWTH (0x00000080L)
1337 #define REG_HIVE_NO_RM (0x00000100L)
1338 #define REG_HIVE_SINGLE_LOG (0x00000200L)
1343 #define REG_FORCE_UNLOAD 1
1346 // Notify Filter Values
1348 #define REG_NOTIFY_CHANGE_NAME (0x00000001L)
1349 #define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L)
1350 #define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L)
1351 #define REG_NOTIFY_CHANGE_SECURITY (0x00000008L)
1353 #define REG_LEGAL_CHANGE_FILTER \
1354 (REG_NOTIFY_CHANGE_NAME |\
1355 REG_NOTIFY_CHANGE_ATTRIBUTES |\
1356 REG_NOTIFY_CHANGE_LAST_SET |\
1357 REG_NOTIFY_CHANGE_SECURITY)
1362 // Thread Access Rights
1364 #define THREAD_TERMINATE (0x0001)
1365 #define THREAD_SUSPEND_RESUME (0x0002)
1366 #define THREAD_ALERT (0x0004)
1367 #define THREAD_GET_CONTEXT (0x0008)
1368 #define THREAD_SET_CONTEXT (0x0010)
1369 #define THREAD_SET_INFORMATION (0x0020)
1370 #define THREAD_SET_LIMITED_INFORMATION (0x0400)
1371 #define THREAD_QUERY_LIMITED_INFORMATION (0x0800)
1372 #if (NTDDI_VERSION >= NTDDI_VISTA)
1373 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
1376 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
1381 // Service Start Types
1383 #define SERVICE_BOOT_START 0x00000000
1384 #define SERVICE_SYSTEM_START 0x00000001
1385 #define SERVICE_AUTO_START 0x00000002
1386 #define SERVICE_DEMAND_START 0x00000003
1387 #define SERVICE_DISABLED 0x00000004
1390 // Exception Records
1392 #define EXCEPTION_NONCONTINUABLE 1
1393 #define EXCEPTION_MAXIMUM_PARAMETERS 15
1395 typedef struct _EXCEPTION_RECORD
{
1396 NTSTATUS ExceptionCode
;
1397 ULONG ExceptionFlags
;
1398 struct _EXCEPTION_RECORD
*ExceptionRecord
;
1399 PVOID ExceptionAddress
;
1400 ULONG NumberParameters
;
1401 ULONG_PTR ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
1402 } EXCEPTION_RECORD
, *PEXCEPTION_RECORD
;
1404 typedef struct _EXCEPTION_RECORD32
{
1405 NTSTATUS ExceptionCode
;
1406 ULONG ExceptionFlags
;
1407 ULONG ExceptionRecord
;
1408 ULONG ExceptionAddress
;
1409 ULONG NumberParameters
;
1410 ULONG ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
1411 } EXCEPTION_RECORD32
, *PEXCEPTION_RECORD32
;
1413 typedef struct _EXCEPTION_RECORD64
{
1414 NTSTATUS ExceptionCode
;
1415 ULONG ExceptionFlags
;
1416 ULONG64 ExceptionRecord
;
1417 ULONG64 ExceptionAddress
;
1418 ULONG NumberParameters
;
1419 ULONG __unusedAlignment
;
1420 ULONG64 ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
1421 } EXCEPTION_RECORD64
, *PEXCEPTION_RECORD64
;
1423 typedef struct _EXCEPTION_POINTERS
{
1424 PEXCEPTION_RECORD ExceptionRecord
;
1425 PCONTEXT ContextRecord
;
1426 } EXCEPTION_POINTERS
, *PEXCEPTION_POINTERS
;
1433 typedef struct _QUOTA_LIMITS
{
1434 SIZE_T PagedPoolLimit
;
1435 SIZE_T NonPagedPoolLimit
;
1436 SIZE_T MinimumWorkingSetSize
;
1437 SIZE_T MaximumWorkingSetSize
;
1438 SIZE_T PagefileLimit
;
1439 LARGE_INTEGER TimeLimit
;
1440 } QUOTA_LIMITS
, *PQUOTA_LIMITS
;
1442 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
1443 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
1444 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
1445 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
1446 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
1449 /******************************************************************************
1450 * WINBASE Functions *
1451 ******************************************************************************/
1452 #if !defined(_WINBASE_)
1456 #define InterlockedPopEntrySList(Head) \
1457 ExpInterlockedPopEntrySList(Head)
1459 #define InterlockedPushEntrySList(Head, Entry) \
1460 ExpInterlockedPushEntrySList(Head, Entry)
1462 #define InterlockedFlushSList(Head) \
1463 ExpInterlockedFlushSList(Head)
1465 #define QueryDepthSList(Head) \
1466 ExQueryDepthSList(Head)
1468 #else // !defined(_WIN64)
1473 InterlockedPopEntrySList(
1474 IN PSLIST_HEADER ListHead
);
1479 InterlockedPushEntrySList(
1480 IN PSLIST_HEADER ListHead
,
1481 IN PSLIST_ENTRY ListEntry
);
1483 #define InterlockedFlushSList(ListHead) \
1484 ExInterlockedFlushSList(ListHead)
1486 #define QueryDepthSList(Head) \
1487 ExQueryDepthSList(Head)
1489 #endif // !defined(_WIN64)
1491 #endif // !defined(_WINBASE_)
1494 /******************************************************************************
1496 ******************************************************************************/
1498 typedef struct _DISPATCHER_HEADER
1500 __GNU_EXTENSION
union
1502 __GNU_EXTENSION
struct
1505 __GNU_EXTENSION
union
1510 __GNU_EXTENSION
union
1515 __GNU_EXTENSION
union
1518 BOOLEAN DebugActive
;
1524 LIST_ENTRY WaitListHead
;
1525 } DISPATCHER_HEADER
, *PDISPATCHER_HEADER
;
1527 typedef ULONG_PTR KSPIN_LOCK
, *PKSPIN_LOCK
;
1529 typedef struct _KEVENT
{
1530 DISPATCHER_HEADER Header
;
1531 } KEVENT
, *PKEVENT
, *RESTRICTED_POINTER PRKEVENT
;
1533 typedef struct _KSEMAPHORE
{
1534 DISPATCHER_HEADER Header
;
1536 } KSEMAPHORE
, *PKSEMAPHORE
, *RESTRICTED_POINTER PRKSEMAPHORE
;
1538 /******************************************************************************
1540 ******************************************************************************/
1542 #define RTL_REGISTRY_ABSOLUTE 0
1543 #define RTL_REGISTRY_SERVICES 1
1544 #define RTL_REGISTRY_CONTROL 2
1545 #define RTL_REGISTRY_WINDOWS_NT 3
1546 #define RTL_REGISTRY_DEVICEMAP 4
1547 #define RTL_REGISTRY_USER 5
1548 #define RTL_REGISTRY_MAXIMUM 6
1549 #define RTL_REGISTRY_HANDLE 0x40000000
1550 #define RTL_REGISTRY_OPTIONAL 0x80000000
1552 /* RTL_QUERY_REGISTRY_TABLE.Flags */
1553 #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001
1554 #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002
1555 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004
1556 #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008
1557 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010
1558 #define RTL_QUERY_REGISTRY_DIRECT 0x00000020
1559 #define RTL_QUERY_REGISTRY_DELETE 0x00000040
1561 typedef struct _RTL_BITMAP
{
1564 } RTL_BITMAP
, *PRTL_BITMAP
;
1566 typedef struct _RTL_BITMAP_RUN
{
1567 ULONG StartingIndex
;
1569 } RTL_BITMAP_RUN
, *PRTL_BITMAP_RUN
;
1572 (DDKAPI
*PRTL_QUERY_REGISTRY_ROUTINE
)(
1576 IN ULONG ValueLength
,
1578 IN PVOID EntryContext
);
1580 typedef struct _RTL_QUERY_REGISTRY_TABLE
{
1581 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine
;
1587 ULONG DefaultLength
;
1588 } RTL_QUERY_REGISTRY_TABLE
, *PRTL_QUERY_REGISTRY_TABLE
;
1590 typedef struct _TIME_FIELDS
{
1597 CSHORT Milliseconds
;
1599 } TIME_FIELDS
, *PTIME_FIELDS
;
1602 /******************************************************************************
1604 ******************************************************************************/
1610 IN PVOID FailedAssertion
,
1612 IN ULONG LineNumber
,
1617 * IN VOID UNALIGNED *Destination,
1618 * IN CONST VOID UNALIGNED *Source,
1621 #define RtlCopyMemory(Destination, Source, Length) \
1622 memcpy(Destination, Source, Length)
1624 #define RtlCopyBytes RtlCopyMemory
1626 #if defined(_M_AMD64)
1630 RtlCopyMemoryNonTemporal(
1631 VOID UNALIGNED
*Destination
,
1632 CONST VOID UNALIGNED
*Source
,
1635 #define RtlCopyMemoryNonTemporal RtlCopyMemory
1643 #define RtlEqualLuid(Luid1, Luid2) \
1644 (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
1648 * IN VOID UNALIGNED *Destination,
1649 * IN CONST VOID UNALIGNED *Source,
1652 #define RtlEqualMemory(Destination, Source, Length) \
1653 (!memcmp(Destination, Source, Length))
1657 * IN VOID UNALIGNED *Destination,
1661 #define RtlFillMemory(Destination, Length, Fill) \
1662 memset(Destination, Fill, Length)
1664 #define RtlFillBytes RtlFillMemory
1669 RtlFreeUnicodeString(
1670 IN PUNICODE_STRING UnicodeString
);
1676 IN PUNICODE_STRING GuidString
,
1682 RtlInitUnicodeString(
1683 IN OUT PUNICODE_STRING DestinationString
,
1684 IN PCWSTR SourceString
);
1688 * IN VOID UNALIGNED *Destination,
1689 * IN CONST VOID UNALIGNED *Source,
1692 #define RtlMoveMemory(Destination, Source, Length) \
1693 memmove(Destination, Source, Length)
1700 OUT PUNICODE_STRING GuidString
);
1704 * IN VOID UNALIGNED *Destination,
1707 #define RtlZeroMemory(Destination, Length) \
1708 memset(Destination, 0, Length)
1710 #define RtlZeroBytes RtlZeroMemory
1713 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1718 IN PRTL_BITMAP BitMapHeader
,
1719 IN ULONG StartingIndex
,
1726 IN PRTL_BITMAP BitMapHeader
,
1727 IN ULONG StartingIndex
,
1733 RtlAnsiStringToUnicodeString(
1734 IN OUT PUNICODE_STRING DestinationString
,
1735 IN PANSI_STRING SourceString
,
1736 IN BOOLEAN AllocateDestinationString
);
1741 RtlxAnsiStringToUnicodeSize(
1742 IN PCANSI_STRING AnsiString
);
1744 #define RtlAnsiStringToUnicodeSize(String) ( \
1745 NLS_MB_CODE_PAGE_TAG ? \
1746 RtlxAnsiStringToUnicodeSize(String) : \
1747 ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
1753 RtlAppendUnicodeStringToString(
1754 IN OUT PUNICODE_STRING Destination
,
1755 IN PCUNICODE_STRING Source
);
1760 RtlAppendUnicodeToString(
1761 IN OUT PUNICODE_STRING Destination
,
1767 RtlCheckRegistryKey(
1768 IN ULONG RelativeTo
,
1775 IN PRTL_BITMAP BitMapHeader
);
1781 IN PRTL_BITMAP BitMapHeader
,
1782 IN ULONG StartingIndex
,
1783 IN ULONG NumberToClear
);
1789 IN CONST VOID
*Source1
,
1790 IN CONST VOID
*Source2
,
1796 RtlCompareUnicodeString(
1797 IN PCUNICODE_STRING String1
,
1798 IN PCUNICODE_STRING String2
,
1799 IN BOOLEAN CaseInSensitive
);
1804 RtlCompareUnicodeStrings(
1806 IN SIZE_T String1Length
,
1808 IN SIZE_T String2Length
,
1809 IN BOOLEAN CaseInSensitive
);
1814 RtlCopyUnicodeString(
1815 IN OUT PUNICODE_STRING DestinationString
,
1816 IN PCUNICODE_STRING SourceString
);
1821 RtlCreateRegistryKey(
1822 IN ULONG RelativeTo
,
1828 RtlCreateSecurityDescriptor(
1829 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
1835 RtlDeleteRegistryValue(
1836 IN ULONG RelativeTo
,
1838 IN PCWSTR ValueName
);
1843 RtlEqualUnicodeString(
1844 IN CONST UNICODE_STRING
*String1
,
1845 IN CONST UNICODE_STRING
*String2
,
1846 IN BOOLEAN CaseInSensitive
);
1848 #if !defined(_AMD64_) && !defined(_IA64_)
1852 RtlExtendedIntegerMultiply(
1853 IN LARGE_INTEGER Multiplicand
,
1854 IN LONG Multiplier
);
1859 RtlExtendedLargeIntegerDivide(
1860 IN LARGE_INTEGER Dividend
,
1862 IN OUT PULONG Remainder
);
1865 #if defined(_X86_) || defined(_IA64_)
1869 RtlExtendedMagicDivide(
1870 IN LARGE_INTEGER Dividend
,
1871 IN LARGE_INTEGER MagicDivisor
,
1872 IN CCHAR ShiftCount
);
1879 IN PANSI_STRING AnsiString
);
1885 IN PRTL_BITMAP BitMapHeader
,
1886 IN ULONG NumberToFind
,
1887 IN ULONG HintIndex
);
1892 RtlFindClearBitsAndSet(
1893 IN PRTL_BITMAP BitMapHeader
,
1894 IN ULONG NumberToFind
,
1895 IN ULONG HintIndex
);
1900 RtlFindFirstRunClear(
1901 IN PRTL_BITMAP BitMapHeader
,
1902 OUT PULONG StartingIndex
);
1908 IN PRTL_BITMAP BitMapHeader
,
1909 OUT PRTL_BITMAP_RUN RunArray
,
1910 IN ULONG SizeOfRunArray
,
1911 IN BOOLEAN LocateLongestRuns
);
1916 RtlFindLastBackwardRunClear(
1917 IN PRTL_BITMAP BitMapHeader
,
1919 OUT PULONG StartingRunIndex
);
1924 RtlFindLeastSignificantBit(
1930 RtlFindLongestRunClear(
1931 IN PRTL_BITMAP BitMapHeader
,
1932 OUT PULONG StartingIndex
);
1937 RtlFindMostSignificantBit(
1943 RtlFindNextForwardRunClear(
1944 IN PRTL_BITMAP BitMapHeader
,
1946 OUT PULONG StartingRunIndex
);
1952 IN PRTL_BITMAP BitMapHeader
,
1953 IN ULONG NumberToFind
,
1954 IN ULONG HintIndex
);
1959 RtlFindSetBitsAndClear(
1960 IN PRTL_BITMAP BitMapHeader
,
1961 IN ULONG NumberToFind
,
1962 IN ULONG HintIndex
);
1967 RtlHashUnicodeString(
1968 IN CONST UNICODE_STRING
*String
,
1969 IN BOOLEAN CaseInSensitive
,
1970 IN ULONG HashAlgorithm
,
1971 OUT PULONG HashValue
);
1977 IN OUT PANSI_STRING DestinationString
,
1978 IN PCSZ SourceString
);
1983 RtlInitializeBitMap(
1984 IN PRTL_BITMAP BitMapHeader
,
1985 IN PULONG BitMapBuffer
,
1986 IN ULONG SizeOfBitMap
);
1992 IN OUT PSTRING DestinationString
,
1993 IN PCSZ SourceString
);
1998 RtlIntegerToUnicodeString(
2000 IN ULONG Base OPTIONAL
,
2001 IN OUT PUNICODE_STRING String
);
2006 RtlInt64ToUnicodeString(
2008 IN ULONG Base OPTIONAL
,
2009 IN OUT PUNICODE_STRING String
);
2012 #define RtlIntPtrToUnicodeString(Value, Base, String) \
2013 RtlInt64ToUnicodeString(Value, Base, String)
2015 #define RtlIntPtrToUnicodeString(Value, Base, String) \
2016 RtlIntegerToUnicodeString(Value, Base, String)
2023 #define RtlIsZeroLuid(_L1) \
2024 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
2029 RtlLengthSecurityDescriptor(
2030 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
2035 RtlNumberOfClearBits(
2036 IN PRTL_BITMAP BitMapHeader
);
2042 IN PRTL_BITMAP BitMapHeader
);
2047 RtlQueryRegistryValues(
2048 IN ULONG RelativeTo
,
2050 IN PRTL_QUERY_REGISTRY_TABLE QueryTable
,
2052 IN PVOID Environment OPTIONAL
);
2054 #define LONG_SIZE (sizeof(LONG))
2055 #define LONG_MASK (LONG_SIZE - 1)
2059 * PULONG DestinationAddress,
2060 * PULONG SourceAddress);
2062 #if defined(_AMD64_)
2063 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
2064 *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
2066 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
2067 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
2069 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
2070 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
2071 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
2072 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
2076 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
2081 * RtlRetrieveUshort(
2082 * PUSHORT DestinationAddress,
2083 * PUSHORT SourceAddress);
2085 #if defined(_AMD64_)
2086 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
2087 *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
2089 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
2090 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
2092 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
2093 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
2097 *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
2105 IN PRTL_BITMAP BitMapHeader
);
2111 IN PRTL_BITMAP BitMapHeader
,
2112 IN ULONG StartingIndex
,
2113 IN ULONG NumberToSet
);
2118 RtlSetDaclSecurityDescriptor(
2119 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
2120 IN BOOLEAN DaclPresent
,
2121 IN PACL Dacl OPTIONAL
,
2122 IN BOOLEAN DaclDefaulted OPTIONAL
);
2126 * IN PULONG Address,
2129 #if defined(_AMD64_)
2130 #define RtlStoreUlong(Address,Value) \
2131 *(ULONG UNALIGNED *)(Address) = (Value)
2133 #define RtlStoreUlong(Address,Value) \
2134 if ((ULONG_PTR)(Address) & LONG_MASK) { \
2135 ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
2136 ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
2137 ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
2138 ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT] = (UCHAR)(FOURTHBYTE(Value)); \
2141 *((PULONG)(Address)) = (ULONG) (Value); \
2146 * RtlStoreUlonglong(
2147 * IN OUT PULONGLONG Address,
2150 #if defined(_AMD64_)
2151 #define RtlStoreUlonglong(Address,Value) \
2152 *(ULONGLONG UNALIGNED *)(Address) = (Value)
2154 #define RtlStoreUlonglong(Address,Value) \
2155 if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
2156 RtlStoreUlong((ULONG_PTR)(Address), \
2157 (ULONGLONG)(Value) & 0xFFFFFFFF); \
2158 RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
2159 (ULONGLONG)(Value) >> 32); \
2161 *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
2167 * IN OUT PULONG_PTR Address,
2168 * IN ULONG_PTR Value);
2171 #define RtlStoreUlongPtr(Address,Value) \
2172 RtlStoreUlonglong(Address,Value)
2174 #define RtlStoreUlongPtr(Address,Value) \
2175 RtlStoreUlong(Address,Value)
2180 * IN PUSHORT Address,
2183 #if defined(_AMD64_)
2184 #define RtlStoreUshort(Address,Value) \
2185 *(USHORT UNALIGNED *)(Address) = (Value)
2187 #define RtlStoreUshort(Address,Value) \
2188 if ((ULONG_PTR)(Address) & SHORT_MASK) { \
2189 ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
2190 ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
2193 *((PUSHORT) (Address)) = (USHORT)Value; \
2200 RtlTimeFieldsToTime(
2201 IN PTIME_FIELDS TimeFields
,
2202 IN PLARGE_INTEGER Time
);
2207 RtlTimeToTimeFields(
2208 IN PLARGE_INTEGER Time
,
2209 IN PTIME_FIELDS TimeFields
);
2220 RtlUlonglongByteSwap(
2221 IN ULONGLONG Source
);
2226 RtlUnicodeStringToAnsiString(
2227 IN OUT PANSI_STRING DestinationString
,
2228 IN PCUNICODE_STRING SourceString
,
2229 IN BOOLEAN AllocateDestinationString
);
2234 RtlxUnicodeStringToAnsiSize(
2235 IN PCUNICODE_STRING UnicodeString
);
2237 #define RtlUnicodeStringToAnsiSize(String) ( \
2238 NLS_MB_CODE_PAGE_TAG ? \
2239 RtlxUnicodeStringToAnsiSize(String) : \
2240 ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
2246 RtlUnicodeStringToInteger(
2247 IN PCUNICODE_STRING String
,
2248 IN ULONG Base OPTIONAL
,
2254 RtlUpcaseUnicodeChar(
2255 IN WCHAR SourceCharacter
);
2266 RtlValidRelativeSecurityDescriptor(
2267 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput
,
2268 IN ULONG SecurityDescriptorLength
,
2269 IN SECURITY_INFORMATION RequiredInformation
);
2274 RtlValidSecurityDescriptor(
2275 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
2280 RtlWriteRegistryValue(
2281 IN ULONG RelativeTo
,
2283 IN PCWSTR ValueName
,
2286 IN ULONG ValueLength
);
2288 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
2290 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
2294 RtlPrefetchMemoryNonTemporal(
2299 #if (NTDDI_VERSION >= NTDDI_WINXP)
2304 PRTL_BITMAP BitMapHeader
,
2310 RtlDowncaseUnicodeChar(
2311 IN WCHAR SourceCharacter
);
2317 PRTL_BITMAP BitMapHeader
,
2324 IN PRTL_BITMAP BitMapHeader
,
2325 IN ULONG BitNumber
);
2327 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
2329 #if (NTDDI_VERSION >= NTDDI_VISTA)
2333 RtlNumberOfSetBitsUlongPtr(
2334 IN ULONG_PTR Target
);
2339 RtlIoDecodeMemIoResource (
2340 IN PIO_RESOURCE_DESCRIPTOR Descriptor
,
2341 OUT PULONGLONG Alignment OPTIONAL
,
2342 OUT PULONGLONG MinimumAddress OPTIONAL
,
2343 OUT PULONGLONG MaximumAddress OPTIONAL
);
2348 RtlIoEncodeMemIoResource(
2349 IN PIO_RESOURCE_DESCRIPTOR Descriptor
,
2351 IN ULONGLONG Length
,
2352 IN ULONGLONG Alignment
,
2353 IN ULONGLONG MinimumAddress
,
2354 IN ULONGLONG MaximumAddress
);
2359 RtlCmDecodeMemIoResource(
2360 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor
,
2361 OUT PULONGLONG Start OPTIONAL
);
2366 RtlFindClosestEncodableLength(
2367 IN ULONGLONG SourceLength
,
2368 OUT PULONGLONG TargetLength
);
2372 #if !defined(MIDL_PASS)
2373 /* inline funftions */
2374 //DECLSPEC_DEPRECATED_DDK_WINXP
2378 RtlConvertLongToLargeInteger(LONG SignedInteger
)
2381 ret
.QuadPart
= SignedInteger
;
2385 //DECLSPEC_DEPRECATED_DDK_WINXP
2389 RtlConvertUlongToLargeInteger(
2390 ULONG UnsignedInteger
)
2393 ret
.QuadPart
= UnsignedInteger
;
2397 //DECLSPEC_DEPRECATED_DDK
2401 RtlEnlargedUnsignedDivide(
2402 IN ULARGE_INTEGER Dividend
,
2404 IN OUT PULONG Remainder
)
2407 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
2408 return (ULONG
)(Dividend
.QuadPart
/ Divisor
);
2411 //DECLSPEC_DEPRECATED_DDK
2415 RtlEnlargedUnsignedMultiply(
2416 IN ULONG Multiplicand
,
2417 IN ULONG Multiplier
)
2420 ret
.QuadPart
= (ULONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
2424 //DECLSPEC_DEPRECATED_DDK
2428 RtlEnlargedIntegerMultiply(
2429 IN LONG Multiplicand
,
2433 ret
.QuadPart
= (LONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
2439 RtlInitEmptyAnsiString(OUT PANSI_STRING AnsiString
,
2441 IN USHORT BufferSize
)
2443 AnsiString
->Length
= 0;
2444 AnsiString
->MaximumLength
= BufferSize
;
2445 AnsiString
->Buffer
= Buffer
;
2450 RtlInitEmptyUnicodeString(
2451 OUT PUNICODE_STRING UnicodeString
,
2453 IN USHORT BufferSize
)
2455 UnicodeString
->Length
= 0;
2456 UnicodeString
->MaximumLength
= BufferSize
;
2457 UnicodeString
->Buffer
= Buffer
;
2460 #if defined(_AMD64_) || defined(_IA64_)
2464 RtlExtendedIntegerMultiply(
2465 LARGE_INTEGER Multiplicand
,
2469 ret
.QuadPart
= Multiplicand
.QuadPart
* Multiplier
;
2476 RtlExtendedLargeIntegerDivide(
2477 LARGE_INTEGER Dividend
,
2482 ret
.QuadPart
= (ULONG64
)Dividend
.QuadPart
/ Divisor
;
2484 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
2489 #if defined(_AMD64_)
2491 #define MultiplyHigh __mulh
2492 #define UnsignedMultiplyHigh __umulh
2494 //DECLSPEC_DEPRECATED_DDK
2498 RtlExtendedMagicDivide(
2499 IN LARGE_INTEGER Dividend
,
2500 IN LARGE_INTEGER MagicDivisor
,
2501 IN CCHAR ShiftCount
)
2506 Pos
= (Dividend
.QuadPart
>= 0);
2507 ret64
= UnsignedMultiplyHigh(Pos
? Dividend
.QuadPart
: -Dividend
.QuadPart
,
2508 MagicDivisor
.QuadPart
);
2509 ret64
>>= ShiftCount
;
2510 ret
.QuadPart
= Pos
? ret64
: -ret64
;
2515 //DECLSPEC_DEPRECATED_DDK
2520 IN LARGE_INTEGER Addend1
,
2521 IN LARGE_INTEGER Addend2
)
2524 ret
.QuadPart
= Addend1
.QuadPart
+ Addend2
.QuadPart
;
2529 * RtlLargeIntegerAnd(
2530 * IN OUT LARGE_INTEGER Result,
2531 * IN LARGE_INTEGER Source,
2532 * IN LARGE_INTEGER Mask);
2534 #define RtlLargeIntegerAnd(Result, Source, Mask) \
2535 Result.QuadPart = Source.QuadPart & Mask.QuadPart
2537 //DECLSPEC_DEPRECATED_DDK
2541 RtlLargeIntegerArithmeticShift(
2542 IN LARGE_INTEGER LargeInteger
,
2543 IN CCHAR ShiftCount
)
2546 ret
.QuadPart
= LargeInteger
.QuadPart
>> ShiftCount
;
2551 * RtlLargeIntegerEqualTo(
2552 * IN LARGE_INTEGER Operand1,
2553 * IN LARGE_INTEGER Operand2);
2555 #define RtlLargeIntegerEqualTo(X,Y) \
2556 (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
2560 RtlSecureZeroMemory(
2564 volatile char* vptr
= (volatile char*)Pointer
;
2565 #if defined(_M_AMD64)
2566 __stosb((PUCHAR
)vptr
, 0, Size
);
2568 char * endptr
= (char *)vptr
+ Size
;
2569 while (vptr
< endptr
)
2577 #if defined(_M_AMD64)
2581 IN PRTL_BITMAP BitMapHeader
,
2582 IN ULONG BitPosition
)
2584 return BitTest((LONG CONST
*)BitMapHeader
->Buffer
, BitPosition
);
2587 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
2588 #endif // defined(_M_AMD64)
2590 #endif // !defined(MIDL_PASS)
2593 // Byte Swap Functions
2595 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \
2596 ((defined(_M_AMD64) || defined(_M_IA64)) \
2597 && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))
2599 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
2600 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
2601 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
2605 /******************************************************************************
2606 * Memory manager Types *
2607 ******************************************************************************/
2609 typedef struct _MDL
{
2613 struct _EPROCESS
*Process
;
2614 PVOID MappedSystemVa
;
2621 /******************************************************************************
2622 * Memory manager Functions *
2623 ******************************************************************************/
2625 /* PVOID MmGetSystemAddressForMdl(
2628 #define MmGetSystemAddressForMdl(Mdl) \
2629 (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
2630 MDL_SOURCE_IS_NONPAGED_POOL)) ? \
2631 ((Mdl)->MappedSystemVa) : \
2632 (MmMapLockedPages((Mdl), KernelMode)))
2635 * MmGetSystemAddressForMdlSafe(
2637 * IN MM_PAGE_PRIORITY Priority)
2639 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
2640 (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
2641 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
2642 (_Mdl)->MappedSystemVa : \
2643 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
2644 KernelMode, MmCached, NULL, FALSE, (_Priority)))
2646 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2651 IN PMDL MemoryDescriptorList OPTIONAL
,
2658 /******************************************************************************
2659 * I/O Manager Functions *
2660 ******************************************************************************/
2662 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
2663 (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
2665 #define DMA_MACROS_DEFINED
2669 IoAllocateAdapterChannel(
2670 IN PADAPTER_OBJECT AdapterObject
,
2671 IN PDEVICE_OBJECT DeviceObject
,
2672 IN ULONG NumberOfMapRegisters
,
2673 IN PDRIVER_CONTROL ExecutionRoutine
,
2676 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel
;
2677 AllocateAdapterChannel
=
2678 *(DmaAdapter
)->DmaOperations
->AllocateAdapterChannel
;
2679 ASSERT(AllocateAdapterChannel
);
2680 return AllocateAdapterChannel(DmaAdapter
,
2682 NumberOfMapRegisters
,
2689 IoFlushAdapterBuffers(
2690 IN PADAPTER_OBJECT AdapterObject
,
2692 IN PVOID MapRegisterBase
,
2695 IN BOOLEAN WriteToDevice
)
2697 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers
;
2698 FlushAdapterBuffers
= *(DmaAdapter
)->DmaOperations
->FlushAdapterBuffers
;
2699 ASSERT(FlushAdapterBuffers
);
2700 return FlushAdapterBuffers(DmaAdapter
,
2710 IoFreeAdapterChannel(
2711 IN PADAPTER_OBJECT AdapterObject
)
2713 PFREE_ADAPTER_CHANNEL FreeAdapterChannel
;
2714 FreeAdapterChannel
= *(DmaAdapter
)->DmaOperations
->FreeAdapterChannel
;
2715 ASSERT(FreeAdapterChannel
);
2716 FreeAdapterChannel(DmaAdapter
);
2722 IN PADAPTER_OBJECT AdapterObject
,
2723 IN PVOID MapRegisterBase
,
2724 IN ULONG NumberOfMapRegisters
)
2726 PFREE_MAP_REGISTERS FreeMapRegisters
;
2727 FreeMapRegisters
= *(DmaAdapter
)->DmaOperations
->FreeMapRegisters
;
2728 ASSERT(FreeMapRegisters
);
2729 FreeMapRegisters(DmaAdapter
, MapRegisterBase
, NumberOfMapRegisters
);
2735 IN PDMA_ADAPTER DmaAdapter
,
2737 IN PVOID MapRegisterBase
,
2739 IN OUT PULONG Length
,
2740 IN BOOLEAN WriteToDevice
)
2742 PMAP_TRANSFER MapTransfer
;
2744 MapTransfer
= *(DmaAdapter
)->DmaOperations
->MapTransfer
;
2745 ASSERT(MapTransfer
);
2746 return MapTransfer(DmaAdapter
,
2756 /******************************************************************************
2758 ******************************************************************************/
2760 typedef enum _POOL_TYPE
{
2763 NonPagedPoolMustSucceed
,
2765 NonPagedPoolCacheAligned
,
2766 PagedPoolCacheAligned
,
2767 NonPagedPoolCacheAlignedMustS
,
2769 NonPagedPoolSession
= 32,
2771 NonPagedPoolMustSucceedSession
,
2772 DontUseThisTypeSession
,
2773 NonPagedPoolCacheAlignedSession
,
2774 PagedPoolCacheAlignedSession
,
2775 NonPagedPoolCacheAlignedMustSSession
2778 typedef enum _SUITE_TYPE
{
2782 CommunicationServer
,
2784 SmallBusinessRestricted
,
2793 typedef enum _EX_POOL_PRIORITY
{
2795 LowPoolPrioritySpecialPoolOverrun
= 8,
2796 LowPoolPrioritySpecialPoolUnderrun
= 9,
2797 NormalPoolPriority
= 16,
2798 NormalPoolPrioritySpecialPoolOverrun
= 24,
2799 NormalPoolPrioritySpecialPoolUnderrun
= 25,
2800 HighPoolPriority
= 32,
2801 HighPoolPrioritySpecialPoolOverrun
= 40,
2802 HighPoolPrioritySpecialPoolUnderrun
= 41
2805 typedef struct _FAST_MUTEX
2812 } FAST_MUTEX
, *PFAST_MUTEX
;
2814 typedef ULONG_PTR ERESOURCE_THREAD
, *PERESOURCE_THREAD
;
2816 typedef struct _OWNER_ENTRY
{
2817 ERESOURCE_THREAD OwnerThread
;
2818 _ANONYMOUS_UNION
union {
2822 } OWNER_ENTRY
, *POWNER_ENTRY
;
2824 typedef struct _ERESOURCE
2826 LIST_ENTRY SystemResourcesList
;
2827 POWNER_ENTRY OwnerTable
;
2830 volatile PKSEMAPHORE SharedWaiters
;
2831 volatile PKEVENT ExclusiveWaiters
;
2832 OWNER_ENTRY OwnerEntry
;
2833 ULONG ActiveEntries
;
2834 ULONG ContentionCount
;
2835 ULONG NumberOfSharedWaiters
;
2836 ULONG NumberOfExclusiveWaiters
;
2837 __GNU_EXTENSION
union
2840 ULONG_PTR CreatorBackTraceIndex
;
2842 KSPIN_LOCK SpinLock
;
2843 } ERESOURCE
, *PERESOURCE
;
2845 #if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
2846 #define LOOKASIDE_ALIGN
2848 #define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */
2851 typedef struct _LOOKASIDE_LIST_EX
*PLOOKASIDE_LIST_EX
;
2854 (DDKAPI
*PALLOCATE_FUNCTION
)(
2855 IN POOL_TYPE PoolType
,
2856 IN SIZE_T NumberOfBytes
,
2860 (DDKAPI
*PALLOCATE_FUNCTION_EX
)(
2861 IN POOL_TYPE PoolType
,
2862 IN SIZE_T NumberOfBytes
,
2864 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
2867 (DDKAPI
*PFREE_FUNCTION
)(
2871 (DDKAPI
*PFREE_FUNCTION_EX
)(
2873 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
2876 (DDKAPI
*PCALLBACK_FUNCTION
)(
2877 IN PVOID CallbackContext
,
2879 IN PVOID Argument2
);
2881 typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE
{
2883 SLIST_HEADER ListHead
;
2884 SINGLE_LIST_ENTRY SingleListHead
;
2887 USHORT MaximumDepth
;
2888 ULONG TotalAllocates
;
2890 ULONG AllocateMisses
;
2902 PALLOCATE_FUNCTION_EX AllocateEx
;
2903 PALLOCATE_FUNCTION Allocate
;
2906 PFREE_FUNCTION_EX FreeEx
;
2907 PFREE_FUNCTION Free
;
2909 LIST_ENTRY ListEntry
;
2910 ULONG LastTotalAllocates
;
2912 ULONG LastAllocateMisses
;
2913 ULONG LastAllocateHits
;
2916 } GENERAL_LOOKASIDE
, *PGENERAL_LOOKASIDE
;
2918 typedef struct _PAGED_LOOKASIDE_LIST
{
2919 GENERAL_LOOKASIDE L
;
2920 #if !defined(_AMD64_) && !defined(_IA64_)
2921 FAST_MUTEX Lock__ObsoleteButDoNotDelete
;
2923 } PAGED_LOOKASIDE_LIST
, *PPAGED_LOOKASIDE_LIST
;
2925 typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST
{
2926 GENERAL_LOOKASIDE L
;
2927 #if !defined(_AMD64_) && !defined(_IA64_)
2928 KSPIN_LOCK Lock__ObsoleteButDoNotDelete
;
2930 } NPAGED_LOOKASIDE_LIST
, *PNPAGED_LOOKASIDE_LIST
;
2932 //typedef struct _LOOKASIDE_LIST_EX {
2933 // GENERAL_LOOKASIDE_POOL L;
2934 //} LOOKASIDE_LIST_EX, *PLOOKASIDE_LIST_EX;
2936 typedef struct _EX_RUNDOWN_REF
{
2937 __GNU_EXTENSION
union {
2938 volatile ULONG_PTR Count
;
2941 } EX_RUNDOWN_REF
, *PEX_RUNDOWN_REF
;
2943 typedef struct _EX_RUNDOWN_REF_CACHE_AWARE
*PEX_RUNDOWN_REF_CACHE_AWARE
;
2945 typedef enum _WORK_QUEUE_TYPE
{
2948 HyperCriticalWorkQueue
,
2953 (DDKAPI
*PWORKER_THREAD_ROUTINE
)(
2954 IN PVOID Parameter
);
2956 typedef struct _WORK_QUEUE_ITEM
{
2958 PWORKER_THREAD_ROUTINE WorkerRoutine
;
2959 volatile PVOID Parameter
;
2960 } WORK_QUEUE_ITEM
, *PWORK_QUEUE_ITEM
;
2963 /******************************************************************************
2964 * Executive Functions *
2965 ******************************************************************************/
2968 #if defined(_NTHAL_)
2969 #define ExAcquireFastMutex ExiAcquireFastMutex
2970 #define ExReleaseFastMutex ExiReleaseFastMutex
2971 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
2973 #define ExInterlockedAddUlong ExfInterlockedAddUlong
2974 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
2975 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
2976 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
2977 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
2978 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
2983 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
2984 defined(_NTHAL_) || defined(_NTOSP_)
2987 ExQueryDepthSList(IN PSLIST_HEADER ListHead
);
2991 ExQueryDepthSList(IN PSLIST_HEADER ListHead
)
2993 return (USHORT
)(ListHead
->Alignment
& 0xffff);
2999 ExpInterlockedFlushSList(
3000 PSLIST_HEADER ListHead
);
3004 ExpInterlockedPopEntrySList(
3005 PSLIST_HEADER ListHead
);
3009 ExpInterlockedPushEntrySList(
3010 PSLIST_HEADER ListHead
,
3011 PSLIST_ENTRY ListEntry
);
3013 #define ExInterlockedFlushSList(Head) \
3014 ExpInterlockedFlushSList(Head)
3015 #define ExInterlockedPopEntrySList(Head, Lock) \
3016 ExpInterlockedPopEntrySList(Head)
3017 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
3018 ExpInterlockedPushEntrySList(Head, Entry)
3020 #else // !defined(_WIN64)
3022 #define ExQueryDepthSList(listhead) (listhead)->Depth
3027 ExInterlockedFlushSList(
3028 IN PSLIST_HEADER ListHead
);
3030 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
3034 ExInterlockedPopEntrySList(
3035 IN PSLIST_HEADER ListHead
,
3036 IN PKSPIN_LOCK Lock
);
3041 ExInterlockedPushEntrySList(
3042 IN PSLIST_HEADER ListHead
,
3043 IN PSINGLE_LIST_ENTRY ListEntry
,
3044 IN PKSPIN_LOCK Lock
);
3046 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
3047 InterlockedPopEntrySList(_ListHead)
3048 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
3049 InterlockedPushEntrySList(_ListHead, _ListEntry)
3050 #endif // _WIN2K_COMPAT_SLIST_USAGE
3052 #endif // !defined(_WIN64)
3055 * ExGetCurrentResourceThread(
3058 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread())
3060 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
3063 * ExInitializeWorkItem(
3064 * IN PWORK_QUEUE_ITEM Item,
3065 * IN PWORKER_THREAD_ROUTINE Routine,
3068 #define ExInitializeWorkItem(Item, Routine, Context) \
3070 (Item)->WorkerRoutine = Routine; \
3071 (Item)->Parameter = Context; \
3072 (Item)->List.Flink = NULL; \
3075 #if (NTDDI_VERSION >= NTDDI_WIN2K)
3081 IN OUT PFAST_MUTEX FastMutex
);
3087 IN OUT PFAST_MUTEX FastMutex
);
3092 ExTryToAcquireFastMutex(
3093 IN OUT PFAST_MUTEX FastMutex
);
3098 ExAcquireFastMutexUnsafe(
3099 IN OUT PFAST_MUTEX FastMutex
);
3104 ExReleaseFastMutexUnsafe(
3105 IN OUT PFAST_MUTEX FastMutex
);
3110 ExAcquireResourceExclusiveLite(
3111 IN PERESOURCE Resource
,
3117 ExAcquireResourceSharedLite(
3118 IN PERESOURCE Resource
,
3124 ExAcquireSharedStarveExclusive(
3125 IN PERESOURCE Resource
,
3131 ExAcquireSharedWaitForExclusive(
3132 IN PERESOURCE Resource
,
3139 IN POOL_TYPE PoolType
,
3140 IN SIZE_T NumberOfBytes
);
3143 #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
3144 #endif /* POOL_TAGGING */
3149 ExAllocatePoolWithQuota(
3150 IN POOL_TYPE PoolType
,
3151 IN SIZE_T NumberOfBytes
);
3154 #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
3155 #endif /* POOL_TAGGING */
3160 ExAllocatePoolWithQuotaTag(
3161 IN POOL_TYPE PoolType
,
3162 IN SIZE_T NumberOfBytes
,
3165 #ifndef POOL_TAGGING
3166 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
3167 #endif /* POOL_TAGGING */
3172 ExAllocatePoolWithTag(
3173 IN POOL_TYPE PoolType
,
3174 IN SIZE_T NumberOfBytes
,
3180 ExAllocatePoolWithTagPriority(
3181 IN POOL_TYPE PoolType
,
3182 IN SIZE_T NumberOfBytes
,
3184 IN EX_POOL_PRIORITY Priority
);
3189 ExConvertExclusiveToSharedLite(
3190 IN PERESOURCE Resource
);
3196 OUT PCALLBACK_OBJECT
*CallbackObject
,
3197 IN POBJECT_ATTRIBUTES ObjectAttributes
,
3199 IN BOOLEAN AllowMultipleCallbacks
);
3204 ExDeleteNPagedLookasideList(
3205 IN PNPAGED_LOOKASIDE_LIST Lookaside
);
3210 ExDeletePagedLookasideList(
3211 IN PPAGED_LOOKASIDE_LIST Lookaside
);
3216 ExDeleteResourceLite(
3217 IN PERESOURCE Resource
);
3226 #define ExFreePool(P) ExFreePoolWithTag(P, 0)
3239 ExGetExclusiveWaiterCount(
3240 IN PERESOURCE Resource
);
3251 ExGetSharedWaiterCount(
3252 IN PERESOURCE Resource
);
3257 ExInitializeNPagedLookasideList(
3258 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
3259 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
3260 IN PFREE_FUNCTION Free OPTIONAL
,
3269 ExInitializePagedLookasideList(
3270 IN PPAGED_LOOKASIDE_LIST Lookaside
,
3271 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
3272 IN PFREE_FUNCTION Free OPTIONAL
,
3281 ExInitializeResourceLite(
3282 IN PERESOURCE Resource
);
3287 ExInterlockedAddLargeInteger(
3288 IN PLARGE_INTEGER Addend
,
3289 IN LARGE_INTEGER Increment
,
3290 IN PKSPIN_LOCK Lock
);
3293 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
3294 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
3296 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
3297 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
3303 ExInterlockedAddUlong(
3308 #if defined(_AMD64_) || defined(_IA64_)
3309 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
3310 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
3311 #elif defined(_X86_)
3315 ExfInterlockedCompareExchange64(
3316 IN OUT LONGLONG
volatile *Destination
,
3317 IN PLONGLONG Exchange
,
3318 IN PLONGLONG Comperand
);
3319 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
3320 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
3325 ExInterlockedCompareExchange64(
3326 IN OUT LONGLONG
volatile *Destination
,
3327 IN PLONGLONG Exchange
,
3328 IN PLONGLONG Comparand
,
3329 IN PKSPIN_LOCK Lock
);
3335 ExInterlockedInsertHeadList(
3336 IN PLIST_ENTRY ListHead
,
3337 IN PLIST_ENTRY ListEntry
,
3338 IN PKSPIN_LOCK Lock
);
3343 ExInterlockedInsertTailList(
3344 IN PLIST_ENTRY ListHead
,
3345 IN PLIST_ENTRY ListEntry
,
3346 IN PKSPIN_LOCK Lock
);
3351 ExInterlockedPopEntryList(
3352 IN PSINGLE_LIST_ENTRY ListHead
,
3353 IN PKSPIN_LOCK Lock
);
3358 ExInterlockedPushEntryList(
3359 IN PSINGLE_LIST_ENTRY ListHead
,
3360 IN PSINGLE_LIST_ENTRY ListEntry
,
3361 IN PKSPIN_LOCK Lock
);
3366 ExInterlockedRemoveHeadList(
3367 IN PLIST_ENTRY ListHead
,
3368 IN PKSPIN_LOCK Lock
);
3373 ExIsProcessorFeaturePresent(
3374 IN ULONG ProcessorFeature
);
3379 ExIsResourceAcquiredExclusiveLite(
3380 IN PERESOURCE Resource
);
3385 ExIsResourceAcquiredSharedLite(
3386 IN PERESOURCE Resource
);
3388 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
3393 ExLocalTimeToSystemTime(
3394 IN PLARGE_INTEGER LocalTime
,
3395 OUT PLARGE_INTEGER SystemTime
);
3401 IN PCALLBACK_OBJECT CallbackObject
,
3403 IN PVOID Argument2
);
3409 IN PWORK_QUEUE_ITEM WorkItem
,
3410 IN WORK_QUEUE_TYPE QueueType
);
3417 IN NTSTATUS Status
);
3423 IN PCALLBACK_OBJECT CallbackObject
,
3424 IN PCALLBACK_FUNCTION CallbackFunction
,
3425 IN PVOID CallbackContext
);
3430 ExReinitializeResourceLite(
3431 IN PERESOURCE Resource
);
3436 ExReleaseResourceForThreadLite(
3437 IN PERESOURCE Resource
,
3438 IN ERESOURCE_THREAD ResourceThreadId
);
3443 ExReleaseResourceLite(
3444 IN PERESOURCE Resource
);
3449 ExSetResourceOwnerPointer(
3450 IN PERESOURCE Resource
,
3451 IN PVOID OwnerPointer
);
3456 ExSetTimerResolution(
3457 IN ULONG DesiredTime
,
3458 IN BOOLEAN SetResolution
);
3463 ExSystemTimeToLocalTime(
3464 IN PLARGE_INTEGER SystemTime
,
3465 OUT PLARGE_INTEGER LocalTime
);
3470 ExUnregisterCallback(
3471 IN PVOID CbRegistration
);
3474 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
3476 #if (NTDDI_VERSION >= NTDDI_WINXP)
3480 ExAcquireRundownProtection(
3481 IN OUT PEX_RUNDOWN_REF RunRef
);
3486 ExInitializeRundownProtection(
3487 OUT PEX_RUNDOWN_REF RunRef
);
3492 ExReInitializeRundownProtection(
3493 OUT PEX_RUNDOWN_REF RunRef
);
3498 ExReleaseRundownProtection(
3499 IN OUT PEX_RUNDOWN_REF RunRef
);
3505 OUT PEX_RUNDOWN_REF RunRef
);
3511 IN SUITE_TYPE SuiteType
);
3516 ExWaitForRundownProtectionRelease(
3517 IN OUT PEX_RUNDOWN_REF RunRef
);
3519 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
3521 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
3525 ExAcquireRundownProtectionEx(
3526 IN OUT PEX_RUNDOWN_REF RunRef
,
3532 ExReleaseRundownProtectionEx(
3533 IN OUT PEX_RUNDOWN_REF RunRef
,
3535 #endif // (NTDDI_VERSION >= NTDDI_WINXPSP2)
3537 #if (NTDDI_VERSION >= NTDDI_WS03)
3539 #endif // (NTDDI_VERSION >= NTDDI_WS03)
3541 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
3543 PEX_RUNDOWN_REF_CACHE_AWARE
3544 ExAllocateCacheAwareRundownProtection(
3545 IN POOL_TYPE PoolType
,
3550 ExSizeOfRundownProtectionCacheAware(VOID
);
3552 #endif // (NTDDI_VERSION >= NTDDI_WS03SP1)
3554 #if (NTDDI_VERSION >= NTDDI_VISTA)
3557 ExInitializeLookasideListEx(
3558 OUT PLOOKASIDE_LIST_EX Lookaside
,
3559 IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL
,
3560 IN PFREE_FUNCTION_EX Free OPTIONAL
,
3561 IN POOL_TYPE PoolType
,
3569 #if !defined(MIDL_PASS)
3571 static __inline PVOID
3572 ExAllocateFromNPagedLookasideList(
3573 IN PNPAGED_LOOKASIDE_LIST Lookaside
)
3577 Lookaside
->L
.TotalAllocates
++;
3578 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
3579 if (Entry
== NULL
) {
3580 Lookaside
->L
.AllocateMisses
++;
3581 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
3588 static __inline PVOID
3589 ExAllocateFromPagedLookasideList(
3590 IN PPAGED_LOOKASIDE_LIST Lookaside
)
3594 Lookaside
->L
.TotalAllocates
++;
3595 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
3596 if (Entry
== NULL
) {
3597 Lookaside
->L
.AllocateMisses
++;
3598 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
3605 static __inline VOID
3606 ExFreeToNPagedLookasideList(
3607 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
3610 Lookaside
->L
.TotalFrees
++;
3611 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
3612 Lookaside
->L
.FreeMisses
++;
3613 (Lookaside
->L
.Free
)(Entry
);
3615 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
3619 static __inline VOID
3620 ExFreeToPagedLookasideList(
3621 IN PPAGED_LOOKASIDE_LIST Lookaside
,
3624 Lookaside
->L
.TotalFrees
++;
3625 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
3626 Lookaside
->L
.FreeMisses
++;
3627 (Lookaside
->L
.Free
)(Entry
);
3629 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
3634 #endif // !defined(MIDL_PASS)