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