4 * Windows Device Driver Kit
6 * This file is part of the w32api package.
9 * Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
11 * THIS SOFTWARE IS NOT COPYRIGHTED
13 * This source code is offered for use in the public domain. You may
14 * use, modify or distribute it freely.
16 * This code is distributed in the hope that it will be useful but
17 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
18 * DISCLAIMED. This includes but is not limited to warranties of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
26 /* Helper macro to enable gcc's extension. */
27 #ifndef __GNU_EXTENSION
29 #define __GNU_EXTENSION __extension__
31 #define __GNU_EXTENSION
45 /* Pseudo modifiers for parameters */
61 #define RESTRICTED_POINTER
63 #define DECLSPEC_ADDRSAFE
65 #ifdef NONAMELESSUNION
66 # define _DDK_DUMMYUNION_MEMBER(name) DUMMYUNIONNAME.name
67 # define _DDK_DUMMYUNION_N_MEMBER(n, name) DUMMYUNIONNAME##n.name
69 # define _DDK_DUMMYUNION_MEMBER(name) name
70 # define _DDK_DUMMYUNION_N_MEMBER(n, name) name
74 ** Forward declarations
80 struct _DRIVE_LAYOUT_INFORMATION_EX
;
81 struct _LOADER_PARAMETER_BLOCK
;
85 /* FIXME: Unknown definitions */
86 struct _SET_PARTITION_INFORMATION_EX
;
89 typedef HANDLE TRACEHANDLE
;
90 typedef PVOID PWMILIB_CONTEXT
;
94 ** WmiLib specific structure
98 IrpProcessed
, // Irp was processed and possibly completed
99 IrpNotCompleted
, // Irp was process and NOT completed
100 IrpNotWmi
, // Irp is not a WMI irp
101 IrpForward
// Irp is wmi irp, but targeted at another device object
102 } SYSCTL_IRP_DISPOSITION
, *PSYSCTL_IRP_DISPOSITION
;
104 #define DPFLTR_ERROR_LEVEL 0
105 #define DPFLTR_WARNING_LEVEL 1
106 #define DPFLTR_TRACE_LEVEL 2
107 #define DPFLTR_INFO_LEVEL 3
108 #define DPFLTR_MASK 0x80000000
110 typedef enum _DPFLTR_TYPE
112 DPFLTR_SYSTEM_ID
= 0,
117 DPFLTR_CRASHDUMP_ID
= 5,
118 DPFLTR_CDAUDIO_ID
= 6,
120 DPFLTR_CLASSPNP_ID
= 8,
122 DPFLTR_REDBOOK_ID
= 10,
123 DPFLTR_STORPROP_ID
= 11,
124 DPFLTR_SCSIPORT_ID
= 12,
125 DPFLTR_SCSIMINIPORT_ID
= 13,
126 DPFLTR_CONFIG_ID
= 14,
127 DPFLTR_I8042PRT_ID
= 15,
128 DPFLTR_SERMOUSE_ID
= 16,
129 DPFLTR_LSERMOUS_ID
= 17,
130 DPFLTR_KBDHID_ID
= 18,
131 DPFLTR_MOUHID_ID
= 19,
132 DPFLTR_KBDCLASS_ID
= 20,
133 DPFLTR_MOUCLASS_ID
= 21,
134 DPFLTR_TWOTRACK_ID
= 22,
135 DPFLTR_WMILIB_ID
= 23,
138 DPFLTR_HALIA64_ID
= 26,
139 DPFLTR_VIDEO_ID
= 27,
140 DPFLTR_SVCHOST_ID
= 28,
141 DPFLTR_VIDEOPRT_ID
= 29,
142 DPFLTR_TCPIP_ID
= 30,
143 DPFLTR_DMSYNTH_ID
= 31,
144 DPFLTR_NTOSPNP_ID
= 32,
145 DPFLTR_FASTFAT_ID
= 33,
146 DPFLTR_SAMSS_ID
= 34,
147 DPFLTR_PNPMGR_ID
= 35,
148 DPFLTR_NETAPI_ID
= 36,
149 DPFLTR_SCSERVER_ID
= 37,
150 DPFLTR_SCCLIENT_ID
= 38,
151 DPFLTR_SERIAL_ID
= 39,
152 DPFLTR_SERENUM_ID
= 40,
154 DPFLTR_BOOTOK_ID
= 42,
155 DPFLTR_BOOTVRFY_ID
= 43,
156 DPFLTR_RPCPROXY_ID
= 44,
157 DPFLTR_AUTOCHK_ID
= 45,
158 DPFLTR_DCOMSS_ID
= 46,
159 DPFLTR_UNIMODEM_ID
= 47,
161 DPFLTR_FLTMGR_ID
= 49,
162 DPFLTR_WMICORE_ID
= 50,
163 DPFLTR_BURNENG_ID
= 51,
164 DPFLTR_IMAPI_ID
= 52,
166 DPFLTR_FUSION_ID
= 54,
167 DPFLTR_IDLETASK_ID
= 55,
168 DPFLTR_SOFTPCI_ID
= 56,
170 DPFLTR_MCHGR_ID
= 58,
172 DPFLTR_PCIIDE_ID
= 60,
173 DPFLTR_FLOPPY_ID
= 61,
175 DPFLTR_TERMSRV_ID
= 63,
176 DPFLTR_W32TIME_ID
= 64,
177 DPFLTR_PREFETCHER_ID
= 65,
178 DPFLTR_RSFILTER_ID
= 66,
179 DPFLTR_FCPORT_ID
= 67,
182 DPFLTR_DMCONFIG_ID
= 70,
183 DPFLTR_DMADMIN_ID
= 71,
184 DPFLTR_WSOCKTRANSPORT_ID
= 72,
186 DPFLTR_PNPMEM_ID
= 74,
187 DPFLTR_PROCESSOR_ID
= 75,
188 DPFLTR_DMSERVER_ID
= 76,
190 DPFLTR_INFINIBAND_ID
= 78,
191 DPFLTR_IHVDRIVER_ID
= 79,
192 DPFLTR_IHVVIDEO_ID
= 80,
193 DPFLTR_IHVAUDIO_ID
= 81,
194 DPFLTR_IHVNETWORK_ID
= 82,
195 DPFLTR_IHVSTREAMING_ID
= 83,
196 DPFLTR_IHVBUS_ID
= 84,
198 DPFLTR_RTLTHREADPOOL_ID
= 86,
200 DPFLTR_TCPIP6_ID
= 88,
201 DPFLTR_ISAPNP_ID
= 89,
203 DPFLTR_STORPORT_ID
= 91,
204 DPFLTR_STORMINIPORT_ID
= 92,
205 DPFLTR_PRINTSPOOLER_ID
= 93,
207 DPFLTR_VDSBAS_ID
= 95,
208 DPFLTR_VDSDYNDR_ID
= 96,
209 DPFLTR_VDSUTIL_ID
= 97,
210 DPFLTR_DFRGIFC_ID
= 98,
211 DPFLTR_DEFAULT_ID
= 99,
213 DPFLTR_DFSC_ID
= 101,
214 DPFLTR_WOW64_ID
= 102,
218 /* also in winnt.h */
220 #define FILE_COPY_STRUCTURED_STORAGE 0x00000041
221 #define FILE_STRUCTURED_STORAGE 0x00000441
225 /* Exported object types */
226 extern POBJECT_TYPE NTSYSAPI ExDesktopObjectType
;
227 extern POBJECT_TYPE NTSYSAPI ExWindowStationObjectType
;
228 extern ULONG NTSYSAPI IoDeviceHandlerObjectSize
;
229 extern POBJECT_TYPE NTSYSAPI IoDeviceHandlerObjectType
;
230 extern POBJECT_TYPE NTSYSAPI IoDeviceObjectType
;
231 extern POBJECT_TYPE NTSYSAPI IoDriverObjectType
;
232 extern POBJECT_TYPE NTSYSAPI LpcPortObjectType
;
233 extern POBJECT_TYPE NTSYSAPI PsProcessType
;
235 typedef EXCEPTION_DISPOSITION
236 (DDKAPI
*PEXCEPTION_ROUTINE
)(
237 IN
struct _EXCEPTION_RECORD
*ExceptionRecord
,
238 IN PVOID EstablisherFrame
,
239 IN OUT
struct _CONTEXT
*ContextRecord
,
240 IN OUT PVOID DispatcherContext
);
243 (DDKAPI
*PDRIVER_ENTRY
)(
244 IN
struct _DRIVER_OBJECT
*DriverObject
,
245 IN PUNICODE_STRING RegistryPath
);
248 (DDKAPI
*PKTRANSFER_ROUTINE
)(
251 #define ASSERT_GATE(object) \
252 ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == GateObject) || \
253 (((object)->Header.Type & KOBJECT_TYPE_MASK) == EventSynchronizationObject))
255 #define TIMER_TABLE_SIZE 512
256 #define TIMER_TABLE_SHIFT 9
258 #define ASSERT_TIMER(E) \
259 ASSERT(((E)->Header.Type == TimerNotificationObject) || \
260 ((E)->Header.Type == TimerSynchronizationObject))
262 #define ASSERT_MUTANT(E) \
263 ASSERT((E)->Header.Type == MutantObject)
265 #define ASSERT_SEMAPHORE(E) \
266 ASSERT((E)->Header.Type == SemaphoreObject)
268 #define ASSERT_EVENT(E) \
269 ASSERT(((E)->Header.Type == NotificationEvent) || \
270 ((E)->Header.Type == SynchronizationEvent))
272 #define KEYBOARD_INSERT_ON 0x08
273 #define KEYBOARD_CAPS_LOCK_ON 0x04
274 #define KEYBOARD_NUM_LOCK_ON 0x02
275 #define KEYBOARD_SCROLL_LOCK_ON 0x01
276 #define KEYBOARD_ALT_KEY_DOWN 0x80
277 #define KEYBOARD_CTRL_KEY_DOWN 0x40
278 #define KEYBOARD_LEFT_SHIFT_DOWN 0x20
279 #define KEYBOARD_RIGHT_SHIFT_DOWN 0x10
281 /* Function Type Defintions for Dispatch Functions */
282 struct _DEVICE_CONTROL_CONTEXT
;
285 (DDKAPI
*PDEVICE_CONTROL_COMPLETION
)(
286 IN
struct _DEVICE_CONTROL_CONTEXT
*ControlContext
);
288 typedef struct _DEVICE_CONTROL_CONTEXT
{
290 PDEVICE_HANDLER_OBJECT DeviceHandler
;
291 PDEVICE_OBJECT DeviceObject
;
296 } DEVICE_CONTROL_CONTEXT
, *PDEVICE_CONTROL_CONTEXT
;
299 (DDKAPI
*pHalDeviceControl
)(
300 IN PDEVICE_HANDLER_OBJECT DeviceHandler
,
301 IN PDEVICE_OBJECT DeviceObject
,
302 IN ULONG ControlCode
,
303 IN OUT PVOID Buffer OPTIONAL
,
304 IN OUT PULONG BufferLength OPTIONAL
,
306 IN PDEVICE_CONTROL_COMPLETION CompletionRoutine
);
310 (DDKAPI
*pHalGetInterruptVector
)(
311 IN INTERFACE_TYPE InterfaceType
,
313 IN ULONG BusInterruptLevel
,
314 IN ULONG BusInterruptVector
,
316 OUT PKAFFINITY Affinity
321 (DDKAPI
*pHalGetVectorInput
)(
323 IN KAFFINITY Affinity
,
325 OUT PKINTERRUPT_POLARITY Polarity
330 (DDKAPI
*pKdMapPhysicalMemory64
)(
331 IN PHYSICAL_ADDRESS PhysicalAddress
,
337 (DDKAPI
*pKdUnmapVirtualAddress
)(
338 IN PVOID VirtualAddress
,
344 (DDKAPI
*pKdGetPciDataByOffset
)(
354 (DDKAPI
*pKdSetPciDataByOffset
)(
362 typedef struct _FILE_ALIGNMENT_INFORMATION
{
363 ULONG AlignmentRequirement
;
364 } FILE_ALIGNMENT_INFORMATION
, *PFILE_ALIGNMENT_INFORMATION
;
366 typedef struct _FILE_NAME_INFORMATION
{
367 ULONG FileNameLength
;
369 } FILE_NAME_INFORMATION
, *PFILE_NAME_INFORMATION
;
372 typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION
{
373 ULONG FileAttributes
;
375 } FILE_ATTRIBUTE_TAG_INFORMATION
, *PFILE_ATTRIBUTE_TAG_INFORMATION
;
377 typedef struct _FILE_DISPOSITION_INFORMATION
{
379 } FILE_DISPOSITION_INFORMATION
, *PFILE_DISPOSITION_INFORMATION
;
381 typedef struct _FILE_END_OF_FILE_INFORMATION
{
382 LARGE_INTEGER EndOfFile
;
383 } FILE_END_OF_FILE_INFORMATION
, *PFILE_END_OF_FILE_INFORMATION
;
385 typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION
{
386 LARGE_INTEGER ValidDataLength
;
387 } FILE_VALID_DATA_LENGTH_INFORMATION
, *PFILE_VALID_DATA_LENGTH_INFORMATION
;
389 typedef union _FILE_SEGMENT_ELEMENT
{
392 }FILE_SEGMENT_ELEMENT
, *PFILE_SEGMENT_ELEMENT
;
394 #define SE_UNSOLICITED_INPUT_PRIVILEGE 6
396 typedef struct _KEY_USER_FLAGS_INFORMATION
{
398 } KEY_USER_FLAGS_INFORMATION
, *PKEY_USER_FLAGS_INFORMATION
;
400 #define PCI_ADDRESS_MEMORY_SPACE 0x00000000
406 IN ULONGLONG ConditionMask
,
410 #define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType) \
411 ((ConditionMask) = VerSetConditionMask((ConditionMask), \
412 (TypeBitMask), (ComparisonType)))
414 /* RtlVerifyVersionInfo() TypeMask */
416 #define VER_MINORVERSION 0x0000001
417 #define VER_MAJORVERSION 0x0000002
418 #define VER_BUILDNUMBER 0x0000004
419 #define VER_PLATFORMID 0x0000008
420 #define VER_SERVICEPACKMINOR 0x0000010
421 #define VER_SERVICEPACKMAJOR 0x0000020
422 #define VER_SUITENAME 0x0000040
423 #define VER_PRODUCT_TYPE 0x0000080
425 /* RtlVerifyVersionInfo() ComparisonType */
428 #define VER_GREATER 2
429 #define VER_GREATER_EQUAL 3
431 #define VER_LESS_EQUAL 5
435 #define VER_CONDITION_MASK 7
436 #define VER_NUM_BITS_PER_CONDITION_MASK 3
441 (NTAPI
*PRTL_CONFLICT_RANGE_CALLBACK
) (
443 struct _RTL_RANGE
*Range
446 typedef enum _IO_QUERY_DEVICE_DATA_FORMAT
{
447 IoQueryDeviceIdentifier
= 0,
448 IoQueryDeviceConfigurationData
,
449 IoQueryDeviceComponentInformation
,
451 } IO_QUERY_DEVICE_DATA_FORMAT
, *PIO_QUERY_DEVICE_DATA_FORMAT
;
455 #define IMAGE_ADDRESSING_MODE_32BIT 3
457 typedef struct _NT_TIB
{
458 struct _EXCEPTION_REGISTRATION_RECORD
*ExceptionList
;
462 _ANONYMOUS_UNION
union {
466 PVOID ArbitraryUserPointer
;
467 struct _NT_TIB
*Self
;
470 typedef struct _NT_TIB32
{
475 __GNU_EXTENSION
union {
479 ULONG ArbitraryUserPointer
;
481 } NT_TIB32
,*PNT_TIB32
;
483 typedef struct _NT_TIB64
{
484 ULONG64 ExceptionList
;
487 ULONG64 SubSystemTib
;
488 __GNU_EXTENSION
union {
492 ULONG64 ArbitraryUserPointer
;
494 } NT_TIB64
,*PNT_TIB64
;
496 typedef struct _PROCESS_BASIC_INFORMATION
499 struct _PEB
*PebBaseAddress
;
500 ULONG_PTR AffinityMask
;
501 KPRIORITY BasePriority
;
502 ULONG_PTR UniqueProcessId
;
503 ULONG_PTR InheritedFromUniqueProcessId
;
504 } PROCESS_BASIC_INFORMATION
,*PPROCESS_BASIC_INFORMATION
;
506 typedef struct _PROCESS_WS_WATCH_INFORMATION
510 } PROCESS_WS_WATCH_INFORMATION
, *PPROCESS_WS_WATCH_INFORMATION
;
512 typedef struct _PROCESS_DEVICEMAP_INFORMATION
514 __GNU_EXTENSION
union
518 HANDLE DirectoryHandle
;
526 } PROCESS_DEVICEMAP_INFORMATION
, *PPROCESS_DEVICEMAP_INFORMATION
;
528 typedef struct _KERNEL_USER_TIMES
530 LARGE_INTEGER CreateTime
;
531 LARGE_INTEGER ExitTime
;
532 LARGE_INTEGER KernelTime
;
533 LARGE_INTEGER UserTime
;
534 } KERNEL_USER_TIMES
, *PKERNEL_USER_TIMES
;
536 typedef struct _PROCESS_ACCESS_TOKEN
540 } PROCESS_ACCESS_TOKEN
, *PPROCESS_ACCESS_TOKEN
;
542 typedef struct _PROCESS_SESSION_INFORMATION
545 } PROCESS_SESSION_INFORMATION
, *PPROCESS_SESSION_INFORMATION
;
548 ** Storage structures
550 typedef enum _PARTITION_STYLE
{
556 typedef struct _CREATE_DISK_MBR
{
558 } CREATE_DISK_MBR
, *PCREATE_DISK_MBR
;
560 typedef struct _CREATE_DISK_GPT
{
562 ULONG MaxPartitionCount
;
563 } CREATE_DISK_GPT
, *PCREATE_DISK_GPT
;
565 typedef struct _CREATE_DISK
{
566 PARTITION_STYLE PartitionStyle
;
567 _ANONYMOUS_UNION
union {
571 } CREATE_DISK
, *PCREATE_DISK
;
574 (FASTCALL
*PTIME_UPDATE_NOTIFY_ROUTINE
)(
576 IN KPROCESSOR_MODE Mode
);
579 (NTAPI
*PDRIVER_VERIFIER_THUNK_ROUTINE
)(
582 typedef struct _DRIVER_VERIFIER_THUNK_PAIRS
{
583 PDRIVER_VERIFIER_THUNK_ROUTINE PristineRoutine
;
584 PDRIVER_VERIFIER_THUNK_ROUTINE NewRoutine
;
585 } DRIVER_VERIFIER_THUNK_PAIRS
, *PDRIVER_VERIFIER_THUNK_PAIRS
;
587 #define DRIVER_VERIFIER_SPECIAL_POOLING 0x0001
588 #define DRIVER_VERIFIER_FORCE_IRQL_CHECKING 0x0002
589 #define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES 0x0004
590 #define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS 0x0008
591 #define DRIVER_VERIFIER_IO_CHECKING 0x0010
594 ** Architecture specific structures
596 #define PCR_MINOR_VERSION 1
597 #define PCR_MAJOR_VERSION 1
601 #define CONTEXT_i386 0x10000
602 #define CONTEXT_i486 0x10000
603 #define CONTEXT_CONTROL (CONTEXT_i386|0x00000001L)
604 #define CONTEXT_INTEGER (CONTEXT_i386|0x00000002L)
605 #define CONTEXT_SEGMENTS (CONTEXT_i386|0x00000004L)
606 #define CONTEXT_FLOATING_POINT (CONTEXT_i386|0x00000008L)
607 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386|0x00000010L)
608 #define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L)
609 #define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS)
611 typedef struct _KPCR_TIB
{
612 PVOID ExceptionList
; /* 00 */
613 PVOID StackBase
; /* 04 */
614 PVOID StackLimit
; /* 08 */
615 PVOID SubSystemTib
; /* 0C */
616 _ANONYMOUS_UNION
union {
617 PVOID FiberData
; /* 10 */
618 ULONG Version
; /* 10 */
620 PVOID ArbitraryUserPointer
; /* 14 */
621 struct _KPCR_TIB
*Self
; /* 18 */
622 } KPCR_TIB
, *PKPCR_TIB
; /* 1C */
624 typedef struct _KPCR
{
625 KPCR_TIB Tib
; /* 00 */
626 struct _KPCR
*Self
; /* 1C */
627 struct _KPRCB
*Prcb
; /* 20 */
630 ULONG IrrActive
; /* 2C */
632 PVOID KdVersionBlock
; /* 34 */
633 PUSHORT IDT
; /* 38 */
634 PUSHORT GDT
; /* 3C */
635 struct _KTSS
*TSS
; /* 40 */
636 USHORT MajorVersion
; /* 44 */
637 USHORT MinorVersion
; /* 46 */
638 KAFFINITY SetMember
; /* 48 */
639 ULONG StallScaleFactor
; /* 4C */
640 UCHAR SpareUnused
; /* 50 */
641 UCHAR Number
; /* 51 */
643 UCHAR SecondLevelCacheAssociativity
;
645 ULONG KernelReserved
[14]; // For use by the kernel
646 ULONG SecondLevelCacheSize
;
647 ULONG HalReserved
[16]; // For use by Hal
648 } KPCR
, *PKPCR
; /* 54 */
650 #define KeGetPcr() PCR
654 KeGetCurrentProcessorNumber(VOID
)
656 return (ULONG
)__readfsbyte(FIELD_OFFSET(KPCR
, Number
));
659 extern NTKERNELAPI PVOID MmHighestUserAddress
;
660 extern NTKERNELAPI PVOID MmSystemRangeStart
;
661 extern NTKERNELAPI ULONG_PTR MmUserProbeAddress
;
663 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
664 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
665 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
666 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
667 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000
669 #define MM_KSEG0_BASE MM_SYSTEM_RANGE_START
670 #define MM_SYSTEM_SPACE_END 0xFFFFFFFF
672 #elif defined(__x86_64__)
674 typedef struct DECLSPEC_ALIGN(16) _CONTEXT
{
726 XMM_SAVE_AREA32 FltSave
;
750 M128A VectorRegister
[26];
751 ULONG64 VectorControl
;
754 ULONG64 DebugControl
;
755 ULONG64 LastBranchToRip
;
756 ULONG64 LastBranchFromRip
;
757 ULONG64 LastExceptionToRip
;
758 ULONG64 LastExceptionFromRip
;
761 #define PAGE_SIZE 0x1000
762 #define PAGE_SHIFT 12L
763 #define PTI_SHIFT 12L
764 #define PDI_SHIFT 21L
765 #define PPI_SHIFT 30L
766 #define PXI_SHIFT 39L
767 #define PTE_PER_PAGE 512
768 #define PDE_PER_PAGE 512
769 #define PPE_PER_PAGE 512
770 #define PXE_PER_PAGE 512
771 #define PTI_MASK_AMD64 (PTE_PER_PAGE - 1)
772 #define PDI_MASK_AMD64 (PDE_PER_PAGE - 1)
773 #define PPI_MASK (PPE_PER_PAGE - 1)
774 #define PXI_MASK (PXE_PER_PAGE - 1)
776 #define PXE_BASE 0xFFFFF6FB7DBED000ULL
777 #define PXE_SELFMAP 0xFFFFF6FB7DBEDF68ULL
778 #define PPE_BASE 0xFFFFF6FB7DA00000ULL
779 #define PDE_BASE 0xFFFFF6FB40000000ULL
780 #define PTE_BASE 0xFFFFF68000000000ULL
781 #define PXE_TOP 0xFFFFF6FB7DBEDFFFULL
782 #define PPE_TOP 0xFFFFF6FB7DBFFFFFULL
783 #define PDE_TOP 0xFFFFF6FB7FFFFFFFULL
784 #define PTE_TOP 0xFFFFF6FFFFFFFFFFULL
786 extern NTKERNELAPI PVOID MmHighestUserAddress
;
787 extern NTKERNELAPI PVOID MmSystemRangeStart
;
788 extern NTKERNELAPI ULONG_PTR MmUserProbeAddress
;
790 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
791 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
792 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
793 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
794 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xFFFF080000000000ULL
795 #define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL
797 #define SharedUserData ((PKUSER_SHARED_DATA const)KI_USER_SHARED_DATA)
798 #define SharedInterruptTime (&SharedUserData->InterruptTime)
799 #define SharedSystemTime (&SharedUserData->SystemTime)
800 #define SharedTickCount (&SharedUserData->TickCount)
802 #define KeQueryInterruptTime() \
803 (*(volatile ULONG64*)SharedInterruptTime)
804 #define KeQuerySystemTime(CurrentCount) \
805 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime
806 #define KeQueryTickCount(CurrentCount) \
807 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount
811 __GNU_EXTENSION
union
814 __GNU_EXTENSION
struct
816 union _KGDTENTRY64
*GdtBase
;
817 struct _KTSS64
*TssBase
;
820 struct _KPRCB
*CurrentPrcb
;
821 PKSPIN_LOCK_QUEUE LockArray
;
825 union _KIDTENTRY64
*IdtBase
;
828 UCHAR SecondLevelCacheAssociativity
;
829 UCHAR ObsoleteNumber
;
834 ULONG StallScaleFactor
;
836 ULONG KernelReserved
[15];
837 ULONG SecondLevelCacheSize
;
838 ULONG HalReserved
[16];
840 PVOID KdVersionBlock
;
845 typedef struct _KFLOATING_SAVE
{
847 } KFLOATING_SAVE
, *PKFLOATING_SAVE
;
853 return (PKPCR
)__readgsqword(FIELD_OFFSET(KPCR
, Self
));
858 KeGetCurrentProcessorNumber(VOID
)
860 return (ULONG
)__readgsword(0x184);
863 #elif defined(__PowerPC__)
866 // Used to contain PFNs and PFN counts
868 typedef ULONG PFN_COUNT
;
869 typedef ULONG PFN_NUMBER
, *PPFN_NUMBER
;
870 typedef LONG SPFN_NUMBER
, *PSPFN_NUMBER
;
872 #define PASSIVE_LEVEL 0
875 #define DISPATCH_LEVEL 2
876 #define PROFILE_LEVEL 27
877 #define CLOCK1_LEVEL 28
878 #define CLOCK2_LEVEL 28
880 #define POWER_LEVEL 30
881 #define HIGH_LEVEL 31
883 typedef struct _KFLOATING_SAVE
{
885 } KFLOATING_SAVE
, *PKFLOATING_SAVE
;
887 typedef struct _KPCR_TIB
{
888 PVOID ExceptionList
; /* 00 */
889 PVOID StackBase
; /* 04 */
890 PVOID StackLimit
; /* 08 */
891 PVOID SubSystemTib
; /* 0C */
892 _ANONYMOUS_UNION
union {
893 PVOID FiberData
; /* 10 */
894 ULONG Version
; /* 10 */
896 PVOID ArbitraryUserPointer
; /* 14 */
897 struct _KPCR_TIB
*Self
; /* 18 */
898 } KPCR_TIB
, *PKPCR_TIB
; /* 1C */
900 #define PCR_MINOR_VERSION 1
901 #define PCR_MAJOR_VERSION 1
903 typedef struct _KPCR
{
904 KPCR_TIB Tib
; /* 00 */
905 struct _KPCR
*Self
; /* 1C */
906 struct _KPRCB
*Prcb
; /* 20 */
909 ULONG IrrActive
; /* 2C */
911 PVOID KdVersionBlock
; /* 34 */
912 PUSHORT IDT
; /* 38 */
913 PUSHORT GDT
; /* 3C */
914 struct _KTSS
*TSS
; /* 40 */
915 USHORT MajorVersion
; /* 44 */
916 USHORT MinorVersion
; /* 46 */
917 KAFFINITY SetMember
; /* 48 */
918 ULONG StallScaleFactor
; /* 4C */
919 UCHAR SpareUnused
; /* 50 */
920 UCHAR Number
; /* 51 */
921 } KPCR
, *PKPCR
; /* 54 */
923 #define KeGetPcr() PCR
928 KeGetCurrentProcessorNumber(VOID
)
931 __asm__
__volatile__ (
934 : "i" (FIELD_OFFSET(KPCR
, Number
))
939 #elif defined(_MIPS_)
941 #error MIPS Headers are totally incorrect
944 // Used to contain PFNs and PFN counts
946 typedef ULONG PFN_COUNT
;
947 typedef ULONG PFN_NUMBER
, *PPFN_NUMBER
;
948 typedef LONG SPFN_NUMBER
, *PSPFN_NUMBER
;
950 #define PASSIVE_LEVEL 0
952 #define DISPATCH_LEVEL 2
953 #define PROFILE_LEVEL 27
955 #define HIGH_LEVEL 31
957 typedef struct _KPCR
{
958 struct _KPRCB
*Prcb
; /* 20 */
964 #define KeGetPcr() PCR
966 typedef struct _KFLOATING_SAVE
{
967 } KFLOATING_SAVE
, *PKFLOATING_SAVE
;
972 KeGetCurrentProcessorNumber(VOID
)
977 #elif defined(_M_ARM)
980 // NT-ARM is not documented, need DDK-ARM
985 #error Unknown architecture
988 /** SPINLOCK FUNCTIONS ********************************************************/
992 #if defined(WIN9X_COMPAT_SPINLOCK)
997 KeInitializeSpinLock(
998 IN PKSPIN_LOCK SpinLock
1005 KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock
)
1007 /* Clear the lock */
1017 IN PKSPIN_LOCK SpinLock
);
1023 IN PKSPIN_LOCK SpinLock
,
1029 KefAcquireSpinLockAtDpcLevel(
1030 IN PKSPIN_LOCK SpinLock
);
1035 KefReleaseSpinLockFromDpcLevel(
1036 IN PKSPIN_LOCK SpinLock
);
1038 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
1039 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
1040 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
1041 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
1043 #define KeGetDcacheFillSize() 1L
1045 #elif defined(_M_ARM) // !defined (_X86_)
1049 KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock
)
1051 /* Clear the lock */
1059 IN PKSPIN_LOCK SpinLock
);
1065 IN PKSPIN_LOCK SpinLock
,
1072 KefAcquireSpinLockAtDpcLevel(
1073 IN PKSPIN_LOCK SpinLock
);
1078 KefReleaseSpinLockFromDpcLevel(
1079 IN PKSPIN_LOCK SpinLock
);
1082 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
1083 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
1084 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
1085 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
1090 KeInitializeSpinLock(
1091 IN PKSPIN_LOCK SpinLock
);
1098 KeInitializeSpinLock(
1099 PKSPIN_LOCK SpinLock
)
1107 IN PKSPIN_LOCK SpinLock
,
1112 KeAcquireSpinLockAtDpcLevel(
1113 IN PKSPIN_LOCK SpinLock
);
1117 KeReleaseSpinLockFromDpcLevel(
1118 IN PKSPIN_LOCK SpinLock
);
1122 KeAcquireSpinLockRaiseToDpc(
1123 IN PKSPIN_LOCK SpinLock
);
1125 #define KeAcquireSpinLock(SpinLock, OldIrql) \
1126 *(OldIrql) = KeAcquireSpinLockRaiseToDpc(SpinLock)
1128 #endif // !defined (_X86_)
1130 #define ARGUMENT_PRESENT(ArgumentPointer) \
1131 ((CHAR*)((ULONG_PTR)(ArgumentPointer)) != (CHAR*)NULL)
1137 IN VOID UNALIGNED
*Destination
,
1138 IN CONST VOID UNALIGNED
*Source
,
1141 /** Kernel routines **/
1150 volatile LONG Barrier
;
1151 #if defined(__GNUC__)
1152 __asm__
__volatile__ ("xchg %%eax, %0" : : "m" (Barrier
) : "%eax");
1153 #elif defined(_MSC_VER)
1154 __asm xchg
[Barrier
], eax
1160 #if !defined(_M_AMD64)
1166 OUT PLARGE_INTEGER TickCount
);
1172 KeSetTimeUpdateNotifyRoutine(
1173 IN PTIME_UPDATE_NOTIFY_ROUTINE NotifyRoutine
);
1192 KeRaiseIrqlToDpcLevel(
1198 KeRaiseIrqlToSynchLevel(
1201 #define KeLowerIrql(a) KfLowerIrql(a)
1202 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
1204 #elif defined(_M_AMD64)
1208 KeGetCurrentIrql(VOID
)
1210 return (KIRQL
)__readcr8();
1215 KeLowerIrql(IN KIRQL NewIrql
)
1217 ASSERT(KeGetCurrentIrql() >= NewIrql
);
1218 __writecr8(NewIrql
);
1223 KfRaiseIrql(IN KIRQL NewIrql
)
1227 OldIrql
= __readcr8();
1228 ASSERT(OldIrql
<= NewIrql
);
1229 __writecr8(NewIrql
);
1232 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
1236 KeRaiseIrqlToDpcLevel(VOID
)
1238 return KfRaiseIrql(DISPATCH_LEVEL
);
1243 KeRaiseIrqlToSynchLevel(VOID
)
1245 return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2
1248 #elif defined(__PowerPC__)
1265 KeRaiseIrqlToDpcLevel(
1271 KeRaiseIrqlToSynchLevel(
1274 #define KeLowerIrql(a) KfLowerIrql(a)
1275 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
1277 #elif defined(_M_MIPS)
1279 #define KeLowerIrql(a) KfLowerIrql(a)
1280 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
1297 KeRaiseIrqlToDpcLevel(
1303 KeRaiseIrqlToSynchLevel(
1306 #elif defined(_M_ARM)
1323 OUT PKIRQL OldIrql
);
1328 KeRaiseIrqlToDpcLevel(
1334 KeRaiseIrqlToSynchLevel(
1339 /** Memory manager routines **/
1344 MmMarkPhysicalMemoryAsBad(
1345 IN PPHYSICAL_ADDRESS StartAddress
,
1346 IN OUT PLARGE_INTEGER NumberOfBytes
);
1351 MmMarkPhysicalMemoryAsGood(
1352 IN PPHYSICAL_ADDRESS StartAddress
,
1353 IN OUT PLARGE_INTEGER NumberOfBytes
);
1357 * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
1361 #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, \
1363 ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
1364 + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
1369 MmLockPagableImageSection(
1370 IN PVOID AddressWithinSection
);
1374 * MmLockPagableCodeSection(
1375 * IN PVOID AddressWithinSection)
1377 #define MmLockPagableCodeSection(Address) MmLockPagableDataSection(Address)
1382 MmLockPageableDataSection (
1383 IN PVOID AddressWithinSection
1389 MmUnlockPageableImageSection(
1390 IN PVOID ImageSectionHandle
1393 /** Object manager routines **/
1399 IN PACCESS_STATE AccessState
,
1400 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
1402 IN POBJECT_TYPE Type
);
1407 ObDereferenceSecurityDescriptor(
1408 PSECURITY_DESCRIPTOR SecurityDescriptor
,
1414 ObLogSecurityDescriptor(
1415 IN PSECURITY_DESCRIPTOR InputSecurityDescriptor
,
1416 OUT PSECURITY_DESCRIPTOR
*OutputSecurityDescriptor
,
1423 IN POBJECT_ATTRIBUTES ObjectAttributes
,
1424 IN POBJECT_TYPE ObjectType
,
1425 IN KPROCESSOR_MODE AccessMode
,
1426 IN PACCESS_STATE PassedAccessState
,
1427 IN ACCESS_MASK DesiredAccess
,
1428 IN OUT PVOID ParseContext OPTIONAL
,
1429 OUT PHANDLE Handle
);
1434 ObReferenceObjectByName(
1435 IN PUNICODE_STRING ObjectPath
,
1436 IN ULONG Attributes
,
1437 IN PACCESS_STATE PassedAccessState OPTIONAL
,
1438 IN ACCESS_MASK DesiredAccess OPTIONAL
,
1439 IN POBJECT_TYPE ObjectType
,
1440 IN KPROCESSOR_MODE AccessMode
,
1441 IN OUT PVOID ParseContext OPTIONAL
,
1447 ObReferenceSecurityDescriptor(
1448 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
1451 /** Process manager routines **/
1456 PsCreateSystemProcess(
1457 IN PHANDLE ProcessHandle
,
1458 IN ACCESS_MASK DesiredAccess
,
1459 IN POBJECT_ATTRIBUTES ObjectAttributes
);
1461 /** NtXxx and ZwXxx routines **/
1473 OUT PHANDLE EventHandle
,
1474 IN ACCESS_MASK DesiredAccess
,
1475 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
1476 IN EVENT_TYPE EventType
,
1477 IN BOOLEAN InitialState
);
1483 OUT PHANDLE EventHandle
,
1484 IN ACCESS_MASK DesiredAccess
,
1485 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
1486 IN EVENT_TYPE EventType
,
1487 IN BOOLEAN InitialState
);
1492 NtDeviceIoControlFile(
1493 IN HANDLE DeviceHandle
,
1494 IN HANDLE Event OPTIONAL
,
1495 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL
,
1496 IN PVOID UserApcContext OPTIONAL
,
1497 OUT PIO_STATUS_BLOCK IoStatusBlock
,
1498 IN ULONG IoControlCode
,
1499 IN PVOID InputBuffer
,
1500 IN ULONG InputBufferSize
,
1501 OUT PVOID OutputBuffer
,
1502 IN ULONG OutputBufferSize
);
1508 IN HANDLE SectionHandle
,
1509 IN HANDLE ProcessHandle
,
1510 IN OUT PVOID
*BaseAddress
,
1511 IN ULONG_PTR ZeroBits
,
1512 IN SIZE_T CommitSize
,
1513 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL
,
1514 IN OUT PSIZE_T ViewSize
,
1515 IN SECTION_INHERIT InheritDisposition
,
1516 IN ULONG AllocationType
,
1523 OUT PHANDLE FileHandle
,
1524 IN ACCESS_MASK DesiredAccess
,
1525 IN POBJECT_ATTRIBUTES ObjectAttributes
,
1526 OUT PIO_STATUS_BLOCK IoStatusBlock
,
1527 IN ULONG ShareAccess
,
1528 IN ULONG OpenOptions
);
1536 OUT PHANDLE FileHandle
,
1537 IN ACCESS_MASK DesiredAccess
,
1538 IN POBJECT_ATTRIBUTES ObjectAttributes
,
1539 OUT PIO_STATUS_BLOCK IoStatusBlock
,
1540 IN ULONG ShareAccess
,
1541 IN ULONG OpenOptions
);
1547 IN HANDLE FileHandle
,
1548 IN HANDLE Event OPTIONAL
,
1549 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
1550 IN PVOID ApcContext OPTIONAL
,
1551 OUT PIO_STATUS_BLOCK IoStatusBlock
,
1554 IN PLARGE_INTEGER ByteOffset OPTIONAL
,
1555 IN PULONG Key OPTIONAL
);
1561 IN HANDLE EventHandle
,
1562 OUT PLONG PreviousState OPTIONAL
);
1568 IN HANDLE EventHandle
,
1569 OUT PLONG PreviousState OPTIONAL
);
1571 /* [Nt|Zw]MapViewOfSection.InheritDisposition constants */
1572 #define AT_EXTENDABLE_FILE 0x00002000
1573 #define AT_RESERVED 0x20000000
1574 #define AT_ROUND_TO_PAGE 0x40000000
1579 NtUnmapViewOfSection(
1580 IN HANDLE ProcessHandle
,
1581 IN PVOID BaseAddress
);
1586 NtWaitForSingleObject(
1587 IN HANDLE ObjectHandle
,
1588 IN BOOLEAN Alertable
,
1589 IN PLARGE_INTEGER TimeOut OPTIONAL
);
1595 IN HANDLE FileHandle
,
1596 IN HANDLE Event OPTIONAL
,
1597 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
1598 IN PVOID ApcContext OPTIONAL
,
1599 OUT PIO_STATUS_BLOCK IoStatusBlock
,
1602 IN PLARGE_INTEGER ByteOffset OPTIONAL
,
1603 IN PULONG Key OPTIONAL
);
1605 /** Power management support routines **/
1610 PoRequestShutdownEvent(
1613 /** WMI library support routines **/
1618 IN PDEVICE_OBJECT DeviceObject
,
1621 IN ULONG BufferUsed
,
1622 IN CCHAR PriorityBoost
);
1627 IN PDEVICE_OBJECT DeviceObject
,
1629 IN ULONG InstanceIndex
,
1630 IN ULONG EventDataSize
,
1631 IN PVOID EventData
);
1636 IN PWMILIB_CONTEXT WmiLibInfo
,
1637 IN PDEVICE_OBJECT DeviceObject
,
1639 OUT PSYSCTL_IRP_DISPOSITION IrpDisposition
);
1641 /** Stuff from winnt4.h */
1647 ExInterlockedDecrementLong(
1649 IN PKSPIN_LOCK Lock
);
1654 ExInterlockedExchangeUlong(
1657 IN PKSPIN_LOCK Lock
);
1662 ExInterlockedIncrementLong(
1664 IN PKSPIN_LOCK Lock
);
1670 HalGetDmaAlignmentRequirement(
1676 RtlLargeIntegerEqualToZero(
1677 IN LARGE_INTEGER Operand
);
1682 RtlLargeIntegerGreaterOrEqualToZero(
1683 IN LARGE_INTEGER Operand
);
1688 RtlLargeIntegerGreaterThan(
1689 IN LARGE_INTEGER Operand1
,
1690 IN LARGE_INTEGER Operand2
);
1695 RtlLargeIntegerGreaterThanOrEqualTo(
1696 IN LARGE_INTEGER Operand1
,
1697 IN LARGE_INTEGER Operand2
);
1702 RtlLargeIntegerGreaterThanZero(
1703 IN LARGE_INTEGER Operand
);
1708 RtlLargeIntegerLessOrEqualToZero(
1709 IN LARGE_INTEGER Operand
);
1714 RtlLargeIntegerLessThan(
1715 IN LARGE_INTEGER Operand1
,
1716 IN LARGE_INTEGER Operand2
);
1721 RtlLargeIntegerLessThanOrEqualTo(
1722 IN LARGE_INTEGER Operand1
,
1723 IN LARGE_INTEGER Operand2
);
1728 RtlLargeIntegerLessThanZero(
1729 IN LARGE_INTEGER Operand
);
1734 RtlLargeIntegerNegate(
1735 IN LARGE_INTEGER Subtrahend
);
1740 RtlLargeIntegerNotEqualTo(
1741 IN LARGE_INTEGER Operand1
,
1742 IN LARGE_INTEGER Operand2
);
1747 RtlLargeIntegerNotEqualToZero(
1748 IN LARGE_INTEGER Operand
);
1753 RtlLargeIntegerShiftLeft(
1754 IN LARGE_INTEGER LargeInteger
,
1755 IN CCHAR ShiftCount
);
1760 RtlLargeIntegerShiftRight(
1761 IN LARGE_INTEGER LargeInteger
,
1762 IN CCHAR ShiftCount
);
1767 RtlLargeIntegerSubtract(
1768 IN LARGE_INTEGER Minuend
,
1769 IN LARGE_INTEGER Subtrahend
);
1774 * COMPUTE_PAGES_SPANNED(
1778 #define COMPUTE_PAGES_SPANNED(Va, \
1780 (ADDRESS_AND_SIZE_TO_SPAN_PAGES(Va, Size))
1784 ** Architecture specific structures
1790 // NT-ARM is not documented
1799 #endif /* __WINDDK_H */