[FREELDR] Include ntddk.h instead of winddk.h
[reactos.git] / include / ddk / winddk.h
1 /*
2 * winddk.h
3 *
4 * Windows Device Driver Kit
5 *
6 * This file is part of the w32api package.
7 *
8 * Contributors:
9 * Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
10 *
11 * THIS SOFTWARE IS NOT COPYRIGHTED
12 *
13 * This source code is offered for use in the public domain. You may
14 * use, modify or distribute it freely.
15 *
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.
20 *
21 */
22
23 #ifndef __WINDDK_H
24 #define __WINDDK_H
25
26 /* Helper macro to enable gcc's extension. */
27 #ifndef __GNU_EXTENSION
28 #ifdef __GNUC__
29 #define __GNU_EXTENSION __extension__
30 #else
31 #define __GNU_EXTENSION
32 #endif
33 #endif
34
35 #ifdef __cplusplus
36 extern "C" {
37 #endif
38
39 #include <excpt.h>
40 #include <ntdef.h>
41 #include <ntstatus.h>
42
43 #include "intrin.h"
44
45 /* Pseudo modifiers for parameters */
46 #ifndef IN
47 #define IN
48 #endif
49 #ifndef OUT
50 #define OUT
51 #endif
52 #ifndef OPTIONAL
53 #define OPTIONAL
54 #endif
55 #ifndef UNALLIGNED
56 #define UNALLIGNED
57 #endif
58
59 #define CONST const
60
61 #define RESTRICTED_POINTER
62
63 #define DECLSPEC_ADDRSAFE
64
65 #ifdef NONAMELESSUNION
66 # define _DDK_DUMMYUNION_MEMBER(name) DUMMYUNIONNAME.name
67 # define _DDK_DUMMYUNION_N_MEMBER(n, name) DUMMYUNIONNAME##n.name
68 #else
69 # define _DDK_DUMMYUNION_MEMBER(name) name
70 # define _DDK_DUMMYUNION_N_MEMBER(n, name) name
71 #endif
72
73 /*
74 ** Forward declarations
75 */
76
77 struct _KPCR;
78 struct _KPRCB;
79 struct _KTSS;
80 struct _DRIVE_LAYOUT_INFORMATION_EX;
81 struct _LOADER_PARAMETER_BLOCK;
82 struct _BUS_HANDLER;
83
84 #if 1
85 /* FIXME: Unknown definitions */
86 struct _SET_PARTITION_INFORMATION_EX;
87 #define WaitAll 0
88 #define WaitAny 1
89 typedef HANDLE TRACEHANDLE;
90 typedef PVOID PWMILIB_CONTEXT;
91 #endif
92
93 /*
94 ** WmiLib specific structure
95 */
96 typedef enum
97 {
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;
103
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
109
110 typedef enum _DPFLTR_TYPE
111 {
112 DPFLTR_SYSTEM_ID = 0,
113 DPFLTR_SMSS_ID = 1,
114 DPFLTR_SETUP_ID = 2,
115 DPFLTR_NTFS_ID = 3,
116 DPFLTR_FSTUB_ID = 4,
117 DPFLTR_CRASHDUMP_ID = 5,
118 DPFLTR_CDAUDIO_ID = 6,
119 DPFLTR_CDROM_ID = 7,
120 DPFLTR_CLASSPNP_ID = 8,
121 DPFLTR_DISK_ID = 9,
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,
136 DPFLTR_ACPI_ID = 24,
137 DPFLTR_AMLI_ID = 25,
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,
153 DPFLTR_UHCD_ID = 41,
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,
160 DPFLTR_SIS_ID = 48,
161 DPFLTR_FLTMGR_ID = 49,
162 DPFLTR_WMICORE_ID = 50,
163 DPFLTR_BURNENG_ID = 51,
164 DPFLTR_IMAPI_ID = 52,
165 DPFLTR_SXS_ID = 53,
166 DPFLTR_FUSION_ID = 54,
167 DPFLTR_IDLETASK_ID = 55,
168 DPFLTR_SOFTPCI_ID = 56,
169 DPFLTR_TAPE_ID = 57,
170 DPFLTR_MCHGR_ID = 58,
171 DPFLTR_IDEP_ID = 59,
172 DPFLTR_PCIIDE_ID = 60,
173 DPFLTR_FLOPPY_ID = 61,
174 DPFLTR_FDC_ID = 62,
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,
180 DPFLTR_PCI_ID = 68,
181 DPFLTR_DMIO_ID = 69,
182 DPFLTR_DMCONFIG_ID = 70,
183 DPFLTR_DMADMIN_ID = 71,
184 DPFLTR_WSOCKTRANSPORT_ID = 72,
185 DPFLTR_VSS_ID = 73,
186 DPFLTR_PNPMEM_ID = 74,
187 DPFLTR_PROCESSOR_ID = 75,
188 DPFLTR_DMSERVER_ID = 76,
189 DPFLTR_SR_ID = 77,
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,
197 DPFLTR_HPS_ID = 85,
198 DPFLTR_RTLTHREADPOOL_ID = 86,
199 DPFLTR_LDR_ID = 87,
200 DPFLTR_TCPIP6_ID = 88,
201 DPFLTR_ISAPNP_ID = 89,
202 DPFLTR_SHPC_ID = 90,
203 DPFLTR_STORPORT_ID = 91,
204 DPFLTR_STORMINIPORT_ID = 92,
205 DPFLTR_PRINTSPOOLER_ID = 93,
206 DPFLTR_VDS_ID = 94,
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,
212 DPFLTR_MM_ID = 100,
213 DPFLTR_DFSC_ID = 101,
214 DPFLTR_WOW64_ID = 102,
215 DPFLTR_ENDOFTABLE_ID
216 } DPFLTR_TYPE;
217
218 /* also in winnt.h */
219
220 #define FILE_COPY_STRUCTURED_STORAGE 0x00000041
221 #define FILE_STRUCTURED_STORAGE 0x00000441
222
223 /* end winnt.h */
224
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;
234
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);
241
242 typedef NTSTATUS
243 (DDKAPI *PDRIVER_ENTRY)(
244 IN struct _DRIVER_OBJECT *DriverObject,
245 IN PUNICODE_STRING RegistryPath);
246
247 typedef BOOLEAN
248 (DDKAPI *PKTRANSFER_ROUTINE)(
249 VOID);
250
251 #define ASSERT_GATE(object) \
252 ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == GateObject) || \
253 (((object)->Header.Type & KOBJECT_TYPE_MASK) == EventSynchronizationObject))
254
255 #define TIMER_TABLE_SIZE 512
256 #define TIMER_TABLE_SHIFT 9
257
258 #define ASSERT_TIMER(E) \
259 ASSERT(((E)->Header.Type == TimerNotificationObject) || \
260 ((E)->Header.Type == TimerSynchronizationObject))
261
262 #define ASSERT_MUTANT(E) \
263 ASSERT((E)->Header.Type == MutantObject)
264
265 #define ASSERT_SEMAPHORE(E) \
266 ASSERT((E)->Header.Type == SemaphoreObject)
267
268 #define ASSERT_EVENT(E) \
269 ASSERT(((E)->Header.Type == NotificationEvent) || \
270 ((E)->Header.Type == SynchronizationEvent))
271
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
280
281 /* Function Type Defintions for Dispatch Functions */
282 struct _DEVICE_CONTROL_CONTEXT;
283
284 typedef VOID
285 (DDKAPI *PDEVICE_CONTROL_COMPLETION)(
286 IN struct _DEVICE_CONTROL_CONTEXT *ControlContext);
287
288 typedef struct _DEVICE_CONTROL_CONTEXT {
289 NTSTATUS Status;
290 PDEVICE_HANDLER_OBJECT DeviceHandler;
291 PDEVICE_OBJECT DeviceObject;
292 ULONG ControlCode;
293 PVOID Buffer;
294 PULONG BufferLength;
295 PVOID Context;
296 } DEVICE_CONTROL_CONTEXT, *PDEVICE_CONTROL_CONTEXT;
297
298 typedef NTSTATUS
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,
305 IN PVOID Context,
306 IN PDEVICE_CONTROL_COMPLETION CompletionRoutine);
307
308 typedef
309 ULONG
310 (DDKAPI *pHalGetInterruptVector)(
311 IN INTERFACE_TYPE InterfaceType,
312 IN ULONG BusNumber,
313 IN ULONG BusInterruptLevel,
314 IN ULONG BusInterruptVector,
315 OUT PKIRQL Irql,
316 OUT PKAFFINITY Affinity
317 );
318
319 typedef
320 NTSTATUS
321 (DDKAPI *pHalGetVectorInput)(
322 IN ULONG Vector,
323 IN KAFFINITY Affinity,
324 OUT PULONG Input,
325 OUT PKINTERRUPT_POLARITY Polarity
326 );
327
328 typedef
329 PVOID
330 (DDKAPI *pKdMapPhysicalMemory64)(
331 IN PHYSICAL_ADDRESS PhysicalAddress,
332 IN ULONG NumberPages
333 );
334
335 typedef
336 VOID
337 (DDKAPI *pKdUnmapVirtualAddress)(
338 IN PVOID VirtualAddress,
339 IN ULONG NumberPages
340 );
341
342 typedef
343 ULONG
344 (DDKAPI *pKdGetPciDataByOffset)(
345 IN ULONG BusNumber,
346 IN ULONG SlotNumber,
347 OUT PVOID Buffer,
348 IN ULONG Offset,
349 IN ULONG Length
350 );
351
352 typedef
353 ULONG
354 (DDKAPI *pKdSetPciDataByOffset)(
355 IN ULONG BusNumber,
356 IN ULONG SlotNumber,
357 IN PVOID Buffer,
358 IN ULONG Offset,
359 IN ULONG Length
360 );
361
362 typedef struct _FILE_ALIGNMENT_INFORMATION {
363 ULONG AlignmentRequirement;
364 } FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION;
365
366 typedef struct _FILE_NAME_INFORMATION {
367 ULONG FileNameLength;
368 WCHAR FileName[1];
369 } FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;
370
371
372 typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION {
373 ULONG FileAttributes;
374 ULONG ReparseTag;
375 } FILE_ATTRIBUTE_TAG_INFORMATION, *PFILE_ATTRIBUTE_TAG_INFORMATION;
376
377 typedef struct _FILE_DISPOSITION_INFORMATION {
378 BOOLEAN DeleteFile;
379 } FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION;
380
381 typedef struct _FILE_END_OF_FILE_INFORMATION {
382 LARGE_INTEGER EndOfFile;
383 } FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION;
384
385 typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION {
386 LARGE_INTEGER ValidDataLength;
387 } FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION;
388
389 typedef union _FILE_SEGMENT_ELEMENT {
390 PVOID64 Buffer;
391 ULONGLONG Alignment;
392 }FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT;
393
394 #define SE_UNSOLICITED_INPUT_PRIVILEGE 6
395
396 typedef struct _KEY_USER_FLAGS_INFORMATION {
397 ULONG UserFlags;
398 } KEY_USER_FLAGS_INFORMATION, *PKEY_USER_FLAGS_INFORMATION;
399
400 #define PCI_ADDRESS_MEMORY_SPACE 0x00000000
401
402 NTSYSAPI
403 ULONGLONG
404 DDKAPI
405 VerSetConditionMask(
406 IN ULONGLONG ConditionMask,
407 IN ULONG TypeMask,
408 IN UCHAR Condition);
409
410 #define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType) \
411 ((ConditionMask) = VerSetConditionMask((ConditionMask), \
412 (TypeBitMask), (ComparisonType)))
413
414 /* RtlVerifyVersionInfo() TypeMask */
415
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
424
425 /* RtlVerifyVersionInfo() ComparisonType */
426
427 #define VER_EQUAL 1
428 #define VER_GREATER 2
429 #define VER_GREATER_EQUAL 3
430 #define VER_LESS 4
431 #define VER_LESS_EQUAL 5
432 #define VER_AND 6
433 #define VER_OR 7
434
435 #define VER_CONDITION_MASK 7
436 #define VER_NUM_BITS_PER_CONDITION_MASK 3
437
438 struct _RTL_RANGE;
439
440 typedef BOOLEAN
441 (NTAPI *PRTL_CONFLICT_RANGE_CALLBACK) (
442 PVOID Context,
443 struct _RTL_RANGE *Range
444 );
445
446 typedef enum _IO_QUERY_DEVICE_DATA_FORMAT {
447 IoQueryDeviceIdentifier = 0,
448 IoQueryDeviceConfigurationData,
449 IoQueryDeviceComponentInformation,
450 IoQueryDeviceMaxData
451 } IO_QUERY_DEVICE_DATA_FORMAT, *PIO_QUERY_DEVICE_DATA_FORMAT;
452
453
454
455 #define IMAGE_ADDRESSING_MODE_32BIT 3
456
457 typedef struct _NT_TIB {
458 struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
459 PVOID StackBase;
460 PVOID StackLimit;
461 PVOID SubSystemTib;
462 _ANONYMOUS_UNION union {
463 PVOID FiberData;
464 ULONG Version;
465 } DUMMYUNIONNAME;
466 PVOID ArbitraryUserPointer;
467 struct _NT_TIB *Self;
468 } NT_TIB, *PNT_TIB;
469
470 typedef struct _NT_TIB32 {
471 ULONG ExceptionList;
472 ULONG StackBase;
473 ULONG StackLimit;
474 ULONG SubSystemTib;
475 __GNU_EXTENSION union {
476 ULONG FiberData;
477 ULONG Version;
478 };
479 ULONG ArbitraryUserPointer;
480 ULONG Self;
481 } NT_TIB32,*PNT_TIB32;
482
483 typedef struct _NT_TIB64 {
484 ULONG64 ExceptionList;
485 ULONG64 StackBase;
486 ULONG64 StackLimit;
487 ULONG64 SubSystemTib;
488 __GNU_EXTENSION union {
489 ULONG64 FiberData;
490 ULONG Version;
491 };
492 ULONG64 ArbitraryUserPointer;
493 ULONG64 Self;
494 } NT_TIB64,*PNT_TIB64;
495
496 typedef struct _PROCESS_BASIC_INFORMATION
497 {
498 NTSTATUS ExitStatus;
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;
505
506 typedef struct _PROCESS_WS_WATCH_INFORMATION
507 {
508 PVOID FaultingPc;
509 PVOID FaultingVa;
510 } PROCESS_WS_WATCH_INFORMATION, *PPROCESS_WS_WATCH_INFORMATION;
511
512 typedef struct _PROCESS_DEVICEMAP_INFORMATION
513 {
514 __GNU_EXTENSION union
515 {
516 struct
517 {
518 HANDLE DirectoryHandle;
519 } Set;
520 struct
521 {
522 ULONG DriveMap;
523 UCHAR DriveType[32];
524 } Query;
525 };
526 } PROCESS_DEVICEMAP_INFORMATION, *PPROCESS_DEVICEMAP_INFORMATION;
527
528 typedef struct _KERNEL_USER_TIMES
529 {
530 LARGE_INTEGER CreateTime;
531 LARGE_INTEGER ExitTime;
532 LARGE_INTEGER KernelTime;
533 LARGE_INTEGER UserTime;
534 } KERNEL_USER_TIMES, *PKERNEL_USER_TIMES;
535
536 typedef struct _PROCESS_ACCESS_TOKEN
537 {
538 HANDLE Token;
539 HANDLE Thread;
540 } PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN;
541
542 typedef struct _PROCESS_SESSION_INFORMATION
543 {
544 ULONG SessionId;
545 } PROCESS_SESSION_INFORMATION, *PPROCESS_SESSION_INFORMATION;
546
547 /*
548 ** Storage structures
549 */
550 typedef enum _PARTITION_STYLE {
551 PARTITION_STYLE_MBR,
552 PARTITION_STYLE_GPT,
553 PARTITION_STYLE_RAW
554 } PARTITION_STYLE;
555
556 typedef struct _CREATE_DISK_MBR {
557 ULONG Signature;
558 } CREATE_DISK_MBR, *PCREATE_DISK_MBR;
559
560 typedef struct _CREATE_DISK_GPT {
561 GUID DiskId;
562 ULONG MaxPartitionCount;
563 } CREATE_DISK_GPT, *PCREATE_DISK_GPT;
564
565 typedef struct _CREATE_DISK {
566 PARTITION_STYLE PartitionStyle;
567 _ANONYMOUS_UNION union {
568 CREATE_DISK_MBR Mbr;
569 CREATE_DISK_GPT Gpt;
570 } DUMMYUNIONNAME;
571 } CREATE_DISK, *PCREATE_DISK;
572
573 typedef VOID
574 (FASTCALL*PTIME_UPDATE_NOTIFY_ROUTINE)(
575 IN HANDLE ThreadId,
576 IN KPROCESSOR_MODE Mode);
577
578 typedef ULONG_PTR
579 (NTAPI *PDRIVER_VERIFIER_THUNK_ROUTINE)(
580 IN PVOID Context);
581
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;
586
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
592
593 /*
594 ** Architecture specific structures
595 */
596 #define PCR_MINOR_VERSION 1
597 #define PCR_MAJOR_VERSION 1
598
599 #ifdef _X86_
600
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)
610
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 */
619 } DUMMYUNIONNAME;
620 PVOID ArbitraryUserPointer; /* 14 */
621 struct _KPCR_TIB *Self; /* 18 */
622 } KPCR_TIB, *PKPCR_TIB; /* 1C */
623
624 typedef struct _KPCR {
625 KPCR_TIB Tib; /* 00 */
626 struct _KPCR *Self; /* 1C */
627 struct _KPRCB *Prcb; /* 20 */
628 KIRQL Irql; /* 24 */
629 ULONG IRR; /* 28 */
630 ULONG IrrActive; /* 2C */
631 ULONG IDR; /* 30 */
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 */
642 UCHAR Spare0;
643 UCHAR SecondLevelCacheAssociativity;
644 ULONG VdmAlert;
645 ULONG KernelReserved[14]; // For use by the kernel
646 ULONG SecondLevelCacheSize;
647 ULONG HalReserved[16]; // For use by Hal
648 } KPCR, *PKPCR; /* 54 */
649
650 #define KeGetPcr() PCR
651
652 FORCEINLINE
653 ULONG
654 KeGetCurrentProcessorNumber(VOID)
655 {
656 return (ULONG)__readfsbyte(FIELD_OFFSET(KPCR, Number));
657 }
658
659 extern NTKERNELAPI PVOID MmHighestUserAddress;
660 extern NTKERNELAPI PVOID MmSystemRangeStart;
661 extern NTKERNELAPI ULONG_PTR MmUserProbeAddress;
662
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
668
669 #define MM_KSEG0_BASE MM_SYSTEM_RANGE_START
670 #define MM_SYSTEM_SPACE_END 0xFFFFFFFF
671
672 #elif defined(__x86_64__)
673
674 typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
675 ULONG64 P1Home;
676 ULONG64 P2Home;
677 ULONG64 P3Home;
678 ULONG64 P4Home;
679 ULONG64 P5Home;
680 ULONG64 P6Home;
681
682 /* Control flags */
683 ULONG ContextFlags;
684 ULONG MxCsr;
685
686 /* Segment */
687 USHORT SegCs;
688 USHORT SegDs;
689 USHORT SegEs;
690 USHORT SegFs;
691 USHORT SegGs;
692 USHORT SegSs;
693 ULONG EFlags;
694
695 /* Debug */
696 ULONG64 Dr0;
697 ULONG64 Dr1;
698 ULONG64 Dr2;
699 ULONG64 Dr3;
700 ULONG64 Dr6;
701 ULONG64 Dr7;
702
703 /* Integer */
704 ULONG64 Rax;
705 ULONG64 Rcx;
706 ULONG64 Rdx;
707 ULONG64 Rbx;
708 ULONG64 Rsp;
709 ULONG64 Rbp;
710 ULONG64 Rsi;
711 ULONG64 Rdi;
712 ULONG64 R8;
713 ULONG64 R9;
714 ULONG64 R10;
715 ULONG64 R11;
716 ULONG64 R12;
717 ULONG64 R13;
718 ULONG64 R14;
719 ULONG64 R15;
720
721 /* Counter */
722 ULONG64 Rip;
723
724 /* Floating point */
725 union {
726 XMM_SAVE_AREA32 FltSave;
727 struct {
728 M128A Header[2];
729 M128A Legacy[8];
730 M128A Xmm0;
731 M128A Xmm1;
732 M128A Xmm2;
733 M128A Xmm3;
734 M128A Xmm4;
735 M128A Xmm5;
736 M128A Xmm6;
737 M128A Xmm7;
738 M128A Xmm8;
739 M128A Xmm9;
740 M128A Xmm10;
741 M128A Xmm11;
742 M128A Xmm12;
743 M128A Xmm13;
744 M128A Xmm14;
745 M128A Xmm15;
746 } DUMMYSTRUCTNAME;
747 } DUMMYUNIONNAME;
748
749 /* Vector */
750 M128A VectorRegister[26];
751 ULONG64 VectorControl;
752
753 /* Debug control */
754 ULONG64 DebugControl;
755 ULONG64 LastBranchToRip;
756 ULONG64 LastBranchFromRip;
757 ULONG64 LastExceptionToRip;
758 ULONG64 LastExceptionFromRip;
759 } CONTEXT;
760
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)
775
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
785
786 extern NTKERNELAPI PVOID MmHighestUserAddress;
787 extern NTKERNELAPI PVOID MmSystemRangeStart;
788 extern NTKERNELAPI ULONG_PTR MmUserProbeAddress;
789
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
796
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)
801
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
808
809 typedef struct _KPCR
810 {
811 __GNU_EXTENSION union
812 {
813 NT_TIB NtTib;
814 __GNU_EXTENSION struct
815 {
816 union _KGDTENTRY64 *GdtBase;
817 struct _KTSS64 *TssBase;
818 ULONG64 UserRsp;
819 struct _KPCR *Self;
820 struct _KPRCB *CurrentPrcb;
821 PKSPIN_LOCK_QUEUE LockArray;
822 PVOID Used_Self;
823 };
824 };
825 union _KIDTENTRY64 *IdtBase;
826 ULONG64 Unused[2];
827 KIRQL Irql;
828 UCHAR SecondLevelCacheAssociativity;
829 UCHAR ObsoleteNumber;
830 UCHAR Fill0;
831 ULONG Unused0[3];
832 USHORT MajorVersion;
833 USHORT MinorVersion;
834 ULONG StallScaleFactor;
835 PVOID Unused1[3];
836 ULONG KernelReserved[15];
837 ULONG SecondLevelCacheSize;
838 ULONG HalReserved[16];
839 ULONG Unused2;
840 PVOID KdVersionBlock;
841 PVOID Unused3;
842 ULONG PcrAlign1[24];
843 } KPCR, *PKPCR;
844
845 typedef struct _KFLOATING_SAVE {
846 ULONG Dummy;
847 } KFLOATING_SAVE, *PKFLOATING_SAVE;
848
849 FORCEINLINE
850 PKPCR
851 KeGetPcr(VOID)
852 {
853 return (PKPCR)__readgsqword(FIELD_OFFSET(KPCR, Self));
854 }
855
856 FORCEINLINE
857 ULONG
858 KeGetCurrentProcessorNumber(VOID)
859 {
860 return (ULONG)__readgsword(0x184);
861 }
862
863 #elif defined(__PowerPC__)
864
865 //
866 // Used to contain PFNs and PFN counts
867 //
868 typedef ULONG PFN_COUNT;
869 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
870 typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
871
872 #define PASSIVE_LEVEL 0
873 #define LOW_LEVEL 0
874 #define APC_LEVEL 1
875 #define DISPATCH_LEVEL 2
876 #define PROFILE_LEVEL 27
877 #define CLOCK1_LEVEL 28
878 #define CLOCK2_LEVEL 28
879 #define IPI_LEVEL 29
880 #define POWER_LEVEL 30
881 #define HIGH_LEVEL 31
882
883 typedef struct _KFLOATING_SAVE {
884 ULONG Dummy;
885 } KFLOATING_SAVE, *PKFLOATING_SAVE;
886
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 */
895 } DUMMYUNIONNAME;
896 PVOID ArbitraryUserPointer; /* 14 */
897 struct _KPCR_TIB *Self; /* 18 */
898 } KPCR_TIB, *PKPCR_TIB; /* 1C */
899
900 #define PCR_MINOR_VERSION 1
901 #define PCR_MAJOR_VERSION 1
902
903 typedef struct _KPCR {
904 KPCR_TIB Tib; /* 00 */
905 struct _KPCR *Self; /* 1C */
906 struct _KPRCB *Prcb; /* 20 */
907 KIRQL Irql; /* 24 */
908 ULONG IRR; /* 28 */
909 ULONG IrrActive; /* 2C */
910 ULONG IDR; /* 30 */
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 */
922
923 #define KeGetPcr() PCR
924
925 static __inline
926 ULONG
927 DDKAPI
928 KeGetCurrentProcessorNumber(VOID)
929 {
930 ULONG Number;
931 __asm__ __volatile__ (
932 "lwz %0, %c1(12)\n"
933 : "=r" (Number)
934 : "i" (FIELD_OFFSET(KPCR, Number))
935 );
936 return Number;
937 }
938
939 #elif defined(_MIPS_)
940
941 #error MIPS Headers are totally incorrect
942
943 //
944 // Used to contain PFNs and PFN counts
945 //
946 typedef ULONG PFN_COUNT;
947 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
948 typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
949
950 #define PASSIVE_LEVEL 0
951 #define APC_LEVEL 1
952 #define DISPATCH_LEVEL 2
953 #define PROFILE_LEVEL 27
954 #define IPI_LEVEL 29
955 #define HIGH_LEVEL 31
956
957 typedef struct _KPCR {
958 struct _KPRCB *Prcb; /* 20 */
959 KIRQL Irql; /* 24 */
960 ULONG IRR; /* 28 */
961 ULONG IDR; /* 30 */
962 } KPCR, *PKPCR;
963
964 #define KeGetPcr() PCR
965
966 typedef struct _KFLOATING_SAVE {
967 } KFLOATING_SAVE, *PKFLOATING_SAVE;
968
969 static __inline
970 ULONG
971 DDKAPI
972 KeGetCurrentProcessorNumber(VOID)
973 {
974 return 0;
975 }
976
977 #elif defined(_M_ARM)
978
979 //
980 // NT-ARM is not documented, need DDK-ARM
981 //
982 #include <armddk.h>
983
984 #else
985 #error Unknown architecture
986 #endif
987
988 /** SPINLOCK FUNCTIONS ********************************************************/
989
990 #if defined (_X86_)
991
992 #if defined(WIN9X_COMPAT_SPINLOCK)
993
994 NTKERNELAPI
995 VOID
996 NTAPI
997 KeInitializeSpinLock(
998 IN PKSPIN_LOCK SpinLock
999 );
1000
1001 #else
1002
1003 FORCEINLINE
1004 VOID
1005 KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock)
1006 {
1007 /* Clear the lock */
1008 *SpinLock = 0;
1009 }
1010
1011 #endif
1012
1013 NTHALAPI
1014 KIRQL
1015 FASTCALL
1016 KfAcquireSpinLock(
1017 IN PKSPIN_LOCK SpinLock);
1018
1019 NTHALAPI
1020 VOID
1021 FASTCALL
1022 KfReleaseSpinLock(
1023 IN PKSPIN_LOCK SpinLock,
1024 IN KIRQL NewIrql);
1025
1026 NTKERNELAPI
1027 VOID
1028 FASTCALL
1029 KefAcquireSpinLockAtDpcLevel(
1030 IN PKSPIN_LOCK SpinLock);
1031
1032 NTKERNELAPI
1033 VOID
1034 FASTCALL
1035 KefReleaseSpinLockFromDpcLevel(
1036 IN PKSPIN_LOCK SpinLock);
1037
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)
1042
1043 #define KeGetDcacheFillSize() 1L
1044
1045 #elif defined(_M_ARM) // !defined (_X86_)
1046
1047 FORCEINLINE
1048 VOID
1049 KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock)
1050 {
1051 /* Clear the lock */
1052 *SpinLock = 0;
1053 }
1054
1055 NTHALAPI
1056 KIRQL
1057 FASTCALL
1058 KfAcquireSpinLock(
1059 IN PKSPIN_LOCK SpinLock);
1060
1061 NTHALAPI
1062 VOID
1063 FASTCALL
1064 KfReleaseSpinLock(
1065 IN PKSPIN_LOCK SpinLock,
1066 IN KIRQL NewIrql);
1067
1068
1069 NTKERNELAPI
1070 VOID
1071 FASTCALL
1072 KefAcquireSpinLockAtDpcLevel(
1073 IN PKSPIN_LOCK SpinLock);
1074
1075 NTKERNELAPI
1076 VOID
1077 FASTCALL
1078 KefReleaseSpinLockFromDpcLevel(
1079 IN PKSPIN_LOCK SpinLock);
1080
1081
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)
1086
1087 NTKERNELAPI
1088 VOID
1089 NTAPI
1090 KeInitializeSpinLock(
1091 IN PKSPIN_LOCK SpinLock);
1092
1093 #else
1094
1095 FORCEINLINE
1096 VOID
1097 NTAPI
1098 KeInitializeSpinLock(
1099 PKSPIN_LOCK SpinLock)
1100 {
1101 *SpinLock = 0;
1102 }
1103
1104 NTKERNELAPI
1105 VOID
1106 KeReleaseSpinLock(
1107 IN PKSPIN_LOCK SpinLock,
1108 IN KIRQL NewIrql);
1109
1110 NTKERNELAPI
1111 VOID
1112 KeAcquireSpinLockAtDpcLevel(
1113 IN PKSPIN_LOCK SpinLock);
1114
1115 NTKERNELAPI
1116 VOID
1117 KeReleaseSpinLockFromDpcLevel(
1118 IN PKSPIN_LOCK SpinLock);
1119
1120 NTKERNELAPI
1121 KIRQL
1122 KeAcquireSpinLockRaiseToDpc(
1123 IN PKSPIN_LOCK SpinLock);
1124
1125 #define KeAcquireSpinLock(SpinLock, OldIrql) \
1126 *(OldIrql) = KeAcquireSpinLockRaiseToDpc(SpinLock)
1127
1128 #endif // !defined (_X86_)
1129
1130 #define ARGUMENT_PRESENT(ArgumentPointer) \
1131 ((CHAR*)((ULONG_PTR)(ArgumentPointer)) != (CHAR*)NULL)
1132
1133 NTSYSAPI
1134 VOID
1135 NTAPI
1136 RtlCopyMemory32(
1137 IN VOID UNALIGNED *Destination,
1138 IN CONST VOID UNALIGNED *Source,
1139 IN ULONG Length);
1140
1141 /** Kernel routines **/
1142
1143 #ifdef _X86_
1144
1145 static __inline
1146 VOID
1147 KeMemoryBarrier(
1148 VOID)
1149 {
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
1155 #endif
1156 }
1157
1158 #endif
1159
1160 #if !defined(_M_AMD64)
1161
1162 NTKERNELAPI
1163 VOID
1164 NTAPI
1165 KeQueryTickCount(
1166 OUT PLARGE_INTEGER TickCount);
1167 #endif
1168
1169 NTKERNELAPI
1170 VOID
1171 FASTCALL
1172 KeSetTimeUpdateNotifyRoutine(
1173 IN PTIME_UPDATE_NOTIFY_ROUTINE NotifyRoutine);
1174
1175 #if defined(_X86_)
1176
1177 NTHALAPI
1178 VOID
1179 FASTCALL
1180 KfLowerIrql(
1181 IN KIRQL NewIrql);
1182
1183 NTHALAPI
1184 KIRQL
1185 FASTCALL
1186 KfRaiseIrql(
1187 IN KIRQL NewIrql);
1188
1189 NTHALAPI
1190 KIRQL
1191 DDKAPI
1192 KeRaiseIrqlToDpcLevel(
1193 VOID);
1194
1195 NTHALAPI
1196 KIRQL
1197 DDKAPI
1198 KeRaiseIrqlToSynchLevel(
1199 VOID);
1200
1201 #define KeLowerIrql(a) KfLowerIrql(a)
1202 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
1203
1204 #elif defined(_M_AMD64)
1205
1206 FORCEINLINE
1207 KIRQL
1208 KeGetCurrentIrql(VOID)
1209 {
1210 return (KIRQL)__readcr8();
1211 }
1212
1213 FORCEINLINE
1214 VOID
1215 KeLowerIrql(IN KIRQL NewIrql)
1216 {
1217 ASSERT(KeGetCurrentIrql() >= NewIrql);
1218 __writecr8(NewIrql);
1219 }
1220
1221 FORCEINLINE
1222 KIRQL
1223 KfRaiseIrql(IN KIRQL NewIrql)
1224 {
1225 KIRQL OldIrql;
1226
1227 OldIrql = __readcr8();
1228 ASSERT(OldIrql <= NewIrql);
1229 __writecr8(NewIrql);
1230 return OldIrql;
1231 }
1232 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
1233
1234 FORCEINLINE
1235 KIRQL
1236 KeRaiseIrqlToDpcLevel(VOID)
1237 {
1238 return KfRaiseIrql(DISPATCH_LEVEL);
1239 }
1240
1241 FORCEINLINE
1242 KIRQL
1243 KeRaiseIrqlToSynchLevel(VOID)
1244 {
1245 return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2
1246 }
1247
1248 #elif defined(__PowerPC__)
1249
1250 NTHALAPI
1251 VOID
1252 FASTCALL
1253 KfLowerIrql(
1254 IN KIRQL NewIrql);
1255
1256 NTHALAPI
1257 KIRQL
1258 FASTCALL
1259 KfRaiseIrql(
1260 IN KIRQL NewIrql);
1261
1262 NTHALAPI
1263 KIRQL
1264 DDKAPI
1265 KeRaiseIrqlToDpcLevel(
1266 VOID);
1267
1268 NTHALAPI
1269 KIRQL
1270 DDKAPI
1271 KeRaiseIrqlToSynchLevel(
1272 VOID);
1273
1274 #define KeLowerIrql(a) KfLowerIrql(a)
1275 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
1276
1277 #elif defined(_M_MIPS)
1278
1279 #define KeLowerIrql(a) KfLowerIrql(a)
1280 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
1281
1282 NTKERNELAPI
1283 VOID
1284 NTAPI
1285 KfLowerIrql(
1286 IN KIRQL NewIrql);
1287
1288 NTKERNELAPI
1289 KIRQL
1290 NTAPI
1291 KfRaiseIrql(
1292 IN KIRQL NewIrql);
1293
1294 NTKERNELAPI
1295 KIRQL
1296 NTAPI
1297 KeRaiseIrqlToDpcLevel(
1298 VOID);
1299
1300 NTKERNELAPI
1301 KIRQL
1302 DDKAPI
1303 KeRaiseIrqlToSynchLevel(
1304 VOID);
1305
1306 #elif defined(_M_ARM)
1307
1308 #include <armddk.h>
1309
1310 #else
1311
1312 NTKERNELAPI
1313 VOID
1314 NTAPI
1315 KeLowerIrql(
1316 IN KIRQL NewIrql);
1317
1318 NTKERNELAPI
1319 VOID
1320 NTAPI
1321 KeRaiseIrql(
1322 IN KIRQL NewIrql,
1323 OUT PKIRQL OldIrql);
1324
1325 NTKERNELAPI
1326 KIRQL
1327 NTAPI
1328 KeRaiseIrqlToDpcLevel(
1329 VOID);
1330
1331 NTKERNELAPI
1332 KIRQL
1333 DDKAPI
1334 KeRaiseIrqlToSynchLevel(
1335 VOID);
1336
1337 #endif
1338
1339 /** Memory manager routines **/
1340
1341 NTKERNELAPI
1342 NTSTATUS
1343 NTAPI
1344 MmMarkPhysicalMemoryAsBad(
1345 IN PPHYSICAL_ADDRESS StartAddress,
1346 IN OUT PLARGE_INTEGER NumberOfBytes);
1347
1348 NTKERNELAPI
1349 NTSTATUS
1350 NTAPI
1351 MmMarkPhysicalMemoryAsGood(
1352 IN PPHYSICAL_ADDRESS StartAddress,
1353 IN OUT PLARGE_INTEGER NumberOfBytes);
1354
1355 /*
1356 * ULONG
1357 * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
1358 * IN PVOID Va,
1359 * IN ULONG Size)
1360 */
1361 #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, \
1362 _Size) \
1363 ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
1364 + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
1365
1366 NTKERNELAPI
1367 PVOID
1368 NTAPI
1369 MmLockPagableImageSection(
1370 IN PVOID AddressWithinSection);
1371
1372 /*
1373 * PVOID
1374 * MmLockPagableCodeSection(
1375 * IN PVOID AddressWithinSection)
1376 */
1377 #define MmLockPagableCodeSection(Address) MmLockPagableDataSection(Address)
1378
1379 NTKERNELAPI
1380 PVOID
1381 NTAPI
1382 MmLockPageableDataSection (
1383 IN PVOID AddressWithinSection
1384 );
1385
1386 NTKERNELAPI
1387 VOID
1388 NTAPI
1389 MmUnlockPageableImageSection(
1390 IN PVOID ImageSectionHandle
1391 );
1392
1393 /** Object manager routines **/
1394
1395 NTKERNELAPI
1396 NTSTATUS
1397 NTAPI
1398 ObAssignSecurity(
1399 IN PACCESS_STATE AccessState,
1400 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
1401 IN PVOID Object,
1402 IN POBJECT_TYPE Type);
1403
1404 NTKERNELAPI
1405 VOID
1406 NTAPI
1407 ObDereferenceSecurityDescriptor(
1408 PSECURITY_DESCRIPTOR SecurityDescriptor,
1409 ULONG Count);
1410
1411 NTKERNELAPI
1412 NTSTATUS
1413 NTAPI
1414 ObLogSecurityDescriptor(
1415 IN PSECURITY_DESCRIPTOR InputSecurityDescriptor,
1416 OUT PSECURITY_DESCRIPTOR *OutputSecurityDescriptor,
1417 IN ULONG RefBias);
1418
1419 NTKERNELAPI
1420 NTSTATUS
1421 NTAPI
1422 ObOpenObjectByName(
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);
1430
1431 NTKERNELAPI
1432 NTSTATUS
1433 NTAPI
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,
1442 OUT PVOID *Object);
1443
1444 NTKERNELAPI
1445 VOID
1446 NTAPI
1447 ObReferenceSecurityDescriptor(
1448 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
1449 IN ULONG Count);
1450
1451 /** Process manager routines **/
1452
1453 NTKERNELAPI
1454 NTSTATUS
1455 NTAPI
1456 PsCreateSystemProcess(
1457 IN PHANDLE ProcessHandle,
1458 IN ACCESS_MASK DesiredAccess,
1459 IN POBJECT_ATTRIBUTES ObjectAttributes);
1460
1461 /** NtXxx and ZwXxx routines **/
1462
1463 NTSYSCALLAPI
1464 NTSTATUS
1465 NTAPI
1466 NtClose(
1467 IN HANDLE Handle);
1468
1469 NTSYSCALLAPI
1470 NTSTATUS
1471 NTAPI
1472 NtCreateEvent(
1473 OUT PHANDLE EventHandle,
1474 IN ACCESS_MASK DesiredAccess,
1475 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
1476 IN EVENT_TYPE EventType,
1477 IN BOOLEAN InitialState);
1478
1479 NTSYSAPI
1480 NTSTATUS
1481 NTAPI
1482 ZwCreateEvent(
1483 OUT PHANDLE EventHandle,
1484 IN ACCESS_MASK DesiredAccess,
1485 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
1486 IN EVENT_TYPE EventType,
1487 IN BOOLEAN InitialState);
1488
1489 NTSYSCALLAPI
1490 NTSTATUS
1491 NTAPI
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);
1503
1504 NTSYSCALLAPI
1505 NTSTATUS
1506 NTAPI
1507 NtMapViewOfSection(
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,
1517 IN ULONG Protect);
1518
1519 NTSYSCALLAPI
1520 NTSTATUS
1521 NTAPI
1522 NtOpenFile(
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);
1529
1530
1531
1532 NTSYSAPI
1533 NTSTATUS
1534 NTAPI
1535 ZwOpenFile(
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);
1542
1543 NTSYSCALLAPI
1544 NTSTATUS
1545 NTAPI
1546 NtReadFile(
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,
1552 OUT PVOID Buffer,
1553 IN ULONG Length,
1554 IN PLARGE_INTEGER ByteOffset OPTIONAL,
1555 IN PULONG Key OPTIONAL);
1556
1557 NTSYSCALLAPI
1558 NTSTATUS
1559 NTAPI
1560 NtSetEvent(
1561 IN HANDLE EventHandle,
1562 OUT PLONG PreviousState OPTIONAL);
1563
1564 NTSYSAPI
1565 NTSTATUS
1566 NTAPI
1567 ZwSetEvent(
1568 IN HANDLE EventHandle,
1569 OUT PLONG PreviousState OPTIONAL);
1570
1571 /* [Nt|Zw]MapViewOfSection.InheritDisposition constants */
1572 #define AT_EXTENDABLE_FILE 0x00002000
1573 #define AT_RESERVED 0x20000000
1574 #define AT_ROUND_TO_PAGE 0x40000000
1575
1576 NTSYSCALLAPI
1577 NTSTATUS
1578 NTAPI
1579 NtUnmapViewOfSection(
1580 IN HANDLE ProcessHandle,
1581 IN PVOID BaseAddress);
1582
1583 NTSYSCALLAPI
1584 NTSTATUS
1585 NTAPI
1586 NtWaitForSingleObject(
1587 IN HANDLE ObjectHandle,
1588 IN BOOLEAN Alertable,
1589 IN PLARGE_INTEGER TimeOut OPTIONAL);
1590
1591 NTSYSCALLAPI
1592 NTSTATUS
1593 NTAPI
1594 NtWriteFile(
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,
1600 IN PVOID Buffer,
1601 IN ULONG Length,
1602 IN PLARGE_INTEGER ByteOffset OPTIONAL,
1603 IN PULONG Key OPTIONAL);
1604
1605 /** Power management support routines **/
1606
1607 NTKERNELAPI
1608 NTSTATUS
1609 NTAPI
1610 PoRequestShutdownEvent(
1611 OUT PVOID *Event);
1612
1613 /** WMI library support routines **/
1614
1615 NTSTATUS
1616 NTAPI
1617 WmiCompleteRequest(
1618 IN PDEVICE_OBJECT DeviceObject,
1619 IN PIRP Irp,
1620 IN NTSTATUS Status,
1621 IN ULONG BufferUsed,
1622 IN CCHAR PriorityBoost);
1623
1624 NTSTATUS
1625 NTAPI
1626 WmiFireEvent(
1627 IN PDEVICE_OBJECT DeviceObject,
1628 IN LPGUID Guid,
1629 IN ULONG InstanceIndex,
1630 IN ULONG EventDataSize,
1631 IN PVOID EventData);
1632
1633 NTSTATUS
1634 NTAPI
1635 WmiSystemControl(
1636 IN PWMILIB_CONTEXT WmiLibInfo,
1637 IN PDEVICE_OBJECT DeviceObject,
1638 IN PIRP Irp,
1639 OUT PSYSCTL_IRP_DISPOSITION IrpDisposition);
1640
1641 /** Stuff from winnt4.h */
1642
1643 #ifndef _X86_
1644 NTKERNELAPI
1645 INTERLOCKED_RESULT
1646 NTAPI
1647 ExInterlockedDecrementLong(
1648 IN PLONG Addend,
1649 IN PKSPIN_LOCK Lock);
1650
1651 NTKERNELAPI
1652 ULONG
1653 NTAPI
1654 ExInterlockedExchangeUlong(
1655 IN PULONG Target,
1656 IN ULONG Value,
1657 IN PKSPIN_LOCK Lock);
1658
1659 NTKERNELAPI
1660 INTERLOCKED_RESULT
1661 NTAPI
1662 ExInterlockedIncrementLong(
1663 IN PLONG Addend,
1664 IN PKSPIN_LOCK Lock);
1665 #endif
1666
1667 NTHALAPI
1668 ULONG
1669 NTAPI
1670 HalGetDmaAlignmentRequirement(
1671 VOID);
1672
1673 NTSYSAPI
1674 BOOLEAN
1675 NTAPI
1676 RtlLargeIntegerEqualToZero(
1677 IN LARGE_INTEGER Operand);
1678
1679 NTSYSAPI
1680 BOOLEAN
1681 NTAPI
1682 RtlLargeIntegerGreaterOrEqualToZero(
1683 IN LARGE_INTEGER Operand);
1684
1685 NTSYSAPI
1686 BOOLEAN
1687 NTAPI
1688 RtlLargeIntegerGreaterThan(
1689 IN LARGE_INTEGER Operand1,
1690 IN LARGE_INTEGER Operand2);
1691
1692 NTSYSAPI
1693 BOOLEAN
1694 NTAPI
1695 RtlLargeIntegerGreaterThanOrEqualTo(
1696 IN LARGE_INTEGER Operand1,
1697 IN LARGE_INTEGER Operand2);
1698
1699 NTSYSAPI
1700 BOOLEAN
1701 NTAPI
1702 RtlLargeIntegerGreaterThanZero(
1703 IN LARGE_INTEGER Operand);
1704
1705 NTSYSAPI
1706 BOOLEAN
1707 NTAPI
1708 RtlLargeIntegerLessOrEqualToZero(
1709 IN LARGE_INTEGER Operand);
1710
1711 NTSYSAPI
1712 BOOLEAN
1713 NTAPI
1714 RtlLargeIntegerLessThan(
1715 IN LARGE_INTEGER Operand1,
1716 IN LARGE_INTEGER Operand2);
1717
1718 NTSYSAPI
1719 BOOLEAN
1720 NTAPI
1721 RtlLargeIntegerLessThanOrEqualTo(
1722 IN LARGE_INTEGER Operand1,
1723 IN LARGE_INTEGER Operand2);
1724
1725 NTSYSAPI
1726 BOOLEAN
1727 NTAPI
1728 RtlLargeIntegerLessThanZero(
1729 IN LARGE_INTEGER Operand);
1730
1731 NTSYSAPI
1732 LARGE_INTEGER
1733 NTAPI
1734 RtlLargeIntegerNegate(
1735 IN LARGE_INTEGER Subtrahend);
1736
1737 NTSYSAPI
1738 BOOLEAN
1739 NTAPI
1740 RtlLargeIntegerNotEqualTo(
1741 IN LARGE_INTEGER Operand1,
1742 IN LARGE_INTEGER Operand2);
1743
1744 NTSYSAPI
1745 BOOLEAN
1746 NTAPI
1747 RtlLargeIntegerNotEqualToZero(
1748 IN LARGE_INTEGER Operand);
1749
1750 NTSYSAPI
1751 LARGE_INTEGER
1752 NTAPI
1753 RtlLargeIntegerShiftLeft(
1754 IN LARGE_INTEGER LargeInteger,
1755 IN CCHAR ShiftCount);
1756
1757 NTSYSAPI
1758 LARGE_INTEGER
1759 NTAPI
1760 RtlLargeIntegerShiftRight(
1761 IN LARGE_INTEGER LargeInteger,
1762 IN CCHAR ShiftCount);
1763
1764 NTSYSAPI
1765 LARGE_INTEGER
1766 NTAPI
1767 RtlLargeIntegerSubtract(
1768 IN LARGE_INTEGER Minuend,
1769 IN LARGE_INTEGER Subtrahend);
1770
1771
1772 /*
1773 * ULONG
1774 * COMPUTE_PAGES_SPANNED(
1775 * IN PVOID Va,
1776 * IN ULONG Size)
1777 */
1778 #define COMPUTE_PAGES_SPANNED(Va, \
1779 Size) \
1780 (ADDRESS_AND_SIZE_TO_SPAN_PAGES(Va, Size))
1781
1782
1783 /*
1784 ** Architecture specific structures
1785 */
1786
1787
1788 #ifdef _M_ARM
1789 //
1790 // NT-ARM is not documented
1791 //
1792 #include <armddk.h>
1793 #endif
1794
1795 #ifdef __cplusplus
1796 }
1797 #endif
1798
1799 #endif /* __WINDDK_H */