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