2153d13900a75046b523699abd380b749f2f0d2e
[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 BOOLEAN
411 (DDKAPI *PKTRANSFER_ROUTINE)(
412 VOID);
413
414 #define ASSERT_GATE(object) \
415 ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == GateObject) || \
416 (((object)->Header.Type & KOBJECT_TYPE_MASK) == EventSynchronizationObject))
417
418 #define TIMER_TABLE_SIZE 512
419 #define TIMER_TABLE_SHIFT 9
420
421 #define ASSERT_TIMER(E) \
422 ASSERT(((E)->Header.Type == TimerNotificationObject) || \
423 ((E)->Header.Type == TimerSynchronizationObject))
424
425 #define ASSERT_MUTANT(E) \
426 ASSERT((E)->Header.Type == MutantObject)
427
428 #define ASSERT_SEMAPHORE(E) \
429 ASSERT((E)->Header.Type == SemaphoreObject)
430
431 #define ASSERT_EVENT(E) \
432 ASSERT(((E)->Header.Type == NotificationEvent) || \
433 ((E)->Header.Type == SynchronizationEvent))
434
435
436 typedef enum _TIMER_TYPE {
437 NotificationTimer,
438 SynchronizationTimer
439 } TIMER_TYPE;
440
441 #define KEYBOARD_INSERT_ON 0x08
442 #define KEYBOARD_CAPS_LOCK_ON 0x04
443 #define KEYBOARD_NUM_LOCK_ON 0x02
444 #define KEYBOARD_SCROLL_LOCK_ON 0x01
445 #define KEYBOARD_ALT_KEY_DOWN 0x80
446 #define KEYBOARD_CTRL_KEY_DOWN 0x40
447 #define KEYBOARD_LEFT_SHIFT_DOWN 0x20
448 #define KEYBOARD_RIGHT_SHIFT_DOWN 0x10
449
450 typedef struct _IO_COUNTERS {
451 ULONGLONG ReadOperationCount;
452 ULONGLONG WriteOperationCount;
453 ULONGLONG OtherOperationCount;
454 ULONGLONG ReadTransferCount;
455 ULONGLONG WriteTransferCount;
456 ULONGLONG OtherTransferCount;
457 } IO_COUNTERS, *PIO_COUNTERS;
458
459 typedef struct _VM_COUNTERS
460 {
461 SIZE_T PeakVirtualSize;
462 SIZE_T VirtualSize;
463 ULONG PageFaultCount;
464 SIZE_T PeakWorkingSetSize;
465 SIZE_T WorkingSetSize;
466 SIZE_T QuotaPeakPagedPoolUsage;
467 SIZE_T QuotaPagedPoolUsage;
468 SIZE_T QuotaPeakNonPagedPoolUsage;
469 SIZE_T QuotaNonPagedPoolUsage;
470 SIZE_T PagefileUsage;
471 SIZE_T PeakPagefileUsage;
472 } VM_COUNTERS, *PVM_COUNTERS;
473
474 typedef struct _VM_COUNTERS_EX
475 {
476 SIZE_T PeakVirtualSize;
477 SIZE_T VirtualSize;
478 ULONG PageFaultCount;
479 SIZE_T PeakWorkingSetSize;
480 SIZE_T WorkingSetSize;
481 SIZE_T QuotaPeakPagedPoolUsage;
482 SIZE_T QuotaPagedPoolUsage;
483 SIZE_T QuotaPeakNonPagedPoolUsage;
484 SIZE_T QuotaNonPagedPoolUsage;
485 SIZE_T PagefileUsage;
486 SIZE_T PeakPagefileUsage;
487 SIZE_T PrivateUsage;
488 } VM_COUNTERS_EX, *PVM_COUNTERS_EX;
489
490 typedef struct _POOLED_USAGE_AND_LIMITS
491 {
492 SIZE_T PeakPagedPoolUsage;
493 SIZE_T PagedPoolUsage;
494 SIZE_T PagedPoolLimit;
495 SIZE_T PeakNonPagedPoolUsage;
496 SIZE_T NonPagedPoolUsage;
497 SIZE_T NonPagedPoolLimit;
498 SIZE_T PeakPagefileUsage;
499 SIZE_T PagefileUsage;
500 SIZE_T PagefileLimit;
501 } POOLED_USAGE_AND_LIMITS, *PPOOLED_USAGE_AND_LIMITS;
502
503 typedef struct _CONTROLLER_OBJECT {
504 CSHORT Type;
505 CSHORT Size;
506 PVOID ControllerExtension;
507 KDEVICE_QUEUE DeviceWaitQueue;
508 ULONG Spare1;
509 LARGE_INTEGER Spare2;
510 } CONTROLLER_OBJECT, *PCONTROLLER_OBJECT;
511
512 /* DEVICE_OBJECT.Flags */
513
514 #define DO_DEVICE_HAS_NAME 0x00000040
515 #define DO_SYSTEM_BOOT_PARTITION 0x00000100
516 #define DO_LONG_TERM_REQUESTS 0x00000200
517 #define DO_NEVER_LAST_DEVICE 0x00000400
518 #define DO_LOW_PRIORITY_FILESYSTEM 0x00010000
519 #define DO_XIP 0x00020000
520
521 #define DRVO_REINIT_REGISTERED 0x00000008
522 #define DRVO_INITIALIZED 0x00000010
523 #define DRVO_BOOTREINIT_REGISTERED 0x00000020
524 #define DRVO_LEGACY_RESOURCES 0x00000040
525
526 typedef enum _ARBITER_REQUEST_SOURCE {
527 ArbiterRequestUndefined = -1,
528 ArbiterRequestLegacyReported,
529 ArbiterRequestHalReported,
530 ArbiterRequestLegacyAssigned,
531 ArbiterRequestPnpDetected,
532 ArbiterRequestPnpEnumerated
533 } ARBITER_REQUEST_SOURCE;
534
535 typedef enum _ARBITER_RESULT {
536 ArbiterResultUndefined = -1,
537 ArbiterResultSuccess,
538 ArbiterResultExternalConflict,
539 ArbiterResultNullRequest
540 } ARBITER_RESULT;
541
542 typedef enum _ARBITER_ACTION {
543 ArbiterActionTestAllocation,
544 ArbiterActionRetestAllocation,
545 ArbiterActionCommitAllocation,
546 ArbiterActionRollbackAllocation,
547 ArbiterActionQueryAllocatedResources,
548 ArbiterActionWriteReservedResources,
549 ArbiterActionQueryConflict,
550 ArbiterActionQueryArbitrate,
551 ArbiterActionAddReserved,
552 ArbiterActionBootAllocation
553 } ARBITER_ACTION, *PARBITER_ACTION;
554
555 typedef struct _ARBITER_CONFLICT_INFO {
556 PDEVICE_OBJECT OwningObject;
557 ULONGLONG Start;
558 ULONGLONG End;
559 } ARBITER_CONFLICT_INFO, *PARBITER_CONFLICT_INFO;
560
561 typedef struct _ARBITER_PARAMETERS {
562 union {
563 struct {
564 IN OUT PLIST_ENTRY ArbitrationList;
565 IN ULONG AllocateFromCount;
566 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom;
567 } TestAllocation;
568
569 struct {
570 IN OUT PLIST_ENTRY ArbitrationList;
571 IN ULONG AllocateFromCount;
572 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom;
573 } RetestAllocation;
574
575 struct {
576 IN OUT PLIST_ENTRY ArbitrationList;
577 } BootAllocation;
578
579 struct {
580 OUT PCM_PARTIAL_RESOURCE_LIST *AllocatedResources;
581 } QueryAllocatedResources;
582
583 struct {
584 IN PDEVICE_OBJECT PhysicalDeviceObject;
585 IN PIO_RESOURCE_DESCRIPTOR ConflictingResource;
586 OUT PULONG ConflictCount;
587 OUT PARBITER_CONFLICT_INFO *Conflicts;
588 } QueryConflict;
589
590 struct {
591 IN PLIST_ENTRY ArbitrationList;
592 } QueryArbitrate;
593
594 struct {
595 IN PDEVICE_OBJECT ReserveDevice;
596 } AddReserved;
597 } Parameters;
598 } ARBITER_PARAMETERS, *PARBITER_PARAMETERS;
599
600 #define ARBITER_FLAG_BOOT_CONFIG 0x00000001
601
602 typedef struct _ARBITER_LIST_ENTRY {
603 LIST_ENTRY ListEntry;
604 ULONG AlternativeCount;
605 PIO_RESOURCE_DESCRIPTOR Alternatives;
606 PDEVICE_OBJECT PhysicalDeviceObject;
607 ARBITER_REQUEST_SOURCE RequestSource;
608 ULONG Flags;
609 LONG_PTR WorkSpace;
610 INTERFACE_TYPE InterfaceType;
611 ULONG SlotNumber;
612 ULONG BusNumber;
613 PCM_PARTIAL_RESOURCE_DESCRIPTOR Assignment;
614 PIO_RESOURCE_DESCRIPTOR SelectedAlternative;
615 ARBITER_RESULT Result;
616 } ARBITER_LIST_ENTRY, *PARBITER_LIST_ENTRY;
617
618 typedef NTSTATUS
619 (DDKAPI *PARBITER_HANDLER)(
620 IN PVOID Context,
621 IN ARBITER_ACTION Action,
622 IN OUT PARBITER_PARAMETERS Parameters);
623
624 #define ARBITER_PARTIAL 0x00000001
625
626 typedef struct _ARBITER_INTERFACE {
627 USHORT Size;
628 USHORT Version;
629 PVOID Context;
630 PINTERFACE_REFERENCE InterfaceReference;
631 PINTERFACE_DEREFERENCE InterfaceDereference;
632 PARBITER_HANDLER ArbiterHandler;
633 ULONG Flags;
634 } ARBITER_INTERFACE, *PARBITER_INTERFACE;
635
636 typedef enum _HAL_QUERY_INFORMATION_CLASS {
637 HalInstalledBusInformation,
638 HalProfileSourceInformation,
639 HalInformationClassUnused1,
640 HalPowerInformation,
641 HalProcessorSpeedInformation,
642 HalCallbackInformation,
643 HalMapRegisterInformation,
644 HalMcaLogInformation,
645 HalFrameBufferCachingInformation,
646 HalDisplayBiosInformation,
647 HalProcessorFeatureInformation,
648 HalNumaTopologyInterface,
649 HalErrorInformation,
650 HalCmcLogInformation,
651 HalCpeLogInformation,
652 HalQueryMcaInterface,
653 HalQueryAMLIIllegalIOPortAddresses,
654 HalQueryMaxHotPlugMemoryAddress,
655 HalPartitionIpiInterface,
656 HalPlatformInformation,
657 HalQueryProfileSourceList
658 } HAL_QUERY_INFORMATION_CLASS, *PHAL_QUERY_INFORMATION_CLASS;
659
660 typedef enum _HAL_SET_INFORMATION_CLASS {
661 HalProfileSourceInterval,
662 HalProfileSourceInterruptHandler,
663 HalMcaRegisterDriver,
664 HalKernelErrorHandler,
665 HalCmcRegisterDriver,
666 HalCpeRegisterDriver,
667 HalMcaLog,
668 HalCmcLog,
669 HalCpeLog,
670 HalGenerateCmcInterrupt
671 } HAL_SET_INFORMATION_CLASS, *PHAL_SET_INFORMATION_CLASS;
672
673 typedef struct _HAL_PROFILE_SOURCE_INTERVAL
674 {
675 KPROFILE_SOURCE Source;
676 ULONG_PTR Interval;
677 } HAL_PROFILE_SOURCE_INTERVAL, *PHAL_PROFILE_SOURCE_INTERVAL;
678
679 typedef struct _HAL_PROFILE_SOURCE_INFORMATION
680 {
681 KPROFILE_SOURCE Source;
682 BOOLEAN Supported;
683 ULONG Interval;
684 } HAL_PROFILE_SOURCE_INFORMATION, *PHAL_PROFILE_SOURCE_INFORMATION;
685
686 typedef struct _MAP_REGISTER_ENTRY
687 {
688 PVOID MapRegister;
689 BOOLEAN WriteToDevice;
690 } MAP_REGISTER_ENTRY, *PMAP_REGISTER_ENTRY;
691
692 typedef struct
693 {
694 UCHAR Type;
695 BOOLEAN Valid;
696 UCHAR Reserved[2];
697 PUCHAR TranslatedAddress;
698 ULONG Length;
699 } DEBUG_DEVICE_ADDRESS, *PDEBUG_DEVICE_ADDRESS;
700
701 typedef struct
702 {
703 PHYSICAL_ADDRESS Start;
704 PHYSICAL_ADDRESS MaxEnd;
705 PVOID VirtualAddress;
706 ULONG Length;
707 BOOLEAN Cached;
708 BOOLEAN Aligned;
709 } DEBUG_MEMORY_REQUIREMENTS, *PDEBUG_MEMORY_REQUIREMENTS;
710
711 typedef struct
712 {
713 ULONG Bus;
714 ULONG Slot;
715 USHORT VendorID;
716 USHORT DeviceID;
717 UCHAR BaseClass;
718 UCHAR SubClass;
719 UCHAR ProgIf;
720 BOOLEAN Initialized;
721 DEBUG_DEVICE_ADDRESS BaseAddress[6];
722 DEBUG_MEMORY_REQUIREMENTS Memory;
723 } DEBUG_DEVICE_DESCRIPTOR, *PDEBUG_DEVICE_DESCRIPTOR;
724
725 /* Function Type Defintions for Dispatch Functions */
726 struct _DEVICE_CONTROL_CONTEXT;
727
728 typedef VOID
729 (DDKAPI *PDEVICE_CONTROL_COMPLETION)(
730 IN struct _DEVICE_CONTROL_CONTEXT *ControlContext);
731
732 typedef struct _DEVICE_CONTROL_CONTEXT {
733 NTSTATUS Status;
734 PDEVICE_HANDLER_OBJECT DeviceHandler;
735 PDEVICE_OBJECT DeviceObject;
736 ULONG ControlCode;
737 PVOID Buffer;
738 PULONG BufferLength;
739 PVOID Context;
740 } DEVICE_CONTROL_CONTEXT, *PDEVICE_CONTROL_CONTEXT;
741
742 typedef struct _PM_DISPATCH_TABLE {
743 ULONG Signature;
744 ULONG Version;
745 PVOID Function[1];
746 } PM_DISPATCH_TABLE, *PPM_DISPATCH_TABLE;
747
748 typedef enum _RESOURCE_TRANSLATION_DIRECTION {
749 TranslateChildToParent,
750 TranslateParentToChild
751 } RESOURCE_TRANSLATION_DIRECTION;
752
753 typedef NTSTATUS
754 (DDKAPI *PTRANSLATE_RESOURCE_HANDLER)(
755 IN PVOID Context,
756 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Source,
757 IN RESOURCE_TRANSLATION_DIRECTION Direction,
758 IN ULONG AlternativesCount,
759 IN IO_RESOURCE_DESCRIPTOR Alternatives[],
760 IN PDEVICE_OBJECT PhysicalDeviceObject,
761 OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR Target);
762
763 typedef NTSTATUS
764 (DDKAPI *PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER)(
765 IN PVOID Context,
766 IN PIO_RESOURCE_DESCRIPTOR Source,
767 IN PDEVICE_OBJECT PhysicalDeviceObject,
768 OUT PULONG TargetCount,
769 OUT PIO_RESOURCE_DESCRIPTOR *Target);
770
771 typedef struct _TRANSLATOR_INTERFACE {
772 USHORT Size;
773 USHORT Version;
774 PVOID Context;
775 PINTERFACE_REFERENCE InterfaceReference;
776 PINTERFACE_DEREFERENCE InterfaceDereference;
777 PTRANSLATE_RESOURCE_HANDLER TranslateResources;
778 PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER TranslateResourceRequirements;
779 } TRANSLATOR_INTERFACE, *PTRANSLATOR_INTERFACE;
780
781 typedef NTSTATUS
782 (DDKAPI *pHalDeviceControl)(
783 IN PDEVICE_HANDLER_OBJECT DeviceHandler,
784 IN PDEVICE_OBJECT DeviceObject,
785 IN ULONG ControlCode,
786 IN OUT PVOID Buffer OPTIONAL,
787 IN OUT PULONG BufferLength OPTIONAL,
788 IN PVOID Context,
789 IN PDEVICE_CONTROL_COMPLETION CompletionRoutine);
790
791 typedef VOID
792 (FASTCALL *pHalExamineMBR)(
793 IN PDEVICE_OBJECT DeviceObject,
794 IN ULONG SectorSize,
795 IN ULONG MBRTypeIdentifier,
796 OUT PVOID *Buffer);
797
798 typedef VOID
799 (FASTCALL *pHalIoAssignDriveLetters)(
800 IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
801 IN PSTRING NtDeviceName,
802 OUT PUCHAR NtSystemPath,
803 OUT PSTRING NtSystemPathString);
804
805 typedef NTSTATUS
806 (FASTCALL *pHalIoReadPartitionTable)(
807 IN PDEVICE_OBJECT DeviceObject,
808 IN ULONG SectorSize,
809 IN BOOLEAN ReturnRecognizedPartitions,
810 OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer);
811
812 typedef NTSTATUS
813 (FASTCALL *pHalIoSetPartitionInformation)(
814 IN PDEVICE_OBJECT DeviceObject,
815 IN ULONG SectorSize,
816 IN ULONG PartitionNumber,
817 IN ULONG PartitionType);
818
819 typedef NTSTATUS
820 (FASTCALL *pHalIoWritePartitionTable)(
821 IN PDEVICE_OBJECT DeviceObject,
822 IN ULONG SectorSize,
823 IN ULONG SectorsPerTrack,
824 IN ULONG NumberOfHeads,
825 IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer);
826
827 typedef PBUS_HANDLER
828 (FASTCALL *pHalHandlerForBus)(
829 IN INTERFACE_TYPE InterfaceType,
830 IN ULONG BusNumber);
831
832 typedef VOID
833 (FASTCALL *pHalReferenceBusHandler)(
834 IN PBUS_HANDLER BusHandler);
835
836 typedef NTSTATUS
837 (DDKAPI *pHalQuerySystemInformation)(
838 IN HAL_QUERY_INFORMATION_CLASS InformationClass,
839 IN ULONG BufferSize,
840 IN OUT PVOID Buffer,
841 OUT PULONG ReturnedLength);
842
843 typedef NTSTATUS
844 (DDKAPI *pHalSetSystemInformation)(
845 IN HAL_SET_INFORMATION_CLASS InformationClass,
846 IN ULONG BufferSize,
847 IN PVOID Buffer);
848
849 typedef NTSTATUS
850 (DDKAPI *pHalQueryBusSlots)(
851 IN PBUS_HANDLER BusHandler,
852 IN ULONG BufferSize,
853 OUT PULONG SlotNumbers,
854 OUT PULONG ReturnedLength);
855
856 typedef NTSTATUS
857 (DDKAPI *pHalInitPnpDriver)(
858 VOID);
859
860 typedef NTSTATUS
861 (DDKAPI *pHalInitPowerManagement)(
862 IN PPM_DISPATCH_TABLE PmDriverDispatchTable,
863 OUT PPM_DISPATCH_TABLE *PmHalDispatchTable);
864
865 typedef struct _DMA_ADAPTER*
866 (DDKAPI *pHalGetDmaAdapter)(
867 IN PVOID Context,
868 IN struct _DEVICE_DESCRIPTION *DeviceDescriptor,
869 OUT PULONG NumberOfMapRegisters);
870
871 typedef NTSTATUS
872 (DDKAPI *pHalGetInterruptTranslator)(
873 IN INTERFACE_TYPE ParentInterfaceType,
874 IN ULONG ParentBusNumber,
875 IN INTERFACE_TYPE BridgeInterfaceType,
876 IN USHORT Size,
877 IN USHORT Version,
878 OUT PTRANSLATOR_INTERFACE Translator,
879 OUT PULONG BridgeBusNumber);
880
881 typedef NTSTATUS
882 (DDKAPI *pHalStartMirroring)(
883 VOID);
884
885 typedef NTSTATUS
886 (DDKAPI *pHalEndMirroring)(
887 IN ULONG PassNumber);
888
889 typedef NTSTATUS
890 (DDKAPI *pHalMirrorPhysicalMemory)(
891 IN PHYSICAL_ADDRESS PhysicalAddress,
892 IN LARGE_INTEGER NumberOfBytes);
893
894 typedef NTSTATUS
895 (DDKAPI *pHalMirrorVerify)(
896 IN PHYSICAL_ADDRESS PhysicalAddress,
897 IN LARGE_INTEGER NumberOfBytes);
898
899 typedef VOID
900 (DDKAPI *pHalEndOfBoot)(
901 VOID);
902
903 typedef
904 BOOLEAN
905 (DDKAPI *pHalTranslateBusAddress)(
906 IN INTERFACE_TYPE InterfaceType,
907 IN ULONG BusNumber,
908 IN PHYSICAL_ADDRESS BusAddress,
909 IN OUT PULONG AddressSpace,
910 OUT PPHYSICAL_ADDRESS TranslatedAddress
911 );
912
913 typedef
914 NTSTATUS
915 (DDKAPI *pHalAssignSlotResources)(
916 IN PUNICODE_STRING RegistryPath,
917 IN PUNICODE_STRING DriverClassName OPTIONAL,
918 IN PDRIVER_OBJECT DriverObject,
919 IN PDEVICE_OBJECT DeviceObject,
920 IN INTERFACE_TYPE BusType,
921 IN ULONG BusNumber,
922 IN ULONG SlotNumber,
923 IN OUT PCM_RESOURCE_LIST *AllocatedResources
924 );
925
926 typedef
927 VOID
928 (DDKAPI *pHalHaltSystem)(
929 VOID
930 );
931
932 typedef
933 BOOLEAN
934 (DDKAPI *pHalResetDisplay)(
935 VOID
936 );
937
938 typedef
939 UCHAR
940 (DDKAPI *pHalVectorToIDTEntry)(
941 ULONG Vector
942 );
943
944 typedef
945 BOOLEAN
946 (DDKAPI *pHalFindBusAddressTranslation)(
947 IN PHYSICAL_ADDRESS BusAddress,
948 IN OUT PULONG AddressSpace,
949 OUT PPHYSICAL_ADDRESS TranslatedAddress,
950 IN OUT PULONG_PTR Context,
951 IN BOOLEAN NextBus
952 );
953
954 typedef
955 NTSTATUS
956 (DDKAPI *pKdSetupPciDeviceForDebugging)(
957 IN PVOID LoaderBlock OPTIONAL,
958 IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice
959 );
960
961 typedef
962 NTSTATUS
963 (DDKAPI *pKdReleasePciDeviceForDebugging)(
964 IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice
965 );
966
967 typedef
968 PVOID
969 (DDKAPI *pKdGetAcpiTablePhase0)(
970 IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
971 IN ULONG Signature
972 );
973
974 typedef
975 VOID
976 (DDKAPI *pKdCheckPowerButton)(
977 VOID
978 );
979
980 typedef
981 ULONG
982 (DDKAPI *pHalGetInterruptVector)(
983 IN INTERFACE_TYPE InterfaceType,
984 IN ULONG BusNumber,
985 IN ULONG BusInterruptLevel,
986 IN ULONG BusInterruptVector,
987 OUT PKIRQL Irql,
988 OUT PKAFFINITY Affinity
989 );
990
991 typedef
992 NTSTATUS
993 (DDKAPI *pHalGetVectorInput)(
994 IN ULONG Vector,
995 IN KAFFINITY Affinity,
996 OUT PULONG Input,
997 OUT PKINTERRUPT_POLARITY Polarity
998 );
999
1000 typedef
1001 PVOID
1002 (DDKAPI *pKdMapPhysicalMemory64)(
1003 IN PHYSICAL_ADDRESS PhysicalAddress,
1004 IN ULONG NumberPages
1005 );
1006
1007 typedef
1008 VOID
1009 (DDKAPI *pKdUnmapVirtualAddress)(
1010 IN PVOID VirtualAddress,
1011 IN ULONG NumberPages
1012 );
1013
1014 typedef
1015 ULONG
1016 (DDKAPI *pKdGetPciDataByOffset)(
1017 IN ULONG BusNumber,
1018 IN ULONG SlotNumber,
1019 OUT PVOID Buffer,
1020 IN ULONG Offset,
1021 IN ULONG Length
1022 );
1023
1024 typedef
1025 ULONG
1026 (DDKAPI *pKdSetPciDataByOffset)(
1027 IN ULONG BusNumber,
1028 IN ULONG SlotNumber,
1029 IN PVOID Buffer,
1030 IN ULONG Offset,
1031 IN ULONG Length
1032 );
1033
1034 typedef BOOLEAN
1035 (DDKAPI *PHAL_RESET_DISPLAY_PARAMETERS)(
1036 ULONG Columns, ULONG Rows);
1037
1038 typedef struct {
1039 ULONG Version;
1040 pHalQuerySystemInformation HalQuerySystemInformation;
1041 pHalSetSystemInformation HalSetSystemInformation;
1042 pHalQueryBusSlots HalQueryBusSlots;
1043 ULONG Spare1;
1044 pHalExamineMBR HalExamineMBR;
1045 pHalIoAssignDriveLetters HalIoAssignDriveLetters;
1046 pHalIoReadPartitionTable HalIoReadPartitionTable;
1047 pHalIoSetPartitionInformation HalIoSetPartitionInformation;
1048 pHalIoWritePartitionTable HalIoWritePartitionTable;
1049 pHalHandlerForBus HalReferenceHandlerForBus;
1050 pHalReferenceBusHandler HalReferenceBusHandler;
1051 pHalReferenceBusHandler HalDereferenceBusHandler;
1052 pHalInitPnpDriver HalInitPnpDriver;
1053 pHalInitPowerManagement HalInitPowerManagement;
1054 pHalGetDmaAdapter HalGetDmaAdapter;
1055 pHalGetInterruptTranslator HalGetInterruptTranslator;
1056 pHalStartMirroring HalStartMirroring;
1057 pHalEndMirroring HalEndMirroring;
1058 pHalMirrorPhysicalMemory HalMirrorPhysicalMemory;
1059 pHalEndOfBoot HalEndOfBoot;
1060 pHalMirrorVerify HalMirrorVerify;
1061 } HAL_DISPATCH, *PHAL_DISPATCH;
1062
1063 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTHAL_)
1064 extern NTSYSAPI PHAL_DISPATCH HalDispatchTable;
1065 #define HALDISPATCH ((PHAL_DISPATCH)&HalDispatchTable)
1066 #else
1067 extern __declspec(dllexport) HAL_DISPATCH HalDispatchTable;
1068 #define HALDISPATCH (&HalDispatchTable)
1069 #endif
1070
1071 #define HAL_DISPATCH_VERSION 3
1072 #define HalDispatchTableVersion HALDISPATCH->Version
1073 #define HalQuerySystemInformation HALDISPATCH->HalQuerySystemInformation
1074 #define HalSetSystemInformation HALDISPATCH->HalSetSystemInformation
1075 #define HalQueryBusSlots HALDISPATCH->HalQueryBusSlots
1076 #define HalReferenceHandlerForBus HALDISPATCH->HalReferenceHandlerForBus
1077 #define HalReferenceBusHandler HALDISPATCH->HalReferenceBusHandler
1078 #define HalDereferenceBusHandler HALDISPATCH->HalDereferenceBusHandler
1079 #define HalInitPnpDriver HALDISPATCH->HalInitPnpDriver
1080 #define HalInitPowerManagement HALDISPATCH->HalInitPowerManagement
1081 #define HalGetDmaAdapter HALDISPATCH->HalGetDmaAdapter
1082 #define HalGetInterruptTranslator HALDISPATCH->HalGetInterruptTranslator
1083 #define HalStartMirroring HALDISPATCH->HalStartMirroring
1084 #define HalEndMirroring HALDISPATCH->HalEndMirroring
1085 #define HalMirrorPhysicalMemory HALDISPATCH->HalMirrorPhysicalMemory
1086 #define HalEndOfBoot HALDISPATCH->HalEndOfBoot
1087 #define HalMirrorVerify HALDISPATCH->HalMirrorVerify
1088
1089 typedef struct _FILE_ALIGNMENT_INFORMATION {
1090 ULONG AlignmentRequirement;
1091 } FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION;
1092
1093 typedef struct _FILE_NAME_INFORMATION {
1094 ULONG FileNameLength;
1095 WCHAR FileName[1];
1096 } FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;
1097
1098
1099 typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION {
1100 ULONG FileAttributes;
1101 ULONG ReparseTag;
1102 } FILE_ATTRIBUTE_TAG_INFORMATION, *PFILE_ATTRIBUTE_TAG_INFORMATION;
1103
1104 typedef struct _FILE_DISPOSITION_INFORMATION {
1105 BOOLEAN DeleteFile;
1106 } FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION;
1107
1108 typedef struct _FILE_END_OF_FILE_INFORMATION {
1109 LARGE_INTEGER EndOfFile;
1110 } FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION;
1111
1112 typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION {
1113 LARGE_INTEGER ValidDataLength;
1114 } FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION;
1115
1116 typedef union _FILE_SEGMENT_ELEMENT {
1117 PVOID64 Buffer;
1118 ULONGLONG Alignment;
1119 }FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT;
1120
1121 #define SE_UNSOLICITED_INPUT_PRIVILEGE 6
1122
1123 typedef struct _KEY_USER_FLAGS_INFORMATION {
1124 ULONG UserFlags;
1125 } KEY_USER_FLAGS_INFORMATION, *PKEY_USER_FLAGS_INFORMATION;
1126
1127 /* KEY_VALUE_Xxx.Type */
1128
1129 #define REG_NONE 0
1130 #define REG_SZ 1
1131 #define REG_EXPAND_SZ 2
1132 #define REG_BINARY 3
1133 #define REG_DWORD 4
1134 #define REG_DWORD_LITTLE_ENDIAN 4
1135 #define REG_DWORD_BIG_ENDIAN 5
1136 #define REG_LINK 6
1137 #define REG_MULTI_SZ 7
1138 #define REG_RESOURCE_LIST 8
1139 #define REG_FULL_RESOURCE_DESCRIPTOR 9
1140 #define REG_RESOURCE_REQUIREMENTS_LIST 10
1141 #define REG_QWORD 11
1142 #define REG_QWORD_LITTLE_ENDIAN 11
1143
1144 #define PCI_TYPE0_ADDRESSES 6
1145 #define PCI_TYPE1_ADDRESSES 2
1146 #define PCI_TYPE2_ADDRESSES 5
1147
1148 typedef struct _PCI_COMMON_CONFIG {
1149 USHORT VendorID;
1150 USHORT DeviceID;
1151 USHORT Command;
1152 USHORT Status;
1153 UCHAR RevisionID;
1154 UCHAR ProgIf;
1155 UCHAR SubClass;
1156 UCHAR BaseClass;
1157 UCHAR CacheLineSize;
1158 UCHAR LatencyTimer;
1159 UCHAR HeaderType;
1160 UCHAR BIST;
1161 union {
1162 struct _PCI_HEADER_TYPE_0 {
1163 ULONG BaseAddresses[PCI_TYPE0_ADDRESSES];
1164 ULONG CIS;
1165 USHORT SubVendorID;
1166 USHORT SubSystemID;
1167 ULONG ROMBaseAddress;
1168 UCHAR CapabilitiesPtr;
1169 UCHAR Reserved1[3];
1170 ULONG Reserved2;
1171 UCHAR InterruptLine;
1172 UCHAR InterruptPin;
1173 UCHAR MinimumGrant;
1174 UCHAR MaximumLatency;
1175 } type0;
1176 struct _PCI_HEADER_TYPE_1 {
1177 ULONG BaseAddresses[PCI_TYPE1_ADDRESSES];
1178 UCHAR PrimaryBus;
1179 UCHAR SecondaryBus;
1180 UCHAR SubordinateBus;
1181 UCHAR SecondaryLatency;
1182 UCHAR IOBase;
1183 UCHAR IOLimit;
1184 USHORT SecondaryStatus;
1185 USHORT MemoryBase;
1186 USHORT MemoryLimit;
1187 USHORT PrefetchBase;
1188 USHORT PrefetchLimit;
1189 ULONG PrefetchBaseUpper32;
1190 ULONG PrefetchLimitUpper32;
1191 USHORT IOBaseUpper16;
1192 USHORT IOLimitUpper16;
1193 UCHAR CapabilitiesPtr;
1194 UCHAR Reserved1[3];
1195 ULONG ROMBaseAddress;
1196 UCHAR InterruptLine;
1197 UCHAR InterruptPin;
1198 USHORT BridgeControl;
1199 } type1;
1200 struct _PCI_HEADER_TYPE_2 {
1201 ULONG SocketRegistersBaseAddress;
1202 UCHAR CapabilitiesPtr;
1203 UCHAR Reserved;
1204 USHORT SecondaryStatus;
1205 UCHAR PrimaryBus;
1206 UCHAR SecondaryBus;
1207 UCHAR SubordinateBus;
1208 UCHAR SecondaryLatency;
1209 struct {
1210 ULONG Base;
1211 ULONG Limit;
1212 } Range[PCI_TYPE2_ADDRESSES - 1];
1213 UCHAR InterruptLine;
1214 UCHAR InterruptPin;
1215 USHORT BridgeControl;
1216 } type2;
1217 } u;
1218 UCHAR DeviceSpecific[192];
1219 } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
1220
1221 /* PCI_COMMON_CONFIG.Command */
1222
1223 #define PCI_ENABLE_IO_SPACE 0x0001
1224 #define PCI_ENABLE_MEMORY_SPACE 0x0002
1225 #define PCI_ENABLE_BUS_MASTER 0x0004
1226 #define PCI_ENABLE_SPECIAL_CYCLES 0x0008
1227 #define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010
1228 #define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
1229 #define PCI_ENABLE_PARITY 0x0040
1230 #define PCI_ENABLE_WAIT_CYCLE 0x0080
1231 #define PCI_ENABLE_SERR 0x0100
1232 #define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200
1233
1234 /* PCI_COMMON_CONFIG.Status */
1235
1236 #define PCI_STATUS_CAPABILITIES_LIST 0x0010
1237 #define PCI_STATUS_66MHZ_CAPABLE 0x0020
1238 #define PCI_STATUS_UDF_SUPPORTED 0x0040
1239 #define PCI_STATUS_FAST_BACK_TO_BACK 0x0080
1240 #define PCI_STATUS_DATA_PARITY_DETECTED 0x0100
1241 #define PCI_STATUS_DEVSEL 0x0600
1242 #define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800
1243 #define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000
1244 #define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000
1245 #define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000
1246 #define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000
1247
1248 /* PCI_COMMON_CONFIG.HeaderType */
1249
1250 #define PCI_MULTIFUNCTION 0x80
1251 #define PCI_DEVICE_TYPE 0x00
1252 #define PCI_BRIDGE_TYPE 0x01
1253 #define PCI_CARDBUS_BRIDGE_TYPE 0x02
1254
1255 #define PCI_CONFIGURATION_TYPE(PciData) \
1256 (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
1257
1258 #define PCI_MULTIFUNCTION_DEVICE(PciData) \
1259 ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
1260
1261 /* PCI device classes */
1262
1263 #define PCI_CLASS_PRE_20 0x00
1264 #define PCI_CLASS_MASS_STORAGE_CTLR 0x01
1265 #define PCI_CLASS_NETWORK_CTLR 0x02
1266 #define PCI_CLASS_DISPLAY_CTLR 0x03
1267 #define PCI_CLASS_MULTIMEDIA_DEV 0x04
1268 #define PCI_CLASS_MEMORY_CTLR 0x05
1269 #define PCI_CLASS_BRIDGE_DEV 0x06
1270 #define PCI_CLASS_SIMPLE_COMMS_CTLR 0x07
1271 #define PCI_CLASS_BASE_SYSTEM_DEV 0x08
1272 #define PCI_CLASS_INPUT_DEV 0x09
1273 #define PCI_CLASS_DOCKING_STATION 0x0a
1274 #define PCI_CLASS_PROCESSOR 0x0b
1275 #define PCI_CLASS_SERIAL_BUS_CTLR 0x0c
1276
1277 /* PCI device subclasses for class 0 */
1278
1279 #define PCI_SUBCLASS_PRE_20_NON_VGA 0x00
1280 #define PCI_SUBCLASS_PRE_20_VGA 0x01
1281
1282 /* PCI device subclasses for class 1 (mass storage controllers)*/
1283
1284 #define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR 0x00
1285 #define PCI_SUBCLASS_MSC_IDE_CTLR 0x01
1286 #define PCI_SUBCLASS_MSC_FLOPPY_CTLR 0x02
1287 #define PCI_SUBCLASS_MSC_IPI_CTLR 0x03
1288 #define PCI_SUBCLASS_MSC_RAID_CTLR 0x04
1289 #define PCI_SUBCLASS_MSC_OTHER 0x80
1290
1291 /* PCI device subclasses for class 2 (network controllers)*/
1292
1293 #define PCI_SUBCLASS_NET_ETHERNET_CTLR 0x00
1294 #define PCI_SUBCLASS_NET_TOKEN_RING_CTLR 0x01
1295 #define PCI_SUBCLASS_NET_FDDI_CTLR 0x02
1296 #define PCI_SUBCLASS_NET_ATM_CTLR 0x03
1297 #define PCI_SUBCLASS_NET_OTHER 0x80
1298
1299 /* PCI device subclasses for class 3 (display controllers)*/
1300
1301 #define PCI_SUBCLASS_VID_VGA_CTLR 0x00
1302 #define PCI_SUBCLASS_VID_XGA_CTLR 0x01
1303 #define PCI_SUBCLASS_VID_3D_CTLR 0x02
1304 #define PCI_SUBCLASS_VID_OTHER 0x80
1305
1306 /* PCI device subclasses for class 4 (multimedia device)*/
1307
1308 #define PCI_SUBCLASS_MM_VIDEO_DEV 0x00
1309 #define PCI_SUBCLASS_MM_AUDIO_DEV 0x01
1310 #define PCI_SUBCLASS_MM_TELEPHONY_DEV 0x02
1311 #define PCI_SUBCLASS_MM_OTHER 0x80
1312
1313 /* PCI device subclasses for class 5 (memory controller)*/
1314
1315 #define PCI_SUBCLASS_MEM_RAM 0x00
1316 #define PCI_SUBCLASS_MEM_FLASH 0x01
1317 #define PCI_SUBCLASS_MEM_OTHER 0x80
1318
1319 /* PCI device subclasses for class 6 (bridge device)*/
1320
1321 #define PCI_SUBCLASS_BR_HOST 0x00
1322 #define PCI_SUBCLASS_BR_ISA 0x01
1323 #define PCI_SUBCLASS_BR_EISA 0x02
1324 #define PCI_SUBCLASS_BR_MCA 0x03
1325 #define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04
1326 #define PCI_SUBCLASS_BR_PCMCIA 0x05
1327 #define PCI_SUBCLASS_BR_NUBUS 0x06
1328 #define PCI_SUBCLASS_BR_CARDBUS 0x07
1329 #define PCI_SUBCLASS_BR_OTHER 0x80
1330
1331 /* PCI device subclasses for class C (serial bus controller)*/
1332
1333 #define PCI_SUBCLASS_SB_IEEE1394 0x00
1334 #define PCI_SUBCLASS_SB_ACCESS 0x01
1335 #define PCI_SUBCLASS_SB_SSA 0x02
1336 #define PCI_SUBCLASS_SB_USB 0x03
1337 #define PCI_SUBCLASS_SB_FIBRE_CHANNEL 0x04
1338 #define PCI_SUBCLASS_SB_SMBUS 0x05
1339
1340 #define PCI_MAX_DEVICES 32
1341 #define PCI_MAX_FUNCTION 8
1342 #define PCI_MAX_BRIDGE_NUMBER 0xFF
1343 #define PCI_INVALID_VENDORID 0xFFFF
1344 #define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific))
1345
1346 #define PCI_ADDRESS_MEMORY_SPACE 0x00000000
1347 #define PCI_ADDRESS_IO_SPACE 0x00000001
1348 #define PCI_ADDRESS_MEMORY_TYPE_MASK 0x00000006
1349 #define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x00000008
1350 #define PCI_ADDRESS_IO_ADDRESS_MASK 0xfffffffc
1351 #define PCI_ADDRESS_MEMORY_ADDRESS_MASK 0xfffffff0
1352 #define PCI_ADDRESS_ROM_ADDRESS_MASK 0xfffff800
1353
1354 #define PCI_TYPE_32BIT 0
1355 #define PCI_TYPE_20BIT 2
1356 #define PCI_TYPE_64BIT 4
1357
1358 typedef struct _PCI_SLOT_NUMBER {
1359 union {
1360 struct {
1361 ULONG DeviceNumber : 5;
1362 ULONG FunctionNumber : 3;
1363 ULONG Reserved : 24;
1364 } bits;
1365 ULONG AsULONG;
1366 } u;
1367 } PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER;
1368
1369 #define POOL_COLD_ALLOCATION 256
1370 #define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE 8
1371 #define POOL_RAISE_IF_ALLOCATION_FAILURE 16
1372
1373 typedef struct _OSVERSIONINFOA {
1374 ULONG dwOSVersionInfoSize;
1375 ULONG dwMajorVersion;
1376 ULONG dwMinorVersion;
1377 ULONG dwBuildNumber;
1378 ULONG dwPlatformId;
1379 CHAR szCSDVersion[128];
1380 } OSVERSIONINFOA, *POSVERSIONINFOA, *LPOSVERSIONINFOA;
1381
1382 typedef struct _OSVERSIONINFOW {
1383 ULONG dwOSVersionInfoSize;
1384 ULONG dwMajorVersion;
1385 ULONG dwMinorVersion;
1386 ULONG dwBuildNumber;
1387 ULONG dwPlatformId;
1388 WCHAR szCSDVersion[128];
1389 } OSVERSIONINFOW, *POSVERSIONINFOW, *LPOSVERSIONINFOW, RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW;
1390
1391 #ifdef UNICODE
1392 typedef OSVERSIONINFOW OSVERSIONINFO;
1393 typedef POSVERSIONINFOW POSVERSIONINFO;
1394 typedef LPOSVERSIONINFOW LPOSVERSIONINFO;
1395 #else
1396 typedef OSVERSIONINFOA OSVERSIONINFO;
1397 typedef POSVERSIONINFOA POSVERSIONINFO;
1398 typedef LPOSVERSIONINFOA LPOSVERSIONINFO;
1399 #endif // UNICODE
1400
1401 typedef struct _OSVERSIONINFOEXA {
1402 ULONG dwOSVersionInfoSize;
1403 ULONG dwMajorVersion;
1404 ULONG dwMinorVersion;
1405 ULONG dwBuildNumber;
1406 ULONG dwPlatformId;
1407 CHAR szCSDVersion[128];
1408 USHORT wServicePackMajor;
1409 USHORT wServicePackMinor;
1410 USHORT wSuiteMask;
1411 UCHAR wProductType;
1412 UCHAR wReserved;
1413 } OSVERSIONINFOEXA, *POSVERSIONINFOEXA, *LPOSVERSIONINFOEXA;
1414
1415 typedef struct _OSVERSIONINFOEXW {
1416 ULONG dwOSVersionInfoSize;
1417 ULONG dwMajorVersion;
1418 ULONG dwMinorVersion;
1419 ULONG dwBuildNumber;
1420 ULONG dwPlatformId;
1421 WCHAR szCSDVersion[128];
1422 USHORT wServicePackMajor;
1423 USHORT wServicePackMinor;
1424 USHORT wSuiteMask;
1425 UCHAR wProductType;
1426 UCHAR wReserved;
1427 } OSVERSIONINFOEXW, *POSVERSIONINFOEXW, *LPOSVERSIONINFOEXW, RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW;
1428
1429 #ifdef UNICODE
1430 typedef OSVERSIONINFOEXW OSVERSIONINFOEX;
1431 typedef POSVERSIONINFOEXW POSVERSIONINFOEX;
1432 typedef LPOSVERSIONINFOEXW LPOSVERSIONINFOEX;
1433 #else
1434 typedef OSVERSIONINFOEXA OSVERSIONINFOEX;
1435 typedef POSVERSIONINFOEXA POSVERSIONINFOEX;
1436 typedef LPOSVERSIONINFOEXA LPOSVERSIONINFOEX;
1437 #endif // UNICODE
1438
1439 NTSYSAPI
1440 ULONGLONG
1441 DDKAPI
1442 VerSetConditionMask(
1443 IN ULONGLONG ConditionMask,
1444 IN ULONG TypeMask,
1445 IN UCHAR Condition);
1446
1447 #define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType) \
1448 ((ConditionMask) = VerSetConditionMask((ConditionMask), \
1449 (TypeBitMask), (ComparisonType)))
1450
1451 /* RtlVerifyVersionInfo() TypeMask */
1452
1453 #define VER_MINORVERSION 0x0000001
1454 #define VER_MAJORVERSION 0x0000002
1455 #define VER_BUILDNUMBER 0x0000004
1456 #define VER_PLATFORMID 0x0000008
1457 #define VER_SERVICEPACKMINOR 0x0000010
1458 #define VER_SERVICEPACKMAJOR 0x0000020
1459 #define VER_SUITENAME 0x0000040
1460 #define VER_PRODUCT_TYPE 0x0000080
1461
1462 /* RtlVerifyVersionInfo() ComparisonType */
1463
1464 #define VER_EQUAL 1
1465 #define VER_GREATER 2
1466 #define VER_GREATER_EQUAL 3
1467 #define VER_LESS 4
1468 #define VER_LESS_EQUAL 5
1469 #define VER_AND 6
1470 #define VER_OR 7
1471
1472 #define VER_CONDITION_MASK 7
1473 #define VER_NUM_BITS_PER_CONDITION_MASK 3
1474
1475 struct _RTL_RANGE;
1476
1477 typedef BOOLEAN
1478 (NTAPI *PRTL_CONFLICT_RANGE_CALLBACK) (
1479 PVOID Context,
1480 struct _RTL_RANGE *Range
1481 );
1482
1483 typedef enum _EVENT_TYPE {
1484 NotificationEvent,
1485 SynchronizationEvent
1486 } EVENT_TYPE;
1487
1488 typedef enum _KWAIT_REASON {
1489 Executive,
1490 FreePage,
1491 PageIn,
1492 PoolAllocation,
1493 DelayExecution,
1494 Suspended,
1495 UserRequest,
1496 WrExecutive,
1497 WrFreePage,
1498 WrPageIn,
1499 WrPoolAllocation,
1500 WrDelayExecution,
1501 WrSuspended,
1502 WrUserRequest,
1503 WrEventPair,
1504 WrQueue,
1505 WrLpcReceive,
1506 WrLpcReply,
1507 WrVirtualMemory,
1508 WrPageOut,
1509 WrRendezvous,
1510 Spare2,
1511 WrGuardedMutex,
1512 Spare4,
1513 Spare5,
1514 Spare6,
1515 WrKernel,
1516 WrResource,
1517 WrPushLock,
1518 WrMutex,
1519 WrQuantumEnd,
1520 WrDispatchInt,
1521 WrPreempted,
1522 WrYieldExecution,
1523 MaximumWaitReason
1524 } KWAIT_REASON;
1525
1526 typedef struct _KWAIT_BLOCK {
1527 LIST_ENTRY WaitListEntry;
1528 struct _KTHREAD * RESTRICTED_POINTER Thread;
1529 PVOID Object;
1530 struct _KWAIT_BLOCK * RESTRICTED_POINTER NextWaitBlock;
1531 USHORT WaitKey;
1532 UCHAR WaitType;
1533 UCHAR SpareByte;
1534 } KWAIT_BLOCK, *PKWAIT_BLOCK, *RESTRICTED_POINTER PRKWAIT_BLOCK;
1535
1536 typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK;
1537
1538 typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK {
1539 BOOLEAN Removed;
1540 BOOLEAN Reserved[3];
1541 volatile LONG IoCount;
1542 KEVENT RemoveEvent;
1543 } IO_REMOVE_LOCK_COMMON_BLOCK;
1544
1545 typedef struct _IO_REMOVE_LOCK_DBG_BLOCK {
1546 LONG Signature;
1547 LONG HighWatermark;
1548 LONGLONG MaxLockedTicks;
1549 LONG AllocateTag;
1550 LIST_ENTRY LockList;
1551 KSPIN_LOCK Spin;
1552 volatile LONG LowMemoryCount;
1553 ULONG Reserved1[4];
1554 PVOID Reserved2;
1555 PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks;
1556 } IO_REMOVE_LOCK_DBG_BLOCK;
1557
1558 typedef struct _IO_REMOVE_LOCK {
1559 IO_REMOVE_LOCK_COMMON_BLOCK Common;
1560 #if DBG
1561 IO_REMOVE_LOCK_DBG_BLOCK Dbg;
1562 #endif
1563 } IO_REMOVE_LOCK, *PIO_REMOVE_LOCK;
1564
1565 typedef struct _IO_WORKITEM *PIO_WORKITEM;
1566
1567 typedef VOID
1568 (DDKAPI IO_WORKITEM_ROUTINE)(
1569 IN PDEVICE_OBJECT DeviceObject,
1570 IN PVOID Context);
1571 typedef IO_WORKITEM_ROUTINE *PIO_WORKITEM_ROUTINE;
1572
1573 typedef struct _SHARE_ACCESS {
1574 ULONG OpenCount;
1575 ULONG Readers;
1576 ULONG Writers;
1577 ULONG Deleters;
1578 ULONG SharedRead;
1579 ULONG SharedWrite;
1580 ULONG SharedDelete;
1581 } SHARE_ACCESS, *PSHARE_ACCESS;
1582
1583 typedef enum _KINTERRUPT_MODE {
1584 LevelSensitive,
1585 Latched
1586 } KINTERRUPT_MODE;
1587
1588 #define THREAD_WAIT_OBJECTS 3
1589
1590 typedef VOID
1591 (DDKAPI *PKINTERRUPT_ROUTINE)(
1592 VOID);
1593
1594 typedef enum _CREATE_FILE_TYPE {
1595 CreateFileTypeNone,
1596 CreateFileTypeNamedPipe,
1597 CreateFileTypeMailslot
1598 } CREATE_FILE_TYPE;
1599
1600 typedef struct _CONFIGURATION_INFORMATION {
1601 ULONG DiskCount;
1602 ULONG FloppyCount;
1603 ULONG CdRomCount;
1604 ULONG TapeCount;
1605 ULONG ScsiPortCount;
1606 ULONG SerialCount;
1607 ULONG ParallelCount;
1608 BOOLEAN AtDiskPrimaryAddressClaimed;
1609 BOOLEAN AtDiskSecondaryAddressClaimed;
1610 ULONG Version;
1611 ULONG MediumChangerCount;
1612 } CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION;
1613
1614 typedef enum _CONFIGURATION_TYPE {
1615 ArcSystem,
1616 CentralProcessor,
1617 FloatingPointProcessor,
1618 PrimaryIcache,
1619 PrimaryDcache,
1620 SecondaryIcache,
1621 SecondaryDcache,
1622 SecondaryCache,
1623 EisaAdapter,
1624 TcAdapter,
1625 ScsiAdapter,
1626 DtiAdapter,
1627 MultiFunctionAdapter,
1628 DiskController,
1629 TapeController,
1630 CdromController,
1631 WormController,
1632 SerialController,
1633 NetworkController,
1634 DisplayController,
1635 ParallelController,
1636 PointerController,
1637 KeyboardController,
1638 AudioController,
1639 OtherController,
1640 DiskPeripheral,
1641 FloppyDiskPeripheral,
1642 TapePeripheral,
1643 ModemPeripheral,
1644 MonitorPeripheral,
1645 PrinterPeripheral,
1646 PointerPeripheral,
1647 KeyboardPeripheral,
1648 TerminalPeripheral,
1649 OtherPeripheral,
1650 LinePeripheral,
1651 NetworkPeripheral,
1652 SystemMemory,
1653 DockingInformation,
1654 RealModeIrqRoutingTable,
1655 RealModePCIEnumeration,
1656 MaximumType
1657 } CONFIGURATION_TYPE, *PCONFIGURATION_TYPE;
1658
1659 #define IO_FORCE_ACCESS_CHECK 0x001
1660 #define IO_NO_PARAMETER_CHECKING 0x100
1661
1662 #define IO_REPARSE 0x0
1663 #define IO_REMOUNT 0x1
1664
1665 typedef NTSTATUS
1666 (DDKAPI *PIO_QUERY_DEVICE_ROUTINE)(
1667 IN PVOID Context,
1668 IN PUNICODE_STRING PathName,
1669 IN INTERFACE_TYPE BusType,
1670 IN ULONG BusNumber,
1671 IN PKEY_VALUE_FULL_INFORMATION *BusInformation,
1672 IN CONFIGURATION_TYPE ControllerType,
1673 IN ULONG ControllerNumber,
1674 IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation,
1675 IN CONFIGURATION_TYPE PeripheralType,
1676 IN ULONG PeripheralNumber,
1677 IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation);
1678
1679 typedef enum _IO_QUERY_DEVICE_DATA_FORMAT {
1680 IoQueryDeviceIdentifier = 0,
1681 IoQueryDeviceConfigurationData,
1682 IoQueryDeviceComponentInformation,
1683 IoQueryDeviceMaxData
1684 } IO_QUERY_DEVICE_DATA_FORMAT, *PIO_QUERY_DEVICE_DATA_FORMAT;
1685
1686 typedef enum _KBUGCHECK_CALLBACK_REASON {
1687 KbCallbackInvalid,
1688 KbCallbackReserved1,
1689 KbCallbackSecondaryDumpData,
1690 KbCallbackDumpIo,
1691 } KBUGCHECK_CALLBACK_REASON;
1692
1693 struct _KBUGCHECK_REASON_CALLBACK_RECORD;
1694
1695 typedef VOID
1696 (DDKAPI *PKBUGCHECK_REASON_CALLBACK_ROUTINE)(
1697 IN KBUGCHECK_CALLBACK_REASON Reason,
1698 IN struct _KBUGCHECK_REASON_CALLBACK_RECORD *Record,
1699 IN OUT PVOID ReasonSpecificData,
1700 IN ULONG ReasonSpecificDataLength);
1701
1702 typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD {
1703 LIST_ENTRY Entry;
1704 PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine;
1705 PUCHAR Component;
1706 ULONG_PTR Checksum;
1707 KBUGCHECK_CALLBACK_REASON Reason;
1708 UCHAR State;
1709 } KBUGCHECK_REASON_CALLBACK_RECORD, *PKBUGCHECK_REASON_CALLBACK_RECORD;
1710
1711 typedef enum _KBUGCHECK_BUFFER_DUMP_STATE {
1712 BufferEmpty,
1713 BufferInserted,
1714 BufferStarted,
1715 BufferFinished,
1716 BufferIncomplete
1717 } KBUGCHECK_BUFFER_DUMP_STATE;
1718
1719 typedef VOID
1720 (DDKAPI *PKBUGCHECK_CALLBACK_ROUTINE)(
1721 IN PVOID Buffer,
1722 IN ULONG Length);
1723
1724 typedef struct _KBUGCHECK_CALLBACK_RECORD {
1725 LIST_ENTRY Entry;
1726 PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine;
1727 PVOID Buffer;
1728 ULONG Length;
1729 PUCHAR Component;
1730 ULONG_PTR Checksum;
1731 UCHAR State;
1732 } KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD;
1733
1734 typedef BOOLEAN
1735 (DDKAPI *PNMI_CALLBACK)(
1736 IN PVOID Context,
1737 IN BOOLEAN Handled);
1738
1739 /*
1740 * VOID
1741 * KeInitializeCallbackRecord(
1742 * IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord)
1743 */
1744 #define KeInitializeCallbackRecord(CallbackRecord) \
1745 CallbackRecord->State = BufferEmpty;
1746
1747 typedef enum _KDPC_IMPORTANCE {
1748 LowImportance,
1749 MediumImportance,
1750 HighImportance
1751 } KDPC_IMPORTANCE;
1752
1753 typedef enum _MEMORY_CACHING_TYPE_ORIG {
1754 MmFrameBufferCached = 2
1755 } MEMORY_CACHING_TYPE_ORIG;
1756
1757 typedef enum _MEMORY_CACHING_TYPE {
1758 MmNonCached = FALSE,
1759 MmCached = TRUE,
1760 MmWriteCombined = MmFrameBufferCached,
1761 MmHardwareCoherentCached,
1762 MmNonCachedUnordered,
1763 MmUSWCCached,
1764 MmMaximumCacheType
1765 } MEMORY_CACHING_TYPE;
1766
1767 typedef enum _MM_PAGE_PRIORITY {
1768 LowPagePriority,
1769 NormalPagePriority = 16,
1770 HighPagePriority = 32
1771 } MM_PAGE_PRIORITY;
1772
1773 typedef enum _LOCK_OPERATION {
1774 IoReadAccess,
1775 IoWriteAccess,
1776 IoModifyAccess
1777 } LOCK_OPERATION;
1778
1779 #define FLUSH_MULTIPLE_MAXIMUM 32
1780
1781 typedef enum _MM_SYSTEM_SIZE {
1782 MmSmallSystem,
1783 MmMediumSystem,
1784 MmLargeSystem
1785 } MM_SYSTEMSIZE;
1786
1787 typedef struct _OBJECT_HANDLE_INFORMATION {
1788 ULONG HandleAttributes;
1789 ACCESS_MASK GrantedAccess;
1790 } OBJECT_HANDLE_INFORMATION, *POBJECT_HANDLE_INFORMATION;
1791
1792 typedef struct _CLIENT_ID {
1793 HANDLE UniqueProcess;
1794 HANDLE UniqueThread;
1795 } CLIENT_ID, *PCLIENT_ID;
1796
1797 typedef VOID
1798 (DDKAPI *PKSTART_ROUTINE)(
1799 IN PVOID StartContext);
1800
1801 typedef VOID
1802 (DDKAPI *PCREATE_PROCESS_NOTIFY_ROUTINE)(
1803 IN HANDLE ParentId,
1804 IN HANDLE ProcessId,
1805 IN BOOLEAN Create);
1806
1807 typedef VOID
1808 (DDKAPI *PCREATE_THREAD_NOTIFY_ROUTINE)(
1809 IN HANDLE ProcessId,
1810 IN HANDLE ThreadId,
1811 IN BOOLEAN Create);
1812
1813 typedef struct _IMAGE_INFO {
1814 _ANONYMOUS_UNION union {
1815 ULONG Properties;
1816 _ANONYMOUS_STRUCT struct {
1817 ULONG ImageAddressingMode : 8;
1818 ULONG SystemModeImage : 1;
1819 ULONG ImageMappedToAllPids : 1;
1820 ULONG Reserved : 22;
1821 } DUMMYSTRUCTNAME;
1822 } DUMMYUNIONNAME;
1823 PVOID ImageBase;
1824 ULONG ImageSelector;
1825 SIZE_T ImageSize;
1826 ULONG ImageSectionNumber;
1827 } IMAGE_INFO, *PIMAGE_INFO;
1828
1829 #define IMAGE_ADDRESSING_MODE_32BIT 3
1830
1831 typedef VOID
1832 (DDKAPI *PLOAD_IMAGE_NOTIFY_ROUTINE)(
1833 IN PUNICODE_STRING FullImageName,
1834 IN HANDLE ProcessId,
1835 IN PIMAGE_INFO ImageInfo);
1836
1837 #pragma pack(push,4)
1838 typedef enum _BUS_DATA_TYPE {
1839 ConfigurationSpaceUndefined = -1,
1840 Cmos,
1841 EisaConfiguration,
1842 Pos,
1843 CbusConfiguration,
1844 PCIConfiguration,
1845 VMEConfiguration,
1846 NuBusConfiguration,
1847 PCMCIAConfiguration,
1848 MPIConfiguration,
1849 MPSAConfiguration,
1850 PNPISAConfiguration,
1851 SgiInternalConfiguration,
1852 MaximumBusDataType
1853 } BUS_DATA_TYPE, *PBUS_DATA_TYPE;
1854 #pragma pack(pop)
1855
1856 typedef struct _NT_TIB {
1857 struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
1858 PVOID StackBase;
1859 PVOID StackLimit;
1860 PVOID SubSystemTib;
1861 _ANONYMOUS_UNION union {
1862 PVOID FiberData;
1863 ULONG Version;
1864 } DUMMYUNIONNAME;
1865 PVOID ArbitraryUserPointer;
1866 struct _NT_TIB *Self;
1867 } NT_TIB, *PNT_TIB;
1868
1869 typedef struct _NT_TIB32 {
1870 ULONG ExceptionList;
1871 ULONG StackBase;
1872 ULONG StackLimit;
1873 ULONG SubSystemTib;
1874 __GNU_EXTENSION union {
1875 ULONG FiberData;
1876 ULONG Version;
1877 };
1878 ULONG ArbitraryUserPointer;
1879 ULONG Self;
1880 } NT_TIB32,*PNT_TIB32;
1881
1882 typedef struct _NT_TIB64 {
1883 ULONG64 ExceptionList;
1884 ULONG64 StackBase;
1885 ULONG64 StackLimit;
1886 ULONG64 SubSystemTib;
1887 __GNU_EXTENSION union {
1888 ULONG64 FiberData;
1889 ULONG Version;
1890 };
1891 ULONG64 ArbitraryUserPointer;
1892 ULONG64 Self;
1893 } NT_TIB64,*PNT_TIB64;
1894
1895 typedef enum _PROCESSINFOCLASS {
1896 ProcessBasicInformation,
1897 ProcessQuotaLimits,
1898 ProcessIoCounters,
1899 ProcessVmCounters,
1900 ProcessTimes,
1901 ProcessBasePriority,
1902 ProcessRaisePriority,
1903 ProcessDebugPort,
1904 ProcessExceptionPort,
1905 ProcessAccessToken,
1906 ProcessLdtInformation,
1907 ProcessLdtSize,
1908 ProcessDefaultHardErrorMode,
1909 ProcessIoPortHandlers,
1910 ProcessPooledUsageAndLimits,
1911 ProcessWorkingSetWatch,
1912 ProcessUserModeIOPL,
1913 ProcessEnableAlignmentFaultFixup,
1914 ProcessPriorityClass,
1915 ProcessWx86Information,
1916 ProcessHandleCount,
1917 ProcessAffinityMask,
1918 ProcessPriorityBoost,
1919 ProcessDeviceMap,
1920 ProcessSessionInformation,
1921 ProcessForegroundInformation,
1922 ProcessWow64Information,
1923 ProcessImageFileName,
1924 ProcessLUIDDeviceMapsEnabled,
1925 ProcessBreakOnTermination,
1926 ProcessDebugObjectHandle,
1927 ProcessDebugFlags,
1928 ProcessHandleTracing,
1929 ProcessIoPriority,
1930 ProcessExecuteFlags,
1931 ProcessTlsInformation,
1932 ProcessCookie,
1933 ProcessImageInformation,
1934 ProcessCycleTime,
1935 ProcessPagePriority,
1936 ProcessInstrumentationCallback,
1937 MaxProcessInfoClass
1938 } PROCESSINFOCLASS;
1939
1940 typedef enum _THREADINFOCLASS {
1941 ThreadBasicInformation,
1942 ThreadTimes,
1943 ThreadPriority,
1944 ThreadBasePriority,
1945 ThreadAffinityMask,
1946 ThreadImpersonationToken,
1947 ThreadDescriptorTableEntry,
1948 ThreadEnableAlignmentFaultFixup,
1949 ThreadEventPair_Reusable,
1950 ThreadQuerySetWin32StartAddress,
1951 ThreadZeroTlsCell,
1952 ThreadPerformanceCount,
1953 ThreadAmILastThread,
1954 ThreadIdealProcessor,
1955 ThreadPriorityBoost,
1956 ThreadSetTlsArrayAddress,
1957 ThreadIsIoPending,
1958 ThreadHideFromDebugger,
1959 ThreadBreakOnTermination,
1960 ThreadSwitchLegacyState,
1961 ThreadIsTerminated,
1962 ThreadLastSystemCall,
1963 ThreadIoPriority,
1964 ThreadCycleTime,
1965 ThreadPagePriority,
1966 ThreadActualBasePriority,
1967 MaxThreadInfoClass
1968 } THREADINFOCLASS;
1969
1970 typedef struct _PROCESS_BASIC_INFORMATION
1971 {
1972 NTSTATUS ExitStatus;
1973 struct _PEB *PebBaseAddress;
1974 ULONG_PTR AffinityMask;
1975 KPRIORITY BasePriority;
1976 ULONG_PTR UniqueProcessId;
1977 ULONG_PTR InheritedFromUniqueProcessId;
1978 } PROCESS_BASIC_INFORMATION,*PPROCESS_BASIC_INFORMATION;
1979
1980 typedef struct _PROCESS_WS_WATCH_INFORMATION
1981 {
1982 PVOID FaultingPc;
1983 PVOID FaultingVa;
1984 } PROCESS_WS_WATCH_INFORMATION, *PPROCESS_WS_WATCH_INFORMATION;
1985
1986 typedef struct _PROCESS_DEVICEMAP_INFORMATION
1987 {
1988 __GNU_EXTENSION union
1989 {
1990 struct
1991 {
1992 HANDLE DirectoryHandle;
1993 } Set;
1994 struct
1995 {
1996 ULONG DriveMap;
1997 UCHAR DriveType[32];
1998 } Query;
1999 };
2000 } PROCESS_DEVICEMAP_INFORMATION, *PPROCESS_DEVICEMAP_INFORMATION;
2001
2002 typedef struct _KERNEL_USER_TIMES
2003 {
2004 LARGE_INTEGER CreateTime;
2005 LARGE_INTEGER ExitTime;
2006 LARGE_INTEGER KernelTime;
2007 LARGE_INTEGER UserTime;
2008 } KERNEL_USER_TIMES, *PKERNEL_USER_TIMES;
2009
2010 typedef struct _PROCESS_ACCESS_TOKEN
2011 {
2012 HANDLE Token;
2013 HANDLE Thread;
2014 } PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN;
2015
2016 typedef struct _PROCESS_SESSION_INFORMATION
2017 {
2018 ULONG SessionId;
2019 } PROCESS_SESSION_INFORMATION, *PPROCESS_SESSION_INFORMATION;
2020
2021 typedef VOID
2022 (DDKAPI *PREQUEST_POWER_COMPLETE)(
2023 IN PDEVICE_OBJECT DeviceObject,
2024 IN UCHAR MinorFunction,
2025 IN POWER_STATE PowerState,
2026 IN PVOID Context,
2027 IN PIO_STATUS_BLOCK IoStatus);
2028
2029 typedef enum _TRACE_INFORMATION_CLASS {
2030 TraceIdClass,
2031 TraceHandleClass,
2032 TraceEnableFlagsClass,
2033 TraceEnableLevelClass,
2034 GlobalLoggerHandleClass,
2035 EventLoggerHandleClass,
2036 AllLoggerHandlesClass,
2037 TraceHandleByNameClass
2038 } TRACE_INFORMATION_CLASS;
2039
2040 typedef enum _REG_NOTIFY_CLASS
2041 {
2042 RegNtDeleteKey,
2043 RegNtPreDeleteKey = RegNtDeleteKey,
2044 RegNtSetValueKey,
2045 RegNtPreSetValueKey = RegNtSetValueKey,
2046 RegNtDeleteValueKey,
2047 RegNtPreDeleteValueKey = RegNtDeleteValueKey,
2048 RegNtSetInformationKey,
2049 RegNtPreSetInformationKey = RegNtSetInformationKey,
2050 RegNtRenameKey,
2051 RegNtPreRenameKey = RegNtRenameKey,
2052 RegNtEnumerateKey,
2053 RegNtPreEnumerateKey = RegNtEnumerateKey,
2054 RegNtEnumerateValueKey,
2055 RegNtPreEnumerateValueKey = RegNtEnumerateValueKey,
2056 RegNtQueryKey,
2057 RegNtPreQueryKey = RegNtQueryKey,
2058 RegNtQueryValueKey,
2059 RegNtPreQueryValueKey = RegNtQueryValueKey,
2060 RegNtQueryMultipleValueKey,
2061 RegNtPreQueryMultipleValueKey = RegNtQueryMultipleValueKey,
2062 RegNtPreCreateKey,
2063 RegNtPostCreateKey,
2064 RegNtPreOpenKey,
2065 RegNtPostOpenKey,
2066 RegNtKeyHandleClose,
2067 RegNtPreKeyHandleClose = RegNtKeyHandleClose,
2068 RegNtPostDeleteKey,
2069 RegNtPostSetValueKey,
2070 RegNtPostDeleteValueKey,
2071 RegNtPostSetInformationKey,
2072 RegNtPostRenameKey,
2073 RegNtPostEnumerateKey,
2074 RegNtPostEnumerateValueKey,
2075 RegNtPostQueryKey,
2076 RegNtPostQueryValueKey,
2077 RegNtPostQueryMultipleValueKey,
2078 RegNtPostKeyHandleClose,
2079 RegNtPreCreateKeyEx,
2080 RegNtPostCreateKeyEx,
2081 RegNtPreOpenKeyEx,
2082 RegNtPostOpenKeyEx
2083 } REG_NOTIFY_CLASS, *PREG_NOTIFY_CLASS;
2084
2085 typedef NTSTATUS
2086 (NTAPI *PEX_CALLBACK_FUNCTION)(
2087 IN PVOID CallbackContext,
2088 IN PVOID Argument1,
2089 IN PVOID Argument2
2090 );
2091
2092 typedef struct _REG_DELETE_KEY_INFORMATION
2093 {
2094 PVOID Object;
2095 } REG_DELETE_KEY_INFORMATION, *PREG_DELETE_KEY_INFORMATION;
2096
2097 typedef struct _REG_SET_VALUE_KEY_INFORMATION
2098 {
2099 PVOID Object;
2100 PUNICODE_STRING ValueName;
2101 ULONG TitleIndex;
2102 ULONG Type;
2103 PVOID Data;
2104 ULONG DataSize;
2105 } REG_SET_VALUE_KEY_INFORMATION, *PREG_SET_VALUE_KEY_INFORMATION;
2106
2107 typedef struct _REG_DELETE_VALUE_KEY_INFORMATION
2108 {
2109 PVOID Object;
2110 PUNICODE_STRING ValueName;
2111 } REG_DELETE_VALUE_KEY_INFORMATION, *PREG_DELETE_VALUE_KEY_INFORMATION;
2112
2113 typedef struct _REG_SET_INFORMATION_KEY_INFORMATION
2114 {
2115 PVOID Object;
2116 KEY_SET_INFORMATION_CLASS KeySetInformationClass;
2117 PVOID KeySetInformation;
2118 ULONG KeySetInformationLength;
2119 } REG_SET_INFORMATION_KEY_INFORMATION, *PREG_SET_INFORMATION_KEY_INFORMATION;
2120
2121 typedef struct _REG_ENUMERATE_KEY_INFORMATION
2122 {
2123 PVOID Object;
2124 ULONG Index;
2125 KEY_INFORMATION_CLASS KeyInformationClass;
2126 PVOID KeyInformation;
2127 ULONG Length;
2128 PULONG ResultLength;
2129 } REG_ENUMERATE_KEY_INFORMATION, *PREG_ENUMERATE_KEY_INFORMATION;
2130
2131 typedef struct _REG_ENUMERATE_VALUE_KEY_INFORMATION
2132 {
2133 PVOID Object;
2134 ULONG Index;
2135 KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass;
2136 PVOID KeyValueInformation;
2137 ULONG Length;
2138 PULONG ResultLength;
2139 } REG_ENUMERATE_VALUE_KEY_INFORMATION, *PREG_ENUMERATE_VALUE_KEY_INFORMATION;
2140
2141 typedef struct _REG_QUERY_KEY_INFORMATION
2142 {
2143 PVOID Object;
2144 KEY_INFORMATION_CLASS KeyInformationClass;
2145 PVOID KeyInformation;
2146 ULONG Length;
2147 PULONG ResultLength;
2148 } REG_QUERY_KEY_INFORMATION, *PREG_QUERY_KEY_INFORMATION;
2149
2150 typedef struct _REG_QUERY_VALUE_KEY_INFORMATION
2151 {
2152 PVOID Object;
2153 PUNICODE_STRING ValueName;
2154 KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass;
2155 PVOID KeyValueInformation;
2156 ULONG Length;
2157 PULONG ResultLength;
2158 } REG_QUERY_VALUE_KEY_INFORMATION, *PREG_QUERY_VALUE_KEY_INFORMATION;
2159
2160 typedef struct _REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION
2161 {
2162 PVOID Object;
2163 PKEY_VALUE_ENTRY ValueEntries;
2164 ULONG EntryCount;
2165 PVOID ValueBuffer;
2166 PULONG BufferLength;
2167 PULONG RequiredBufferLength;
2168 } REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION, *PREG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION;
2169
2170 typedef struct _REG_PRE_CREATE_KEY_INFORMATION
2171 {
2172 PUNICODE_STRING CompleteName;
2173 } REG_PRE_CREATE_KEY_INFORMATION, *PREG_PRE_CREATE_KEY_INFORMATION;
2174
2175 typedef struct _REG_POST_CREATE_KEY_INFORMATION
2176 {
2177 PUNICODE_STRING CompleteName;
2178 PVOID Object;
2179 NTSTATUS Status;
2180 } REG_POST_CREATE_KEY_INFORMATION, *PREG_POST_CREATE_KEY_INFORMATION;
2181
2182 typedef struct _REG_PRE_OPEN_KEY_INFORMATION
2183 {
2184 PUNICODE_STRING CompleteName;
2185 } REG_PRE_OPEN_KEY_INFORMATION, *PREG_PRE_OPEN_KEY_INFORMATION;
2186
2187 typedef struct _REG_POST_OPEN_KEY_INFORMATION
2188 {
2189 PUNICODE_STRING CompleteName;
2190 PVOID Object;
2191 NTSTATUS Status;
2192 } REG_POST_OPEN_KEY_INFORMATION, *PREG_POST_OPEN_KEY_INFORMATION;
2193
2194 typedef struct _REG_POST_OPERATION_INFORMATION
2195 {
2196 PVOID Object;
2197 NTSTATUS Status;
2198 } REG_POST_OPERATION_INFORMATION,*PREG_POST_OPERATION_INFORMATION;
2199
2200 typedef struct _REG_KEY_HANDLE_CLOSE_INFORMATION
2201 {
2202 PVOID Object;
2203 } REG_KEY_HANDLE_CLOSE_INFORMATION, *PREG_KEY_HANDLE_CLOSE_INFORMATION;
2204
2205 /*
2206 ** Storage structures
2207 */
2208 typedef enum _PARTITION_STYLE {
2209 PARTITION_STYLE_MBR,
2210 PARTITION_STYLE_GPT,
2211 PARTITION_STYLE_RAW
2212 } PARTITION_STYLE;
2213
2214 typedef struct _CREATE_DISK_MBR {
2215 ULONG Signature;
2216 } CREATE_DISK_MBR, *PCREATE_DISK_MBR;
2217
2218 typedef struct _CREATE_DISK_GPT {
2219 GUID DiskId;
2220 ULONG MaxPartitionCount;
2221 } CREATE_DISK_GPT, *PCREATE_DISK_GPT;
2222
2223 typedef struct _CREATE_DISK {
2224 PARTITION_STYLE PartitionStyle;
2225 _ANONYMOUS_UNION union {
2226 CREATE_DISK_MBR Mbr;
2227 CREATE_DISK_GPT Gpt;
2228 } DUMMYUNIONNAME;
2229 } CREATE_DISK, *PCREATE_DISK;
2230
2231 typedef struct _DISK_SIGNATURE {
2232 ULONG PartitionStyle;
2233 _ANONYMOUS_UNION union {
2234 struct {
2235 ULONG Signature;
2236 ULONG CheckSum;
2237 } Mbr;
2238 struct {
2239 GUID DiskId;
2240 } Gpt;
2241 } DUMMYUNIONNAME;
2242 } DISK_SIGNATURE, *PDISK_SIGNATURE;
2243
2244 typedef VOID
2245 (FASTCALL*PTIME_UPDATE_NOTIFY_ROUTINE)(
2246 IN HANDLE ThreadId,
2247 IN KPROCESSOR_MODE Mode);
2248
2249 #define DBG_STATUS_CONTROL_C 1
2250 #define DBG_STATUS_SYSRQ 2
2251 #define DBG_STATUS_BUGCHECK_FIRST 3
2252 #define DBG_STATUS_BUGCHECK_SECOND 4
2253 #define DBG_STATUS_FATAL 5
2254 #define DBG_STATUS_DEBUG_CONTROL 6
2255 #define DBG_STATUS_WORKER 7
2256
2257 typedef struct _PHYSICAL_MEMORY_RANGE {
2258 PHYSICAL_ADDRESS BaseAddress;
2259 LARGE_INTEGER NumberOfBytes;
2260 } PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE;
2261
2262 typedef ULONG_PTR
2263 (NTAPI *PDRIVER_VERIFIER_THUNK_ROUTINE)(
2264 IN PVOID Context);
2265
2266 typedef struct _DRIVER_VERIFIER_THUNK_PAIRS {
2267 PDRIVER_VERIFIER_THUNK_ROUTINE PristineRoutine;
2268 PDRIVER_VERIFIER_THUNK_ROUTINE NewRoutine;
2269 } DRIVER_VERIFIER_THUNK_PAIRS, *PDRIVER_VERIFIER_THUNK_PAIRS;
2270
2271 #define DRIVER_VERIFIER_SPECIAL_POOLING 0x0001
2272 #define DRIVER_VERIFIER_FORCE_IRQL_CHECKING 0x0002
2273 #define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES 0x0004
2274 #define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS 0x0008
2275 #define DRIVER_VERIFIER_IO_CHECKING 0x0010
2276
2277 #define HASH_STRING_ALGORITHM_DEFAULT 0
2278 #define HASH_STRING_ALGORITHM_X65599 1
2279 #define HASH_STRING_ALGORITHM_INVALID 0xffffffff
2280
2281 typedef VOID
2282 (DDKAPI *PTIMER_APC_ROUTINE)(
2283 IN PVOID TimerContext,
2284 IN ULONG TimerLowValue,
2285 IN LONG TimerHighValue);
2286
2287
2288
2289 /*
2290 ** WMI structures
2291 */
2292
2293 typedef VOID
2294 (DDKAPI *WMI_NOTIFICATION_CALLBACK)(
2295 PVOID Wnode,
2296 PVOID Context);
2297
2298
2299 /*
2300 ** Architecture specific structures
2301 */
2302 #define PCR_MINOR_VERSION 1
2303 #define PCR_MAJOR_VERSION 1
2304
2305 #ifdef _X86_
2306
2307 #define SIZE_OF_80387_REGISTERS 80
2308 #define CONTEXT_i386 0x10000
2309 #define CONTEXT_i486 0x10000
2310 #define CONTEXT_CONTROL (CONTEXT_i386|0x00000001L)
2311 #define CONTEXT_INTEGER (CONTEXT_i386|0x00000002L)
2312 #define CONTEXT_SEGMENTS (CONTEXT_i386|0x00000004L)
2313 #define CONTEXT_FLOATING_POINT (CONTEXT_i386|0x00000008L)
2314 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386|0x00000010L)
2315 #define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L)
2316 #define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS)
2317 #define MAXIMUM_SUPPORTED_EXTENSION 512
2318
2319 typedef struct _FLOATING_SAVE_AREA {
2320 ULONG ControlWord;
2321 ULONG StatusWord;
2322 ULONG TagWord;
2323 ULONG ErrorOffset;
2324 ULONG ErrorSelector;
2325 ULONG DataOffset;
2326 ULONG DataSelector;
2327 UCHAR RegisterArea[SIZE_OF_80387_REGISTERS];
2328 ULONG Cr0NpxState;
2329 } FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA;
2330
2331 typedef struct _CONTEXT {
2332 ULONG ContextFlags;
2333 ULONG Dr0;
2334 ULONG Dr1;
2335 ULONG Dr2;
2336 ULONG Dr3;
2337 ULONG Dr6;
2338 ULONG Dr7;
2339 FLOATING_SAVE_AREA FloatSave;
2340 ULONG SegGs;
2341 ULONG SegFs;
2342 ULONG SegEs;
2343 ULONG SegDs;
2344 ULONG Edi;
2345 ULONG Esi;
2346 ULONG Ebx;
2347 ULONG Edx;
2348 ULONG Ecx;
2349 ULONG Eax;
2350 ULONG Ebp;
2351 ULONG Eip;
2352 ULONG SegCs;
2353 ULONG EFlags;
2354 ULONG Esp;
2355 ULONG SegSs;
2356 UCHAR ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];
2357 } CONTEXT;
2358
2359 //
2360 // Used to contain PFNs and PFN counts
2361 //
2362 typedef ULONG PFN_COUNT;
2363 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
2364 typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
2365
2366 #define PASSIVE_LEVEL 0
2367 #define LOW_LEVEL 0
2368 #define APC_LEVEL 1
2369 #define DISPATCH_LEVEL 2
2370 #define PROFILE_LEVEL 27
2371 #define CLOCK1_LEVEL 28
2372 #define CLOCK2_LEVEL 28
2373 #define IPI_LEVEL 29
2374 #define POWER_LEVEL 30
2375 #define HIGH_LEVEL 31
2376
2377 typedef struct _KPCR_TIB {
2378 PVOID ExceptionList; /* 00 */
2379 PVOID StackBase; /* 04 */
2380 PVOID StackLimit; /* 08 */
2381 PVOID SubSystemTib; /* 0C */
2382 _ANONYMOUS_UNION union {
2383 PVOID FiberData; /* 10 */
2384 ULONG Version; /* 10 */
2385 } DUMMYUNIONNAME;
2386 PVOID ArbitraryUserPointer; /* 14 */
2387 struct _KPCR_TIB *Self; /* 18 */
2388 } KPCR_TIB, *PKPCR_TIB; /* 1C */
2389
2390 typedef struct _KPCR {
2391 KPCR_TIB Tib; /* 00 */
2392 struct _KPCR *Self; /* 1C */
2393 struct _KPRCB *Prcb; /* 20 */
2394 KIRQL Irql; /* 24 */
2395 ULONG IRR; /* 28 */
2396 ULONG IrrActive; /* 2C */
2397 ULONG IDR; /* 30 */
2398 PVOID KdVersionBlock; /* 34 */
2399 PUSHORT IDT; /* 38 */
2400 PUSHORT GDT; /* 3C */
2401 struct _KTSS *TSS; /* 40 */
2402 USHORT MajorVersion; /* 44 */
2403 USHORT MinorVersion; /* 46 */
2404 KAFFINITY SetMember; /* 48 */
2405 ULONG StallScaleFactor; /* 4C */
2406 UCHAR SpareUnused; /* 50 */
2407 UCHAR Number; /* 51 */
2408 UCHAR Spare0;
2409 UCHAR SecondLevelCacheAssociativity;
2410 ULONG VdmAlert;
2411 ULONG KernelReserved[14]; // For use by the kernel
2412 ULONG SecondLevelCacheSize;
2413 ULONG HalReserved[16]; // For use by Hal
2414 } KPCR, *PKPCR; /* 54 */
2415
2416 #define KeGetPcr() PCR
2417
2418 typedef struct _KFLOATING_SAVE {
2419 ULONG ControlWord;
2420 ULONG StatusWord;
2421 ULONG ErrorOffset;
2422 ULONG ErrorSelector;
2423 ULONG DataOffset;
2424 ULONG DataSelector;
2425 ULONG Cr0NpxState;
2426 ULONG Spare1;
2427 } KFLOATING_SAVE, *PKFLOATING_SAVE;
2428
2429 FORCEINLINE
2430 ULONG
2431 KeGetCurrentProcessorNumber(VOID)
2432 {
2433 return (ULONG)__readfsbyte(FIELD_OFFSET(KPCR, Number));
2434 }
2435
2436 NTHALAPI
2437 KIRQL
2438 DDKAPI
2439 KeGetCurrentIrql(
2440 VOID);
2441
2442 NTKERNELAPI
2443 PRKTHREAD
2444 NTAPI
2445 KeGetCurrentThread(
2446 VOID);
2447
2448 #define KI_USER_SHARED_DATA 0xffdf0000
2449
2450 #define PAGE_SIZE 0x1000
2451 #define PAGE_SHIFT 12L
2452
2453 #define SharedUserData ((KUSER_SHARED_DATA * CONST) KI_USER_SHARED_DATA)
2454
2455 extern NTKERNELAPI PVOID MmHighestUserAddress;
2456 extern NTKERNELAPI PVOID MmSystemRangeStart;
2457 extern NTKERNELAPI ULONG_PTR MmUserProbeAddress;
2458
2459 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
2460 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
2461 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
2462 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
2463 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000
2464
2465 #define MM_KSEG0_BASE MM_SYSTEM_RANGE_START
2466 #define MM_SYSTEM_SPACE_END 0xFFFFFFFF
2467
2468 #elif defined(__x86_64__)
2469
2470 #define CONTEXT_AMD64 0x100000
2471 #if !defined(RC_INVOKED)
2472 #define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L)
2473 #define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L)
2474 #define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L)
2475 #define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L)
2476 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L)
2477
2478 #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)
2479 #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS)
2480
2481 #define CONTEXT_EXCEPTION_ACTIVE 0x8000000
2482 #define CONTEXT_SERVICE_ACTIVE 0x10000000
2483 #define CONTEXT_EXCEPTION_REQUEST 0x40000000
2484 #define CONTEXT_EXCEPTION_REPORTING 0x80000000
2485 #endif
2486
2487 typedef struct DECLSPEC_ALIGN(16) _M128A {
2488 ULONGLONG Low;
2489 LONGLONG High;
2490 } M128A, *PM128A;
2491
2492 typedef struct _XMM_SAVE_AREA32 {
2493 USHORT ControlWord;
2494 USHORT StatusWord;
2495 UCHAR TagWord;
2496 UCHAR Reserved1;
2497 USHORT ErrorOpcode;
2498 ULONG ErrorOffset;
2499 USHORT ErrorSelector;
2500 USHORT Reserved2;
2501 ULONG DataOffset;
2502 USHORT DataSelector;
2503 USHORT Reserved3;
2504 ULONG MxCsr;
2505 ULONG MxCsr_Mask;
2506 M128A FloatRegisters[8];
2507 M128A XmmRegisters[16];
2508 UCHAR Reserved4[96];
2509 } XMM_SAVE_AREA32, *PXMM_SAVE_AREA32;
2510
2511 typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
2512 ULONG64 P1Home;
2513 ULONG64 P2Home;
2514 ULONG64 P3Home;
2515 ULONG64 P4Home;
2516 ULONG64 P5Home;
2517 ULONG64 P6Home;
2518
2519 /* Control flags */
2520 ULONG ContextFlags;
2521 ULONG MxCsr;
2522
2523 /* Segment */
2524 USHORT SegCs;
2525 USHORT SegDs;
2526 USHORT SegEs;
2527 USHORT SegFs;
2528 USHORT SegGs;
2529 USHORT SegSs;
2530 ULONG EFlags;
2531
2532 /* Debug */
2533 ULONG64 Dr0;
2534 ULONG64 Dr1;
2535 ULONG64 Dr2;
2536 ULONG64 Dr3;
2537 ULONG64 Dr6;
2538 ULONG64 Dr7;
2539
2540 /* Integer */
2541 ULONG64 Rax;
2542 ULONG64 Rcx;
2543 ULONG64 Rdx;
2544 ULONG64 Rbx;
2545 ULONG64 Rsp;
2546 ULONG64 Rbp;
2547 ULONG64 Rsi;
2548 ULONG64 Rdi;
2549 ULONG64 R8;
2550 ULONG64 R9;
2551 ULONG64 R10;
2552 ULONG64 R11;
2553 ULONG64 R12;
2554 ULONG64 R13;
2555 ULONG64 R14;
2556 ULONG64 R15;
2557
2558 /* Counter */
2559 ULONG64 Rip;
2560
2561 /* Floating point */
2562 union {
2563 XMM_SAVE_AREA32 FltSave;
2564 struct {
2565 M128A Header[2];
2566 M128A Legacy[8];
2567 M128A Xmm0;
2568 M128A Xmm1;
2569 M128A Xmm2;
2570 M128A Xmm3;
2571 M128A Xmm4;
2572 M128A Xmm5;
2573 M128A Xmm6;
2574 M128A Xmm7;
2575 M128A Xmm8;
2576 M128A Xmm9;
2577 M128A Xmm10;
2578 M128A Xmm11;
2579 M128A Xmm12;
2580 M128A Xmm13;
2581 M128A Xmm14;
2582 M128A Xmm15;
2583 } DUMMYSTRUCTNAME;
2584 } DUMMYUNIONNAME;
2585
2586 /* Vector */
2587 M128A VectorRegister[26];
2588 ULONG64 VectorControl;
2589
2590 /* Debug control */
2591 ULONG64 DebugControl;
2592 ULONG64 LastBranchToRip;
2593 ULONG64 LastBranchFromRip;
2594 ULONG64 LastExceptionToRip;
2595 ULONG64 LastExceptionFromRip;
2596 } CONTEXT;
2597
2598 //
2599 // Used to contain PFNs and PFN counts
2600 //
2601 typedef ULONG PFN_COUNT;
2602 typedef ULONG64 PFN_NUMBER, *PPFN_NUMBER;
2603 typedef LONG64 SPFN_NUMBER, *PSPFN_NUMBER;
2604
2605 #define PASSIVE_LEVEL 0
2606 #define LOW_LEVEL 0
2607 #define APC_LEVEL 1
2608 #define DISPATCH_LEVEL 2
2609 #define CLOCK_LEVEL 13
2610 #define IPI_LEVEL 14
2611 #define POWER_LEVEL 14
2612 #define PROFILE_LEVEL 15
2613 #define HIGH_LEVEL 15
2614
2615 #define PAGE_SIZE 0x1000
2616 #define PAGE_SHIFT 12L
2617 #define PTI_SHIFT 12L
2618 #define PDI_SHIFT 21L
2619 #define PPI_SHIFT 30L
2620 #define PXI_SHIFT 39L
2621 #define PTE_PER_PAGE 512
2622 #define PDE_PER_PAGE 512
2623 #define PPE_PER_PAGE 512
2624 #define PXE_PER_PAGE 512
2625 #define PTI_MASK_AMD64 (PTE_PER_PAGE - 1)
2626 #define PDI_MASK_AMD64 (PDE_PER_PAGE - 1)
2627 #define PPI_MASK (PPE_PER_PAGE - 1)
2628 #define PXI_MASK (PXE_PER_PAGE - 1)
2629
2630 #define PXE_BASE 0xFFFFF6FB7DBED000ULL
2631 #define PXE_SELFMAP 0xFFFFF6FB7DBEDF68ULL
2632 #define PPE_BASE 0xFFFFF6FB7DA00000ULL
2633 #define PDE_BASE 0xFFFFF6FB40000000ULL
2634 #define PTE_BASE 0xFFFFF68000000000ULL
2635 #define PXE_TOP 0xFFFFF6FB7DBEDFFFULL
2636 #define PPE_TOP 0xFFFFF6FB7DBFFFFFULL
2637 #define PDE_TOP 0xFFFFF6FB7FFFFFFFULL
2638 #define PTE_TOP 0xFFFFF6FFFFFFFFFFULL
2639
2640 extern NTKERNELAPI PVOID MmHighestUserAddress;
2641 extern NTKERNELAPI PVOID MmSystemRangeStart;
2642 extern NTKERNELAPI ULONG_PTR MmUserProbeAddress;
2643
2644 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
2645 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
2646 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
2647 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
2648 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xFFFF080000000000ULL
2649 #define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL
2650
2651 #define SharedUserData ((PKUSER_SHARED_DATA const)KI_USER_SHARED_DATA)
2652 #define SharedInterruptTime (&SharedUserData->InterruptTime)
2653 #define SharedSystemTime (&SharedUserData->SystemTime)
2654 #define SharedTickCount (&SharedUserData->TickCount)
2655
2656 #define KeQueryInterruptTime() \
2657 (*(volatile ULONG64*)SharedInterruptTime)
2658 #define KeQuerySystemTime(CurrentCount) \
2659 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime
2660 #define KeQueryTickCount(CurrentCount) \
2661 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount
2662
2663 typedef struct _KPCR
2664 {
2665 __GNU_EXTENSION union
2666 {
2667 NT_TIB NtTib;
2668 __GNU_EXTENSION struct
2669 {
2670 union _KGDTENTRY64 *GdtBase;
2671 struct _KTSS64 *TssBase;
2672 ULONG64 UserRsp;
2673 struct _KPCR *Self;
2674 struct _KPRCB *CurrentPrcb;
2675 PKSPIN_LOCK_QUEUE LockArray;
2676 PVOID Used_Self;
2677 };
2678 };
2679 union _KIDTENTRY64 *IdtBase;
2680 ULONG64 Unused[2];
2681 KIRQL Irql;
2682 UCHAR SecondLevelCacheAssociativity;
2683 UCHAR ObsoleteNumber;
2684 UCHAR Fill0;
2685 ULONG Unused0[3];
2686 USHORT MajorVersion;
2687 USHORT MinorVersion;
2688 ULONG StallScaleFactor;
2689 PVOID Unused1[3];
2690 ULONG KernelReserved[15];
2691 ULONG SecondLevelCacheSize;
2692 ULONG HalReserved[16];
2693 ULONG Unused2;
2694 PVOID KdVersionBlock;
2695 PVOID Unused3;
2696 ULONG PcrAlign1[24];
2697 } KPCR, *PKPCR;
2698
2699 typedef struct _KFLOATING_SAVE {
2700 ULONG Dummy;
2701 } KFLOATING_SAVE, *PKFLOATING_SAVE;
2702
2703 NTKERNELAPI
2704 PRKTHREAD
2705 NTAPI
2706 KeGetCurrentThread(
2707 VOID);
2708
2709 FORCEINLINE
2710 PKPCR
2711 KeGetPcr(VOID)
2712 {
2713 return (PKPCR)__readgsqword(FIELD_OFFSET(KPCR, Self));
2714 }
2715
2716 FORCEINLINE
2717 ULONG
2718 KeGetCurrentProcessorNumber(VOID)
2719 {
2720 return (ULONG)__readgsword(0x184);
2721 }
2722
2723 #elif defined(__PowerPC__)
2724
2725 //
2726 // Used to contain PFNs and PFN counts
2727 //
2728 typedef ULONG PFN_COUNT;
2729 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
2730 typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
2731
2732 #define PASSIVE_LEVEL 0
2733 #define LOW_LEVEL 0
2734 #define APC_LEVEL 1
2735 #define DISPATCH_LEVEL 2
2736 #define PROFILE_LEVEL 27
2737 #define CLOCK1_LEVEL 28
2738 #define CLOCK2_LEVEL 28
2739 #define IPI_LEVEL 29
2740 #define POWER_LEVEL 30
2741 #define HIGH_LEVEL 31
2742
2743 typedef struct _KFLOATING_SAVE {
2744 ULONG Dummy;
2745 } KFLOATING_SAVE, *PKFLOATING_SAVE;
2746
2747 typedef struct _KPCR_TIB {
2748 PVOID ExceptionList; /* 00 */
2749 PVOID StackBase; /* 04 */
2750 PVOID StackLimit; /* 08 */
2751 PVOID SubSystemTib; /* 0C */
2752 _ANONYMOUS_UNION union {
2753 PVOID FiberData; /* 10 */
2754 ULONG Version; /* 10 */
2755 } DUMMYUNIONNAME;
2756 PVOID ArbitraryUserPointer; /* 14 */
2757 struct _KPCR_TIB *Self; /* 18 */
2758 } KPCR_TIB, *PKPCR_TIB; /* 1C */
2759
2760 #define PCR_MINOR_VERSION 1
2761 #define PCR_MAJOR_VERSION 1
2762
2763 typedef struct _KPCR {
2764 KPCR_TIB Tib; /* 00 */
2765 struct _KPCR *Self; /* 1C */
2766 struct _KPRCB *Prcb; /* 20 */
2767 KIRQL Irql; /* 24 */
2768 ULONG IRR; /* 28 */
2769 ULONG IrrActive; /* 2C */
2770 ULONG IDR; /* 30 */
2771 PVOID KdVersionBlock; /* 34 */
2772 PUSHORT IDT; /* 38 */
2773 PUSHORT GDT; /* 3C */
2774 struct _KTSS *TSS; /* 40 */
2775 USHORT MajorVersion; /* 44 */
2776 USHORT MinorVersion; /* 46 */
2777 KAFFINITY SetMember; /* 48 */
2778 ULONG StallScaleFactor; /* 4C */
2779 UCHAR SpareUnused; /* 50 */
2780 UCHAR Number; /* 51 */
2781 } KPCR, *PKPCR; /* 54 */
2782
2783 #define KeGetPcr() PCR
2784
2785 static __inline
2786 ULONG
2787 DDKAPI
2788 KeGetCurrentProcessorNumber(VOID)
2789 {
2790 ULONG Number;
2791 __asm__ __volatile__ (
2792 "lwz %0, %c1(12)\n"
2793 : "=r" (Number)
2794 : "i" (FIELD_OFFSET(KPCR, Number))
2795 );
2796 return Number;
2797 }
2798
2799 #elif defined(_MIPS_)
2800
2801 #error MIPS Headers are totally incorrect
2802
2803 //
2804 // Used to contain PFNs and PFN counts
2805 //
2806 typedef ULONG PFN_COUNT;
2807 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
2808 typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
2809
2810 #define PASSIVE_LEVEL 0
2811 #define APC_LEVEL 1
2812 #define DISPATCH_LEVEL 2
2813 #define PROFILE_LEVEL 27
2814 #define IPI_LEVEL 29
2815 #define HIGH_LEVEL 31
2816
2817 typedef struct _KPCR {
2818 struct _KPRCB *Prcb; /* 20 */
2819 KIRQL Irql; /* 24 */
2820 ULONG IRR; /* 28 */
2821 ULONG IDR; /* 30 */
2822 } KPCR, *PKPCR;
2823
2824 #define KeGetPcr() PCR
2825
2826 typedef struct _KFLOATING_SAVE {
2827 } KFLOATING_SAVE, *PKFLOATING_SAVE;
2828
2829 static __inline
2830 ULONG
2831 DDKAPI
2832 KeGetCurrentProcessorNumber(VOID)
2833 {
2834 return 0;
2835 }
2836
2837 #elif defined(_M_ARM)
2838
2839 //
2840 // NT-ARM is not documented, need DDK-ARM
2841 //
2842 #include <armddk.h>
2843
2844 #else
2845 #error Unknown architecture
2846 #endif
2847
2848 #define MM_DONT_ZERO_ALLOCATION 0x00000001
2849 #define MM_ALLOCATE_FROM_LOCAL_NODE_ONLY 0x00000002
2850
2851
2852 #define EFLAG_SIGN 0x8000
2853 #define EFLAG_ZERO 0x4000
2854 #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
2855
2856 #define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
2857 #define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
2858 #define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
2859
2860 typedef enum _INTERLOCKED_RESULT {
2861 ResultNegative = RESULT_NEGATIVE,
2862 ResultZero = RESULT_ZERO,
2863 ResultPositive = RESULT_POSITIVE
2864 } INTERLOCKED_RESULT;
2865
2866 typedef VOID
2867 (NTAPI *PciPin2Line)(
2868 IN struct _BUS_HANDLER *BusHandler,
2869 IN struct _BUS_HANDLER *RootHandler,
2870 IN PCI_SLOT_NUMBER SlotNumber,
2871 IN PPCI_COMMON_CONFIG PciData
2872 );
2873
2874 typedef VOID
2875 (NTAPI *PciLine2Pin)(
2876 IN struct _BUS_HANDLER *BusHandler,
2877 IN struct _BUS_HANDLER *RootHandler,
2878 IN PCI_SLOT_NUMBER SlotNumber,
2879 IN PPCI_COMMON_CONFIG PciNewData,
2880 IN PPCI_COMMON_CONFIG PciOldData
2881 );
2882
2883 typedef VOID
2884 (NTAPI *PciReadWriteConfig)(
2885 IN struct _BUS_HANDLER *BusHandler,
2886 IN PCI_SLOT_NUMBER Slot,
2887 IN PVOID Buffer,
2888 IN ULONG Offset,
2889 IN ULONG Length
2890 );
2891
2892 #define PCI_DATA_TAG ' ICP'
2893 #define PCI_DATA_VERSION 1
2894
2895 typedef struct _PCIBUSDATA
2896 {
2897 ULONG Tag;
2898 ULONG Version;
2899 PciReadWriteConfig ReadConfig;
2900 PciReadWriteConfig WriteConfig;
2901 PciPin2Line Pin2Line;
2902 PciLine2Pin Line2Pin;
2903 PCI_SLOT_NUMBER ParentSlot;
2904 PVOID Reserved[4];
2905 } PCIBUSDATA, *PPCIBUSDATA;
2906
2907
2908 /** SPINLOCK FUNCTIONS ********************************************************/
2909
2910 NTKERNELAPI
2911 BOOLEAN
2912 FASTCALL
2913 KeTryToAcquireSpinLockAtDpcLevel(
2914 IN OUT PKSPIN_LOCK SpinLock
2915 );
2916
2917 NTKERNELAPI
2918 BOOLEAN
2919 FASTCALL
2920 KeTestSpinLock(
2921 IN PKSPIN_LOCK SpinLock
2922 );
2923
2924 #if defined (_X86_)
2925
2926 #if defined(WIN9X_COMPAT_SPINLOCK)
2927
2928 NTKERNELAPI
2929 VOID
2930 NTAPI
2931 KeInitializeSpinLock(
2932 IN PKSPIN_LOCK SpinLock
2933 );
2934
2935 #else
2936
2937 FORCEINLINE
2938 VOID
2939 KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock)
2940 {
2941 /* Clear the lock */
2942 *SpinLock = 0;
2943 }
2944
2945 #endif
2946
2947 NTHALAPI
2948 KIRQL
2949 FASTCALL
2950 KfAcquireSpinLock(
2951 IN PKSPIN_LOCK SpinLock);
2952
2953 NTHALAPI
2954 VOID
2955 FASTCALL
2956 KfReleaseSpinLock(
2957 IN PKSPIN_LOCK SpinLock,
2958 IN KIRQL NewIrql);
2959
2960 NTKERNELAPI
2961 VOID
2962 FASTCALL
2963 KefAcquireSpinLockAtDpcLevel(
2964 IN PKSPIN_LOCK SpinLock);
2965
2966 NTKERNELAPI
2967 VOID
2968 FASTCALL
2969 KefReleaseSpinLockFromDpcLevel(
2970 IN PKSPIN_LOCK SpinLock);
2971
2972 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
2973 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
2974 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
2975 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
2976
2977 #define KeGetDcacheFillSize() 1L
2978
2979 #elif defined(_M_ARM) // !defined (_X86_)
2980
2981 FORCEINLINE
2982 VOID
2983 KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock)
2984 {
2985 /* Clear the lock */
2986 *SpinLock = 0;
2987 }
2988
2989 NTHALAPI
2990 KIRQL
2991 FASTCALL
2992 KfAcquireSpinLock(
2993 IN PKSPIN_LOCK SpinLock);
2994
2995 NTHALAPI
2996 VOID
2997 FASTCALL
2998 KfReleaseSpinLock(
2999 IN PKSPIN_LOCK SpinLock,
3000 IN KIRQL NewIrql);
3001
3002
3003 NTKERNELAPI
3004 VOID
3005 FASTCALL
3006 KefAcquireSpinLockAtDpcLevel(
3007 IN PKSPIN_LOCK SpinLock);
3008
3009 NTKERNELAPI
3010 VOID
3011 FASTCALL
3012 KefReleaseSpinLockFromDpcLevel(
3013 IN PKSPIN_LOCK SpinLock);
3014
3015
3016 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
3017 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
3018 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
3019 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
3020
3021 NTKERNELAPI
3022 VOID
3023 NTAPI
3024 KeInitializeSpinLock(
3025 IN PKSPIN_LOCK SpinLock);
3026
3027 #else
3028
3029 FORCEINLINE
3030 VOID
3031 NTAPI
3032 KeInitializeSpinLock(
3033 PKSPIN_LOCK SpinLock)
3034 {
3035 *SpinLock = 0;
3036 }
3037
3038 NTKERNELAPI
3039 VOID
3040 KeReleaseSpinLock(
3041 IN PKSPIN_LOCK SpinLock,
3042 IN KIRQL NewIrql);
3043
3044 NTKERNELAPI
3045 VOID
3046 KeAcquireSpinLockAtDpcLevel(
3047 IN PKSPIN_LOCK SpinLock);
3048
3049 NTKERNELAPI
3050 VOID
3051 KeReleaseSpinLockFromDpcLevel(
3052 IN PKSPIN_LOCK SpinLock);
3053
3054 NTKERNELAPI
3055 KIRQL
3056 KeAcquireSpinLockRaiseToDpc(
3057 IN PKSPIN_LOCK SpinLock);
3058
3059 #define KeAcquireSpinLock(SpinLock, OldIrql) \
3060 *(OldIrql) = KeAcquireSpinLockRaiseToDpc(SpinLock)
3061
3062 #endif // !defined (_X86_)
3063
3064 /*
3065 ** Utillity functions
3066 */
3067
3068 #define ARGUMENT_PRESENT(ArgumentPointer) \
3069 ((CHAR*)((ULONG_PTR)(ArgumentPointer)) != (CHAR*)NULL)
3070
3071 /*
3072 * ULONG
3073 * BYTE_OFFSET(
3074 * IN PVOID Va)
3075 */
3076 #define BYTE_OFFSET(Va) \
3077 ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
3078
3079 /*
3080 * ULONG
3081 * BYTES_TO_PAGES(
3082 * IN ULONG Size)
3083 */
3084 #define BYTES_TO_PAGES(Size) \
3085 ((ULONG) ((ULONG_PTR) (Size) >> PAGE_SHIFT) + (((ULONG) (Size) & (PAGE_SIZE - 1)) != 0))
3086
3087 /*
3088 * PVOID
3089 * PAGE_ALIGN(
3090 * IN PVOID Va)
3091 */
3092 #define PAGE_ALIGN(Va) \
3093 ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
3094
3095 /*
3096 * ULONG_PTR
3097 * ROUND_TO_PAGES(
3098 * IN ULONG_PTR Size)
3099 */
3100 #define ROUND_TO_PAGES(Size) \
3101 ((ULONG_PTR) (((ULONG_PTR) Size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1)))
3102
3103
3104
3105 #if defined(_X86_) || defined(_AMD64_)
3106
3107 //
3108 // x86 and x64 performs a 0x2C interrupt
3109 //
3110 #define DbgRaiseAssertionFailure __int2c
3111
3112 #elif defined(_ARM_)
3113
3114 //
3115 // TODO
3116 //
3117
3118 #else
3119 #error Unsupported Architecture
3120 #endif
3121
3122 #if DBG
3123
3124 #define ASSERT(exp) \
3125 (VOID)((!(exp)) ? \
3126 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ), FALSE : TRUE)
3127
3128 #define ASSERTMSG(msg, exp) \
3129 (VOID)((!(exp)) ? \
3130 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, msg ), FALSE : TRUE)
3131
3132 #define RTL_SOFT_ASSERT(exp) \
3133 (VOID)((!(exp)) ? \
3134 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE)
3135
3136 #define RTL_SOFT_ASSERTMSG(msg, exp) \
3137 (VOID)((!(exp)) ? \
3138 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE)
3139
3140 #define RTL_VERIFY(exp) ASSERT(exp)
3141 #define RTL_VERIFYMSG(msg, exp) ASSERT(msg, exp)
3142
3143 #define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
3144 #define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
3145
3146 #if defined(_MSC_VER)
3147
3148 #define NT_ASSERT(exp) \
3149 ((!(exp)) ? \
3150 (__annotation(L"Debug", L"AssertFail", L#exp), \
3151 DbgRaiseAssertionFailure(), FALSE) : TRUE)
3152
3153 #define NT_ASSERTMSG(msg, exp) \
3154 ((!(exp)) ? \
3155 (__annotation(L"Debug", L"AssertFail", L##msg), \
3156 DbgRaiseAssertionFailure(), FALSE) : TRUE)
3157
3158 #define NT_ASSERTMSGW(msg, exp) \
3159 ((!(exp)) ? \
3160 (__annotation(L"Debug", L"AssertFail", msg), \
3161 DbgRaiseAssertionFailure(), FALSE) : TRUE)
3162
3163 #else
3164
3165 //
3166 // GCC doesn't support __annotation (nor PDB)
3167 //
3168 #define NT_ASSERT(exp) \
3169 (VOID)((!(exp)) ? (DbgRaiseAssertionFailure(), FALSE) : TRUE)
3170
3171 #define NT_ASSERTMSG NT_ASSERT
3172 #define NT_ASSERTMSGW NT_ASSERT
3173
3174 #endif
3175
3176 #else /* !DBG */
3177
3178 #define ASSERT(exp) ((VOID) 0)
3179 #define ASSERTMSG(msg, exp) ((VOID) 0)
3180
3181 #define RTL_SOFT_ASSERT(exp) ((VOID) 0)
3182 #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
3183
3184 #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
3185 #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
3186
3187 #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
3188 #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
3189
3190 #define NT_ASSERT(exp) ((VOID)0)
3191 #define NT_ASSERTMSG(exp) ((VOID)0)
3192 #define NT_ASSERTMSGW(exp) ((VOID)0)
3193
3194 #endif /* DBG */
3195
3196 /* HACK HACK HACK - GCC (or perhaps LD) is messing this up */
3197 #if defined(_NTSYSTEM_) || defined(__GNUC__)
3198 #define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag
3199 #define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag
3200 #else
3201 #define NLS_MB_CODE_PAGE_TAG (*NlsMbCodePageTag)
3202 #define NLS_MB_OEM_CODE_PAGE_TAG (*NlsMbOemCodePageTag)
3203 #endif /* _NT_SYSTEM */
3204
3205 extern BOOLEAN NTSYSAPI NLS_MB_CODE_PAGE_TAG;
3206 extern BOOLEAN NTSYSAPI NLS_MB_OEM_CODE_PAGE_TAG;
3207
3208 /*
3209 ** Driver support routines
3210 */
3211
3212 /** Runtime library routines **/
3213
3214 static __inline VOID
3215 InitializeListHead(
3216 IN PLIST_ENTRY ListHead)
3217 {
3218 ListHead->Flink = ListHead->Blink = ListHead;
3219 }
3220
3221 static __inline VOID
3222 InsertHeadList(
3223 IN PLIST_ENTRY ListHead,
3224 IN PLIST_ENTRY Entry)
3225 {
3226 PLIST_ENTRY OldFlink;
3227 OldFlink = ListHead->Flink;
3228 Entry->Flink = OldFlink;
3229 Entry->Blink = ListHead;
3230 OldFlink->Blink = Entry;
3231 ListHead->Flink = Entry;
3232 }
3233
3234 static __inline VOID
3235 InsertTailList(
3236 IN PLIST_ENTRY ListHead,
3237 IN PLIST_ENTRY Entry)
3238 {
3239 PLIST_ENTRY OldBlink;
3240 OldBlink = ListHead->Blink;
3241 Entry->Flink = ListHead;
3242 Entry->Blink = OldBlink;
3243 OldBlink->Flink = Entry;
3244 ListHead->Blink = Entry;
3245 }
3246
3247 /*
3248 * BOOLEAN
3249 * IsListEmpty(
3250 * IN PLIST_ENTRY ListHead)
3251 */
3252 #define IsListEmpty(_ListHead) \
3253 ((_ListHead)->Flink == (_ListHead))
3254
3255 /*
3256 * PSINGLE_LIST_ENTRY
3257 * PopEntryList(
3258 * IN PSINGLE_LIST_ENTRY ListHead)
3259 */
3260 #define PopEntryList(ListHead) \
3261 (ListHead)->Next; \
3262 { \
3263 PSINGLE_LIST_ENTRY _FirstEntry; \
3264 _FirstEntry = (ListHead)->Next; \
3265 if (_FirstEntry != NULL) \
3266 (ListHead)->Next = _FirstEntry->Next; \
3267 }
3268
3269 /*
3270 * VOID
3271 * PushEntryList(
3272 * IN PSINGLE_LIST_ENTRY ListHead,
3273 * IN PSINGLE_LIST_ENTRY Entry)
3274 */
3275 #define PushEntryList(_ListHead, _Entry) \
3276 (_Entry)->Next = (_ListHead)->Next; \
3277 (_ListHead)->Next = (_Entry); \
3278
3279 static __inline BOOLEAN
3280 RemoveEntryList(
3281 IN PLIST_ENTRY Entry)
3282 {
3283 PLIST_ENTRY OldFlink;
3284 PLIST_ENTRY OldBlink;
3285
3286 OldFlink = Entry->Flink;
3287 OldBlink = Entry->Blink;
3288 OldFlink->Blink = OldBlink;
3289 OldBlink->Flink = OldFlink;
3290 return (BOOLEAN)(OldFlink == OldBlink);
3291 }
3292
3293 static __inline PLIST_ENTRY
3294 RemoveHeadList(
3295 IN PLIST_ENTRY ListHead)
3296 {
3297 PLIST_ENTRY Flink;
3298 PLIST_ENTRY Entry;
3299
3300 Entry = ListHead->Flink;
3301 Flink = Entry->Flink;
3302 ListHead->Flink = Flink;
3303 Flink->Blink = ListHead;
3304 return Entry;
3305 }
3306
3307 static __inline PLIST_ENTRY
3308 RemoveTailList(
3309 IN PLIST_ENTRY ListHead)
3310 {
3311 PLIST_ENTRY Blink;
3312 PLIST_ENTRY Entry;
3313
3314 Entry = ListHead->Blink;
3315 Blink = Entry->Blink;
3316 ListHead->Blink = Blink;
3317 Blink->Flink = ListHead;
3318 return Entry;
3319 }
3320
3321 NTSYSAPI
3322 NTSTATUS
3323 NTAPI
3324 RtlCharToInteger(
3325 IN PCSZ String,
3326 IN ULONG Base OPTIONAL,
3327 IN OUT PULONG Value);
3328
3329 NTSYSAPI
3330 LONG
3331 NTAPI
3332 RtlCompareString(
3333 IN PSTRING String1,
3334 IN PSTRING String2,
3335 BOOLEAN CaseInSensitive);
3336
3337 #if !defined(MIDL_PASS)
3338
3339 FORCEINLINE
3340 LUID
3341 NTAPI
3342 RtlConvertLongToLuid(
3343 IN LONG Val)
3344 {
3345 LUID Luid;
3346 LARGE_INTEGER Temp;
3347
3348 Temp.QuadPart = Val;
3349 Luid.LowPart = Temp.u.LowPart;
3350 Luid.HighPart = Temp.u.HighPart;
3351
3352 return Luid;
3353 }
3354
3355 FORCEINLINE
3356 LUID
3357 NTAPI
3358 RtlConvertUlongToLuid(
3359 IN ULONG Val)
3360 {
3361 LUID Luid;
3362
3363 Luid.LowPart = Val;
3364 Luid.HighPart = 0;
3365
3366 return Luid;
3367 }
3368 #endif
3369
3370
3371 NTSYSAPI
3372 VOID
3373 NTAPI
3374 RtlCopyMemory32(
3375 IN VOID UNALIGNED *Destination,
3376 IN CONST VOID UNALIGNED *Source,
3377 IN ULONG Length);
3378
3379 NTSYSAPI
3380 VOID
3381 NTAPI
3382 RtlCopyString(
3383 IN OUT PSTRING DestinationString,
3384 IN PSTRING SourceString OPTIONAL);
3385
3386 NTSYSAPI
3387 BOOLEAN
3388 NTAPI
3389 RtlEqualString(
3390 IN PSTRING String1,
3391 IN PSTRING String2,
3392 IN BOOLEAN CaseInSensitive);
3393
3394 #if (defined(_M_AMD64) || defined(_M_IA64)) && !defined(_REALLY_GET_CALLERS_CALLER_)
3395 #define RtlGetCallersAddress(CallersAddress, CallersCaller) \
3396 *CallersAddress = (PVOID)_ReturnAddress(); \
3397 *CallersCaller = NULL;
3398 #else
3399 NTSYSAPI
3400 VOID
3401 NTAPI
3402 RtlGetCallersAddress(
3403 OUT PVOID *CallersAddress,
3404 OUT PVOID *CallersCaller);
3405 #endif
3406
3407 NTSYSAPI
3408 NTSTATUS
3409 NTAPI
3410 RtlGetVersion(
3411 IN OUT PRTL_OSVERSIONINFOW lpVersionInformation);
3412
3413 NTSYSAPI
3414 VOID
3415 NTAPI
3416 RtlMapGenericMask(
3417 IN OUT PACCESS_MASK AccessMask,
3418 IN PGENERIC_MAPPING GenericMapping);
3419
3420 NTSYSAPI
3421 BOOLEAN
3422 NTAPI
3423 RtlPrefixUnicodeString(
3424 IN PCUNICODE_STRING String1,
3425 IN PCUNICODE_STRING String2,
3426 IN BOOLEAN CaseInSensitive);
3427
3428 NTSYSAPI
3429 NTSTATUS
3430 NTAPI
3431 RtlUpcaseUnicodeString(
3432 IN OUT PUNICODE_STRING DestinationString OPTIONAL,
3433 IN PCUNICODE_STRING SourceString,
3434 IN BOOLEAN AllocateDestinationString);
3435
3436 NTSYSAPI
3437 CHAR
3438 NTAPI
3439 RtlUpperChar(
3440 IN CHAR Character);
3441
3442 NTSYSAPI
3443 VOID
3444 NTAPI
3445 RtlUpperString(
3446 IN OUT PSTRING DestinationString,
3447 IN PSTRING SourceString);
3448
3449 NTSYSAPI
3450 NTSTATUS
3451 NTAPI
3452 RtlVerifyVersionInfo(
3453 IN PRTL_OSVERSIONINFOEXW VersionInfo,
3454 IN ULONG TypeMask,
3455 IN ULONGLONG ConditionMask);
3456
3457 NTSYSAPI
3458 NTSTATUS
3459 NTAPI
3460 RtlVolumeDeviceToDosName(
3461 IN PVOID VolumeDeviceObject,
3462 OUT PUNICODE_STRING DosName);
3463
3464 NTSYSAPI
3465 ULONG
3466 NTAPI
3467 RtlWalkFrameChain(
3468 OUT PVOID *Callers,
3469 IN ULONG Count,
3470 IN ULONG Flags);
3471
3472 NTKERNELAPI
3473 BOOLEAN
3474 NTAPI
3475 KeAreAllApcsDisabled(
3476 VOID
3477 );
3478
3479 /* Guarded Mutex routines */
3480
3481 NTKERNELAPI
3482 VOID
3483 FASTCALL
3484 KeAcquireGuardedMutex(
3485 IN OUT PKGUARDED_MUTEX GuardedMutex
3486 );
3487
3488 NTKERNELAPI
3489 VOID
3490 FASTCALL
3491 KeAcquireGuardedMutexUnsafe(
3492 IN OUT PKGUARDED_MUTEX GuardedMutex
3493 );
3494
3495 NTKERNELAPI
3496 VOID
3497 NTAPI
3498 KeEnterGuardedRegion(
3499 VOID
3500 );
3501
3502 NTKERNELAPI
3503 VOID
3504 NTAPI
3505 KeLeaveGuardedRegion(
3506 VOID
3507 );
3508
3509 NTKERNELAPI
3510 VOID
3511 FASTCALL
3512 KeInitializeGuardedMutex(
3513 OUT PKGUARDED_MUTEX GuardedMutex
3514 );
3515
3516 NTKERNELAPI
3517 VOID
3518 FASTCALL
3519 KeReleaseGuardedMutexUnsafe(
3520 IN OUT PKGUARDED_MUTEX GuardedMutex
3521 );
3522
3523 NTKERNELAPI
3524 VOID
3525 FASTCALL
3526 KeReleaseGuardedMutex(
3527 IN OUT PKGUARDED_MUTEX GuardedMutex
3528 );
3529
3530 NTKERNELAPI
3531 BOOLEAN
3532 FASTCALL
3533 KeTryToAcquireGuardedMutex(
3534 IN OUT PKGUARDED_MUTEX GuardedMutex
3535 );
3536
3537 /* Fast Mutex */
3538 #define ExInitializeFastMutex(_FastMutex) \
3539 { \
3540 (_FastMutex)->Count = FM_LOCK_BIT; \
3541 (_FastMutex)->Owner = NULL; \
3542 (_FastMutex)->Contention = 0; \
3543 KeInitializeEvent(&(_FastMutex)->Gate, SynchronizationEvent, FALSE); \
3544 }
3545
3546 NTKERNELAPI
3547 VOID
3548 NTAPI
3549 KeInitializeEvent(
3550 IN PRKEVENT Event,
3551 IN EVENT_TYPE Type,
3552 IN BOOLEAN State);
3553
3554 /******************************************************************************
3555 * Executive Types *
3556 ******************************************************************************/
3557
3558 typedef struct _ZONE_SEGMENT_HEADER {
3559 SINGLE_LIST_ENTRY SegmentList;
3560 PVOID Reserved;
3561 } ZONE_SEGMENT_HEADER, *PZONE_SEGMENT_HEADER;
3562
3563 typedef struct _ZONE_HEADER {
3564 SINGLE_LIST_ENTRY FreeList;
3565 SINGLE_LIST_ENTRY SegmentList;
3566 ULONG BlockSize;
3567 ULONG TotalSegmentSize;
3568 } ZONE_HEADER, *PZONE_HEADER;
3569
3570 #define PROTECTED_POOL 0x80000000
3571
3572 /******************************************************************************
3573 * Executive Functions *
3574 ******************************************************************************/
3575
3576 NTKERNELAPI
3577 NTSTATUS
3578 NTAPI
3579 ExExtendZone(
3580 IN PZONE_HEADER Zone,
3581 IN PVOID Segment,
3582 IN ULONG SegmentSize);
3583
3584 static __inline PVOID
3585 ExAllocateFromZone(
3586 IN PZONE_HEADER Zone)
3587 {
3588 if (Zone->FreeList.Next)
3589 Zone->FreeList.Next = Zone->FreeList.Next->Next;
3590 return (PVOID) Zone->FreeList.Next;
3591 }
3592
3593 static __inline PVOID
3594 ExFreeToZone(
3595 IN PZONE_HEADER Zone,
3596 IN PVOID Block)
3597 {
3598 ((PSINGLE_LIST_ENTRY) Block)->Next = Zone->FreeList.Next;
3599 Zone->FreeList.Next = ((PSINGLE_LIST_ENTRY) Block);
3600 return ((PSINGLE_LIST_ENTRY) Block)->Next;
3601 }
3602
3603 NTKERNELAPI
3604 NTSTATUS
3605 NTAPI
3606 ExInitializeZone(
3607 IN PZONE_HEADER Zone,
3608 IN ULONG BlockSize,
3609 IN PVOID InitialSegment,
3610 IN ULONG InitialSegmentSize);
3611
3612 /*
3613 * PVOID
3614 * ExInterlockedAllocateFromZone(
3615 * IN PZONE_HEADER Zone,
3616 * IN PKSPIN_LOCK Lock)
3617 */
3618 #define ExInterlockedAllocateFromZone(Zone, Lock) \
3619 ((PVOID) ExInterlockedPopEntryList(&Zone->FreeList, Lock))
3620
3621 NTKERNELAPI
3622 NTSTATUS
3623 NTAPI
3624 ExInterlockedExtendZone(
3625 IN PZONE_HEADER Zone,
3626 IN PVOID Segment,
3627 IN ULONG SegmentSize,
3628 IN PKSPIN_LOCK Lock);
3629
3630 /* PVOID
3631 * ExInterlockedFreeToZone(
3632 * IN PZONE_HEADER Zone,
3633 * IN PVOID Block,
3634 * IN PKSPIN_LOCK Lock);
3635 */
3636 #define ExInterlockedFreeToZone(Zone, Block, Lock) \
3637 ExInterlockedPushEntryList(&(Zone)->FreeList, (PSINGLE_LIST_ENTRY)(Block), Lock)
3638
3639 /*
3640 * VOID
3641 * InitializeSListHead(
3642 * IN PSLIST_HEADER SListHead)
3643 */
3644 #define InitializeSListHead(_SListHead) \
3645 (_SListHead)->Alignment = 0
3646
3647 #define ExInitializeSListHead InitializeSListHead
3648
3649 /*
3650 * BOOLEAN
3651 * ExIsFullZone(
3652 * IN PZONE_HEADER Zone)
3653 */
3654 #define ExIsFullZone(Zone) \
3655 ((Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY) NULL)
3656
3657 /* BOOLEAN
3658 * ExIsObjectInFirstZoneSegment(
3659 * IN PZONE_HEADER Zone,
3660 * IN PVOID Object);
3661 */
3662 #define ExIsObjectInFirstZoneSegment(Zone,Object) \
3663 ((BOOLEAN)( ((PUCHAR)(Object) >= (PUCHAR)(Zone)->SegmentList.Next) && \
3664 ((PUCHAR)(Object) < (PUCHAR)(Zone)->SegmentList.Next + \
3665 (Zone)->TotalSegmentSize)) )
3666
3667 NTKERNELAPI
3668 DECLSPEC_NORETURN
3669 VOID
3670 NTAPI
3671 ExRaiseAccessViolation(
3672 VOID);
3673
3674 NTKERNELAPI
3675 DECLSPEC_NORETURN
3676 VOID
3677 NTAPI
3678 ExRaiseDatatypeMisalignment(
3679 VOID);
3680
3681 NTKERNELAPI
3682 NTSTATUS
3683 NTAPI
3684 ExUuidCreate(
3685 OUT UUID *Uuid);
3686
3687 #define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite
3688 #define ExAcquireResourceShared ExAcquireResourceSharedLite
3689 #define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite
3690 #define ExDeleteResource ExDeleteResourceLite
3691 #define ExInitializeResource ExInitializeResourceLite
3692 #define ExIsResourceAcquiredExclusive ExIsResourceAcquiredExclusiveLite
3693 #define ExIsResourceAcquiredShared ExIsResourceAcquiredSharedLite
3694 #define ExIsResourceAcquired ExIsResourceAcquiredSharedLite
3695 #define ExReleaseResourceForThread ExReleaseResourceForThreadLite
3696
3697
3698 #if DBG
3699
3700 #define PAGED_CODE() { \
3701 if (KeGetCurrentIrql() > APC_LEVEL) { \
3702 KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
3703 ASSERT(FALSE); \
3704 } \
3705 }
3706
3707 #else
3708
3709 #define PAGED_CODE()
3710
3711 #endif
3712
3713 NTKERNELAPI
3714 VOID
3715 NTAPI
3716 ProbeForRead(
3717 IN CONST VOID *Address,
3718 IN SIZE_T Length,
3719 IN ULONG Alignment);
3720
3721 NTKERNELAPI
3722 VOID
3723 NTAPI
3724 ProbeForWrite(
3725 IN PVOID Address,
3726 IN SIZE_T Length,
3727 IN ULONG Alignment);
3728
3729
3730
3731 /** Configuration manager routines **/
3732
3733 NTKERNELAPI
3734 NTSTATUS
3735 NTAPI
3736 CmRegisterCallback(
3737 IN PEX_CALLBACK_FUNCTION Function,
3738 IN PVOID Context,
3739 IN OUT PLARGE_INTEGER Cookie);
3740
3741 NTKERNELAPI
3742 NTSTATUS
3743 NTAPI
3744 CmUnRegisterCallback(
3745 IN LARGE_INTEGER Cookie);
3746
3747
3748
3749 /** Filesystem runtime library routines **/
3750
3751 NTKERNELAPI
3752 BOOLEAN
3753 NTAPI
3754 FsRtlIsTotalDeviceFailure(
3755 IN NTSTATUS Status);
3756
3757
3758
3759 /** Hardware abstraction layer routines **/
3760
3761 NTHALAPI
3762 BOOLEAN
3763 NTAPI
3764 HalMakeBeep(
3765 IN ULONG Frequency);
3766
3767 NTKERNELAPI
3768 VOID
3769 FASTCALL
3770 HalExamineMBR(
3771 IN PDEVICE_OBJECT DeviceObject,
3772 IN ULONG SectorSize,
3773 IN ULONG MBRTypeIdentifier,
3774 OUT PVOID *Buffer);
3775
3776 VOID
3777 NTAPI
3778 HalPutDmaAdapter(
3779 PADAPTER_OBJECT AdapterObject
3780 );
3781
3782
3783 /** Io access routines **/
3784
3785 #if !defined(_M_AMD64)
3786 NTHALAPI
3787 VOID
3788 NTAPI
3789 READ_PORT_BUFFER_UCHAR(
3790 IN PUCHAR Port,
3791 IN PUCHAR Buffer,
3792 IN ULONG Count);
3793
3794 NTHALAPI
3795 VOID
3796 NTAPI
3797 READ_PORT_BUFFER_ULONG(
3798 IN PULONG Port,
3799 IN PULONG Buffer,
3800 IN ULONG Count);
3801
3802 NTHALAPI
3803 VOID
3804 NTAPI
3805 READ_PORT_BUFFER_USHORT(
3806 IN PUSHORT Port,
3807 IN PUSHORT Buffer,
3808 IN ULONG Count);
3809
3810 NTHALAPI
3811 UCHAR
3812 NTAPI
3813 READ_PORT_UCHAR(
3814 IN PUCHAR Port);
3815
3816 NTHALAPI
3817 ULONG
3818 NTAPI
3819 READ_PORT_ULONG(
3820 IN PULONG Port);
3821
3822 NTHALAPI
3823 USHORT
3824 NTAPI
3825 READ_PORT_USHORT(
3826 IN PUSHORT Port);
3827
3828 NTKERNELAPI
3829 VOID
3830 NTAPI
3831 READ_REGISTER_BUFFER_UCHAR(
3832 IN PUCHAR Register,
3833 IN PUCHAR Buffer,
3834 IN ULONG Count);
3835
3836 NTKERNELAPI
3837 VOID
3838 NTAPI
3839 READ_REGISTER_BUFFER_ULONG(
3840 IN PULONG Register,
3841 IN PULONG Buffer,
3842 IN ULONG Count);
3843
3844 NTKERNELAPI
3845 VOID
3846 NTAPI
3847 READ_REGISTER_BUFFER_USHORT(
3848 IN PUSHORT Register,
3849 IN PUSHORT Buffer,
3850 IN ULONG Count);
3851
3852 NTKERNELAPI
3853 UCHAR
3854 NTAPI
3855 READ_REGISTER_UCHAR(
3856 IN PUCHAR Register);
3857
3858 NTKERNELAPI
3859 ULONG
3860 NTAPI
3861 READ_REGISTER_ULONG(
3862 IN PULONG Register);
3863
3864 NTKERNELAPI
3865 USHORT
3866 NTAPI
3867 READ_REGISTER_USHORT(
3868 IN PUSHORT Register);
3869
3870 NTHALAPI
3871 VOID
3872 NTAPI
3873 WRITE_PORT_BUFFER_UCHAR(
3874 IN PUCHAR Port,
3875 IN PUCHAR Buffer,
3876 IN ULONG Count);
3877
3878 NTHALAPI
3879 VOID
3880 NTAPI
3881 WRITE_PORT_BUFFER_ULONG(
3882 IN PULONG Port,
3883 IN PULONG Buffer,
3884 IN ULONG Count);
3885
3886 NTHALAPI
3887 VOID
3888 NTAPI
3889 WRITE_PORT_BUFFER_USHORT(
3890 IN PUSHORT Port,
3891 IN PUSHORT Buffer,
3892 IN ULONG Count);
3893
3894 NTHALAPI
3895 VOID
3896 NTAPI
3897 WRITE_PORT_UCHAR(
3898 IN PUCHAR Port,
3899 IN UCHAR Value);
3900
3901 NTHALAPI
3902 VOID
3903 NTAPI
3904 WRITE_PORT_ULONG(
3905 IN PULONG Port,
3906 IN ULONG Value);
3907
3908 NTHALAPI
3909 VOID
3910 NTAPI
3911 WRITE_PORT_USHORT(
3912 IN PUSHORT Port,
3913 IN USHORT Value);
3914
3915 NTKERNELAPI
3916 VOID
3917 NTAPI
3918 WRITE_REGISTER_BUFFER_UCHAR(
3919 IN PUCHAR Register,
3920 IN PUCHAR Buffer,
3921 IN ULONG Count);
3922
3923 NTKERNELAPI
3924 VOID
3925 NTAPI
3926 WRITE_REGISTER_BUFFER_ULONG(
3927 IN PULONG Register,
3928 IN PULONG Buffer,
3929 IN ULONG Count);
3930
3931 NTKERNELAPI
3932 VOID
3933 NTAPI
3934 WRITE_REGISTER_BUFFER_USHORT(
3935 IN PUSHORT Register,
3936 IN PUSHORT Buffer,
3937 IN ULONG Count);
3938
3939 NTKERNELAPI
3940 VOID
3941 NTAPI
3942 WRITE_REGISTER_UCHAR(
3943 IN PUCHAR Register,
3944 IN UCHAR Value);
3945
3946 NTKERNELAPI
3947 VOID
3948 NTAPI
3949 WRITE_REGISTER_ULONG(
3950 IN PULONG Register,
3951 IN ULONG Value);
3952
3953 NTKERNELAPI
3954 VOID
3955 NTAPI
3956 WRITE_REGISTER_USHORT(
3957 IN PUSHORT Register,
3958 IN USHORT Value);
3959
3960 #else
3961
3962 FORCEINLINE
3963 VOID
3964 READ_PORT_BUFFER_UCHAR(
3965 IN PUCHAR Port,
3966 IN PUCHAR Buffer,
3967 IN ULONG Count)
3968 {
3969 __inbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
3970 }
3971
3972 FORCEINLINE
3973 VOID
3974 READ_PORT_BUFFER_ULONG(
3975 IN PULONG Port,
3976 IN PULONG Buffer,
3977 IN ULONG Count)
3978 {
3979 __indwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
3980 }
3981
3982 FORCEINLINE
3983 VOID
3984 READ_PORT_BUFFER_USHORT(
3985 IN PUSHORT Port,
3986 IN PUSHORT Buffer,
3987 IN ULONG Count)
3988 {
3989 __inwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
3990 }
3991
3992 FORCEINLINE
3993 UCHAR
3994 READ_PORT_UCHAR(
3995 IN PUCHAR Port)
3996 {
3997 return __inbyte((USHORT)(ULONG_PTR)Port);
3998 }
3999
4000 FORCEINLINE
4001 ULONG
4002 READ_PORT_ULONG(
4003 IN PULONG Port)
4004 {
4005 return __indword((USHORT)(ULONG_PTR)Port);
4006 }
4007
4008 FORCEINLINE
4009 USHORT
4010 READ_PORT_USHORT(
4011 IN PUSHORT Port)
4012 {
4013 return __inword((USHORT)(ULONG_PTR)Port);
4014 }
4015
4016 FORCEINLINE
4017 VOID
4018 READ_REGISTER_BUFFER_UCHAR(
4019 IN PUCHAR Register,
4020 IN PUCHAR Buffer,
4021 IN ULONG Count)
4022 {
4023 __movsb(Register, Buffer, Count);
4024 }
4025
4026 FORCEINLINE
4027 VOID
4028 READ_REGISTER_BUFFER_ULONG(
4029 IN PULONG Register,
4030 IN PULONG Buffer,
4031 IN ULONG Count)
4032 {
4033 __movsd(Register, Buffer, Count);
4034 }
4035
4036 FORCEINLINE
4037 VOID
4038 READ_REGISTER_BUFFER_USHORT(
4039 IN PUSHORT Register,
4040 IN PUSHORT Buffer,
4041 IN ULONG Count)
4042 {
4043 __movsw(Register, Buffer, Count);
4044 }
4045
4046 FORCEINLINE
4047 UCHAR
4048 READ_REGISTER_UCHAR(
4049 IN PUCHAR Register)
4050 {
4051 return *Register;
4052 }
4053
4054 FORCEINLINE
4055 ULONG
4056 READ_REGISTER_ULONG(
4057 IN PULONG Register)
4058 {
4059 return *Register;
4060 }
4061
4062 FORCEINLINE
4063 USHORT
4064 READ_REGISTER_USHORT(
4065 IN PUSHORT Register)
4066 {
4067 return *Register;
4068 }
4069
4070 FORCEINLINE
4071 VOID
4072 WRITE_PORT_BUFFER_UCHAR(
4073 IN PUCHAR Port,
4074 IN PUCHAR Buffer,
4075 IN ULONG Count)
4076 {
4077 __outbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
4078 }
4079
4080 FORCEINLINE
4081 VOID
4082 WRITE_PORT_BUFFER_ULONG(
4083 IN PULONG Port,
4084 IN PULONG Buffer,
4085 IN ULONG Count)
4086 {
4087 __outdwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
4088 }
4089
4090 FORCEINLINE
4091 VOID
4092 WRITE_PORT_BUFFER_USHORT(
4093 IN PUSHORT Port,
4094 IN PUSHORT Buffer,
4095 IN ULONG Count)
4096 {
4097 __outwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
4098 }
4099
4100 FORCEINLINE
4101 VOID
4102 WRITE_PORT_UCHAR(
4103 IN PUCHAR Port,
4104 IN UCHAR Value)
4105 {
4106 __outbyte((USHORT)(ULONG_PTR)Port, Value);
4107 }
4108
4109 FORCEINLINE
4110 VOID
4111 WRITE_PORT_ULONG(
4112 IN PULONG Port,
4113 IN ULONG Value)
4114 {
4115 __outdword((USHORT)(ULONG_PTR)Port, Value);
4116 }
4117
4118 FORCEINLINE
4119 VOID
4120 WRITE_PORT_USHORT(
4121 IN PUSHORT Port,
4122 IN USHORT Value)
4123 {
4124 __outword((USHORT)(ULONG_PTR)Port, Value);
4125 }
4126
4127 FORCEINLINE
4128 VOID
4129 WRITE_REGISTER_BUFFER_UCHAR(
4130 IN PUCHAR Register,
4131 IN PUCHAR Buffer,
4132 IN ULONG Count)
4133 {
4134 LONG Synch;
4135 __movsb(Register, Buffer, Count);
4136 InterlockedOr(&Synch, 1);
4137 }
4138
4139 FORCEINLINE
4140 VOID
4141 WRITE_REGISTER_BUFFER_ULONG(
4142 IN PULONG Register,
4143 IN PULONG Buffer,
4144 IN ULONG Count)
4145 {
4146 LONG Synch;
4147 __movsd(Register, Buffer, Count);
4148 InterlockedOr(&Synch, 1);
4149 }
4150
4151 FORCEINLINE
4152 VOID
4153 WRITE_REGISTER_BUFFER_USHORT(
4154 IN PUSHORT Register,
4155 IN PUSHORT Buffer,
4156 IN ULONG Count)
4157 {
4158 LONG Synch;
4159 __movsw(Register, Buffer, Count);
4160 InterlockedOr(&Synch, 1);
4161 }
4162
4163 FORCEINLINE
4164 VOID
4165 WRITE_REGISTER_UCHAR(
4166 IN PUCHAR Register,
4167 IN UCHAR Value)
4168 {
4169 LONG Synch;
4170 *Register = Value;
4171 InterlockedOr(&Synch, 1);
4172 }
4173
4174 FORCEINLINE
4175 VOID
4176 WRITE_REGISTER_ULONG(
4177 IN PULONG Register,
4178 IN ULONG Value)
4179 {
4180 LONG Synch;
4181 *Register = Value;
4182 InterlockedOr(&Synch, 1);
4183 }
4184
4185 FORCEINLINE
4186 VOID
4187 WRITE_REGISTER_USHORT(
4188 IN PUSHORT Register,
4189 IN USHORT Value)
4190 {
4191 LONG Sync;
4192 *Register = Value;
4193 InterlockedOr(&Sync, 1);
4194 }
4195
4196 #endif
4197
4198 /** I/O manager routines **/
4199
4200 NTKERNELAPI
4201 VOID
4202 NTAPI
4203 IoAcquireCancelSpinLock(
4204 OUT PKIRQL Irql);
4205
4206 NTKERNELAPI
4207 NTSTATUS
4208 NTAPI
4209 IoAcquireRemoveLockEx(
4210 IN PIO_REMOVE_LOCK RemoveLock,
4211 IN OPTIONAL PVOID Tag OPTIONAL,
4212 IN PCSTR File,
4213 IN ULONG Line,
4214 IN ULONG RemlockSize);
4215
4216 /*
4217 * NTSTATUS
4218 * IoAcquireRemoveLock(
4219 * IN PIO_REMOVE_LOCK RemoveLock,
4220 * IN OPTIONAL PVOID Tag)
4221 */
4222 #define IoAcquireRemoveLock(_RemoveLock, \
4223 _Tag) \
4224 IoAcquireRemoveLockEx(_RemoveLock, _Tag, __FILE__, __LINE__, sizeof(IO_REMOVE_LOCK))
4225
4226 /*
4227 * VOID
4228 * IoAdjustPagingPathCount(
4229 * IN PLONG Count,
4230 * IN BOOLEAN Increment)
4231 */
4232 #define IoAdjustPagingPathCount(_Count, \
4233 _Increment) \
4234 { \
4235 if (_Increment) \
4236 { \
4237 InterlockedIncrement(_Count); \
4238 } \
4239 else \
4240 { \
4241 InterlockedDecrement(_Count); \
4242 } \
4243 }
4244
4245 #ifndef DMA_MACROS_DEFINED
4246 NTKERNELAPI
4247 NTSTATUS
4248 NTAPI
4249 IoAllocateAdapterChannel(
4250 IN PADAPTER_OBJECT AdapterObject,
4251 IN PDEVICE_OBJECT DeviceObject,
4252 IN ULONG NumberOfMapRegisters,
4253 IN PDRIVER_CONTROL ExecutionRoutine,
4254 IN PVOID Context);
4255 #endif
4256
4257 NTKERNELAPI
4258 VOID
4259 NTAPI
4260 IoAllocateController(
4261 IN PCONTROLLER_OBJECT ControllerObject,
4262 IN PDEVICE_OBJECT DeviceObject,
4263 IN PDRIVER_CONTROL ExecutionRoutine,
4264 IN PVOID Context);
4265
4266 NTKERNELAPI
4267 NTSTATUS
4268 NTAPI
4269 IoAllocateDriverObjectExtension(
4270 IN PDRIVER_OBJECT DriverObject,
4271 IN PVOID ClientIdentificationAddress,
4272 IN ULONG DriverObjectExtensionSize,
4273 OUT PVOID *DriverObjectExtension);
4274
4275 NTKERNELAPI
4276 PVOID
4277 NTAPI
4278 IoAllocateErrorLogEntry(
4279 IN PVOID IoObject,
4280 IN UCHAR EntrySize);
4281
4282 NTKERNELAPI
4283 PIRP
4284 NTAPI
4285 IoAllocateIrp(
4286 IN CCHAR StackSize,
4287 IN BOOLEAN ChargeQuota);
4288
4289 NTKERNELAPI
4290 PMDL
4291 NTAPI
4292 IoAllocateMdl(
4293 IN PVOID VirtualAddress,
4294 IN ULONG Length,
4295 IN BOOLEAN SecondaryBuffer,
4296 IN BOOLEAN ChargeQuota,
4297 IN OUT PIRP Irp OPTIONAL);
4298
4299 NTKERNELAPI
4300 PIO_WORKITEM
4301 NTAPI
4302 IoAllocateWorkItem(
4303 IN PDEVICE_OBJECT DeviceObject);
4304
4305 /*
4306 * VOID IoAssignArcName(
4307 * IN PUNICODE_STRING ArcName,
4308 * IN PUNICODE_STRING DeviceName);
4309 */
4310 #define IoAssignArcName(_ArcName, _DeviceName) ( \
4311 IoCreateSymbolicLink((_ArcName), (_DeviceName)))
4312
4313 NTKERNELAPI
4314 NTSTATUS
4315 NTAPI
4316 IoAttachDevice(
4317 IN PDEVICE_OBJECT SourceDevice,
4318 IN PUNICODE_STRING TargetDevice,
4319 OUT PDEVICE_OBJECT *AttachedDevice);
4320
4321 NTKERNELAPI
4322 PDEVICE_OBJECT
4323 NTAPI
4324 IoAttachDeviceToDeviceStack(
4325 IN PDEVICE_OBJECT SourceDevice,
4326 IN PDEVICE_OBJECT TargetDevice);
4327
4328 NTKERNELAPI
4329 PIRP
4330 NTAPI
4331 IoBuildAsynchronousFsdRequest(
4332 IN ULONG MajorFunction,
4333 IN PDEVICE_OBJECT DeviceObject,
4334 IN OUT PVOID Buffer OPTIONAL,
4335 IN ULONG Length OPTIONAL,
4336 IN PLARGE_INTEGER StartingOffset OPTIONAL,
4337 IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL);
4338
4339 NTKERNELAPI
4340 PIRP
4341 NTAPI
4342 IoBuildDeviceIoControlRequest(
4343 IN ULONG IoControlCode,
4344 IN PDEVICE_OBJECT DeviceObject,
4345 IN PVOID InputBuffer OPTIONAL,
4346 IN ULONG InputBufferLength,
4347 OUT PVOID OutputBuffer OPTIONAL,
4348 IN ULONG OutputBufferLength,
4349 IN BOOLEAN InternalDeviceIoControl,
4350 IN PKEVENT Event,
4351 OUT PIO_STATUS_BLOCK IoStatusBlock);
4352
4353 NTKERNELAPI
4354 VOID
4355 NTAPI
4356 IoBuildPartialMdl(
4357 IN PMDL SourceMdl,
4358 IN OUT PMDL TargetMdl,
4359 IN PVOID VirtualAddress,
4360 IN ULONG Length);
4361
4362 NTKERNELAPI
4363 PIRP
4364 NTAPI
4365 IoBuildSynchronousFsdRequest(
4366 IN ULONG MajorFunction,
4367 IN PDEVICE_OBJECT DeviceObject,
4368 IN OUT PVOID Buffer OPTIONAL,
4369 IN ULONG Length OPTIONAL,
4370 IN PLARGE_INTEGER StartingOffset OPTIONAL,
4371 IN PKEVENT Event,
4372 OUT PIO_STATUS_BLOCK IoStatusBlock);
4373
4374 NTKERNELAPI
4375 NTSTATUS
4376 FASTCALL
4377 IofCallDriver(
4378 IN PDEVICE_OBJECT DeviceObject,
4379 IN OUT PIRP Irp);
4380
4381 /*
4382 * NTSTATUS
4383 * IoCallDriver(
4384 * IN PDEVICE_OBJECT DeviceObject,
4385 * IN OUT PIRP Irp)
4386 */
4387 #define IoCallDriver IofCallDriver
4388
4389 NTKERNELAPI
4390 VOID
4391 NTAPI
4392 IoCancelFileOpen(
4393 IN PDEVICE_OBJECT DeviceObject,
4394 IN PFILE_OBJECT FileObject);
4395
4396 NTKERNELAPI
4397 BOOLEAN
4398 NTAPI
4399 IoCancelIrp(
4400 IN PIRP Irp);
4401
4402 NTKERNELAPI
4403 NTSTATUS
4404 NTAPI
4405 IoCheckShareAccess(
4406 IN ACCESS_MASK DesiredAccess,
4407 IN ULONG DesiredShareAccess,
4408 IN OUT PFILE_OBJECT FileObject,
4409 IN OUT PSHARE_ACCESS ShareAccess,
4410 IN BOOLEAN Update);
4411
4412 NTKERNELAPI
4413 VOID
4414 FASTCALL
4415 IofCompleteRequest(
4416 IN PIRP Irp,
4417 IN CCHAR PriorityBoost);
4418
4419 /*
4420 * VOID
4421 * IoCompleteRequest(
4422 * IN PIRP Irp,
4423 * IN CCHAR PriorityBoost)
4424 */
4425 #define IoCompleteRequest IofCompleteRequest
4426
4427 NTKERNELAPI
4428 NTSTATUS
4429 NTAPI
4430 IoConnectInterrupt(
4431 OUT PKINTERRUPT *InterruptObject,
4432 IN PKSERVICE_ROUTINE ServiceRoutine,
4433 IN PVOID ServiceContext,
4434 IN PKSPIN_LOCK SpinLock OPTIONAL,
4435 IN ULONG Vector,
4436 IN KIRQL Irql,
4437 IN KIRQL SynchronizeIrql,
4438 IN KINTERRUPT_MODE InterruptMode,
4439 IN BOOLEAN ShareVector,
4440 IN KAFFINITY ProcessorEnableMask,
4441 IN BOOLEAN FloatingSave);
4442
4443 /*
4444 * PIO_STACK_LOCATION
4445 * IoGetCurrentIrpStackLocation(
4446 * IN PIRP Irp)
4447 */
4448 #define IoGetCurrentIrpStackLocation(_Irp) \
4449 ((_Irp)->Tail.Overlay.CurrentStackLocation)
4450
4451 /*
4452 * PIO_STACK_LOCATION
4453 * IoGetNextIrpStackLocation(
4454 * IN PIRP Irp)
4455 */
4456 #define IoGetNextIrpStackLocation(_Irp) \
4457 ((_Irp)->Tail.Overlay.CurrentStackLocation - 1)
4458
4459 /*
4460 * VOID
4461 * IoCopyCurrentIrpStackLocationToNext(
4462 * IN PIRP Irp)
4463 */
4464 #define IoCopyCurrentIrpStackLocationToNext(_Irp) \
4465 { \
4466 PIO_STACK_LOCATION _IrpSp; \
4467 PIO_STACK_LOCATION _NextIrpSp; \
4468 _IrpSp = IoGetCurrentIrpStackLocation(_Irp); \
4469 _NextIrpSp = IoGetNextIrpStackLocation(_Irp); \
4470 RtlCopyMemory(_NextIrpSp, _IrpSp, \
4471 FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine)); \
4472 _NextIrpSp->Control = 0; \
4473 }
4474
4475 NTKERNELAPI
4476 PCONTROLLER_OBJECT
4477 NTAPI
4478 IoCreateController(
4479 IN ULONG Size);
4480
4481 NTKERNELAPI
4482 NTSTATUS
4483 NTAPI
4484 IoCreateDevice(
4485 IN PDRIVER_OBJECT DriverObject,
4486 IN ULONG DeviceExtensionSize,
4487 IN PUNICODE_STRING DeviceName OPTIONAL,
4488 IN DEVICE_TYPE DeviceType,
4489 IN ULONG DeviceCharacteristics,
4490 IN BOOLEAN Exclusive,
4491 OUT PDEVICE_OBJECT *DeviceObject);
4492
4493 NTKERNELAPI
4494 NTSTATUS
4495 NTAPI
4496 IoCreateDisk(
4497 IN PDEVICE_OBJECT DeviceObject,
4498 IN PCREATE_DISK Disk);
4499
4500 NTKERNELAPI
4501 NTSTATUS
4502 NTAPI
4503 IoCreateFile(
4504 OUT PHANDLE FileHandle,
4505 IN ACCESS_MASK DesiredAccess,
4506 IN POBJECT_ATTRIBUTES ObjectAttributes,
4507 OUT PIO_STATUS_BLOCK IoStatusBlock,
4508 IN PLARGE_INTEGER AllocationSize OPTIONAL,
4509 IN ULONG FileAttributes,
4510 IN ULONG ShareAccess,
4511 IN ULONG Disposition,
4512 IN ULONG CreateOptions,
4513 IN PVOID EaBuffer OPTIONAL,
4514 IN ULONG EaLength,
4515 IN CREATE_FILE_TYPE CreateFileType,
4516 IN PVOID ExtraCreateParameters OPTIONAL,
4517 IN ULONG Options);
4518
4519 NTKERNELAPI
4520 PKEVENT
4521 NTAPI
4522 IoCreateNotificationEvent(
4523 IN PUNICODE_STRING EventName,
4524 OUT PHANDLE EventHandle);
4525
4526 NTKERNELAPI
4527 NTSTATUS
4528 NTAPI
4529 IoCreateSymbolicLink(
4530 IN PUNICODE_STRING SymbolicLinkName,
4531 IN PUNICODE_STRING DeviceName);
4532
4533 NTKERNELAPI
4534 PKEVENT
4535 NTAPI
4536 IoCreateSynchronizationEvent(
4537 IN PUNICODE_STRING EventName,
4538 OUT PHANDLE EventHandle);
4539
4540 NTKERNELAPI
4541 NTSTATUS
4542 NTAPI
4543 IoCreateUnprotectedSymbolicLink(
4544 IN PUNICODE_STRING SymbolicLinkName,
4545 IN PUNICODE_STRING DeviceName);
4546
4547 NTKERNELAPI
4548 NTSTATUS
4549 NTAPI
4550 IoCsqInitialize(
4551 PIO_CSQ Csq,
4552 IN PIO_CSQ_INSERT_IRP CsqInsertIrp,
4553 IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
4554 IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
4555 IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
4556 IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
4557 IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp);
4558
4559 NTKERNELAPI
4560 VOID
4561 NTAPI
4562 IoCsqInsertIrp(
4563 IN PIO_CSQ Csq,
4564 IN PIRP Irp,
4565 IN PIO_CSQ_IRP_CONTEXT Context);
4566
4567 NTKERNELAPI
4568 PIRP
4569 NTAPI
4570 IoCsqRemoveIrp(
4571 IN PIO_CSQ Csq,
4572 IN PIO_CSQ_IRP_CONTEXT Context);
4573
4574 NTKERNELAPI
4575 PIRP
4576 NTAPI
4577 IoCsqRemoveNextIrp(
4578 IN PIO_CSQ Csq,
4579 IN PVOID PeekContext);
4580
4581 NTKERNELAPI
4582 VOID
4583 NTAPI
4584 IoDeleteController(
4585 IN PCONTROLLER_OBJECT ControllerObject);
4586
4587 NTKERNELAPI
4588 VOID
4589 NTAPI
4590 IoDeleteDevice(
4591 IN PDEVICE_OBJECT DeviceObject);
4592
4593 NTKERNELAPI
4594 NTSTATUS
4595 NTAPI
4596 IoDeleteSymbolicLink(
4597 IN PUNICODE_STRING SymbolicLinkName);
4598
4599 /*
4600 * VOID
4601 * IoDeassignArcName(
4602 * IN PUNICODE_STRING ArcName)
4603 */
4604 #define IoDeassignArcName IoDeleteSymbolicLink
4605
4606 NTKERNELAPI
4607 VOID
4608 NTAPI
4609 IoDetachDevice(
4610 IN OUT PDEVICE_OBJECT TargetDevice);
4611
4612 NTKERNELAPI
4613 VOID
4614 NTAPI
4615 IoDisconnectInterrupt(
4616 IN PKINTERRUPT InterruptObject);
4617
4618 NTKERNELAPI
4619 BOOLEAN
4620 NTAPI
4621 IoForwardIrpSynchronously(
4622 IN PDEVICE_OBJECT DeviceObject,
4623 IN PIRP Irp);
4624
4625 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
4626
4627 NTKERNELAPI
4628 VOID
4629 NTAPI
4630 IoFreeController(
4631 IN PCONTROLLER_OBJECT ControllerObject);
4632
4633 NTKERNELAPI
4634 VOID
4635 NTAPI
4636 IoFreeErrorLogEntry(
4637 PVOID ElEntry);
4638
4639 NTKERNELAPI
4640 VOID
4641 NTAPI
4642 IoFreeIrp(
4643 IN PIRP Irp);
4644
4645 NTKERNELAPI
4646 VOID
4647 NTAPI
4648 IoFreeMdl(
4649 IN PMDL Mdl);
4650
4651 NTKERNELAPI
4652 VOID
4653 NTAPI
4654 IoFreeWorkItem(
4655 IN PIO_WORKITEM pIOWorkItem);
4656
4657 NTKERNELAPI
4658 PDEVICE_OBJECT
4659 NTAPI
4660 IoGetAttachedDevice(
4661 IN PDEVICE_OBJECT DeviceObject);
4662
4663 NTKERNELAPI
4664 PDEVICE_OBJECT
4665 NTAPI
4666 IoGetAttachedDeviceReference(
4667 IN PDEVICE_OBJECT DeviceObject);
4668
4669 NTKERNELAPI
4670 NTSTATUS
4671 NTAPI
4672 IoGetBootDiskInformation(
4673 IN OUT PBOOTDISK_INFORMATION BootDiskInformation,
4674 IN ULONG Size);
4675
4676 NTKERNELAPI
4677 PCONFIGURATION_INFORMATION
4678 NTAPI
4679 IoGetConfigurationInformation(
4680 VOID);
4681
4682 NTKERNELAPI
4683 PEPROCESS
4684 NTAPI
4685 IoGetCurrentProcess(
4686 VOID);
4687
4688 NTKERNELAPI
4689 NTSTATUS
4690 NTAPI
4691 IoGetDeviceInterfaceAlias(
4692 IN PUNICODE_STRING SymbolicLinkName,
4693 IN CONST GUID *AliasInterfaceClassGuid,
4694 OUT PUNICODE_STRING AliasSymbolicLinkName);
4695
4696 #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
4697
4698 NTKERNELAPI
4699 NTSTATUS
4700 NTAPI
4701 IoGetDeviceInterfaces(
4702 IN CONST GUID *InterfaceClassGuid,
4703 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
4704 IN ULONG Flags,
4705 OUT PWSTR *SymbolicLinkList);
4706
4707 NTKERNELAPI
4708 NTSTATUS
4709 NTAPI
4710 IoGetDeviceObjectPointer(
4711 IN PUNICODE_STRING ObjectName,
4712 IN ACCESS_MASK DesiredAccess,
4713 OUT PFILE_OBJECT *FileObject,
4714 OUT PDEVICE_OBJECT *DeviceObject);
4715
4716 NTKERNELAPI
4717 NTSTATUS
4718 NTAPI
4719 IoGetDeviceProperty(
4720 IN PDEVICE_OBJECT DeviceObject,
4721 IN DEVICE_REGISTRY_PROPERTY DeviceProperty,
4722 IN ULONG BufferLength,
4723 OUT PVOID PropertyBuffer,
4724 OUT PULONG ResultLength);
4725
4726 NTKERNELAPI
4727 PDEVICE_OBJECT
4728 NTAPI
4729 IoGetDeviceToVerify(
4730 IN PETHREAD Thread);
4731
4732 NTKERNELAPI
4733 PDMA_ADAPTER
4734 NTAPI
4735 IoGetDmaAdapter(
4736 IN PDEVICE_OBJECT PhysicalDeviceObject,
4737 IN PDEVICE_DESCRIPTION DeviceDescription,
4738 IN OUT PULONG NumberOfMapRegisters);
4739
4740 NTKERNELAPI
4741 PVOID
4742 NTAPI
4743 IoGetDriverObjectExtension(
4744 IN PDRIVER_OBJECT DriverObject,
4745 IN PVOID ClientIdentificationAddress);
4746
4747 NTKERNELAPI
4748 PGENERIC_MAPPING
4749 NTAPI
4750 IoGetFileObjectGenericMapping(
4751 VOID);
4752
4753 /*
4754 * ULONG
4755 * IoGetFunctionCodeFromCtlCode(
4756 * IN ULONG ControlCode)
4757 */
4758 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
4759 (((_ControlCode) >> 2) & 0x00000FFF)
4760
4761 NTKERNELAPI
4762 PVOID
4763 NTAPI
4764 IoGetInitialStack(
4765 VOID);
4766
4767 NTKERNELAPI
4768 PDEVICE_OBJECT
4769 NTAPI
4770 IoGetRelatedDeviceObject(
4771 IN PFILE_OBJECT FileObject);
4772
4773 NTKERNELAPI
4774 VOID
4775 NTAPI
4776 IoGetStackLimits(
4777 OUT PULONG_PTR LowLimit,
4778 OUT PULONG_PTR HighLimit);
4779
4780 FORCEINLINE
4781 ULONG_PTR
4782 IoGetRemainingStackSize(
4783 VOID
4784 )
4785 {
4786 ULONG_PTR End, Begin;
4787 ULONG_PTR Result;
4788
4789 IoGetStackLimits(&Begin, &End);
4790 Result = (ULONG_PTR)(&End) - Begin;
4791 return Result;
4792 }
4793
4794 NTKERNELAPI
4795 VOID
4796 NTAPI
4797 KeInitializeDpc(
4798 IN PRKDPC Dpc,
4799 IN PKDEFERRED_ROUTINE DeferredRoutine,
4800 IN PVOID DeferredContext);
4801
4802 /*
4803 * VOID
4804 * IoInitializeDpcRequest(
4805 * IN PDEVICE_OBJECT DeviceObject,
4806 * IN PIO_DPC_ROUTINE DpcRoutine)
4807 */
4808 #define IoInitializeDpcRequest(_DeviceObject, \
4809 _DpcRoutine) \
4810 KeInitializeDpc(&(_DeviceObject)->Dpc, \
4811 (PKDEFERRED_ROUTINE) (_DpcRoutine), \
4812 _DeviceObject)
4813
4814 NTKERNELAPI
4815 VOID
4816 NTAPI
4817 IoInitializeIrp(
4818 IN OUT PIRP Irp,
4819 IN USHORT PacketSize,
4820 IN CCHAR StackSize);
4821
4822 NTKERNELAPI
4823 VOID
4824 NTAPI
4825 IoInitializeRemoveLockEx(
4826 IN PIO_REMOVE_LOCK Lock,
4827 IN ULONG AllocateTag,
4828 IN ULONG MaxLockedMinutes,
4829 IN ULONG HighWatermark,
4830 IN ULONG RemlockSize);
4831
4832 /* VOID
4833 * IoInitializeRemoveLock(
4834 * IN PIO_REMOVE_LOCK Lock,
4835 * IN ULONG AllocateTag,
4836 * IN ULONG MaxLockedMinutes,
4837 * IN ULONG HighWatermark)
4838 */
4839 #define IoInitializeRemoveLock( \
4840 Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
4841 IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
4842 HighWatermark, sizeof(IO_REMOVE_LOCK))
4843
4844 NTKERNELAPI
4845 NTSTATUS
4846 NTAPI
4847 IoInitializeTimer(
4848 IN PDEVICE_OBJECT DeviceObject,
4849 IN PIO_TIMER_ROUTINE TimerRoutine,
4850 IN PVOID Context);
4851
4852 NTKERNELAPI
4853 VOID
4854 NTAPI
4855 IoInvalidateDeviceRelations(
4856 IN PDEVICE_OBJECT DeviceObject,
4857 IN DEVICE_RELATION_TYPE Type);
4858
4859 NTKERNELAPI
4860 VOID
4861 NTAPI
4862 IoInvalidateDeviceState(
4863 IN PDEVICE_OBJECT PhysicalDeviceObject);
4864
4865 NTKERNELAPI
4866 BOOLEAN
4867 NTAPI
4868 IoIs32bitProcess(
4869 IN PIRP Irp OPTIONAL);
4870
4871 /*
4872 * BOOLEAN
4873 * IoIsErrorUserInduced(
4874 * IN NTSTATUS Status);
4875 */
4876 #define IoIsErrorUserInduced(Status) \
4877 ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
4878 ((Status) == STATUS_IO_TIMEOUT) || \
4879 ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
4880 ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
4881 ((Status) == STATUS_VERIFY_REQUIRED) || \
4882 ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
4883 ((Status) == STATUS_WRONG_VOLUME)))
4884
4885 NTKERNELAPI
4886 BOOLEAN
4887 NTAPI
4888 IoIsWdmVersionAvailable(
4889 IN UCHAR MajorVersion,
4890 IN UCHAR MinorVersion);
4891
4892 NTKERNELAPI
4893 PIRP
4894 NTAPI
4895 IoMakeAssociatedIrp(
4896 IN PIRP Irp,
4897 IN CCHAR StackSize);
4898
4899 /*
4900 * VOID
4901 * IoMarkIrpPending(
4902 * IN OUT PIRP Irp)
4903 */
4904 #define IoMarkIrpPending(_Irp) \
4905 (IoGetCurrentIrpStackLocation(_Irp)->Control |= SL_PENDING_RETURNED)
4906
4907 NTKERNELAPI
4908 NTSTATUS
4909 NTAPI
4910 IoOpenDeviceInterfaceRegistryKey(
4911 IN PUNICODE_STRING SymbolicLinkName,
4912 IN ACCESS_MASK DesiredAccess,
4913 OUT PHANDLE DeviceInterfaceKey);
4914
4915 #define PLUGPLAY_REGKEY_DEVICE 1
4916 #define PLUGPLAY_REGKEY_DRIVER 2
4917 #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4
4918
4919 NTKERNELAPI
4920 NTSTATUS
4921 NTAPI
4922 IoOpenDeviceRegistryKey(
4923 IN PDEVICE_OBJECT DeviceObject,
4924 IN ULONG DevInstKeyType,
4925 IN ACCESS_MASK DesiredAccess,
4926 OUT PHANDLE DevInstRegKey);
4927
4928 NTKERNELAPI
4929 NTSTATUS
4930 NTAPI
4931 IoQueryDeviceDescription(
4932 IN PINTERFACE_TYPE BusType OPTIONAL,
4933 IN PULONG BusNumber OPTIONAL,
4934 IN PCONFIGURATION_TYPE ControllerType OPTIONAL,
4935 IN PULONG ControllerNumber OPTIONAL,
4936 IN PCONFIGURATION_TYPE PeripheralType OPTIONAL,
4937 IN PULONG PeripheralNumber OPTIONAL,
4938 IN PIO_QUERY_DEVICE_ROUTINE CalloutRoutine,
4939 IN PVOID Context);
4940
4941 NTKERNELAPI
4942 VOID
4943 NTAPI
4944 IoQueueWorkItem(
4945 IN PIO_WORKITEM pIOWorkItem,
4946 IN PIO_WORKITEM_ROUTINE Routine,
4947 IN WORK_QUEUE_TYPE QueueType,
4948 IN PVOID Context);
4949
4950 NTKERNELAPI
4951 VOID
4952 NTAPI
4953 IoRaiseHardError(
4954 IN PIRP Irp,
4955 IN PVPB Vpb OPTIONAL,
4956 IN PDEVICE_OBJECT RealDeviceObject);
4957
4958 NTKERNELAPI
4959 BOOLEAN
4960 NTAPI
4961 IoRaiseInformationalHardError(
4962 IN NTSTATUS ErrorStatus,
4963 IN PUNICODE_STRING String OPTIONAL,
4964 IN PKTHREAD Thread OPTIONAL);
4965
4966 NTKERNELAPI
4967 NTSTATUS
4968 NTAPI
4969 IoReadDiskSignature(
4970 IN PDEVICE_OBJECT DeviceObject,
4971 IN ULONG BytesPerSector,
4972 OUT PDISK_SIGNATURE Signature);
4973
4974 NTKERNELAPI
4975 NTSTATUS
4976 FASTCALL
4977 IoReadPartitionTable(
4978 IN PDEVICE_OBJECT DeviceObject,
4979 IN ULONG SectorSize,
4980 IN BOOLEAN ReturnRecognizedPartitions,
4981 OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer);
4982
4983 NTKERNELAPI
4984 NTSTATUS
4985 NTAPI
4986 IoReadPartitionTableEx(
4987 IN PDEVICE_OBJECT DeviceObject,
4988 IN struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer);
4989
4990 NTKERNELAPI
4991 VOID
4992 NTAPI
4993 IoRegisterBootDriverReinitialization(
4994 IN PDRIVER_OBJECT DriverObject,
4995 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
4996 IN PVOID Context);
4997
4998 NTKERNELAPI
4999 VOID
5000 NTAPI
5001 IoRegisterBootDriverReinitialization(
5002 IN PDRIVER_OBJECT DriverObject,
5003 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
5004 IN PVOID Context);
5005
5006 NTKERNELAPI
5007 NTSTATUS
5008 NTAPI
5009 IoRegisterDeviceInterface(
5010 IN PDEVICE_OBJECT PhysicalDeviceObject,
5011 IN CONST GUID *InterfaceClassGuid,
5012 IN PUNICODE_STRING ReferenceString OPTIONAL,
5013 OUT PUNICODE_STRING SymbolicLinkName);
5014
5015 NTKERNELAPI
5016 VOID
5017 NTAPI
5018 IoRegisterDriverReinitialization(
5019 IN PDRIVER_OBJECT DriverObject,
5020 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
5021 IN PVOID Context);
5022
5023 NTKERNELAPI
5024 NTSTATUS
5025 NTAPI
5026 IoRegisterPlugPlayNotification(
5027 IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
5028 IN ULONG EventCategoryFlags,
5029 IN PVOID EventCategoryData OPTIONAL,
5030 IN PDRIVER_OBJECT DriverObject,
5031 IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine,
5032 IN PVOID Context,
5033 OUT PVOID *NotificationEntry);
5034
5035 NTKERNELAPI
5036 NTSTATUS
5037 NTAPI
5038 IoRegisterShutdownNotification(
5039 IN PDEVICE_OBJECT DeviceObject);
5040
5041 NTKERNELAPI
5042 VOID
5043 NTAPI
5044 IoReleaseCancelSpinLock(
5045 IN KIRQL Irql);
5046
5047 NTKERNELAPI
5048 VOID
5049 NTAPI
5050 IoReleaseRemoveLockAndWaitEx(
5051 IN PIO_REMOVE_LOCK RemoveLock,
5052 IN PVOID Tag,
5053 IN ULONG RemlockSize);
5054
5055 NTKERNELAPI
5056 VOID
5057 NTAPI
5058 IoReleaseRemoveLockEx(
5059 IN PIO_REMOVE_LOCK RemoveLock,
5060 IN PVOID Tag,
5061 IN ULONG RemlockSize);
5062
5063 /*
5064 * VOID
5065 * IoReleaseRemoveLock(
5066 * IN PIO_REMOVE_LOCK RemoveLock,
5067 * IN PVOID Tag)
5068 */
5069 #define IoReleaseRemoveLock(_RemoveLock, \
5070 _Tag) \
5071 IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
5072
5073 /*
5074 * VOID
5075 * IoReleaseRemoveLockAndWait(
5076 * IN PIO_REMOVE_LOCK RemoveLock,
5077 * IN PVOID Tag)
5078 */
5079 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
5080 _Tag) \
5081 IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
5082
5083 NTKERNELAPI
5084 VOID
5085 NTAPI
5086 IoRemoveShareAccess(
5087 IN PFILE_OBJECT FileObject,
5088 IN OUT PSHARE_ACCESS ShareAccess);
5089
5090 NTKERNELAPI
5091 NTSTATUS
5092 NTAPI
5093 IoReportDetectedDevice(
5094 IN PDRIVER_OBJECT DriverObject,
5095 IN INTERFACE_TYPE LegacyBusType,
5096 IN ULONG BusNumber,
5097 IN ULONG SlotNumber,
5098 IN PCM_RESOURCE_LIST ResourceList,
5099 IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL,
5100 IN BOOLEAN ResourceAssigned,
5101 IN OUT PDEVICE_OBJECT *DeviceObject);
5102
5103 NTKERNELAPI
5104 NTSTATUS
5105 NTAPI
5106 IoReportResourceForDetection(
5107 IN PDRIVER_OBJECT DriverObject,
5108 IN PCM_RESOURCE_LIST DriverList OPTIONAL,
5109 IN ULONG DriverListSize OPTIONAL,
5110 IN PDEVICE_OBJECT DeviceObject OPTIONAL,
5111 IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
5112 IN ULONG DeviceListSize OPTIONAL,
5113 OUT PBOOLEAN ConflictDetected);
5114
5115 NTKERNELAPI
5116 NTSTATUS
5117 NTAPI
5118 IoReportResourceUsage(
5119 IN PUNICODE_STRING DriverClassName OPTIONAL,
5120 IN PDRIVER_OBJECT DriverObject,
5121 IN PCM_RESOURCE_LIST DriverList OPTIONAL,
5122 IN ULONG DriverListSize OPTIONAL,
5123 IN PDEVICE_OBJECT DeviceObject,
5124 IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
5125 IN ULONG DeviceListSize OPTIONAL,
5126 IN BOOLEAN OverrideConflict,
5127 OUT PBOOLEAN ConflictDetected);
5128
5129 NTKERNELAPI
5130 NTSTATUS
5131 NTAPI
5132 IoReportTargetDeviceChange(
5133 IN PDEVICE_OBJECT PhysicalDeviceObject,
5134 IN PVOID NotificationStructure);
5135
5136 NTKERNELAPI
5137 NTSTATUS
5138 NTAPI
5139 IoReportTargetDeviceChangeAsynchronous(
5140 IN PDEVICE_OBJECT PhysicalDeviceObject,
5141 IN PVOID NotificationStructure,
5142 IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL,
5143 IN PVOID Context OPTIONAL);
5144
5145 NTKERNELAPI
5146 VOID
5147 NTAPI
5148 IoRequestDeviceEject(
5149 IN PDEVICE_OBJECT PhysicalDeviceObject);
5150
5151 /*
5152 * VOID
5153 * IoRequestDpc(
5154 * IN PDEVICE_OBJECT DeviceObject,
5155 * IN PIRP Irp,
5156 * IN PVOID Context);
5157 */
5158 #define IoRequestDpc(DeviceObject, Irp, Context)( \
5159 KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
5160
5161 NTKERNELAPI
5162 VOID
5163 NTAPI
5164 IoReuseIrp(
5165 IN OUT PIRP Irp,
5166 IN NTSTATUS Status);
5167
5168 /*
5169 * PDRIVER_CANCEL
5170 * IoSetCancelRoutine(
5171 * IN PIRP Irp,
5172 * IN PDRIVER_CANCEL CancelRoutine)
5173 */
5174 #define IoSetCancelRoutine(_Irp, \
5175 _CancelRoutine) \
5176 ((PDRIVER_CANCEL) InterlockedExchangePointer( \
5177 (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (_CancelRoutine)))
5178
5179 /*
5180 * VOID
5181 * IoSetCompletionRoutine(
5182 * IN PIRP Irp,
5183 * IN PIO_COMPLETION_ROUTINE CompletionRoutine,
5184 * IN PVOID Context,
5185 * IN BOOLEAN InvokeOnSuccess,
5186 * IN BOOLEAN InvokeOnError,
5187 * IN BOOLEAN InvokeOnCancel)
5188 */
5189 #define IoSetCompletionRoutine(_Irp, \
5190 _CompletionRoutine, \
5191 _Context, \
5192 _InvokeOnSuccess, \
5193 _InvokeOnError, \
5194 _InvokeOnCancel) \
5195 { \
5196 PIO_STACK_LOCATION _IrpSp; \
5197 ASSERT((_InvokeOnSuccess) || (_InvokeOnError) || (_InvokeOnCancel) ? \
5198 (_CompletionRoutine) != NULL : TRUE); \
5199 _IrpSp = IoGetNextIrpStackLocation(_Irp); \
5200 _IrpSp->CompletionRoutine = (PIO_COMPLETION_ROUTINE)(_CompletionRoutine); \
5201 _IrpSp->Context = (_Context); \
5202 _IrpSp->Control = 0; \
5203 if (_InvokeOnSuccess) _IrpSp->Control = SL_INVOKE_ON_SUCCESS; \
5204 if (_InvokeOnError) _IrpSp->Control |= SL_INVOKE_ON_ERROR; \
5205 if (_InvokeOnCancel) _IrpSp->Control |= SL_INVOKE_ON_CANCEL; \
5206 }
5207
5208 NTKERNELAPI
5209 NTSTATUS
5210 NTAPI
5211 IoSetCompletionRoutineEx(
5212 IN PDEVICE_OBJECT DeviceObject,
5213 IN PIRP Irp,
5214 IN PIO_COMPLETION_ROUTINE CompletionRoutine,
5215 IN PVOID Context,
5216 IN BOOLEAN InvokeOnSuccess,
5217 IN BOOLEAN InvokeOnError,
5218 IN BOOLEAN InvokeOnCancel);
5219
5220 NTKERNELAPI
5221 NTSTATUS
5222 NTAPI
5223 IoSetDeviceInterfaceState(
5224 IN PUNICODE_STRING SymbolicLinkName,
5225 IN BOOLEAN Enable);
5226
5227 NTKERNELAPI
5228 VOID
5229 NTAPI
5230 IoSetHardErrorOrVerifyDevice(
5231 IN PIRP Irp,
5232 IN PDEVICE_OBJECT DeviceObject);
5233
5234 /*
5235 * VOID
5236 * IoSetNextIrpStackLocation(
5237 * IN OUT PIRP Irp)
5238 */
5239 #define IoSetNextIrpStackLocation(_Irp) \
5240 { \
5241 (_Irp)->CurrentLocation--; \
5242 (_Irp)->Tail.Overlay.CurrentStackLocation--; \
5243 }
5244
5245 NTKERNELAPI
5246 NTSTATUS
5247 FASTCALL
5248 IoSetPartitionInformation(
5249 IN PDEVICE_OBJECT DeviceObject,
5250 IN ULONG SectorSize,
5251 IN ULONG PartitionNumber,
5252 IN ULONG PartitionType);
5253
5254 NTKERNELAPI
5255 NTSTATUS
5256 NTAPI
5257 IoSetPartitionInformationEx(
5258 IN PDEVICE_OBJECT DeviceObject,
5259 IN ULONG PartitionNumber,
5260 IN struct _SET_PARTITION_INFORMATION_EX *PartitionInfo);
5261
5262 NTKERNELAPI
5263 VOID
5264 NTAPI
5265 IoSetShareAccess(
5266 IN ACCESS_MASK DesiredAccess,
5267 IN ULONG DesiredShareAccess,
5268 IN OUT PFILE_OBJECT FileObject,
5269 OUT PSHARE_ACCESS ShareAccess);
5270
5271 NTKERNELAPI
5272 VOID
5273 NTAPI
5274 IoSetStartIoAttributes(
5275 IN PDEVICE_OBJECT DeviceObject,
5276 IN BOOLEAN DeferredStartIo,
5277 IN BOOLEAN NonCancelable);
5278
5279 NTKERNELAPI
5280 NTSTATUS
5281 NTAPI
5282 IoSetSystemPartition(
5283 IN PUNICODE_STRING VolumeNameString);
5284
5285 NTKERNELAPI
5286 BOOLEAN
5287 NTAPI
5288 IoSetThreadHardErrorMode(
5289 IN BOOLEAN EnableHardErrors);
5290
5291 /*
5292 * USHORT
5293 * IoSizeOfIrp(
5294 * IN CCHAR StackSize)
5295 */
5296 #define IoSizeOfIrp(_StackSize) \
5297 ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
5298
5299 /*
5300 * VOID
5301 * IoSkipCurrentIrpStackLocation(
5302 * IN PIRP Irp)
5303 */
5304 #define IoSkipCurrentIrpStackLocation(_Irp) \
5305 { \
5306 (_Irp)->CurrentLocation++; \
5307 (_Irp)->Tail.Overlay.CurrentStackLocation++; \
5308 }
5309
5310 NTKERNELAPI
5311 VOID
5312 NTAPI
5313 IoStartNextPacket(
5314 IN PDEVICE_OBJECT DeviceObject,
5315 IN BOOLEAN Cancelable);
5316
5317 NTKERNELAPI
5318 VOID
5319 NTAPI
5320 IoStartNextPacketByKey(
5321 IN PDEVICE_OBJECT DeviceObject,
5322 IN BOOLEAN Cancelable,
5323 IN ULONG Key);
5324
5325 NTKERNELAPI
5326 VOID
5327 NTAPI
5328 IoStartPacket(
5329 IN PDEVICE_OBJECT DeviceObject,
5330 IN PIRP Irp,
5331 IN PULONG Key OPTIONAL,
5332 IN PDRIVER_CANCEL CancelFunction OPTIONAL);
5333
5334 NTKERNELAPI
5335 VOID
5336 NTAPI
5337 IoStartTimer(
5338 IN PDEVICE_OBJECT DeviceObject);
5339
5340 NTKERNELAPI
5341 VOID
5342 NTAPI
5343 IoStopTimer(
5344 IN PDEVICE_OBJECT DeviceObject);
5345
5346 NTKERNELAPI
5347 NTSTATUS
5348 NTAPI
5349 IoUnregisterPlugPlayNotification(
5350 IN PVOID NotificationEntry);
5351
5352 NTKERNELAPI
5353 VOID
5354 NTAPI
5355 IoUnregisterShutdownNotification(
5356 IN PDEVICE_OBJECT DeviceObject);
5357
5358 NTKERNELAPI
5359 VOID
5360 NTAPI
5361 IoUpdateShareAccess(
5362 IN PFILE_OBJECT FileObject,
5363 IN OUT PSHARE_ACCESS ShareAccess);
5364
5365 NTKERNELAPI
5366 NTSTATUS
5367 NTAPI
5368 IoVerifyPartitionTable(
5369 IN PDEVICE_OBJECT DeviceObject,
5370 IN BOOLEAN FixErrors);
5371
5372 NTKERNELAPI
5373 NTSTATUS
5374 NTAPI
5375 IoVolumeDeviceToDosName(
5376 IN PVOID VolumeDeviceObject,
5377 OUT PUNICODE_STRING DosName);
5378
5379 NTKERNELAPI
5380 NTSTATUS
5381 NTAPI
5382 IoWMIAllocateInstanceIds(
5383 IN GUID *Guid,
5384 IN ULONG InstanceCount,
5385 OUT ULONG *FirstInstanceId);
5386
5387 NTKERNELAPI
5388 ULONG
5389 NTAPI
5390 IoWMIDeviceObjectToProviderId(
5391 IN PDEVICE_OBJECT DeviceObject);
5392
5393 NTKERNELAPI
5394 NTSTATUS
5395 NTAPI
5396 IoWMIDeviceObjectToInstanceName(
5397 IN PVOID DataBlockObject,
5398 IN PDEVICE_OBJECT DeviceObject,
5399 OUT PUNICODE_STRING InstanceName);
5400
5401 NTKERNELAPI
5402 NTSTATUS
5403 NTAPI
5404 IoWMIExecuteMethod(
5405 IN PVOID DataBlockObject,
5406 IN PUNICODE_STRING InstanceName,
5407 IN ULONG MethodId,
5408 IN ULONG InBufferSize,
5409 IN OUT PULONG OutBufferSize,
5410 IN OUT PUCHAR InOutBuffer);
5411
5412 NTKERNELAPI
5413 NTSTATUS
5414 NTAPI
5415 IoWMIHandleToInstanceName(
5416 IN PVOID DataBlockObject,
5417 IN HANDLE FileHandle,
5418 OUT PUNICODE_STRING InstanceName);
5419
5420 NTKERNELAPI
5421 NTSTATUS
5422 NTAPI
5423 IoWMIOpenBlock(
5424 IN GUID *DataBlockGuid,
5425 IN ULONG DesiredAccess,
5426 OUT PVOID *DataBlockObject);
5427
5428 NTKERNELAPI
5429 NTSTATUS
5430 NTAPI
5431 IoWMIQueryAllData(
5432 IN PVOID DataBlockObject,
5433 IN OUT ULONG *InOutBufferSize,
5434 OUT PVOID OutBuffer);
5435
5436 NTKERNELAPI
5437 NTSTATUS
5438 NTAPI
5439 IoWMIQueryAllDataMultiple(
5440 IN PVOID *DataBlockObjectList,
5441 IN ULONG ObjectCount,
5442 IN OUT ULONG *InOutBufferSize,
5443 OUT PVOID OutBuffer);
5444
5445 NTKERNELAPI
5446 NTSTATUS
5447 NTAPI
5448 IoWMIQuerySingleInstance(
5449 IN PVOID DataBlockObject,
5450 IN PUNICODE_STRING InstanceName,
5451 IN OUT ULONG *InOutBufferSize,
5452 OUT PVOID OutBuffer);
5453
5454 NTKERNELAPI
5455 NTSTATUS
5456 NTAPI
5457 IoWMIQuerySingleInstanceMultiple(
5458 IN PVOID *DataBlockObjectList,
5459 IN PUNICODE_STRING InstanceNames,
5460 IN ULONG ObjectCount,
5461 IN OUT ULONG *InOutBufferSize,
5462 OUT PVOID OutBuffer);
5463
5464 NTKERNELAPI
5465 NTSTATUS
5466 NTAPI
5467 IoWMIRegistrationControl(
5468 IN PDEVICE_OBJECT DeviceObject,
5469 IN ULONG Action);
5470
5471 NTKERNELAPI
5472 NTSTATUS
5473 NTAPI
5474 IoWMISetNotificationCallback(
5475 IN PVOID Object,
5476 IN WMI_NOTIFICATION_CALLBACK Callback,
5477 IN PVOID Context);
5478
5479 NTKERNELAPI
5480 NTSTATUS
5481 NTAPI
5482 IoWMISetSingleInstance(
5483 IN PVOID DataBlockObject,
5484 IN PUNICODE_STRING InstanceName,
5485 IN ULONG Version,
5486 IN ULONG ValueBufferSize,
5487 IN PVOID ValueBuffer);
5488
5489 NTKERNELAPI
5490 NTSTATUS
5491 NTAPI
5492 IoWMISetSingleItem(
5493 IN PVOID DataBlockObject,
5494 IN PUNICODE_STRING InstanceName,
5495 IN ULONG DataItemId,
5496 IN ULONG Version,
5497 IN ULONG ValueBufferSize,
5498 IN PVOID ValueBuffer);
5499
5500 NTKERNELAPI
5501 NTSTATUS
5502 NTAPI
5503 IoWMISuggestInstanceName(
5504 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
5505 IN PUNICODE_STRING SymbolicLinkName OPTIONAL,
5506 IN BOOLEAN CombineNames,
5507 OUT PUNICODE_STRING SuggestedInstanceName);
5508
5509 NTKERNELAPI
5510 NTSTATUS
5511 NTAPI
5512 IoWMIWriteEvent(
5513 IN PVOID WnodeEventItem);
5514
5515 NTKERNELAPI
5516 VOID
5517 NTAPI
5518 IoWriteErrorLogEntry(
5519 IN PVOID ElEntry);
5520
5521 NTKERNELAPI
5522 NTSTATUS
5523 FASTCALL
5524 IoWritePartitionTable(
5525 IN PDEVICE_OBJECT DeviceObject,
5526 IN ULONG SectorSize,
5527 IN ULONG SectorsPerTrack,
5528 IN ULONG NumberOfHeads,
5529 IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer);
5530
5531 NTKERNELAPI
5532 NTSTATUS
5533 NTAPI
5534 IoWritePartitionTableEx(
5535 IN PDEVICE_OBJECT DeviceObject,
5536 IN struct _DRIVE_LAYOUT_INFORMATION_EX *PartitionBuffer);
5537
5538
5539
5540 /** Kernel routines **/
5541
5542 #if defined (_M_AMD64)
5543 NTKERNELAPI
5544 VOID
5545 FASTCALL
5546 KeAcquireInStackQueuedSpinLock(
5547 IN PKSPIN_LOCK SpinLock,
5548 IN PKLOCK_QUEUE_HANDLE LockHandle);
5549
5550 NTKERNELAPI
5551 VOID
5552 FASTCALL
5553 KeReleaseInStackQueuedSpinLock(
5554 IN PKLOCK_QUEUE_HANDLE LockHandle);
5555 #else
5556 NTHALAPI
5557 VOID
5558 FASTCALL
5559 KeAcquireInStackQueuedSpinLock(
5560 IN PKSPIN_LOCK SpinLock,
5561 IN PKLOCK_QUEUE_HANDLE LockHandle);
5562
5563 NTHALAPI
5564 VOID
5565 FASTCALL
5566 KeReleaseInStackQueuedSpinLock(
5567 IN PKLOCK_QUEUE_HANDLE LockHandle);
5568 #endif
5569
5570 NTKERNELAPI
5571 VOID
5572 FASTCALL
5573 KeAcquireInStackQueuedSpinLockAtDpcLevel(
5574 IN PKSPIN_LOCK SpinLock,
5575 IN PKLOCK_QUEUE_HANDLE LockHandle);
5576
5577 NTKERNELAPI
5578 KIRQL
5579 NTAPI
5580 KeAcquireInterruptSpinLock(
5581 IN PKINTERRUPT Interrupt);
5582
5583 NTKERNELAPI
5584 BOOLEAN
5585 NTAPI
5586 KeAreApcsDisabled(
5587 VOID);
5588
5589 NTKERNELAPI
5590 DECLSPEC_NORETURN
5591 VOID
5592 NTAPI
5593 KeBugCheck(
5594 IN ULONG BugCheckCode);
5595
5596 NTKERNELAPI
5597 DECLSPEC_NORETURN
5598 VOID
5599 NTAPI
5600 KeBugCheckEx(
5601 IN ULONG BugCheckCode,
5602 IN ULONG_PTR BugCheckParameter1,
5603 IN ULONG_PTR BugCheckParameter2,
5604 IN ULONG_PTR BugCheckParameter3,
5605 IN ULONG_PTR BugCheckParameter4);
5606
5607 NTKERNELAPI
5608 BOOLEAN
5609 NTAPI
5610 KeCancelTimer(
5611 IN PKTIMER Timer);
5612
5613 NTKERNELAPI
5614 VOID
5615 NTAPI
5616 KeClearEvent(
5617 IN PRKEVENT Event);
5618
5619 NTKERNELAPI
5620 NTSTATUS
5621 NTAPI
5622 KeDelayExecutionThread(
5623 IN KPROCESSOR_MODE WaitMode,
5624 IN BOOLEAN Alertable,
5625 IN PLARGE_INTEGER Interval);
5626
5627 NTKERNELAPI
5628 BOOLEAN
5629 NTAPI
5630 KeDeregisterBugCheckCallback(
5631 IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord);
5632
5633 NTKERNELAPI
5634 VOID
5635 NTAPI
5636 KeEnterCriticalRegion(
5637 VOID);
5638
5639 /*
5640 * VOID
5641 * KeFlushIoBuffers(
5642 * IN PMDL Mdl,
5643 * IN BOOLEAN ReadOperation,
5644 * IN BOOLEAN DmaOperation)
5645 */
5646 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
5647
5648 #define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql))
5649 #define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql))
5650 #define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock)
5651 #define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock)
5652
5653 NTKERNELAPI
5654 VOID
5655 NTAPI
5656 KeFlushQueuedDpcs(
5657 VOID
5658 );
5659
5660 NTHALAPI
5661 VOID
5662 NTAPI
5663 KeFlushWriteBuffer(VOID);
5664
5665 NTKERNELAPI
5666 ULONG
5667 NTAPI
5668 KeGetRecommendedSharedDataAlignment(
5669 VOID);
5670
5671 NTKERNELAPI
5672 VOID
5673 NTAPI
5674 KeInitializeDeviceQueue(
5675 IN PKDEVICE_QUEUE DeviceQueue);
5676
5677 NTKERNELAPI
5678 VOID
5679 NTAPI
5680 KeInitializeMutex(
5681 IN PRKMUTEX Mutex,
5682 IN ULONG Level);
5683
5684 NTKERNELAPI
5685 VOID
5686 NTAPI
5687 KeInitializeSemaphore(
5688 IN PRKSEMAPHORE Semaphore,
5689 IN LONG Count,
5690 IN LONG Limit);
5691
5692 NTKERNELAPI
5693 VOID
5694 NTAPI
5695 KeInitializeTimer(
5696 IN PKTIMER Timer);
5697
5698 NTKERNELAPI
5699 VOID
5700 NTAPI
5701 KeInitializeTimerEx(
5702 IN PKTIMER Timer,
5703 IN TIMER_TYPE Type);
5704
5705 NTKERNELAPI
5706 BOOLEAN
5707 NTAPI
5708 KeInsertByKeyDeviceQueue(
5709 IN PKDEVICE_QUEUE DeviceQueue,
5710 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry,
5711 IN ULONG SortKey);
5712
5713 NTKERNELAPI
5714 BOOLEAN
5715 NTAPI
5716 KeInsertDeviceQueue(
5717 IN PKDEVICE_QUEUE DeviceQueue,
5718 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
5719
5720 NTKERNELAPI
5721 BOOLEAN
5722 NTAPI
5723 KeInsertQueueDpc(
5724 IN PRKDPC Dpc,
5725 IN PVOID SystemArgument1,
5726 IN PVOID SystemArgument2);
5727
5728 NTKERNELAPI
5729 VOID
5730 NTAPI
5731 KeLeaveCriticalRegion(
5732 VOID);
5733
5734 #ifdef _X86_
5735
5736 static __inline
5737 VOID
5738 KeMemoryBarrier(
5739 VOID)
5740 {
5741 volatile LONG Barrier;
5742 #if defined(__GNUC__)
5743 __asm__ __volatile__ ("xchg %%eax, %0" : : "m" (Barrier) : "%eax");
5744 #elif defined(_MSC_VER)
5745 __asm xchg [Barrier], eax
5746 #endif
5747 }
5748
5749 #endif
5750
5751 NTKERNELAPI
5752 LONG
5753 NTAPI
5754 KePulseEvent(
5755 IN PRKEVENT Event,
5756 IN KPRIORITY Increment,
5757 IN BOOLEAN Wait);
5758
5759 NTKERNELAPI
5760 KAFFINITY
5761 NTAPI
5762 KeQueryActiveProcessors(
5763 VOID
5764 );
5765
5766 NTHALAPI
5767 LARGE_INTEGER
5768 NTAPI
5769 KeQueryPerformanceCounter(
5770 OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL);
5771
5772 NTKERNELAPI
5773 KPRIORITY
5774 NTAPI
5775 KeQueryPriorityThread(
5776 IN PRKTHREAD Thread);
5777
5778 NTKERNELAPI
5779 ULONG
5780 NTAPI
5781 KeQueryRuntimeThread(
5782 IN PKTHREAD Thread,
5783 OUT PULONG UserTime);
5784
5785 #if !defined(_M_AMD64)
5786 NTKERNELAPI
5787 ULONGLONG
5788 NTAPI
5789 KeQueryInterruptTime(
5790 VOID);
5791
5792 NTKERNELAPI
5793 VOID
5794 NTAPI
5795 KeQuerySystemTime(
5796 OUT PLARGE_INTEGER CurrentTime);
5797
5798 NTKERNELAPI
5799 VOID
5800 NTAPI
5801 KeQueryTickCount(
5802 OUT PLARGE_INTEGER TickCount);
5803 #endif
5804
5805 NTKERNELAPI
5806 ULONG
5807 NTAPI
5808 KeQueryTimeIncrement(
5809 VOID);
5810
5811 NTKERNELAPI
5812 LONG
5813 NTAPI
5814 KeReadStateEvent(
5815 IN PRKEVENT Event);
5816
5817 NTKERNELAPI
5818 LONG
5819 NTAPI
5820 KeReadStateMutex(
5821 IN PRKMUTEX Mutex);
5822
5823
5824 NTKERNELAPI
5825 LONG
5826 NTAPI
5827 KeReadStateSemaphore(
5828 IN PRKSEMAPHORE Semaphore);
5829
5830 NTKERNELAPI
5831 BOOLEAN
5832 NTAPI
5833 KeReadStateTimer(
5834 IN PKTIMER Timer);
5835
5836 NTKERNELAPI
5837 BOOLEAN
5838 NTAPI
5839 KeRegisterBugCheckCallback(
5840 IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord,
5841 IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine,
5842 IN PVOID Buffer,
5843 IN ULONG Length,
5844 IN PUCHAR Component);
5845
5846 NTKERNELAPI
5847 PVOID
5848 NTAPI
5849 KeRegisterNmiCallback(
5850 IN PNMI_CALLBACK CallbackRoutine,
5851 IN PVOID Context
5852 );
5853
5854 NTKERNELAPI
5855 NTSTATUS
5856 NTAPI
5857 KeDeregisterNmiCallback(
5858 IN PVOID Handle
5859 );
5860
5861 NTKERNELAPI
5862 VOID
5863 FASTCALL
5864 KeReleaseInStackQueuedSpinLockFromDpcLevel(
5865 IN PKLOCK_QUEUE_HANDLE LockHandle);
5866
5867 NTKERNELAPI
5868 VOID
5869 NTAPI
5870 KeReleaseInterruptSpinLock(
5871 IN PKINTERRUPT Interrupt,
5872 IN KIRQL OldIrql);
5873
5874 NTKERNELAPI
5875 LONG
5876 NTAPI
5877 KeReleaseMutex(
5878 IN PRKMUTEX Mutex,
5879 IN BOOLEAN Wait);
5880
5881 NTKERNELAPI
5882 LONG
5883 NTAPI
5884 KeReleaseSemaphore(
5885 IN PRKSEMAPHORE Semaphore,
5886 IN KPRIORITY Increment,
5887 IN LONG Adjustment,
5888 IN BOOLEAN Wait);
5889
5890 NTKERNELAPI
5891 PKDEVICE_QUEUE_ENTRY
5892 NTAPI
5893 KeRemoveByKeyDeviceQueue(
5894 IN PKDEVICE_QUEUE DeviceQueue,
5895 IN ULONG SortKey);
5896
5897 NTKERNELAPI
5898 PKDEVICE_QUEUE_ENTRY
5899 NTAPI
5900 KeRemoveDeviceQueue(
5901 IN PKDEVICE_QUEUE DeviceQueue);
5902
5903 NTKERNELAPI
5904 BOOLEAN
5905 NTAPI
5906 KeRemoveEntryDeviceQueue(
5907 IN PKDEVICE_QUEUE DeviceQueue,
5908 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
5909
5910 NTKERNELAPI
5911 BOOLEAN
5912 NTAPI
5913 KeRemoveQueueDpc(
5914 IN PRKDPC Dpc);
5915
5916 NTKERNELAPI
5917 LONG
5918 NTAPI
5919 KeResetEvent(
5920 IN PRKEVENT Event);
5921
5922 NTKERNELAPI
5923 NTSTATUS
5924 NTAPI
5925 KeRestoreFloatingPointState(
5926 IN PKFLOATING_SAVE FloatSave);
5927
5928 NTKERNELAPI
5929 VOID
5930 NTAPI
5931 KeRevertToUserAffinityThread(VOID);
5932
5933 NTKERNELAPI
5934 NTSTATUS
5935 NTAPI
5936 KeSaveFloatingPointState(
5937 OUT PKFLOATING_SAVE FloatSave);
5938
5939 NTKERNELAPI
5940 LONG
5941 NTAPI
5942 KeSetBasePriorityThread(
5943 IN PRKTHREAD Thread,
5944 IN LONG Increment);
5945
5946 NTKERNELAPI
5947 LONG
5948 NTAPI
5949 KeSetEvent(
5950 IN PRKEVENT Event,
5951 IN KPRIORITY Increment,
5952 IN BOOLEAN Wait);
5953
5954 NTKERNELAPI
5955 VOID
5956 NTAPI
5957 KeSetImportanceDpc(
5958 IN PRKDPC Dpc,
5959 IN KDPC_IMPORTANCE Importance);
5960
5961 NTKERNELAPI
5962 KPRIORITY
5963 NTAPI
5964 KeSetPriorityThread(
5965 IN PKTHREAD Thread,
5966 IN KPRIORITY Priority);
5967
5968 NTKERNELAPI
5969 VOID
5970 NTAPI
5971 KeSetSystemAffinityThread(
5972 IN KAFFINITY Affinity);
5973
5974 NTKERNELAPI
5975 VOID
5976 NTAPI
5977 KeSetTargetProcessorDpc(
5978 IN PRKDPC Dpc,
5979 IN CCHAR Number);
5980
5981 NTKERNELAPI
5982 BOOLEAN
5983 NTAPI
5984 KeSetTimer(
5985 IN PKTIMER Timer,
5986 IN LARGE_INTEGER DueTime,
5987 IN PKDPC Dpc OPTIONAL);
5988
5989 NTKERNELAPI
5990 BOOLEAN
5991 NTAPI
5992 KeSetTimerEx(
5993 IN PKTIMER Timer,
5994 IN LARGE_INTEGER DueTime,
5995 IN LONG Period OPTIONAL,
5996 IN PKDPC Dpc OPTIONAL);
5997
5998 NTKERNELAPI
5999 VOID
6000 FASTCALL
6001 KeSetTimeUpdateNotifyRoutine(
6002 IN PTIME_UPDATE_NOTIFY_ROUTINE NotifyRoutine);
6003
6004 NTHALAPI
6005 VOID
6006 NTAPI
6007 KeStallExecutionProcessor(
6008 IN ULONG MicroSeconds);
6009
6010 NTKERNELAPI
6011 BOOLEAN
6012 NTAPI
6013 KeSynchronizeExecution(
6014 IN PKINTERRUPT Interrupt,
6015 IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine,
6016 IN PVOID SynchronizeContext);
6017
6018 NTKERNELAPI
6019 NTSTATUS
6020 NTAPI
6021 KeWaitForMultipleObjects(
6022 IN ULONG Count,
6023 IN PVOID Object[],
6024 IN WAIT_TYPE WaitType,
6025 IN KWAIT_REASON WaitReason,
6026 IN KPROCESSOR_MODE WaitMode,
6027 IN BOOLEAN Alertable,
6028 IN PLARGE_INTEGER Timeout OPTIONAL,
6029 IN PKWAIT_BLOCK WaitBlockArray OPTIONAL);
6030
6031 NTKERNELAPI
6032 NTSTATUS
6033 NTAPI
6034 KeWaitForMutexObject(
6035 IN PRKMUTEX Mutex,
6036 IN KWAIT_REASON WaitReason,
6037 IN KPROCESSOR_MODE WaitMode,
6038 IN BOOLEAN Alertable,
6039 IN PLARGE_INTEGER Timeout OPTIONAL);
6040
6041 NTKERNELAPI
6042 NTSTATUS
6043 NTAPI
6044 KeWaitForSingleObject(
6045 IN PVOID Object,
6046 IN KWAIT_REASON WaitReason,
6047 IN KPROCESSOR_MODE WaitMode,
6048 IN BOOLEAN Alertable,
6049 IN PLARGE_INTEGER Timeout OPTIONAL);
6050
6051 typedef
6052 ULONG_PTR
6053 (NTAPI *PKIPI_BROADCAST_WORKER)(
6054 IN ULONG_PTR Argument
6055 );
6056
6057 NTKERNELAPI
6058 ULONG_PTR
6059 NTAPI
6060 KeIpiGenericCall(
6061 IN PKIPI_BROADCAST_WORKER BroadcastFunction,
6062 IN ULONG_PTR Context
6063 );
6064
6065 #if defined(_X86_)
6066
6067 NTHALAPI
6068 VOID
6069 FASTCALL
6070 KfLowerIrql(
6071 IN KIRQL NewIrql);
6072
6073 NTHALAPI
6074 KIRQL
6075 FASTCALL
6076 KfRaiseIrql(
6077 IN KIRQL NewIrql);
6078
6079 NTHALAPI
6080 KIRQL
6081 DDKAPI
6082 KeRaiseIrqlToDpcLevel(
6083 VOID);
6084
6085 NTHALAPI
6086 KIRQL
6087 DDKAPI
6088 KeRaiseIrqlToSynchLevel(
6089 VOID);
6090
6091 #define KeLowerIrql(a) KfLowerIrql(a)
6092 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
6093
6094 #elif defined(_M_AMD64)
6095
6096 FORCEINLINE
6097 KIRQL
6098 KeGetCurrentIrql(VOID)
6099 {
6100 return (KIRQL)__readcr8();
6101 }
6102
6103 FORCEINLINE
6104 VOID
6105 KeLowerIrql(IN KIRQL NewIrql)
6106 {
6107 ASSERT(KeGetCurrentIrql() >= NewIrql);
6108 __writecr8(NewIrql);
6109 }
6110
6111 FORCEINLINE
6112 KIRQL
6113 KfRaiseIrql(IN KIRQL NewIrql)
6114 {
6115 KIRQL OldIrql;
6116
6117 OldIrql = __readcr8();
6118 ASSERT(OldIrql <= NewIrql);
6119 __writecr8(NewIrql);
6120 return OldIrql;
6121 }
6122 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
6123
6124 FORCEINLINE
6125 KIRQL
6126 KeRaiseIrqlToDpcLevel(VOID)
6127 {
6128 return KfRaiseIrql(DISPATCH_LEVEL);
6129 }
6130
6131 FORCEINLINE
6132 KIRQL
6133 KeRaiseIrqlToSynchLevel(VOID)
6134 {
6135 return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2
6136 }
6137
6138 #elif defined(__PowerPC__)
6139
6140 NTHALAPI
6141 VOID
6142 FASTCALL
6143 KfLowerIrql(
6144 IN KIRQL NewIrql);
6145
6146 NTHALAPI
6147 KIRQL
6148 FASTCALL
6149 KfRaiseIrql(
6150 IN KIRQL NewIrql);
6151
6152 NTHALAPI
6153 KIRQL
6154 DDKAPI
6155 KeRaiseIrqlToDpcLevel(
6156 VOID);
6157
6158 NTHALAPI
6159 KIRQL
6160 DDKAPI
6161 KeRaiseIrqlToSynchLevel(
6162 VOID);
6163
6164 #define KeLowerIrql(a) KfLowerIrql(a)
6165 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
6166
6167 #elif defined(_M_MIPS)
6168
6169 #define KeLowerIrql(a) KfLowerIrql(a)
6170 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
6171
6172 NTKERNELAPI
6173 VOID
6174 NTAPI
6175 KfLowerIrql(
6176 IN KIRQL NewIrql);
6177
6178 NTKERNELAPI
6179 KIRQL
6180 NTAPI
6181 KfRaiseIrql(
6182 IN KIRQL NewIrql);
6183
6184 NTKERNELAPI
6185 KIRQL
6186 NTAPI
6187 KeRaiseIrqlToDpcLevel(
6188 VOID);
6189
6190 NTKERNELAPI
6191 KIRQL
6192 DDKAPI
6193 KeRaiseIrqlToSynchLevel(
6194 VOID);
6195
6196 #elif defined(_M_ARM)
6197
6198 #include <armddk.h>
6199
6200 #else
6201
6202 NTKERNELAPI
6203 VOID
6204 NTAPI
6205 KeLowerIrql(
6206 IN KIRQL NewIrql);
6207
6208 NTKERNELAPI
6209 VOID
6210 NTAPI
6211 KeRaiseIrql(
6212 IN KIRQL NewIrql,
6213 OUT PKIRQL OldIrql);
6214
6215 NTKERNELAPI
6216 KIRQL
6217 NTAPI
6218 KeRaiseIrqlToDpcLevel(
6219 VOID);
6220
6221 NTKERNELAPI
6222 KIRQL
6223 DDKAPI
6224 KeRaiseIrqlToSynchLevel(
6225 VOID);
6226
6227 #endif
6228
6229 /** Memory manager routines **/
6230
6231 NTKERNELAPI
6232 NTSTATUS
6233 NTAPI
6234 MmAdvanceMdl(
6235 IN PMDL Mdl,
6236 IN ULONG NumberOfBytes);
6237
6238 NTKERNELAPI
6239 PVOID
6240 NTAPI
6241 MmAllocateContiguousMemory(
6242 IN ULONG NumberOfBytes,
6243 IN PHYSICAL_ADDRESS HighestAcceptableAddress);
6244
6245 NTKERNELAPI
6246 PVOID
6247 NTAPI
6248 MmAllocateContiguousMemorySpecifyCache(
6249 IN SIZE_T NumberOfBytes,
6250 IN PHYSICAL_ADDRESS LowestAcceptableAddress,
6251 IN PHYSICAL_ADDRESS HighestAcceptableAddress,
6252 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
6253 IN MEMORY_CACHING_TYPE CacheType);
6254
6255 NTKERNELAPI
6256 PVOID
6257 NTAPI
6258 MmAllocateMappingAddress(
6259 IN SIZE_T NumberOfBytes,
6260 IN ULONG PoolTag);
6261
6262 NTKERNELAPI
6263 PVOID
6264 NTAPI
6265 MmAllocateNonCachedMemory(
6266 IN ULONG NumberOfBytes);
6267
6268 NTKERNELAPI
6269 PMDL
6270 NTAPI
6271 MmAllocatePagesForMdl(
6272 IN PHYSICAL_ADDRESS LowAddress,
6273 IN PHYSICAL_ADDRESS HighAddress,
6274 IN PHYSICAL_ADDRESS SkipBytes,
6275 IN SIZE_T TotalBytes);
6276
6277 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
6278 NTKERNELAPI
6279 PMDL
6280 NTAPI
6281 MmAllocatePagesForMdlEx(
6282 IN PHYSICAL_ADDRESS LowAddress,
6283 IN PHYSICAL_ADDRESS HighAddress,
6284 IN PHYSICAL_ADDRESS SkipBytes,
6285 IN SIZE_T TotalBytes,
6286 IN MEMORY_CACHING_TYPE CacheType,
6287 IN ULONG Flags);
6288 #endif
6289
6290 NTKERNELAPI
6291 VOID
6292 NTAPI
6293 MmBuildMdlForNonPagedPool(
6294 IN OUT PMDL MemoryDescriptorList);
6295
6296 typedef enum _MMFLUSH_TYPE {
6297 MmFlushForDelete,
6298 MmFlushForWrite
6299 } MMFLUSH_TYPE;
6300
6301 NTKERNELAPI
6302 BOOLEAN
6303 NTAPI
6304 MmFlushImageSection(
6305 IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
6306 IN MMFLUSH_TYPE FlushType);
6307
6308 NTKERNELAPI
6309 VOID
6310 NTAPI
6311 MmFreeContiguousMemory(
6312 IN PVOID BaseAddress);
6313
6314 NTKERNELAPI
6315 VOID
6316 NTAPI
6317 MmFreeContiguousMemorySpecifyCache(
6318 IN PVOID BaseAddress,
6319 IN SIZE_T NumberOfBytes,
6320 IN MEMORY_CACHING_TYPE CacheType);
6321
6322 NTKERNELAPI
6323 VOID
6324 NTAPI
6325 MmFreeMappingAddress(
6326 IN PVOID BaseAddress,
6327 IN ULONG PoolTag);
6328
6329 NTKERNELAPI
6330 VOID
6331 NTAPI
6332 MmFreeNonCachedMemory(
6333 IN PVOID BaseAddress,
6334 IN SIZE_T NumberOfBytes);
6335
6336 NTKERNELAPI
6337 VOID
6338 NTAPI
6339 MmFreePagesFromMdl(
6340 IN PMDL MemoryDescriptorList);
6341
6342 /*
6343 * ULONG
6344 * MmGetMdlByteCount(
6345 * IN PMDL Mdl)
6346 */
6347 #define MmGetMdlByteCount(_Mdl) \
6348 ((_Mdl)->ByteCount)
6349
6350 /*
6351 * ULONG
6352 * MmGetMdlByteOffset(
6353 * IN PMDL Mdl)
6354 */
6355 #define MmGetMdlByteOffset(_Mdl) \
6356 ((_Mdl)->ByteOffset)
6357
6358 /*
6359 * PPFN_NUMBER
6360 * MmGetMdlPfnArray(
6361 * IN PMDL Mdl)
6362 */
6363 #define MmGetMdlPfnArray(_Mdl) \
6364 ((PPFN_NUMBER) ((_Mdl) + 1))
6365
6366 /*
6367 * PVOID
6368 * MmGetMdlVirtualAddress(
6369 * IN PMDL Mdl)
6370 */
6371 #define MmGetMdlVirtualAddress(_Mdl) \
6372 ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
6373
6374 NTKERNELAPI
6375 PHYSICAL_ADDRESS
6376 NTAPI
6377 MmGetPhysicalAddress(
6378 IN PVOID BaseAddress);
6379
6380 NTKERNELAPI
6381 PPHYSICAL_MEMORY_RANGE
6382 NTAPI
6383 MmGetPhysicalMemoryRanges(
6384 VOID);
6385
6386 NTKERNELAPI
6387 PVOID
6388 NTAPI
6389 MmGetVirtualForPhysical(
6390 IN PHYSICAL_ADDRESS PhysicalAddress);
6391
6392 NTKERNELAPI
6393 PVOID
6394 NTAPI
6395 MmMapLockedPagesSpecifyCache(
6396 IN PMDL MemoryDescriptorList,
6397 IN KPROCESSOR_MODE AccessMode,
6398 IN MEMORY_CACHING_TYPE CacheType,
6399 IN PVOID BaseAddress,
6400 IN ULONG BugCheckOnFailure,
6401 IN MM_PAGE_PRIORITY Priority);
6402
6403 NTKERNELAPI
6404 PVOID
6405 NTAPI
6406 MmMapLockedPagesWithReservedMapping(
6407 IN PVOID MappingAddress,
6408 IN ULONG PoolTag,
6409 IN PMDL MemoryDescriptorList,
6410 IN MEMORY_CACHING_TYPE CacheType);
6411
6412 NTKERNELAPI
6413 NTSTATUS
6414 NTAPI
6415 MmMapUserAddressesToPage(
6416 IN PVOID BaseAddress,
6417 IN SIZE_T NumberOfBytes,
6418 IN PVOID PageAddress);
6419
6420 NTKERNELAPI
6421 PVOID
6422 NTAPI
6423 MmMapVideoDisplay(
6424 IN PHYSICAL_ADDRESS PhysicalAddress,
6425 IN SIZE_T NumberOfBytes,
6426 IN MEMORY_CACHING_TYPE CacheType);
6427
6428 NTKERNELAPI
6429 NTSTATUS
6430 NTAPI
6431 MmMapViewInSessionSpace(
6432 IN PVOID Section,
6433 OUT PVOID *MappedBase,
6434 IN OUT PSIZE_T ViewSize);
6435
6436 NTKERNELAPI
6437 NTSTATUS
6438 NTAPI
6439 MmMapViewInSystemSpace(
6440 IN PVOID Section,
6441 OUT PVOID *MappedBase,
6442 IN PSIZE_T ViewSize);
6443
6444 NTKERNELAPI
6445 NTSTATUS
6446 NTAPI
6447 MmMarkPhysicalMemoryAsBad(
6448 IN PPHYSICAL_ADDRESS StartAddress,
6449 IN OUT PLARGE_INTEGER NumberOfBytes);
6450
6451 NTKERNELAPI
6452 NTSTATUS
6453 NTAPI
6454 MmMarkPhysicalMemoryAsGood(
6455 IN PPHYSICAL_ADDRESS StartAddress,
6456 IN OUT PLARGE_INTEGER NumberOfBytes);
6457
6458 NTKERNELAPI
6459 PVOID
6460 NTAPI
6461 MmGetSystemRoutineAddress(
6462 IN PUNICODE_STRING SystemRoutineName);
6463
6464 /*
6465 * ULONG
6466 * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
6467 * IN PVOID Va,
6468 * IN ULONG Size)
6469 */
6470 #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, \
6471 _Size) \
6472 ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
6473 + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
6474
6475 /*
6476 * VOID
6477 * MmInitializeMdl(
6478 * IN PMDL MemoryDescriptorList,
6479 * IN PVOID BaseVa,
6480 * IN SIZE_T Length)
6481 */
6482 #define MmInitializeMdl(_MemoryDescriptorList, \
6483 _BaseVa, \
6484 _Length) \
6485 { \
6486 (_MemoryDescriptorList)->Next = (PMDL) NULL; \
6487 (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
6488 (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
6489 (_MemoryDescriptorList)->MdlFlags = 0; \
6490 (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
6491 (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
6492 (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
6493 }
6494
6495 NTKERNELAPI
6496 BOOLEAN
6497 NTAPI
6498 MmIsAddressValid(
6499 IN PVOID VirtualAddress);
6500
6501 NTKERNELAPI
6502 LOGICAL
6503 NTAPI
6504 MmIsDriverVerifying(
6505 IN PDRIVER_OBJECT DriverObject);
6506
6507 NTKERNELAPI
6508 BOOLEAN
6509 NTAPI
6510 MmIsThisAnNtAsSystem(
6511 VOID);
6512
6513 NTKERNELAPI
6514 NTSTATUS
6515 NTAPI
6516 MmIsVerifierEnabled(
6517 OUT PULONG VerifierFlags);
6518
6519 NTKERNELAPI
6520 PVOID
6521 NTAPI
6522 MmLockPagableDataSection(
6523 IN PVOID AddressWithinSection);
6524
6525 NTKERNELAPI
6526 PVOID
6527 NTAPI
6528 MmLockPagableImageSection(
6529 IN PVOID AddressWithinSection);
6530
6531 /*
6532 * PVOID
6533 * MmLockPagableCodeSection(
6534 * IN PVOID AddressWithinSection)
6535 */
6536 #define MmLockPagableCodeSection(Address) MmLockPagableDataSection(Address)
6537
6538 NTKERNELAPI
6539 VOID
6540 NTAPI
6541 MmLockPagableSectionByHandle(
6542 IN PVOID ImageSectionHandle);
6543
6544 NTKERNELAPI
6545 PVOID
6546 NTAPI
6547 MmMapIoSpace(
6548 IN PHYSICAL_ADDRESS PhysicalAddress,
6549 IN ULONG NumberOfBytes,
6550 IN MEMORY_CACHING_TYPE CacheEnable);
6551
6552 NTKERNELAPI
6553 PVOID
6554 NTAPI
6555 MmMapLockedPages(
6556 IN PMDL MemoryDescriptorList,
6557 IN KPROCESSOR_MODE AccessMode);
6558
6559 NTKERNELAPI
6560 PVOID
6561 NTAPI
6562 MmLockPageableDataSection (
6563 IN PVOID AddressWithinSection
6564 );
6565
6566 NTKERNELAPI
6567 VOID
6568 NTAPI
6569 MmUnlockPageableImageSection(
6570 IN PVOID ImageSectionHandle
6571 );
6572
6573 NTKERNELAPI
6574 PVOID
6575 NTAPI
6576 MmPageEntireDriver(
6577 IN PVOID AddressWithinSection);
6578
6579 NTKERNELAPI
6580 VOID
6581 NTAPI
6582 MmProbeAndLockProcessPages(
6583 IN OUT PMDL MemoryDescriptorList,
6584 IN PEPROCESS Process,
6585 IN KPROCESSOR_MODE AccessMode,
6586 IN LOCK_OPERATION Operation);
6587
6588 NTKERNELAPI
6589 NTSTATUS
6590 NTAPI
6591 MmProtectMdlSystemAddress(
6592 IN PMDL MemoryDescriptorList,
6593 IN ULONG NewProtect);
6594
6595 NTKERNELAPI
6596 VOID
6597 NTAPI
6598 MmUnmapLockedPages(
6599 IN PVOID BaseAddress,
6600 IN PMDL MemoryDescriptorList);
6601
6602 NTKERNELAPI
6603 NTSTATUS
6604 NTAPI
6605 MmUnmapViewInSessionSpace(
6606 IN PVOID MappedBase);
6607
6608 NTKERNELAPI
6609 NTSTATUS
6610 NTAPI
6611 MmUnmapViewInSystemSpace(
6612 IN PVOID MappedBase);
6613
6614 NTKERNELAPI
6615 VOID
6616 NTAPI
6617 MmUnsecureVirtualMemory(
6618 IN HANDLE SecureHandle);
6619
6620 /*
6621 * VOID
6622 * MmPrepareMdlForReuse(
6623 * IN PMDL Mdl)
6624 */
6625 #define MmPrepareMdlForReuse(_Mdl) \
6626 { \
6627 if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
6628 ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
6629 MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
6630 } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
6631 ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
6632 } \
6633 }
6634
6635 #define MmGetProcedureAddress(Address) (Address)
6636
6637 NTKERNELAPI
6638 VOID
6639 NTAPI
6640 MmProbeAndLockPages(
6641 IN OUT PMDL MemoryDescriptorList,
6642 IN KPROCESSOR_MODE AccessMode,
6643 IN LOCK_OPERATION Operation);
6644
6645 NTKERNELAPI
6646 MM_SYSTEMSIZE
6647 NTAPI
6648 MmQuerySystemSize(
6649 VOID);
6650
6651 NTKERNELAPI
6652 NTSTATUS
6653 NTAPI
6654 MmRemovePhysicalMemory(
6655 IN PPHYSICAL_ADDRESS StartAddress,
6656 IN OUT PLARGE_INTEGER NumberOfBytes);
6657
6658 NTKERNELAPI
6659 VOID
6660 NTAPI
6661 MmResetDriverPaging(
6662 IN PVOID AddressWithinSection);
6663
6664 NTKERNELAPI
6665 HANDLE
6666 NTAPI
6667 MmSecureVirtualMemory(
6668 IN PVOID Address,
6669 IN SIZE_T Size,
6670 IN ULONG ProbeMode);
6671
6672 NTKERNELAPI
6673 SIZE_T
6674 NTAPI
6675 MmSizeOfMdl(
6676 IN PVOID Base,
6677 IN SIZE_T Length);
6678
6679 NTKERNELAPI
6680 VOID
6681 NTAPI
6682 MmUnlockPagableImageSection(
6683 IN PVOID ImageSectionHandle);
6684
6685 NTKERNELAPI
6686 VOID
6687 NTAPI
6688 MmUnlockPages(
6689 IN PMDL MemoryDescriptorList);
6690
6691 NTKERNELAPI
6692 VOID
6693 NTAPI
6694 MmUnmapIoSpace(
6695 IN PVOID BaseAddress,
6696 IN SIZE_T NumberOfBytes);
6697
6698 NTKERNELAPI
6699 VOID
6700 NTAPI
6701 MmUnmapReservedMapping(
6702 IN PVOID BaseAddress,
6703 IN ULONG PoolTag,
6704 IN PMDL MemoryDescriptorList);
6705
6706 NTKERNELAPI
6707 VOID
6708 NTAPI
6709 MmUnmapVideoDisplay(
6710 IN PVOID BaseAddress,
6711 IN SIZE_T NumberOfBytes);
6712
6713
6714
6715 /** Object manager routines **/
6716
6717 NTKERNELAPI
6718 NTSTATUS
6719 NTAPI
6720 ObAssignSecurity(
6721 IN PACCESS_STATE AccessState,
6722 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
6723 IN PVOID Object,
6724 IN POBJECT_TYPE Type);
6725
6726 NTKERNELAPI
6727 VOID
6728 NTAPI
6729 ObDereferenceSecurityDescriptor(
6730 PSECURITY_DESCRIPTOR SecurityDescriptor,
6731 ULONG Count);
6732
6733 NTKERNELAPI
6734 LONG_PTR
6735 FASTCALL
6736 ObfDereferenceObject(
6737 IN PVOID Object);
6738
6739 /*
6740 * VOID
6741 * ObDereferenceObject(
6742 * IN PVOID Object)
6743 */
6744 #define ObDereferenceObject ObfDereferenceObject
6745
6746 NTKERNELAPI
6747 NTSTATUS
6748 NTAPI
6749 ObGetObjectSecurity(
6750 IN PVOID Object,
6751 OUT PSECURITY_DESCRIPTOR *SecurityDescriptor,
6752 OUT PBOOLEAN MemoryAllocated);
6753
6754 NTKERNELAPI
6755 NTSTATUS
6756 NTAPI
6757 ObInsertObject(
6758 IN PVOID Object,
6759 IN PACCESS_STATE PassedAccessState OPTIONAL,
6760 IN ACCESS_MASK DesiredAccess,
6761 IN ULONG AdditionalReferences,
6762 OUT PVOID* ReferencedObject OPTIONAL,
6763 OUT PHANDLE Handle);
6764
6765 NTKERNELAPI
6766 LONG_PTR
6767 FASTCALL
6768 ObfReferenceObject(
6769 IN PVOID Object);
6770
6771 NTKERNELAPI
6772 NTSTATUS
6773 NTAPI
6774 ObLogSecurityDescriptor(
6775 IN PSECURITY_DESCRIPTOR InputSecurityDescriptor,
6776 OUT PSECURITY_DESCRIPTOR *OutputSecurityDescriptor,
6777 IN ULONG RefBias);
6778 /*
6779 * VOID
6780 * ObReferenceObject(
6781 * IN PVOID Object)
6782 */
6783 #define ObReferenceObject ObfReferenceObject
6784
6785 NTKERNELAPI
6786 VOID
6787 NTAPI
6788 ObMakeTemporaryObject(
6789 IN PVOID Object);
6790
6791 NTKERNELAPI
6792 NTSTATUS
6793 NTAPI
6794 ObOpenObjectByName(
6795 IN POBJECT_ATTRIBUTES ObjectAttributes,
6796 IN POBJECT_TYPE ObjectType,
6797 IN KPROCESSOR_MODE AccessMode,
6798 IN PACCESS_STATE PassedAccessState,
6799 IN ACCESS_MASK DesiredAccess,
6800 IN OUT PVOID ParseContext OPTIONAL,
6801 OUT PHANDLE Handle);
6802
6803 NTKERNELAPI
6804 NTSTATUS
6805 NTAPI
6806 ObOpenObjectByPointer(
6807 IN PVOID Object,
6808 IN ULONG HandleAttributes,
6809 IN PACCESS_STATE PassedAccessState OPTIONAL,
6810 IN ACCESS_MASK DesiredAccess OPTIONAL,
6811 IN POBJECT_TYPE ObjectType OPTIONAL,
6812 IN KPROCESSOR_MODE AccessMode,
6813 OUT PHANDLE Handle);
6814
6815 NTKERNELAPI
6816 NTSTATUS
6817 NTAPI
6818 ObQueryObjectAuditingByHandle(
6819 IN HANDLE Handle,
6820 OUT PBOOLEAN GenerateOnClose);
6821
6822 NTKERNELAPI
6823 NTSTATUS
6824 NTAPI
6825 ObReferenceObjectByHandle(
6826 IN HANDLE Handle,
6827 IN ACCESS_MASK DesiredAccess,
6828 IN POBJECT_TYPE ObjectType OPTIONAL,
6829 IN KPROCESSOR_MODE AccessMode,
6830 OUT PVOID *Object,
6831 OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL);
6832
6833 NTKERNELAPI
6834 NTSTATUS
6835 NTAPI
6836 ObReferenceObjectByName(
6837 IN PUNICODE_STRING ObjectPath,
6838 IN ULONG Attributes,
6839 IN PACCESS_STATE PassedAccessState OPTIONAL,
6840 IN ACCESS_MASK DesiredAccess OPTIONAL,
6841 IN POBJECT_TYPE ObjectType,
6842 IN KPROCESSOR_MODE AccessMode,
6843 IN OUT PVOID ParseContext OPTIONAL,
6844 OUT PVOID *Object);
6845
6846 NTKERNELAPI
6847 NTSTATUS
6848 NTAPI
6849 ObReferenceObjectByPointer(
6850 IN PVOID Object,
6851 IN ACCESS_MASK DesiredAccess,
6852 IN POBJECT_TYPE ObjectType,
6853 IN KPROCESSOR_MODE AccessMode);
6854
6855 NTKERNELAPI
6856 VOID
6857 NTAPI
6858 ObReferenceSecurityDescriptor(
6859 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
6860 IN ULONG Count);
6861
6862 NTKERNELAPI
6863 VOID
6864 NTAPI
6865 ObReleaseObjectSecurity(
6866 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
6867 IN BOOLEAN MemoryAllocated);
6868
6869
6870
6871 /** Process manager routines **/
6872
6873 NTKERNELAPI
6874 NTSTATUS
6875 NTAPI
6876 PsCreateSystemProcess(
6877 IN PHANDLE ProcessHandle,
6878 IN ACCESS_MASK DesiredAccess,
6879 IN POBJECT_ATTRIBUTES ObjectAttributes);
6880
6881 NTKERNELAPI
6882 NTSTATUS
6883 NTAPI
6884 PsCreateSystemThread(
6885 OUT PHANDLE ThreadHandle,
6886 IN ULONG DesiredAccess,
6887 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
6888 IN HANDLE ProcessHandle OPTIONAL,
6889 OUT PCLIENT_ID ClientId OPTIONAL,
6890 IN PKSTART_ROUTINE StartRoutine,
6891 IN PVOID StartContext);
6892
6893 /*
6894 * PEPROCESS
6895 * PsGetCurrentProcess(VOID)
6896 */
6897 #define PsGetCurrentProcess IoGetCurrentProcess
6898
6899 NTKERNELAPI
6900 HANDLE
6901 NTAPI
6902 PsGetCurrentProcessId(
6903 VOID);
6904
6905 /*
6906 * PETHREAD
6907 * PsGetCurrentThread(VOID)
6908 */
6909 #define PsGetCurrentThread() \
6910 ((PETHREAD) KeGetCurrentThread())
6911
6912 NTKERNELAPI
6913 HANDLE
6914 NTAPI
6915 PsGetCurrentThreadId(
6916 VOID);
6917
6918 NTKERNELAPI
6919 HANDLE
6920 NTAPI
6921 PsGetProcessId(PEPROCESS Process);
6922
6923 NTKERNELAPI
6924 BOOLEAN
6925 NTAPI
6926 PsGetVersion(
6927 PULONG MajorVersion OPTIONAL,
6928 PULONG MinorVersion OPTIONAL,
6929 PULONG BuildNumber OPTIONAL,
6930 PUNICODE_STRING CSDVersion OPTIONAL);
6931
6932 NTKERNELAPI
6933 NTSTATUS
6934 NTAPI
6935 PsRemoveCreateThreadNotifyRoutine(
6936 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
6937
6938 NTKERNELAPI
6939 NTSTATUS
6940 NTAPI
6941 PsRemoveLoadImageNotifyRoutine(
6942 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
6943
6944 NTKERNELAPI
6945 NTSTATUS
6946 NTAPI
6947 PsSetCreateProcessNotifyRoutine(
6948 IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
6949 IN BOOLEAN Remove);
6950
6951 NTKERNELAPI
6952 NTSTATUS
6953 NTAPI
6954 PsSetCreateThreadNotifyRoutine(
6955 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
6956
6957 NTKERNELAPI
6958 NTSTATUS
6959 NTAPI
6960 PsSetLoadImageNotifyRoutine(
6961 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
6962
6963 NTKERNELAPI
6964 NTSTATUS
6965 NTAPI
6966 PsTerminateSystemThread(
6967 IN NTSTATUS ExitStatus);
6968
6969 extern NTSYSAPI PEPROCESS PsInitialSystemProcess;
6970
6971
6972 /** Security reference monitor routines **/
6973
6974 NTKERNELAPI
6975 BOOLEAN
6976 NTAPI
6977 SeAccessCheck(
6978 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
6979 IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext,
6980 IN BOOLEAN SubjectContextLocked,
6981 IN ACCESS_MASK DesiredAccess,
6982 IN ACCESS_MASK PreviouslyGrantedAccess,
6983 OUT PPRIVILEGE_SET *Privileges OPTIONAL,
6984 IN PGENERIC_MAPPING GenericMapping,
6985 IN KPROCESSOR_MODE AccessMode,
6986 OUT PACCESS_MASK GrantedAccess,
6987 OUT PNTSTATUS AccessStatus);
6988
6989 NTKERNELAPI
6990 NTSTATUS
6991 NTAPI
6992 SeAssignSecurity(
6993 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
6994 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
6995 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
6996 IN BOOLEAN IsDirectoryObject,
6997 IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
6998 IN PGENERIC_MAPPING GenericMapping,
6999 IN POOL_TYPE PoolType);
7000
7001 NTKERNELAPI
7002 NTSTATUS
7003 NTAPI
7004 SeAssignSecurityEx(
7005 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
7006 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
7007 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
7008 IN GUID *ObjectType OPTIONAL,
7009 IN BOOLEAN IsDirectoryObject,
7010 IN ULONG AutoInheritFlags,
7011 IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
7012 IN PGENERIC_MAPPING GenericMapping,
7013 IN POOL_TYPE PoolType);
7014
7015 NTKERNELAPI
7016 NTSTATUS
7017 NTAPI
7018 SeDeassignSecurity(
7019 IN OUT PSECURITY_DESCRIPTOR *SecurityDescriptor);
7020
7021 NTKERNELAPI
7022 BOOLEAN
7023 NTAPI
7024 SeSinglePrivilegeCheck(
7025 LUID PrivilegeValue,
7026 KPROCESSOR_MODE PreviousMode);
7027
7028 NTKERNELAPI
7029 BOOLEAN
7030 NTAPI
7031 SeValidSecurityDescriptor(
7032 IN ULONG Length,
7033 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
7034
7035
7036
7037 /** NtXxx routines **/
7038
7039 NTSYSCALLAPI
7040 NTSTATUS
7041 NTAPI
7042 NtOpenProcess(
7043 OUT PHANDLE ProcessHandle,
7044 IN ACCESS_MASK DesiredAccess,
7045 IN POBJECT_ATTRIBUTES ObjectAttributes,
7046 IN PCLIENT_ID ClientId OPTIONAL);
7047
7048 NTSYSCALLAPI
7049 NTSTATUS
7050 NTAPI
7051 NtQueryInformationProcess(
7052 IN HANDLE ProcessHandle,
7053 IN PROCESSINFOCLASS ProcessInformationClass,
7054 OUT PVOID ProcessInformation,
7055 IN ULONG ProcessInformationLength,
7056 OUT PULONG ReturnLength OPTIONAL);
7057
7058
7059
7060 /** NtXxx and ZwXxx routines **/
7061
7062 NTSYSAPI
7063 NTSTATUS
7064 NTAPI
7065 ZwCancelTimer(
7066 IN HANDLE TimerHandle,
7067 OUT PBOOLEAN CurrentState OPTIONAL);
7068
7069 NTSYSCALLAPI
7070 NTSTATUS
7071 NTAPI
7072 NtClose(
7073 IN HANDLE Handle);
7074
7075 NTSYSAPI
7076 NTSTATUS
7077 NTAPI
7078 ZwClose(
7079 IN HANDLE Handle);
7080
7081 NTSYSAPI
7082 NTSTATUS
7083 NTAPI
7084 ZwCreateDirectoryObject(
7085 OUT PHANDLE DirectoryHandle,
7086 IN ACCESS_MASK DesiredAccess,
7087 IN POBJECT_ATTRIBUTES ObjectAttributes);
7088
7089 NTSYSCALLAPI
7090 NTSTATUS
7091 NTAPI
7092 NtCreateEvent(
7093 OUT PHANDLE EventHandle,
7094 IN ACCESS_MASK DesiredAccess,
7095 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
7096 IN EVENT_TYPE EventType,
7097 IN BOOLEAN InitialState);
7098
7099 NTSYSAPI
7100 NTSTATUS
7101 NTAPI
7102 ZwCreateEvent(
7103 OUT PHANDLE EventHandle,
7104 IN ACCESS_MASK DesiredAccess,
7105 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
7106 IN EVENT_TYPE EventType,
7107 IN BOOLEAN InitialState);
7108
7109 NTSYSAPI
7110 NTSTATUS
7111 NTAPI
7112 ZwCreateFile(
7113 OUT PHANDLE FileHandle,
7114 IN ACCESS_MASK DesiredAccess,
7115 IN POBJECT_ATTRIBUTES ObjectAttributes,
7116 OUT PIO_STATUS_BLOCK IoStatusBlock,
7117 IN PLARGE_INTEGER AllocationSize OPTIONAL,
7118 IN ULONG FileAttributes,
7119 IN ULONG ShareAccess,
7120 IN ULONG CreateDisposition,
7121 IN ULONG CreateOptions,
7122 IN PVOID EaBuffer OPTIONAL,
7123 IN ULONG EaLength);
7124
7125 NTSYSAPI
7126 NTSTATUS
7127 NTAPI
7128 ZwCreateKey(
7129 OUT PHANDLE KeyHandle,
7130 IN ACCESS_MASK DesiredAccess,
7131 IN POBJECT_ATTRIBUTES ObjectAttributes,
7132 IN ULONG TitleIndex,
7133 IN PUNICODE_STRING Class OPTIONAL,
7134 IN ULONG CreateOptions,
7135 OUT PULONG Disposition OPTIONAL);
7136
7137 NTSYSAPI
7138 NTSTATUS
7139 NTAPI
7140 ZwCreateTimer(
7141 OUT PHANDLE TimerHandle,
7142 IN ACCESS_MASK DesiredAccess,
7143 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
7144 IN TIMER_TYPE TimerType);
7145
7146 NTSYSAPI
7147 NTSTATUS
7148 NTAPI
7149 ZwDeleteKey(
7150 IN HANDLE KeyHandle);
7151
7152 NTSYSAPI
7153 NTSTATUS
7154 NTAPI
7155 ZwDeleteValueKey(
7156 IN HANDLE KeyHandle,
7157 IN PUNICODE_STRING ValueName);
7158
7159 NTSYSCALLAPI
7160 NTSTATUS
7161 NTAPI
7162 NtDeviceIoControlFile(
7163 IN HANDLE DeviceHandle,
7164 IN HANDLE Event OPTIONAL,
7165 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
7166 IN PVOID UserApcContext OPTIONAL,
7167 OUT PIO_STATUS_BLOCK IoStatusBlock,
7168 IN ULONG IoControlCode,
7169 IN PVOID InputBuffer,
7170 IN ULONG InputBufferSize,
7171 OUT PVOID OutputBuffer,
7172 IN ULONG OutputBufferSize);
7173
7174 NTSYSAPI
7175 NTSTATUS
7176 NTAPI
7177 ZwDeviceIoControlFile(
7178 IN HANDLE DeviceHandle,
7179 IN HANDLE Event OPTIONAL,
7180 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
7181 IN PVOID UserApcContext OPTIONAL,
7182 OUT PIO_STATUS_BLOCK IoStatusBlock,
7183 IN ULONG IoControlCode,
7184 IN PVOID InputBuffer,
7185 IN ULONG InputBufferSize,
7186 OUT PVOID OutputBuffer,
7187 IN ULONG OutputBufferSize);
7188
7189 NTSYSAPI
7190 NTSTATUS
7191 NTAPI
7192 ZwEnumerateKey(
7193 IN HANDLE KeyHandle,
7194 IN ULONG Index,
7195 IN KEY_INFORMATION_CLASS KeyInformationClass,
7196 OUT PVOID KeyInformation,
7197 IN ULONG Length,
7198 OUT PULONG ResultLength);
7199
7200 NTSYSAPI
7201 NTSTATUS
7202 NTAPI
7203 ZwEnumerateValueKey(
7204 IN HANDLE KeyHandle,
7205 IN ULONG Index,
7206 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
7207 OUT PVOID KeyValueInformation,
7208 IN ULONG Length,
7209 OUT PULONG ResultLength);
7210
7211 NTSYSAPI
7212 NTSTATUS
7213 NTAPI
7214 ZwFlushKey(
7215 IN HANDLE KeyHandle);
7216
7217 NTSYSAPI
7218 NTSTATUS
7219 NTAPI
7220 ZwMakeTemporaryObject(
7221 IN HANDLE Handle);
7222
7223 NTSYSCALLAPI
7224 NTSTATUS
7225 NTAPI
7226 NtMapViewOfSection(
7227 IN HANDLE SectionHandle,
7228 IN HANDLE ProcessHandle,
7229 IN OUT PVOID *BaseAddress,
7230 IN ULONG_PTR ZeroBits,
7231 IN SIZE_T CommitSize,
7232 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
7233 IN OUT PSIZE_T ViewSize,
7234 IN SECTION_INHERIT InheritDisposition,
7235 IN ULONG AllocationType,
7236 IN ULONG Protect);
7237
7238 NTSYSAPI
7239 NTSTATUS
7240 NTAPI
7241 ZwMapViewOfSection(
7242 IN HANDLE SectionHandle,
7243 IN HANDLE ProcessHandle,
7244 IN OUT PVOID *BaseAddress,
7245 IN ULONG_PTR ZeroBits,
7246 IN SIZE_T CommitSize,
7247 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
7248 IN OUT PSIZE_T ViewSize,
7249 IN SECTION_INHERIT InheritDisposition,
7250 IN ULONG AllocationType,
7251 IN ULONG Protect);
7252
7253 NTSYSCALLAPI
7254 NTSTATUS
7255 NTAPI
7256 NtOpenFile(
7257 OUT PHANDLE FileHandle,
7258 IN ACCESS_MASK DesiredAccess,
7259 IN POBJECT_ATTRIBUTES ObjectAttributes,
7260 OUT PIO_STATUS_BLOCK IoStatusBlock,
7261 IN ULONG ShareAccess,
7262 IN ULONG OpenOptions);
7263
7264 NTSYSAPI
7265 NTSTATUS
7266 NTAPI
7267 ZwOpenFile(
7268 OUT PHANDLE FileHandle,
7269 IN ACCESS_MASK DesiredAccess,
7270 IN POBJECT_ATTRIBUTES ObjectAttributes,
7271 OUT PIO_STATUS_BLOCK IoStatusBlock,
7272 IN ULONG ShareAccess,
7273 IN ULONG OpenOptions);
7274
7275 NTSYSAPI
7276 NTSTATUS
7277 NTAPI
7278 ZwOpenKey(
7279 OUT PHANDLE KeyHandle,
7280 IN ACCESS_MASK DesiredAccess,
7281 IN POBJECT_ATTRIBUTES ObjectAttributes);
7282
7283 NTSYSAPI
7284 NTSTATUS
7285 NTAPI
7286 ZwOpenSection(
7287 OUT PHANDLE SectionHandle,
7288 IN ACCESS_MASK DesiredAccess,
7289 IN POBJECT_ATTRIBUTES ObjectAttributes);
7290
7291 NTSYSAPI
7292 NTSTATUS
7293 NTAPI
7294 ZwOpenSymbolicLinkObject(
7295 OUT PHANDLE LinkHandle,
7296 IN ACCESS_MASK DesiredAccess,
7297 IN POBJECT_ATTRIBUTES ObjectAttributes);
7298
7299 NTSYSAPI
7300 NTSTATUS
7301 NTAPI
7302 ZwOpenTimer(
7303 OUT PHANDLE TimerHandle,
7304 IN ACCESS_MASK DesiredAccess,
7305 IN POBJECT_ATTRIBUTES ObjectAttributes);
7306
7307 NTSYSAPI
7308 NTSTATUS
7309 NTAPI
7310 ZwQueryInformationFile(
7311 IN HANDLE FileHandle,
7312 OUT PIO_STATUS_BLOCK IoStatusBlock,
7313 OUT PVOID FileInformation,
7314 IN ULONG Length,
7315 IN FILE_INFORMATION_CLASS FileInformationClass);
7316
7317 NTSYSAPI
7318 NTSTATUS
7319 NTAPI
7320 ZwQueryKey(
7321 IN HANDLE KeyHandle,
7322 IN KEY_INFORMATION_CLASS KeyInformationClass,
7323 OUT PVOID KeyInformation,
7324 IN ULONG Length,
7325 OUT PULONG ResultLength);
7326
7327 NTSYSAPI
7328 NTSTATUS
7329 NTAPI
7330 ZwQuerySymbolicLinkObject(
7331 IN HANDLE LinkHandle,
7332 IN OUT PUNICODE_STRING LinkTarget,
7333 OUT PULONG ReturnedLength OPTIONAL);
7334
7335 NTSYSAPI
7336 NTSTATUS
7337 NTAPI
7338 ZwQueryValueKey(
7339 IN HANDLE KeyHandle,
7340 IN PUNICODE_STRING ValueName,
7341 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
7342 OUT PVOID KeyValueInformation,
7343 IN ULONG Length,
7344 OUT PULONG ResultLength);
7345
7346 NTSYSCALLAPI
7347 NTSTATUS
7348 NTAPI
7349 NtReadFile(
7350 IN HANDLE FileHandle,
7351 IN HANDLE Event OPTIONAL,
7352 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
7353 IN PVOID ApcContext OPTIONAL,
7354 OUT PIO_STATUS_BLOCK IoStatusBlock,
7355 OUT PVOID Buffer,
7356 IN ULONG Length,
7357 IN PLARGE_INTEGER ByteOffset OPTIONAL,
7358 IN PULONG Key OPTIONAL);
7359
7360 NTSYSAPI
7361 NTSTATUS
7362 NTAPI
7363 ZwReadFile(
7364 IN HANDLE FileHandle,
7365 IN HANDLE Event OPTIONAL,
7366 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
7367 IN PVOID ApcContext OPTIONAL,
7368 OUT PIO_STATUS_BLOCK IoStatusBlock,
7369 OUT PVOID Buffer,
7370 IN ULONG Length,
7371 IN PLARGE_INTEGER ByteOffset OPTIONAL,
7372 IN PULONG Key OPTIONAL);
7373
7374 NTSYSCALLAPI
7375 NTSTATUS
7376 NTAPI
7377 NtSetEvent(
7378 IN HANDLE EventHandle,
7379 OUT PLONG PreviousState OPTIONAL);
7380
7381 NTSYSAPI
7382 NTSTATUS
7383 NTAPI
7384 ZwSetEvent(
7385 IN HANDLE EventHandle,
7386 OUT PLONG PreviousState OPTIONAL);
7387
7388 NTSYSAPI
7389 NTSTATUS
7390 NTAPI
7391 ZwSetInformationFile(
7392 IN HANDLE FileHandle,
7393 OUT PIO_STATUS_BLOCK IoStatusBlock,
7394 IN PVOID FileInformation,
7395 IN ULONG Length,
7396 IN FILE_INFORMATION_CLASS FileInformationClass);
7397
7398 NTSYSAPI
7399 NTSTATUS
7400 NTAPI
7401 ZwSetInformationThread(
7402 IN HANDLE ThreadHandle,
7403 IN THREADINFOCLASS ThreadInformationClass,
7404 IN PVOID ThreadInformation,
7405 IN ULONG ThreadInformationLength);
7406
7407 NTSYSAPI
7408 NTSTATUS
7409 NTAPI
7410 ZwSetTimer(
7411 IN HANDLE TimerHandle,
7412 IN PLARGE_INTEGER DueTime,
7413 IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL,
7414 IN PVOID TimerContext OPTIONAL,
7415 IN BOOLEAN WakeTimer,
7416 IN LONG Period OPTIONAL,
7417 OUT PBOOLEAN PreviousState OPTIONAL);
7418
7419 NTSYSAPI
7420 NTSTATUS
7421 NTAPI
7422 ZwSetValueKey(
7423 IN HANDLE KeyHandle,
7424 IN PUNICODE_STRING ValueName,
7425 IN ULONG TitleIndex OPTIONAL,
7426 IN ULONG Type,
7427 IN PVOID Data,
7428 IN ULONG DataSize);
7429
7430 /* [Nt|Zw]MapViewOfSection.InheritDisposition constants */
7431 #define AT_EXTENDABLE_FILE 0x00002000
7432 #define AT_RESERVED 0x20000000
7433 #define AT_ROUND_TO_PAGE 0x40000000
7434
7435 NTSYSCALLAPI
7436 NTSTATUS
7437 NTAPI
7438 NtUnmapViewOfSection(
7439 IN HANDLE ProcessHandle,
7440 IN PVOID BaseAddress);
7441
7442 NTSYSAPI
7443 NTSTATUS
7444 NTAPI
7445 ZwUnmapViewOfSection(
7446 IN HANDLE ProcessHandle,
7447 IN PVOID BaseAddress);
7448
7449 NTSYSCALLAPI
7450 NTSTATUS
7451 NTAPI
7452 NtWaitForSingleObject(
7453 IN HANDLE ObjectHandle,
7454 IN BOOLEAN Alertable,
7455 IN PLARGE_INTEGER TimeOut OPTIONAL);
7456
7457 NTSYSAPI
7458 NTSTATUS
7459 NTAPI
7460 ZwWaitForSingleObject(
7461 IN HANDLE ObjectHandle,
7462 IN BOOLEAN Alertable,
7463 IN PLARGE_INTEGER TimeOut OPTIONAL);
7464
7465 NTSYSCALLAPI
7466 NTSTATUS
7467 NTAPI
7468 NtWriteFile(
7469 IN HANDLE FileHandle,
7470 IN HANDLE Event OPTIONAL,
7471 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
7472 IN PVOID ApcContext OPTIONAL,
7473 OUT PIO_STATUS_BLOCK IoStatusBlock,
7474 IN PVOID Buffer,
7475 IN ULONG Length,
7476 IN PLARGE_INTEGER ByteOffset OPTIONAL,
7477 IN PULONG Key OPTIONAL);
7478
7479 NTSYSAPI
7480 NTSTATUS
7481 NTAPI
7482 ZwWriteFile(
7483 IN HANDLE FileHandle,
7484 IN HANDLE Event OPTIONAL,
7485 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
7486 IN PVOID ApcContext OPTIONAL,
7487 OUT PIO_STATUS_BLOCK IoStatusBlock,
7488 IN PVOID Buffer,
7489 IN ULONG Length,
7490 IN PLARGE_INTEGER ByteOffset OPTIONAL,
7491 IN PULONG Key OPTIONAL);
7492
7493
7494
7495 /** Power management support routines **/
7496
7497 NTKERNELAPI
7498 NTSTATUS
7499 NTAPI
7500 PoCallDriver(
7501 IN PDEVICE_OBJECT DeviceObject,
7502 IN OUT PIRP Irp);
7503
7504 NTKERNELAPI
7505 PULONG
7506 NTAPI
7507 PoRegisterDeviceForIdleDetection(
7508 IN PDEVICE_OBJECT DeviceObject,
7509 IN ULONG ConservationIdleTime,
7510 IN ULONG PerformanceIdleTime,
7511 IN DEVICE_POWER_STATE State);
7512
7513 NTKERNELAPI
7514 PVOID
7515 NTAPI
7516 PoRegisterSystemState(
7517 IN PVOID StateHandle,
7518 IN EXECUTION_STATE Flags);
7519
7520 NTKERNELAPI
7521 NTSTATUS
7522 NTAPI
7523 PoRequestPowerIrp(
7524 IN PDEVICE_OBJECT DeviceObject,
7525 IN UCHAR MinorFunction,
7526 IN POWER_STATE PowerState,
7527 IN PREQUEST_POWER_COMPLETE CompletionFunction,
7528 IN PVOID Context,
7529 OUT PIRP *Irp OPTIONAL);
7530
7531 NTKERNELAPI
7532 NTSTATUS
7533 NTAPI
7534 PoRequestShutdownEvent(
7535 OUT PVOID *Event);
7536
7537 NTKERNELAPI
7538 VOID
7539 NTAPI
7540 PoSetDeviceBusy(
7541 PULONG IdlePointer);
7542
7543 #define PoSetDeviceBusy(IdlePointer) \
7544 ((void)(*(IdlePointer) = 0))
7545
7546 NTKERNELAPI
7547 POWER_STATE
7548 NTAPI
7549 PoSetPowerState(
7550 IN PDEVICE_OBJECT DeviceObject,
7551 IN POWER_STATE_TYPE Type,
7552 IN POWER_STATE State);
7553
7554 NTKERNELAPI
7555 VOID
7556 NTAPI
7557 PoSetSystemState(
7558 IN EXECUTION_STATE Flags);
7559
7560 NTKERNELAPI
7561 VOID
7562 NTAPI
7563 PoStartNextPowerIrp(
7564 IN PIRP Irp);
7565
7566 NTKERNELAPI
7567 VOID
7568 NTAPI
7569 PoUnregisterSystemState(
7570 IN PVOID StateHandle);
7571
7572
7573
7574 /** WMI library support routines **/
7575
7576 NTSTATUS
7577 NTAPI
7578 WmiCompleteRequest(
7579 IN PDEVICE_OBJECT DeviceObject,
7580 IN PIRP Irp,
7581 IN NTSTATUS Status,
7582 IN ULONG BufferUsed,
7583 IN CCHAR PriorityBoost);
7584
7585 NTSTATUS
7586 NTAPI
7587 WmiFireEvent(
7588 IN PDEVICE_OBJECT DeviceObject,
7589 IN LPGUID Guid,
7590 IN ULONG InstanceIndex,
7591 IN ULONG EventDataSize,
7592 IN PVOID EventData);
7593
7594 NTKERNELAPI
7595 NTSTATUS
7596 NTAPI
7597 WmiQueryTraceInformation(
7598 IN TRACE_INFORMATION_CLASS TraceInformationClass,
7599 OUT PVOID TraceInformation,
7600 IN ULONG TraceInformationLength,
7601 OUT PULONG RequiredLength OPTIONAL,
7602 IN PVOID Buffer OPTIONAL);
7603
7604 NTSTATUS
7605 NTAPI
7606 WmiSystemControl(
7607 IN PWMILIB_CONTEXT WmiLibInfo,
7608 IN PDEVICE_OBJECT DeviceObject,
7609 IN PIRP Irp,
7610 OUT PSYSCTL_IRP_DISPOSITION IrpDisposition);
7611
7612 NTKERNELAPI
7613 NTSTATUS
7614 DDKCDECLAPI
7615 WmiTraceMessage(
7616 IN TRACEHANDLE LoggerHandle,
7617 IN ULONG MessageFlags,
7618 IN LPGUID MessageGuid,
7619 IN USHORT MessageNumber,
7620 IN ...);
7621
7622 #if 0
7623 /* FIXME: Get va_list from where? */
7624 NTKERNELAPI
7625 NTSTATUS
7626 DDKCDECLAPI
7627 WmiTraceMessageVa(
7628 IN TRACEHANDLE LoggerHandle,
7629 IN ULONG MessageFlags,
7630 IN LPGUID MessageGuid,
7631 IN USHORT MessageNumber,
7632 IN va_list MessageArgList);
7633 #endif
7634
7635
7636 /** Kernel debugger routines **/
7637
7638 NTKERNELAPI
7639 NTSTATUS
7640 NTAPI
7641 KdDisableDebugger(
7642 VOID);
7643
7644 NTKERNELAPI
7645 NTSTATUS
7646 NTAPI
7647 KdEnableDebugger(
7648 VOID);
7649
7650 NTKERNELAPI
7651 BOOLEAN
7652 NTAPI
7653 KdRefreshDebuggerNotPresent(
7654 VOID
7655 );
7656
7657 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
7658 NTKERNELAPI
7659 NTSTATUS
7660 NTAPI
7661 KdChangeOption(
7662 IN KD_OPTION Option,
7663 IN ULONG InBufferBytes OPTIONAL,
7664 IN PVOID InBuffer,
7665 IN ULONG OutBufferBytes OPTIONAL,
7666 OUT PVOID OutBuffer,
7667 OUT PULONG OutBufferNeeded OPTIONAL);
7668 #endif
7669
7670 VOID
7671 NTAPI
7672 DbgBreakPoint(
7673 VOID);
7674
7675 NTSYSAPI
7676 VOID
7677 NTAPI
7678 DbgBreakPointWithStatus(
7679 IN ULONG Status);
7680
7681 ULONG
7682 DDKCDECLAPI
7683 DbgPrint(
7684 IN PCCH Format,
7685 IN ...);
7686
7687 NTSYSAPI
7688 ULONG
7689 DDKCDECLAPI
7690 DbgPrintEx(
7691 IN ULONG ComponentId,
7692 IN ULONG Level,
7693 IN PCCH Format,
7694 IN ...);
7695
7696 ULONG
7697 NTAPI
7698 vDbgPrintEx(
7699 IN ULONG ComponentId,
7700 IN ULONG Level,
7701 IN PCCH Format,
7702 IN va_list ap);
7703
7704 ULONG
7705 NTAPI
7706 vDbgPrintExWithPrefix(
7707 IN PCCH Prefix,
7708 IN ULONG ComponentId,
7709 IN ULONG Level,
7710 IN PCCH Format,
7711 IN va_list ap);
7712
7713 NTKERNELAPI
7714 ULONG
7715 DDKCDECLAPI
7716 DbgPrintReturnControlC(
7717 IN PCCH Format,
7718 IN ...);
7719
7720 ULONG
7721 NTAPI
7722 DbgPrompt(
7723 IN PCCH Prompt,
7724 OUT PCH Response,
7725 IN ULONG MaximumResponseLength
7726 );
7727
7728 NTKERNELAPI
7729 NTSTATUS
7730 NTAPI
7731 DbgQueryDebugFilterState(
7732 IN ULONG ComponentId,
7733 IN ULONG Level);
7734
7735 NTKERNELAPI
7736 NTSTATUS
7737 NTAPI
7738 DbgSetDebugFilterState(
7739 IN ULONG ComponentId,
7740 IN ULONG Level,
7741 IN BOOLEAN State);
7742
7743 #if DBG
7744
7745 #define KdPrint(_x_) DbgPrint _x_
7746 #define KdPrintEx(_x_) DbgPrintEx _x_
7747 #define KdBreakPoint() DbgBreakPoint()
7748 #define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
7749
7750 #else /* !DBG */
7751
7752 #define KdPrint(_x_)
7753 #define KdPrintEx(_x_)
7754 #define KdBreakPoint()
7755 #define KdBreakPointWithStatus(s)
7756
7757 #endif /* !DBG */
7758
7759 #if defined(__GNUC__)
7760
7761 extern NTKERNELAPI BOOLEAN KdDebuggerNotPresent;
7762 extern NTKERNELAPI BOOLEAN KdDebuggerEnabled;
7763 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
7764 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
7765
7766 #elif defined(_NTDDK_) || defined(_NTHAL_) || defined(_WDMDDK_) || defined(_NTOSP_)
7767
7768 extern NTKERNELAPI PBOOLEAN KdDebuggerNotPresent;
7769 extern NTKERNELAPI PBOOLEAN KdDebuggerEnabled;
7770 #define KD_DEBUGGER_ENABLED *KdDebuggerEnabled
7771 #define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
7772
7773 #else
7774
7775 extern BOOLEAN KdDebuggerNotPresent;
7776 extern BOOLEAN KdDebuggerEnabled;
7777 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
7778 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
7779
7780 #endif
7781
7782 /** Stuff from winnt4.h */
7783
7784 #ifndef DMA_MACROS_DEFINED
7785
7786 #if (NTDDI_VERSION >= NTDDI_WIN2K)
7787
7788 //DECLSPEC_DEPRECATED_DDK
7789 NTHALAPI
7790 BOOLEAN
7791 NTAPI
7792 IoFlushAdapterBuffers(
7793 IN PADAPTER_OBJECT AdapterObject,
7794 IN PMDL Mdl,
7795 IN PVOID MapRegisterBase,
7796 IN PVOID CurrentVa,
7797 IN ULONG Length,
7798 IN BOOLEAN WriteToDevice);
7799
7800 //DECLSPEC_DEPRECATED_DDK
7801 NTHALAPI
7802 VOID
7803 NTAPI
7804 IoFreeAdapterChannel(
7805 IN PADAPTER_OBJECT AdapterObject);
7806
7807 //DECLSPEC_DEPRECATED_DDK
7808 NTHALAPI
7809 VOID
7810 NTAPI
7811 IoFreeMapRegisters(
7812 IN PADAPTER_OBJECT AdapterObject,
7813 IN PVOID MapRegisterBase,
7814 IN ULONG NumberOfMapRegisters);
7815
7816 //DECLSPEC_DEPRECATED_DDK
7817 NTHALAPI
7818 PHYSICAL_ADDRESS
7819 NTAPI
7820 IoMapTransfer(
7821 IN PADAPTER_OBJECT AdapterObject,
7822 IN PMDL Mdl,
7823 IN PVOID MapRegisterBase,
7824 IN PVOID CurrentVa,
7825 IN OUT PULONG Length,
7826 IN BOOLEAN WriteToDevice);
7827
7828
7829 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
7830 #endif // !defined(DMA_MACROS_DEFINED)
7831
7832 NTKERNELAPI
7833 NTSTATUS
7834 NTAPI
7835 IoAssignResources(
7836 IN PUNICODE_STRING RegistryPath,
7837 IN PUNICODE_STRING DriverClassName OPTIONAL,
7838 IN PDRIVER_OBJECT DriverObject,
7839 IN PDEVICE_OBJECT DeviceObject OPTIONAL,
7840 IN PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources,
7841 IN OUT PCM_RESOURCE_LIST *AllocatedResources);
7842
7843 NTKERNELAPI
7844 NTSTATUS
7845 NTAPI
7846 IoAttachDeviceByPointer(
7847 IN PDEVICE_OBJECT SourceDevice,
7848 IN PDEVICE_OBJECT TargetDevice);
7849
7850 NTKERNELAPI
7851 BOOLEAN
7852 NTAPI
7853 MmIsNonPagedSystemAddressValid(
7854 IN PVOID VirtualAddress);
7855
7856 #if defined(_AMD64_) || defined(_IA64_)
7857 //DECLSPEC_DEPRECATED_DDK_WINXP
7858 static __inline
7859 LARGE_INTEGER
7860 NTAPI_INLINE
7861 RtlLargeIntegerDivide(
7862 IN LARGE_INTEGER Dividend,
7863 IN LARGE_INTEGER Divisor,
7864 IN OUT PLARGE_INTEGER Remainder)
7865 {
7866 LARGE_INTEGER ret;
7867 ret.QuadPart = Dividend.QuadPart / Divisor.QuadPart;
7868 if (Remainder)
7869 Remainder->QuadPart = Dividend.QuadPart % Divisor.QuadPart;
7870 return ret;
7871 }
7872 #else
7873 NTSYSAPI
7874 LARGE_INTEGER
7875 NTAPI
7876 RtlLargeIntegerDivide(
7877 IN LARGE_INTEGER Dividend,
7878 IN LARGE_INTEGER Divisor,
7879 IN OUT PLARGE_INTEGER Remainder);
7880 #endif
7881
7882 NTKERNELAPI
7883 INTERLOCKED_RESULT
7884 NTAPI
7885 ExInterlockedDecrementLong(
7886 IN PLONG Addend,
7887 IN PKSPIN_LOCK Lock);
7888
7889 NTKERNELAPI
7890 ULONG
7891 NTAPI
7892 ExInterlockedExchangeUlong(
7893 IN PULONG Target,
7894 IN ULONG Value,
7895 IN PKSPIN_LOCK Lock);
7896
7897 NTKERNELAPI
7898 INTERLOCKED_RESULT
7899 NTAPI
7900 ExInterlockedIncrementLong(
7901 IN PLONG Addend,
7902 IN PKSPIN_LOCK Lock);
7903
7904 NTHALAPI
7905 VOID
7906 NTAPI
7907 HalAcquireDisplayOwnership(
7908 IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters);
7909
7910 NTHALAPI
7911 NTSTATUS
7912 NTAPI
7913 HalAllocateAdapterChannel(
7914 IN PADAPTER_OBJECT AdapterObject,
7915 IN PWAIT_CONTEXT_BLOCK Wcb,
7916 IN ULONG NumberOfMapRegisters,
7917 IN PDRIVER_CONTROL ExecutionRoutine);
7918
7919 NTHALAPI
7920 PVOID
7921 NTAPI
7922 HalAllocateCommonBuffer(
7923 IN PADAPTER_OBJECT AdapterObject,
7924 IN ULONG Length,
7925 OUT PPHYSICAL_ADDRESS LogicalAddress,
7926 IN BOOLEAN CacheEnabled);
7927
7928 NTHALAPI
7929 NTSTATUS
7930 NTAPI
7931 HalAssignSlotResources(
7932 IN PUNICODE_STRING RegistryPath,
7933 IN PUNICODE_STRING DriverClassName,
7934 IN PDRIVER_OBJECT DriverObject,
7935 IN PDEVICE_OBJECT DeviceObject,
7936 IN INTERFACE_TYPE BusType,
7937 IN ULONG BusNumber,
7938 IN ULONG SlotNumber,
7939 IN OUT PCM_RESOURCE_LIST *AllocatedResources);
7940
7941 NTHALAPI
7942 VOID
7943 NTAPI
7944 HalFreeCommonBuffer(
7945 IN PADAPTER_OBJECT AdapterObject,
7946 IN ULONG Length,
7947 IN PHYSICAL_ADDRESS LogicalAddress,
7948 IN PVOID VirtualAddress,
7949 IN BOOLEAN CacheEnabled);
7950
7951 NTHALAPI
7952 PADAPTER_OBJECT
7953 NTAPI
7954 HalGetAdapter(
7955 IN PDEVICE_DESCRIPTION DeviceDescription,
7956 IN OUT PULONG NumberOfMapRegisters);
7957
7958 NTHALAPI
7959 ULONG
7960 NTAPI
7961 HalGetBusData(
7962 IN BUS_DATA_TYPE BusDataType,
7963 IN ULONG BusNumber,
7964 IN ULONG SlotNumber,
7965 IN PVOID Buffer,
7966 IN ULONG Length);
7967
7968 NTHALAPI
7969 ULONG
7970 NTAPI
7971 HalGetBusDataByOffset(
7972 IN BUS_DATA_TYPE BusDataType,
7973 IN ULONG BusNumber,
7974 IN ULONG SlotNumber,
7975 IN PVOID Buffer,
7976 IN ULONG Offset,
7977 IN ULONG Length);
7978
7979 NTHALAPI
7980 ULONG
7981 NTAPI
7982 HalGetDmaAlignmentRequirement(
7983 VOID);
7984
7985 NTHALAPI
7986 ULONG
7987 NTAPI
7988 HalGetInterruptVector(
7989 IN INTERFACE_TYPE InterfaceType,
7990 IN ULONG BusNumber,
7991 IN ULONG BusInterruptLevel,
7992 IN ULONG BusInterruptVector,
7993 OUT PKIRQL Irql,
7994 OUT PKAFFINITY Affinity);
7995
7996 NTHALAPI
7997 ULONG
7998 NTAPI
7999 HalReadDmaCounter(
8000 IN PADAPTER_OBJECT AdapterObject);
8001
8002 NTHALAPI
8003 ULONG
8004 NTAPI
8005 HalSetBusData(
8006 IN BUS_DATA_TYPE BusDataType,
8007 IN ULONG BusNumber,
8008 IN ULONG SlotNumber,
8009 IN PVOID Buffer,
8010 IN ULONG Length);
8011
8012 NTHALAPI
8013 ULONG
8014 NTAPI
8015 HalSetBusDataByOffset(
8016 IN BUS_DATA_TYPE BusDataType,
8017 IN ULONG BusNumber,
8018 IN ULONG SlotNumber,
8019 IN PVOID Buffer,
8020 IN ULONG Offset,
8021 IN ULONG Length);
8022
8023 NTHALAPI
8024 BOOLEAN
8025 NTAPI
8026 HalTranslateBusAddress(
8027 IN INTERFACE_TYPE InterfaceType,
8028 IN ULONG BusNumber,
8029 IN PHYSICAL_ADDRESS BusAddress,
8030 IN OUT PULONG AddressSpace,
8031 OUT PPHYSICAL_ADDRESS TranslatedAddress);
8032
8033 NTSYSAPI
8034 BOOLEAN
8035 NTAPI
8036 RtlLargeIntegerEqualToZero(
8037 IN LARGE_INTEGER Operand);
8038
8039 NTSYSAPI
8040 BOOLEAN
8041 NTAPI
8042 RtlLargeIntegerGreaterOrEqualToZero(
8043 IN LARGE_INTEGER Operand);
8044
8045 NTSYSAPI
8046 BOOLEAN
8047 NTAPI
8048 RtlLargeIntegerGreaterThan(
8049 IN LARGE_INTEGER Operand1,
8050 IN LARGE_INTEGER Operand2);
8051
8052 NTSYSAPI
8053 BOOLEAN
8054 NTAPI
8055 RtlLargeIntegerGreaterThanOrEqualTo(
8056 IN LARGE_INTEGER Operand1,
8057 IN LARGE_INTEGER Operand2);
8058
8059 NTSYSAPI
8060 BOOLEAN
8061 NTAPI
8062 RtlLargeIntegerGreaterThanZero(
8063 IN LARGE_INTEGER Operand);
8064
8065 NTSYSAPI
8066 BOOLEAN
8067 NTAPI
8068 RtlLargeIntegerLessOrEqualToZero(
8069 IN LARGE_INTEGER Operand);
8070
8071 NTSYSAPI
8072 BOOLEAN
8073 NTAPI
8074 RtlLargeIntegerLessThan(
8075 IN LARGE_INTEGER Operand1,
8076 IN LARGE_INTEGER Operand2);
8077
8078 NTSYSAPI
8079 BOOLEAN
8080 NTAPI
8081 RtlLargeIntegerLessThanOrEqualTo(
8082 IN LARGE_INTEGER Operand1,
8083 IN LARGE_INTEGER Operand2);
8084
8085 NTSYSAPI
8086 BOOLEAN
8087 NTAPI
8088 RtlLargeIntegerLessThanZero(
8089 IN LARGE_INTEGER Operand);
8090
8091 NTSYSAPI
8092 LARGE_INTEGER
8093 NTAPI
8094 RtlLargeIntegerNegate(
8095 IN LARGE_INTEGER Subtrahend);
8096
8097 NTSYSAPI
8098 BOOLEAN
8099 NTAPI
8100 RtlLargeIntegerNotEqualTo(
8101 IN LARGE_INTEGER Operand1,
8102 IN LARGE_INTEGER Operand2);
8103
8104 NTSYSAPI
8105 BOOLEAN
8106 NTAPI
8107 RtlLargeIntegerNotEqualToZero(
8108 IN LARGE_INTEGER Operand);
8109
8110 NTSYSAPI
8111 LARGE_INTEGER
8112 NTAPI
8113 RtlLargeIntegerShiftLeft(
8114 IN LARGE_INTEGER LargeInteger,
8115 IN CCHAR ShiftCount);
8116
8117 NTSYSAPI
8118 LARGE_INTEGER
8119 NTAPI
8120 RtlLargeIntegerShiftRight(
8121 IN LARGE_INTEGER LargeInteger,
8122 IN CCHAR ShiftCount);
8123
8124 NTSYSAPI
8125 LARGE_INTEGER
8126 NTAPI
8127 RtlLargeIntegerSubtract(
8128 IN LARGE_INTEGER Minuend,
8129 IN LARGE_INTEGER Subtrahend);
8130
8131
8132 /*
8133 * ULONG
8134 * COMPUTE_PAGES_SPANNED(
8135 * IN PVOID Va,
8136 * IN ULONG Size)
8137 */
8138 #define COMPUTE_PAGES_SPANNED(Va, \
8139 Size) \
8140 (ADDRESS_AND_SIZE_TO_SPAN_PAGES(Va, Size))
8141
8142
8143 /*
8144 ** Architecture specific structures
8145 */
8146
8147 #ifdef _X86_
8148
8149 NTKERNELAPI
8150 INTERLOCKED_RESULT
8151 FASTCALL
8152 Exfi386InterlockedIncrementLong(
8153 IN PLONG Addend);
8154
8155 NTKERNELAPI
8156 INTERLOCKED_RESULT
8157 FASTCALL
8158 Exfi386InterlockedDecrementLong(
8159 IN PLONG Addend);
8160
8161 NTKERNELAPI
8162 ULONG
8163 FASTCALL
8164 Exfi386InterlockedExchangeUlong(
8165 IN PULONG Target,
8166 IN ULONG Value);
8167
8168 #define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend)
8169 #define ExInterlockedDecrementLong(Addend,Lock) Exfi386InterlockedDecrementLong(Addend)
8170 #define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value)
8171
8172 #endif /* _X86_ */
8173
8174 #ifdef _M_ARM
8175 //
8176 // NT-ARM is not documented
8177 //
8178 #include <armddk.h>
8179 #endif
8180
8181 #ifdef __cplusplus
8182 }
8183 #endif
8184
8185 #endif /* __WINDDK_H */