- Move more stuff to wdm.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 #if !defined(_NTHAL_)
46 #define NTHALAPI DECLSPEC_IMPORT
47 #else
48 #define NTHALAPI
49 #endif
50
51 /* Pseudo modifiers for parameters */
52 #ifndef IN
53 #define IN
54 #endif
55 #ifndef OUT
56 #define OUT
57 #endif
58 #ifndef OPTIONAL
59 #define OPTIONAL
60 #endif
61 #ifndef UNALLIGNED
62 #define UNALLIGNED
63 #endif
64
65 #define CONST const
66
67 #define RESTRICTED_POINTER
68
69 #if defined(_WIN64)
70 #define POINTER_ALIGNMENT DECLSPEC_ALIGN(8)
71 #else
72 #define POINTER_ALIGNMENT
73 #endif
74
75 #define DECLSPEC_ADDRSAFE
76
77 #ifdef NONAMELESSUNION
78 # define _DDK_DUMMYUNION_MEMBER(name) DUMMYUNIONNAME.name
79 # define _DDK_DUMMYUNION_N_MEMBER(n, name) DUMMYUNIONNAME##n.name
80 #else
81 # define _DDK_DUMMYUNION_MEMBER(name) name
82 # define _DDK_DUMMYUNION_N_MEMBER(n, name) name
83 #endif
84
85 /*
86 ** Forward declarations
87 */
88
89 struct _KPCR;
90 struct _KPRCB;
91 struct _KTSS;
92 struct _DRIVE_LAYOUT_INFORMATION_EX;
93 struct _LOADER_PARAMETER_BLOCK;
94
95
96 #if 1
97 /* FIXME: Unknown definitions */
98 struct _SET_PARTITION_INFORMATION_EX;
99 typedef ULONG WAIT_TYPE;
100 #define WaitAll 0
101 #define WaitAny 1
102 typedef HANDLE TRACEHANDLE;
103 typedef PVOID PWMILIB_CONTEXT;
104 typedef ULONG LOGICAL;
105 #endif
106
107 /*
108 ** WmiLib specific structure
109 */
110 typedef enum
111 {
112 IrpProcessed, // Irp was processed and possibly completed
113 IrpNotCompleted, // Irp was process and NOT completed
114 IrpNotWmi, // Irp is not a WMI irp
115 IrpForward // Irp is wmi irp, but targeted at another device object
116 } SYSCTL_IRP_DISPOSITION, *PSYSCTL_IRP_DISPOSITION;
117
118 //
119 // Forwarder
120 //
121 struct _COMPRESSED_DATA_INFO;
122
123 #define KERNEL_STACK_SIZE 12288
124 #define KERNEL_LARGE_STACK_SIZE 61440
125 #define KERNEL_LARGE_STACK_COMMIT 12288
126
127 #define EXCEPTION_READ_FAULT 0
128 #define EXCEPTION_WRITE_FAULT 1
129 #define EXCEPTION_EXECUTE_FAULT 8
130
131 #define DPFLTR_ERROR_LEVEL 0
132 #define DPFLTR_WARNING_LEVEL 1
133 #define DPFLTR_TRACE_LEVEL 2
134 #define DPFLTR_INFO_LEVEL 3
135 #define DPFLTR_MASK 0x80000000
136
137 typedef enum _DPFLTR_TYPE
138 {
139 DPFLTR_SYSTEM_ID = 0,
140 DPFLTR_SMSS_ID = 1,
141 DPFLTR_SETUP_ID = 2,
142 DPFLTR_NTFS_ID = 3,
143 DPFLTR_FSTUB_ID = 4,
144 DPFLTR_CRASHDUMP_ID = 5,
145 DPFLTR_CDAUDIO_ID = 6,
146 DPFLTR_CDROM_ID = 7,
147 DPFLTR_CLASSPNP_ID = 8,
148 DPFLTR_DISK_ID = 9,
149 DPFLTR_REDBOOK_ID = 10,
150 DPFLTR_STORPROP_ID = 11,
151 DPFLTR_SCSIPORT_ID = 12,
152 DPFLTR_SCSIMINIPORT_ID = 13,
153 DPFLTR_CONFIG_ID = 14,
154 DPFLTR_I8042PRT_ID = 15,
155 DPFLTR_SERMOUSE_ID = 16,
156 DPFLTR_LSERMOUS_ID = 17,
157 DPFLTR_KBDHID_ID = 18,
158 DPFLTR_MOUHID_ID = 19,
159 DPFLTR_KBDCLASS_ID = 20,
160 DPFLTR_MOUCLASS_ID = 21,
161 DPFLTR_TWOTRACK_ID = 22,
162 DPFLTR_WMILIB_ID = 23,
163 DPFLTR_ACPI_ID = 24,
164 DPFLTR_AMLI_ID = 25,
165 DPFLTR_HALIA64_ID = 26,
166 DPFLTR_VIDEO_ID = 27,
167 DPFLTR_SVCHOST_ID = 28,
168 DPFLTR_VIDEOPRT_ID = 29,
169 DPFLTR_TCPIP_ID = 30,
170 DPFLTR_DMSYNTH_ID = 31,
171 DPFLTR_NTOSPNP_ID = 32,
172 DPFLTR_FASTFAT_ID = 33,
173 DPFLTR_SAMSS_ID = 34,
174 DPFLTR_PNPMGR_ID = 35,
175 DPFLTR_NETAPI_ID = 36,
176 DPFLTR_SCSERVER_ID = 37,
177 DPFLTR_SCCLIENT_ID = 38,
178 DPFLTR_SERIAL_ID = 39,
179 DPFLTR_SERENUM_ID = 40,
180 DPFLTR_UHCD_ID = 41,
181 DPFLTR_BOOTOK_ID = 42,
182 DPFLTR_BOOTVRFY_ID = 43,
183 DPFLTR_RPCPROXY_ID = 44,
184 DPFLTR_AUTOCHK_ID = 45,
185 DPFLTR_DCOMSS_ID = 46,
186 DPFLTR_UNIMODEM_ID = 47,
187 DPFLTR_SIS_ID = 48,
188 DPFLTR_FLTMGR_ID = 49,
189 DPFLTR_WMICORE_ID = 50,
190 DPFLTR_BURNENG_ID = 51,
191 DPFLTR_IMAPI_ID = 52,
192 DPFLTR_SXS_ID = 53,
193 DPFLTR_FUSION_ID = 54,
194 DPFLTR_IDLETASK_ID = 55,
195 DPFLTR_SOFTPCI_ID = 56,
196 DPFLTR_TAPE_ID = 57,
197 DPFLTR_MCHGR_ID = 58,
198 DPFLTR_IDEP_ID = 59,
199 DPFLTR_PCIIDE_ID = 60,
200 DPFLTR_FLOPPY_ID = 61,
201 DPFLTR_FDC_ID = 62,
202 DPFLTR_TERMSRV_ID = 63,
203 DPFLTR_W32TIME_ID = 64,
204 DPFLTR_PREFETCHER_ID = 65,
205 DPFLTR_RSFILTER_ID = 66,
206 DPFLTR_FCPORT_ID = 67,
207 DPFLTR_PCI_ID = 68,
208 DPFLTR_DMIO_ID = 69,
209 DPFLTR_DMCONFIG_ID = 70,
210 DPFLTR_DMADMIN_ID = 71,
211 DPFLTR_WSOCKTRANSPORT_ID = 72,
212 DPFLTR_VSS_ID = 73,
213 DPFLTR_PNPMEM_ID = 74,
214 DPFLTR_PROCESSOR_ID = 75,
215 DPFLTR_DMSERVER_ID = 76,
216 DPFLTR_SR_ID = 77,
217 DPFLTR_INFINIBAND_ID = 78,
218 DPFLTR_IHVDRIVER_ID = 79,
219 DPFLTR_IHVVIDEO_ID = 80,
220 DPFLTR_IHVAUDIO_ID = 81,
221 DPFLTR_IHVNETWORK_ID = 82,
222 DPFLTR_IHVSTREAMING_ID = 83,
223 DPFLTR_IHVBUS_ID = 84,
224 DPFLTR_HPS_ID = 85,
225 DPFLTR_RTLTHREADPOOL_ID = 86,
226 DPFLTR_LDR_ID = 87,
227 DPFLTR_TCPIP6_ID = 88,
228 DPFLTR_ISAPNP_ID = 89,
229 DPFLTR_SHPC_ID = 90,
230 DPFLTR_STORPORT_ID = 91,
231 DPFLTR_STORMINIPORT_ID = 92,
232 DPFLTR_PRINTSPOOLER_ID = 93,
233 DPFLTR_VDS_ID = 94,
234 DPFLTR_VDSBAS_ID = 95,
235 DPFLTR_VDSDYNDR_ID = 96,
236 DPFLTR_VDSUTIL_ID = 97,
237 DPFLTR_DFRGIFC_ID = 98,
238 DPFLTR_DEFAULT_ID = 99,
239 DPFLTR_MM_ID = 100,
240 DPFLTR_DFSC_ID = 101,
241 DPFLTR_WOW64_ID = 102,
242 DPFLTR_ENDOFTABLE_ID
243 } DPFLTR_TYPE;
244
245 /* also in winnt.h */
246
247 #define FILE_COPY_STRUCTURED_STORAGE 0x00000041
248 #define FILE_STRUCTURED_STORAGE 0x00000441
249
250 /* end winnt.h */
251
252 #define THREAD_ALERT (0x0004)
253
254 /* Exported object types */
255 extern POBJECT_TYPE NTSYSAPI ExDesktopObjectType;
256 extern POBJECT_TYPE NTSYSAPI ExEventObjectType;
257 extern POBJECT_TYPE NTSYSAPI ExSemaphoreObjectType;
258 extern POBJECT_TYPE NTSYSAPI ExWindowStationObjectType;
259 extern ULONG NTSYSAPI IoDeviceHandlerObjectSize;
260 extern POBJECT_TYPE NTSYSAPI IoDeviceHandlerObjectType;
261 extern POBJECT_TYPE NTSYSAPI IoDeviceObjectType;
262 extern POBJECT_TYPE NTSYSAPI IoDriverObjectType;
263 extern POBJECT_TYPE NTSYSAPI IoFileObjectType;
264 extern POBJECT_TYPE NTSYSAPI PsThreadType;
265 extern POBJECT_TYPE NTSYSAPI LpcPortObjectType;
266 extern POBJECT_TYPE NTSYSAPI SeTokenObjectType;
267 extern POBJECT_TYPE NTSYSAPI PsProcessType;
268
269 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
270 extern volatile CCHAR NTSYSAPI KeNumberProcessors;
271 #else
272 #if (NTDDI_VERSION >= NTDDI_WINXP)
273 extern CCHAR NTSYSAPI KeNumberProcessors;
274 #else
275 //extern PCCHAR KeNumberProcessors;
276 extern NTSYSAPI CCHAR KeNumberProcessors; //FIXME: Note to Alex: I won't fix this atm, since I prefer to discuss this with you first.
277 #endif
278 #endif
279
280 #define MAX_WOW64_SHARED_ENTRIES 16
281
282 extern volatile KSYSTEM_TIME KeTickCount;
283
284 #define NX_SUPPORT_POLICY_ALWAYSOFF 0
285 #define NX_SUPPORT_POLICY_ALWAYSON 1
286 #define NX_SUPPORT_POLICY_OPTIN 2
287 #define NX_SUPPORT_POLICY_OPTOUT 3
288
289 typedef struct _KUSER_SHARED_DATA
290 {
291 ULONG TickCountLowDeprecated;
292 ULONG TickCountMultiplier;
293 volatile KSYSTEM_TIME InterruptTime;
294 volatile KSYSTEM_TIME SystemTime;
295 volatile KSYSTEM_TIME TimeZoneBias;
296 USHORT ImageNumberLow;
297 USHORT ImageNumberHigh;
298 WCHAR NtSystemRoot[260];
299 ULONG MaxStackTraceDepth;
300 ULONG CryptoExponent;
301 ULONG TimeZoneId;
302 ULONG LargePageMinimum;
303 ULONG Reserved2[7];
304 NT_PRODUCT_TYPE NtProductType;
305 BOOLEAN ProductTypeIsValid;
306 ULONG NtMajorVersion;
307 ULONG NtMinorVersion;
308 BOOLEAN ProcessorFeatures[PROCESSOR_FEATURE_MAX];
309 ULONG Reserved1;
310 ULONG Reserved3;
311 volatile ULONG TimeSlip;
312 ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture;
313 LARGE_INTEGER SystemExpirationDate;
314 ULONG SuiteMask;
315 BOOLEAN KdDebuggerEnabled;
316 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
317 UCHAR NXSupportPolicy;
318 #endif
319 volatile ULONG ActiveConsoleId;
320 volatile ULONG DismountCount;
321 ULONG ComPlusPackage;
322 ULONG LastSystemRITEventTickCount;
323 ULONG NumberOfPhysicalPages;
324 BOOLEAN SafeBootMode;
325 ULONG TraceLogging;
326 ULONG Fill0;
327 ULONGLONG TestRetInstruction;
328 ULONG SystemCall;
329 ULONG SystemCallReturn;
330 ULONGLONG SystemCallPad[3];
331 __GNU_EXTENSION union {
332 volatile KSYSTEM_TIME TickCount;
333 volatile ULONG64 TickCountQuad;
334 };
335 ULONG Cookie;
336 #if (NTDDI_VERSION >= NTDDI_WS03)
337 LONGLONG ConsoleSessionForegroundProcessId;
338 ULONG Wow64SharedInformation[MAX_WOW64_SHARED_ENTRIES];
339 #endif
340 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
341 USHORT UserModeGlobalLogger[8];
342 ULONG HeapTracingPid[2];
343 ULONG CritSecTracingPid[2];
344 __GNU_EXTENSION union
345 {
346 ULONG SharedDataFlags;
347 __GNU_EXTENSION struct
348 {
349 ULONG DbgErrorPortPresent:1;
350 ULONG DbgElevationEnabled:1;
351 ULONG DbgVirtEnabled:1;
352 ULONG DbgInstallerDetectEnabled:1;
353 ULONG SpareBits:28;
354 };
355 };
356 ULONG ImageFileExecutionOptions;
357 KAFFINITY ActiveProcessorAffinity;
358 #endif
359 } KUSER_SHARED_DATA, *PKUSER_SHARED_DATA;
360
361 /*
362 ** IRP function codes
363 */
364
365 #define IRP_MN_QUERY_DIRECTORY 0x01
366 #define IRP_MN_NOTIFY_CHANGE_DIRECTORY 0x02
367
368 #define IRP_MN_USER_FS_REQUEST 0x00
369 #define IRP_MN_MOUNT_VOLUME 0x01
370 #define IRP_MN_VERIFY_VOLUME 0x02
371 #define IRP_MN_LOAD_FILE_SYSTEM 0x03
372 #define IRP_MN_TRACK_LINK 0x04
373 #define IRP_MN_KERNEL_CALL 0x04
374
375 #define IRP_MN_LOCK 0x01
376 #define IRP_MN_UNLOCK_SINGLE 0x02
377 #define IRP_MN_UNLOCK_ALL 0x03
378 #define IRP_MN_UNLOCK_ALL_BY_KEY 0x04
379
380 #define IRP_MN_NORMAL 0x00
381 #define IRP_MN_DPC 0x01
382 #define IRP_MN_MDL 0x02
383 #define IRP_MN_COMPLETE 0x04
384 #define IRP_MN_COMPRESSED 0x08
385
386 #define IRP_MN_MDL_DPC (IRP_MN_MDL | IRP_MN_DPC)
387 #define IRP_MN_COMPLETE_MDL (IRP_MN_COMPLETE | IRP_MN_MDL)
388 #define IRP_MN_COMPLETE_MDL_DPC (IRP_MN_COMPLETE_MDL | IRP_MN_DPC)
389
390 #define IRP_MN_QUERY_LEGACY_BUS_INFORMATION 0x18
391
392 typedef EXCEPTION_DISPOSITION
393 (DDKAPI *PEXCEPTION_ROUTINE)(
394 IN struct _EXCEPTION_RECORD *ExceptionRecord,
395 IN PVOID EstablisherFrame,
396 IN OUT struct _CONTEXT *ContextRecord,
397 IN OUT PVOID DispatcherContext);
398
399 typedef NTSTATUS
400 (DDKAPI *PDRIVER_ENTRY)(
401 IN struct _DRIVER_OBJECT *DriverObject,
402 IN PUNICODE_STRING RegistryPath);
403
404 typedef VOID
405 (DDKAPI *PDRIVER_REINITIALIZE)(
406 IN struct _DRIVER_OBJECT *DriverObject,
407 IN PVOID Context,
408 IN ULONG Count);
409
410 typedef enum _BUS_QUERY_ID_TYPE {
411 BusQueryDeviceID,
412 BusQueryHardwareIDs,
413 BusQueryCompatibleIDs,
414 BusQueryInstanceID,
415 BusQueryDeviceSerialNumber
416 } BUS_QUERY_ID_TYPE, *PBUS_QUERY_ID_TYPE;
417
418 typedef enum _DEVICE_TEXT_TYPE {
419 DeviceTextDescription,
420 DeviceTextLocationInformation
421 } DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE;
422
423 typedef BOOLEAN
424 (DDKAPI *PKTRANSFER_ROUTINE)(
425 VOID);
426
427 #define ASSERT_GATE(object) \
428 ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == GateObject) || \
429 (((object)->Header.Type & KOBJECT_TYPE_MASK) == EventSynchronizationObject))
430
431 #define TIMER_TABLE_SIZE 512
432 #define TIMER_TABLE_SHIFT 9
433
434 #define ASSERT_TIMER(E) \
435 ASSERT(((E)->Header.Type == TimerNotificationObject) || \
436 ((E)->Header.Type == TimerSynchronizationObject))
437
438 #define ASSERT_MUTANT(E) \
439 ASSERT((E)->Header.Type == MutantObject)
440
441 #define ASSERT_SEMAPHORE(E) \
442 ASSERT((E)->Header.Type == SemaphoreObject)
443
444 #define ASSERT_EVENT(E) \
445 ASSERT(((E)->Header.Type == NotificationEvent) || \
446 ((E)->Header.Type == SynchronizationEvent))
447
448
449 typedef enum _TIMER_TYPE {
450 NotificationTimer,
451 SynchronizationTimer
452 } TIMER_TYPE;
453
454 #define KEYBOARD_INSERT_ON 0x08
455 #define KEYBOARD_CAPS_LOCK_ON 0x04
456 #define KEYBOARD_NUM_LOCK_ON 0x02
457 #define KEYBOARD_SCROLL_LOCK_ON 0x01
458 #define KEYBOARD_ALT_KEY_DOWN 0x80
459 #define KEYBOARD_CTRL_KEY_DOWN 0x40
460 #define KEYBOARD_LEFT_SHIFT_DOWN 0x20
461 #define KEYBOARD_RIGHT_SHIFT_DOWN 0x10
462
463 typedef struct _IO_COUNTERS {
464 ULONGLONG ReadOperationCount;
465 ULONGLONG WriteOperationCount;
466 ULONGLONG OtherOperationCount;
467 ULONGLONG ReadTransferCount;
468 ULONGLONG WriteTransferCount;
469 ULONGLONG OtherTransferCount;
470 } IO_COUNTERS, *PIO_COUNTERS;
471
472 typedef struct _VM_COUNTERS
473 {
474 SIZE_T PeakVirtualSize;
475 SIZE_T VirtualSize;
476 ULONG PageFaultCount;
477 SIZE_T PeakWorkingSetSize;
478 SIZE_T WorkingSetSize;
479 SIZE_T QuotaPeakPagedPoolUsage;
480 SIZE_T QuotaPagedPoolUsage;
481 SIZE_T QuotaPeakNonPagedPoolUsage;
482 SIZE_T QuotaNonPagedPoolUsage;
483 SIZE_T PagefileUsage;
484 SIZE_T PeakPagefileUsage;
485 } VM_COUNTERS, *PVM_COUNTERS;
486
487 typedef struct _VM_COUNTERS_EX
488 {
489 SIZE_T PeakVirtualSize;
490 SIZE_T VirtualSize;
491 ULONG PageFaultCount;
492 SIZE_T PeakWorkingSetSize;
493 SIZE_T WorkingSetSize;
494 SIZE_T QuotaPeakPagedPoolUsage;
495 SIZE_T QuotaPagedPoolUsage;
496 SIZE_T QuotaPeakNonPagedPoolUsage;
497 SIZE_T QuotaNonPagedPoolUsage;
498 SIZE_T PagefileUsage;
499 SIZE_T PeakPagefileUsage;
500 SIZE_T PrivateUsage;
501 } VM_COUNTERS_EX, *PVM_COUNTERS_EX;
502
503 typedef struct _POOLED_USAGE_AND_LIMITS
504 {
505 SIZE_T PeakPagedPoolUsage;
506 SIZE_T PagedPoolUsage;
507 SIZE_T PagedPoolLimit;
508 SIZE_T PeakNonPagedPoolUsage;
509 SIZE_T NonPagedPoolUsage;
510 SIZE_T NonPagedPoolLimit;
511 SIZE_T PeakPagefileUsage;
512 SIZE_T PagefileUsage;
513 SIZE_T PagefileLimit;
514 } POOLED_USAGE_AND_LIMITS, *PPOOLED_USAGE_AND_LIMITS;
515
516 typedef struct _CONTROLLER_OBJECT {
517 CSHORT Type;
518 CSHORT Size;
519 PVOID ControllerExtension;
520 KDEVICE_QUEUE DeviceWaitQueue;
521 ULONG Spare1;
522 LARGE_INTEGER Spare2;
523 } CONTROLLER_OBJECT, *PCONTROLLER_OBJECT;
524
525 /* DEVICE_DESCRIPTION.Version */
526
527 #define DEVICE_DESCRIPTION_VERSION 0x0000
528 #define DEVICE_DESCRIPTION_VERSION1 0x0001
529 #define DEVICE_DESCRIPTION_VERSION2 0x0002
530
531 typedef struct _DEVICE_DESCRIPTION {
532 ULONG Version;
533 BOOLEAN Master;
534 BOOLEAN ScatterGather;
535 BOOLEAN DemandMode;
536 BOOLEAN AutoInitialize;
537 BOOLEAN Dma32BitAddresses;
538 BOOLEAN IgnoreCount;
539 BOOLEAN Reserved1;
540 BOOLEAN Dma64BitAddresses;
541 ULONG BusNumber;
542 ULONG DmaChannel;
543 INTERFACE_TYPE InterfaceType;
544 DMA_WIDTH DmaWidth;
545 DMA_SPEED DmaSpeed;
546 ULONG MaximumLength;
547 ULONG DmaPort;
548 } DEVICE_DESCRIPTION, *PDEVICE_DESCRIPTION;
549
550 /* VPB.Flags */
551 #define VPB_MOUNTED 0x0001
552 #define VPB_LOCKED 0x0002
553 #define VPB_PERSISTENT 0x0004
554 #define VPB_REMOVE_PENDING 0x0008
555 #define VPB_RAW_MOUNT 0x0010
556
557 #define MAXIMUM_VOLUME_LABEL_LENGTH (32 * sizeof(WCHAR))
558
559 typedef struct _VPB {
560 CSHORT Type;
561 CSHORT Size;
562 USHORT Flags;
563 USHORT VolumeLabelLength;
564 struct _DEVICE_OBJECT *DeviceObject;
565 struct _DEVICE_OBJECT *RealDevice;
566 ULONG SerialNumber;
567 ULONG ReferenceCount;
568 WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)];
569 } VPB, *PVPB;
570
571 /* DEVICE_OBJECT.Flags */
572
573 #define DO_VERIFY_VOLUME 0x00000002
574 #define DO_BUFFERED_IO 0x00000004
575 #define DO_EXCLUSIVE 0x00000008
576 #define DO_DIRECT_IO 0x00000010
577 #define DO_MAP_IO_BUFFER 0x00000020
578 #define DO_DEVICE_HAS_NAME 0x00000040
579 #define DO_DEVICE_INITIALIZING 0x00000080
580 #define DO_SYSTEM_BOOT_PARTITION 0x00000100
581 #define DO_LONG_TERM_REQUESTS 0x00000200
582 #define DO_NEVER_LAST_DEVICE 0x00000400
583 #define DO_SHUTDOWN_REGISTERED 0x00000800
584 #define DO_BUS_ENUMERATED_DEVICE 0x00001000
585 #define DO_POWER_PAGABLE 0x00002000
586 #define DO_POWER_INRUSH 0x00004000
587 #define DO_LOW_PRIORITY_FILESYSTEM 0x00010000
588 #define DO_XIP 0x00020000
589
590 /* DEVICE_OBJECT.Characteristics */
591
592 #define FILE_REMOVABLE_MEDIA 0x00000001
593 #define FILE_READ_ONLY_DEVICE 0x00000002
594 #define FILE_FLOPPY_DISKETTE 0x00000004
595 #define FILE_WRITE_ONCE_MEDIA 0x00000008
596 #define FILE_REMOTE_DEVICE 0x00000010
597 #define FILE_DEVICE_IS_MOUNTED 0x00000020
598 #define FILE_VIRTUAL_VOLUME 0x00000040
599 #define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080
600 #define FILE_DEVICE_SECURE_OPEN 0x00000100
601
602 /* DEVICE_OBJECT.AlignmentRequirement */
603
604 #define FILE_BYTE_ALIGNMENT 0x00000000
605 #define FILE_WORD_ALIGNMENT 0x00000001
606 #define FILE_LONG_ALIGNMENT 0x00000003
607 #define FILE_QUAD_ALIGNMENT 0x00000007
608 #define FILE_OCTA_ALIGNMENT 0x0000000f
609 #define FILE_32_BYTE_ALIGNMENT 0x0000001f
610 #define FILE_64_BYTE_ALIGNMENT 0x0000003f
611 #define FILE_128_BYTE_ALIGNMENT 0x0000007f
612 #define FILE_256_BYTE_ALIGNMENT 0x000000ff
613 #define FILE_512_BYTE_ALIGNMENT 0x000001ff
614
615 /* DEVICE_OBJECT.DeviceType */
616
617 #define DEVICE_TYPE ULONG
618
619 #define FILE_DEVICE_BEEP 0x00000001
620 #define FILE_DEVICE_CD_ROM 0x00000002
621 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
622 #define FILE_DEVICE_CONTROLLER 0x00000004
623 #define FILE_DEVICE_DATALINK 0x00000005
624 #define FILE_DEVICE_DFS 0x00000006
625 #define FILE_DEVICE_DISK 0x00000007
626 #define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
627 #define FILE_DEVICE_FILE_SYSTEM 0x00000009
628 #define FILE_DEVICE_INPORT_PORT 0x0000000a
629 #define FILE_DEVICE_KEYBOARD 0x0000000b
630 #define FILE_DEVICE_MAILSLOT 0x0000000c
631 #define FILE_DEVICE_MIDI_IN 0x0000000d
632 #define FILE_DEVICE_MIDI_OUT 0x0000000e
633 #define FILE_DEVICE_MOUSE 0x0000000f
634 #define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010
635 #define FILE_DEVICE_NAMED_PIPE 0x00000011
636 #define FILE_DEVICE_NETWORK 0x00000012
637 #define FILE_DEVICE_NETWORK_BROWSER 0x00000013
638 #define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
639 #define FILE_DEVICE_NULL 0x00000015
640 #define FILE_DEVICE_PARALLEL_PORT 0x00000016
641 #define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017
642 #define FILE_DEVICE_PRINTER 0x00000018
643 #define FILE_DEVICE_SCANNER 0x00000019
644 #define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a
645 #define FILE_DEVICE_SERIAL_PORT 0x0000001b
646 #define FILE_DEVICE_SCREEN 0x0000001c
647 #define FILE_DEVICE_SOUND 0x0000001d
648 #define FILE_DEVICE_STREAMS 0x0000001e
649 #define FILE_DEVICE_TAPE 0x0000001f
650 #define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
651 #define FILE_DEVICE_TRANSPORT 0x00000021
652 #define FILE_DEVICE_UNKNOWN 0x00000022
653 #define FILE_DEVICE_VIDEO 0x00000023
654 #define FILE_DEVICE_VIRTUAL_DISK 0x00000024
655 #define FILE_DEVICE_WAVE_IN 0x00000025
656 #define FILE_DEVICE_WAVE_OUT 0x00000026
657 #define FILE_DEVICE_8042_PORT 0x00000027
658 #define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
659 #define FILE_DEVICE_BATTERY 0x00000029
660 #define FILE_DEVICE_BUS_EXTENDER 0x0000002a
661 #define FILE_DEVICE_MODEM 0x0000002b
662 #define FILE_DEVICE_VDM 0x0000002c
663 #define FILE_DEVICE_MASS_STORAGE 0x0000002d
664 #define FILE_DEVICE_SMB 0x0000002e
665 #define FILE_DEVICE_KS 0x0000002f
666 #define FILE_DEVICE_CHANGER 0x00000030
667 #define FILE_DEVICE_SMARTCARD 0x00000031
668 #define FILE_DEVICE_ACPI 0x00000032
669 #define FILE_DEVICE_DVD 0x00000033
670 #define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034
671 #define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035
672 #define FILE_DEVICE_DFS_VOLUME 0x00000036
673 #define FILE_DEVICE_SERENUM 0x00000037
674 #define FILE_DEVICE_TERMSRV 0x00000038
675 #define FILE_DEVICE_KSEC 0x00000039
676 #define FILE_DEVICE_FIPS 0x0000003a
677
678 typedef struct _DEVICE_OBJECT {
679 CSHORT Type;
680 USHORT Size;
681 LONG ReferenceCount;
682 struct _DRIVER_OBJECT *DriverObject;
683 struct _DEVICE_OBJECT *NextDevice;
684 struct _DEVICE_OBJECT *AttachedDevice;
685 struct _IRP *CurrentIrp;
686 PIO_TIMER Timer;
687 ULONG Flags;
688 ULONG Characteristics;
689 volatile PVPB Vpb;
690 PVOID DeviceExtension;
691 DEVICE_TYPE DeviceType;
692 CCHAR StackSize;
693 union {
694 LIST_ENTRY ListEntry;
695 WAIT_CONTEXT_BLOCK Wcb;
696 } Queue;
697 ULONG AlignmentRequirement;
698 KDEVICE_QUEUE DeviceQueue;
699 KDPC Dpc;
700 ULONG ActiveThreadCount;
701 PSECURITY_DESCRIPTOR SecurityDescriptor;
702 KEVENT DeviceLock;
703 USHORT SectorSize;
704 USHORT Spare1;
705 struct _DEVOBJ_EXTENSION *DeviceObjectExtension;
706 PVOID Reserved;
707 } DEVICE_OBJECT, *PDEVICE_OBJECT;
708
709 typedef enum _DEVICE_RELATION_TYPE {
710 BusRelations,
711 EjectionRelations,
712 PowerRelations,
713 RemovalRelations,
714 TargetDeviceRelation,
715 SingleBusRelations
716 } DEVICE_RELATION_TYPE, *PDEVICE_RELATION_TYPE;
717
718 typedef struct _DEVICE_RELATIONS {
719 ULONG Count;
720 PDEVICE_OBJECT Objects[1];
721 } DEVICE_RELATIONS, *PDEVICE_RELATIONS;
722
723 typedef struct _SCATTER_GATHER_ELEMENT {
724 PHYSICAL_ADDRESS Address;
725 ULONG Length;
726 ULONG_PTR Reserved;
727 } SCATTER_GATHER_ELEMENT, *PSCATTER_GATHER_ELEMENT;
728
729 typedef struct _SCATTER_GATHER_LIST {
730 ULONG NumberOfElements;
731 ULONG_PTR Reserved;
732 SCATTER_GATHER_ELEMENT Elements[1];
733 } SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
734
735 #define MDL_MAPPED_TO_SYSTEM_VA 0x0001
736 #define MDL_PAGES_LOCKED 0x0002
737 #define MDL_SOURCE_IS_NONPAGED_POOL 0x0004
738 #define MDL_ALLOCATED_FIXED_SIZE 0x0008
739 #define MDL_PARTIAL 0x0010
740 #define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020
741 #define MDL_IO_PAGE_READ 0x0040
742 #define MDL_WRITE_OPERATION 0x0080
743 #define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100
744 #define MDL_FREE_EXTRA_PTES 0x0200
745 #define MDL_DESCRIBES_AWE 0x0400
746 #define MDL_IO_SPACE 0x0800
747 #define MDL_NETWORK_HEADER 0x1000
748 #define MDL_MAPPING_CAN_FAIL 0x2000
749 #define MDL_ALLOCATED_MUST_SUCCEED 0x4000
750 #define MDL_INTERNAL 0x8000
751
752
753 #define MDL_MAPPING_FLAGS ( \
754 MDL_MAPPED_TO_SYSTEM_VA | \
755 MDL_PAGES_LOCKED | \
756 MDL_SOURCE_IS_NONPAGED_POOL | \
757 MDL_PARTIAL_HAS_BEEN_MAPPED | \
758 MDL_PARENT_MAPPED_SYSTEM_VA | \
759 MDL_SYSTEM_VA | \
760 MDL_IO_SPACE)
761
762 typedef struct _DRIVER_EXTENSION {
763 struct _DRIVER_OBJECT *DriverObject;
764 PDRIVER_ADD_DEVICE AddDevice;
765 ULONG Count;
766 UNICODE_STRING ServiceKeyName;
767 } DRIVER_EXTENSION, *PDRIVER_EXTENSION;
768
769 #define DRVO_UNLOAD_INVOKED 0x00000001
770 #define DRVO_LEGACY_DRIVER 0x00000002
771 #define DRVO_BUILTIN_DRIVER 0x00000004
772 #define DRVO_REINIT_REGISTERED 0x00000008
773 #define DRVO_INITIALIZED 0x00000010
774 #define DRVO_BOOTREINIT_REGISTERED 0x00000020
775 #define DRVO_LEGACY_RESOURCES 0x00000040
776
777 typedef struct _DRIVER_OBJECT {
778 CSHORT Type;
779 CSHORT Size;
780 PDEVICE_OBJECT DeviceObject;
781 ULONG Flags;
782 PVOID DriverStart;
783 ULONG DriverSize;
784 PVOID DriverSection;
785 PDRIVER_EXTENSION DriverExtension;
786 UNICODE_STRING DriverName;
787 PUNICODE_STRING HardwareDatabase;
788 struct _FAST_IO_DISPATCH *FastIoDispatch;
789 PDRIVER_INITIALIZE DriverInit;
790 PDRIVER_STARTIO DriverStartIo;
791 PDRIVER_UNLOAD DriverUnload;
792 PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
793 } DRIVER_OBJECT;
794 typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT;
795
796 typedef struct _DMA_ADAPTER {
797 USHORT Version;
798 USHORT Size;
799 struct _DMA_OPERATIONS* DmaOperations;
800 } DMA_ADAPTER, *PDMA_ADAPTER;
801
802 typedef VOID
803 (DDKAPI *PPUT_DMA_ADAPTER)(
804 IN PDMA_ADAPTER DmaAdapter);
805
806 typedef PVOID
807 (DDKAPI *PALLOCATE_COMMON_BUFFER)(
808 IN PDMA_ADAPTER DmaAdapter,
809 IN ULONG Length,
810 OUT PPHYSICAL_ADDRESS LogicalAddress,
811 IN BOOLEAN CacheEnabled);
812
813 typedef VOID
814 (DDKAPI *PFREE_COMMON_BUFFER)(
815 IN PDMA_ADAPTER DmaAdapter,
816 IN ULONG Length,
817 IN PHYSICAL_ADDRESS LogicalAddress,
818 IN PVOID VirtualAddress,
819 IN BOOLEAN CacheEnabled);
820
821 typedef NTSTATUS
822 (DDKAPI *PALLOCATE_ADAPTER_CHANNEL)(
823 IN PDMA_ADAPTER DmaAdapter,
824 IN PDEVICE_OBJECT DeviceObject,
825 IN ULONG NumberOfMapRegisters,
826 IN PDRIVER_CONTROL ExecutionRoutine,
827 IN PVOID Context);
828
829 typedef BOOLEAN
830 (DDKAPI *PFLUSH_ADAPTER_BUFFERS)(
831 IN PDMA_ADAPTER DmaAdapter,
832 IN PMDL Mdl,
833 IN PVOID MapRegisterBase,
834 IN PVOID CurrentVa,
835 IN ULONG Length,
836 IN BOOLEAN WriteToDevice);
837
838 typedef VOID
839 (DDKAPI *PFREE_ADAPTER_CHANNEL)(
840 IN PDMA_ADAPTER DmaAdapter);
841
842 typedef VOID
843 (DDKAPI *PFREE_MAP_REGISTERS)(
844 IN PDMA_ADAPTER DmaAdapter,
845 PVOID MapRegisterBase,
846 ULONG NumberOfMapRegisters);
847
848 typedef PHYSICAL_ADDRESS
849 (DDKAPI *PMAP_TRANSFER)(
850 IN PDMA_ADAPTER DmaAdapter,
851 IN PMDL Mdl,
852 IN PVOID MapRegisterBase,
853 IN PVOID CurrentVa,
854 IN OUT PULONG Length,
855 IN BOOLEAN WriteToDevice);
856
857 typedef ULONG
858 (DDKAPI *PGET_DMA_ALIGNMENT)(
859 IN PDMA_ADAPTER DmaAdapter);
860
861 typedef ULONG
862 (DDKAPI *PREAD_DMA_COUNTER)(
863 IN PDMA_ADAPTER DmaAdapter);
864
865 typedef NTSTATUS
866 (DDKAPI *PGET_SCATTER_GATHER_LIST)(
867 IN PDMA_ADAPTER DmaAdapter,
868 IN PDEVICE_OBJECT DeviceObject,
869 IN PMDL Mdl,
870 IN PVOID CurrentVa,
871 IN ULONG Length,
872 IN PDRIVER_LIST_CONTROL ExecutionRoutine,
873 IN PVOID Context,
874 IN BOOLEAN WriteToDevice);
875
876 typedef VOID
877 (DDKAPI *PPUT_SCATTER_GATHER_LIST)(
878 IN PDMA_ADAPTER DmaAdapter,
879 IN PSCATTER_GATHER_LIST ScatterGather,
880 IN BOOLEAN WriteToDevice);
881
882 typedef NTSTATUS
883 (DDKAPI *PCALCULATE_SCATTER_GATHER_LIST_SIZE)(
884 IN PDMA_ADAPTER DmaAdapter,
885 IN PMDL Mdl OPTIONAL,
886 IN PVOID CurrentVa,
887 IN ULONG Length,
888 OUT PULONG ScatterGatherListSize,
889 OUT PULONG pNumberOfMapRegisters OPTIONAL);
890
891 typedef NTSTATUS
892 (DDKAPI *PBUILD_SCATTER_GATHER_LIST)(
893 IN PDMA_ADAPTER DmaAdapter,
894 IN PDEVICE_OBJECT DeviceObject,
895 IN PMDL Mdl,
896 IN PVOID CurrentVa,
897 IN ULONG Length,
898 IN PDRIVER_LIST_CONTROL ExecutionRoutine,
899 IN PVOID Context,
900 IN BOOLEAN WriteToDevice,
901 IN PVOID ScatterGatherBuffer,
902 IN ULONG ScatterGatherLength);
903
904 typedef NTSTATUS
905 (DDKAPI *PBUILD_MDL_FROM_SCATTER_GATHER_LIST)(
906 IN PDMA_ADAPTER DmaAdapter,
907 IN PSCATTER_GATHER_LIST ScatterGather,
908 IN PMDL OriginalMdl,
909 OUT PMDL *TargetMdl);
910
911 typedef struct _DMA_OPERATIONS {
912 ULONG Size;
913 PPUT_DMA_ADAPTER PutDmaAdapter;
914 PALLOCATE_COMMON_BUFFER AllocateCommonBuffer;
915 PFREE_COMMON_BUFFER FreeCommonBuffer;
916 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
917 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
918 PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
919 PFREE_MAP_REGISTERS FreeMapRegisters;
920 PMAP_TRANSFER MapTransfer;
921 PGET_DMA_ALIGNMENT GetDmaAlignment;
922 PREAD_DMA_COUNTER ReadDmaCounter;
923 PGET_SCATTER_GATHER_LIST GetScatterGatherList;
924 PPUT_SCATTER_GATHER_LIST PutScatterGatherList;
925 PCALCULATE_SCATTER_GATHER_LIST_SIZE CalculateScatterGatherList;
926 PBUILD_SCATTER_GATHER_LIST BuildScatterGatherList;
927 PBUILD_MDL_FROM_SCATTER_GATHER_LIST BuildMdlFromScatterGatherList;
928 } DMA_OPERATIONS, *PDMA_OPERATIONS;
929
930 typedef enum _ARBITER_REQUEST_SOURCE {
931 ArbiterRequestUndefined = -1,
932 ArbiterRequestLegacyReported,
933 ArbiterRequestHalReported,
934 ArbiterRequestLegacyAssigned,
935 ArbiterRequestPnpDetected,
936 ArbiterRequestPnpEnumerated
937 } ARBITER_REQUEST_SOURCE;
938
939 typedef enum _ARBITER_RESULT {
940 ArbiterResultUndefined = -1,
941 ArbiterResultSuccess,
942 ArbiterResultExternalConflict,
943 ArbiterResultNullRequest
944 } ARBITER_RESULT;
945
946 typedef enum _ARBITER_ACTION {
947 ArbiterActionTestAllocation,
948 ArbiterActionRetestAllocation,
949 ArbiterActionCommitAllocation,
950 ArbiterActionRollbackAllocation,
951 ArbiterActionQueryAllocatedResources,
952 ArbiterActionWriteReservedResources,
953 ArbiterActionQueryConflict,
954 ArbiterActionQueryArbitrate,
955 ArbiterActionAddReserved,
956 ArbiterActionBootAllocation
957 } ARBITER_ACTION, *PARBITER_ACTION;
958
959 typedef struct _ARBITER_CONFLICT_INFO {
960 PDEVICE_OBJECT OwningObject;
961 ULONGLONG Start;
962 ULONGLONG End;
963 } ARBITER_CONFLICT_INFO, *PARBITER_CONFLICT_INFO;
964
965 typedef struct _ARBITER_PARAMETERS {
966 union {
967 struct {
968 IN OUT PLIST_ENTRY ArbitrationList;
969 IN ULONG AllocateFromCount;
970 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom;
971 } TestAllocation;
972
973 struct {
974 IN OUT PLIST_ENTRY ArbitrationList;
975 IN ULONG AllocateFromCount;
976 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom;
977 } RetestAllocation;
978
979 struct {
980 IN OUT PLIST_ENTRY ArbitrationList;
981 } BootAllocation;
982
983 struct {
984 OUT PCM_PARTIAL_RESOURCE_LIST *AllocatedResources;
985 } QueryAllocatedResources;
986
987 struct {
988 IN PDEVICE_OBJECT PhysicalDeviceObject;
989 IN PIO_RESOURCE_DESCRIPTOR ConflictingResource;
990 OUT PULONG ConflictCount;
991 OUT PARBITER_CONFLICT_INFO *Conflicts;
992 } QueryConflict;
993
994 struct {
995 IN PLIST_ENTRY ArbitrationList;
996 } QueryArbitrate;
997
998 struct {
999 IN PDEVICE_OBJECT ReserveDevice;
1000 } AddReserved;
1001 } Parameters;
1002 } ARBITER_PARAMETERS, *PARBITER_PARAMETERS;
1003
1004 #define ARBITER_FLAG_BOOT_CONFIG 0x00000001
1005
1006 typedef struct _ARBITER_LIST_ENTRY {
1007 LIST_ENTRY ListEntry;
1008 ULONG AlternativeCount;
1009 PIO_RESOURCE_DESCRIPTOR Alternatives;
1010 PDEVICE_OBJECT PhysicalDeviceObject;
1011 ARBITER_REQUEST_SOURCE RequestSource;
1012 ULONG Flags;
1013 LONG_PTR WorkSpace;
1014 INTERFACE_TYPE InterfaceType;
1015 ULONG SlotNumber;
1016 ULONG BusNumber;
1017 PCM_PARTIAL_RESOURCE_DESCRIPTOR Assignment;
1018 PIO_RESOURCE_DESCRIPTOR SelectedAlternative;
1019 ARBITER_RESULT Result;
1020 } ARBITER_LIST_ENTRY, *PARBITER_LIST_ENTRY;
1021
1022 typedef NTSTATUS
1023 (DDKAPI *PARBITER_HANDLER)(
1024 IN PVOID Context,
1025 IN ARBITER_ACTION Action,
1026 IN OUT PARBITER_PARAMETERS Parameters);
1027
1028 #define ARBITER_PARTIAL 0x00000001
1029
1030 typedef struct _ARBITER_INTERFACE {
1031 USHORT Size;
1032 USHORT Version;
1033 PVOID Context;
1034 PINTERFACE_REFERENCE InterfaceReference;
1035 PINTERFACE_DEREFERENCE InterfaceDereference;
1036 PARBITER_HANDLER ArbiterHandler;
1037 ULONG Flags;
1038 } ARBITER_INTERFACE, *PARBITER_INTERFACE;
1039
1040 typedef enum _KPROFILE_SOURCE {
1041 ProfileTime,
1042 ProfileAlignmentFixup,
1043 ProfileTotalIssues,
1044 ProfilePipelineDry,
1045 ProfileLoadInstructions,
1046 ProfilePipelineFrozen,
1047 ProfileBranchInstructions,
1048 ProfileTotalNonissues,
1049 ProfileDcacheMisses,
1050 ProfileIcacheMisses,
1051 ProfileCacheMisses,
1052 ProfileBranchMispredictions,
1053 ProfileStoreInstructions,
1054 ProfileFpInstructions,
1055 ProfileIntegerInstructions,
1056 Profile2Issue,
1057 Profile3Issue,
1058 Profile4Issue,
1059 ProfileSpecialInstructions,
1060 ProfileTotalCycles,
1061 ProfileIcacheIssues,
1062 ProfileDcacheAccesses,
1063 ProfileMemoryBarrierCycles,
1064 ProfileLoadLinkedIssues,
1065 ProfileMaximum
1066 } KPROFILE_SOURCE;
1067
1068 typedef enum _HAL_QUERY_INFORMATION_CLASS {
1069 HalInstalledBusInformation,
1070 HalProfileSourceInformation,
1071 HalInformationClassUnused1,
1072 HalPowerInformation,
1073 HalProcessorSpeedInformation,
1074 HalCallbackInformation,
1075 HalMapRegisterInformation,
1076 HalMcaLogInformation,
1077 HalFrameBufferCachingInformation,
1078 HalDisplayBiosInformation,
1079 HalProcessorFeatureInformation,
1080 HalNumaTopologyInterface,
1081 HalErrorInformation,
1082 HalCmcLogInformation,
1083 HalCpeLogInformation,
1084 HalQueryMcaInterface,
1085 HalQueryAMLIIllegalIOPortAddresses,
1086 HalQueryMaxHotPlugMemoryAddress,
1087 HalPartitionIpiInterface,
1088 HalPlatformInformation,
1089 HalQueryProfileSourceList
1090 } HAL_QUERY_INFORMATION_CLASS, *PHAL_QUERY_INFORMATION_CLASS;
1091
1092 typedef enum _HAL_SET_INFORMATION_CLASS {
1093 HalProfileSourceInterval,
1094 HalProfileSourceInterruptHandler,
1095 HalMcaRegisterDriver,
1096 HalKernelErrorHandler,
1097 HalCmcRegisterDriver,
1098 HalCpeRegisterDriver,
1099 HalMcaLog,
1100 HalCmcLog,
1101 HalCpeLog,
1102 HalGenerateCmcInterrupt
1103 } HAL_SET_INFORMATION_CLASS, *PHAL_SET_INFORMATION_CLASS;
1104
1105 typedef struct _HAL_PROFILE_SOURCE_INTERVAL
1106 {
1107 KPROFILE_SOURCE Source;
1108 ULONG_PTR Interval;
1109 } HAL_PROFILE_SOURCE_INTERVAL, *PHAL_PROFILE_SOURCE_INTERVAL;
1110
1111 typedef struct _HAL_PROFILE_SOURCE_INFORMATION
1112 {
1113 KPROFILE_SOURCE Source;
1114 BOOLEAN Supported;
1115 ULONG Interval;
1116 } HAL_PROFILE_SOURCE_INFORMATION, *PHAL_PROFILE_SOURCE_INFORMATION;
1117
1118 typedef struct _MAP_REGISTER_ENTRY
1119 {
1120 PVOID MapRegister;
1121 BOOLEAN WriteToDevice;
1122 } MAP_REGISTER_ENTRY, *PMAP_REGISTER_ENTRY;
1123
1124 typedef struct
1125 {
1126 UCHAR Type;
1127 BOOLEAN Valid;
1128 UCHAR Reserved[2];
1129 PUCHAR TranslatedAddress;
1130 ULONG Length;
1131 } DEBUG_DEVICE_ADDRESS, *PDEBUG_DEVICE_ADDRESS;
1132
1133 typedef struct
1134 {
1135 PHYSICAL_ADDRESS Start;
1136 PHYSICAL_ADDRESS MaxEnd;
1137 PVOID VirtualAddress;
1138 ULONG Length;
1139 BOOLEAN Cached;
1140 BOOLEAN Aligned;
1141 } DEBUG_MEMORY_REQUIREMENTS, *PDEBUG_MEMORY_REQUIREMENTS;
1142
1143 typedef struct
1144 {
1145 ULONG Bus;
1146 ULONG Slot;
1147 USHORT VendorID;
1148 USHORT DeviceID;
1149 UCHAR BaseClass;
1150 UCHAR SubClass;
1151 UCHAR ProgIf;
1152 BOOLEAN Initialized;
1153 DEBUG_DEVICE_ADDRESS BaseAddress[6];
1154 DEBUG_MEMORY_REQUIREMENTS Memory;
1155 } DEBUG_DEVICE_DESCRIPTOR, *PDEBUG_DEVICE_DESCRIPTOR;
1156
1157 typedef enum _KD_OPTION {
1158 KD_OPTION_SET_BLOCK_ENABLE,
1159 } KD_OPTION;
1160
1161 /* Function Type Defintions for Dispatch Functions */
1162 struct _DEVICE_CONTROL_CONTEXT;
1163
1164 typedef VOID
1165 (DDKAPI *PDEVICE_CONTROL_COMPLETION)(
1166 IN struct _DEVICE_CONTROL_CONTEXT *ControlContext);
1167
1168 typedef struct _DEVICE_CONTROL_CONTEXT {
1169 NTSTATUS Status;
1170 PDEVICE_HANDLER_OBJECT DeviceHandler;
1171 PDEVICE_OBJECT DeviceObject;
1172 ULONG ControlCode;
1173 PVOID Buffer;
1174 PULONG BufferLength;
1175 PVOID Context;
1176 } DEVICE_CONTROL_CONTEXT, *PDEVICE_CONTROL_CONTEXT;
1177
1178 typedef struct _PM_DISPATCH_TABLE {
1179 ULONG Signature;
1180 ULONG Version;
1181 PVOID Function[1];
1182 } PM_DISPATCH_TABLE, *PPM_DISPATCH_TABLE;
1183
1184 typedef enum _RESOURCE_TRANSLATION_DIRECTION {
1185 TranslateChildToParent,
1186 TranslateParentToChild
1187 } RESOURCE_TRANSLATION_DIRECTION;
1188
1189 typedef NTSTATUS
1190 (DDKAPI *PTRANSLATE_RESOURCE_HANDLER)(
1191 IN PVOID Context,
1192 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Source,
1193 IN RESOURCE_TRANSLATION_DIRECTION Direction,
1194 IN ULONG AlternativesCount,
1195 IN IO_RESOURCE_DESCRIPTOR Alternatives[],
1196 IN PDEVICE_OBJECT PhysicalDeviceObject,
1197 OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR Target);
1198
1199 typedef NTSTATUS
1200 (DDKAPI *PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER)(
1201 IN PVOID Context,
1202 IN PIO_RESOURCE_DESCRIPTOR Source,
1203 IN PDEVICE_OBJECT PhysicalDeviceObject,
1204 OUT PULONG TargetCount,
1205 OUT PIO_RESOURCE_DESCRIPTOR *Target);
1206
1207 typedef struct _TRANSLATOR_INTERFACE {
1208 USHORT Size;
1209 USHORT Version;
1210 PVOID Context;
1211 PINTERFACE_REFERENCE InterfaceReference;
1212 PINTERFACE_DEREFERENCE InterfaceDereference;
1213 PTRANSLATE_RESOURCE_HANDLER TranslateResources;
1214 PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER TranslateResourceRequirements;
1215 } TRANSLATOR_INTERFACE, *PTRANSLATOR_INTERFACE;
1216
1217 typedef NTSTATUS
1218 (DDKAPI *pHalDeviceControl)(
1219 IN PDEVICE_HANDLER_OBJECT DeviceHandler,
1220 IN PDEVICE_OBJECT DeviceObject,
1221 IN ULONG ControlCode,
1222 IN OUT PVOID Buffer OPTIONAL,
1223 IN OUT PULONG BufferLength OPTIONAL,
1224 IN PVOID Context,
1225 IN PDEVICE_CONTROL_COMPLETION CompletionRoutine);
1226
1227 typedef VOID
1228 (FASTCALL *pHalExamineMBR)(
1229 IN PDEVICE_OBJECT DeviceObject,
1230 IN ULONG SectorSize,
1231 IN ULONG MBRTypeIdentifier,
1232 OUT PVOID *Buffer);
1233
1234 typedef VOID
1235 (FASTCALL *pHalIoAssignDriveLetters)(
1236 IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
1237 IN PSTRING NtDeviceName,
1238 OUT PUCHAR NtSystemPath,
1239 OUT PSTRING NtSystemPathString);
1240
1241 typedef NTSTATUS
1242 (FASTCALL *pHalIoReadPartitionTable)(
1243 IN PDEVICE_OBJECT DeviceObject,
1244 IN ULONG SectorSize,
1245 IN BOOLEAN ReturnRecognizedPartitions,
1246 OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer);
1247
1248 typedef NTSTATUS
1249 (FASTCALL *pHalIoSetPartitionInformation)(
1250 IN PDEVICE_OBJECT DeviceObject,
1251 IN ULONG SectorSize,
1252 IN ULONG PartitionNumber,
1253 IN ULONG PartitionType);
1254
1255 typedef NTSTATUS
1256 (FASTCALL *pHalIoWritePartitionTable)(
1257 IN PDEVICE_OBJECT DeviceObject,
1258 IN ULONG SectorSize,
1259 IN ULONG SectorsPerTrack,
1260 IN ULONG NumberOfHeads,
1261 IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer);
1262
1263 typedef PBUS_HANDLER
1264 (FASTCALL *pHalHandlerForBus)(
1265 IN INTERFACE_TYPE InterfaceType,
1266 IN ULONG BusNumber);
1267
1268 typedef VOID
1269 (FASTCALL *pHalReferenceBusHandler)(
1270 IN PBUS_HANDLER BusHandler);
1271
1272 typedef NTSTATUS
1273 (DDKAPI *pHalQuerySystemInformation)(
1274 IN HAL_QUERY_INFORMATION_CLASS InformationClass,
1275 IN ULONG BufferSize,
1276 IN OUT PVOID Buffer,
1277 OUT PULONG ReturnedLength);
1278
1279 typedef NTSTATUS
1280 (DDKAPI *pHalSetSystemInformation)(
1281 IN HAL_SET_INFORMATION_CLASS InformationClass,
1282 IN ULONG BufferSize,
1283 IN PVOID Buffer);
1284
1285 typedef NTSTATUS
1286 (DDKAPI *pHalQueryBusSlots)(
1287 IN PBUS_HANDLER BusHandler,
1288 IN ULONG BufferSize,
1289 OUT PULONG SlotNumbers,
1290 OUT PULONG ReturnedLength);
1291
1292 typedef NTSTATUS
1293 (DDKAPI *pHalInitPnpDriver)(
1294 VOID);
1295
1296 typedef NTSTATUS
1297 (DDKAPI *pHalInitPowerManagement)(
1298 IN PPM_DISPATCH_TABLE PmDriverDispatchTable,
1299 OUT PPM_DISPATCH_TABLE *PmHalDispatchTable);
1300
1301 typedef struct _DMA_ADAPTER*
1302 (DDKAPI *pHalGetDmaAdapter)(
1303 IN PVOID Context,
1304 IN struct _DEVICE_DESCRIPTION *DeviceDescriptor,
1305 OUT PULONG NumberOfMapRegisters);
1306
1307 typedef NTSTATUS
1308 (DDKAPI *pHalGetInterruptTranslator)(
1309 IN INTERFACE_TYPE ParentInterfaceType,
1310 IN ULONG ParentBusNumber,
1311 IN INTERFACE_TYPE BridgeInterfaceType,
1312 IN USHORT Size,
1313 IN USHORT Version,
1314 OUT PTRANSLATOR_INTERFACE Translator,
1315 OUT PULONG BridgeBusNumber);
1316
1317 typedef NTSTATUS
1318 (DDKAPI *pHalStartMirroring)(
1319 VOID);
1320
1321 typedef NTSTATUS
1322 (DDKAPI *pHalEndMirroring)(
1323 IN ULONG PassNumber);
1324
1325 typedef NTSTATUS
1326 (DDKAPI *pHalMirrorPhysicalMemory)(
1327 IN PHYSICAL_ADDRESS PhysicalAddress,
1328 IN LARGE_INTEGER NumberOfBytes);
1329
1330 typedef NTSTATUS
1331 (DDKAPI *pHalMirrorVerify)(
1332 IN PHYSICAL_ADDRESS PhysicalAddress,
1333 IN LARGE_INTEGER NumberOfBytes);
1334
1335 typedef VOID
1336 (DDKAPI *pHalEndOfBoot)(
1337 VOID);
1338
1339 typedef
1340 BOOLEAN
1341 (DDKAPI *pHalTranslateBusAddress)(
1342 IN INTERFACE_TYPE InterfaceType,
1343 IN ULONG BusNumber,
1344 IN PHYSICAL_ADDRESS BusAddress,
1345 IN OUT PULONG AddressSpace,
1346 OUT PPHYSICAL_ADDRESS TranslatedAddress
1347 );
1348
1349 typedef
1350 NTSTATUS
1351 (DDKAPI *pHalAssignSlotResources)(
1352 IN PUNICODE_STRING RegistryPath,
1353 IN PUNICODE_STRING DriverClassName OPTIONAL,
1354 IN PDRIVER_OBJECT DriverObject,
1355 IN PDEVICE_OBJECT DeviceObject,
1356 IN INTERFACE_TYPE BusType,
1357 IN ULONG BusNumber,
1358 IN ULONG SlotNumber,
1359 IN OUT PCM_RESOURCE_LIST *AllocatedResources
1360 );
1361
1362 typedef
1363 VOID
1364 (DDKAPI *pHalHaltSystem)(
1365 VOID
1366 );
1367
1368 typedef
1369 BOOLEAN
1370 (DDKAPI *pHalResetDisplay)(
1371 VOID
1372 );
1373
1374 typedef
1375 UCHAR
1376 (DDKAPI *pHalVectorToIDTEntry)(
1377 ULONG Vector
1378 );
1379
1380 typedef
1381 BOOLEAN
1382 (DDKAPI *pHalFindBusAddressTranslation)(
1383 IN PHYSICAL_ADDRESS BusAddress,
1384 IN OUT PULONG AddressSpace,
1385 OUT PPHYSICAL_ADDRESS TranslatedAddress,
1386 IN OUT PULONG_PTR Context,
1387 IN BOOLEAN NextBus
1388 );
1389
1390 typedef
1391 NTSTATUS
1392 (DDKAPI *pKdSetupPciDeviceForDebugging)(
1393 IN PVOID LoaderBlock OPTIONAL,
1394 IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice
1395 );
1396
1397 typedef
1398 NTSTATUS
1399 (DDKAPI *pKdReleasePciDeviceForDebugging)(
1400 IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice
1401 );
1402
1403 typedef
1404 PVOID
1405 (DDKAPI *pKdGetAcpiTablePhase0)(
1406 IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
1407 IN ULONG Signature
1408 );
1409
1410 typedef
1411 VOID
1412 (DDKAPI *pKdCheckPowerButton)(
1413 VOID
1414 );
1415
1416 typedef
1417 ULONG
1418 (DDKAPI *pHalGetInterruptVector)(
1419 IN INTERFACE_TYPE InterfaceType,
1420 IN ULONG BusNumber,
1421 IN ULONG BusInterruptLevel,
1422 IN ULONG BusInterruptVector,
1423 OUT PKIRQL Irql,
1424 OUT PKAFFINITY Affinity
1425 );
1426
1427 typedef
1428 NTSTATUS
1429 (DDKAPI *pHalGetVectorInput)(
1430 IN ULONG Vector,
1431 IN KAFFINITY Affinity,
1432 OUT PULONG Input,
1433 OUT PKINTERRUPT_POLARITY Polarity
1434 );
1435
1436 typedef
1437 PVOID
1438 (DDKAPI *pKdMapPhysicalMemory64)(
1439 IN PHYSICAL_ADDRESS PhysicalAddress,
1440 IN ULONG NumberPages
1441 );
1442
1443 typedef
1444 VOID
1445 (DDKAPI *pKdUnmapVirtualAddress)(
1446 IN PVOID VirtualAddress,
1447 IN ULONG NumberPages
1448 );
1449
1450 typedef
1451 ULONG
1452 (DDKAPI *pKdGetPciDataByOffset)(
1453 IN ULONG BusNumber,
1454 IN ULONG SlotNumber,
1455 OUT PVOID Buffer,
1456 IN ULONG Offset,
1457 IN ULONG Length
1458 );
1459
1460 typedef
1461 ULONG
1462 (DDKAPI *pKdSetPciDataByOffset)(
1463 IN ULONG BusNumber,
1464 IN ULONG SlotNumber,
1465 IN PVOID Buffer,
1466 IN ULONG Offset,
1467 IN ULONG Length
1468 );
1469
1470 typedef BOOLEAN
1471 (DDKAPI *PHAL_RESET_DISPLAY_PARAMETERS)(
1472 ULONG Columns, ULONG Rows);
1473
1474 typedef struct {
1475 ULONG Version;
1476 pHalQuerySystemInformation HalQuerySystemInformation;
1477 pHalSetSystemInformation HalSetSystemInformation;
1478 pHalQueryBusSlots HalQueryBusSlots;
1479 ULONG Spare1;
1480 pHalExamineMBR HalExamineMBR;
1481 pHalIoAssignDriveLetters HalIoAssignDriveLetters;
1482 pHalIoReadPartitionTable HalIoReadPartitionTable;
1483 pHalIoSetPartitionInformation HalIoSetPartitionInformation;
1484 pHalIoWritePartitionTable HalIoWritePartitionTable;
1485 pHalHandlerForBus HalReferenceHandlerForBus;
1486 pHalReferenceBusHandler HalReferenceBusHandler;
1487 pHalReferenceBusHandler HalDereferenceBusHandler;
1488 pHalInitPnpDriver HalInitPnpDriver;
1489 pHalInitPowerManagement HalInitPowerManagement;
1490 pHalGetDmaAdapter HalGetDmaAdapter;
1491 pHalGetInterruptTranslator HalGetInterruptTranslator;
1492 pHalStartMirroring HalStartMirroring;
1493 pHalEndMirroring HalEndMirroring;
1494 pHalMirrorPhysicalMemory HalMirrorPhysicalMemory;
1495 pHalEndOfBoot HalEndOfBoot;
1496 pHalMirrorVerify HalMirrorVerify;
1497 } HAL_DISPATCH, *PHAL_DISPATCH;
1498
1499 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTHAL_)
1500 extern NTSYSAPI PHAL_DISPATCH HalDispatchTable;
1501 #define HALDISPATCH ((PHAL_DISPATCH)&HalDispatchTable)
1502 #else
1503 extern __declspec(dllexport) HAL_DISPATCH HalDispatchTable;
1504 #define HALDISPATCH (&HalDispatchTable)
1505 #endif
1506
1507 #define HAL_DISPATCH_VERSION 3
1508 #define HalDispatchTableVersion HALDISPATCH->Version
1509 #define HalQuerySystemInformation HALDISPATCH->HalQuerySystemInformation
1510 #define HalSetSystemInformation HALDISPATCH->HalSetSystemInformation
1511 #define HalQueryBusSlots HALDISPATCH->HalQueryBusSlots
1512 #define HalReferenceHandlerForBus HALDISPATCH->HalReferenceHandlerForBus
1513 #define HalReferenceBusHandler HALDISPATCH->HalReferenceBusHandler
1514 #define HalDereferenceBusHandler HALDISPATCH->HalDereferenceBusHandler
1515 #define HalInitPnpDriver HALDISPATCH->HalInitPnpDriver
1516 #define HalInitPowerManagement HALDISPATCH->HalInitPowerManagement
1517 #define HalGetDmaAdapter HALDISPATCH->HalGetDmaAdapter
1518 #define HalGetInterruptTranslator HALDISPATCH->HalGetInterruptTranslator
1519 #define HalStartMirroring HALDISPATCH->HalStartMirroring
1520 #define HalEndMirroring HALDISPATCH->HalEndMirroring
1521 #define HalMirrorPhysicalMemory HALDISPATCH->HalMirrorPhysicalMemory
1522 #define HalEndOfBoot HALDISPATCH->HalEndOfBoot
1523 #define HalMirrorVerify HALDISPATCH->HalMirrorVerify
1524
1525 typedef enum _FILE_INFORMATION_CLASS {
1526 FileDirectoryInformation = 1,
1527 FileFullDirectoryInformation,
1528 FileBothDirectoryInformation,
1529 FileBasicInformation,
1530 FileStandardInformation,
1531 FileInternalInformation,
1532 FileEaInformation,
1533 FileAccessInformation,
1534 FileNameInformation,
1535 FileRenameInformation,
1536 FileLinkInformation,
1537 FileNamesInformation,
1538 FileDispositionInformation,
1539 FilePositionInformation,
1540 FileFullEaInformation,
1541 FileModeInformation,
1542 FileAlignmentInformation,
1543 FileAllInformation,
1544 FileAllocationInformation,
1545 FileEndOfFileInformation,
1546 FileAlternateNameInformation,
1547 FileStreamInformation,
1548 FilePipeInformation,
1549 FilePipeLocalInformation,
1550 FilePipeRemoteInformation,
1551 FileMailslotQueryInformation,
1552 FileMailslotSetInformation,
1553 FileCompressionInformation,
1554 FileObjectIdInformation,
1555 FileCompletionInformation,
1556 FileMoveClusterInformation,
1557 FileQuotaInformation,
1558 FileReparsePointInformation,
1559 FileNetworkOpenInformation,
1560 FileAttributeTagInformation,
1561 FileTrackingInformation,
1562 FileIdBothDirectoryInformation,
1563 FileIdFullDirectoryInformation,
1564 FileValidDataLengthInformation,
1565 FileShortNameInformation,
1566 FileMaximumInformation
1567 } FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
1568
1569 typedef struct _FILE_POSITION_INFORMATION {
1570 LARGE_INTEGER CurrentByteOffset;
1571 } FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;
1572
1573 typedef struct _FILE_ALIGNMENT_INFORMATION {
1574 ULONG AlignmentRequirement;
1575 } FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION;
1576
1577 typedef struct _FILE_NAME_INFORMATION {
1578 ULONG FileNameLength;
1579 WCHAR FileName[1];
1580 } FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;
1581
1582 #include <pshpack8.h>
1583 typedef struct _FILE_BASIC_INFORMATION {
1584 LARGE_INTEGER CreationTime;
1585 LARGE_INTEGER LastAccessTime;
1586 LARGE_INTEGER LastWriteTime;
1587 LARGE_INTEGER ChangeTime;
1588 ULONG FileAttributes;
1589 } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
1590 #include <poppack.h>
1591
1592 typedef struct _FILE_STANDARD_INFORMATION {
1593 LARGE_INTEGER AllocationSize;
1594 LARGE_INTEGER EndOfFile;
1595 ULONG NumberOfLinks;
1596 BOOLEAN DeletePending;
1597 BOOLEAN Directory;
1598 } FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
1599
1600 typedef struct _FILE_NETWORK_OPEN_INFORMATION {
1601 LARGE_INTEGER CreationTime;
1602 LARGE_INTEGER LastAccessTime;
1603 LARGE_INTEGER LastWriteTime;
1604 LARGE_INTEGER ChangeTime;
1605 LARGE_INTEGER AllocationSize;
1606 LARGE_INTEGER EndOfFile;
1607 ULONG FileAttributes;
1608 } FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;
1609
1610 typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION {
1611 ULONG FileAttributes;
1612 ULONG ReparseTag;
1613 } FILE_ATTRIBUTE_TAG_INFORMATION, *PFILE_ATTRIBUTE_TAG_INFORMATION;
1614
1615 typedef struct _FILE_DISPOSITION_INFORMATION {
1616 BOOLEAN DeleteFile;
1617 } FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION;
1618
1619 typedef struct _FILE_END_OF_FILE_INFORMATION {
1620 LARGE_INTEGER EndOfFile;
1621 } FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION;
1622
1623 typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION {
1624 LARGE_INTEGER ValidDataLength;
1625 } FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION;
1626
1627 typedef union _FILE_SEGMENT_ELEMENT {
1628 PVOID64 Buffer;
1629 ULONGLONG Alignment;
1630 }FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT;
1631
1632 typedef enum _FSINFOCLASS {
1633 FileFsVolumeInformation = 1,
1634 FileFsLabelInformation,
1635 FileFsSizeInformation,
1636 FileFsDeviceInformation,
1637 FileFsAttributeInformation,
1638 FileFsControlInformation,
1639 FileFsFullSizeInformation,
1640 FileFsObjectIdInformation,
1641 FileFsDriverPathInformation,
1642 FileFsMaximumInformation
1643 } FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
1644
1645 typedef struct _FILE_FS_DEVICE_INFORMATION {
1646 DEVICE_TYPE DeviceType;
1647 ULONG Characteristics;
1648 } FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;
1649
1650 typedef struct _FILE_FULL_EA_INFORMATION {
1651 ULONG NextEntryOffset;
1652 UCHAR Flags;
1653 UCHAR EaNameLength;
1654 USHORT EaValueLength;
1655 CHAR EaName[1];
1656 } FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
1657
1658 /* ERESOURCE.Flag */
1659
1660 #define ResourceNeverExclusive 0x0010
1661 #define ResourceReleaseByOtherThread 0x0020
1662 #define ResourceOwnedExclusive 0x0080
1663
1664 #define RESOURCE_HASH_TABLE_SIZE 64
1665
1666 typedef struct _DEVOBJ_EXTENSION
1667 {
1668 CSHORT Type;
1669 USHORT Size;
1670 PDEVICE_OBJECT DeviceObject;
1671 } DEVOBJ_EXTENSION, *PDEVOBJ_EXTENSION;
1672
1673 typedef BOOLEAN
1674 (DDKAPI *PFAST_IO_CHECK_IF_POSSIBLE)(
1675 IN struct _FILE_OBJECT *FileObject,
1676 IN PLARGE_INTEGER FileOffset,
1677 IN ULONG Length,
1678 IN BOOLEAN Wait,
1679 IN ULONG LockKey,
1680 IN BOOLEAN CheckForReadOperation,
1681 OUT PIO_STATUS_BLOCK IoStatus,
1682 IN struct _DEVICE_OBJECT *DeviceObject);
1683
1684 typedef BOOLEAN
1685 (DDKAPI *PFAST_IO_READ)(
1686 IN struct _FILE_OBJECT *FileObject,
1687 IN PLARGE_INTEGER FileOffset,
1688 IN ULONG Length,
1689 IN BOOLEAN Wait,
1690 IN ULONG LockKey,
1691 OUT PVOID Buffer,
1692 OUT PIO_STATUS_BLOCK IoStatus,
1693 IN struct _DEVICE_OBJECT *DeviceObject);
1694
1695 typedef BOOLEAN
1696 (DDKAPI *PFAST_IO_WRITE)(
1697 IN struct _FILE_OBJECT *FileObject,
1698 IN PLARGE_INTEGER FileOffset,
1699 IN ULONG Length,
1700 IN BOOLEAN Wait,
1701 IN ULONG LockKey,
1702 IN PVOID Buffer,
1703 OUT PIO_STATUS_BLOCK IoStatus,
1704 IN struct _DEVICE_OBJECT *DeviceObject);
1705
1706 typedef BOOLEAN
1707 (DDKAPI *PFAST_IO_QUERY_BASIC_INFO)(
1708 IN struct _FILE_OBJECT *FileObject,
1709 IN BOOLEAN Wait,
1710 OUT PFILE_BASIC_INFORMATION Buffer,
1711 OUT PIO_STATUS_BLOCK IoStatus,
1712 IN struct _DEVICE_OBJECT *DeviceObject);
1713
1714 typedef BOOLEAN
1715 (DDKAPI *PFAST_IO_QUERY_STANDARD_INFO)(
1716 IN struct _FILE_OBJECT *FileObject,
1717 IN BOOLEAN Wait,
1718 OUT PFILE_STANDARD_INFORMATION Buffer,
1719 OUT PIO_STATUS_BLOCK IoStatus,
1720 IN struct _DEVICE_OBJECT *DeviceObject);
1721
1722 typedef BOOLEAN
1723 (DDKAPI *PFAST_IO_LOCK)(
1724 IN struct _FILE_OBJECT *FileObject,
1725 IN PLARGE_INTEGER FileOffset,
1726 IN PLARGE_INTEGER Length,
1727 PEPROCESS ProcessId,
1728 ULONG Key,
1729 BOOLEAN FailImmediately,
1730 BOOLEAN ExclusiveLock,
1731 OUT PIO_STATUS_BLOCK IoStatus,
1732 IN struct _DEVICE_OBJECT *DeviceObject);
1733
1734 typedef BOOLEAN
1735 (DDKAPI *PFAST_IO_UNLOCK_SINGLE)(
1736 IN struct _FILE_OBJECT *FileObject,
1737 IN PLARGE_INTEGER FileOffset,
1738 IN PLARGE_INTEGER Length,
1739 PEPROCESS ProcessId,
1740 ULONG Key,
1741 OUT PIO_STATUS_BLOCK IoStatus,
1742 IN struct _DEVICE_OBJECT *DeviceObject);
1743
1744 typedef BOOLEAN
1745 (DDKAPI *PFAST_IO_UNLOCK_ALL)(
1746 IN struct _FILE_OBJECT *FileObject,
1747 PEPROCESS ProcessId,
1748 OUT PIO_STATUS_BLOCK IoStatus,
1749 IN struct _DEVICE_OBJECT *DeviceObject);
1750
1751 typedef BOOLEAN
1752 (DDKAPI *PFAST_IO_UNLOCK_ALL_BY_KEY)(
1753 IN struct _FILE_OBJECT *FileObject,
1754 PVOID ProcessId,
1755 ULONG Key,
1756 OUT PIO_STATUS_BLOCK IoStatus,
1757 IN struct _DEVICE_OBJECT *DeviceObject);
1758
1759 typedef BOOLEAN
1760 (DDKAPI *PFAST_IO_DEVICE_CONTROL)(
1761 IN struct _FILE_OBJECT *FileObject,
1762 IN BOOLEAN Wait,
1763 IN PVOID InputBuffer OPTIONAL,
1764 IN ULONG InputBufferLength,
1765 OUT PVOID OutputBuffer OPTIONAL,
1766 IN ULONG OutputBufferLength,
1767 IN ULONG IoControlCode,
1768 OUT PIO_STATUS_BLOCK IoStatus,
1769 IN struct _DEVICE_OBJECT *DeviceObject);
1770
1771 typedef VOID
1772 (DDKAPI *PFAST_IO_ACQUIRE_FILE)(
1773 IN struct _FILE_OBJECT *FileObject);
1774
1775 typedef VOID
1776 (DDKAPI *PFAST_IO_RELEASE_FILE)(
1777 IN struct _FILE_OBJECT *FileObject);
1778
1779 typedef VOID
1780 (DDKAPI *PFAST_IO_DETACH_DEVICE)(
1781 IN struct _DEVICE_OBJECT *SourceDevice,
1782 IN struct _DEVICE_OBJECT *TargetDevice);
1783
1784 typedef BOOLEAN
1785 (DDKAPI *PFAST_IO_QUERY_NETWORK_OPEN_INFO)(
1786 IN struct _FILE_OBJECT *FileObject,
1787 IN BOOLEAN Wait,
1788 OUT struct _FILE_NETWORK_OPEN_INFORMATION *Buffer,
1789 OUT struct _IO_STATUS_BLOCK *IoStatus,
1790 IN struct _DEVICE_OBJECT *DeviceObject);
1791
1792 typedef NTSTATUS
1793 (DDKAPI *PFAST_IO_ACQUIRE_FOR_MOD_WRITE)(
1794 IN struct _FILE_OBJECT *FileObject,
1795 IN PLARGE_INTEGER EndingOffset,
1796 OUT struct _ERESOURCE **ResourceToRelease,
1797 IN struct _DEVICE_OBJECT *DeviceObject);
1798
1799 typedef BOOLEAN
1800 (DDKAPI *PFAST_IO_MDL_READ)(
1801 IN struct _FILE_OBJECT *FileObject,
1802 IN PLARGE_INTEGER FileOffset,
1803 IN ULONG Length,
1804 IN ULONG LockKey,
1805 OUT PMDL *MdlChain,
1806 OUT PIO_STATUS_BLOCK IoStatus,
1807 IN struct _DEVICE_OBJECT *DeviceObject);
1808
1809 typedef BOOLEAN
1810 (DDKAPI *PFAST_IO_MDL_READ_COMPLETE)(
1811 IN struct _FILE_OBJECT *FileObject,
1812 IN PMDL MdlChain,
1813 IN struct _DEVICE_OBJECT *DeviceObject);
1814
1815 typedef BOOLEAN
1816 (DDKAPI *PFAST_IO_PREPARE_MDL_WRITE)(
1817 IN struct _FILE_OBJECT *FileObject,
1818 IN PLARGE_INTEGER FileOffset,
1819 IN ULONG Length,
1820 IN ULONG LockKey,
1821 OUT PMDL *MdlChain,
1822 OUT PIO_STATUS_BLOCK IoStatus,
1823 IN struct _DEVICE_OBJECT *DeviceObject);
1824
1825 typedef BOOLEAN
1826 (DDKAPI *PFAST_IO_MDL_WRITE_COMPLETE)(
1827 IN struct _FILE_OBJECT *FileObject,
1828 IN PLARGE_INTEGER FileOffset,
1829 IN PMDL MdlChain,
1830 IN struct _DEVICE_OBJECT *DeviceObject);
1831
1832 typedef BOOLEAN
1833 (DDKAPI *PFAST_IO_READ_COMPRESSED)(
1834 IN struct _FILE_OBJECT *FileObject,
1835 IN PLARGE_INTEGER FileOffset,
1836 IN ULONG Length,
1837 IN ULONG LockKey,
1838 OUT PVOID Buffer,
1839 OUT PMDL *MdlChain,
1840 OUT PIO_STATUS_BLOCK IoStatus,
1841 OUT struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
1842 IN ULONG CompressedDataInfoLength,
1843 IN struct _DEVICE_OBJECT *DeviceObject);
1844
1845 typedef BOOLEAN
1846 (DDKAPI *PFAST_IO_WRITE_COMPRESSED)(
1847 IN struct _FILE_OBJECT *FileObject,
1848 IN PLARGE_INTEGER FileOffset,
1849 IN ULONG Length,
1850 IN ULONG LockKey,
1851 IN PVOID Buffer,
1852 OUT PMDL *MdlChain,
1853 OUT PIO_STATUS_BLOCK IoStatus,
1854 IN struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
1855 IN ULONG CompressedDataInfoLength,
1856 IN struct _DEVICE_OBJECT *DeviceObject);
1857
1858 typedef BOOLEAN
1859 (DDKAPI *PFAST_IO_MDL_READ_COMPLETE_COMPRESSED)(
1860 IN struct _FILE_OBJECT *FileObject,
1861 IN PMDL MdlChain,
1862 IN struct _DEVICE_OBJECT *DeviceObject);
1863
1864 typedef BOOLEAN
1865 (DDKAPI *PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED)(
1866 IN struct _FILE_OBJECT *FileObject,
1867 IN PLARGE_INTEGER FileOffset,
1868 IN PMDL MdlChain,
1869 IN struct _DEVICE_OBJECT *DeviceObject);
1870
1871 typedef BOOLEAN
1872 (DDKAPI *PFAST_IO_QUERY_OPEN)(
1873 IN struct _IRP *Irp,
1874 OUT PFILE_NETWORK_OPEN_INFORMATION NetworkInformation,
1875 IN struct _DEVICE_OBJECT *DeviceObject);
1876
1877 typedef NTSTATUS
1878 (DDKAPI *PFAST_IO_RELEASE_FOR_MOD_WRITE)(
1879 IN struct _FILE_OBJECT *FileObject,
1880 IN struct _ERESOURCE *ResourceToRelease,
1881 IN struct _DEVICE_OBJECT *DeviceObject);
1882
1883 typedef NTSTATUS
1884 (DDKAPI *PFAST_IO_ACQUIRE_FOR_CCFLUSH)(
1885 IN struct _FILE_OBJECT *FileObject,
1886 IN struct _DEVICE_OBJECT *DeviceObject);
1887
1888 typedef NTSTATUS
1889 (DDKAPI *PFAST_IO_RELEASE_FOR_CCFLUSH) (
1890 IN struct _FILE_OBJECT *FileObject,
1891 IN struct _DEVICE_OBJECT *DeviceObject);
1892
1893 typedef struct _FAST_IO_DISPATCH {
1894 ULONG SizeOfFastIoDispatch;
1895 PFAST_IO_CHECK_IF_POSSIBLE FastIoCheckIfPossible;
1896 PFAST_IO_READ FastIoRead;
1897 PFAST_IO_WRITE FastIoWrite;
1898 PFAST_IO_QUERY_BASIC_INFO FastIoQueryBasicInfo;
1899 PFAST_IO_QUERY_STANDARD_INFO FastIoQueryStandardInfo;
1900 PFAST_IO_LOCK FastIoLock;
1901 PFAST_IO_UNLOCK_SINGLE FastIoUnlockSingle;
1902 PFAST_IO_UNLOCK_ALL FastIoUnlockAll;
1903 PFAST_IO_UNLOCK_ALL_BY_KEY FastIoUnlockAllByKey;
1904 PFAST_IO_DEVICE_CONTROL FastIoDeviceControl;
1905 PFAST_IO_ACQUIRE_FILE AcquireFileForNtCreateSection;
1906 PFAST_IO_RELEASE_FILE ReleaseFileForNtCreateSection;
1907 PFAST_IO_DETACH_DEVICE FastIoDetachDevice;
1908 PFAST_IO_QUERY_NETWORK_OPEN_INFO FastIoQueryNetworkOpenInfo;
1909 PFAST_IO_ACQUIRE_FOR_MOD_WRITE AcquireForModWrite;
1910 PFAST_IO_MDL_READ MdlRead;
1911 PFAST_IO_MDL_READ_COMPLETE MdlReadComplete;
1912 PFAST_IO_PREPARE_MDL_WRITE PrepareMdlWrite;
1913 PFAST_IO_MDL_WRITE_COMPLETE MdlWriteComplete;
1914 PFAST_IO_READ_COMPRESSED FastIoReadCompressed;
1915 PFAST_IO_WRITE_COMPRESSED FastIoWriteCompressed;
1916 PFAST_IO_MDL_READ_COMPLETE_COMPRESSED MdlReadCompleteCompressed;
1917 PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED MdlWriteCompleteCompressed;
1918 PFAST_IO_QUERY_OPEN FastIoQueryOpen;
1919 PFAST_IO_RELEASE_FOR_MOD_WRITE ReleaseForModWrite;
1920 PFAST_IO_ACQUIRE_FOR_CCFLUSH AcquireForCcFlush;
1921 PFAST_IO_RELEASE_FOR_CCFLUSH ReleaseForCcFlush;
1922 } FAST_IO_DISPATCH, *PFAST_IO_DISPATCH;
1923
1924 typedef struct _SECTION_OBJECT_POINTERS {
1925 PVOID DataSectionObject;
1926 PVOID SharedCacheMap;
1927 PVOID ImageSectionObject;
1928 } SECTION_OBJECT_POINTERS, *PSECTION_OBJECT_POINTERS;
1929
1930 typedef struct _IO_COMPLETION_CONTEXT {
1931 PVOID Port;
1932 PVOID Key;
1933 } IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT;
1934
1935 /* FILE_OBJECT.Flags */
1936
1937 #define FO_FILE_OPEN 0x00000001
1938 #define FO_SYNCHRONOUS_IO 0x00000002
1939 #define FO_ALERTABLE_IO 0x00000004
1940 #define FO_NO_INTERMEDIATE_BUFFERING 0x00000008
1941 #define FO_WRITE_THROUGH 0x00000010
1942 #define FO_SEQUENTIAL_ONLY 0x00000020
1943 #define FO_CACHE_SUPPORTED 0x00000040
1944 #define FO_NAMED_PIPE 0x00000080
1945 #define FO_STREAM_FILE 0x00000100
1946 #define FO_MAILSLOT 0x00000200
1947 #define FO_GENERATE_AUDIT_ON_CLOSE 0x00000400
1948 #define FO_DIRECT_DEVICE_OPEN 0x00000800
1949 #define FO_FILE_MODIFIED 0x00001000
1950 #define FO_FILE_SIZE_CHANGED 0x00002000
1951 #define FO_CLEANUP_COMPLETE 0x00004000
1952 #define FO_TEMPORARY_FILE 0x00008000
1953 #define FO_DELETE_ON_CLOSE 0x00010000
1954 #define FO_OPENED_CASE_SENSITIVE 0x00020000
1955 #define FO_HANDLE_CREATED 0x00040000
1956 #define FO_FILE_FAST_IO_READ 0x00080000
1957 #define FO_RANDOM_ACCESS 0x00100000
1958 #define FO_FILE_OPEN_CANCELLED 0x00200000
1959 #define FO_VOLUME_OPEN 0x00400000
1960 #define FO_REMOTE_ORIGIN 0x01000000
1961
1962 typedef struct _FILE_OBJECT
1963 {
1964 CSHORT Type;
1965 CSHORT Size;
1966 PDEVICE_OBJECT DeviceObject;
1967 PVPB Vpb;
1968 PVOID FsContext;
1969 PVOID FsContext2;
1970 PSECTION_OBJECT_POINTERS SectionObjectPointer;
1971 PVOID PrivateCacheMap;
1972 NTSTATUS FinalStatus;
1973 struct _FILE_OBJECT *RelatedFileObject;
1974 BOOLEAN LockOperation;
1975 BOOLEAN DeletePending;
1976 BOOLEAN ReadAccess;
1977 BOOLEAN WriteAccess;
1978 BOOLEAN DeleteAccess;
1979 BOOLEAN SharedRead;
1980 BOOLEAN SharedWrite;
1981 BOOLEAN SharedDelete;
1982 ULONG Flags;
1983 UNICODE_STRING FileName;
1984 LARGE_INTEGER CurrentByteOffset;
1985 volatile ULONG Waiters;
1986 volatile ULONG Busy;
1987 PVOID LastLock;
1988 KEVENT Lock;
1989 KEVENT Event;
1990 volatile PIO_COMPLETION_CONTEXT CompletionContext;
1991 KSPIN_LOCK IrpListLock;
1992 LIST_ENTRY IrpList;
1993 volatile PVOID FileObjectExtension;
1994 } FILE_OBJECT;
1995 typedef struct _FILE_OBJECT *PFILE_OBJECT;
1996
1997 typedef enum _SECURITY_OPERATION_CODE {
1998 SetSecurityDescriptor,
1999 QuerySecurityDescriptor,
2000 DeleteSecurityDescriptor,
2001 AssignSecurityDescriptor
2002 } SECURITY_OPERATION_CODE, *PSECURITY_OPERATION_CODE;
2003
2004 #define INITIAL_PRIVILEGE_COUNT 3
2005
2006 typedef struct _INITIAL_PRIVILEGE_SET {
2007 ULONG PrivilegeCount;
2008 ULONG Control;
2009 LUID_AND_ATTRIBUTES Privilege[INITIAL_PRIVILEGE_COUNT];
2010 } INITIAL_PRIVILEGE_SET, * PINITIAL_PRIVILEGE_SET;
2011
2012 #define SE_MIN_WELL_KNOWN_PRIVILEGE 2
2013 #define SE_CREATE_TOKEN_PRIVILEGE 2
2014 #define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE 3
2015 #define SE_LOCK_MEMORY_PRIVILEGE 4
2016 #define SE_INCREASE_QUOTA_PRIVILEGE 5
2017 #define SE_UNSOLICITED_INPUT_PRIVILEGE 6
2018 #define SE_MACHINE_ACCOUNT_PRIVILEGE 6
2019 #define SE_TCB_PRIVILEGE 7
2020 #define SE_SECURITY_PRIVILEGE 8
2021 #define SE_TAKE_OWNERSHIP_PRIVILEGE 9
2022 #define SE_LOAD_DRIVER_PRIVILEGE 10
2023 #define SE_SYSTEM_PROFILE_PRIVILEGE 11
2024 #define SE_SYSTEMTIME_PRIVILEGE 12
2025 #define SE_PROF_SINGLE_PROCESS_PRIVILEGE 13
2026 #define SE_INC_BASE_PRIORITY_PRIVILEGE 14
2027 #define SE_CREATE_PAGEFILE_PRIVILEGE 15
2028 #define SE_CREATE_PERMANENT_PRIVILEGE 16
2029 #define SE_BACKUP_PRIVILEGE 17
2030 #define SE_RESTORE_PRIVILEGE 18
2031 #define SE_SHUTDOWN_PRIVILEGE 19
2032 #define SE_DEBUG_PRIVILEGE 20
2033 #define SE_AUDIT_PRIVILEGE 21
2034 #define SE_SYSTEM_ENVIRONMENT_PRIVILEGE 22
2035 #define SE_CHANGE_NOTIFY_PRIVILEGE 23
2036 #define SE_REMOTE_SHUTDOWN_PRIVILEGE 24
2037 #define SE_UNDOCK_PRIVILEGE 25
2038 #define SE_SYNC_AGENT_PRIVILEGE 26
2039 #define SE_ENABLE_DELEGATION_PRIVILEGE 27
2040 #define SE_MANAGE_VOLUME_PRIVILEGE 28
2041 #define SE_IMPERSONATE_PRIVILEGE 29
2042 #define SE_CREATE_GLOBAL_PRIVILEGE 30
2043 #define SE_MAX_WELL_KNOWN_PRIVILEGE SE_CREATE_GLOBAL_PRIVILEGE
2044
2045 typedef struct _SECURITY_SUBJECT_CONTEXT {
2046 PACCESS_TOKEN ClientToken;
2047 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
2048 PACCESS_TOKEN PrimaryToken;
2049 PVOID ProcessAuditId;
2050 } SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT;
2051
2052 #include <pshpack4.h>
2053 typedef struct _ACCESS_STATE {
2054 LUID OperationID;
2055 BOOLEAN SecurityEvaluated;
2056 BOOLEAN GenerateAudit;
2057 BOOLEAN GenerateOnClose;
2058 BOOLEAN PrivilegesAllocated;
2059 ULONG Flags;
2060 ACCESS_MASK RemainingDesiredAccess;
2061 ACCESS_MASK PreviouslyGrantedAccess;
2062 ACCESS_MASK OriginalDesiredAccess;
2063 SECURITY_SUBJECT_CONTEXT SubjectSecurityContext;
2064 PSECURITY_DESCRIPTOR SecurityDescriptor;
2065 PVOID AuxData;
2066 union {
2067 INITIAL_PRIVILEGE_SET InitialPrivilegeSet;
2068 PRIVILEGE_SET PrivilegeSet;
2069 } Privileges;
2070
2071 BOOLEAN AuditPrivileges;
2072 UNICODE_STRING ObjectName;
2073 UNICODE_STRING ObjectTypeName;
2074 } ACCESS_STATE, *PACCESS_STATE;
2075 #include <poppack.h>
2076
2077 typedef struct _IO_SECURITY_CONTEXT {
2078 PSECURITY_QUALITY_OF_SERVICE SecurityQos;
2079 PACCESS_STATE AccessState;
2080 ACCESS_MASK DesiredAccess;
2081 ULONG FullCreateOptions;
2082 } IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT;
2083
2084 #define IO_TYPE_ADAPTER 1
2085 #define IO_TYPE_CONTROLLER 2
2086 #define IO_TYPE_DEVICE 3
2087 #define IO_TYPE_DRIVER 4
2088 #define IO_TYPE_FILE 5
2089 #define IO_TYPE_IRP 6
2090 #define IO_TYPE_MASTER_ADAPTER 7
2091 #define IO_TYPE_OPEN_PACKET 8
2092 #define IO_TYPE_TIMER 9
2093 #define IO_TYPE_VPB 10
2094 #define IO_TYPE_ERROR_LOG 11
2095 #define IO_TYPE_ERROR_MESSAGE 12
2096 #define IO_TYPE_DEVICE_OBJECT_EXTENSION 13
2097
2098 #define IO_TYPE_CSQ_IRP_CONTEXT 1
2099 #define IO_TYPE_CSQ 2
2100
2101 struct _IO_CSQ;
2102
2103 typedef struct _IO_CSQ_IRP_CONTEXT {
2104 ULONG Type;
2105 struct _IRP *Irp;
2106 struct _IO_CSQ *Csq;
2107 } IO_CSQ_IRP_CONTEXT, *PIO_CSQ_IRP_CONTEXT;
2108
2109 typedef VOID
2110 (DDKAPI *PIO_CSQ_INSERT_IRP)(
2111 IN struct _IO_CSQ *Csq,
2112 IN PIRP Irp);
2113
2114 typedef VOID
2115 (DDKAPI *PIO_CSQ_REMOVE_IRP)(
2116 IN struct _IO_CSQ *Csq,
2117 IN PIRP Irp);
2118
2119 typedef PIRP
2120 (DDKAPI *PIO_CSQ_PEEK_NEXT_IRP)(
2121 IN struct _IO_CSQ *Csq,
2122 IN PIRP Irp,
2123 IN PVOID PeekContext);
2124
2125 typedef VOID
2126 (DDKAPI *PIO_CSQ_ACQUIRE_LOCK)(
2127 IN struct _IO_CSQ *Csq,
2128 OUT PKIRQL Irql);
2129
2130 typedef VOID
2131 (DDKAPI *PIO_CSQ_RELEASE_LOCK)(
2132 IN struct _IO_CSQ *Csq,
2133 IN KIRQL Irql);
2134
2135 typedef VOID
2136 (DDKAPI *PIO_CSQ_COMPLETE_CANCELED_IRP)(
2137 IN struct _IO_CSQ *Csq,
2138 IN PIRP Irp);
2139
2140 typedef struct _IO_CSQ {
2141 ULONG Type;
2142 PIO_CSQ_INSERT_IRP CsqInsertIrp;
2143 PIO_CSQ_REMOVE_IRP CsqRemoveIrp;
2144 PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp;
2145 PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock;
2146 PIO_CSQ_RELEASE_LOCK CsqReleaseLock;
2147 PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp;
2148 PVOID ReservePointer;
2149 } IO_CSQ, *PIO_CSQ;
2150
2151 #if !defined(_ALPHA_)
2152 #include <pshpack4.h>
2153 #endif
2154 typedef struct _IO_STACK_LOCATION {
2155 UCHAR MajorFunction;
2156 UCHAR MinorFunction;
2157 UCHAR Flags;
2158 UCHAR Control;
2159 union {
2160 struct {
2161 PIO_SECURITY_CONTEXT SecurityContext;
2162 ULONG Options;
2163 USHORT POINTER_ALIGNMENT FileAttributes;
2164 USHORT ShareAccess;
2165 ULONG POINTER_ALIGNMENT EaLength;
2166 } Create;
2167 struct {
2168 ULONG Length;
2169 ULONG POINTER_ALIGNMENT Key;
2170 LARGE_INTEGER ByteOffset;
2171 } Read;
2172 struct {
2173 ULONG Length;
2174 ULONG POINTER_ALIGNMENT Key;
2175 LARGE_INTEGER ByteOffset;
2176 } Write;
2177 struct {
2178 ULONG Length;
2179 PUNICODE_STRING FileName;
2180 FILE_INFORMATION_CLASS FileInformationClass;
2181 ULONG FileIndex;
2182 } QueryDirectory;
2183 struct {
2184 ULONG Length;
2185 ULONG CompletionFilter;
2186 } NotifyDirectory;
2187 struct {
2188 ULONG Length;
2189 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
2190 } QueryFile;
2191 struct {
2192 ULONG Length;
2193 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
2194 PFILE_OBJECT FileObject;
2195 _ANONYMOUS_UNION union {
2196 _ANONYMOUS_STRUCT struct {
2197 BOOLEAN ReplaceIfExists;
2198 BOOLEAN AdvanceOnly;
2199 } DUMMYSTRUCTNAME;
2200 ULONG ClusterCount;
2201 HANDLE DeleteHandle;
2202 } DUMMYUNIONNAME;
2203 } SetFile;
2204 struct {
2205 ULONG Length;
2206 PVOID EaList;
2207 ULONG EaListLength;
2208 ULONG EaIndex;
2209 } QueryEa;
2210 struct {
2211 ULONG Length;
2212 } SetEa;
2213 struct {
2214 ULONG Length;
2215 FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass;
2216 } QueryVolume;
2217 struct {
2218 ULONG Length;
2219 FS_INFORMATION_CLASS FsInformationClass;
2220 } SetVolume;
2221 struct {
2222 ULONG OutputBufferLength;
2223 ULONG InputBufferLength;
2224 ULONG FsControlCode;
2225 PVOID Type3InputBuffer;
2226 } FileSystemControl;
2227 struct {
2228 PLARGE_INTEGER Length;
2229 ULONG Key;
2230 LARGE_INTEGER ByteOffset;
2231 } LockControl;
2232 struct {
2233 ULONG OutputBufferLength;
2234 ULONG POINTER_ALIGNMENT InputBufferLength;
2235 ULONG POINTER_ALIGNMENT IoControlCode;
2236 PVOID Type3InputBuffer;
2237 } DeviceIoControl;
2238 struct {
2239 SECURITY_INFORMATION SecurityInformation;
2240 ULONG POINTER_ALIGNMENT Length;
2241 } QuerySecurity;
2242 struct {
2243 SECURITY_INFORMATION SecurityInformation;
2244 PSECURITY_DESCRIPTOR SecurityDescriptor;
2245 } SetSecurity;
2246 struct {
2247 PVPB Vpb;
2248 PDEVICE_OBJECT DeviceObject;
2249 } MountVolume;
2250 struct {
2251 PVPB Vpb;
2252 PDEVICE_OBJECT DeviceObject;
2253 } VerifyVolume;
2254 struct {
2255 struct _SCSI_REQUEST_BLOCK *Srb;
2256 } Scsi;
2257 struct {
2258 ULONG Length;
2259 PSID StartSid;
2260 struct _FILE_GET_QUOTA_INFORMATION *SidList;
2261 ULONG SidListLength;
2262 } QueryQuota;
2263 struct {
2264 ULONG Length;
2265 } SetQuota;
2266 struct {
2267 DEVICE_RELATION_TYPE Type;
2268 } QueryDeviceRelations;
2269 struct {
2270 CONST GUID *InterfaceType;
2271 USHORT Size;
2272 USHORT Version;
2273 PINTERFACE Interface;
2274 PVOID InterfaceSpecificData;
2275 } QueryInterface;
2276 struct {
2277 PDEVICE_CAPABILITIES Capabilities;
2278 } DeviceCapabilities;
2279 struct {
2280 PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList;
2281 } FilterResourceRequirements;
2282 struct {
2283 ULONG WhichSpace;
2284 PVOID Buffer;
2285 ULONG Offset;
2286 ULONG POINTER_ALIGNMENT Length;
2287 } ReadWriteConfig;
2288 struct {
2289 BOOLEAN Lock;
2290 } SetLock;
2291 struct {
2292 BUS_QUERY_ID_TYPE IdType;
2293 } QueryId;
2294 struct {
2295 DEVICE_TEXT_TYPE DeviceTextType;
2296 LCID POINTER_ALIGNMENT LocaleId;
2297 } QueryDeviceText;
2298 struct {
2299 BOOLEAN InPath;
2300 BOOLEAN Reserved[3];
2301 DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type;
2302 } UsageNotification;
2303 struct {
2304 SYSTEM_POWER_STATE PowerState;
2305 } WaitWake;
2306 struct {
2307 PPOWER_SEQUENCE PowerSequence;
2308 } PowerSequence;
2309 struct {
2310 ULONG SystemContext;
2311 POWER_STATE_TYPE POINTER_ALIGNMENT Type;
2312 POWER_STATE POINTER_ALIGNMENT State;
2313 POWER_ACTION POINTER_ALIGNMENT ShutdownType;
2314 } Power;
2315 struct {
2316 PCM_RESOURCE_LIST AllocatedResources;
2317 PCM_RESOURCE_LIST AllocatedResourcesTranslated;
2318 } StartDevice;
2319 struct {
2320 ULONG_PTR ProviderId;
2321 PVOID DataPath;
2322 ULONG BufferSize;
2323 PVOID Buffer;
2324 } WMI;
2325 struct {
2326 PVOID Argument1;
2327 PVOID Argument2;
2328 PVOID Argument3;
2329 PVOID Argument4;
2330 } Others;
2331 } Parameters;
2332 PDEVICE_OBJECT DeviceObject;
2333 PFILE_OBJECT FileObject;
2334 PIO_COMPLETION_ROUTINE CompletionRoutine;
2335 PVOID Context;
2336 } IO_STACK_LOCATION, *PIO_STACK_LOCATION;
2337 #if !defined(_ALPHA_)
2338 #include <poppack.h>
2339 #endif
2340
2341 /* IO_STACK_LOCATION.Control */
2342
2343 #define SL_PENDING_RETURNED 0x01
2344 #define SL_ERROR_RETURNED 0x02
2345 #define SL_INVOKE_ON_CANCEL 0x20
2346 #define SL_INVOKE_ON_SUCCESS 0x40
2347 #define SL_INVOKE_ON_ERROR 0x80
2348
2349 /* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */
2350
2351 #define PCI_WHICHSPACE_CONFIG 0x0
2352 #define PCI_WHICHSPACE_ROM 0x52696350 /* 'PciR' */
2353
2354 typedef enum _KEY_INFORMATION_CLASS {
2355 KeyBasicInformation,
2356 KeyNodeInformation,
2357 KeyFullInformation,
2358 KeyNameInformation,
2359 KeyCachedInformation,
2360 KeyFlagsInformation
2361 } KEY_INFORMATION_CLASS;
2362
2363 typedef struct _KEY_BASIC_INFORMATION {
2364 LARGE_INTEGER LastWriteTime;
2365 ULONG TitleIndex;
2366 ULONG NameLength;
2367 WCHAR Name[1];
2368 } KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION;
2369
2370 typedef struct _KEY_FULL_INFORMATION {
2371 LARGE_INTEGER LastWriteTime;
2372 ULONG TitleIndex;
2373 ULONG ClassOffset;
2374 ULONG ClassLength;
2375 ULONG SubKeys;
2376 ULONG MaxNameLen;
2377 ULONG MaxClassLen;
2378 ULONG Values;
2379 ULONG MaxValueNameLen;
2380 ULONG MaxValueDataLen;
2381 WCHAR Class[1];
2382 } KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION;
2383
2384 typedef struct _KEY_NODE_INFORMATION {
2385 LARGE_INTEGER LastWriteTime;
2386 ULONG TitleIndex;
2387 ULONG ClassOffset;
2388 ULONG ClassLength;
2389 ULONG NameLength;
2390 WCHAR Name[1];
2391 } KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION;
2392
2393 typedef struct _KEY_VALUE_BASIC_INFORMATION {
2394 ULONG TitleIndex;
2395 ULONG Type;
2396 ULONG NameLength;
2397 WCHAR Name[1];
2398 } KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION;
2399
2400 typedef struct _KEY_VALUE_FULL_INFORMATION {
2401 ULONG TitleIndex;
2402 ULONG Type;
2403 ULONG DataOffset;
2404 ULONG DataLength;
2405 ULONG NameLength;
2406 WCHAR Name[1];
2407 } KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION;
2408
2409 typedef struct _KEY_VALUE_PARTIAL_INFORMATION {
2410 ULONG TitleIndex;
2411 ULONG Type;
2412 ULONG DataLength;
2413 UCHAR Data[1];
2414 } KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION;
2415
2416 typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 {
2417 ULONG Type;
2418 ULONG DataLength;
2419 UCHAR Data[1];
2420 } KEY_VALUE_PARTIAL_INFORMATION_ALIGN64, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64;
2421
2422 typedef struct _KEY_VALUE_ENTRY {
2423 PUNICODE_STRING ValueName;
2424 ULONG DataLength;
2425 ULONG DataOffset;
2426 ULONG Type;
2427 } KEY_VALUE_ENTRY, *PKEY_VALUE_ENTRY;
2428
2429 typedef enum _KEY_VALUE_INFORMATION_CLASS {
2430 KeyValueBasicInformation,
2431 KeyValueFullInformation,
2432 KeyValuePartialInformation,
2433 KeyValueFullInformationAlign64,
2434 KeyValuePartialInformationAlign64
2435 } KEY_VALUE_INFORMATION_CLASS;
2436
2437 typedef struct _KEY_WRITE_TIME_INFORMATION {
2438 LARGE_INTEGER LastWriteTime;
2439 } KEY_WRITE_TIME_INFORMATION, *PKEY_WRITE_TIME_INFORMATION;
2440
2441 typedef struct _KEY_USER_FLAGS_INFORMATION {
2442 ULONG UserFlags;
2443 } KEY_USER_FLAGS_INFORMATION, *PKEY_USER_FLAGS_INFORMATION;
2444
2445 typedef enum _KEY_SET_INFORMATION_CLASS {
2446 KeyWriteTimeInformation,
2447 KeyUserFlagsInformation,
2448 MaxKeySetInfoClass
2449 } KEY_SET_INFORMATION_CLASS;
2450
2451 /* KEY_VALUE_Xxx.Type */
2452
2453 #define REG_NONE 0
2454 #define REG_SZ 1
2455 #define REG_EXPAND_SZ 2
2456 #define REG_BINARY 3
2457 #define REG_DWORD 4
2458 #define REG_DWORD_LITTLE_ENDIAN 4
2459 #define REG_DWORD_BIG_ENDIAN 5
2460 #define REG_LINK 6
2461 #define REG_MULTI_SZ 7
2462 #define REG_RESOURCE_LIST 8
2463 #define REG_FULL_RESOURCE_DESCRIPTOR 9
2464 #define REG_RESOURCE_REQUIREMENTS_LIST 10
2465 #define REG_QWORD 11
2466 #define REG_QWORD_LITTLE_ENDIAN 11
2467
2468 #define PCI_TYPE0_ADDRESSES 6
2469 #define PCI_TYPE1_ADDRESSES 2
2470 #define PCI_TYPE2_ADDRESSES 5
2471
2472 typedef struct _PCI_COMMON_CONFIG {
2473 USHORT VendorID;
2474 USHORT DeviceID;
2475 USHORT Command;
2476 USHORT Status;
2477 UCHAR RevisionID;
2478 UCHAR ProgIf;
2479 UCHAR SubClass;
2480 UCHAR BaseClass;
2481 UCHAR CacheLineSize;
2482 UCHAR LatencyTimer;
2483 UCHAR HeaderType;
2484 UCHAR BIST;
2485 union {
2486 struct _PCI_HEADER_TYPE_0 {
2487 ULONG BaseAddresses[PCI_TYPE0_ADDRESSES];
2488 ULONG CIS;
2489 USHORT SubVendorID;
2490 USHORT SubSystemID;
2491 ULONG ROMBaseAddress;
2492 UCHAR CapabilitiesPtr;
2493 UCHAR Reserved1[3];
2494 ULONG Reserved2;
2495 UCHAR InterruptLine;
2496 UCHAR InterruptPin;
2497 UCHAR MinimumGrant;
2498 UCHAR MaximumLatency;
2499 } type0;
2500 struct _PCI_HEADER_TYPE_1 {
2501 ULONG BaseAddresses[PCI_TYPE1_ADDRESSES];
2502 UCHAR PrimaryBus;
2503 UCHAR SecondaryBus;
2504 UCHAR SubordinateBus;
2505 UCHAR SecondaryLatency;
2506 UCHAR IOBase;
2507 UCHAR IOLimit;
2508 USHORT SecondaryStatus;
2509 USHORT MemoryBase;
2510 USHORT MemoryLimit;
2511 USHORT PrefetchBase;
2512 USHORT PrefetchLimit;
2513 ULONG PrefetchBaseUpper32;
2514 ULONG PrefetchLimitUpper32;
2515 USHORT IOBaseUpper16;
2516 USHORT IOLimitUpper16;
2517 UCHAR CapabilitiesPtr;
2518 UCHAR Reserved1[3];
2519 ULONG ROMBaseAddress;
2520 UCHAR InterruptLine;
2521 UCHAR InterruptPin;
2522 USHORT BridgeControl;
2523 } type1;
2524 struct _PCI_HEADER_TYPE_2 {
2525 ULONG SocketRegistersBaseAddress;
2526 UCHAR CapabilitiesPtr;
2527 UCHAR Reserved;
2528 USHORT SecondaryStatus;
2529 UCHAR PrimaryBus;
2530 UCHAR SecondaryBus;
2531 UCHAR SubordinateBus;
2532 UCHAR SecondaryLatency;
2533 struct {
2534 ULONG Base;
2535 ULONG Limit;
2536 } Range[PCI_TYPE2_ADDRESSES - 1];
2537 UCHAR InterruptLine;
2538 UCHAR InterruptPin;
2539 USHORT BridgeControl;
2540 } type2;
2541 } u;
2542 UCHAR DeviceSpecific[192];
2543 } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
2544
2545 /* PCI_COMMON_CONFIG.Command */
2546
2547 #define PCI_ENABLE_IO_SPACE 0x0001
2548 #define PCI_ENABLE_MEMORY_SPACE 0x0002
2549 #define PCI_ENABLE_BUS_MASTER 0x0004
2550 #define PCI_ENABLE_SPECIAL_CYCLES 0x0008
2551 #define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010
2552 #define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
2553 #define PCI_ENABLE_PARITY 0x0040
2554 #define PCI_ENABLE_WAIT_CYCLE 0x0080
2555 #define PCI_ENABLE_SERR 0x0100
2556 #define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200
2557
2558 /* PCI_COMMON_CONFIG.Status */
2559
2560 #define PCI_STATUS_CAPABILITIES_LIST 0x0010
2561 #define PCI_STATUS_66MHZ_CAPABLE 0x0020
2562 #define PCI_STATUS_UDF_SUPPORTED 0x0040
2563 #define PCI_STATUS_FAST_BACK_TO_BACK 0x0080
2564 #define PCI_STATUS_DATA_PARITY_DETECTED 0x0100
2565 #define PCI_STATUS_DEVSEL 0x0600
2566 #define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800
2567 #define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000
2568 #define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000
2569 #define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000
2570 #define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000
2571
2572 /* PCI_COMMON_CONFIG.HeaderType */
2573
2574 #define PCI_MULTIFUNCTION 0x80
2575 #define PCI_DEVICE_TYPE 0x00
2576 #define PCI_BRIDGE_TYPE 0x01
2577 #define PCI_CARDBUS_BRIDGE_TYPE 0x02
2578
2579 #define PCI_CONFIGURATION_TYPE(PciData) \
2580 (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
2581
2582 #define PCI_MULTIFUNCTION_DEVICE(PciData) \
2583 ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
2584
2585 /* PCI device classes */
2586
2587 #define PCI_CLASS_PRE_20 0x00
2588 #define PCI_CLASS_MASS_STORAGE_CTLR 0x01
2589 #define PCI_CLASS_NETWORK_CTLR 0x02
2590 #define PCI_CLASS_DISPLAY_CTLR 0x03
2591 #define PCI_CLASS_MULTIMEDIA_DEV 0x04
2592 #define PCI_CLASS_MEMORY_CTLR 0x05
2593 #define PCI_CLASS_BRIDGE_DEV 0x06
2594 #define PCI_CLASS_SIMPLE_COMMS_CTLR 0x07
2595 #define PCI_CLASS_BASE_SYSTEM_DEV 0x08
2596 #define PCI_CLASS_INPUT_DEV 0x09
2597 #define PCI_CLASS_DOCKING_STATION 0x0a
2598 #define PCI_CLASS_PROCESSOR 0x0b
2599 #define PCI_CLASS_SERIAL_BUS_CTLR 0x0c
2600
2601 /* PCI device subclasses for class 0 */
2602
2603 #define PCI_SUBCLASS_PRE_20_NON_VGA 0x00
2604 #define PCI_SUBCLASS_PRE_20_VGA 0x01
2605
2606 /* PCI device subclasses for class 1 (mass storage controllers)*/
2607
2608 #define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR 0x00
2609 #define PCI_SUBCLASS_MSC_IDE_CTLR 0x01
2610 #define PCI_SUBCLASS_MSC_FLOPPY_CTLR 0x02
2611 #define PCI_SUBCLASS_MSC_IPI_CTLR 0x03
2612 #define PCI_SUBCLASS_MSC_RAID_CTLR 0x04
2613 #define PCI_SUBCLASS_MSC_OTHER 0x80
2614
2615 /* PCI device subclasses for class 2 (network controllers)*/
2616
2617 #define PCI_SUBCLASS_NET_ETHERNET_CTLR 0x00
2618 #define PCI_SUBCLASS_NET_TOKEN_RING_CTLR 0x01
2619 #define PCI_SUBCLASS_NET_FDDI_CTLR 0x02
2620 #define PCI_SUBCLASS_NET_ATM_CTLR 0x03
2621 #define PCI_SUBCLASS_NET_OTHER 0x80
2622
2623 /* PCI device subclasses for class 3 (display controllers)*/
2624
2625 #define PCI_SUBCLASS_VID_VGA_CTLR 0x00
2626 #define PCI_SUBCLASS_VID_XGA_CTLR 0x01
2627 #define PCI_SUBCLASS_VID_3D_CTLR 0x02
2628 #define PCI_SUBCLASS_VID_OTHER 0x80
2629
2630 /* PCI device subclasses for class 4 (multimedia device)*/
2631
2632 #define PCI_SUBCLASS_MM_VIDEO_DEV 0x00
2633 #define PCI_SUBCLASS_MM_AUDIO_DEV 0x01
2634 #define PCI_SUBCLASS_MM_TELEPHONY_DEV 0x02
2635 #define PCI_SUBCLASS_MM_OTHER 0x80
2636
2637 /* PCI device subclasses for class 5 (memory controller)*/
2638
2639 #define PCI_SUBCLASS_MEM_RAM 0x00
2640 #define PCI_SUBCLASS_MEM_FLASH 0x01
2641 #define PCI_SUBCLASS_MEM_OTHER 0x80
2642
2643 /* PCI device subclasses for class 6 (bridge device)*/
2644
2645 #define PCI_SUBCLASS_BR_HOST 0x00
2646 #define PCI_SUBCLASS_BR_ISA 0x01
2647 #define PCI_SUBCLASS_BR_EISA 0x02
2648 #define PCI_SUBCLASS_BR_MCA 0x03
2649 #define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04
2650 #define PCI_SUBCLASS_BR_PCMCIA 0x05
2651 #define PCI_SUBCLASS_BR_NUBUS 0x06
2652 #define PCI_SUBCLASS_BR_CARDBUS 0x07
2653 #define PCI_SUBCLASS_BR_OTHER 0x80
2654
2655 /* PCI device subclasses for class C (serial bus controller)*/
2656
2657 #define PCI_SUBCLASS_SB_IEEE1394 0x00
2658 #define PCI_SUBCLASS_SB_ACCESS 0x01
2659 #define PCI_SUBCLASS_SB_SSA 0x02
2660 #define PCI_SUBCLASS_SB_USB 0x03
2661 #define PCI_SUBCLASS_SB_FIBRE_CHANNEL 0x04
2662 #define PCI_SUBCLASS_SB_SMBUS 0x05
2663
2664 #define PCI_MAX_DEVICES 32
2665 #define PCI_MAX_FUNCTION 8
2666 #define PCI_MAX_BRIDGE_NUMBER 0xFF
2667 #define PCI_INVALID_VENDORID 0xFFFF
2668 #define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific))
2669
2670 #define PCI_ADDRESS_MEMORY_SPACE 0x00000000
2671 #define PCI_ADDRESS_IO_SPACE 0x00000001
2672 #define PCI_ADDRESS_MEMORY_TYPE_MASK 0x00000006
2673 #define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x00000008
2674 #define PCI_ADDRESS_IO_ADDRESS_MASK 0xfffffffc
2675 #define PCI_ADDRESS_MEMORY_ADDRESS_MASK 0xfffffff0
2676 #define PCI_ADDRESS_ROM_ADDRESS_MASK 0xfffff800
2677
2678 #define PCI_TYPE_32BIT 0
2679 #define PCI_TYPE_20BIT 2
2680 #define PCI_TYPE_64BIT 4
2681
2682 typedef struct _PCI_SLOT_NUMBER {
2683 union {
2684 struct {
2685 ULONG DeviceNumber : 5;
2686 ULONG FunctionNumber : 3;
2687 ULONG Reserved : 24;
2688 } bits;
2689 ULONG AsULONG;
2690 } u;
2691 } PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER;
2692
2693 #define POOL_COLD_ALLOCATION 256
2694 #define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE 8
2695 #define POOL_RAISE_IF_ALLOCATION_FAILURE 16
2696
2697 typedef struct _OSVERSIONINFOA {
2698 ULONG dwOSVersionInfoSize;
2699 ULONG dwMajorVersion;
2700 ULONG dwMinorVersion;
2701 ULONG dwBuildNumber;
2702 ULONG dwPlatformId;
2703 CHAR szCSDVersion[128];
2704 } OSVERSIONINFOA, *POSVERSIONINFOA, *LPOSVERSIONINFOA;
2705
2706 typedef struct _OSVERSIONINFOW {
2707 ULONG dwOSVersionInfoSize;
2708 ULONG dwMajorVersion;
2709 ULONG dwMinorVersion;
2710 ULONG dwBuildNumber;
2711 ULONG dwPlatformId;
2712 WCHAR szCSDVersion[128];
2713 } OSVERSIONINFOW, *POSVERSIONINFOW, *LPOSVERSIONINFOW, RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW;
2714
2715 #ifdef UNICODE
2716 typedef OSVERSIONINFOW OSVERSIONINFO;
2717 typedef POSVERSIONINFOW POSVERSIONINFO;
2718 typedef LPOSVERSIONINFOW LPOSVERSIONINFO;
2719 #else
2720 typedef OSVERSIONINFOA OSVERSIONINFO;
2721 typedef POSVERSIONINFOA POSVERSIONINFO;
2722 typedef LPOSVERSIONINFOA LPOSVERSIONINFO;
2723 #endif // UNICODE
2724
2725 typedef struct _OSVERSIONINFOEXA {
2726 ULONG dwOSVersionInfoSize;
2727 ULONG dwMajorVersion;
2728 ULONG dwMinorVersion;
2729 ULONG dwBuildNumber;
2730 ULONG dwPlatformId;
2731 CHAR szCSDVersion[128];
2732 USHORT wServicePackMajor;
2733 USHORT wServicePackMinor;
2734 USHORT wSuiteMask;
2735 UCHAR wProductType;
2736 UCHAR wReserved;
2737 } OSVERSIONINFOEXA, *POSVERSIONINFOEXA, *LPOSVERSIONINFOEXA;
2738
2739 typedef struct _OSVERSIONINFOEXW {
2740 ULONG dwOSVersionInfoSize;
2741 ULONG dwMajorVersion;
2742 ULONG dwMinorVersion;
2743 ULONG dwBuildNumber;
2744 ULONG dwPlatformId;
2745 WCHAR szCSDVersion[128];
2746 USHORT wServicePackMajor;
2747 USHORT wServicePackMinor;
2748 USHORT wSuiteMask;
2749 UCHAR wProductType;
2750 UCHAR wReserved;
2751 } OSVERSIONINFOEXW, *POSVERSIONINFOEXW, *LPOSVERSIONINFOEXW, RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW;
2752
2753 #ifdef UNICODE
2754 typedef OSVERSIONINFOEXW OSVERSIONINFOEX;
2755 typedef POSVERSIONINFOEXW POSVERSIONINFOEX;
2756 typedef LPOSVERSIONINFOEXW LPOSVERSIONINFOEX;
2757 #else
2758 typedef OSVERSIONINFOEXA OSVERSIONINFOEX;
2759 typedef POSVERSIONINFOEXA POSVERSIONINFOEX;
2760 typedef LPOSVERSIONINFOEXA LPOSVERSIONINFOEX;
2761 #endif // UNICODE
2762
2763 NTSYSAPI
2764 ULONGLONG
2765 DDKAPI
2766 VerSetConditionMask(
2767 IN ULONGLONG ConditionMask,
2768 IN ULONG TypeMask,
2769 IN UCHAR Condition);
2770
2771 #define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType) \
2772 ((ConditionMask) = VerSetConditionMask((ConditionMask), \
2773 (TypeBitMask), (ComparisonType)))
2774
2775 /* RtlVerifyVersionInfo() TypeMask */
2776
2777 #define VER_MINORVERSION 0x0000001
2778 #define VER_MAJORVERSION 0x0000002
2779 #define VER_BUILDNUMBER 0x0000004
2780 #define VER_PLATFORMID 0x0000008
2781 #define VER_SERVICEPACKMINOR 0x0000010
2782 #define VER_SERVICEPACKMAJOR 0x0000020
2783 #define VER_SUITENAME 0x0000040
2784 #define VER_PRODUCT_TYPE 0x0000080
2785
2786 /* RtlVerifyVersionInfo() ComparisonType */
2787
2788 #define VER_EQUAL 1
2789 #define VER_GREATER 2
2790 #define VER_GREATER_EQUAL 3
2791 #define VER_LESS 4
2792 #define VER_LESS_EQUAL 5
2793 #define VER_AND 6
2794 #define VER_OR 7
2795
2796 #define VER_CONDITION_MASK 7
2797 #define VER_NUM_BITS_PER_CONDITION_MASK 3
2798
2799 struct _RTL_RANGE;
2800
2801 typedef BOOLEAN
2802 (NTAPI *PRTL_CONFLICT_RANGE_CALLBACK) (
2803 PVOID Context,
2804 struct _RTL_RANGE *Range
2805 );
2806
2807 typedef enum _EVENT_TYPE {
2808 NotificationEvent,
2809 SynchronizationEvent
2810 } EVENT_TYPE;
2811
2812 typedef enum _KWAIT_REASON {
2813 Executive,
2814 FreePage,
2815 PageIn,
2816 PoolAllocation,
2817 DelayExecution,
2818 Suspended,
2819 UserRequest,
2820 WrExecutive,
2821 WrFreePage,
2822 WrPageIn,
2823 WrPoolAllocation,
2824 WrDelayExecution,
2825 WrSuspended,
2826 WrUserRequest,
2827 WrEventPair,
2828 WrQueue,
2829 WrLpcReceive,
2830 WrLpcReply,
2831 WrVirtualMemory,
2832 WrPageOut,
2833 WrRendezvous,
2834 Spare2,
2835 WrGuardedMutex,
2836 Spare4,
2837 Spare5,
2838 Spare6,
2839 WrKernel,
2840 WrResource,
2841 WrPushLock,
2842 WrMutex,
2843 WrQuantumEnd,
2844 WrDispatchInt,
2845 WrPreempted,
2846 WrYieldExecution,
2847 MaximumWaitReason
2848 } KWAIT_REASON;
2849
2850 typedef struct _KWAIT_BLOCK {
2851 LIST_ENTRY WaitListEntry;
2852 struct _KTHREAD * RESTRICTED_POINTER Thread;
2853 PVOID Object;
2854 struct _KWAIT_BLOCK * RESTRICTED_POINTER NextWaitBlock;
2855 USHORT WaitKey;
2856 UCHAR WaitType;
2857 UCHAR SpareByte;
2858 } KWAIT_BLOCK, *PKWAIT_BLOCK, *RESTRICTED_POINTER PRKWAIT_BLOCK;
2859
2860 typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK;
2861
2862 typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK {
2863 BOOLEAN Removed;
2864 BOOLEAN Reserved[3];
2865 volatile LONG IoCount;
2866 KEVENT RemoveEvent;
2867 } IO_REMOVE_LOCK_COMMON_BLOCK;
2868
2869 typedef struct _IO_REMOVE_LOCK_DBG_BLOCK {
2870 LONG Signature;
2871 LONG HighWatermark;
2872 LONGLONG MaxLockedTicks;
2873 LONG AllocateTag;
2874 LIST_ENTRY LockList;
2875 KSPIN_LOCK Spin;
2876 volatile LONG LowMemoryCount;
2877 ULONG Reserved1[4];
2878 PVOID Reserved2;
2879 PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks;
2880 } IO_REMOVE_LOCK_DBG_BLOCK;
2881
2882 typedef struct _IO_REMOVE_LOCK {
2883 IO_REMOVE_LOCK_COMMON_BLOCK Common;
2884 #if DBG
2885 IO_REMOVE_LOCK_DBG_BLOCK Dbg;
2886 #endif
2887 } IO_REMOVE_LOCK, *PIO_REMOVE_LOCK;
2888
2889 typedef struct _IO_WORKITEM *PIO_WORKITEM;
2890
2891 typedef VOID
2892 (DDKAPI IO_WORKITEM_ROUTINE)(
2893 IN PDEVICE_OBJECT DeviceObject,
2894 IN PVOID Context);
2895 typedef IO_WORKITEM_ROUTINE *PIO_WORKITEM_ROUTINE;
2896
2897 typedef struct _SHARE_ACCESS {
2898 ULONG OpenCount;
2899 ULONG Readers;
2900 ULONG Writers;
2901 ULONG Deleters;
2902 ULONG SharedRead;
2903 ULONG SharedWrite;
2904 ULONG SharedDelete;
2905 } SHARE_ACCESS, *PSHARE_ACCESS;
2906
2907 typedef enum _KINTERRUPT_MODE {
2908 LevelSensitive,
2909 Latched
2910 } KINTERRUPT_MODE;
2911
2912 #define THREAD_WAIT_OBJECTS 3
2913
2914 typedef VOID
2915 (DDKAPI *PKINTERRUPT_ROUTINE)(
2916 VOID);
2917
2918 typedef enum _CREATE_FILE_TYPE {
2919 CreateFileTypeNone,
2920 CreateFileTypeNamedPipe,
2921 CreateFileTypeMailslot
2922 } CREATE_FILE_TYPE;
2923
2924 typedef struct _CONFIGURATION_INFORMATION {
2925 ULONG DiskCount;
2926 ULONG FloppyCount;
2927 ULONG CdRomCount;
2928 ULONG TapeCount;
2929 ULONG ScsiPortCount;
2930 ULONG SerialCount;
2931 ULONG ParallelCount;
2932 BOOLEAN AtDiskPrimaryAddressClaimed;
2933 BOOLEAN AtDiskSecondaryAddressClaimed;
2934 ULONG Version;
2935 ULONG MediumChangerCount;
2936 } CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION;
2937
2938 typedef enum _CONFIGURATION_TYPE {
2939 ArcSystem,
2940 CentralProcessor,
2941 FloatingPointProcessor,
2942 PrimaryIcache,
2943 PrimaryDcache,
2944 SecondaryIcache,
2945 SecondaryDcache,
2946 SecondaryCache,
2947 EisaAdapter,
2948 TcAdapter,
2949 ScsiAdapter,
2950 DtiAdapter,
2951 MultiFunctionAdapter,
2952 DiskController,
2953 TapeController,
2954 CdromController,
2955 WormController,
2956 SerialController,
2957 NetworkController,
2958 DisplayController,
2959 ParallelController,
2960 PointerController,
2961 KeyboardController,
2962 AudioController,
2963 OtherController,
2964 DiskPeripheral,
2965 FloppyDiskPeripheral,
2966 TapePeripheral,
2967 ModemPeripheral,
2968 MonitorPeripheral,
2969 PrinterPeripheral,
2970 PointerPeripheral,
2971 KeyboardPeripheral,
2972 TerminalPeripheral,
2973 OtherPeripheral,
2974 LinePeripheral,
2975 NetworkPeripheral,
2976 SystemMemory,
2977 DockingInformation,
2978 RealModeIrqRoutingTable,
2979 RealModePCIEnumeration,
2980 MaximumType
2981 } CONFIGURATION_TYPE, *PCONFIGURATION_TYPE;
2982
2983 #define IO_FORCE_ACCESS_CHECK 0x001
2984 #define IO_NO_PARAMETER_CHECKING 0x100
2985
2986 #define IO_REPARSE 0x0
2987 #define IO_REMOUNT 0x1
2988
2989 typedef NTSTATUS
2990 (DDKAPI *PIO_QUERY_DEVICE_ROUTINE)(
2991 IN PVOID Context,
2992 IN PUNICODE_STRING PathName,
2993 IN INTERFACE_TYPE BusType,
2994 IN ULONG BusNumber,
2995 IN PKEY_VALUE_FULL_INFORMATION *BusInformation,
2996 IN CONFIGURATION_TYPE ControllerType,
2997 IN ULONG ControllerNumber,
2998 IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation,
2999 IN CONFIGURATION_TYPE PeripheralType,
3000 IN ULONG PeripheralNumber,
3001 IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation);
3002
3003 typedef enum _IO_QUERY_DEVICE_DATA_FORMAT {
3004 IoQueryDeviceIdentifier = 0,
3005 IoQueryDeviceConfigurationData,
3006 IoQueryDeviceComponentInformation,
3007 IoQueryDeviceMaxData
3008 } IO_QUERY_DEVICE_DATA_FORMAT, *PIO_QUERY_DEVICE_DATA_FORMAT;
3009
3010 typedef enum _KBUGCHECK_CALLBACK_REASON {
3011 KbCallbackInvalid,
3012 KbCallbackReserved1,
3013 KbCallbackSecondaryDumpData,
3014 KbCallbackDumpIo,
3015 } KBUGCHECK_CALLBACK_REASON;
3016
3017 struct _KBUGCHECK_REASON_CALLBACK_RECORD;
3018
3019 typedef VOID
3020 (DDKAPI *PKBUGCHECK_REASON_CALLBACK_ROUTINE)(
3021 IN KBUGCHECK_CALLBACK_REASON Reason,
3022 IN struct _KBUGCHECK_REASON_CALLBACK_RECORD *Record,
3023 IN OUT PVOID ReasonSpecificData,
3024 IN ULONG ReasonSpecificDataLength);
3025
3026 typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD {
3027 LIST_ENTRY Entry;
3028 PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine;
3029 PUCHAR Component;
3030 ULONG_PTR Checksum;
3031 KBUGCHECK_CALLBACK_REASON Reason;
3032 UCHAR State;
3033 } KBUGCHECK_REASON_CALLBACK_RECORD, *PKBUGCHECK_REASON_CALLBACK_RECORD;
3034
3035 typedef enum _KBUGCHECK_BUFFER_DUMP_STATE {
3036 BufferEmpty,
3037 BufferInserted,
3038 BufferStarted,
3039 BufferFinished,
3040 BufferIncomplete
3041 } KBUGCHECK_BUFFER_DUMP_STATE;
3042
3043 typedef VOID
3044 (DDKAPI *PKBUGCHECK_CALLBACK_ROUTINE)(
3045 IN PVOID Buffer,
3046 IN ULONG Length);
3047
3048 typedef struct _KBUGCHECK_CALLBACK_RECORD {
3049 LIST_ENTRY Entry;
3050 PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine;
3051 PVOID Buffer;
3052 ULONG Length;
3053 PUCHAR Component;
3054 ULONG_PTR Checksum;
3055 UCHAR State;
3056 } KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD;
3057
3058 typedef BOOLEAN
3059 (DDKAPI *PNMI_CALLBACK)(
3060 IN PVOID Context,
3061 IN BOOLEAN Handled);
3062
3063 /*
3064 * VOID
3065 * KeInitializeCallbackRecord(
3066 * IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord)
3067 */
3068 #define KeInitializeCallbackRecord(CallbackRecord) \
3069 CallbackRecord->State = BufferEmpty;
3070
3071 typedef enum _KDPC_IMPORTANCE {
3072 LowImportance,
3073 MediumImportance,
3074 HighImportance
3075 } KDPC_IMPORTANCE;
3076
3077 typedef enum _MEMORY_CACHING_TYPE_ORIG {
3078 MmFrameBufferCached = 2
3079 } MEMORY_CACHING_TYPE_ORIG;
3080
3081 typedef enum _MEMORY_CACHING_TYPE {
3082 MmNonCached = FALSE,
3083 MmCached = TRUE,
3084 MmWriteCombined = MmFrameBufferCached,
3085 MmHardwareCoherentCached,
3086 MmNonCachedUnordered,
3087 MmUSWCCached,
3088 MmMaximumCacheType
3089 } MEMORY_CACHING_TYPE;
3090
3091 typedef enum _MM_PAGE_PRIORITY {
3092 LowPagePriority,
3093 NormalPagePriority = 16,
3094 HighPagePriority = 32
3095 } MM_PAGE_PRIORITY;
3096
3097 typedef enum _LOCK_OPERATION {
3098 IoReadAccess,
3099 IoWriteAccess,
3100 IoModifyAccess
3101 } LOCK_OPERATION;
3102
3103 #define FLUSH_MULTIPLE_MAXIMUM 32
3104
3105 typedef enum _MM_SYSTEM_SIZE {
3106 MmSmallSystem,
3107 MmMediumSystem,
3108 MmLargeSystem
3109 } MM_SYSTEMSIZE;
3110
3111 typedef struct _OBJECT_HANDLE_INFORMATION {
3112 ULONG HandleAttributes;
3113 ACCESS_MASK GrantedAccess;
3114 } OBJECT_HANDLE_INFORMATION, *POBJECT_HANDLE_INFORMATION;
3115
3116 typedef struct _CLIENT_ID {
3117 HANDLE UniqueProcess;
3118 HANDLE UniqueThread;
3119 } CLIENT_ID, *PCLIENT_ID;
3120
3121 typedef VOID
3122 (DDKAPI *PKSTART_ROUTINE)(
3123 IN PVOID StartContext);
3124
3125 typedef VOID
3126 (DDKAPI *PCREATE_PROCESS_NOTIFY_ROUTINE)(
3127 IN HANDLE ParentId,
3128 IN HANDLE ProcessId,
3129 IN BOOLEAN Create);
3130
3131 typedef VOID
3132 (DDKAPI *PCREATE_THREAD_NOTIFY_ROUTINE)(
3133 IN HANDLE ProcessId,
3134 IN HANDLE ThreadId,
3135 IN BOOLEAN Create);
3136
3137 typedef struct _IMAGE_INFO {
3138 _ANONYMOUS_UNION union {
3139 ULONG Properties;
3140 _ANONYMOUS_STRUCT struct {
3141 ULONG ImageAddressingMode : 8;
3142 ULONG SystemModeImage : 1;
3143 ULONG ImageMappedToAllPids : 1;
3144 ULONG Reserved : 22;
3145 } DUMMYSTRUCTNAME;
3146 } DUMMYUNIONNAME;
3147 PVOID ImageBase;
3148 ULONG ImageSelector;
3149 SIZE_T ImageSize;
3150 ULONG ImageSectionNumber;
3151 } IMAGE_INFO, *PIMAGE_INFO;
3152
3153 #define IMAGE_ADDRESSING_MODE_32BIT 3
3154
3155 typedef VOID
3156 (DDKAPI *PLOAD_IMAGE_NOTIFY_ROUTINE)(
3157 IN PUNICODE_STRING FullImageName,
3158 IN HANDLE ProcessId,
3159 IN PIMAGE_INFO ImageInfo);
3160
3161 #pragma pack(push,4)
3162 typedef enum _BUS_DATA_TYPE {
3163 ConfigurationSpaceUndefined = -1,
3164 Cmos,
3165 EisaConfiguration,
3166 Pos,
3167 CbusConfiguration,
3168 PCIConfiguration,
3169 VMEConfiguration,
3170 NuBusConfiguration,
3171 PCMCIAConfiguration,
3172 MPIConfiguration,
3173 MPSAConfiguration,
3174 PNPISAConfiguration,
3175 SgiInternalConfiguration,
3176 MaximumBusDataType
3177 } BUS_DATA_TYPE, *PBUS_DATA_TYPE;
3178 #pragma pack(pop)
3179
3180 typedef struct _NT_TIB {
3181 struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
3182 PVOID StackBase;
3183 PVOID StackLimit;
3184 PVOID SubSystemTib;
3185 _ANONYMOUS_UNION union {
3186 PVOID FiberData;
3187 ULONG Version;
3188 } DUMMYUNIONNAME;
3189 PVOID ArbitraryUserPointer;
3190 struct _NT_TIB *Self;
3191 } NT_TIB, *PNT_TIB;
3192
3193 typedef struct _NT_TIB32 {
3194 ULONG ExceptionList;
3195 ULONG StackBase;
3196 ULONG StackLimit;
3197 ULONG SubSystemTib;
3198 __GNU_EXTENSION union {
3199 ULONG FiberData;
3200 ULONG Version;
3201 };
3202 ULONG ArbitraryUserPointer;
3203 ULONG Self;
3204 } NT_TIB32,*PNT_TIB32;
3205
3206 typedef struct _NT_TIB64 {
3207 ULONG64 ExceptionList;
3208 ULONG64 StackBase;
3209 ULONG64 StackLimit;
3210 ULONG64 SubSystemTib;
3211 __GNU_EXTENSION union {
3212 ULONG64 FiberData;
3213 ULONG Version;
3214 };
3215 ULONG64 ArbitraryUserPointer;
3216 ULONG64 Self;
3217 } NT_TIB64,*PNT_TIB64;
3218
3219 typedef enum _PROCESSINFOCLASS {
3220 ProcessBasicInformation,
3221 ProcessQuotaLimits,
3222 ProcessIoCounters,
3223 ProcessVmCounters,
3224 ProcessTimes,
3225 ProcessBasePriority,
3226 ProcessRaisePriority,
3227 ProcessDebugPort,
3228 ProcessExceptionPort,
3229 ProcessAccessToken,
3230 ProcessLdtInformation,
3231 ProcessLdtSize,
3232 ProcessDefaultHardErrorMode,
3233 ProcessIoPortHandlers,
3234 ProcessPooledUsageAndLimits,
3235 ProcessWorkingSetWatch,
3236 ProcessUserModeIOPL,
3237 ProcessEnableAlignmentFaultFixup,
3238 ProcessPriorityClass,
3239 ProcessWx86Information,
3240 ProcessHandleCount,
3241 ProcessAffinityMask,
3242 ProcessPriorityBoost,
3243 ProcessDeviceMap,
3244 ProcessSessionInformation,
3245 ProcessForegroundInformation,
3246 ProcessWow64Information,
3247 ProcessImageFileName,
3248 ProcessLUIDDeviceMapsEnabled,
3249 ProcessBreakOnTermination,
3250 ProcessDebugObjectHandle,
3251 ProcessDebugFlags,
3252 ProcessHandleTracing,
3253 ProcessIoPriority,
3254 ProcessExecuteFlags,
3255 ProcessTlsInformation,
3256 ProcessCookie,
3257 ProcessImageInformation,
3258 ProcessCycleTime,
3259 ProcessPagePriority,
3260 ProcessInstrumentationCallback,
3261 MaxProcessInfoClass
3262 } PROCESSINFOCLASS;
3263
3264 typedef enum _THREADINFOCLASS {
3265 ThreadBasicInformation,
3266 ThreadTimes,
3267 ThreadPriority,
3268 ThreadBasePriority,
3269 ThreadAffinityMask,
3270 ThreadImpersonationToken,
3271 ThreadDescriptorTableEntry,
3272 ThreadEnableAlignmentFaultFixup,
3273 ThreadEventPair_Reusable,
3274 ThreadQuerySetWin32StartAddress,
3275 ThreadZeroTlsCell,
3276 ThreadPerformanceCount,
3277 ThreadAmILastThread,
3278 ThreadIdealProcessor,
3279 ThreadPriorityBoost,
3280 ThreadSetTlsArrayAddress,
3281 ThreadIsIoPending,
3282 ThreadHideFromDebugger,
3283 ThreadBreakOnTermination,
3284 ThreadSwitchLegacyState,
3285 ThreadIsTerminated,
3286 ThreadLastSystemCall,
3287 ThreadIoPriority,
3288 ThreadCycleTime,
3289 ThreadPagePriority,
3290 ThreadActualBasePriority,
3291 MaxThreadInfoClass
3292 } THREADINFOCLASS;
3293
3294 typedef struct _PROCESS_BASIC_INFORMATION
3295 {
3296 NTSTATUS ExitStatus;
3297 struct _PEB *PebBaseAddress;
3298 ULONG_PTR AffinityMask;
3299 KPRIORITY BasePriority;
3300 ULONG_PTR UniqueProcessId;
3301 ULONG_PTR InheritedFromUniqueProcessId;
3302 } PROCESS_BASIC_INFORMATION,*PPROCESS_BASIC_INFORMATION;
3303
3304 typedef struct _PROCESS_WS_WATCH_INFORMATION
3305 {
3306 PVOID FaultingPc;
3307 PVOID FaultingVa;
3308 } PROCESS_WS_WATCH_INFORMATION, *PPROCESS_WS_WATCH_INFORMATION;
3309
3310 typedef struct _PROCESS_DEVICEMAP_INFORMATION
3311 {
3312 __GNU_EXTENSION union
3313 {
3314 struct
3315 {
3316 HANDLE DirectoryHandle;
3317 } Set;
3318 struct
3319 {
3320 ULONG DriveMap;
3321 UCHAR DriveType[32];
3322 } Query;
3323 };
3324 } PROCESS_DEVICEMAP_INFORMATION, *PPROCESS_DEVICEMAP_INFORMATION;
3325
3326 typedef struct _KERNEL_USER_TIMES
3327 {
3328 LARGE_INTEGER CreateTime;
3329 LARGE_INTEGER ExitTime;
3330 LARGE_INTEGER KernelTime;
3331 LARGE_INTEGER UserTime;
3332 } KERNEL_USER_TIMES, *PKERNEL_USER_TIMES;
3333
3334 typedef struct _PROCESS_ACCESS_TOKEN
3335 {
3336 HANDLE Token;
3337 HANDLE Thread;
3338 } PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN;
3339
3340 typedef struct _PROCESS_SESSION_INFORMATION
3341 {
3342 ULONG SessionId;
3343 } PROCESS_SESSION_INFORMATION, *PPROCESS_SESSION_INFORMATION;
3344
3345 typedef VOID
3346 (DDKAPI *PREQUEST_POWER_COMPLETE)(
3347 IN PDEVICE_OBJECT DeviceObject,
3348 IN UCHAR MinorFunction,
3349 IN POWER_STATE PowerState,
3350 IN PVOID Context,
3351 IN PIO_STATUS_BLOCK IoStatus);
3352
3353 typedef enum _TRACE_INFORMATION_CLASS {
3354 TraceIdClass,
3355 TraceHandleClass,
3356 TraceEnableFlagsClass,
3357 TraceEnableLevelClass,
3358 GlobalLoggerHandleClass,
3359 EventLoggerHandleClass,
3360 AllLoggerHandlesClass,
3361 TraceHandleByNameClass
3362 } TRACE_INFORMATION_CLASS;
3363
3364 typedef enum _REG_NOTIFY_CLASS
3365 {
3366 RegNtDeleteKey,
3367 RegNtPreDeleteKey = RegNtDeleteKey,
3368 RegNtSetValueKey,
3369 RegNtPreSetValueKey = RegNtSetValueKey,
3370 RegNtDeleteValueKey,
3371 RegNtPreDeleteValueKey = RegNtDeleteValueKey,
3372 RegNtSetInformationKey,
3373 RegNtPreSetInformationKey = RegNtSetInformationKey,
3374 RegNtRenameKey,
3375 RegNtPreRenameKey = RegNtRenameKey,
3376 RegNtEnumerateKey,
3377 RegNtPreEnumerateKey = RegNtEnumerateKey,
3378 RegNtEnumerateValueKey,
3379 RegNtPreEnumerateValueKey = RegNtEnumerateValueKey,
3380 RegNtQueryKey,
3381 RegNtPreQueryKey = RegNtQueryKey,
3382 RegNtQueryValueKey,
3383 RegNtPreQueryValueKey = RegNtQueryValueKey,
3384 RegNtQueryMultipleValueKey,
3385 RegNtPreQueryMultipleValueKey = RegNtQueryMultipleValueKey,
3386 RegNtPreCreateKey,
3387 RegNtPostCreateKey,
3388 RegNtPreOpenKey,
3389 RegNtPostOpenKey,
3390 RegNtKeyHandleClose,
3391 RegNtPreKeyHandleClose = RegNtKeyHandleClose,
3392 RegNtPostDeleteKey,
3393 RegNtPostSetValueKey,
3394 RegNtPostDeleteValueKey,
3395 RegNtPostSetInformationKey,
3396 RegNtPostRenameKey,
3397 RegNtPostEnumerateKey,
3398 RegNtPostEnumerateValueKey,
3399 RegNtPostQueryKey,
3400 RegNtPostQueryValueKey,
3401 RegNtPostQueryMultipleValueKey,
3402 RegNtPostKeyHandleClose,
3403 RegNtPreCreateKeyEx,
3404 RegNtPostCreateKeyEx,
3405 RegNtPreOpenKeyEx,
3406 RegNtPostOpenKeyEx
3407 } REG_NOTIFY_CLASS, *PREG_NOTIFY_CLASS;
3408
3409 typedef NTSTATUS
3410 (NTAPI *PEX_CALLBACK_FUNCTION)(
3411 IN PVOID CallbackContext,
3412 IN PVOID Argument1,
3413 IN PVOID Argument2
3414 );
3415
3416 typedef struct _REG_DELETE_KEY_INFORMATION
3417 {
3418 PVOID Object;
3419 } REG_DELETE_KEY_INFORMATION, *PREG_DELETE_KEY_INFORMATION;
3420
3421 typedef struct _REG_SET_VALUE_KEY_INFORMATION
3422 {
3423 PVOID Object;
3424 PUNICODE_STRING ValueName;
3425 ULONG TitleIndex;
3426 ULONG Type;
3427 PVOID Data;
3428 ULONG DataSize;
3429 } REG_SET_VALUE_KEY_INFORMATION, *PREG_SET_VALUE_KEY_INFORMATION;
3430
3431 typedef struct _REG_DELETE_VALUE_KEY_INFORMATION
3432 {
3433 PVOID Object;
3434 PUNICODE_STRING ValueName;
3435 } REG_DELETE_VALUE_KEY_INFORMATION, *PREG_DELETE_VALUE_KEY_INFORMATION;
3436
3437 typedef struct _REG_SET_INFORMATION_KEY_INFORMATION
3438 {
3439 PVOID Object;
3440 KEY_SET_INFORMATION_CLASS KeySetInformationClass;
3441 PVOID KeySetInformation;
3442 ULONG KeySetInformationLength;
3443 } REG_SET_INFORMATION_KEY_INFORMATION, *PREG_SET_INFORMATION_KEY_INFORMATION;
3444
3445 typedef struct _REG_ENUMERATE_KEY_INFORMATION
3446 {
3447 PVOID Object;
3448 ULONG Index;
3449 KEY_INFORMATION_CLASS KeyInformationClass;
3450 PVOID KeyInformation;
3451 ULONG Length;
3452 PULONG ResultLength;
3453 } REG_ENUMERATE_KEY_INFORMATION, *PREG_ENUMERATE_KEY_INFORMATION;
3454
3455 typedef struct _REG_ENUMERATE_VALUE_KEY_INFORMATION
3456 {
3457 PVOID Object;
3458 ULONG Index;
3459 KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass;
3460 PVOID KeyValueInformation;
3461 ULONG Length;
3462 PULONG ResultLength;
3463 } REG_ENUMERATE_VALUE_KEY_INFORMATION, *PREG_ENUMERATE_VALUE_KEY_INFORMATION;
3464
3465 typedef struct _REG_QUERY_KEY_INFORMATION
3466 {
3467 PVOID Object;
3468 KEY_INFORMATION_CLASS KeyInformationClass;
3469 PVOID KeyInformation;
3470 ULONG Length;
3471 PULONG ResultLength;
3472 } REG_QUERY_KEY_INFORMATION, *PREG_QUERY_KEY_INFORMATION;
3473
3474 typedef struct _REG_QUERY_VALUE_KEY_INFORMATION
3475 {
3476 PVOID Object;
3477 PUNICODE_STRING ValueName;
3478 KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass;
3479 PVOID KeyValueInformation;
3480 ULONG Length;
3481 PULONG ResultLength;
3482 } REG_QUERY_VALUE_KEY_INFORMATION, *PREG_QUERY_VALUE_KEY_INFORMATION;
3483
3484 typedef struct _REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION
3485 {
3486 PVOID Object;
3487 PKEY_VALUE_ENTRY ValueEntries;
3488 ULONG EntryCount;
3489 PVOID ValueBuffer;
3490 PULONG BufferLength;
3491 PULONG RequiredBufferLength;
3492 } REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION, *PREG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION;
3493
3494 typedef struct _REG_PRE_CREATE_KEY_INFORMATION
3495 {
3496 PUNICODE_STRING CompleteName;
3497 } REG_PRE_CREATE_KEY_INFORMATION, *PREG_PRE_CREATE_KEY_INFORMATION;
3498
3499 typedef struct _REG_POST_CREATE_KEY_INFORMATION
3500 {
3501 PUNICODE_STRING CompleteName;
3502 PVOID Object;
3503 NTSTATUS Status;
3504 } REG_POST_CREATE_KEY_INFORMATION, *PREG_POST_CREATE_KEY_INFORMATION;
3505
3506 typedef struct _REG_PRE_OPEN_KEY_INFORMATION
3507 {
3508 PUNICODE_STRING CompleteName;
3509 } REG_PRE_OPEN_KEY_INFORMATION, *PREG_PRE_OPEN_KEY_INFORMATION;
3510
3511 typedef struct _REG_POST_OPEN_KEY_INFORMATION
3512 {
3513 PUNICODE_STRING CompleteName;
3514 PVOID Object;
3515 NTSTATUS Status;
3516 } REG_POST_OPEN_KEY_INFORMATION, *PREG_POST_OPEN_KEY_INFORMATION;
3517
3518 typedef struct _REG_POST_OPERATION_INFORMATION
3519 {
3520 PVOID Object;
3521 NTSTATUS Status;
3522 } REG_POST_OPERATION_INFORMATION,*PREG_POST_OPERATION_INFORMATION;
3523
3524 typedef struct _REG_KEY_HANDLE_CLOSE_INFORMATION
3525 {
3526 PVOID Object;
3527 } REG_KEY_HANDLE_CLOSE_INFORMATION, *PREG_KEY_HANDLE_CLOSE_INFORMATION;
3528
3529 /*
3530 ** Storage structures
3531 */
3532 typedef enum _PARTITION_STYLE {
3533 PARTITION_STYLE_MBR,
3534 PARTITION_STYLE_GPT,
3535 PARTITION_STYLE_RAW
3536 } PARTITION_STYLE;
3537
3538 typedef struct _CREATE_DISK_MBR {
3539 ULONG Signature;
3540 } CREATE_DISK_MBR, *PCREATE_DISK_MBR;
3541
3542 typedef struct _CREATE_DISK_GPT {
3543 GUID DiskId;
3544 ULONG MaxPartitionCount;
3545 } CREATE_DISK_GPT, *PCREATE_DISK_GPT;
3546
3547 typedef struct _CREATE_DISK {
3548 PARTITION_STYLE PartitionStyle;
3549 _ANONYMOUS_UNION union {
3550 CREATE_DISK_MBR Mbr;
3551 CREATE_DISK_GPT Gpt;
3552 } DUMMYUNIONNAME;
3553 } CREATE_DISK, *PCREATE_DISK;
3554
3555 typedef struct _DISK_SIGNATURE {
3556 ULONG PartitionStyle;
3557 _ANONYMOUS_UNION union {
3558 struct {
3559 ULONG Signature;
3560 ULONG CheckSum;
3561 } Mbr;
3562 struct {
3563 GUID DiskId;
3564 } Gpt;
3565 } DUMMYUNIONNAME;
3566 } DISK_SIGNATURE, *PDISK_SIGNATURE;
3567
3568 typedef VOID
3569 (FASTCALL*PTIME_UPDATE_NOTIFY_ROUTINE)(
3570 IN HANDLE ThreadId,
3571 IN KPROCESSOR_MODE Mode);
3572
3573 #define DBG_STATUS_CONTROL_C 1
3574 #define DBG_STATUS_SYSRQ 2
3575 #define DBG_STATUS_BUGCHECK_FIRST 3
3576 #define DBG_STATUS_BUGCHECK_SECOND 4
3577 #define DBG_STATUS_FATAL 5
3578 #define DBG_STATUS_DEBUG_CONTROL 6
3579 #define DBG_STATUS_WORKER 7
3580
3581 typedef struct _PHYSICAL_MEMORY_RANGE {
3582 PHYSICAL_ADDRESS BaseAddress;
3583 LARGE_INTEGER NumberOfBytes;
3584 } PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE;
3585
3586 typedef ULONG_PTR
3587 (NTAPI *PDRIVER_VERIFIER_THUNK_ROUTINE)(
3588 IN PVOID Context);
3589
3590 typedef struct _DRIVER_VERIFIER_THUNK_PAIRS {
3591 PDRIVER_VERIFIER_THUNK_ROUTINE PristineRoutine;
3592 PDRIVER_VERIFIER_THUNK_ROUTINE NewRoutine;
3593 } DRIVER_VERIFIER_THUNK_PAIRS, *PDRIVER_VERIFIER_THUNK_PAIRS;
3594
3595 #define DRIVER_VERIFIER_SPECIAL_POOLING 0x0001
3596 #define DRIVER_VERIFIER_FORCE_IRQL_CHECKING 0x0002
3597 #define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES 0x0004
3598 #define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS 0x0008
3599 #define DRIVER_VERIFIER_IO_CHECKING 0x0010
3600
3601 #define HASH_STRING_ALGORITHM_DEFAULT 0
3602 #define HASH_STRING_ALGORITHM_X65599 1
3603 #define HASH_STRING_ALGORITHM_INVALID 0xffffffff
3604
3605 typedef VOID
3606 (DDKAPI *PTIMER_APC_ROUTINE)(
3607 IN PVOID TimerContext,
3608 IN ULONG TimerLowValue,
3609 IN LONG TimerHighValue);
3610
3611
3612
3613 /*
3614 ** WMI structures
3615 */
3616
3617 typedef VOID
3618 (DDKAPI *WMI_NOTIFICATION_CALLBACK)(
3619 PVOID Wnode,
3620 PVOID Context);
3621
3622
3623 /*
3624 ** Architecture specific structures
3625 */
3626 #define PCR_MINOR_VERSION 1
3627 #define PCR_MAJOR_VERSION 1
3628
3629 #ifdef _X86_
3630
3631 #define SIZE_OF_80387_REGISTERS 80
3632 #define CONTEXT_i386 0x10000
3633 #define CONTEXT_i486 0x10000
3634 #define CONTEXT_CONTROL (CONTEXT_i386|0x00000001L)
3635 #define CONTEXT_INTEGER (CONTEXT_i386|0x00000002L)
3636 #define CONTEXT_SEGMENTS (CONTEXT_i386|0x00000004L)
3637 #define CONTEXT_FLOATING_POINT (CONTEXT_i386|0x00000008L)
3638 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386|0x00000010L)
3639 #define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L)
3640 #define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS)
3641 #define MAXIMUM_SUPPORTED_EXTENSION 512
3642
3643 typedef struct _FLOATING_SAVE_AREA {
3644 ULONG ControlWord;
3645 ULONG StatusWord;
3646 ULONG TagWord;
3647 ULONG ErrorOffset;
3648 ULONG ErrorSelector;
3649 ULONG DataOffset;
3650 ULONG DataSelector;
3651 UCHAR RegisterArea[SIZE_OF_80387_REGISTERS];
3652 ULONG Cr0NpxState;
3653 } FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA;
3654
3655 typedef struct _CONTEXT {
3656 ULONG ContextFlags;
3657 ULONG Dr0;
3658 ULONG Dr1;
3659 ULONG Dr2;
3660 ULONG Dr3;
3661 ULONG Dr6;
3662 ULONG Dr7;
3663 FLOATING_SAVE_AREA FloatSave;
3664 ULONG SegGs;
3665 ULONG SegFs;
3666 ULONG SegEs;
3667 ULONG SegDs;
3668 ULONG Edi;
3669 ULONG Esi;
3670 ULONG Ebx;
3671 ULONG Edx;
3672 ULONG Ecx;
3673 ULONG Eax;
3674 ULONG Ebp;
3675 ULONG Eip;
3676 ULONG SegCs;
3677 ULONG EFlags;
3678 ULONG Esp;
3679 ULONG SegSs;
3680 UCHAR ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];
3681 } CONTEXT;
3682
3683 //
3684 // Used to contain PFNs and PFN counts
3685 //
3686 typedef ULONG PFN_COUNT;
3687 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
3688 typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
3689
3690 #define PASSIVE_LEVEL 0
3691 #define LOW_LEVEL 0
3692 #define APC_LEVEL 1
3693 #define DISPATCH_LEVEL 2
3694 #define PROFILE_LEVEL 27
3695 #define CLOCK1_LEVEL 28
3696 #define CLOCK2_LEVEL 28
3697 #define IPI_LEVEL 29
3698 #define POWER_LEVEL 30
3699 #define HIGH_LEVEL 31
3700
3701 typedef struct _KPCR_TIB {
3702 PVOID ExceptionList; /* 00 */
3703 PVOID StackBase; /* 04 */
3704 PVOID StackLimit; /* 08 */
3705 PVOID SubSystemTib; /* 0C */
3706 _ANONYMOUS_UNION union {
3707 PVOID FiberData; /* 10 */
3708 ULONG Version; /* 10 */
3709 } DUMMYUNIONNAME;
3710 PVOID ArbitraryUserPointer; /* 14 */
3711 struct _KPCR_TIB *Self; /* 18 */
3712 } KPCR_TIB, *PKPCR_TIB; /* 1C */
3713
3714 typedef struct _KPCR {
3715 KPCR_TIB Tib; /* 00 */
3716 struct _KPCR *Self; /* 1C */
3717 struct _KPRCB *Prcb; /* 20 */
3718 KIRQL Irql; /* 24 */
3719 ULONG IRR; /* 28 */
3720 ULONG IrrActive; /* 2C */
3721 ULONG IDR; /* 30 */
3722 PVOID KdVersionBlock; /* 34 */
3723 PUSHORT IDT; /* 38 */
3724 PUSHORT GDT; /* 3C */
3725 struct _KTSS *TSS; /* 40 */
3726 USHORT MajorVersion; /* 44 */
3727 USHORT MinorVersion; /* 46 */
3728 KAFFINITY SetMember; /* 48 */
3729 ULONG StallScaleFactor; /* 4C */
3730 UCHAR SpareUnused; /* 50 */
3731 UCHAR Number; /* 51 */
3732 UCHAR Spare0;
3733 UCHAR SecondLevelCacheAssociativity;
3734 ULONG VdmAlert;
3735 ULONG KernelReserved[14]; // For use by the kernel
3736 ULONG SecondLevelCacheSize;
3737 ULONG HalReserved[16]; // For use by Hal
3738 } KPCR, *PKPCR; /* 54 */
3739
3740 #define KeGetPcr() PCR
3741
3742 typedef struct _KFLOATING_SAVE {
3743 ULONG ControlWord;
3744 ULONG StatusWord;
3745 ULONG ErrorOffset;
3746 ULONG ErrorSelector;
3747 ULONG DataOffset;
3748 ULONG DataSelector;
3749 ULONG Cr0NpxState;
3750 ULONG Spare1;
3751 } KFLOATING_SAVE, *PKFLOATING_SAVE;
3752
3753 FORCEINLINE
3754 ULONG
3755 KeGetCurrentProcessorNumber(VOID)
3756 {
3757 return (ULONG)__readfsbyte(FIELD_OFFSET(KPCR, Number));
3758 }
3759
3760 NTHALAPI
3761 KIRQL
3762 DDKAPI
3763 KeGetCurrentIrql(
3764 VOID);
3765
3766 NTKERNELAPI
3767 PRKTHREAD
3768 NTAPI
3769 KeGetCurrentThread(
3770 VOID);
3771
3772 #define KI_USER_SHARED_DATA 0xffdf0000
3773
3774 #define PAGE_SIZE 0x1000
3775 #define PAGE_SHIFT 12L
3776
3777 #define SharedUserData ((KUSER_SHARED_DATA * CONST) KI_USER_SHARED_DATA)
3778
3779 extern NTKERNELAPI PVOID MmHighestUserAddress;
3780 extern NTKERNELAPI PVOID MmSystemRangeStart;
3781 extern NTKERNELAPI ULONG_PTR MmUserProbeAddress;
3782
3783 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
3784 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
3785 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
3786 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
3787 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000
3788
3789 #define MM_KSEG0_BASE MM_SYSTEM_RANGE_START
3790 #define MM_SYSTEM_SPACE_END 0xFFFFFFFF
3791
3792 #elif defined(__x86_64__)
3793
3794 #define CONTEXT_AMD64 0x100000
3795 #if !defined(RC_INVOKED)
3796 #define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L)
3797 #define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L)
3798 #define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L)
3799 #define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L)
3800 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L)
3801
3802 #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)
3803 #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS)
3804
3805 #define CONTEXT_EXCEPTION_ACTIVE 0x8000000
3806 #define CONTEXT_SERVICE_ACTIVE 0x10000000
3807 #define CONTEXT_EXCEPTION_REQUEST 0x40000000
3808 #define CONTEXT_EXCEPTION_REPORTING 0x80000000
3809 #endif
3810
3811 typedef struct DECLSPEC_ALIGN(16) _M128A {
3812 ULONGLONG Low;
3813 LONGLONG High;
3814 } M128A, *PM128A;
3815
3816 typedef struct _XMM_SAVE_AREA32 {
3817 USHORT ControlWord;
3818 USHORT StatusWord;
3819 UCHAR TagWord;
3820 UCHAR Reserved1;
3821 USHORT ErrorOpcode;
3822 ULONG ErrorOffset;
3823 USHORT ErrorSelector;
3824 USHORT Reserved2;
3825 ULONG DataOffset;
3826 USHORT DataSelector;
3827 USHORT Reserved3;
3828 ULONG MxCsr;
3829 ULONG MxCsr_Mask;
3830 M128A FloatRegisters[8];
3831 M128A XmmRegisters[16];
3832 UCHAR Reserved4[96];
3833 } XMM_SAVE_AREA32, *PXMM_SAVE_AREA32;
3834
3835 typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
3836 ULONG64 P1Home;
3837 ULONG64 P2Home;
3838 ULONG64 P3Home;
3839 ULONG64 P4Home;
3840 ULONG64 P5Home;
3841 ULONG64 P6Home;
3842
3843 /* Control flags */
3844 ULONG ContextFlags;
3845 ULONG MxCsr;
3846
3847 /* Segment */
3848 USHORT SegCs;
3849 USHORT SegDs;
3850 USHORT SegEs;
3851 USHORT SegFs;
3852 USHORT SegGs;
3853 USHORT SegSs;
3854 ULONG EFlags;
3855
3856 /* Debug */
3857 ULONG64 Dr0;
3858 ULONG64 Dr1;
3859 ULONG64 Dr2;
3860 ULONG64 Dr3;
3861 ULONG64 Dr6;
3862 ULONG64 Dr7;
3863
3864 /* Integer */
3865 ULONG64 Rax;
3866 ULONG64 Rcx;
3867 ULONG64 Rdx;
3868 ULONG64 Rbx;
3869 ULONG64 Rsp;
3870 ULONG64 Rbp;
3871 ULONG64 Rsi;
3872 ULONG64 Rdi;
3873 ULONG64 R8;
3874 ULONG64 R9;
3875 ULONG64 R10;
3876 ULONG64 R11;
3877 ULONG64 R12;
3878 ULONG64 R13;
3879 ULONG64 R14;
3880 ULONG64 R15;
3881
3882 /* Counter */
3883 ULONG64 Rip;
3884
3885 /* Floating point */
3886 union {
3887 XMM_SAVE_AREA32 FltSave;
3888 struct {
3889 M128A Header[2];
3890 M128A Legacy[8];
3891 M128A Xmm0;
3892 M128A Xmm1;
3893 M128A Xmm2;
3894 M128A Xmm3;
3895 M128A Xmm4;
3896 M128A Xmm5;
3897 M128A Xmm6;
3898 M128A Xmm7;
3899 M128A Xmm8;
3900 M128A Xmm9;
3901 M128A Xmm10;
3902 M128A Xmm11;
3903 M128A Xmm12;
3904 M128A Xmm13;
3905 M128A Xmm14;
3906 M128A Xmm15;
3907 } DUMMYSTRUCTNAME;
3908 } DUMMYUNIONNAME;
3909
3910 /* Vector */
3911 M128A VectorRegister[26];
3912 ULONG64 VectorControl;
3913
3914 /* Debug control */
3915 ULONG64 DebugControl;
3916 ULONG64 LastBranchToRip;
3917 ULONG64 LastBranchFromRip;
3918 ULONG64 LastExceptionToRip;
3919 ULONG64 LastExceptionFromRip;
3920 } CONTEXT;
3921
3922 //
3923 // Used to contain PFNs and PFN counts
3924 //
3925 typedef ULONG PFN_COUNT;
3926 typedef ULONG64 PFN_NUMBER, *PPFN_NUMBER;
3927 typedef LONG64 SPFN_NUMBER, *PSPFN_NUMBER;
3928
3929 #define PASSIVE_LEVEL 0
3930 #define LOW_LEVEL 0
3931 #define APC_LEVEL 1
3932 #define DISPATCH_LEVEL 2
3933 #define CLOCK_LEVEL 13
3934 #define IPI_LEVEL 14
3935 #define POWER_LEVEL 14
3936 #define PROFILE_LEVEL 15
3937 #define HIGH_LEVEL 15
3938
3939 #define PAGE_SIZE 0x1000
3940 #define PAGE_SHIFT 12L
3941 #define PTI_SHIFT 12L
3942 #define PDI_SHIFT 21L
3943 #define PPI_SHIFT 30L
3944 #define PXI_SHIFT 39L
3945 #define PTE_PER_PAGE 512
3946 #define PDE_PER_PAGE 512
3947 #define PPE_PER_PAGE 512
3948 #define PXE_PER_PAGE 512
3949 #define PTI_MASK_AMD64 (PTE_PER_PAGE - 1)
3950 #define PDI_MASK_AMD64 (PDE_PER_PAGE - 1)
3951 #define PPI_MASK (PPE_PER_PAGE - 1)
3952 #define PXI_MASK (PXE_PER_PAGE - 1)
3953
3954 #define PXE_BASE 0xFFFFF6FB7DBED000ULL
3955 #define PXE_SELFMAP 0xFFFFF6FB7DBEDF68ULL
3956 #define PPE_BASE 0xFFFFF6FB7DA00000ULL
3957 #define PDE_BASE 0xFFFFF6FB40000000ULL
3958 #define PTE_BASE 0xFFFFF68000000000ULL
3959 #define PXE_TOP 0xFFFFF6FB7DBEDFFFULL
3960 #define PPE_TOP 0xFFFFF6FB7DBFFFFFULL
3961 #define PDE_TOP 0xFFFFF6FB7FFFFFFFULL
3962 #define PTE_TOP 0xFFFFF6FFFFFFFFFFULL
3963
3964 extern NTKERNELAPI PVOID MmHighestUserAddress;
3965 extern NTKERNELAPI PVOID MmSystemRangeStart;
3966 extern NTKERNELAPI ULONG_PTR MmUserProbeAddress;
3967
3968 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
3969 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
3970 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
3971 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
3972 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xFFFF080000000000ULL
3973 #define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL
3974
3975 #define SharedUserData ((PKUSER_SHARED_DATA const)KI_USER_SHARED_DATA)
3976 #define SharedInterruptTime (&SharedUserData->InterruptTime)
3977 #define SharedSystemTime (&SharedUserData->SystemTime)
3978 #define SharedTickCount (&SharedUserData->TickCount)
3979
3980 #define KeQueryInterruptTime() \
3981 (*(volatile ULONG64*)SharedInterruptTime)
3982 #define KeQuerySystemTime(CurrentCount) \
3983 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime
3984 #define KeQueryTickCount(CurrentCount) \
3985 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount
3986
3987 typedef struct _KPCR
3988 {
3989 __GNU_EXTENSION union
3990 {
3991 NT_TIB NtTib;
3992 __GNU_EXTENSION struct
3993 {
3994 union _KGDTENTRY64 *GdtBase;
3995 struct _KTSS64 *TssBase;
3996 ULONG64 UserRsp;
3997 struct _KPCR *Self;
3998 struct _KPRCB *CurrentPrcb;
3999 PKSPIN_LOCK_QUEUE LockArray;
4000 PVOID Used_Self;
4001 };
4002 };
4003 union _KIDTENTRY64 *IdtBase;
4004 ULONG64 Unused[2];
4005 KIRQL Irql;
4006 UCHAR SecondLevelCacheAssociativity;
4007 UCHAR ObsoleteNumber;
4008 UCHAR Fill0;
4009 ULONG Unused0[3];
4010 USHORT MajorVersion;
4011 USHORT MinorVersion;
4012 ULONG StallScaleFactor;
4013 PVOID Unused1[3];
4014 ULONG KernelReserved[15];
4015 ULONG SecondLevelCacheSize;
4016 ULONG HalReserved[16];
4017 ULONG Unused2;
4018 PVOID KdVersionBlock;
4019 PVOID Unused3;
4020 ULONG PcrAlign1[24];
4021 } KPCR, *PKPCR;
4022
4023 typedef struct _KFLOATING_SAVE {
4024 ULONG Dummy;
4025 } KFLOATING_SAVE, *PKFLOATING_SAVE;
4026
4027 NTKERNELAPI
4028 PRKTHREAD
4029 NTAPI
4030 KeGetCurrentThread(
4031 VOID);
4032
4033 FORCEINLINE
4034 PKPCR
4035 KeGetPcr(VOID)
4036 {
4037 return (PKPCR)__readgsqword(FIELD_OFFSET(KPCR, Self));
4038 }
4039
4040 FORCEINLINE
4041 ULONG
4042 KeGetCurrentProcessorNumber(VOID)
4043 {
4044 return (ULONG)__readgsword(0x184);
4045 }
4046
4047 #elif defined(__PowerPC__)
4048
4049 //
4050 // Used to contain PFNs and PFN counts
4051 //
4052 typedef ULONG PFN_COUNT;
4053 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
4054 typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
4055
4056 #define PASSIVE_LEVEL 0
4057 #define LOW_LEVEL 0
4058 #define APC_LEVEL 1
4059 #define DISPATCH_LEVEL 2
4060 #define PROFILE_LEVEL 27
4061 #define CLOCK1_LEVEL 28
4062 #define CLOCK2_LEVEL 28
4063 #define IPI_LEVEL 29
4064 #define POWER_LEVEL 30
4065 #define HIGH_LEVEL 31
4066
4067 typedef struct _KFLOATING_SAVE {
4068 ULONG Dummy;
4069 } KFLOATING_SAVE, *PKFLOATING_SAVE;
4070
4071 typedef struct _KPCR_TIB {
4072 PVOID ExceptionList; /* 00 */
4073 PVOID StackBase; /* 04 */
4074 PVOID StackLimit; /* 08 */
4075 PVOID SubSystemTib; /* 0C */
4076 _ANONYMOUS_UNION union {
4077 PVOID FiberData; /* 10 */
4078 ULONG Version; /* 10 */
4079 } DUMMYUNIONNAME;
4080 PVOID ArbitraryUserPointer; /* 14 */
4081 struct _KPCR_TIB *Self; /* 18 */
4082 } KPCR_TIB, *PKPCR_TIB; /* 1C */
4083
4084 #define PCR_MINOR_VERSION 1
4085 #define PCR_MAJOR_VERSION 1
4086
4087 typedef struct _KPCR {
4088 KPCR_TIB Tib; /* 00 */
4089 struct _KPCR *Self; /* 1C */
4090 struct _KPRCB *Prcb; /* 20 */
4091 KIRQL Irql; /* 24 */
4092 ULONG IRR; /* 28 */
4093 ULONG IrrActive; /* 2C */
4094 ULONG IDR; /* 30 */
4095 PVOID KdVersionBlock; /* 34 */
4096 PUSHORT IDT; /* 38 */
4097 PUSHORT GDT; /* 3C */
4098 struct _KTSS *TSS; /* 40 */
4099 USHORT MajorVersion; /* 44 */
4100 USHORT MinorVersion; /* 46 */
4101 KAFFINITY SetMember; /* 48 */
4102 ULONG StallScaleFactor; /* 4C */
4103 UCHAR SpareUnused; /* 50 */
4104 UCHAR Number; /* 51 */
4105 } KPCR, *PKPCR; /* 54 */
4106
4107 #define KeGetPcr() PCR
4108
4109 static __inline
4110 ULONG
4111 DDKAPI
4112 KeGetCurrentProcessorNumber(VOID)
4113 {
4114 ULONG Number;
4115 __asm__ __volatile__ (
4116 "lwz %0, %c1(12)\n"
4117 : "=r" (Number)
4118 : "i" (FIELD_OFFSET(KPCR, Number))
4119 );
4120 return Number;
4121 }
4122
4123 #elif defined(_MIPS_)
4124
4125 #error MIPS Headers are totally incorrect
4126
4127 //
4128 // Used to contain PFNs and PFN counts
4129 //
4130 typedef ULONG PFN_COUNT;
4131 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
4132 typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
4133
4134 #define PASSIVE_LEVEL 0
4135 #define APC_LEVEL 1
4136 #define DISPATCH_LEVEL 2
4137 #define PROFILE_LEVEL 27
4138 #define IPI_LEVEL 29
4139 #define HIGH_LEVEL 31
4140
4141 typedef struct _KPCR {
4142 struct _KPRCB *Prcb; /* 20 */
4143 KIRQL Irql; /* 24 */
4144 ULONG IRR; /* 28 */
4145 ULONG IDR; /* 30 */
4146 } KPCR, *PKPCR;
4147
4148 #define KeGetPcr() PCR
4149
4150 typedef struct _KFLOATING_SAVE {
4151 } KFLOATING_SAVE, *PKFLOATING_SAVE;
4152
4153 static __inline
4154 ULONG
4155 DDKAPI
4156 KeGetCurrentProcessorNumber(VOID)
4157 {
4158 return 0;
4159 }
4160
4161 #elif defined(_M_ARM)
4162
4163 //
4164 // NT-ARM is not documented, need DDK-ARM
4165 //
4166 #include <armddk.h>
4167
4168 #else
4169 #error Unknown architecture
4170 #endif
4171
4172 #define MM_DONT_ZERO_ALLOCATION 0x00000001
4173 #define MM_ALLOCATE_FROM_LOCAL_NODE_ONLY 0x00000002
4174
4175
4176 #define EFLAG_SIGN 0x8000
4177 #define EFLAG_ZERO 0x4000
4178 #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
4179
4180 #define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
4181 #define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
4182 #define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
4183
4184 typedef enum _INTERLOCKED_RESULT {
4185 ResultNegative = RESULT_NEGATIVE,
4186 ResultZero = RESULT_ZERO,
4187 ResultPositive = RESULT_POSITIVE
4188 } INTERLOCKED_RESULT;
4189
4190 typedef VOID
4191 (NTAPI *PciPin2Line)(
4192 IN struct _BUS_HANDLER *BusHandler,
4193 IN struct _BUS_HANDLER *RootHandler,
4194 IN PCI_SLOT_NUMBER SlotNumber,
4195 IN PPCI_COMMON_CONFIG PciData
4196 );
4197
4198 typedef VOID
4199 (NTAPI *PciLine2Pin)(
4200 IN struct _BUS_HANDLER *BusHandler,
4201 IN struct _BUS_HANDLER *RootHandler,
4202 IN PCI_SLOT_NUMBER SlotNumber,
4203 IN PPCI_COMMON_CONFIG PciNewData,
4204 IN PPCI_COMMON_CONFIG PciOldData
4205 );
4206
4207 typedef VOID
4208 (NTAPI *PciReadWriteConfig)(
4209 IN struct _BUS_HANDLER *BusHandler,
4210 IN PCI_SLOT_NUMBER Slot,
4211 IN PVOID Buffer,
4212 IN ULONG Offset,
4213 IN ULONG Length
4214 );
4215
4216 #define PCI_DATA_TAG ' ICP'
4217 #define PCI_DATA_VERSION 1
4218
4219 typedef struct _PCIBUSDATA
4220 {
4221 ULONG Tag;
4222 ULONG Version;
4223 PciReadWriteConfig ReadConfig;
4224 PciReadWriteConfig WriteConfig;
4225 PciPin2Line Pin2Line;
4226 PciLine2Pin Line2Pin;
4227 PCI_SLOT_NUMBER ParentSlot;
4228 PVOID Reserved[4];
4229 } PCIBUSDATA, *PPCIBUSDATA;
4230
4231
4232 /** SPINLOCK FUNCTIONS ********************************************************/
4233
4234 NTKERNELAPI
4235 BOOLEAN
4236 FASTCALL
4237 KeTryToAcquireSpinLockAtDpcLevel(
4238 IN OUT PKSPIN_LOCK SpinLock
4239 );
4240
4241 NTKERNELAPI
4242 BOOLEAN
4243 FASTCALL
4244 KeTestSpinLock(
4245 IN PKSPIN_LOCK SpinLock
4246 );
4247
4248 #if defined (_X86_)
4249
4250 #if defined(WIN9X_COMPAT_SPINLOCK)
4251
4252 NTKERNELAPI
4253 VOID
4254 NTAPI
4255 KeInitializeSpinLock(
4256 IN PKSPIN_LOCK SpinLock
4257 );
4258
4259 #else
4260
4261 FORCEINLINE
4262 VOID
4263 KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock)
4264 {
4265 /* Clear the lock */
4266 *SpinLock = 0;
4267 }
4268
4269 #endif
4270
4271 NTHALAPI
4272 KIRQL
4273 FASTCALL
4274 KfAcquireSpinLock(
4275 IN PKSPIN_LOCK SpinLock);
4276
4277 NTHALAPI
4278 VOID
4279 FASTCALL
4280 KfReleaseSpinLock(
4281 IN PKSPIN_LOCK SpinLock,
4282 IN KIRQL NewIrql);
4283
4284 NTKERNELAPI
4285 VOID
4286 FASTCALL
4287 KefAcquireSpinLockAtDpcLevel(
4288 IN PKSPIN_LOCK SpinLock);
4289
4290 NTKERNELAPI
4291 VOID
4292 FASTCALL
4293 KefReleaseSpinLockFromDpcLevel(
4294 IN PKSPIN_LOCK SpinLock);
4295
4296 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
4297 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
4298 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
4299 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
4300
4301 #define KeGetDcacheFillSize() 1L
4302
4303 #elif defined(_M_ARM) // !defined (_X86_)
4304
4305 FORCEINLINE
4306 VOID
4307 KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock)
4308 {
4309 /* Clear the lock */
4310 *SpinLock = 0;
4311 }
4312
4313 NTHALAPI
4314 KIRQL
4315 FASTCALL
4316 KfAcquireSpinLock(
4317 IN PKSPIN_LOCK SpinLock);
4318
4319 NTHALAPI
4320 VOID
4321 FASTCALL
4322 KfReleaseSpinLock(
4323 IN PKSPIN_LOCK SpinLock,
4324 IN KIRQL NewIrql);
4325
4326
4327 NTKERNELAPI
4328 VOID
4329 FASTCALL
4330 KefAcquireSpinLockAtDpcLevel(
4331 IN PKSPIN_LOCK SpinLock);
4332
4333 NTKERNELAPI
4334 VOID
4335 FASTCALL
4336 KefReleaseSpinLockFromDpcLevel(
4337 IN PKSPIN_LOCK SpinLock);
4338
4339
4340 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
4341 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
4342 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
4343 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
4344
4345 NTKERNELAPI
4346 VOID
4347 NTAPI
4348 KeInitializeSpinLock(
4349 IN PKSPIN_LOCK SpinLock);
4350
4351 #else
4352
4353 FORCEINLINE
4354 VOID
4355 NTAPI
4356 KeInitializeSpinLock(
4357 PKSPIN_LOCK SpinLock)
4358 {
4359 *SpinLock = 0;
4360 }
4361
4362 NTKERNELAPI
4363 VOID
4364 KeReleaseSpinLock(
4365 IN PKSPIN_LOCK SpinLock,
4366 IN KIRQL NewIrql);
4367
4368 NTKERNELAPI
4369 VOID
4370 KeAcquireSpinLockAtDpcLevel(
4371 IN PKSPIN_LOCK SpinLock);
4372
4373 NTKERNELAPI
4374 VOID
4375 KeReleaseSpinLockFromDpcLevel(
4376 IN PKSPIN_LOCK SpinLock);
4377
4378 NTKERNELAPI
4379 KIRQL
4380 KeAcquireSpinLockRaiseToDpc(
4381 IN PKSPIN_LOCK SpinLock);
4382
4383 #define KeAcquireSpinLock(SpinLock, OldIrql) \
4384 *(OldIrql) = KeAcquireSpinLockRaiseToDpc(SpinLock)
4385
4386 #endif // !defined (_X86_)
4387
4388 /*
4389 ** Utillity functions
4390 */
4391
4392 #define ARGUMENT_PRESENT(ArgumentPointer) \
4393 ((CHAR*)((ULONG_PTR)(ArgumentPointer)) != (CHAR*)NULL)
4394
4395 /*
4396 * ULONG
4397 * BYTE_OFFSET(
4398 * IN PVOID Va)
4399 */
4400 #define BYTE_OFFSET(Va) \
4401 ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
4402
4403 /*
4404 * ULONG
4405 * BYTES_TO_PAGES(
4406 * IN ULONG Size)
4407 */
4408 #define BYTES_TO_PAGES(Size) \
4409 ((ULONG) ((ULONG_PTR) (Size) >> PAGE_SHIFT) + (((ULONG) (Size) & (PAGE_SIZE - 1)) != 0))
4410
4411 /*
4412 * PVOID
4413 * PAGE_ALIGN(
4414 * IN PVOID Va)
4415 */
4416 #define PAGE_ALIGN(Va) \
4417 ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
4418
4419 /*
4420 * ULONG_PTR
4421 * ROUND_TO_PAGES(
4422 * IN ULONG_PTR Size)
4423 */
4424 #define ROUND_TO_PAGES(Size) \
4425 ((ULONG_PTR) (((ULONG_PTR) Size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1)))
4426
4427
4428
4429 #if defined(_X86_) || defined(_AMD64_)
4430
4431 //
4432 // x86 and x64 performs a 0x2C interrupt
4433 //
4434 #define DbgRaiseAssertionFailure __int2c
4435
4436 #elif defined(_ARM_)
4437
4438 //
4439 // TODO
4440 //
4441
4442 #else
4443 #error Unsupported Architecture
4444 #endif
4445
4446 #if DBG
4447
4448 #define ASSERT(exp) \
4449 (VOID)((!(exp)) ? \
4450 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ), FALSE : TRUE)
4451
4452 #define ASSERTMSG(msg, exp) \
4453 (VOID)((!(exp)) ? \
4454 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, msg ), FALSE : TRUE)
4455
4456 #define RTL_SOFT_ASSERT(exp) \
4457 (VOID)((!(exp)) ? \
4458 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE)
4459
4460 #define RTL_SOFT_ASSERTMSG(msg, exp) \
4461 (VOID)((!(exp)) ? \
4462 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE)
4463
4464 #define RTL_VERIFY(exp) ASSERT(exp)
4465 #define RTL_VERIFYMSG(msg, exp) ASSERT(msg, exp)
4466
4467 #define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
4468 #define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
4469
4470 #if defined(_MSC_VER)
4471
4472 #define NT_ASSERT(exp) \
4473 ((!(exp)) ? \
4474 (__annotation(L"Debug", L"AssertFail", L#exp), \
4475 DbgRaiseAssertionFailure(), FALSE) : TRUE)
4476
4477 #define NT_ASSERTMSG(msg, exp) \
4478 ((!(exp)) ? \
4479 (__annotation(L"Debug", L"AssertFail", L##msg), \
4480 DbgRaiseAssertionFailure(), FALSE) : TRUE)
4481
4482 #define NT_ASSERTMSGW(msg, exp) \
4483 ((!(exp)) ? \
4484 (__annotation(L"Debug", L"AssertFail", msg), \
4485 DbgRaiseAssertionFailure(), FALSE) : TRUE)
4486
4487 #else
4488
4489 //
4490 // GCC doesn't support __annotation (nor PDB)
4491 //
4492 #define NT_ASSERT(exp) \
4493 (VOID)((!(exp)) ? (DbgRaiseAssertionFailure(), FALSE) : TRUE)
4494
4495 #define NT_ASSERTMSG NT_ASSERT
4496 #define NT_ASSERTMSGW NT_ASSERT
4497
4498 #endif
4499
4500 #else /* !DBG */
4501
4502 #define ASSERT(exp) ((VOID) 0)
4503 #define ASSERTMSG(msg, exp) ((VOID) 0)
4504
4505 #define RTL_SOFT_ASSERT(exp) ((VOID) 0)
4506 #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
4507
4508 #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
4509 #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
4510
4511 #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
4512 #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
4513
4514 #define NT_ASSERT(exp) ((VOID)0)
4515 #define NT_ASSERTMSG(exp) ((VOID)0)
4516 #define NT_ASSERTMSGW(exp) ((VOID)0)
4517
4518 #endif /* DBG */
4519
4520 /* HACK HACK HACK - GCC (or perhaps LD) is messing this up */
4521 #if defined(_NTSYSTEM_) || defined(__GNUC__)
4522 #define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag
4523 #define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag
4524 #else
4525 #define NLS_MB_CODE_PAGE_TAG (*NlsMbCodePageTag)
4526 #define NLS_MB_OEM_CODE_PAGE_TAG (*NlsMbOemCodePageTag)
4527 #endif /* _NT_SYSTEM */
4528
4529 extern BOOLEAN NTSYSAPI NLS_MB_CODE_PAGE_TAG;
4530 extern BOOLEAN NTSYSAPI NLS_MB_OEM_CODE_PAGE_TAG;
4531
4532 /*
4533 ** Driver support routines
4534 */
4535
4536 /** Runtime library routines **/
4537
4538 static __inline VOID
4539 InitializeListHead(
4540 IN PLIST_ENTRY ListHead)
4541 {
4542 ListHead->Flink = ListHead->Blink = ListHead;
4543 }
4544
4545 static __inline VOID
4546 InsertHeadList(
4547 IN PLIST_ENTRY ListHead,
4548 IN PLIST_ENTRY Entry)
4549 {
4550 PLIST_ENTRY OldFlink;
4551 OldFlink = ListHead->Flink;
4552 Entry->Flink = OldFlink;
4553 Entry->Blink = ListHead;
4554 OldFlink->Blink = Entry;
4555 ListHead->Flink = Entry;
4556 }
4557
4558 static __inline VOID
4559 InsertTailList(
4560 IN PLIST_ENTRY ListHead,
4561 IN PLIST_ENTRY Entry)
4562 {
4563 PLIST_ENTRY OldBlink;
4564 OldBlink = ListHead->Blink;
4565 Entry->Flink = ListHead;
4566 Entry->Blink = OldBlink;
4567 OldBlink->Flink = Entry;
4568 ListHead->Blink = Entry;
4569 }
4570
4571 /*
4572 * BOOLEAN
4573 * IsListEmpty(
4574 * IN PLIST_ENTRY ListHead)
4575 */
4576 #define IsListEmpty(_ListHead) \
4577 ((_ListHead)->Flink == (_ListHead))
4578
4579 /*
4580 * PSINGLE_LIST_ENTRY
4581 * PopEntryList(
4582 * IN PSINGLE_LIST_ENTRY ListHead)
4583 */
4584 #define PopEntryList(ListHead) \
4585 (ListHead)->Next; \
4586 { \
4587 PSINGLE_LIST_ENTRY _FirstEntry; \
4588 _FirstEntry = (ListHead)->Next; \
4589 if (_FirstEntry != NULL) \
4590 (ListHead)->Next = _FirstEntry->Next; \
4591 }
4592
4593 /*
4594 * VOID
4595 * PushEntryList(
4596 * IN PSINGLE_LIST_ENTRY ListHead,
4597 * IN PSINGLE_LIST_ENTRY Entry)
4598 */
4599 #define PushEntryList(_ListHead, _Entry) \
4600 (_Entry)->Next = (_ListHead)->Next; \
4601 (_ListHead)->Next = (_Entry); \
4602
4603 static __inline BOOLEAN
4604 RemoveEntryList(
4605 IN PLIST_ENTRY Entry)
4606 {
4607 PLIST_ENTRY OldFlink;
4608 PLIST_ENTRY OldBlink;
4609
4610 OldFlink = Entry->Flink;
4611 OldBlink = Entry->Blink;
4612 OldFlink->Blink = OldBlink;
4613 OldBlink->Flink = OldFlink;
4614 return (BOOLEAN)(OldFlink == OldBlink);
4615 }
4616
4617 static __inline PLIST_ENTRY
4618 RemoveHeadList(
4619 IN PLIST_ENTRY ListHead)
4620 {
4621 PLIST_ENTRY Flink;
4622 PLIST_ENTRY Entry;
4623
4624 Entry = ListHead->Flink;
4625 Flink = Entry->Flink;
4626 ListHead->Flink = Flink;
4627 Flink->Blink = ListHead;
4628 return Entry;
4629 }
4630
4631 static __inline PLIST_ENTRY
4632 RemoveTailList(
4633 IN PLIST_ENTRY ListHead)
4634 {
4635 PLIST_ENTRY Blink;
4636 PLIST_ENTRY Entry;
4637
4638 Entry = ListHead->Blink;
4639 Blink = Entry->Blink;
4640 ListHead->Blink = Blink;
4641 Blink->Flink = ListHead;
4642 return Entry;
4643 }
4644
4645 NTSYSAPI
4646 NTSTATUS
4647 NTAPI
4648 RtlCharToInteger(
4649 IN PCSZ String,
4650 IN ULONG Base OPTIONAL,
4651 IN OUT PULONG Value);
4652
4653 NTSYSAPI
4654 LONG
4655 NTAPI
4656 RtlCompareString(
4657 IN PSTRING String1,
4658 IN PSTRING String2,
4659 BOOLEAN CaseInSensitive);
4660
4661 #if !defined(MIDL_PASS)
4662
4663 FORCEINLINE
4664 LUID
4665 NTAPI
4666 RtlConvertLongToLuid(
4667 IN LONG Val)
4668 {
4669 LUID Luid;
4670 LARGE_INTEGER Temp;
4671
4672 Temp.QuadPart = Val;
4673 Luid.LowPart = Temp.u.LowPart;
4674 Luid.HighPart = Temp.u.HighPart;
4675
4676 return Luid;
4677 }
4678
4679 FORCEINLINE
4680 LUID
4681 NTAPI
4682 RtlConvertUlongToLuid(
4683 IN ULONG Val)
4684 {
4685 LUID Luid;
4686
4687 Luid.LowPart = Val;
4688 Luid.HighPart = 0;
4689
4690 return Luid;
4691 }
4692 #endif
4693
4694
4695 NTSYSAPI
4696 VOID
4697 NTAPI
4698 RtlCopyMemory32(
4699 IN VOID UNALIGNED *Destination,
4700 IN CONST VOID UNALIGNED *Source,
4701 IN ULONG Length);
4702
4703 NTSYSAPI
4704 VOID
4705 NTAPI
4706 RtlCopyString(
4707 IN OUT PSTRING DestinationString,
4708 IN PSTRING SourceString OPTIONAL);
4709
4710 NTSYSAPI
4711 BOOLEAN
4712 NTAPI
4713 RtlEqualString(
4714 IN PSTRING String1,
4715 IN PSTRING String2,
4716 IN BOOLEAN CaseInSensitive);
4717
4718 #if (defined(_M_AMD64) || defined(_M_IA64)) && !defined(_REALLY_GET_CALLERS_CALLER_)
4719 #define RtlGetCallersAddress(CallersAddress, CallersCaller) \
4720 *CallersAddress = (PVOID)_ReturnAddress(); \
4721 *CallersCaller = NULL;
4722 #else
4723 NTSYSAPI
4724 VOID
4725 NTAPI
4726 RtlGetCallersAddress(
4727 OUT PVOID *CallersAddress,
4728 OUT PVOID *CallersCaller);
4729 #endif
4730
4731 NTSYSAPI
4732 NTSTATUS
4733 NTAPI
4734 RtlGetVersion(
4735 IN OUT PRTL_OSVERSIONINFOW lpVersionInformation);
4736
4737 NTSYSAPI
4738 VOID
4739 NTAPI
4740 RtlMapGenericMask(
4741 IN OUT PACCESS_MASK AccessMask,
4742 IN PGENERIC_MAPPING GenericMapping);
4743
4744 NTSYSAPI
4745 BOOLEAN
4746 NTAPI
4747 RtlPrefixUnicodeString(
4748 IN PCUNICODE_STRING String1,
4749 IN PCUNICODE_STRING String2,
4750 IN BOOLEAN CaseInSensitive);
4751
4752 NTSYSAPI
4753 NTSTATUS
4754 NTAPI
4755 RtlUpcaseUnicodeString(
4756 IN OUT PUNICODE_STRING DestinationString OPTIONAL,
4757 IN PCUNICODE_STRING SourceString,
4758 IN BOOLEAN AllocateDestinationString);
4759
4760 NTSYSAPI
4761 CHAR
4762 NTAPI
4763 RtlUpperChar(
4764 IN CHAR Character);
4765
4766 NTSYSAPI
4767 VOID
4768 NTAPI
4769 RtlUpperString(
4770 IN OUT PSTRING DestinationString,
4771 IN PSTRING SourceString);
4772
4773 NTSYSAPI
4774 NTSTATUS
4775 NTAPI
4776 RtlVerifyVersionInfo(
4777 IN PRTL_OSVERSIONINFOEXW VersionInfo,
4778 IN ULONG TypeMask,
4779 IN ULONGLONG ConditionMask);
4780
4781 NTSYSAPI
4782 NTSTATUS
4783 NTAPI
4784 RtlVolumeDeviceToDosName(
4785 IN PVOID VolumeDeviceObject,
4786 OUT PUNICODE_STRING DosName);
4787
4788 NTSYSAPI
4789 ULONG
4790 NTAPI
4791 RtlWalkFrameChain(
4792 OUT PVOID *Callers,
4793 IN ULONG Count,
4794 IN ULONG Flags);
4795
4796 NTKERNELAPI
4797 BOOLEAN
4798 NTAPI
4799 KeAreAllApcsDisabled(
4800 VOID
4801 );
4802
4803 /* Guarded Mutex routines */
4804
4805 NTKERNELAPI
4806 VOID
4807 FASTCALL
4808 KeAcquireGuardedMutex(
4809 IN OUT PKGUARDED_MUTEX GuardedMutex
4810 );
4811
4812 NTKERNELAPI
4813 VOID
4814 FASTCALL
4815 KeAcquireGuardedMutexUnsafe(
4816 IN OUT PKGUARDED_MUTEX GuardedMutex
4817 );
4818
4819 NTKERNELAPI
4820 VOID
4821 NTAPI
4822 KeEnterGuardedRegion(
4823 VOID
4824 );
4825
4826 NTKERNELAPI
4827 VOID
4828 NTAPI
4829 KeLeaveGuardedRegion(
4830 VOID
4831 );
4832
4833 NTKERNELAPI
4834 VOID
4835 FASTCALL
4836 KeInitializeGuardedMutex(
4837 OUT PKGUARDED_MUTEX GuardedMutex
4838 );
4839
4840 NTKERNELAPI
4841 VOID
4842 FASTCALL
4843 KeReleaseGuardedMutexUnsafe(
4844 IN OUT PKGUARDED_MUTEX GuardedMutex
4845 );
4846
4847 NTKERNELAPI
4848 VOID
4849 FASTCALL
4850 KeReleaseGuardedMutex(
4851 IN OUT PKGUARDED_MUTEX GuardedMutex
4852 );
4853
4854 NTKERNELAPI
4855 BOOLEAN
4856 FASTCALL
4857 KeTryToAcquireGuardedMutex(
4858 IN OUT PKGUARDED_MUTEX GuardedMutex
4859 );
4860
4861 /* Fast Mutex */
4862 #define ExInitializeFastMutex(_FastMutex) \
4863 { \
4864 (_FastMutex)->Count = FM_LOCK_BIT; \
4865 (_FastMutex)->Owner = NULL; \
4866 (_FastMutex)->Contention = 0; \
4867 KeInitializeEvent(&(_FastMutex)->Gate, SynchronizationEvent, FALSE); \
4868 }
4869
4870 NTKERNELAPI
4871 VOID
4872 NTAPI
4873 KeInitializeEvent(
4874 IN PRKEVENT Event,
4875 IN EVENT_TYPE Type,
4876 IN BOOLEAN State);
4877
4878 /******************************************************************************
4879 * Executive Types *
4880 ******************************************************************************/
4881
4882 typedef struct _ZONE_SEGMENT_HEADER {
4883 SINGLE_LIST_ENTRY SegmentList;
4884 PVOID Reserved;
4885 } ZONE_SEGMENT_HEADER, *PZONE_SEGMENT_HEADER;
4886
4887 typedef struct _ZONE_HEADER {
4888 SINGLE_LIST_ENTRY FreeList;
4889 SINGLE_LIST_ENTRY SegmentList;
4890 ULONG BlockSize;
4891 ULONG TotalSegmentSize;
4892 } ZONE_HEADER, *PZONE_HEADER;
4893
4894 #define PROTECTED_POOL 0x80000000
4895
4896 /******************************************************************************
4897 * Executive Functions *
4898 ******************************************************************************/
4899
4900 NTKERNELAPI
4901 NTSTATUS
4902 NTAPI
4903 ExExtendZone(
4904 IN PZONE_HEADER Zone,
4905 IN PVOID Segment,
4906 IN ULONG SegmentSize);
4907
4908 static __inline PVOID
4909 ExAllocateFromZone(
4910 IN PZONE_HEADER Zone)
4911 {
4912 if (Zone->FreeList.Next)
4913 Zone->FreeList.Next = Zone->FreeList.Next->Next;
4914 return (PVOID) Zone->FreeList.Next;
4915 }
4916
4917 static __inline PVOID
4918 ExFreeToZone(
4919 IN PZONE_HEADER Zone,
4920 IN PVOID Block)
4921 {
4922 ((PSINGLE_LIST_ENTRY) Block)->Next = Zone->FreeList.Next;
4923 Zone->FreeList.Next = ((PSINGLE_LIST_ENTRY) Block);
4924 return ((PSINGLE_LIST_ENTRY) Block)->Next;
4925 }
4926
4927 NTKERNELAPI
4928 NTSTATUS
4929 NTAPI
4930 ExInitializeZone(
4931 IN PZONE_HEADER Zone,
4932 IN ULONG BlockSize,
4933 IN PVOID InitialSegment,
4934 IN ULONG InitialSegmentSize);
4935
4936 /*
4937 * PVOID
4938 * ExInterlockedAllocateFromZone(
4939 * IN PZONE_HEADER Zone,
4940 * IN PKSPIN_LOCK Lock)
4941 */
4942 #define ExInterlockedAllocateFromZone(Zone, Lock) \
4943 ((PVOID) ExInterlockedPopEntryList(&Zone->FreeList, Lock))
4944
4945 NTKERNELAPI
4946 NTSTATUS
4947 NTAPI
4948 ExInterlockedExtendZone(
4949 IN PZONE_HEADER Zone,
4950 IN PVOID Segment,
4951 IN ULONG SegmentSize,
4952 IN PKSPIN_LOCK Lock);
4953
4954 /* PVOID
4955 * ExInterlockedFreeToZone(
4956 * IN PZONE_HEADER Zone,
4957 * IN PVOID Block,
4958 * IN PKSPIN_LOCK Lock);
4959 */
4960 #define ExInterlockedFreeToZone(Zone, Block, Lock) \
4961 ExInterlockedPushEntryList(&(Zone)->FreeList, (PSINGLE_LIST_ENTRY)(Block), Lock)
4962
4963 /*
4964 * VOID
4965 * InitializeSListHead(
4966 * IN PSLIST_HEADER SListHead)
4967 */
4968 #define InitializeSListHead(_SListHead) \
4969 (_SListHead)->Alignment = 0
4970
4971 #define ExInitializeSListHead InitializeSListHead
4972
4973 /*
4974 * BOOLEAN
4975 * ExIsFullZone(
4976 * IN PZONE_HEADER Zone)
4977 */
4978 #define ExIsFullZone(Zone) \
4979 ((Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY) NULL)
4980
4981 /* BOOLEAN
4982 * ExIsObjectInFirstZoneSegment(
4983 * IN PZONE_HEADER Zone,
4984 * IN PVOID Object);
4985 */
4986 #define ExIsObjectInFirstZoneSegment(Zone,Object) \
4987 ((BOOLEAN)( ((PUCHAR)(Object) >= (PUCHAR)(Zone)->SegmentList.Next) && \
4988 ((PUCHAR)(Object) < (PUCHAR)(Zone)->SegmentList.Next + \
4989 (Zone)->TotalSegmentSize)) )
4990
4991 NTKERNELAPI
4992 DECLSPEC_NORETURN
4993 VOID
4994 NTAPI
4995 ExRaiseAccessViolation(
4996 VOID);
4997
4998 NTKERNELAPI
4999 DECLSPEC_NORETURN
5000 VOID
5001 NTAPI
5002 ExRaiseDatatypeMisalignment(
5003 VOID);
5004
5005 NTKERNELAPI
5006 NTSTATUS
5007 NTAPI
5008 ExUuidCreate(
5009 OUT UUID *Uuid);
5010
5011 #define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite
5012 #define ExAcquireResourceShared ExAcquireResourceSharedLite
5013 #define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite
5014 #define ExDeleteResource ExDeleteResourceLite
5015 #define ExInitializeResource ExInitializeResourceLite
5016 #define ExIsResourceAcquiredExclusive ExIsResourceAcquiredExclusiveLite
5017 #define ExIsResourceAcquiredShared ExIsResourceAcquiredSharedLite
5018 #define ExIsResourceAcquired ExIsResourceAcquiredSharedLite
5019 #define ExReleaseResourceForThread ExReleaseResourceForThreadLite
5020
5021
5022 #if DBG
5023
5024 #define PAGED_CODE() { \
5025 if (KeGetCurrentIrql() > APC_LEVEL) { \
5026 KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
5027 ASSERT(FALSE); \
5028 } \
5029 }
5030
5031 #else
5032
5033 #define PAGED_CODE()
5034
5035 #endif
5036
5037 NTKERNELAPI
5038 VOID
5039 NTAPI
5040 ProbeForRead(
5041 IN CONST VOID *Address,
5042 IN SIZE_T Length,
5043 IN ULONG Alignment);
5044
5045 NTKERNELAPI
5046 VOID
5047 NTAPI
5048 ProbeForWrite(
5049 IN PVOID Address,
5050 IN SIZE_T Length,
5051 IN ULONG Alignment);
5052
5053
5054
5055 /** Configuration manager routines **/
5056
5057 NTKERNELAPI
5058 NTSTATUS
5059 NTAPI
5060 CmRegisterCallback(
5061 IN PEX_CALLBACK_FUNCTION Function,
5062 IN PVOID Context,
5063 IN OUT PLARGE_INTEGER Cookie);
5064
5065 NTKERNELAPI
5066 NTSTATUS
5067 NTAPI
5068 CmUnRegisterCallback(
5069 IN LARGE_INTEGER Cookie);
5070
5071
5072
5073 /** Filesystem runtime library routines **/
5074
5075 NTKERNELAPI
5076 BOOLEAN
5077 NTAPI
5078 FsRtlIsTotalDeviceFailure(
5079 IN NTSTATUS Status);
5080
5081
5082
5083 /** Hardware abstraction layer routines **/
5084
5085 NTHALAPI
5086 BOOLEAN
5087 NTAPI
5088 HalMakeBeep(
5089 IN ULONG Frequency);
5090
5091 NTKERNELAPI
5092 VOID
5093 FASTCALL
5094 HalExamineMBR(
5095 IN PDEVICE_OBJECT DeviceObject,
5096 IN ULONG SectorSize,
5097 IN ULONG MBRTypeIdentifier,
5098 OUT PVOID *Buffer);
5099
5100 VOID
5101 NTAPI
5102 HalPutDmaAdapter(
5103 PADAPTER_OBJECT AdapterObject
5104 );
5105
5106
5107 /** Io access routines **/
5108
5109 #if !defined(_M_AMD64)
5110 NTHALAPI
5111 VOID
5112 NTAPI
5113 READ_PORT_BUFFER_UCHAR(
5114 IN PUCHAR Port,
5115 IN PUCHAR Buffer,
5116 IN ULONG Count);
5117
5118 NTHALAPI
5119 VOID
5120 NTAPI
5121 READ_PORT_BUFFER_ULONG(
5122 IN PULONG Port,
5123 IN PULONG Buffer,
5124 IN ULONG Count);
5125
5126 NTHALAPI
5127 VOID
5128 NTAPI
5129 READ_PORT_BUFFER_USHORT(
5130 IN PUSHORT Port,
5131 IN PUSHORT Buffer,
5132 IN ULONG Count);
5133
5134 NTHALAPI
5135 UCHAR
5136 NTAPI
5137 READ_PORT_UCHAR(
5138 IN PUCHAR Port);
5139
5140 NTHALAPI
5141 ULONG
5142 NTAPI
5143 READ_PORT_ULONG(
5144 IN PULONG Port);
5145
5146 NTHALAPI
5147 USHORT
5148 NTAPI
5149 READ_PORT_USHORT(
5150 IN PUSHORT Port);
5151
5152 NTKERNELAPI
5153 VOID
5154 NTAPI
5155 READ_REGISTER_BUFFER_UCHAR(
5156 IN PUCHAR Register,
5157 IN PUCHAR Buffer,
5158 IN ULONG Count);
5159
5160 NTKERNELAPI
5161 VOID
5162 NTAPI
5163 READ_REGISTER_BUFFER_ULONG(
5164 IN PULONG Register,
5165 IN PULONG Buffer,
5166 IN ULONG Count);
5167
5168 NTKERNELAPI
5169 VOID
5170 NTAPI
5171 READ_REGISTER_BUFFER_USHORT(
5172 IN PUSHORT Register,
5173 IN PUSHORT Buffer,
5174 IN ULONG Count);
5175
5176 NTKERNELAPI
5177 UCHAR
5178 NTAPI
5179 READ_REGISTER_UCHAR(
5180 IN PUCHAR Register);
5181
5182 NTKERNELAPI
5183 ULONG
5184 NTAPI
5185 READ_REGISTER_ULONG(
5186 IN PULONG Register);
5187
5188 NTKERNELAPI
5189 USHORT
5190 NTAPI
5191 READ_REGISTER_USHORT(
5192 IN PUSHORT Register);
5193
5194 NTHALAPI
5195 VOID
5196 NTAPI
5197 WRITE_PORT_BUFFER_UCHAR(
5198 IN PUCHAR Port,
5199 IN PUCHAR Buffer,
5200 IN ULONG Count);
5201
5202 NTHALAPI
5203 VOID
5204 NTAPI
5205 WRITE_PORT_BUFFER_ULONG(
5206 IN PULONG Port,
5207 IN PULONG Buffer,
5208 IN ULONG Count);
5209
5210 NTHALAPI
5211 VOID
5212 NTAPI
5213 WRITE_PORT_BUFFER_USHORT(
5214 IN PUSHORT Port,
5215 IN PUSHORT Buffer,
5216 IN ULONG Count);
5217
5218 NTHALAPI
5219 VOID
5220 NTAPI
5221 WRITE_PORT_UCHAR(
5222 IN PUCHAR Port,
5223 IN UCHAR Value);
5224
5225 NTHALAPI
5226 VOID
5227 NTAPI
5228 WRITE_PORT_ULONG(
5229 IN PULONG Port,
5230 IN ULONG Value);
5231
5232 NTHALAPI
5233 VOID
5234 NTAPI
5235 WRITE_PORT_USHORT(
5236 IN PUSHORT Port,
5237 IN USHORT Value);
5238
5239 NTKERNELAPI
5240 VOID
5241 NTAPI
5242 WRITE_REGISTER_BUFFER_UCHAR(
5243 IN PUCHAR Register,
5244 IN PUCHAR Buffer,
5245 IN ULONG Count);
5246
5247 NTKERNELAPI
5248 VOID
5249 NTAPI
5250 WRITE_REGISTER_BUFFER_ULONG(
5251 IN PULONG Register,
5252 IN PULONG Buffer,
5253 IN ULONG Count);
5254
5255 NTKERNELAPI
5256 VOID
5257 NTAPI
5258 WRITE_REGISTER_BUFFER_USHORT(
5259 IN PUSHORT Register,
5260 IN PUSHORT Buffer,
5261 IN ULONG Count);
5262
5263 NTKERNELAPI
5264 VOID
5265 NTAPI
5266 WRITE_REGISTER_UCHAR(
5267 IN PUCHAR Register,
5268 IN UCHAR Value);
5269
5270 NTKERNELAPI
5271 VOID
5272 NTAPI
5273 WRITE_REGISTER_ULONG(
5274 IN PULONG Register,
5275 IN ULONG Value);
5276
5277 NTKERNELAPI
5278 VOID
5279 NTAPI
5280 WRITE_REGISTER_USHORT(
5281 IN PUSHORT Register,
5282 IN USHORT Value);
5283
5284 #else
5285
5286 FORCEINLINE
5287 VOID
5288 READ_PORT_BUFFER_UCHAR(
5289 IN PUCHAR Port,
5290 IN PUCHAR Buffer,
5291 IN ULONG Count)
5292 {
5293 __inbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
5294 }
5295
5296 FORCEINLINE
5297 VOID
5298 READ_PORT_BUFFER_ULONG(
5299 IN PULONG Port,
5300 IN PULONG Buffer,
5301 IN ULONG Count)
5302 {
5303 __indwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
5304 }
5305
5306 FORCEINLINE
5307 VOID
5308 READ_PORT_BUFFER_USHORT(
5309 IN PUSHORT Port,
5310 IN PUSHORT Buffer,
5311 IN ULONG Count)
5312 {
5313 __inwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
5314 }
5315
5316 FORCEINLINE
5317 UCHAR
5318 READ_PORT_UCHAR(
5319 IN PUCHAR Port)
5320 {
5321 return __inbyte((USHORT)(ULONG_PTR)Port);
5322 }
5323
5324 FORCEINLINE
5325 ULONG
5326 READ_PORT_ULONG(
5327 IN PULONG Port)
5328 {
5329 return __indword((USHORT)(ULONG_PTR)Port);
5330 }
5331
5332 FORCEINLINE
5333 USHORT
5334 READ_PORT_USHORT(
5335 IN PUSHORT Port)
5336 {
5337 return __inword((USHORT)(ULONG_PTR)Port);
5338 }
5339
5340 FORCEINLINE
5341 VOID
5342 READ_REGISTER_BUFFER_UCHAR(
5343 IN PUCHAR Register,
5344 IN PUCHAR Buffer,
5345 IN ULONG Count)
5346 {
5347 __movsb(Register, Buffer, Count);
5348 }
5349
5350 FORCEINLINE
5351 VOID
5352 READ_REGISTER_BUFFER_ULONG(
5353 IN PULONG Register,
5354 IN PULONG Buffer,
5355 IN ULONG Count)
5356 {
5357 __movsd(Register, Buffer, Count);
5358 }
5359
5360 FORCEINLINE
5361 VOID
5362 READ_REGISTER_BUFFER_USHORT(
5363 IN PUSHORT Register,
5364 IN PUSHORT Buffer,
5365 IN ULONG Count)
5366 {
5367 __movsw(Register, Buffer, Count);
5368 }
5369
5370 FORCEINLINE
5371 UCHAR
5372 READ_REGISTER_UCHAR(
5373 IN PUCHAR Register)
5374 {
5375 return *Register;
5376 }
5377
5378 FORCEINLINE
5379 ULONG
5380 READ_REGISTER_ULONG(
5381 IN PULONG Register)
5382 {
5383 return *Register;
5384 }
5385
5386 FORCEINLINE
5387 USHORT
5388 READ_REGISTER_USHORT(
5389 IN PUSHORT Register)
5390 {
5391 return *Register;
5392 }
5393
5394 FORCEINLINE
5395 VOID
5396 WRITE_PORT_BUFFER_UCHAR(
5397 IN PUCHAR Port,
5398 IN PUCHAR Buffer,
5399 IN ULONG Count)
5400 {
5401 __outbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
5402 }
5403
5404 FORCEINLINE
5405 VOID
5406 WRITE_PORT_BUFFER_ULONG(
5407 IN PULONG Port,
5408 IN PULONG Buffer,
5409 IN ULONG Count)
5410 {
5411 __outdwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
5412 }
5413
5414 FORCEINLINE
5415 VOID
5416 WRITE_PORT_BUFFER_USHORT(
5417 IN PUSHORT Port,
5418 IN PUSHORT Buffer,
5419 IN ULONG Count)
5420 {
5421 __outwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
5422 }
5423
5424 FORCEINLINE
5425 VOID
5426 WRITE_PORT_UCHAR(
5427 IN PUCHAR Port,
5428 IN UCHAR Value)
5429 {
5430 __outbyte((USHORT)(ULONG_PTR)Port, Value);
5431 }
5432
5433 FORCEINLINE
5434 VOID
5435 WRITE_PORT_ULONG(
5436 IN PULONG Port,
5437 IN ULONG Value)
5438 {
5439 __outdword((USHORT)(ULONG_PTR)Port, Value);
5440 }
5441
5442 FORCEINLINE
5443 VOID
5444 WRITE_PORT_USHORT(
5445 IN PUSHORT Port,
5446 IN USHORT Value)
5447 {
5448 __outword((USHORT)(ULONG_PTR)Port, Value);
5449 }
5450
5451 FORCEINLINE
5452 VOID
5453 WRITE_REGISTER_BUFFER_UCHAR(
5454 IN PUCHAR Register,
5455 IN PUCHAR Buffer,
5456 IN ULONG Count)
5457 {
5458 LONG Synch;
5459 __movsb(Register, Buffer, Count);
5460 InterlockedOr(&Synch, 1);
5461 }
5462
5463 FORCEINLINE
5464 VOID
5465 WRITE_REGISTER_BUFFER_ULONG(
5466 IN PULONG Register,
5467 IN PULONG Buffer,
5468 IN ULONG Count)
5469 {
5470 LONG Synch;
5471 __movsd(Register, Buffer, Count);
5472 InterlockedOr(&Synch, 1);
5473 }
5474
5475 FORCEINLINE
5476 VOID
5477 WRITE_REGISTER_BUFFER_USHORT(
5478 IN PUSHORT Register,
5479 IN PUSHORT Buffer,
5480 IN ULONG Count)
5481 {
5482 LONG Synch;
5483 __movsw(Register, Buffer, Count);
5484 InterlockedOr(&Synch, 1);
5485 }
5486
5487 FORCEINLINE
5488 VOID
5489 WRITE_REGISTER_UCHAR(
5490 IN PUCHAR Register,
5491 IN UCHAR Value)
5492 {
5493 LONG Synch;
5494 *Register = Value;
5495 InterlockedOr(&Synch, 1);
5496 }
5497
5498 FORCEINLINE
5499 VOID
5500 WRITE_REGISTER_ULONG(
5501 IN PULONG Register,
5502 IN ULONG Value)
5503 {
5504 LONG Synch;
5505 *Register = Value;
5506 InterlockedOr(&Synch, 1);
5507 }
5508
5509 FORCEINLINE
5510 VOID
5511 WRITE_REGISTER_USHORT(
5512 IN PUSHORT Register,
5513 IN USHORT Value)
5514 {
5515 LONG Sync;
5516 *Register = Value;
5517 InterlockedOr(&Sync, 1);
5518 }
5519
5520 #endif
5521
5522 /** I/O manager routines **/
5523
5524 NTKERNELAPI
5525 VOID
5526 NTAPI
5527 IoAcquireCancelSpinLock(
5528 OUT PKIRQL Irql);
5529
5530 NTKERNELAPI
5531 NTSTATUS
5532 NTAPI
5533 IoAcquireRemoveLockEx(
5534 IN PIO_REMOVE_LOCK RemoveLock,
5535 IN OPTIONAL PVOID Tag OPTIONAL,
5536 IN PCSTR File,
5537 IN ULONG Line,
5538 IN ULONG RemlockSize);
5539
5540 /*
5541 * NTSTATUS
5542 * IoAcquireRemoveLock(
5543 * IN PIO_REMOVE_LOCK RemoveLock,
5544 * IN OPTIONAL PVOID Tag)
5545 */
5546 #define IoAcquireRemoveLock(_RemoveLock, \
5547 _Tag) \
5548 IoAcquireRemoveLockEx(_RemoveLock, _Tag, __FILE__, __LINE__, sizeof(IO_REMOVE_LOCK))
5549
5550 /*
5551 * VOID
5552 * IoAdjustPagingPathCount(
5553 * IN PLONG Count,
5554 * IN BOOLEAN Increment)
5555 */
5556 #define IoAdjustPagingPathCount(_Count, \
5557 _Increment) \
5558 { \
5559 if (_Increment) \
5560 { \
5561 InterlockedIncrement(_Count); \
5562 } \
5563 else \
5564 { \
5565 InterlockedDecrement(_Count); \
5566 } \
5567 }
5568
5569 #ifndef DMA_MACROS_DEFINED
5570 NTKERNELAPI
5571 NTSTATUS
5572 NTAPI
5573 IoAllocateAdapterChannel(
5574 IN PADAPTER_OBJECT AdapterObject,
5575 IN PDEVICE_OBJECT DeviceObject,
5576 IN ULONG NumberOfMapRegisters,
5577 IN PDRIVER_CONTROL ExecutionRoutine,
5578 IN PVOID Context);
5579 #endif
5580
5581 NTKERNELAPI
5582 VOID
5583 NTAPI
5584 IoAllocateController(
5585 IN PCONTROLLER_OBJECT ControllerObject,
5586 IN PDEVICE_OBJECT DeviceObject,
5587 IN PDRIVER_CONTROL ExecutionRoutine,
5588 IN PVOID Context);
5589
5590 NTKERNELAPI
5591 NTSTATUS
5592 NTAPI
5593 IoAllocateDriverObjectExtension(
5594 IN PDRIVER_OBJECT DriverObject,
5595 IN PVOID ClientIdentificationAddress,
5596 IN ULONG DriverObjectExtensionSize,
5597 OUT PVOID *DriverObjectExtension);
5598
5599 NTKERNELAPI
5600 PVOID
5601 NTAPI
5602 IoAllocateErrorLogEntry(
5603 IN PVOID IoObject,
5604 IN UCHAR EntrySize);
5605
5606 NTKERNELAPI
5607 PIRP
5608 NTAPI
5609 IoAllocateIrp(
5610 IN CCHAR StackSize,
5611 IN BOOLEAN ChargeQuota);
5612
5613 NTKERNELAPI
5614 PMDL
5615 NTAPI
5616 IoAllocateMdl(
5617 IN PVOID VirtualAddress,
5618 IN ULONG Length,
5619 IN BOOLEAN SecondaryBuffer,
5620 IN BOOLEAN ChargeQuota,
5621 IN OUT PIRP Irp OPTIONAL);
5622
5623 NTKERNELAPI
5624 PIO_WORKITEM
5625 NTAPI
5626 IoAllocateWorkItem(
5627 IN PDEVICE_OBJECT DeviceObject);
5628
5629 /*
5630 * VOID IoAssignArcName(
5631 * IN PUNICODE_STRING ArcName,
5632 * IN PUNICODE_STRING DeviceName);
5633 */
5634 #define IoAssignArcName(_ArcName, _DeviceName) ( \
5635 IoCreateSymbolicLink((_ArcName), (_DeviceName)))
5636
5637 NTKERNELAPI
5638 NTSTATUS
5639 NTAPI
5640 IoAttachDevice(
5641 IN PDEVICE_OBJECT SourceDevice,
5642 IN PUNICODE_STRING TargetDevice,
5643 OUT PDEVICE_OBJECT *AttachedDevice);
5644
5645 NTKERNELAPI
5646 PDEVICE_OBJECT
5647 NTAPI
5648 IoAttachDeviceToDeviceStack(
5649 IN PDEVICE_OBJECT SourceDevice,
5650 IN PDEVICE_OBJECT TargetDevice);
5651
5652 NTKERNELAPI
5653 PIRP
5654 NTAPI
5655 IoBuildAsynchronousFsdRequest(
5656 IN ULONG MajorFunction,
5657 IN PDEVICE_OBJECT DeviceObject,
5658 IN OUT PVOID Buffer OPTIONAL,
5659 IN ULONG Length OPTIONAL,
5660 IN PLARGE_INTEGER StartingOffset OPTIONAL,
5661 IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL);
5662
5663 NTKERNELAPI
5664 PIRP
5665 NTAPI
5666 IoBuildDeviceIoControlRequest(
5667 IN ULONG IoControlCode,
5668 IN PDEVICE_OBJECT DeviceObject,
5669 IN PVOID InputBuffer OPTIONAL,
5670 IN ULONG InputBufferLength,
5671 OUT PVOID OutputBuffer OPTIONAL,
5672 IN ULONG OutputBufferLength,
5673 IN BOOLEAN InternalDeviceIoControl,
5674 IN PKEVENT Event,
5675 OUT PIO_STATUS_BLOCK IoStatusBlock);
5676
5677 NTKERNELAPI
5678 VOID
5679 NTAPI
5680 IoBuildPartialMdl(
5681 IN PMDL SourceMdl,
5682 IN OUT PMDL TargetMdl,
5683 IN PVOID VirtualAddress,
5684 IN ULONG Length);
5685
5686 NTKERNELAPI
5687 PIRP
5688 NTAPI
5689 IoBuildSynchronousFsdRequest(
5690 IN ULONG MajorFunction,
5691 IN PDEVICE_OBJECT DeviceObject,
5692 IN OUT PVOID Buffer OPTIONAL,
5693 IN ULONG Length OPTIONAL,
5694 IN PLARGE_INTEGER StartingOffset OPTIONAL,
5695 IN PKEVENT Event,
5696 OUT PIO_STATUS_BLOCK IoStatusBlock);
5697
5698 NTKERNELAPI
5699 NTSTATUS
5700 FASTCALL
5701 IofCallDriver(
5702 IN PDEVICE_OBJECT DeviceObject,
5703 IN OUT PIRP Irp);
5704
5705 /*
5706 * NTSTATUS
5707 * IoCallDriver(
5708 * IN PDEVICE_OBJECT DeviceObject,
5709 * IN OUT PIRP Irp)
5710 */
5711 #define IoCallDriver IofCallDriver
5712
5713 NTKERNELAPI
5714 VOID
5715 NTAPI
5716 IoCancelFileOpen(
5717 IN PDEVICE_OBJECT DeviceObject,
5718 IN PFILE_OBJECT FileObject);
5719
5720 NTKERNELAPI
5721 BOOLEAN
5722 NTAPI
5723 IoCancelIrp(
5724 IN PIRP Irp);
5725
5726 NTKERNELAPI
5727 NTSTATUS
5728 NTAPI
5729 IoCheckShareAccess(
5730 IN ACCESS_MASK DesiredAccess,
5731 IN ULONG DesiredShareAccess,
5732 IN OUT PFILE_OBJECT FileObject,
5733 IN OUT PSHARE_ACCESS ShareAccess,
5734 IN BOOLEAN Update);
5735
5736 NTKERNELAPI
5737 VOID
5738 FASTCALL
5739 IofCompleteRequest(
5740 IN PIRP Irp,
5741 IN CCHAR PriorityBoost);
5742
5743 /*
5744 * VOID
5745 * IoCompleteRequest(
5746 * IN PIRP Irp,
5747 * IN CCHAR PriorityBoost)
5748 */
5749 #define IoCompleteRequest IofCompleteRequest
5750
5751 NTKERNELAPI
5752 NTSTATUS
5753 NTAPI
5754 IoConnectInterrupt(
5755 OUT PKINTERRUPT *InterruptObject,
5756 IN PKSERVICE_ROUTINE ServiceRoutine,
5757 IN PVOID ServiceContext,
5758 IN PKSPIN_LOCK SpinLock OPTIONAL,
5759 IN ULONG Vector,
5760 IN KIRQL Irql,
5761 IN KIRQL SynchronizeIrql,
5762 IN KINTERRUPT_MODE InterruptMode,
5763 IN BOOLEAN ShareVector,
5764 IN KAFFINITY ProcessorEnableMask,
5765 IN BOOLEAN FloatingSave);
5766
5767 /*
5768 * PIO_STACK_LOCATION
5769 * IoGetCurrentIrpStackLocation(
5770 * IN PIRP Irp)
5771 */
5772 #define IoGetCurrentIrpStackLocation(_Irp) \
5773 ((_Irp)->Tail.Overlay.CurrentStackLocation)
5774
5775 /*
5776 * PIO_STACK_LOCATION
5777 * IoGetNextIrpStackLocation(
5778 * IN PIRP Irp)
5779 */
5780 #define IoGetNextIrpStackLocation(_Irp) \
5781 ((_Irp)->Tail.Overlay.CurrentStackLocation - 1)
5782
5783 /*
5784 * VOID
5785 * IoCopyCurrentIrpStackLocationToNext(
5786 * IN PIRP Irp)
5787 */
5788 #define IoCopyCurrentIrpStackLocationToNext(_Irp) \
5789 { \
5790 PIO_STACK_LOCATION _IrpSp; \
5791 PIO_STACK_LOCATION _NextIrpSp; \
5792 _IrpSp = IoGetCurrentIrpStackLocation(_Irp); \
5793 _NextIrpSp = IoGetNextIrpStackLocation(_Irp); \
5794 RtlCopyMemory(_NextIrpSp, _IrpSp, \
5795 FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine)); \
5796 _NextIrpSp->Control = 0; \
5797 }
5798
5799 NTKERNELAPI
5800 PCONTROLLER_OBJECT
5801 NTAPI
5802 IoCreateController(
5803 IN ULONG Size);
5804
5805 NTKERNELAPI
5806 NTSTATUS
5807 NTAPI
5808 IoCreateDevice(
5809 IN PDRIVER_OBJECT DriverObject,
5810 IN ULONG DeviceExtensionSize,
5811 IN PUNICODE_STRING DeviceName OPTIONAL,
5812 IN DEVICE_TYPE DeviceType,
5813 IN ULONG DeviceCharacteristics,
5814 IN BOOLEAN Exclusive,
5815 OUT PDEVICE_OBJECT *DeviceObject);
5816
5817 NTKERNELAPI
5818 NTSTATUS
5819 NTAPI
5820 IoCreateDisk(
5821 IN PDEVICE_OBJECT DeviceObject,
5822 IN PCREATE_DISK Disk);
5823
5824 NTKERNELAPI
5825 NTSTATUS
5826 NTAPI
5827 IoCreateFile(
5828 OUT PHANDLE FileHandle,
5829 IN ACCESS_MASK DesiredAccess,
5830 IN POBJECT_ATTRIBUTES ObjectAttributes,
5831 OUT PIO_STATUS_BLOCK IoStatusBlock,
5832 IN PLARGE_INTEGER AllocationSize OPTIONAL,
5833 IN ULONG FileAttributes,
5834 IN ULONG ShareAccess,
5835 IN ULONG Disposition,
5836 IN ULONG CreateOptions,
5837 IN PVOID EaBuffer OPTIONAL,
5838 IN ULONG EaLength,
5839 IN CREATE_FILE_TYPE CreateFileType,
5840 IN PVOID ExtraCreateParameters OPTIONAL,
5841 IN ULONG Options);
5842
5843 NTKERNELAPI
5844 PKEVENT
5845 NTAPI
5846 IoCreateNotificationEvent(
5847 IN PUNICODE_STRING EventName,
5848 OUT PHANDLE EventHandle);
5849
5850 NTKERNELAPI
5851 NTSTATUS
5852 NTAPI
5853 IoCreateSymbolicLink(
5854 IN PUNICODE_STRING SymbolicLinkName,
5855 IN PUNICODE_STRING DeviceName);
5856
5857 NTKERNELAPI
5858 PKEVENT
5859 NTAPI
5860 IoCreateSynchronizationEvent(
5861 IN PUNICODE_STRING EventName,
5862 OUT PHANDLE EventHandle);
5863
5864 NTKERNELAPI
5865 NTSTATUS
5866 NTAPI
5867 IoCreateUnprotectedSymbolicLink(
5868 IN PUNICODE_STRING SymbolicLinkName,
5869 IN PUNICODE_STRING DeviceName);
5870
5871 NTKERNELAPI
5872 NTSTATUS
5873 NTAPI
5874 IoCsqInitialize(
5875 PIO_CSQ Csq,
5876 IN PIO_CSQ_INSERT_IRP CsqInsertIrp,
5877 IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
5878 IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
5879 IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
5880 IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
5881 IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp);
5882
5883 NTKERNELAPI
5884 VOID
5885 NTAPI
5886 IoCsqInsertIrp(
5887 IN PIO_CSQ Csq,
5888 IN PIRP Irp,
5889 IN PIO_CSQ_IRP_CONTEXT Context);
5890
5891 NTKERNELAPI
5892 PIRP
5893 NTAPI
5894 IoCsqRemoveIrp(
5895 IN PIO_CSQ Csq,
5896 IN PIO_CSQ_IRP_CONTEXT Context);
5897
5898 NTKERNELAPI
5899 PIRP
5900 NTAPI
5901 IoCsqRemoveNextIrp(
5902 IN PIO_CSQ Csq,
5903 IN PVOID PeekContext);
5904
5905 NTKERNELAPI
5906 VOID
5907 NTAPI
5908 IoDeleteController(
5909 IN PCONTROLLER_OBJECT ControllerObject);
5910
5911 NTKERNELAPI
5912 VOID
5913 NTAPI
5914 IoDeleteDevice(
5915 IN PDEVICE_OBJECT DeviceObject);
5916
5917 NTKERNELAPI
5918 NTSTATUS
5919 NTAPI
5920 IoDeleteSymbolicLink(
5921 IN PUNICODE_STRING SymbolicLinkName);
5922
5923 /*
5924 * VOID
5925 * IoDeassignArcName(
5926 * IN PUNICODE_STRING ArcName)
5927 */
5928 #define IoDeassignArcName IoDeleteSymbolicLink
5929
5930 NTKERNELAPI
5931 VOID
5932 NTAPI
5933 IoDetachDevice(
5934 IN OUT PDEVICE_OBJECT TargetDevice);
5935
5936 NTKERNELAPI
5937 VOID
5938 NTAPI
5939 IoDisconnectInterrupt(
5940 IN PKINTERRUPT InterruptObject);
5941
5942 NTKERNELAPI
5943 BOOLEAN
5944 NTAPI
5945 IoForwardIrpSynchronously(
5946 IN PDEVICE_OBJECT DeviceObject,
5947 IN PIRP Irp);
5948
5949 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
5950
5951 NTKERNELAPI
5952 VOID
5953 NTAPI
5954 IoFreeController(
5955 IN PCONTROLLER_OBJECT ControllerObject);
5956
5957 NTKERNELAPI
5958 VOID
5959 NTAPI
5960 IoFreeErrorLogEntry(
5961 PVOID ElEntry);
5962
5963 NTKERNELAPI
5964 VOID
5965 NTAPI
5966 IoFreeIrp(
5967 IN PIRP Irp);
5968
5969 NTKERNELAPI
5970 VOID
5971 NTAPI
5972 IoFreeMdl(
5973 IN PMDL Mdl);
5974
5975 NTKERNELAPI
5976 VOID
5977 NTAPI
5978 IoFreeWorkItem(
5979 IN PIO_WORKITEM pIOWorkItem);
5980
5981 NTKERNELAPI
5982 PDEVICE_OBJECT
5983 NTAPI
5984 IoGetAttachedDevice(
5985 IN PDEVICE_OBJECT DeviceObject);
5986
5987 NTKERNELAPI
5988 PDEVICE_OBJECT
5989 NTAPI
5990 IoGetAttachedDeviceReference(
5991 IN PDEVICE_OBJECT DeviceObject);
5992
5993 NTKERNELAPI
5994 NTSTATUS
5995 NTAPI
5996 IoGetBootDiskInformation(
5997 IN OUT PBOOTDISK_INFORMATION BootDiskInformation,
5998 IN ULONG Size);
5999
6000 NTKERNELAPI
6001 PCONFIGURATION_INFORMATION
6002 NTAPI
6003 IoGetConfigurationInformation(
6004 VOID);
6005
6006 NTKERNELAPI
6007 PEPROCESS
6008 NTAPI
6009 IoGetCurrentProcess(
6010 VOID);
6011
6012 NTKERNELAPI
6013 NTSTATUS
6014 NTAPI
6015 IoGetDeviceInterfaceAlias(
6016 IN PUNICODE_STRING SymbolicLinkName,
6017 IN CONST GUID *AliasInterfaceClassGuid,
6018 OUT PUNICODE_STRING AliasSymbolicLinkName);
6019
6020 #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
6021
6022 NTKERNELAPI
6023 NTSTATUS
6024 NTAPI
6025 IoGetDeviceInterfaces(
6026 IN CONST GUID *InterfaceClassGuid,
6027 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
6028 IN ULONG Flags,
6029 OUT PWSTR *SymbolicLinkList);
6030
6031 NTKERNELAPI
6032 NTSTATUS
6033 NTAPI
6034 IoGetDeviceObjectPointer(
6035 IN PUNICODE_STRING ObjectName,
6036 IN ACCESS_MASK DesiredAccess,
6037 OUT PFILE_OBJECT *FileObject,
6038 OUT PDEVICE_OBJECT *DeviceObject);
6039
6040 NTKERNELAPI
6041 NTSTATUS
6042 NTAPI
6043 IoGetDeviceProperty(
6044 IN PDEVICE_OBJECT DeviceObject,
6045 IN DEVICE_REGISTRY_PROPERTY DeviceProperty,
6046 IN ULONG BufferLength,
6047 OUT PVOID PropertyBuffer,
6048 OUT PULONG ResultLength);
6049
6050 NTKERNELAPI
6051 PDEVICE_OBJECT
6052 NTAPI
6053 IoGetDeviceToVerify(
6054 IN PETHREAD Thread);
6055
6056 NTKERNELAPI
6057 PDMA_ADAPTER
6058 NTAPI
6059 IoGetDmaAdapter(
6060 IN PDEVICE_OBJECT PhysicalDeviceObject,
6061 IN PDEVICE_DESCRIPTION DeviceDescription,
6062 IN OUT PULONG NumberOfMapRegisters);
6063
6064 NTKERNELAPI
6065 PVOID
6066 NTAPI
6067 IoGetDriverObjectExtension(
6068 IN PDRIVER_OBJECT DriverObject,
6069 IN PVOID ClientIdentificationAddress);
6070
6071 NTKERNELAPI
6072 PGENERIC_MAPPING
6073 NTAPI
6074 IoGetFileObjectGenericMapping(
6075 VOID);
6076
6077 /*
6078 * ULONG
6079 * IoGetFunctionCodeFromCtlCode(
6080 * IN ULONG ControlCode)
6081 */
6082 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
6083 (((_ControlCode) >> 2) & 0x00000FFF)
6084
6085 NTKERNELAPI
6086 PVOID
6087 NTAPI
6088 IoGetInitialStack(
6089 VOID);
6090
6091 NTKERNELAPI
6092 PDEVICE_OBJECT
6093 NTAPI
6094 IoGetRelatedDeviceObject(
6095 IN PFILE_OBJECT FileObject);
6096
6097 NTKERNELAPI
6098 VOID
6099 NTAPI
6100 IoGetStackLimits(
6101 OUT PULONG_PTR LowLimit,
6102 OUT PULONG_PTR HighLimit);
6103
6104 FORCEINLINE
6105 ULONG_PTR
6106 IoGetRemainingStackSize(
6107 VOID
6108 )
6109 {
6110 ULONG_PTR End, Begin;
6111 ULONG_PTR Result;
6112
6113 IoGetStackLimits(&Begin, &End);
6114 Result = (ULONG_PTR)(&End) - Begin;
6115 return Result;
6116 }
6117
6118 NTKERNELAPI
6119 VOID
6120 NTAPI
6121 KeInitializeDpc(
6122 IN PRKDPC Dpc,
6123 IN PKDEFERRED_ROUTINE DeferredRoutine,
6124 IN PVOID DeferredContext);
6125
6126 /*
6127 * VOID
6128 * IoInitializeDpcRequest(
6129 * IN PDEVICE_OBJECT DeviceObject,
6130 * IN PIO_DPC_ROUTINE DpcRoutine)
6131 */
6132 #define IoInitializeDpcRequest(_DeviceObject, \
6133 _DpcRoutine) \
6134 KeInitializeDpc(&(_DeviceObject)->Dpc, \
6135 (PKDEFERRED_ROUTINE) (_DpcRoutine), \
6136 _DeviceObject)
6137
6138 NTKERNELAPI
6139 VOID
6140 NTAPI
6141 IoInitializeIrp(
6142 IN OUT PIRP Irp,
6143 IN USHORT PacketSize,
6144 IN CCHAR StackSize);
6145
6146 NTKERNELAPI
6147 VOID
6148 NTAPI
6149 IoInitializeRemoveLockEx(
6150 IN PIO_REMOVE_LOCK Lock,
6151 IN ULONG AllocateTag,
6152 IN ULONG MaxLockedMinutes,
6153 IN ULONG HighWatermark,
6154 IN ULONG RemlockSize);
6155
6156 /* VOID
6157 * IoInitializeRemoveLock(
6158 * IN PIO_REMOVE_LOCK Lock,
6159 * IN ULONG AllocateTag,
6160 * IN ULONG MaxLockedMinutes,
6161 * IN ULONG HighWatermark)
6162 */
6163 #define IoInitializeRemoveLock( \
6164 Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
6165 IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
6166 HighWatermark, sizeof(IO_REMOVE_LOCK))
6167
6168 NTKERNELAPI
6169 NTSTATUS
6170 NTAPI
6171 IoInitializeTimer(
6172 IN PDEVICE_OBJECT DeviceObject,
6173 IN PIO_TIMER_ROUTINE TimerRoutine,
6174 IN PVOID Context);
6175
6176 NTKERNELAPI
6177 VOID
6178 NTAPI
6179 IoInvalidateDeviceRelations(
6180 IN PDEVICE_OBJECT DeviceObject,
6181 IN DEVICE_RELATION_TYPE Type);
6182
6183 NTKERNELAPI
6184 VOID
6185 NTAPI
6186 IoInvalidateDeviceState(
6187 IN PDEVICE_OBJECT PhysicalDeviceObject);
6188
6189 NTKERNELAPI
6190 BOOLEAN
6191 NTAPI
6192 IoIs32bitProcess(
6193 IN PIRP Irp OPTIONAL);
6194
6195 /*
6196 * BOOLEAN
6197 * IoIsErrorUserInduced(
6198 * IN NTSTATUS Status);
6199 */
6200 #define IoIsErrorUserInduced(Status) \
6201 ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
6202 ((Status) == STATUS_IO_TIMEOUT) || \
6203 ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
6204 ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
6205 ((Status) == STATUS_VERIFY_REQUIRED) || \
6206 ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
6207 ((Status) == STATUS_WRONG_VOLUME)))
6208
6209 NTKERNELAPI
6210 BOOLEAN
6211 NTAPI
6212 IoIsWdmVersionAvailable(
6213 IN UCHAR MajorVersion,
6214 IN UCHAR MinorVersion);
6215
6216 NTKERNELAPI
6217 PIRP
6218 NTAPI
6219 IoMakeAssociatedIrp(
6220 IN PIRP Irp,
6221 IN CCHAR StackSize);
6222
6223 /*
6224 * VOID
6225 * IoMarkIrpPending(
6226 * IN OUT PIRP Irp)
6227 */
6228 #define IoMarkIrpPending(_Irp) \
6229 (IoGetCurrentIrpStackLocation(_Irp)->Control |= SL_PENDING_RETURNED)
6230
6231 NTKERNELAPI
6232 NTSTATUS
6233 NTAPI
6234 IoOpenDeviceInterfaceRegistryKey(
6235 IN PUNICODE_STRING SymbolicLinkName,
6236 IN ACCESS_MASK DesiredAccess,
6237 OUT PHANDLE DeviceInterfaceKey);
6238
6239 #define PLUGPLAY_REGKEY_DEVICE 1
6240 #define PLUGPLAY_REGKEY_DRIVER 2
6241 #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4
6242
6243 NTKERNELAPI
6244 NTSTATUS
6245 NTAPI
6246 IoOpenDeviceRegistryKey(
6247 IN PDEVICE_OBJECT DeviceObject,
6248 IN ULONG DevInstKeyType,
6249 IN ACCESS_MASK DesiredAccess,
6250 OUT PHANDLE DevInstRegKey);
6251
6252 NTKERNELAPI
6253 NTSTATUS
6254 NTAPI
6255 IoQueryDeviceDescription(
6256 IN PINTERFACE_TYPE BusType OPTIONAL,
6257 IN PULONG BusNumber OPTIONAL,
6258 IN PCONFIGURATION_TYPE ControllerType OPTIONAL,
6259 IN PULONG ControllerNumber OPTIONAL,
6260 IN PCONFIGURATION_TYPE PeripheralType OPTIONAL,
6261 IN PULONG PeripheralNumber OPTIONAL,
6262 IN PIO_QUERY_DEVICE_ROUTINE CalloutRoutine,
6263 IN PVOID Context);
6264
6265 NTKERNELAPI
6266 VOID
6267 NTAPI
6268 IoQueueWorkItem(
6269 IN PIO_WORKITEM pIOWorkItem,
6270 IN PIO_WORKITEM_ROUTINE Routine,
6271 IN WORK_QUEUE_TYPE QueueType,
6272 IN PVOID Context);
6273
6274 NTKERNELAPI
6275 VOID
6276 NTAPI
6277 IoRaiseHardError(
6278 IN PIRP Irp,
6279 IN PVPB Vpb OPTIONAL,
6280 IN PDEVICE_OBJECT RealDeviceObject);
6281
6282 NTKERNELAPI
6283 BOOLEAN
6284 NTAPI
6285 IoRaiseInformationalHardError(
6286 IN NTSTATUS ErrorStatus,
6287 IN PUNICODE_STRING String OPTIONAL,
6288 IN PKTHREAD Thread OPTIONAL);
6289
6290 NTKERNELAPI
6291 NTSTATUS
6292 NTAPI
6293 IoReadDiskSignature(
6294 IN PDEVICE_OBJECT DeviceObject,
6295 IN ULONG BytesPerSector,
6296 OUT PDISK_SIGNATURE Signature);
6297
6298 NTKERNELAPI
6299 NTSTATUS
6300 FASTCALL
6301 IoReadPartitionTable(
6302 IN PDEVICE_OBJECT DeviceObject,
6303 IN ULONG SectorSize,
6304 IN BOOLEAN ReturnRecognizedPartitions,
6305 OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer);
6306
6307 NTKERNELAPI
6308 NTSTATUS
6309 NTAPI
6310 IoReadPartitionTableEx(
6311 IN PDEVICE_OBJECT DeviceObject,
6312 IN struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer);
6313
6314 NTKERNELAPI
6315 VOID
6316 NTAPI
6317 IoRegisterBootDriverReinitialization(
6318 IN PDRIVER_OBJECT DriverObject,
6319 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
6320 IN PVOID Context);
6321
6322 NTKERNELAPI
6323 VOID
6324 NTAPI
6325 IoRegisterBootDriverReinitialization(
6326 IN PDRIVER_OBJECT DriverObject,
6327 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
6328 IN PVOID Context);
6329
6330 NTKERNELAPI
6331 NTSTATUS
6332 NTAPI
6333 IoRegisterDeviceInterface(
6334 IN PDEVICE_OBJECT PhysicalDeviceObject,
6335 IN CONST GUID *InterfaceClassGuid,
6336 IN PUNICODE_STRING ReferenceString OPTIONAL,
6337 OUT PUNICODE_STRING SymbolicLinkName);
6338
6339 NTKERNELAPI
6340 VOID
6341 NTAPI
6342 IoRegisterDriverReinitialization(
6343 IN PDRIVER_OBJECT DriverObject,
6344 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
6345 IN PVOID Context);
6346
6347 NTKERNELAPI
6348 NTSTATUS
6349 NTAPI
6350 IoRegisterPlugPlayNotification(
6351 IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
6352 IN ULONG EventCategoryFlags,
6353 IN PVOID EventCategoryData OPTIONAL,
6354 IN PDRIVER_OBJECT DriverObject,
6355 IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine,
6356 IN PVOID Context,
6357 OUT PVOID *NotificationEntry);
6358
6359 NTKERNELAPI
6360 NTSTATUS
6361 NTAPI
6362 IoRegisterShutdownNotification(
6363 IN PDEVICE_OBJECT DeviceObject);
6364
6365 NTKERNELAPI
6366 VOID
6367 NTAPI
6368 IoReleaseCancelSpinLock(
6369 IN KIRQL Irql);
6370
6371 NTKERNELAPI
6372 VOID
6373 NTAPI
6374 IoReleaseRemoveLockAndWaitEx(
6375 IN PIO_REMOVE_LOCK RemoveLock,
6376 IN PVOID Tag,
6377 IN ULONG RemlockSize);
6378
6379 NTKERNELAPI
6380 VOID
6381 NTAPI
6382 IoReleaseRemoveLockEx(
6383 IN PIO_REMOVE_LOCK RemoveLock,
6384 IN PVOID Tag,
6385 IN ULONG RemlockSize);
6386
6387 /*
6388 * VOID
6389 * IoReleaseRemoveLock(
6390 * IN PIO_REMOVE_LOCK RemoveLock,
6391 * IN PVOID Tag)
6392 */
6393 #define IoReleaseRemoveLock(_RemoveLock, \
6394 _Tag) \
6395 IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
6396
6397 /*
6398 * VOID
6399 * IoReleaseRemoveLockAndWait(
6400 * IN PIO_REMOVE_LOCK RemoveLock,
6401 * IN PVOID Tag)
6402 */
6403 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
6404 _Tag) \
6405 IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
6406
6407 NTKERNELAPI
6408 VOID
6409 NTAPI
6410 IoRemoveShareAccess(
6411 IN PFILE_OBJECT FileObject,
6412 IN OUT PSHARE_ACCESS ShareAccess);
6413
6414 NTKERNELAPI
6415 NTSTATUS
6416 NTAPI
6417 IoReportDetectedDevice(
6418 IN PDRIVER_OBJECT DriverObject,
6419 IN INTERFACE_TYPE LegacyBusType,
6420 IN ULONG BusNumber,
6421 IN ULONG SlotNumber,
6422 IN PCM_RESOURCE_LIST ResourceList,
6423 IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL,
6424 IN BOOLEAN ResourceAssigned,
6425 IN OUT PDEVICE_OBJECT *DeviceObject);
6426
6427 NTKERNELAPI
6428 NTSTATUS
6429 NTAPI
6430 IoReportResourceForDetection(
6431 IN PDRIVER_OBJECT DriverObject,
6432 IN PCM_RESOURCE_LIST DriverList OPTIONAL,
6433 IN ULONG DriverListSize OPTIONAL,
6434 IN PDEVICE_OBJECT DeviceObject OPTIONAL,
6435 IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
6436 IN ULONG DeviceListSize OPTIONAL,
6437 OUT PBOOLEAN ConflictDetected);
6438
6439 NTKERNELAPI
6440 NTSTATUS
6441 NTAPI
6442 IoReportResourceUsage(
6443 IN PUNICODE_STRING DriverClassName OPTIONAL,
6444 IN PDRIVER_OBJECT DriverObject,
6445 IN PCM_RESOURCE_LIST DriverList OPTIONAL,
6446 IN ULONG DriverListSize OPTIONAL,
6447 IN PDEVICE_OBJECT DeviceObject,
6448 IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
6449 IN ULONG DeviceListSize OPTIONAL,
6450 IN BOOLEAN OverrideConflict,
6451 OUT PBOOLEAN ConflictDetected);
6452
6453 NTKERNELAPI
6454 NTSTATUS
6455 NTAPI
6456 IoReportTargetDeviceChange(
6457 IN PDEVICE_OBJECT PhysicalDeviceObject,
6458 IN PVOID NotificationStructure);
6459
6460 NTKERNELAPI
6461 NTSTATUS
6462 NTAPI
6463 IoReportTargetDeviceChangeAsynchronous(
6464 IN PDEVICE_OBJECT PhysicalDeviceObject,
6465 IN PVOID NotificationStructure,
6466 IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL,
6467 IN PVOID Context OPTIONAL);
6468
6469 NTKERNELAPI
6470 VOID
6471 NTAPI
6472 IoRequestDeviceEject(
6473 IN PDEVICE_OBJECT PhysicalDeviceObject);
6474
6475 /*
6476 * VOID
6477 * IoRequestDpc(
6478 * IN PDEVICE_OBJECT DeviceObject,
6479 * IN PIRP Irp,
6480 * IN PVOID Context);
6481 */
6482 #define IoRequestDpc(DeviceObject, Irp, Context)( \
6483 KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
6484
6485 NTKERNELAPI
6486 VOID
6487 NTAPI
6488 IoReuseIrp(
6489 IN OUT PIRP Irp,
6490 IN NTSTATUS Status);
6491
6492 /*
6493 * PDRIVER_CANCEL
6494 * IoSetCancelRoutine(
6495 * IN PIRP Irp,
6496 * IN PDRIVER_CANCEL CancelRoutine)
6497 */
6498 #define IoSetCancelRoutine(_Irp, \
6499 _CancelRoutine) \
6500 ((PDRIVER_CANCEL) InterlockedExchangePointer( \
6501 (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (_CancelRoutine)))
6502
6503 /*
6504 * VOID
6505 * IoSetCompletionRoutine(
6506 * IN PIRP Irp,
6507 * IN PIO_COMPLETION_ROUTINE CompletionRoutine,
6508 * IN PVOID Context,
6509 * IN BOOLEAN InvokeOnSuccess,
6510 * IN BOOLEAN InvokeOnError,
6511 * IN BOOLEAN InvokeOnCancel)
6512 */
6513 #define IoSetCompletionRoutine(_Irp, \
6514 _CompletionRoutine, \
6515 _Context, \
6516 _InvokeOnSuccess, \
6517 _InvokeOnError, \
6518 _InvokeOnCancel) \
6519 { \
6520 PIO_STACK_LOCATION _IrpSp; \
6521 ASSERT((_InvokeOnSuccess) || (_InvokeOnError) || (_InvokeOnCancel) ? \
6522 (_CompletionRoutine) != NULL : TRUE); \
6523 _IrpSp = IoGetNextIrpStackLocation(_Irp); \
6524 _IrpSp->CompletionRoutine = (PIO_COMPLETION_ROUTINE)(_CompletionRoutine); \
6525 _IrpSp->Context = (_Context); \
6526 _IrpSp->Control = 0; \
6527 if (_InvokeOnSuccess) _IrpSp->Control = SL_INVOKE_ON_SUCCESS; \
6528 if (_InvokeOnError) _IrpSp->Control |= SL_INVOKE_ON_ERROR; \
6529 if (_InvokeOnCancel) _IrpSp->Control |= SL_INVOKE_ON_CANCEL; \
6530 }
6531
6532 NTKERNELAPI
6533 NTSTATUS
6534 NTAPI
6535 IoSetCompletionRoutineEx(
6536 IN PDEVICE_OBJECT DeviceObject,
6537 IN PIRP Irp,
6538 IN PIO_COMPLETION_ROUTINE CompletionRoutine,
6539 IN PVOID Context,
6540 IN BOOLEAN InvokeOnSuccess,
6541 IN BOOLEAN InvokeOnError,
6542 IN BOOLEAN InvokeOnCancel);
6543
6544 NTKERNELAPI
6545 NTSTATUS
6546 NTAPI
6547 IoSetDeviceInterfaceState(
6548 IN PUNICODE_STRING SymbolicLinkName,
6549 IN BOOLEAN Enable);
6550
6551 NTKERNELAPI
6552 VOID
6553 NTAPI
6554 IoSetHardErrorOrVerifyDevice(
6555 IN PIRP Irp,
6556 IN PDEVICE_OBJECT DeviceObject);
6557
6558 /*
6559 * VOID
6560 * IoSetNextIrpStackLocation(
6561 * IN OUT PIRP Irp)
6562 */
6563 #define IoSetNextIrpStackLocation(_Irp) \
6564 { \
6565 (_Irp)->CurrentLocation--; \
6566 (_Irp)->Tail.Overlay.CurrentStackLocation--; \
6567 }
6568
6569 NTKERNELAPI
6570 NTSTATUS
6571 FASTCALL
6572 IoSetPartitionInformation(
6573 IN PDEVICE_OBJECT DeviceObject,
6574 IN ULONG SectorSize,
6575 IN ULONG PartitionNumber,
6576 IN ULONG PartitionType);
6577
6578 NTKERNELAPI
6579 NTSTATUS
6580 NTAPI
6581 IoSetPartitionInformationEx(
6582 IN PDEVICE_OBJECT DeviceObject,
6583 IN ULONG PartitionNumber,
6584 IN struct _SET_PARTITION_INFORMATION_EX *PartitionInfo);
6585
6586 NTKERNELAPI
6587 VOID
6588 NTAPI
6589 IoSetShareAccess(
6590 IN ACCESS_MASK DesiredAccess,
6591 IN ULONG DesiredShareAccess,
6592 IN OUT PFILE_OBJECT FileObject,
6593 OUT PSHARE_ACCESS ShareAccess);
6594
6595 NTKERNELAPI
6596 VOID
6597 NTAPI
6598 IoSetStartIoAttributes(
6599 IN PDEVICE_OBJECT DeviceObject,
6600 IN BOOLEAN DeferredStartIo,
6601 IN BOOLEAN NonCancelable);
6602
6603 NTKERNELAPI
6604 NTSTATUS
6605 NTAPI
6606 IoSetSystemPartition(
6607 IN PUNICODE_STRING VolumeNameString);
6608
6609 NTKERNELAPI
6610 BOOLEAN
6611 NTAPI
6612 IoSetThreadHardErrorMode(
6613 IN BOOLEAN EnableHardErrors);
6614
6615 /*
6616 * USHORT
6617 * IoSizeOfIrp(
6618 * IN CCHAR StackSize)
6619 */
6620 #define IoSizeOfIrp(_StackSize) \
6621 ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
6622
6623 /*
6624 * VOID
6625 * IoSkipCurrentIrpStackLocation(
6626 * IN PIRP Irp)
6627 */
6628 #define IoSkipCurrentIrpStackLocation(_Irp) \
6629 { \
6630 (_Irp)->CurrentLocation++; \
6631 (_Irp)->Tail.Overlay.CurrentStackLocation++; \
6632 }
6633
6634 NTKERNELAPI
6635 VOID
6636 NTAPI
6637 IoStartNextPacket(
6638 IN PDEVICE_OBJECT DeviceObject,
6639 IN BOOLEAN Cancelable);
6640
6641 NTKERNELAPI
6642 VOID
6643 NTAPI
6644 IoStartNextPacketByKey(
6645 IN PDEVICE_OBJECT DeviceObject,
6646 IN BOOLEAN Cancelable,
6647 IN ULONG Key);
6648
6649 NTKERNELAPI
6650 VOID
6651 NTAPI
6652 IoStartPacket(
6653 IN PDEVICE_OBJECT DeviceObject,
6654 IN PIRP Irp,
6655 IN PULONG Key OPTIONAL,
6656 IN PDRIVER_CANCEL CancelFunction OPTIONAL);
6657
6658 NTKERNELAPI
6659 VOID
6660 NTAPI
6661 IoStartTimer(
6662 IN PDEVICE_OBJECT DeviceObject);
6663
6664 NTKERNELAPI
6665 VOID
6666 NTAPI
6667 IoStopTimer(
6668 IN PDEVICE_OBJECT DeviceObject);
6669
6670 NTKERNELAPI
6671 NTSTATUS
6672 NTAPI
6673 IoUnregisterPlugPlayNotification(
6674 IN PVOID NotificationEntry);
6675
6676 NTKERNELAPI
6677 VOID
6678 NTAPI
6679 IoUnregisterShutdownNotification(
6680 IN PDEVICE_OBJECT DeviceObject);
6681
6682 NTKERNELAPI
6683 VOID
6684 NTAPI
6685 IoUpdateShareAccess(
6686 IN PFILE_OBJECT FileObject,
6687 IN OUT PSHARE_ACCESS ShareAccess);
6688
6689 NTKERNELAPI
6690 NTSTATUS
6691 NTAPI
6692 IoVerifyPartitionTable(
6693 IN PDEVICE_OBJECT DeviceObject,
6694 IN BOOLEAN FixErrors);
6695
6696 NTKERNELAPI
6697 NTSTATUS
6698 NTAPI
6699 IoVolumeDeviceToDosName(
6700 IN PVOID VolumeDeviceObject,
6701 OUT PUNICODE_STRING DosName);
6702
6703 NTKERNELAPI
6704 NTSTATUS
6705 NTAPI
6706 IoWMIAllocateInstanceIds(
6707 IN GUID *Guid,
6708 IN ULONG InstanceCount,
6709 OUT ULONG *FirstInstanceId);
6710
6711 NTKERNELAPI
6712 ULONG
6713 NTAPI
6714 IoWMIDeviceObjectToProviderId(
6715 IN PDEVICE_OBJECT DeviceObject);
6716
6717 NTKERNELAPI
6718 NTSTATUS
6719 NTAPI
6720 IoWMIDeviceObjectToInstanceName(
6721 IN PVOID DataBlockObject,
6722 IN PDEVICE_OBJECT DeviceObject,
6723 OUT PUNICODE_STRING InstanceName);
6724
6725 NTKERNELAPI
6726 NTSTATUS
6727 NTAPI
6728 IoWMIExecuteMethod(
6729 IN PVOID DataBlockObject,
6730 IN PUNICODE_STRING InstanceName,
6731 IN ULONG MethodId,
6732 IN ULONG InBufferSize,
6733 IN OUT PULONG OutBufferSize,
6734 IN OUT PUCHAR InOutBuffer);
6735
6736 NTKERNELAPI
6737 NTSTATUS
6738 NTAPI
6739 IoWMIHandleToInstanceName(
6740 IN PVOID DataBlockObject,
6741 IN HANDLE FileHandle,
6742 OUT PUNICODE_STRING InstanceName);
6743
6744 NTKERNELAPI
6745 NTSTATUS
6746 NTAPI
6747 IoWMIOpenBlock(
6748 IN GUID *DataBlockGuid,
6749 IN ULONG DesiredAccess,
6750 OUT PVOID *DataBlockObject);
6751
6752 NTKERNELAPI
6753 NTSTATUS
6754 NTAPI
6755 IoWMIQueryAllData(
6756 IN PVOID DataBlockObject,
6757 IN OUT ULONG *InOutBufferSize,
6758 OUT PVOID OutBuffer);
6759
6760 NTKERNELAPI
6761 NTSTATUS
6762 NTAPI
6763 IoWMIQueryAllDataMultiple(
6764 IN PVOID *DataBlockObjectList,
6765 IN ULONG ObjectCount,
6766 IN OUT ULONG *InOutBufferSize,
6767 OUT PVOID OutBuffer);
6768
6769 NTKERNELAPI
6770 NTSTATUS
6771 NTAPI
6772 IoWMIQuerySingleInstance(
6773 IN PVOID DataBlockObject,
6774 IN PUNICODE_STRING InstanceName,
6775 IN OUT ULONG *InOutBufferSize,
6776 OUT PVOID OutBuffer);
6777
6778 NTKERNELAPI
6779 NTSTATUS
6780 NTAPI
6781 IoWMIQuerySingleInstanceMultiple(
6782 IN PVOID *DataBlockObjectList,
6783 IN PUNICODE_STRING InstanceNames,
6784 IN ULONG ObjectCount,
6785 IN OUT ULONG *InOutBufferSize,
6786 OUT PVOID OutBuffer);
6787
6788 NTKERNELAPI
6789 NTSTATUS
6790 NTAPI
6791 IoWMIRegistrationControl(
6792 IN PDEVICE_OBJECT DeviceObject,
6793 IN ULONG Action);
6794
6795 NTKERNELAPI
6796 NTSTATUS
6797 NTAPI
6798 IoWMISetNotificationCallback(
6799 IN PVOID Object,
6800 IN WMI_NOTIFICATION_CALLBACK Callback,
6801 IN PVOID Context);
6802
6803 NTKERNELAPI
6804 NTSTATUS
6805 NTAPI
6806 IoWMISetSingleInstance(
6807 IN PVOID DataBlockObject,
6808 IN PUNICODE_STRING InstanceName,
6809 IN ULONG Version,
6810 IN ULONG ValueBufferSize,
6811 IN PVOID ValueBuffer);
6812
6813 NTKERNELAPI
6814 NTSTATUS
6815 NTAPI
6816 IoWMISetSingleItem(
6817 IN PVOID DataBlockObject,
6818 IN PUNICODE_STRING InstanceName,
6819 IN ULONG DataItemId,
6820 IN ULONG Version,
6821 IN ULONG ValueBufferSize,
6822 IN PVOID ValueBuffer);
6823
6824 NTKERNELAPI
6825 NTSTATUS
6826 NTAPI
6827 IoWMISuggestInstanceName(
6828 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
6829 IN PUNICODE_STRING SymbolicLinkName OPTIONAL,
6830 IN BOOLEAN CombineNames,
6831 OUT PUNICODE_STRING SuggestedInstanceName);
6832
6833 NTKERNELAPI
6834 NTSTATUS
6835 NTAPI
6836 IoWMIWriteEvent(
6837 IN PVOID WnodeEventItem);
6838
6839 NTKERNELAPI
6840 VOID
6841 NTAPI
6842 IoWriteErrorLogEntry(
6843 IN PVOID ElEntry);
6844
6845 NTKERNELAPI
6846 NTSTATUS
6847 FASTCALL
6848 IoWritePartitionTable(
6849 IN PDEVICE_OBJECT DeviceObject,
6850 IN ULONG SectorSize,
6851 IN ULONG SectorsPerTrack,
6852 IN ULONG NumberOfHeads,
6853 IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer);
6854
6855 NTKERNELAPI
6856 NTSTATUS
6857 NTAPI
6858 IoWritePartitionTableEx(
6859 IN PDEVICE_OBJECT DeviceObject,
6860 IN struct _DRIVE_LAYOUT_INFORMATION_EX *PartitionBuffer);
6861
6862
6863
6864 /** Kernel routines **/
6865
6866 #if defined (_M_AMD64)
6867 NTKERNELAPI
6868 VOID
6869 FASTCALL
6870 KeAcquireInStackQueuedSpinLock(
6871 IN PKSPIN_LOCK SpinLock,
6872 IN PKLOCK_QUEUE_HANDLE LockHandle);
6873
6874 NTKERNELAPI
6875 VOID
6876 FASTCALL
6877 KeReleaseInStackQueuedSpinLock(
6878 IN PKLOCK_QUEUE_HANDLE LockHandle);
6879 #else
6880 NTHALAPI
6881 VOID
6882 FASTCALL
6883 KeAcquireInStackQueuedSpinLock(
6884 IN PKSPIN_LOCK SpinLock,
6885 IN PKLOCK_QUEUE_HANDLE LockHandle);
6886
6887 NTHALAPI
6888 VOID
6889 FASTCALL
6890 KeReleaseInStackQueuedSpinLock(
6891 IN PKLOCK_QUEUE_HANDLE LockHandle);
6892 #endif
6893
6894 NTKERNELAPI
6895 VOID
6896 FASTCALL
6897 KeAcquireInStackQueuedSpinLockAtDpcLevel(
6898 IN PKSPIN_LOCK SpinLock,
6899 IN PKLOCK_QUEUE_HANDLE LockHandle);
6900
6901 NTKERNELAPI
6902 KIRQL
6903 NTAPI
6904 KeAcquireInterruptSpinLock(
6905 IN PKINTERRUPT Interrupt);
6906
6907 NTKERNELAPI
6908 BOOLEAN
6909 NTAPI
6910 KeAreApcsDisabled(
6911 VOID);
6912
6913 NTKERNELAPI
6914 DECLSPEC_NORETURN
6915 VOID
6916 NTAPI
6917 KeBugCheck(
6918 IN ULONG BugCheckCode);
6919
6920 NTKERNELAPI
6921 DECLSPEC_NORETURN
6922 VOID
6923 NTAPI
6924 KeBugCheckEx(
6925 IN ULONG BugCheckCode,
6926 IN ULONG_PTR BugCheckParameter1,
6927 IN ULONG_PTR BugCheckParameter2,
6928 IN ULONG_PTR BugCheckParameter3,
6929 IN ULONG_PTR BugCheckParameter4);
6930
6931 NTKERNELAPI
6932 BOOLEAN
6933 NTAPI
6934 KeCancelTimer(
6935 IN PKTIMER Timer);
6936
6937 NTKERNELAPI
6938 VOID
6939 NTAPI
6940 KeClearEvent(
6941 IN PRKEVENT Event);
6942
6943 NTKERNELAPI
6944 NTSTATUS
6945 NTAPI
6946 KeDelayExecutionThread(
6947 IN KPROCESSOR_MODE WaitMode,
6948 IN BOOLEAN Alertable,
6949 IN PLARGE_INTEGER Interval);
6950
6951 NTKERNELAPI
6952 BOOLEAN
6953 NTAPI
6954 KeDeregisterBugCheckCallback(
6955 IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord);
6956
6957 NTKERNELAPI
6958 VOID
6959 NTAPI
6960 KeEnterCriticalRegion(
6961 VOID);
6962
6963 /*
6964 * VOID
6965 * KeFlushIoBuffers(
6966 * IN PMDL Mdl,
6967 * IN BOOLEAN ReadOperation,
6968 * IN BOOLEAN DmaOperation)
6969 */
6970 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
6971
6972 #define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql))
6973 #define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql))
6974 #define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock)
6975 #define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock)
6976
6977 NTKERNELAPI
6978 VOID
6979 NTAPI
6980 KeFlushQueuedDpcs(
6981 VOID
6982 );
6983
6984 NTHALAPI
6985 VOID
6986 NTAPI
6987 KeFlushWriteBuffer(VOID);
6988
6989 NTKERNELAPI
6990 ULONG
6991 NTAPI
6992 KeGetRecommendedSharedDataAlignment(
6993 VOID);
6994
6995 NTKERNELAPI
6996 VOID
6997 NTAPI
6998 KeInitializeDeviceQueue(
6999 IN PKDEVICE_QUEUE DeviceQueue);
7000
7001 NTKERNELAPI
7002 VOID
7003 NTAPI
7004 KeInitializeMutex(
7005 IN PRKMUTEX Mutex,
7006 IN ULONG Level);
7007
7008 NTKERNELAPI
7009 VOID
7010 NTAPI
7011 KeInitializeSemaphore(
7012 IN PRKSEMAPHORE Semaphore,
7013 IN LONG Count,
7014 IN LONG Limit);
7015
7016 NTKERNELAPI
7017 VOID
7018 NTAPI
7019 KeInitializeTimer(
7020 IN PKTIMER Timer);
7021
7022 NTKERNELAPI
7023 VOID
7024 NTAPI
7025 KeInitializeTimerEx(
7026 IN PKTIMER Timer,
7027 IN TIMER_TYPE Type);
7028
7029 NTKERNELAPI
7030 BOOLEAN
7031 NTAPI
7032 KeInsertByKeyDeviceQueue(
7033 IN PKDEVICE_QUEUE DeviceQueue,
7034 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry,
7035 IN ULONG SortKey);
7036
7037 NTKERNELAPI
7038 BOOLEAN
7039 NTAPI
7040 KeInsertDeviceQueue(
7041 IN PKDEVICE_QUEUE DeviceQueue,
7042 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
7043
7044 NTKERNELAPI
7045 BOOLEAN
7046 NTAPI
7047 KeInsertQueueDpc(
7048 IN PRKDPC Dpc,
7049 IN PVOID SystemArgument1,
7050 IN PVOID SystemArgument2);
7051
7052 NTKERNELAPI
7053 VOID
7054 NTAPI
7055 KeLeaveCriticalRegion(
7056 VOID);
7057
7058 #ifdef _X86_
7059
7060 static __inline
7061 VOID
7062 KeMemoryBarrier(
7063 VOID)
7064 {
7065 volatile LONG Barrier;
7066 #if defined(__GNUC__)
7067 __asm__ __volatile__ ("xchg %%eax, %0" : : "m" (Barrier) : "%eax");
7068 #elif defined(_MSC_VER)
7069 __asm xchg [Barrier], eax
7070 #endif
7071 }
7072
7073 #endif
7074
7075 NTKERNELAPI
7076 LONG
7077 NTAPI
7078 KePulseEvent(
7079 IN PRKEVENT Event,
7080 IN KPRIORITY Increment,
7081 IN BOOLEAN Wait);
7082
7083 NTKERNELAPI
7084 KAFFINITY
7085 NTAPI
7086 KeQueryActiveProcessors(
7087 VOID
7088 );
7089
7090 NTHALAPI
7091 LARGE_INTEGER
7092 NTAPI
7093 KeQueryPerformanceCounter(
7094 OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL);
7095
7096 NTKERNELAPI
7097 KPRIORITY
7098 NTAPI
7099 KeQueryPriorityThread(
7100 IN PRKTHREAD Thread);
7101
7102 NTKERNELAPI
7103 ULONG
7104 NTAPI
7105 KeQueryRuntimeThread(
7106 IN PKTHREAD Thread,
7107 OUT PULONG UserTime);
7108
7109 #if !defined(_M_AMD64)
7110 NTKERNELAPI
7111 ULONGLONG
7112 NTAPI
7113 KeQueryInterruptTime(
7114 VOID);
7115
7116 NTKERNELAPI
7117 VOID
7118 NTAPI
7119 KeQuerySystemTime(
7120 OUT PLARGE_INTEGER CurrentTime);
7121
7122 NTKERNELAPI
7123 VOID
7124 NTAPI
7125 KeQueryTickCount(
7126 OUT PLARGE_INTEGER TickCount);
7127 #endif
7128
7129 NTKERNELAPI
7130 ULONG
7131 NTAPI
7132 KeQueryTimeIncrement(
7133 VOID);
7134
7135 NTKERNELAPI
7136 LONG
7137 NTAPI
7138 KeReadStateEvent(
7139 IN PRKEVENT Event);
7140
7141 NTKERNELAPI
7142 LONG
7143 NTAPI
7144 KeReadStateMutex(
7145 IN PRKMUTEX Mutex);
7146
7147
7148 NTKERNELAPI
7149 LONG
7150 NTAPI
7151 KeReadStateSemaphore(
7152 IN PRKSEMAPHORE Semaphore);
7153
7154 NTKERNELAPI
7155 BOOLEAN
7156 NTAPI
7157 KeReadStateTimer(
7158 IN PKTIMER Timer);
7159
7160 NTKERNELAPI
7161 BOOLEAN
7162 NTAPI
7163 KeRegisterBugCheckCallback(
7164 IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord,
7165 IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine,
7166 IN PVOID Buffer,
7167 IN ULONG Length,
7168 IN PUCHAR Component);
7169
7170 NTKERNELAPI
7171 PVOID
7172 NTAPI
7173 KeRegisterNmiCallback(
7174 IN PNMI_CALLBACK CallbackRoutine,
7175 IN PVOID Context
7176 );
7177
7178 NTKERNELAPI
7179 NTSTATUS
7180 NTAPI
7181 KeDeregisterNmiCallback(
7182 IN PVOID Handle
7183 );
7184
7185 NTKERNELAPI
7186 VOID
7187 FASTCALL
7188 KeReleaseInStackQueuedSpinLockFromDpcLevel(
7189 IN PKLOCK_QUEUE_HANDLE LockHandle);
7190
7191 NTKERNELAPI
7192 VOID
7193 NTAPI
7194 KeReleaseInterruptSpinLock(
7195 IN PKINTERRUPT Interrupt,
7196 IN KIRQL OldIrql);
7197
7198 NTKERNELAPI
7199 LONG
7200 NTAPI
7201 KeReleaseMutex(
7202 IN PRKMUTEX Mutex,
7203 IN BOOLEAN Wait);
7204
7205 NTKERNELAPI
7206 LONG
7207 NTAPI
7208 KeReleaseSemaphore(
7209 IN PRKSEMAPHORE Semaphore,
7210 IN KPRIORITY Increment,
7211 IN LONG Adjustment,
7212 IN BOOLEAN Wait);
7213
7214 NTKERNELAPI
7215 PKDEVICE_QUEUE_ENTRY
7216 NTAPI
7217 KeRemoveByKeyDeviceQueue(
7218 IN PKDEVICE_QUEUE DeviceQueue,
7219 IN ULONG SortKey);
7220
7221 NTKERNELAPI
7222 PKDEVICE_QUEUE_ENTRY
7223 NTAPI
7224 KeRemoveDeviceQueue(
7225 IN PKDEVICE_QUEUE DeviceQueue);
7226
7227 NTKERNELAPI
7228 BOOLEAN
7229 NTAPI
7230 KeRemoveEntryDeviceQueue(
7231 IN PKDEVICE_QUEUE DeviceQueue,
7232 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
7233
7234 NTKERNELAPI
7235 BOOLEAN
7236 NTAPI
7237 KeRemoveQueueDpc(
7238 IN PRKDPC Dpc);
7239
7240 NTKERNELAPI
7241 LONG
7242 NTAPI
7243 KeResetEvent(
7244 IN PRKEVENT Event);
7245
7246 NTKERNELAPI
7247 NTSTATUS
7248 NTAPI
7249 KeRestoreFloatingPointState(
7250 IN PKFLOATING_SAVE FloatSave);
7251
7252 NTKERNELAPI
7253 VOID
7254 NTAPI
7255 KeRevertToUserAffinityThread(VOID);
7256
7257 NTKERNELAPI
7258 NTSTATUS
7259 NTAPI
7260 KeSaveFloatingPointState(
7261 OUT PKFLOATING_SAVE FloatSave);
7262
7263 NTKERNELAPI
7264 LONG
7265 NTAPI
7266 KeSetBasePriorityThread(
7267 IN PRKTHREAD Thread,
7268 IN LONG Increment);
7269
7270 NTKERNELAPI
7271 LONG
7272 NTAPI
7273 KeSetEvent(
7274 IN PRKEVENT Event,
7275 IN KPRIORITY Increment,
7276 IN BOOLEAN Wait);
7277
7278 NTKERNELAPI
7279 VOID
7280 NTAPI
7281 KeSetImportanceDpc(
7282 IN PRKDPC Dpc,
7283 IN KDPC_IMPORTANCE Importance);
7284
7285 NTKERNELAPI
7286 KPRIORITY
7287 NTAPI
7288 KeSetPriorityThread(
7289 IN PKTHREAD Thread,
7290 IN KPRIORITY Priority);
7291
7292 NTKERNELAPI
7293 VOID
7294 NTAPI
7295 KeSetSystemAffinityThread(
7296 IN KAFFINITY Affinity);
7297
7298 NTKERNELAPI
7299 VOID
7300 NTAPI
7301 KeSetTargetProcessorDpc(
7302 IN PRKDPC Dpc,
7303 IN CCHAR Number);
7304
7305 NTKERNELAPI
7306 BOOLEAN
7307 NTAPI
7308 KeSetTimer(
7309 IN PKTIMER Timer,
7310 IN LARGE_INTEGER DueTime,
7311 IN PKDPC Dpc OPTIONAL);
7312
7313 NTKERNELAPI
7314 BOOLEAN
7315 NTAPI
7316 KeSetTimerEx(
7317 IN PKTIMER Timer,
7318 IN LARGE_INTEGER DueTime,
7319 IN LONG Period OPTIONAL,
7320 IN PKDPC Dpc OPTIONAL);
7321
7322 NTKERNELAPI
7323 VOID
7324 FASTCALL
7325 KeSetTimeUpdateNotifyRoutine(
7326 IN PTIME_UPDATE_NOTIFY_ROUTINE NotifyRoutine);
7327
7328 NTHALAPI
7329 VOID
7330 NTAPI
7331 KeStallExecutionProcessor(
7332 IN ULONG MicroSeconds);
7333
7334 NTKERNELAPI
7335 BOOLEAN
7336 NTAPI
7337 KeSynchronizeExecution(
7338 IN PKINTERRUPT Interrupt,
7339 IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine,
7340 IN PVOID SynchronizeContext);
7341
7342 NTKERNELAPI
7343 NTSTATUS
7344 NTAPI
7345 KeWaitForMultipleObjects(
7346 IN ULONG Count,
7347 IN PVOID Object[],
7348 IN WAIT_TYPE WaitType,
7349 IN KWAIT_REASON WaitReason,
7350 IN KPROCESSOR_MODE WaitMode,
7351 IN BOOLEAN Alertable,
7352 IN PLARGE_INTEGER Timeout OPTIONAL,
7353 IN PKWAIT_BLOCK WaitBlockArray OPTIONAL);
7354
7355 NTKERNELAPI
7356 NTSTATUS
7357 NTAPI
7358 KeWaitForMutexObject(
7359 IN PRKMUTEX Mutex,
7360 IN KWAIT_REASON WaitReason,
7361 IN KPROCESSOR_MODE WaitMode,
7362 IN BOOLEAN Alertable,
7363 IN PLARGE_INTEGER Timeout OPTIONAL);
7364
7365 NTKERNELAPI
7366 NTSTATUS
7367 NTAPI
7368 KeWaitForSingleObject(
7369 IN PVOID Object,
7370 IN KWAIT_REASON WaitReason,
7371 IN KPROCESSOR_MODE WaitMode,
7372 IN BOOLEAN Alertable,
7373 IN PLARGE_INTEGER Timeout OPTIONAL);
7374
7375 typedef
7376 ULONG_PTR
7377 (NTAPI *PKIPI_BROADCAST_WORKER)(
7378 IN ULONG_PTR Argument
7379 );
7380
7381 NTKERNELAPI
7382 ULONG_PTR
7383 NTAPI
7384 KeIpiGenericCall(
7385 IN PKIPI_BROADCAST_WORKER BroadcastFunction,
7386 IN ULONG_PTR Context
7387 );
7388
7389 #if defined(_X86_)
7390
7391 NTHALAPI
7392 VOID
7393 FASTCALL
7394 KfLowerIrql(
7395 IN KIRQL NewIrql);
7396
7397 NTHALAPI
7398 KIRQL
7399 FASTCALL
7400 KfRaiseIrql(
7401 IN KIRQL NewIrql);
7402
7403 NTHALAPI
7404 KIRQL
7405 DDKAPI
7406 KeRaiseIrqlToDpcLevel(
7407 VOID);
7408
7409 NTHALAPI
7410 KIRQL
7411 DDKAPI
7412 KeRaiseIrqlToSynchLevel(
7413 VOID);
7414
7415 #define KeLowerIrql(a) KfLowerIrql(a)
7416 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
7417
7418 #elif defined(_M_AMD64)
7419
7420 FORCEINLINE
7421 KIRQL
7422 KeGetCurrentIrql(VOID)
7423 {
7424 return (KIRQL)__readcr8();
7425 }
7426
7427 FORCEINLINE
7428 VOID
7429 KeLowerIrql(IN KIRQL NewIrql)
7430 {
7431 ASSERT(KeGetCurrentIrql() >= NewIrql);
7432 __writecr8(NewIrql);
7433 }
7434
7435 FORCEINLINE
7436 KIRQL
7437 KfRaiseIrql(IN KIRQL NewIrql)
7438 {
7439 KIRQL OldIrql;
7440
7441 OldIrql = __readcr8();
7442 ASSERT(OldIrql <= NewIrql);
7443 __writecr8(NewIrql);
7444 return OldIrql;
7445 }
7446 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
7447
7448 FORCEINLINE
7449 KIRQL
7450 KeRaiseIrqlToDpcLevel(VOID)
7451 {
7452 return KfRaiseIrql(DISPATCH_LEVEL);
7453 }
7454
7455 FORCEINLINE
7456 KIRQL
7457 KeRaiseIrqlToSynchLevel(VOID)
7458 {
7459 return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2
7460 }
7461
7462 #elif defined(__PowerPC__)
7463
7464 NTHALAPI
7465 VOID
7466 FASTCALL
7467 KfLowerIrql(
7468 IN KIRQL NewIrql);
7469
7470 NTHALAPI
7471 KIRQL
7472 FASTCALL
7473 KfRaiseIrql(
7474 IN KIRQL NewIrql);
7475
7476 NTHALAPI
7477 KIRQL
7478 DDKAPI
7479 KeRaiseIrqlToDpcLevel(
7480 VOID);
7481
7482 NTHALAPI
7483 KIRQL
7484 DDKAPI
7485 KeRaiseIrqlToSynchLevel(
7486 VOID);
7487
7488 #define KeLowerIrql(a) KfLowerIrql(a)
7489 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
7490
7491 #elif defined(_M_MIPS)
7492
7493 #define KeLowerIrql(a) KfLowerIrql(a)
7494 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
7495
7496 NTKERNELAPI
7497 VOID
7498 NTAPI
7499 KfLowerIrql(
7500 IN KIRQL NewIrql);
7501
7502 NTKERNELAPI
7503 KIRQL
7504 NTAPI
7505 KfRaiseIrql(
7506 IN KIRQL NewIrql);
7507
7508 NTKERNELAPI
7509 KIRQL
7510 NTAPI
7511 KeRaiseIrqlToDpcLevel(
7512 VOID);
7513
7514 NTKERNELAPI
7515 KIRQL
7516 DDKAPI
7517 KeRaiseIrqlToSynchLevel(
7518 VOID);
7519
7520 #elif defined(_M_ARM)
7521
7522 #include <armddk.h>
7523
7524 #else
7525
7526 NTKERNELAPI
7527 VOID
7528 NTAPI
7529 KeLowerIrql(
7530 IN KIRQL NewIrql);
7531
7532 NTKERNELAPI
7533 VOID
7534 NTAPI
7535 KeRaiseIrql(
7536 IN KIRQL NewIrql,
7537 OUT PKIRQL OldIrql);
7538
7539 NTKERNELAPI
7540 KIRQL
7541 NTAPI
7542 KeRaiseIrqlToDpcLevel(
7543 VOID);
7544
7545 NTKERNELAPI
7546 KIRQL
7547 DDKAPI
7548 KeRaiseIrqlToSynchLevel(
7549 VOID);
7550
7551 #endif
7552
7553 /** Memory manager routines **/
7554
7555 NTKERNELAPI
7556 NTSTATUS
7557 NTAPI
7558 MmAdvanceMdl(
7559 IN PMDL Mdl,
7560 IN ULONG NumberOfBytes);
7561
7562 NTKERNELAPI
7563 PVOID
7564 NTAPI
7565 MmAllocateContiguousMemory(
7566 IN ULONG NumberOfBytes,
7567 IN PHYSICAL_ADDRESS HighestAcceptableAddress);
7568
7569 NTKERNELAPI
7570 PVOID
7571 NTAPI
7572 MmAllocateContiguousMemorySpecifyCache(
7573 IN SIZE_T NumberOfBytes,
7574 IN PHYSICAL_ADDRESS LowestAcceptableAddress,
7575 IN PHYSICAL_ADDRESS HighestAcceptableAddress,
7576 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
7577 IN MEMORY_CACHING_TYPE CacheType);
7578
7579 NTKERNELAPI
7580 PVOID
7581 NTAPI
7582 MmAllocateMappingAddress(
7583 IN SIZE_T NumberOfBytes,
7584 IN ULONG PoolTag);
7585
7586 NTKERNELAPI
7587 PVOID
7588 NTAPI
7589 MmAllocateNonCachedMemory(
7590 IN ULONG NumberOfBytes);
7591
7592 NTKERNELAPI
7593 PMDL
7594 NTAPI
7595 MmAllocatePagesForMdl(
7596 IN PHYSICAL_ADDRESS LowAddress,
7597 IN PHYSICAL_ADDRESS HighAddress,
7598 IN PHYSICAL_ADDRESS SkipBytes,
7599 IN SIZE_T TotalBytes);
7600
7601 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
7602 NTKERNELAPI
7603 PMDL
7604 NTAPI
7605 MmAllocatePagesForMdlEx(
7606 IN PHYSICAL_ADDRESS LowAddress,
7607 IN PHYSICAL_ADDRESS HighAddress,
7608 IN PHYSICAL_ADDRESS SkipBytes,
7609 IN SIZE_T TotalBytes,
7610 IN MEMORY_CACHING_TYPE CacheType,
7611 IN ULONG Flags);
7612 #endif
7613
7614 NTKERNELAPI
7615 VOID
7616 NTAPI
7617 MmBuildMdlForNonPagedPool(
7618 IN OUT PMDL MemoryDescriptorList);
7619
7620 typedef enum _MMFLUSH_TYPE {
7621 MmFlushForDelete,
7622 MmFlushForWrite
7623 } MMFLUSH_TYPE;
7624
7625 NTKERNELAPI
7626 BOOLEAN
7627 NTAPI
7628 MmFlushImageSection(
7629 IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
7630 IN MMFLUSH_TYPE FlushType);
7631
7632 NTKERNELAPI
7633 VOID
7634 NTAPI
7635 MmFreeContiguousMemory(
7636 IN PVOID BaseAddress);
7637
7638 NTKERNELAPI
7639 VOID
7640 NTAPI
7641 MmFreeContiguousMemorySpecifyCache(
7642 IN PVOID BaseAddress,
7643 IN SIZE_T NumberOfBytes,
7644 IN MEMORY_CACHING_TYPE CacheType);
7645
7646 NTKERNELAPI
7647 VOID
7648 NTAPI
7649 MmFreeMappingAddress(
7650 IN PVOID BaseAddress,
7651 IN ULONG PoolTag);
7652
7653 NTKERNELAPI
7654 VOID
7655 NTAPI
7656 MmFreeNonCachedMemory(
7657 IN PVOID BaseAddress,
7658 IN SIZE_T NumberOfBytes);
7659
7660 NTKERNELAPI
7661 VOID
7662 NTAPI
7663 MmFreePagesFromMdl(
7664 IN PMDL MemoryDescriptorList);
7665
7666 /*
7667 * ULONG
7668 * MmGetMdlByteCount(
7669 * IN PMDL Mdl)
7670 */
7671 #define MmGetMdlByteCount(_Mdl) \
7672 ((_Mdl)->ByteCount)
7673
7674 /*
7675 * ULONG
7676 * MmGetMdlByteOffset(
7677 * IN PMDL Mdl)
7678 */
7679 #define MmGetMdlByteOffset(_Mdl) \
7680 ((_Mdl)->ByteOffset)
7681
7682 /*
7683 * PPFN_NUMBER
7684 * MmGetMdlPfnArray(
7685 * IN PMDL Mdl)
7686 */
7687 #define MmGetMdlPfnArray(_Mdl) \
7688 ((PPFN_NUMBER) ((_Mdl) + 1))
7689
7690 /*
7691 * PVOID
7692 * MmGetMdlVirtualAddress(
7693 * IN PMDL Mdl)
7694 */
7695 #define MmGetMdlVirtualAddress(_Mdl) \
7696 ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
7697
7698 NTKERNELAPI
7699 PHYSICAL_ADDRESS
7700 NTAPI
7701 MmGetPhysicalAddress(
7702 IN PVOID BaseAddress);
7703
7704 NTKERNELAPI
7705 PPHYSICAL_MEMORY_RANGE
7706 NTAPI
7707 MmGetPhysicalMemoryRanges(
7708 VOID);
7709
7710 NTKERNELAPI
7711 PVOID
7712 NTAPI
7713 MmGetVirtualForPhysical(
7714 IN PHYSICAL_ADDRESS PhysicalAddress);
7715
7716 NTKERNELAPI
7717 PVOID
7718 NTAPI
7719 MmMapLockedPagesSpecifyCache(
7720 IN PMDL MemoryDescriptorList,
7721 IN KPROCESSOR_MODE AccessMode,
7722 IN MEMORY_CACHING_TYPE CacheType,
7723 IN PVOID BaseAddress,
7724 IN ULONG BugCheckOnFailure,
7725 IN MM_PAGE_PRIORITY Priority);
7726
7727 NTKERNELAPI
7728 PVOID
7729 NTAPI
7730 MmMapLockedPagesWithReservedMapping(
7731 IN PVOID MappingAddress,
7732 IN ULONG PoolTag,
7733 IN PMDL MemoryDescriptorList,
7734 IN MEMORY_CACHING_TYPE CacheType);
7735
7736 NTKERNELAPI
7737 NTSTATUS
7738 NTAPI
7739 MmMapUserAddressesToPage(
7740 IN PVOID BaseAddress,
7741 IN SIZE_T NumberOfBytes,
7742 IN PVOID PageAddress);
7743
7744 NTKERNELAPI
7745 PVOID
7746 NTAPI
7747 MmMapVideoDisplay(
7748 IN PHYSICAL_ADDRESS PhysicalAddress,
7749 IN SIZE_T NumberOfBytes,
7750 IN MEMORY_CACHING_TYPE CacheType);
7751
7752 NTKERNELAPI
7753 NTSTATUS
7754 NTAPI
7755 MmMapViewInSessionSpace(
7756 IN PVOID Section,
7757 OUT PVOID *MappedBase,
7758 IN OUT PSIZE_T ViewSize);
7759
7760 NTKERNELAPI
7761 NTSTATUS
7762 NTAPI
7763 MmMapViewInSystemSpace(
7764 IN PVOID Section,
7765 OUT PVOID *MappedBase,
7766 IN PSIZE_T ViewSize);
7767
7768 NTKERNELAPI
7769 NTSTATUS
7770 NTAPI
7771 MmMarkPhysicalMemoryAsBad(
7772 IN PPHYSICAL_ADDRESS StartAddress,
7773 IN OUT PLARGE_INTEGER NumberOfBytes);
7774
7775 NTKERNELAPI
7776 NTSTATUS
7777 NTAPI
7778 MmMarkPhysicalMemoryAsGood(
7779 IN PPHYSICAL_ADDRESS StartAddress,
7780 IN OUT PLARGE_INTEGER NumberOfBytes);
7781
7782 NTKERNELAPI
7783 PVOID
7784 NTAPI
7785 MmGetSystemRoutineAddress(
7786 IN PUNICODE_STRING SystemRoutineName);
7787
7788 /*
7789 * ULONG
7790 * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
7791 * IN PVOID Va,
7792 * IN ULONG Size)
7793 */
7794 #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, \
7795 _Size) \
7796 ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
7797 + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
7798
7799 /*
7800 * VOID
7801 * MmInitializeMdl(
7802 * IN PMDL MemoryDescriptorList,
7803 * IN PVOID BaseVa,
7804 * IN SIZE_T Length)
7805 */
7806 #define MmInitializeMdl(_MemoryDescriptorList, \
7807 _BaseVa, \
7808 _Length) \
7809 { \
7810 (_MemoryDescriptorList)->Next = (PMDL) NULL; \
7811 (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
7812 (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
7813 (_MemoryDescriptorList)->MdlFlags = 0; \
7814 (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
7815 (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
7816 (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
7817 }
7818
7819 NTKERNELAPI
7820 BOOLEAN
7821 NTAPI
7822 MmIsAddressValid(
7823 IN PVOID VirtualAddress);
7824
7825 NTKERNELAPI
7826 LOGICAL
7827 NTAPI
7828 MmIsDriverVerifying(
7829 IN PDRIVER_OBJECT DriverObject);
7830
7831 NTKERNELAPI
7832 BOOLEAN
7833 NTAPI
7834 MmIsThisAnNtAsSystem(
7835 VOID);
7836
7837 NTKERNELAPI
7838 NTSTATUS
7839 NTAPI
7840 MmIsVerifierEnabled(
7841 OUT PULONG VerifierFlags);
7842
7843 NTKERNELAPI
7844 PVOID
7845 NTAPI
7846 MmLockPagableDataSection(
7847 IN PVOID AddressWithinSection);
7848
7849 NTKERNELAPI
7850 PVOID
7851 NTAPI
7852 MmLockPagableImageSection(
7853 IN PVOID AddressWithinSection);
7854
7855 /*
7856 * PVOID
7857 * MmLockPagableCodeSection(
7858 * IN PVOID AddressWithinSection)
7859 */
7860 #define MmLockPagableCodeSection(Address) MmLockPagableDataSection(Address)
7861
7862 NTKERNELAPI
7863 VOID
7864 NTAPI
7865 MmLockPagableSectionByHandle(
7866 IN PVOID ImageSectionHandle);
7867
7868 NTKERNELAPI
7869 PVOID
7870 NTAPI
7871 MmMapIoSpace(
7872 IN PHYSICAL_ADDRESS PhysicalAddress,
7873 IN ULONG NumberOfBytes,
7874 IN MEMORY_CACHING_TYPE CacheEnable);
7875
7876 NTKERNELAPI
7877 PVOID
7878 NTAPI
7879 MmMapLockedPages(
7880 IN PMDL MemoryDescriptorList,
7881 IN KPROCESSOR_MODE AccessMode);
7882
7883 NTKERNELAPI
7884 PVOID
7885 NTAPI
7886 MmLockPageableDataSection (
7887 IN PVOID AddressWithinSection
7888 );
7889
7890 NTKERNELAPI
7891 VOID
7892 NTAPI
7893 MmUnlockPageableImageSection(
7894 IN PVOID ImageSectionHandle
7895 );
7896
7897 NTKERNELAPI
7898 PVOID
7899 NTAPI
7900 MmPageEntireDriver(
7901 IN PVOID AddressWithinSection);
7902
7903 NTKERNELAPI
7904 VOID
7905 NTAPI
7906 MmProbeAndLockProcessPages(
7907 IN OUT PMDL MemoryDescriptorList,
7908 IN PEPROCESS Process,
7909 IN KPROCESSOR_MODE AccessMode,
7910 IN LOCK_OPERATION Operation);
7911
7912 NTKERNELAPI
7913 NTSTATUS
7914 NTAPI
7915 MmProtectMdlSystemAddress(
7916 IN PMDL MemoryDescriptorList,
7917 IN ULONG NewProtect);
7918
7919 NTKERNELAPI
7920 VOID
7921 NTAPI
7922 MmUnmapLockedPages(
7923 IN PVOID BaseAddress,
7924 IN PMDL MemoryDescriptorList);
7925
7926 NTKERNELAPI
7927 NTSTATUS
7928 NTAPI
7929 MmUnmapViewInSessionSpace(
7930 IN PVOID MappedBase);
7931
7932 NTKERNELAPI
7933 NTSTATUS
7934 NTAPI
7935 MmUnmapViewInSystemSpace(
7936 IN PVOID MappedBase);
7937
7938 NTKERNELAPI
7939 VOID
7940 NTAPI
7941 MmUnsecureVirtualMemory(
7942 IN HANDLE SecureHandle);
7943
7944 /*
7945 * VOID
7946 * MmPrepareMdlForReuse(
7947 * IN PMDL Mdl)
7948 */
7949 #define MmPrepareMdlForReuse(_Mdl) \
7950 { \
7951 if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
7952 ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
7953 MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
7954 } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
7955 ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
7956 } \
7957 }
7958
7959 #define MmGetProcedureAddress(Address) (Address)
7960
7961 NTKERNELAPI
7962 VOID
7963 NTAPI
7964 MmProbeAndLockPages(
7965 IN OUT PMDL MemoryDescriptorList,
7966 IN KPROCESSOR_MODE AccessMode,
7967 IN LOCK_OPERATION Operation);
7968
7969 NTKERNELAPI
7970 MM_SYSTEMSIZE
7971 NTAPI
7972 MmQuerySystemSize(
7973 VOID);
7974
7975 NTKERNELAPI
7976 NTSTATUS
7977 NTAPI
7978 MmRemovePhysicalMemory(
7979 IN PPHYSICAL_ADDRESS StartAddress,
7980 IN OUT PLARGE_INTEGER NumberOfBytes);
7981
7982 NTKERNELAPI
7983 VOID
7984 NTAPI
7985 MmResetDriverPaging(
7986 IN PVOID AddressWithinSection);
7987
7988 NTKERNELAPI
7989 HANDLE
7990 NTAPI
7991 MmSecureVirtualMemory(
7992 IN PVOID Address,
7993 IN SIZE_T Size,
7994 IN ULONG ProbeMode);
7995
7996 NTKERNELAPI
7997 SIZE_T
7998 NTAPI
7999 MmSizeOfMdl(
8000 IN PVOID Base,
8001 IN SIZE_T Length);
8002
8003 NTKERNELAPI
8004 VOID
8005 NTAPI
8006 MmUnlockPagableImageSection(
8007 IN PVOID ImageSectionHandle);
8008
8009 NTKERNELAPI
8010 VOID
8011 NTAPI
8012 MmUnlockPages(
8013 IN PMDL MemoryDescriptorList);
8014
8015 NTKERNELAPI
8016 VOID
8017 NTAPI
8018 MmUnmapIoSpace(
8019 IN PVOID BaseAddress,
8020 IN SIZE_T NumberOfBytes);
8021
8022 NTKERNELAPI
8023 VOID
8024 NTAPI
8025 MmUnmapReservedMapping(
8026 IN PVOID BaseAddress,
8027 IN ULONG PoolTag,
8028 IN PMDL MemoryDescriptorList);
8029
8030 NTKERNELAPI
8031 VOID
8032 NTAPI
8033 MmUnmapVideoDisplay(
8034 IN PVOID BaseAddress,
8035 IN SIZE_T NumberOfBytes);
8036
8037
8038
8039 /** Object manager routines **/
8040
8041 NTKERNELAPI
8042 NTSTATUS
8043 NTAPI
8044 ObAssignSecurity(
8045 IN PACCESS_STATE AccessState,
8046 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
8047 IN PVOID Object,
8048 IN POBJECT_TYPE Type);
8049
8050 NTKERNELAPI
8051 VOID
8052 NTAPI
8053 ObDereferenceSecurityDescriptor(
8054 PSECURITY_DESCRIPTOR SecurityDescriptor,
8055 ULONG Count);
8056
8057 NTKERNELAPI
8058 LONG_PTR
8059 FASTCALL
8060 ObfDereferenceObject(
8061 IN PVOID Object);
8062
8063 /*
8064 * VOID
8065 * ObDereferenceObject(
8066 * IN PVOID Object)
8067 */
8068 #define ObDereferenceObject ObfDereferenceObject
8069
8070 NTKERNELAPI
8071 NTSTATUS
8072 NTAPI
8073 ObGetObjectSecurity(
8074 IN PVOID Object,
8075 OUT PSECURITY_DESCRIPTOR *SecurityDescriptor,
8076 OUT PBOOLEAN MemoryAllocated);
8077
8078 NTKERNELAPI
8079 NTSTATUS
8080 NTAPI
8081 ObInsertObject(
8082 IN PVOID Object,
8083 IN PACCESS_STATE PassedAccessState OPTIONAL,
8084 IN ACCESS_MASK DesiredAccess,
8085 IN ULONG AdditionalReferences,
8086 OUT PVOID* ReferencedObject OPTIONAL,
8087 OUT PHANDLE Handle);
8088
8089 NTKERNELAPI
8090 LONG_PTR
8091 FASTCALL
8092 ObfReferenceObject(
8093 IN PVOID Object);
8094
8095 NTKERNELAPI
8096 NTSTATUS
8097 NTAPI
8098 ObLogSecurityDescriptor(
8099 IN PSECURITY_DESCRIPTOR InputSecurityDescriptor,
8100 OUT PSECURITY_DESCRIPTOR *OutputSecurityDescriptor,
8101 IN ULONG RefBias);
8102 /*
8103 * VOID
8104 * ObReferenceObject(
8105 * IN PVOID Object)
8106 */
8107 #define ObReferenceObject ObfReferenceObject
8108
8109 NTKERNELAPI
8110 VOID
8111 NTAPI
8112 ObMakeTemporaryObject(
8113 IN PVOID Object);
8114
8115 NTKERNELAPI
8116 NTSTATUS
8117 NTAPI
8118 ObOpenObjectByName(
8119 IN POBJECT_ATTRIBUTES ObjectAttributes,
8120 IN POBJECT_TYPE ObjectType,
8121 IN KPROCESSOR_MODE AccessMode,
8122 IN PACCESS_STATE PassedAccessState,
8123 IN ACCESS_MASK DesiredAccess,
8124 IN OUT PVOID ParseContext OPTIONAL,
8125 OUT PHANDLE Handle);
8126
8127 NTKERNELAPI
8128 NTSTATUS
8129 NTAPI
8130 ObOpenObjectByPointer(
8131 IN PVOID Object,
8132 IN ULONG HandleAttributes,
8133 IN PACCESS_STATE PassedAccessState OPTIONAL,
8134 IN ACCESS_MASK DesiredAccess OPTIONAL,
8135 IN POBJECT_TYPE ObjectType OPTIONAL,
8136 IN KPROCESSOR_MODE AccessMode,
8137 OUT PHANDLE Handle);
8138
8139 NTKERNELAPI
8140 NTSTATUS
8141 NTAPI
8142 ObQueryObjectAuditingByHandle(
8143 IN HANDLE Handle,
8144 OUT PBOOLEAN GenerateOnClose);
8145
8146 NTKERNELAPI
8147 NTSTATUS
8148 NTAPI
8149 ObReferenceObjectByHandle(
8150 IN HANDLE Handle,
8151 IN ACCESS_MASK DesiredAccess,
8152 IN POBJECT_TYPE ObjectType OPTIONAL,
8153 IN KPROCESSOR_MODE AccessMode,
8154 OUT PVOID *Object,
8155 OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL);
8156
8157 NTKERNELAPI
8158 NTSTATUS
8159 NTAPI
8160 ObReferenceObjectByName(
8161 IN PUNICODE_STRING ObjectPath,
8162 IN ULONG Attributes,
8163 IN PACCESS_STATE PassedAccessState OPTIONAL,
8164 IN ACCESS_MASK DesiredAccess OPTIONAL,
8165 IN POBJECT_TYPE ObjectType,
8166 IN KPROCESSOR_MODE AccessMode,
8167 IN OUT PVOID ParseContext OPTIONAL,
8168 OUT PVOID *Object);
8169
8170 NTKERNELAPI
8171 NTSTATUS
8172 NTAPI
8173 ObReferenceObjectByPointer(
8174 IN PVOID Object,
8175 IN ACCESS_MASK DesiredAccess,
8176 IN POBJECT_TYPE ObjectType,
8177 IN KPROCESSOR_MODE AccessMode);
8178
8179 NTKERNELAPI
8180 VOID
8181 NTAPI
8182 ObReferenceSecurityDescriptor(
8183 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
8184 IN ULONG Count);
8185
8186 NTKERNELAPI
8187 VOID
8188 NTAPI
8189 ObReleaseObjectSecurity(
8190 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
8191 IN BOOLEAN MemoryAllocated);
8192
8193
8194
8195 /** Process manager routines **/
8196
8197 NTKERNELAPI
8198 NTSTATUS
8199 NTAPI
8200 PsCreateSystemProcess(
8201 IN PHANDLE ProcessHandle,
8202 IN ACCESS_MASK DesiredAccess,
8203 IN POBJECT_ATTRIBUTES ObjectAttributes);
8204
8205 NTKERNELAPI
8206 NTSTATUS
8207 NTAPI
8208 PsCreateSystemThread(
8209 OUT PHANDLE ThreadHandle,
8210 IN ULONG DesiredAccess,
8211 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
8212 IN HANDLE ProcessHandle OPTIONAL,
8213 OUT PCLIENT_ID ClientId OPTIONAL,
8214 IN PKSTART_ROUTINE StartRoutine,
8215 IN PVOID StartContext);
8216
8217 /*
8218 * PEPROCESS
8219 * PsGetCurrentProcess(VOID)
8220 */
8221 #define PsGetCurrentProcess IoGetCurrentProcess
8222
8223 NTKERNELAPI
8224 HANDLE
8225 NTAPI
8226 PsGetCurrentProcessId(
8227 VOID);
8228
8229 /*
8230 * PETHREAD
8231 * PsGetCurrentThread(VOID)
8232 */
8233 #define PsGetCurrentThread() \
8234 ((PETHREAD) KeGetCurrentThread())
8235
8236 NTKERNELAPI
8237 HANDLE
8238 NTAPI
8239 PsGetCurrentThreadId(
8240 VOID);
8241
8242 NTKERNELAPI
8243 HANDLE
8244 NTAPI
8245 PsGetProcessId(PEPROCESS Process);
8246
8247 NTKERNELAPI
8248 BOOLEAN
8249 NTAPI
8250 PsGetVersion(
8251 PULONG MajorVersion OPTIONAL,
8252 PULONG MinorVersion OPTIONAL,
8253 PULONG BuildNumber OPTIONAL,
8254 PUNICODE_STRING CSDVersion OPTIONAL);
8255
8256 NTKERNELAPI
8257 NTSTATUS
8258 NTAPI
8259 PsRemoveCreateThreadNotifyRoutine(
8260 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
8261
8262 NTKERNELAPI
8263 NTSTATUS
8264 NTAPI
8265 PsRemoveLoadImageNotifyRoutine(
8266 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
8267
8268 NTKERNELAPI
8269 NTSTATUS
8270 NTAPI
8271 PsSetCreateProcessNotifyRoutine(
8272 IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
8273 IN BOOLEAN Remove);
8274
8275 NTKERNELAPI
8276 NTSTATUS
8277 NTAPI
8278 PsSetCreateThreadNotifyRoutine(
8279 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
8280
8281 NTKERNELAPI
8282 NTSTATUS
8283 NTAPI
8284 PsSetLoadImageNotifyRoutine(
8285 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
8286
8287 NTKERNELAPI
8288 NTSTATUS
8289 NTAPI
8290 PsTerminateSystemThread(
8291 IN NTSTATUS ExitStatus);
8292
8293 extern NTSYSAPI PEPROCESS PsInitialSystemProcess;
8294
8295
8296 /** Security reference monitor routines **/
8297
8298 NTKERNELAPI
8299 BOOLEAN
8300 NTAPI
8301 SeAccessCheck(
8302 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
8303 IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext,
8304 IN BOOLEAN SubjectContextLocked,
8305 IN ACCESS_MASK DesiredAccess,
8306 IN ACCESS_MASK PreviouslyGrantedAccess,
8307 OUT PPRIVILEGE_SET *Privileges OPTIONAL,
8308 IN PGENERIC_MAPPING GenericMapping,
8309 IN KPROCESSOR_MODE AccessMode,
8310 OUT PACCESS_MASK GrantedAccess,
8311 OUT PNTSTATUS AccessStatus);
8312
8313 NTKERNELAPI
8314 NTSTATUS
8315 NTAPI
8316 SeAssignSecurity(
8317 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
8318 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
8319 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
8320 IN BOOLEAN IsDirectoryObject,
8321 IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
8322 IN PGENERIC_MAPPING GenericMapping,
8323 IN POOL_TYPE PoolType);
8324
8325 NTKERNELAPI
8326 NTSTATUS
8327 NTAPI
8328 SeAssignSecurityEx(
8329 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
8330 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
8331 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
8332 IN GUID *ObjectType OPTIONAL,
8333 IN BOOLEAN IsDirectoryObject,
8334 IN ULONG AutoInheritFlags,
8335 IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
8336 IN PGENERIC_MAPPING GenericMapping,
8337 IN POOL_TYPE PoolType);
8338
8339 NTKERNELAPI
8340 NTSTATUS
8341 NTAPI
8342 SeDeassignSecurity(
8343 IN OUT PSECURITY_DESCRIPTOR *SecurityDescriptor);
8344
8345 NTKERNELAPI
8346 BOOLEAN
8347 NTAPI
8348 SeSinglePrivilegeCheck(
8349 LUID PrivilegeValue,
8350 KPROCESSOR_MODE PreviousMode);
8351
8352 NTKERNELAPI
8353 BOOLEAN
8354 NTAPI
8355 SeValidSecurityDescriptor(
8356 IN ULONG Length,
8357 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
8358
8359
8360
8361 /** NtXxx routines **/
8362
8363 NTSYSCALLAPI
8364 NTSTATUS
8365 NTAPI
8366 NtOpenProcess(
8367 OUT PHANDLE ProcessHandle,
8368 IN ACCESS_MASK DesiredAccess,
8369 IN POBJECT_ATTRIBUTES ObjectAttributes,
8370 IN PCLIENT_ID ClientId OPTIONAL);
8371
8372 NTSYSCALLAPI
8373 NTSTATUS
8374 NTAPI
8375 NtQueryInformationProcess(
8376 IN HANDLE ProcessHandle,
8377 IN PROCESSINFOCLASS ProcessInformationClass,
8378 OUT PVOID ProcessInformation,
8379 IN ULONG ProcessInformationLength,
8380 OUT PULONG ReturnLength OPTIONAL);
8381
8382
8383
8384 /** NtXxx and ZwXxx routines **/
8385
8386 NTSYSAPI
8387 NTSTATUS
8388 NTAPI
8389 ZwCancelTimer(
8390 IN HANDLE TimerHandle,
8391 OUT PBOOLEAN CurrentState OPTIONAL);
8392
8393 NTSYSCALLAPI
8394 NTSTATUS
8395 NTAPI
8396 NtClose(
8397 IN HANDLE Handle);
8398
8399 NTSYSAPI
8400 NTSTATUS
8401 NTAPI
8402 ZwClose(
8403 IN HANDLE Handle);
8404
8405 NTSYSAPI
8406 NTSTATUS
8407 NTAPI
8408 ZwCreateDirectoryObject(
8409 OUT PHANDLE DirectoryHandle,
8410 IN ACCESS_MASK DesiredAccess,
8411 IN POBJECT_ATTRIBUTES ObjectAttributes);
8412
8413 NTSYSCALLAPI
8414 NTSTATUS
8415 NTAPI
8416 NtCreateEvent(
8417 OUT PHANDLE EventHandle,
8418 IN ACCESS_MASK DesiredAccess,
8419 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
8420 IN EVENT_TYPE EventType,
8421 IN BOOLEAN InitialState);
8422
8423 NTSYSAPI
8424 NTSTATUS
8425 NTAPI
8426 ZwCreateEvent(
8427 OUT PHANDLE EventHandle,
8428 IN ACCESS_MASK DesiredAccess,
8429 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
8430 IN EVENT_TYPE EventType,
8431 IN BOOLEAN InitialState);
8432
8433 NTSYSAPI
8434 NTSTATUS
8435 NTAPI
8436 ZwCreateFile(
8437 OUT PHANDLE FileHandle,
8438 IN ACCESS_MASK DesiredAccess,
8439 IN POBJECT_ATTRIBUTES ObjectAttributes,
8440 OUT PIO_STATUS_BLOCK IoStatusBlock,
8441 IN PLARGE_INTEGER AllocationSize OPTIONAL,
8442 IN ULONG FileAttributes,
8443 IN ULONG ShareAccess,
8444 IN ULONG CreateDisposition,
8445 IN ULONG CreateOptions,
8446 IN PVOID EaBuffer OPTIONAL,
8447 IN ULONG EaLength);
8448
8449 NTSYSAPI
8450 NTSTATUS
8451 NTAPI
8452 ZwCreateKey(
8453 OUT PHANDLE KeyHandle,
8454 IN ACCESS_MASK DesiredAccess,
8455 IN POBJECT_ATTRIBUTES ObjectAttributes,
8456 IN ULONG TitleIndex,
8457 IN PUNICODE_STRING Class OPTIONAL,
8458 IN ULONG CreateOptions,
8459 OUT PULONG Disposition OPTIONAL);
8460
8461 NTSYSAPI
8462 NTSTATUS
8463 NTAPI
8464 ZwCreateTimer(
8465 OUT PHANDLE TimerHandle,
8466 IN ACCESS_MASK DesiredAccess,
8467 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
8468 IN TIMER_TYPE TimerType);
8469
8470 NTSYSAPI
8471 NTSTATUS
8472 NTAPI
8473 ZwDeleteKey(
8474 IN HANDLE KeyHandle);
8475
8476 NTSYSAPI
8477 NTSTATUS
8478 NTAPI
8479 ZwDeleteValueKey(
8480 IN HANDLE KeyHandle,
8481 IN PUNICODE_STRING ValueName);
8482
8483 NTSYSCALLAPI
8484 NTSTATUS
8485 NTAPI
8486 NtDeviceIoControlFile(
8487 IN HANDLE DeviceHandle,
8488 IN HANDLE Event OPTIONAL,
8489 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
8490 IN PVOID UserApcContext OPTIONAL,
8491 OUT PIO_STATUS_BLOCK IoStatusBlock,
8492 IN ULONG IoControlCode,
8493 IN PVOID InputBuffer,
8494 IN ULONG InputBufferSize,
8495 OUT PVOID OutputBuffer,
8496 IN ULONG OutputBufferSize);
8497
8498 NTSYSAPI
8499 NTSTATUS
8500 NTAPI
8501 ZwDeviceIoControlFile(
8502 IN HANDLE DeviceHandle,
8503 IN HANDLE Event OPTIONAL,
8504 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
8505 IN PVOID UserApcContext OPTIONAL,
8506 OUT PIO_STATUS_BLOCK IoStatusBlock,
8507 IN ULONG IoControlCode,
8508 IN PVOID InputBuffer,
8509 IN ULONG InputBufferSize,
8510 OUT PVOID OutputBuffer,
8511 IN ULONG OutputBufferSize);
8512
8513 NTSYSAPI
8514 NTSTATUS
8515 NTAPI
8516 ZwEnumerateKey(
8517 IN HANDLE KeyHandle,
8518 IN ULONG Index,
8519 IN KEY_INFORMATION_CLASS KeyInformationClass,
8520 OUT PVOID KeyInformation,
8521 IN ULONG Length,
8522 OUT PULONG ResultLength);
8523
8524 NTSYSAPI
8525 NTSTATUS
8526 NTAPI
8527 ZwEnumerateValueKey(
8528 IN HANDLE KeyHandle,
8529 IN ULONG Index,
8530 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
8531 OUT PVOID KeyValueInformation,
8532 IN ULONG Length,
8533 OUT PULONG ResultLength);
8534
8535 NTSYSAPI
8536 NTSTATUS
8537 NTAPI
8538 ZwFlushKey(
8539 IN HANDLE KeyHandle);
8540
8541 NTSYSAPI
8542 NTSTATUS
8543 NTAPI
8544 ZwMakeTemporaryObject(
8545 IN HANDLE Handle);
8546
8547 NTSYSCALLAPI
8548 NTSTATUS
8549 NTAPI
8550 NtMapViewOfSection(
8551 IN HANDLE SectionHandle,
8552 IN HANDLE ProcessHandle,
8553 IN OUT PVOID *BaseAddress,
8554 IN ULONG_PTR ZeroBits,
8555 IN SIZE_T CommitSize,
8556 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
8557 IN OUT PSIZE_T ViewSize,
8558 IN SECTION_INHERIT InheritDisposition,
8559 IN ULONG AllocationType,
8560 IN ULONG Protect);
8561
8562 NTSYSAPI
8563 NTSTATUS
8564 NTAPI
8565 ZwMapViewOfSection(
8566 IN HANDLE SectionHandle,
8567 IN HANDLE ProcessHandle,
8568 IN OUT PVOID *BaseAddress,
8569 IN ULONG_PTR ZeroBits,
8570 IN SIZE_T CommitSize,
8571 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
8572 IN OUT PSIZE_T ViewSize,
8573 IN SECTION_INHERIT InheritDisposition,
8574 IN ULONG AllocationType,
8575 IN ULONG Protect);
8576
8577 NTSYSCALLAPI
8578 NTSTATUS
8579 NTAPI
8580 NtOpenFile(
8581 OUT PHANDLE FileHandle,
8582 IN ACCESS_MASK DesiredAccess,
8583 IN POBJECT_ATTRIBUTES ObjectAttributes,
8584 OUT PIO_STATUS_BLOCK IoStatusBlock,
8585 IN ULONG ShareAccess,
8586 IN ULONG OpenOptions);
8587
8588 NTSYSAPI
8589 NTSTATUS
8590 NTAPI
8591 ZwOpenFile(
8592 OUT PHANDLE FileHandle,
8593 IN ACCESS_MASK DesiredAccess,
8594 IN POBJECT_ATTRIBUTES ObjectAttributes,
8595 OUT PIO_STATUS_BLOCK IoStatusBlock,
8596 IN ULONG ShareAccess,
8597 IN ULONG OpenOptions);
8598
8599 NTSYSAPI
8600 NTSTATUS
8601 NTAPI
8602 ZwOpenKey(
8603 OUT PHANDLE KeyHandle,
8604 IN ACCESS_MASK DesiredAccess,
8605 IN POBJECT_ATTRIBUTES ObjectAttributes);
8606
8607 NTSYSAPI
8608 NTSTATUS
8609 NTAPI
8610 ZwOpenSection(
8611 OUT PHANDLE SectionHandle,
8612 IN ACCESS_MASK DesiredAccess,
8613 IN POBJECT_ATTRIBUTES ObjectAttributes);
8614
8615 NTSYSAPI
8616 NTSTATUS
8617 NTAPI
8618 ZwOpenSymbolicLinkObject(
8619 OUT PHANDLE LinkHandle,
8620 IN ACCESS_MASK DesiredAccess,
8621 IN POBJECT_ATTRIBUTES ObjectAttributes);
8622
8623 NTSYSAPI
8624 NTSTATUS
8625 NTAPI
8626 ZwOpenTimer(
8627 OUT PHANDLE TimerHandle,
8628 IN ACCESS_MASK DesiredAccess,
8629 IN POBJECT_ATTRIBUTES ObjectAttributes);
8630
8631 NTSYSAPI
8632 NTSTATUS
8633 NTAPI
8634 ZwQueryInformationFile(
8635 IN HANDLE FileHandle,
8636 OUT PIO_STATUS_BLOCK IoStatusBlock,
8637 OUT PVOID FileInformation,
8638 IN ULONG Length,
8639 IN FILE_INFORMATION_CLASS FileInformationClass);
8640
8641 NTSYSAPI
8642 NTSTATUS
8643 NTAPI
8644 ZwQueryKey(
8645 IN HANDLE KeyHandle,
8646 IN KEY_INFORMATION_CLASS KeyInformationClass,
8647 OUT PVOID KeyInformation,
8648 IN ULONG Length,
8649 OUT PULONG ResultLength);
8650
8651 NTSYSAPI
8652 NTSTATUS
8653 NTAPI
8654 ZwQuerySymbolicLinkObject(
8655 IN HANDLE LinkHandle,
8656 IN OUT PUNICODE_STRING LinkTarget,
8657 OUT PULONG ReturnedLength OPTIONAL);
8658
8659 NTSYSAPI
8660 NTSTATUS
8661 NTAPI
8662 ZwQueryValueKey(
8663 IN HANDLE KeyHandle,
8664 IN PUNICODE_STRING ValueName,
8665 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
8666 OUT PVOID KeyValueInformation,
8667 IN ULONG Length,
8668 OUT PULONG ResultLength);
8669
8670 NTSYSCALLAPI
8671 NTSTATUS
8672 NTAPI
8673 NtReadFile(
8674 IN HANDLE FileHandle,
8675 IN HANDLE Event OPTIONAL,
8676 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
8677 IN PVOID ApcContext OPTIONAL,
8678 OUT PIO_STATUS_BLOCK IoStatusBlock,
8679 OUT PVOID Buffer,
8680 IN ULONG Length,
8681 IN PLARGE_INTEGER ByteOffset OPTIONAL,
8682 IN PULONG Key OPTIONAL);
8683
8684 NTSYSAPI
8685 NTSTATUS
8686 NTAPI
8687 ZwReadFile(
8688 IN HANDLE FileHandle,
8689 IN HANDLE Event OPTIONAL,
8690 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
8691 IN PVOID ApcContext OPTIONAL,
8692 OUT PIO_STATUS_BLOCK IoStatusBlock,
8693 OUT PVOID Buffer,
8694 IN ULONG Length,
8695 IN PLARGE_INTEGER ByteOffset OPTIONAL,
8696 IN PULONG Key OPTIONAL);
8697
8698 NTSYSCALLAPI
8699 NTSTATUS
8700 NTAPI
8701 NtSetEvent(
8702 IN HANDLE EventHandle,
8703 OUT PLONG PreviousState OPTIONAL);
8704
8705 NTSYSAPI
8706 NTSTATUS
8707 NTAPI
8708 ZwSetEvent(
8709 IN HANDLE EventHandle,
8710 OUT PLONG PreviousState OPTIONAL);
8711
8712 NTSYSAPI
8713 NTSTATUS
8714 NTAPI
8715 ZwSetInformationFile(
8716 IN HANDLE FileHandle,
8717 OUT PIO_STATUS_BLOCK IoStatusBlock,
8718 IN PVOID FileInformation,
8719 IN ULONG Length,
8720 IN FILE_INFORMATION_CLASS FileInformationClass);
8721
8722 NTSYSAPI
8723 NTSTATUS
8724 NTAPI
8725 ZwSetInformationThread(
8726 IN HANDLE ThreadHandle,
8727 IN THREADINFOCLASS ThreadInformationClass,
8728 IN PVOID ThreadInformation,
8729 IN ULONG ThreadInformationLength);
8730
8731 NTSYSAPI
8732 NTSTATUS
8733 NTAPI
8734 ZwSetTimer(
8735 IN HANDLE TimerHandle,
8736 IN PLARGE_INTEGER DueTime,
8737 IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL,
8738 IN PVOID TimerContext OPTIONAL,
8739 IN BOOLEAN WakeTimer,
8740 IN LONG Period OPTIONAL,
8741 OUT PBOOLEAN PreviousState OPTIONAL);
8742
8743 NTSYSAPI
8744 NTSTATUS
8745 NTAPI
8746 ZwSetValueKey(
8747 IN HANDLE KeyHandle,
8748 IN PUNICODE_STRING ValueName,
8749 IN ULONG TitleIndex OPTIONAL,
8750 IN ULONG Type,
8751 IN PVOID Data,
8752 IN ULONG DataSize);
8753
8754 /* [Nt|Zw]MapViewOfSection.InheritDisposition constants */
8755 #define AT_EXTENDABLE_FILE 0x00002000
8756 #define AT_RESERVED 0x20000000
8757 #define AT_ROUND_TO_PAGE 0x40000000
8758
8759 NTSYSCALLAPI
8760 NTSTATUS
8761 NTAPI
8762 NtUnmapViewOfSection(
8763 IN HANDLE ProcessHandle,
8764 IN PVOID BaseAddress);
8765
8766 NTSYSAPI
8767 NTSTATUS
8768 NTAPI
8769 ZwUnmapViewOfSection(
8770 IN HANDLE ProcessHandle,
8771 IN PVOID BaseAddress);
8772
8773 NTSYSCALLAPI
8774 NTSTATUS
8775 NTAPI
8776 NtWaitForSingleObject(
8777 IN HANDLE ObjectHandle,
8778 IN BOOLEAN Alertable,
8779 IN PLARGE_INTEGER TimeOut OPTIONAL);
8780
8781 NTSYSAPI
8782 NTSTATUS
8783 NTAPI
8784 ZwWaitForSingleObject(
8785 IN HANDLE ObjectHandle,
8786 IN BOOLEAN Alertable,
8787 IN PLARGE_INTEGER TimeOut OPTIONAL);
8788
8789 NTSYSCALLAPI
8790 NTSTATUS
8791 NTAPI
8792 NtWriteFile(
8793 IN HANDLE FileHandle,
8794 IN HANDLE Event OPTIONAL,
8795 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
8796 IN PVOID ApcContext OPTIONAL,
8797 OUT PIO_STATUS_BLOCK IoStatusBlock,
8798 IN PVOID Buffer,
8799 IN ULONG Length,
8800 IN PLARGE_INTEGER ByteOffset OPTIONAL,
8801 IN PULONG Key OPTIONAL);
8802
8803 NTSYSAPI
8804 NTSTATUS
8805 NTAPI
8806 ZwWriteFile(
8807 IN HANDLE FileHandle,
8808 IN HANDLE Event OPTIONAL,
8809 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
8810 IN PVOID ApcContext OPTIONAL,
8811 OUT PIO_STATUS_BLOCK IoStatusBlock,
8812 IN PVOID Buffer,
8813 IN ULONG Length,
8814 IN PLARGE_INTEGER ByteOffset OPTIONAL,
8815 IN PULONG Key OPTIONAL);
8816
8817
8818
8819 /** Power management support routines **/
8820
8821 NTKERNELAPI
8822 NTSTATUS
8823 NTAPI
8824 PoCallDriver(
8825 IN PDEVICE_OBJECT DeviceObject,
8826 IN OUT PIRP Irp);
8827
8828 NTKERNELAPI
8829 PULONG
8830 NTAPI
8831 PoRegisterDeviceForIdleDetection(
8832 IN PDEVICE_OBJECT DeviceObject,
8833 IN ULONG ConservationIdleTime,
8834 IN ULONG PerformanceIdleTime,
8835 IN DEVICE_POWER_STATE State);
8836
8837 NTKERNELAPI
8838 PVOID
8839 NTAPI
8840 PoRegisterSystemState(
8841 IN PVOID StateHandle,
8842 IN EXECUTION_STATE Flags);
8843
8844 NTKERNELAPI
8845 NTSTATUS
8846 NTAPI
8847 PoRequestPowerIrp(
8848 IN PDEVICE_OBJECT DeviceObject,
8849 IN UCHAR MinorFunction,
8850 IN POWER_STATE PowerState,
8851 IN PREQUEST_POWER_COMPLETE CompletionFunction,
8852 IN PVOID Context,
8853 OUT PIRP *Irp OPTIONAL);
8854
8855 NTKERNELAPI
8856 NTSTATUS
8857 NTAPI
8858 PoRequestShutdownEvent(
8859 OUT PVOID *Event);
8860
8861 NTKERNELAPI
8862 VOID
8863 NTAPI
8864 PoSetDeviceBusy(
8865 PULONG IdlePointer);
8866
8867 #define PoSetDeviceBusy(IdlePointer) \
8868 ((void)(*(IdlePointer) = 0))
8869
8870 NTKERNELAPI
8871 POWER_STATE
8872 NTAPI
8873 PoSetPowerState(
8874 IN PDEVICE_OBJECT DeviceObject,
8875 IN POWER_STATE_TYPE Type,
8876 IN POWER_STATE State);
8877
8878 NTKERNELAPI
8879 VOID
8880 NTAPI
8881 PoSetSystemState(
8882 IN EXECUTION_STATE Flags);
8883
8884 NTKERNELAPI
8885 VOID
8886 NTAPI
8887 PoStartNextPowerIrp(
8888 IN PIRP Irp);
8889
8890 NTKERNELAPI
8891 VOID
8892 NTAPI
8893 PoUnregisterSystemState(
8894 IN PVOID StateHandle);
8895
8896
8897
8898 /** WMI library support routines **/
8899
8900 NTSTATUS
8901 NTAPI
8902 WmiCompleteRequest(
8903 IN PDEVICE_OBJECT DeviceObject,
8904 IN PIRP Irp,
8905 IN NTSTATUS Status,
8906 IN ULONG BufferUsed,
8907 IN CCHAR PriorityBoost);
8908
8909 NTSTATUS
8910 NTAPI
8911 WmiFireEvent(
8912 IN PDEVICE_OBJECT DeviceObject,
8913 IN LPGUID Guid,
8914 IN ULONG InstanceIndex,
8915 IN ULONG EventDataSize,
8916 IN PVOID EventData);
8917
8918 NTKERNELAPI
8919 NTSTATUS
8920 NTAPI
8921 WmiQueryTraceInformation(
8922 IN TRACE_INFORMATION_CLASS TraceInformationClass,
8923 OUT PVOID TraceInformation,
8924 IN ULONG TraceInformationLength,
8925 OUT PULONG RequiredLength OPTIONAL,
8926 IN PVOID Buffer OPTIONAL);
8927
8928 NTSTATUS
8929 NTAPI
8930 WmiSystemControl(
8931 IN PWMILIB_CONTEXT WmiLibInfo,
8932 IN PDEVICE_OBJECT DeviceObject,
8933 IN PIRP Irp,
8934 OUT PSYSCTL_IRP_DISPOSITION IrpDisposition);
8935
8936 NTKERNELAPI
8937 NTSTATUS
8938 DDKCDECLAPI
8939 WmiTraceMessage(
8940 IN TRACEHANDLE LoggerHandle,
8941 IN ULONG MessageFlags,
8942 IN LPGUID MessageGuid,
8943 IN USHORT MessageNumber,
8944 IN ...);
8945
8946 #if 0
8947 /* FIXME: Get va_list from where? */
8948 NTKERNELAPI
8949 NTSTATUS
8950 DDKCDECLAPI
8951 WmiTraceMessageVa(
8952 IN TRACEHANDLE LoggerHandle,
8953 IN ULONG MessageFlags,
8954 IN LPGUID MessageGuid,
8955 IN USHORT MessageNumber,
8956 IN va_list MessageArgList);
8957 #endif
8958
8959
8960 /** Kernel debugger routines **/
8961
8962 NTKERNELAPI
8963 NTSTATUS
8964 NTAPI
8965 KdDisableDebugger(
8966 VOID);
8967
8968 NTKERNELAPI
8969 NTSTATUS
8970 NTAPI
8971 KdEnableDebugger(
8972 VOID);
8973
8974 NTKERNELAPI
8975 BOOLEAN
8976 NTAPI
8977 KdRefreshDebuggerNotPresent(
8978 VOID
8979 );
8980
8981 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
8982 NTKERNELAPI
8983 NTSTATUS
8984 NTAPI
8985 KdChangeOption(
8986 IN KD_OPTION Option,
8987 IN ULONG InBufferBytes OPTIONAL,
8988 IN PVOID InBuffer,
8989 IN ULONG OutBufferBytes OPTIONAL,
8990 OUT PVOID OutBuffer,
8991 OUT PULONG OutBufferNeeded OPTIONAL);
8992 #endif
8993
8994 VOID
8995 NTAPI
8996 DbgBreakPoint(
8997 VOID);
8998
8999 NTSYSAPI
9000 VOID
9001 NTAPI
9002 DbgBreakPointWithStatus(
9003 IN ULONG Status);
9004
9005 ULONG
9006 DDKCDECLAPI
9007 DbgPrint(
9008 IN PCCH Format,
9009 IN ...);
9010
9011 NTSYSAPI
9012 ULONG
9013 DDKCDECLAPI
9014 DbgPrintEx(
9015 IN ULONG ComponentId,
9016 IN ULONG Level,
9017 IN PCCH Format,
9018 IN ...);
9019
9020 ULONG
9021 NTAPI
9022 vDbgPrintEx(
9023 IN ULONG ComponentId,
9024 IN ULONG Level,
9025 IN PCCH Format,
9026 IN va_list ap);
9027
9028 ULONG
9029 NTAPI
9030 vDbgPrintExWithPrefix(
9031 IN PCCH Prefix,
9032 IN ULONG ComponentId,
9033 IN ULONG Level,
9034 IN PCCH Format,
9035 IN va_list ap);
9036
9037 NTKERNELAPI
9038 ULONG
9039 DDKCDECLAPI
9040 DbgPrintReturnControlC(
9041 IN PCCH Format,
9042 IN ...);
9043
9044 ULONG
9045 NTAPI
9046 DbgPrompt(
9047 IN PCCH Prompt,
9048 OUT PCH Response,
9049 IN ULONG MaximumResponseLength
9050 );
9051
9052 NTKERNELAPI
9053 NTSTATUS
9054 NTAPI
9055 DbgQueryDebugFilterState(
9056 IN ULONG ComponentId,
9057 IN ULONG Level);
9058
9059 NTKERNELAPI
9060 NTSTATUS
9061 NTAPI
9062 DbgSetDebugFilterState(
9063 IN ULONG ComponentId,
9064 IN ULONG Level,
9065 IN BOOLEAN State);
9066
9067 #if DBG
9068
9069 #define KdPrint(_x_) DbgPrint _x_
9070 #define KdPrintEx(_x_) DbgPrintEx _x_
9071 #define KdBreakPoint() DbgBreakPoint()
9072 #define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
9073
9074 #else /* !DBG */
9075
9076 #define KdPrint(_x_)
9077 #define KdPrintEx(_x_)
9078 #define KdBreakPoint()
9079 #define KdBreakPointWithStatus(s)
9080
9081 #endif /* !DBG */
9082
9083 #if defined(__GNUC__)
9084
9085 extern NTKERNELAPI BOOLEAN KdDebuggerNotPresent;
9086 extern NTKERNELAPI BOOLEAN KdDebuggerEnabled;
9087 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
9088 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
9089
9090 #elif defined(_NTDDK_) || defined(_NTHAL_) || defined(_WDMDDK_) || defined(_NTOSP_)
9091
9092 extern NTKERNELAPI PBOOLEAN KdDebuggerNotPresent;
9093 extern NTKERNELAPI PBOOLEAN KdDebuggerEnabled;
9094 #define KD_DEBUGGER_ENABLED *KdDebuggerEnabled
9095 #define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
9096
9097 #else
9098
9099 extern BOOLEAN KdDebuggerNotPresent;
9100 extern BOOLEAN KdDebuggerEnabled;
9101 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
9102 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
9103
9104 #endif
9105
9106 /** Stuff from winnt4.h */
9107
9108 #ifndef DMA_MACROS_DEFINED
9109
9110 #if (NTDDI_VERSION >= NTDDI_WIN2K)
9111
9112 //DECLSPEC_DEPRECATED_DDK
9113 NTHALAPI
9114 BOOLEAN
9115 NTAPI
9116 IoFlushAdapterBuffers(
9117 IN PADAPTER_OBJECT AdapterObject,
9118 IN PMDL Mdl,
9119 IN PVOID MapRegisterBase,
9120 IN PVOID CurrentVa,
9121 IN ULONG Length,
9122 IN BOOLEAN WriteToDevice);
9123
9124 //DECLSPEC_DEPRECATED_DDK
9125 NTHALAPI
9126 VOID
9127 NTAPI
9128 IoFreeAdapterChannel(
9129 IN PADAPTER_OBJECT AdapterObject);
9130
9131 //DECLSPEC_DEPRECATED_DDK
9132 NTHALAPI
9133 VOID
9134 NTAPI
9135 IoFreeMapRegisters(
9136 IN PADAPTER_OBJECT AdapterObject,
9137 IN PVOID MapRegisterBase,
9138 IN ULONG NumberOfMapRegisters);
9139
9140 //DECLSPEC_DEPRECATED_DDK
9141 NTHALAPI
9142 PHYSICAL_ADDRESS
9143 NTAPI
9144 IoMapTransfer(
9145 IN PADAPTER_OBJECT AdapterObject,
9146 IN PMDL Mdl,
9147 IN PVOID MapRegisterBase,
9148 IN PVOID CurrentVa,
9149 IN OUT PULONG Length,
9150 IN BOOLEAN WriteToDevice);
9151
9152
9153 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
9154 #endif // !defined(DMA_MACROS_DEFINED)
9155
9156 NTKERNELAPI
9157 NTSTATUS
9158 NTAPI
9159 IoAssignResources(
9160 IN PUNICODE_STRING RegistryPath,
9161 IN PUNICODE_STRING DriverClassName OPTIONAL,
9162 IN PDRIVER_OBJECT DriverObject,
9163 IN PDEVICE_OBJECT DeviceObject OPTIONAL,
9164 IN PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources,
9165 IN OUT PCM_RESOURCE_LIST *AllocatedResources);
9166
9167 NTKERNELAPI
9168 NTSTATUS
9169 NTAPI
9170 IoAttachDeviceByPointer(
9171 IN PDEVICE_OBJECT SourceDevice,
9172 IN PDEVICE_OBJECT TargetDevice);
9173
9174 NTKERNELAPI
9175 BOOLEAN
9176 NTAPI
9177 MmIsNonPagedSystemAddressValid(
9178 IN PVOID VirtualAddress);
9179
9180 #if defined(_AMD64_) || defined(_IA64_)
9181 //DECLSPEC_DEPRECATED_DDK_WINXP
9182 static __inline
9183 LARGE_INTEGER
9184 NTAPI_INLINE
9185 RtlLargeIntegerDivide(
9186 IN LARGE_INTEGER Dividend,
9187 IN LARGE_INTEGER Divisor,
9188 IN OUT PLARGE_INTEGER Remainder)
9189 {
9190 LARGE_INTEGER ret;
9191 ret.QuadPart = Dividend.QuadPart / Divisor.QuadPart;
9192 if (Remainder)
9193 Remainder->QuadPart = Dividend.QuadPart % Divisor.QuadPart;
9194 return ret;
9195 }
9196 #else
9197 NTSYSAPI
9198 LARGE_INTEGER
9199 NTAPI
9200 RtlLargeIntegerDivide(
9201 IN LARGE_INTEGER Dividend,
9202 IN LARGE_INTEGER Divisor,
9203 IN OUT PLARGE_INTEGER Remainder);
9204 #endif
9205
9206 NTKERNELAPI
9207 INTERLOCKED_RESULT
9208 NTAPI
9209 ExInterlockedDecrementLong(
9210 IN PLONG Addend,
9211 IN PKSPIN_LOCK Lock);
9212
9213 NTKERNELAPI
9214 ULONG
9215 NTAPI
9216 ExInterlockedExchangeUlong(
9217 IN PULONG Target,
9218 IN ULONG Value,
9219 IN PKSPIN_LOCK Lock);
9220
9221 NTKERNELAPI
9222 INTERLOCKED_RESULT
9223 NTAPI
9224 ExInterlockedIncrementLong(
9225 IN PLONG Addend,
9226 IN PKSPIN_LOCK Lock);
9227
9228 NTHALAPI
9229 VOID
9230 NTAPI
9231 HalAcquireDisplayOwnership(
9232 IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters);
9233
9234 NTHALAPI
9235 NTSTATUS
9236 NTAPI
9237 HalAllocateAdapterChannel(
9238 IN PADAPTER_OBJECT AdapterObject,
9239 IN PWAIT_CONTEXT_BLOCK Wcb,
9240 IN ULONG NumberOfMapRegisters,
9241 IN PDRIVER_CONTROL ExecutionRoutine);
9242
9243 NTHALAPI
9244 PVOID
9245 NTAPI
9246 HalAllocateCommonBuffer(
9247 IN PADAPTER_OBJECT AdapterObject,
9248 IN ULONG Length,
9249 OUT PPHYSICAL_ADDRESS LogicalAddress,
9250 IN BOOLEAN CacheEnabled);
9251
9252 NTHALAPI
9253 NTSTATUS
9254 NTAPI
9255 HalAssignSlotResources(
9256 IN PUNICODE_STRING RegistryPath,
9257 IN PUNICODE_STRING DriverClassName,
9258 IN PDRIVER_OBJECT DriverObject,
9259 IN PDEVICE_OBJECT DeviceObject,
9260 IN INTERFACE_TYPE BusType,
9261 IN ULONG BusNumber,
9262 IN ULONG SlotNumber,
9263 IN OUT PCM_RESOURCE_LIST *AllocatedResources);
9264
9265 NTHALAPI
9266 VOID
9267 NTAPI
9268 HalFreeCommonBuffer(
9269 IN PADAPTER_OBJECT AdapterObject,
9270 IN ULONG Length,
9271 IN PHYSICAL_ADDRESS LogicalAddress,
9272 IN PVOID VirtualAddress,
9273 IN BOOLEAN CacheEnabled);
9274
9275 NTHALAPI
9276 PADAPTER_OBJECT
9277 NTAPI
9278 HalGetAdapter(
9279 IN PDEVICE_DESCRIPTION DeviceDescription,
9280 IN OUT PULONG NumberOfMapRegisters);
9281
9282 NTHALAPI
9283 ULONG
9284 NTAPI
9285 HalGetBusData(
9286 IN BUS_DATA_TYPE BusDataType,
9287 IN ULONG BusNumber,
9288 IN ULONG SlotNumber,
9289 IN PVOID Buffer,
9290 IN ULONG Length);
9291
9292 NTHALAPI
9293 ULONG
9294 NTAPI
9295 HalGetBusDataByOffset(
9296 IN BUS_DATA_TYPE BusDataType,
9297 IN ULONG BusNumber,
9298 IN ULONG SlotNumber,
9299 IN PVOID Buffer,
9300 IN ULONG Offset,
9301 IN ULONG Length);
9302
9303 NTHALAPI
9304 ULONG
9305 NTAPI
9306 HalGetDmaAlignmentRequirement(
9307 VOID);
9308
9309 NTHALAPI
9310 ULONG
9311 NTAPI
9312 HalGetInterruptVector(
9313 IN INTERFACE_TYPE InterfaceType,
9314 IN ULONG BusNumber,
9315 IN ULONG BusInterruptLevel,
9316 IN ULONG BusInterruptVector,
9317 OUT PKIRQL Irql,
9318 OUT PKAFFINITY Affinity);
9319
9320 NTHALAPI
9321 ULONG
9322 NTAPI
9323 HalReadDmaCounter(
9324 IN PADAPTER_OBJECT AdapterObject);
9325
9326 NTHALAPI
9327 ULONG
9328 NTAPI
9329 HalSetBusData(
9330 IN BUS_DATA_TYPE BusDataType,
9331 IN ULONG BusNumber,
9332 IN ULONG SlotNumber,
9333 IN PVOID Buffer,
9334 IN ULONG Length);
9335
9336 NTHALAPI
9337 ULONG
9338 NTAPI
9339 HalSetBusDataByOffset(
9340 IN BUS_DATA_TYPE BusDataType,
9341 IN ULONG BusNumber,
9342 IN ULONG SlotNumber,
9343 IN PVOID Buffer,
9344 IN ULONG Offset,
9345 IN ULONG Length);
9346
9347 NTHALAPI
9348 BOOLEAN
9349 NTAPI
9350 HalTranslateBusAddress(
9351 IN INTERFACE_TYPE InterfaceType,
9352 IN ULONG BusNumber,
9353 IN PHYSICAL_ADDRESS BusAddress,
9354 IN OUT PULONG AddressSpace,
9355 OUT PPHYSICAL_ADDRESS TranslatedAddress);
9356
9357 NTSYSAPI
9358 BOOLEAN
9359 NTAPI
9360 RtlLargeIntegerEqualToZero(
9361 IN LARGE_INTEGER Operand);
9362
9363 NTSYSAPI
9364 BOOLEAN
9365 NTAPI
9366 RtlLargeIntegerGreaterOrEqualToZero(
9367 IN LARGE_INTEGER Operand);
9368
9369 NTSYSAPI
9370 BOOLEAN
9371 NTAPI
9372 RtlLargeIntegerGreaterThan(
9373 IN LARGE_INTEGER Operand1,
9374 IN LARGE_INTEGER Operand2);
9375
9376 NTSYSAPI
9377 BOOLEAN
9378 NTAPI
9379 RtlLargeIntegerGreaterThanOrEqualTo(
9380 IN LARGE_INTEGER Operand1,
9381 IN LARGE_INTEGER Operand2);
9382
9383 NTSYSAPI
9384 BOOLEAN
9385 NTAPI
9386 RtlLargeIntegerGreaterThanZero(
9387 IN LARGE_INTEGER Operand);
9388
9389 NTSYSAPI
9390 BOOLEAN
9391 NTAPI
9392 RtlLargeIntegerLessOrEqualToZero(
9393 IN LARGE_INTEGER Operand);
9394
9395 NTSYSAPI
9396 BOOLEAN
9397 NTAPI
9398 RtlLargeIntegerLessThan(
9399 IN LARGE_INTEGER Operand1,
9400 IN LARGE_INTEGER Operand2);
9401
9402 NTSYSAPI
9403 BOOLEAN
9404 NTAPI
9405 RtlLargeIntegerLessThanOrEqualTo(
9406 IN LARGE_INTEGER Operand1,
9407 IN LARGE_INTEGER Operand2);
9408
9409 NTSYSAPI
9410 BOOLEAN
9411 NTAPI
9412 RtlLargeIntegerLessThanZero(
9413 IN LARGE_INTEGER Operand);
9414
9415 NTSYSAPI
9416 LARGE_INTEGER
9417 NTAPI
9418 RtlLargeIntegerNegate(
9419 IN LARGE_INTEGER Subtrahend);
9420
9421 NTSYSAPI
9422 BOOLEAN
9423 NTAPI
9424 RtlLargeIntegerNotEqualTo(
9425 IN LARGE_INTEGER Operand1,
9426 IN LARGE_INTEGER Operand2);
9427
9428 NTSYSAPI
9429 BOOLEAN
9430 NTAPI
9431 RtlLargeIntegerNotEqualToZero(
9432 IN LARGE_INTEGER Operand);
9433
9434 NTSYSAPI
9435 LARGE_INTEGER
9436 NTAPI
9437 RtlLargeIntegerShiftLeft(
9438 IN LARGE_INTEGER LargeInteger,
9439 IN CCHAR ShiftCount);
9440
9441 NTSYSAPI
9442 LARGE_INTEGER
9443 NTAPI
9444 RtlLargeIntegerShiftRight(
9445 IN LARGE_INTEGER LargeInteger,
9446 IN CCHAR ShiftCount);
9447
9448 NTSYSAPI
9449 LARGE_INTEGER
9450 NTAPI
9451 RtlLargeIntegerSubtract(
9452 IN LARGE_INTEGER Minuend,
9453 IN LARGE_INTEGER Subtrahend);
9454
9455
9456 /*
9457 * ULONG
9458 * COMPUTE_PAGES_SPANNED(
9459 * IN PVOID Va,
9460 * IN ULONG Size)
9461 */
9462 #define COMPUTE_PAGES_SPANNED(Va, \
9463 Size) \
9464 (ADDRESS_AND_SIZE_TO_SPAN_PAGES(Va, Size))
9465
9466
9467 /*
9468 ** Architecture specific structures
9469 */
9470
9471 #ifdef _X86_
9472
9473 NTKERNELAPI
9474 INTERLOCKED_RESULT
9475 FASTCALL
9476 Exfi386InterlockedIncrementLong(
9477 IN PLONG Addend);
9478
9479 NTKERNELAPI
9480 INTERLOCKED_RESULT
9481 FASTCALL
9482 Exfi386InterlockedDecrementLong(
9483 IN PLONG Addend);
9484
9485 NTKERNELAPI
9486 ULONG
9487 FASTCALL
9488 Exfi386InterlockedExchangeUlong(
9489 IN PULONG Target,
9490 IN ULONG Value);
9491
9492 #define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend)
9493 #define ExInterlockedDecrementLong(Addend,Lock) Exfi386InterlockedDecrementLong(Addend)
9494 #define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value)
9495
9496 #endif /* _X86_ */
9497
9498 #ifdef _M_ARM
9499 //
9500 // NT-ARM is not documented
9501 //
9502 #include <armddk.h>
9503 #endif
9504
9505 #ifdef __cplusplus
9506 }
9507 #endif
9508
9509 #endif /* __WINDDK_H */