- sort wdm.h a bit more
[reactos.git] / include / ddk / winddk.h
1 /*
2 * winddk.h
3 *
4 * Windows Device Driver Kit
5 *
6 * This file is part of the w32api package.
7 *
8 * Contributors:
9 * Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
10 *
11 * THIS SOFTWARE IS NOT COPYRIGHTED
12 *
13 * This source code is offered for use in the public domain. You may
14 * use, modify or distribute it freely.
15 *
16 * This code is distributed in the hope that it will be useful but
17 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
18 * DISCLAIMED. This includes but is not limited to warranties of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
20 *
21 */
22
23 #ifndef __WINDDK_H
24 #define __WINDDK_H
25
26 /* Helper macro to enable gcc's extension. */
27 #ifndef __GNU_EXTENSION
28 #ifdef __GNUC__
29 #define __GNU_EXTENSION __extension__
30 #else
31 #define __GNU_EXTENSION
32 #endif
33 #endif
34
35 #ifdef __cplusplus
36 extern "C" {
37 #endif
38
39 #include <excpt.h>
40 #include <ntdef.h>
41 #include <ntstatus.h>
42
43 #include "intrin.h"
44
45 /* Pseudo modifiers for parameters */
46 #ifndef IN
47 #define IN
48 #endif
49 #ifndef OUT
50 #define OUT
51 #endif
52 #ifndef OPTIONAL
53 #define OPTIONAL
54 #endif
55 #ifndef UNALLIGNED
56 #define UNALLIGNED
57 #endif
58
59 #define CONST const
60
61 #define RESTRICTED_POINTER
62
63 #define DECLSPEC_ADDRSAFE
64
65 #ifdef NONAMELESSUNION
66 # define _DDK_DUMMYUNION_MEMBER(name) DUMMYUNIONNAME.name
67 # define _DDK_DUMMYUNION_N_MEMBER(n, name) DUMMYUNIONNAME##n.name
68 #else
69 # define _DDK_DUMMYUNION_MEMBER(name) name
70 # define _DDK_DUMMYUNION_N_MEMBER(n, name) name
71 #endif
72
73 /*
74 ** Forward declarations
75 */
76
77 struct _KPCR;
78 struct _KPRCB;
79 struct _KTSS;
80 struct _DRIVE_LAYOUT_INFORMATION_EX;
81 struct _LOADER_PARAMETER_BLOCK;
82
83
84 #if 1
85 /* FIXME: Unknown definitions */
86 struct _SET_PARTITION_INFORMATION_EX;
87 typedef ULONG WAIT_TYPE;
88 #define WaitAll 0
89 #define WaitAny 1
90 typedef HANDLE TRACEHANDLE;
91 typedef PVOID PWMILIB_CONTEXT;
92 typedef ULONG LOGICAL;
93 #endif
94
95 /*
96 ** WmiLib specific structure
97 */
98 typedef enum
99 {
100 IrpProcessed, // Irp was processed and possibly completed
101 IrpNotCompleted, // Irp was process and NOT completed
102 IrpNotWmi, // Irp is not a WMI irp
103 IrpForward // Irp is wmi irp, but targeted at another device object
104 } SYSCTL_IRP_DISPOSITION, *PSYSCTL_IRP_DISPOSITION;
105
106 //
107 // Forwarder
108 //
109 struct _COMPRESSED_DATA_INFO;
110
111 #define KERNEL_STACK_SIZE 12288
112 #define KERNEL_LARGE_STACK_SIZE 61440
113 #define KERNEL_LARGE_STACK_COMMIT 12288
114
115 #define EXCEPTION_READ_FAULT 0
116 #define EXCEPTION_WRITE_FAULT 1
117 #define EXCEPTION_EXECUTE_FAULT 8
118
119 #define DPFLTR_ERROR_LEVEL 0
120 #define DPFLTR_WARNING_LEVEL 1
121 #define DPFLTR_TRACE_LEVEL 2
122 #define DPFLTR_INFO_LEVEL 3
123 #define DPFLTR_MASK 0x80000000
124
125 typedef enum _DPFLTR_TYPE
126 {
127 DPFLTR_SYSTEM_ID = 0,
128 DPFLTR_SMSS_ID = 1,
129 DPFLTR_SETUP_ID = 2,
130 DPFLTR_NTFS_ID = 3,
131 DPFLTR_FSTUB_ID = 4,
132 DPFLTR_CRASHDUMP_ID = 5,
133 DPFLTR_CDAUDIO_ID = 6,
134 DPFLTR_CDROM_ID = 7,
135 DPFLTR_CLASSPNP_ID = 8,
136 DPFLTR_DISK_ID = 9,
137 DPFLTR_REDBOOK_ID = 10,
138 DPFLTR_STORPROP_ID = 11,
139 DPFLTR_SCSIPORT_ID = 12,
140 DPFLTR_SCSIMINIPORT_ID = 13,
141 DPFLTR_CONFIG_ID = 14,
142 DPFLTR_I8042PRT_ID = 15,
143 DPFLTR_SERMOUSE_ID = 16,
144 DPFLTR_LSERMOUS_ID = 17,
145 DPFLTR_KBDHID_ID = 18,
146 DPFLTR_MOUHID_ID = 19,
147 DPFLTR_KBDCLASS_ID = 20,
148 DPFLTR_MOUCLASS_ID = 21,
149 DPFLTR_TWOTRACK_ID = 22,
150 DPFLTR_WMILIB_ID = 23,
151 DPFLTR_ACPI_ID = 24,
152 DPFLTR_AMLI_ID = 25,
153 DPFLTR_HALIA64_ID = 26,
154 DPFLTR_VIDEO_ID = 27,
155 DPFLTR_SVCHOST_ID = 28,
156 DPFLTR_VIDEOPRT_ID = 29,
157 DPFLTR_TCPIP_ID = 30,
158 DPFLTR_DMSYNTH_ID = 31,
159 DPFLTR_NTOSPNP_ID = 32,
160 DPFLTR_FASTFAT_ID = 33,
161 DPFLTR_SAMSS_ID = 34,
162 DPFLTR_PNPMGR_ID = 35,
163 DPFLTR_NETAPI_ID = 36,
164 DPFLTR_SCSERVER_ID = 37,
165 DPFLTR_SCCLIENT_ID = 38,
166 DPFLTR_SERIAL_ID = 39,
167 DPFLTR_SERENUM_ID = 40,
168 DPFLTR_UHCD_ID = 41,
169 DPFLTR_BOOTOK_ID = 42,
170 DPFLTR_BOOTVRFY_ID = 43,
171 DPFLTR_RPCPROXY_ID = 44,
172 DPFLTR_AUTOCHK_ID = 45,
173 DPFLTR_DCOMSS_ID = 46,
174 DPFLTR_UNIMODEM_ID = 47,
175 DPFLTR_SIS_ID = 48,
176 DPFLTR_FLTMGR_ID = 49,
177 DPFLTR_WMICORE_ID = 50,
178 DPFLTR_BURNENG_ID = 51,
179 DPFLTR_IMAPI_ID = 52,
180 DPFLTR_SXS_ID = 53,
181 DPFLTR_FUSION_ID = 54,
182 DPFLTR_IDLETASK_ID = 55,
183 DPFLTR_SOFTPCI_ID = 56,
184 DPFLTR_TAPE_ID = 57,
185 DPFLTR_MCHGR_ID = 58,
186 DPFLTR_IDEP_ID = 59,
187 DPFLTR_PCIIDE_ID = 60,
188 DPFLTR_FLOPPY_ID = 61,
189 DPFLTR_FDC_ID = 62,
190 DPFLTR_TERMSRV_ID = 63,
191 DPFLTR_W32TIME_ID = 64,
192 DPFLTR_PREFETCHER_ID = 65,
193 DPFLTR_RSFILTER_ID = 66,
194 DPFLTR_FCPORT_ID = 67,
195 DPFLTR_PCI_ID = 68,
196 DPFLTR_DMIO_ID = 69,
197 DPFLTR_DMCONFIG_ID = 70,
198 DPFLTR_DMADMIN_ID = 71,
199 DPFLTR_WSOCKTRANSPORT_ID = 72,
200 DPFLTR_VSS_ID = 73,
201 DPFLTR_PNPMEM_ID = 74,
202 DPFLTR_PROCESSOR_ID = 75,
203 DPFLTR_DMSERVER_ID = 76,
204 DPFLTR_SR_ID = 77,
205 DPFLTR_INFINIBAND_ID = 78,
206 DPFLTR_IHVDRIVER_ID = 79,
207 DPFLTR_IHVVIDEO_ID = 80,
208 DPFLTR_IHVAUDIO_ID = 81,
209 DPFLTR_IHVNETWORK_ID = 82,
210 DPFLTR_IHVSTREAMING_ID = 83,
211 DPFLTR_IHVBUS_ID = 84,
212 DPFLTR_HPS_ID = 85,
213 DPFLTR_RTLTHREADPOOL_ID = 86,
214 DPFLTR_LDR_ID = 87,
215 DPFLTR_TCPIP6_ID = 88,
216 DPFLTR_ISAPNP_ID = 89,
217 DPFLTR_SHPC_ID = 90,
218 DPFLTR_STORPORT_ID = 91,
219 DPFLTR_STORMINIPORT_ID = 92,
220 DPFLTR_PRINTSPOOLER_ID = 93,
221 DPFLTR_VDS_ID = 94,
222 DPFLTR_VDSBAS_ID = 95,
223 DPFLTR_VDSDYNDR_ID = 96,
224 DPFLTR_VDSUTIL_ID = 97,
225 DPFLTR_DFRGIFC_ID = 98,
226 DPFLTR_DEFAULT_ID = 99,
227 DPFLTR_MM_ID = 100,
228 DPFLTR_DFSC_ID = 101,
229 DPFLTR_WOW64_ID = 102,
230 DPFLTR_ENDOFTABLE_ID
231 } DPFLTR_TYPE;
232
233 /* also in winnt.h */
234
235 #define FILE_COPY_STRUCTURED_STORAGE 0x00000041
236 #define FILE_STRUCTURED_STORAGE 0x00000441
237
238 /* end winnt.h */
239
240 #define THREAD_ALERT (0x0004)
241
242 /* Exported object types */
243 extern POBJECT_TYPE NTSYSAPI ExDesktopObjectType;
244 extern POBJECT_TYPE NTSYSAPI ExEventObjectType;
245 extern POBJECT_TYPE NTSYSAPI ExSemaphoreObjectType;
246 extern POBJECT_TYPE NTSYSAPI ExWindowStationObjectType;
247 extern ULONG NTSYSAPI IoDeviceHandlerObjectSize;
248 extern POBJECT_TYPE NTSYSAPI IoDeviceHandlerObjectType;
249 extern POBJECT_TYPE NTSYSAPI IoDeviceObjectType;
250 extern POBJECT_TYPE NTSYSAPI IoDriverObjectType;
251 extern POBJECT_TYPE NTSYSAPI IoFileObjectType;
252 extern POBJECT_TYPE NTSYSAPI PsThreadType;
253 extern POBJECT_TYPE NTSYSAPI LpcPortObjectType;
254 extern POBJECT_TYPE NTSYSAPI SeTokenObjectType;
255 extern POBJECT_TYPE NTSYSAPI PsProcessType;
256
257 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
258 extern volatile CCHAR NTSYSAPI KeNumberProcessors;
259 #else
260 #if (NTDDI_VERSION >= NTDDI_WINXP)
261 extern CCHAR NTSYSAPI KeNumberProcessors;
262 #else
263 //extern PCCHAR KeNumberProcessors;
264 extern NTSYSAPI CCHAR KeNumberProcessors; //FIXME: Note to Alex: I won't fix this atm, since I prefer to discuss this with you first.
265 #endif
266 #endif
267
268 #define MAX_WOW64_SHARED_ENTRIES 16
269
270 extern volatile KSYSTEM_TIME KeTickCount;
271
272 #define NX_SUPPORT_POLICY_ALWAYSOFF 0
273 #define NX_SUPPORT_POLICY_ALWAYSON 1
274 #define NX_SUPPORT_POLICY_OPTIN 2
275 #define NX_SUPPORT_POLICY_OPTOUT 3
276
277 typedef struct _KUSER_SHARED_DATA
278 {
279 ULONG TickCountLowDeprecated;
280 ULONG TickCountMultiplier;
281 volatile KSYSTEM_TIME InterruptTime;
282 volatile KSYSTEM_TIME SystemTime;
283 volatile KSYSTEM_TIME TimeZoneBias;
284 USHORT ImageNumberLow;
285 USHORT ImageNumberHigh;
286 WCHAR NtSystemRoot[260];
287 ULONG MaxStackTraceDepth;
288 ULONG CryptoExponent;
289 ULONG TimeZoneId;
290 ULONG LargePageMinimum;
291 ULONG Reserved2[7];
292 NT_PRODUCT_TYPE NtProductType;
293 BOOLEAN ProductTypeIsValid;
294 ULONG NtMajorVersion;
295 ULONG NtMinorVersion;
296 BOOLEAN ProcessorFeatures[PROCESSOR_FEATURE_MAX];
297 ULONG Reserved1;
298 ULONG Reserved3;
299 volatile ULONG TimeSlip;
300 ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture;
301 LARGE_INTEGER SystemExpirationDate;
302 ULONG SuiteMask;
303 BOOLEAN KdDebuggerEnabled;
304 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
305 UCHAR NXSupportPolicy;
306 #endif
307 volatile ULONG ActiveConsoleId;
308 volatile ULONG DismountCount;
309 ULONG ComPlusPackage;
310 ULONG LastSystemRITEventTickCount;
311 ULONG NumberOfPhysicalPages;
312 BOOLEAN SafeBootMode;
313 ULONG TraceLogging;
314 ULONG Fill0;
315 ULONGLONG TestRetInstruction;
316 ULONG SystemCall;
317 ULONG SystemCallReturn;
318 ULONGLONG SystemCallPad[3];
319 __GNU_EXTENSION union {
320 volatile KSYSTEM_TIME TickCount;
321 volatile ULONG64 TickCountQuad;
322 };
323 ULONG Cookie;
324 #if (NTDDI_VERSION >= NTDDI_WS03)
325 LONGLONG ConsoleSessionForegroundProcessId;
326 ULONG Wow64SharedInformation[MAX_WOW64_SHARED_ENTRIES];
327 #endif
328 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
329 USHORT UserModeGlobalLogger[8];
330 ULONG HeapTracingPid[2];
331 ULONG CritSecTracingPid[2];
332 __GNU_EXTENSION union
333 {
334 ULONG SharedDataFlags;
335 __GNU_EXTENSION struct
336 {
337 ULONG DbgErrorPortPresent:1;
338 ULONG DbgElevationEnabled:1;
339 ULONG DbgVirtEnabled:1;
340 ULONG DbgInstallerDetectEnabled:1;
341 ULONG SpareBits:28;
342 };
343 };
344 ULONG ImageFileExecutionOptions;
345 KAFFINITY ActiveProcessorAffinity;
346 #endif
347 } KUSER_SHARED_DATA, *PKUSER_SHARED_DATA;
348
349 /*
350 ** IRP function codes
351 */
352
353 #define IRP_MN_QUERY_DIRECTORY 0x01
354 #define IRP_MN_NOTIFY_CHANGE_DIRECTORY 0x02
355
356 #define IRP_MN_USER_FS_REQUEST 0x00
357 #define IRP_MN_MOUNT_VOLUME 0x01
358 #define IRP_MN_VERIFY_VOLUME 0x02
359 #define IRP_MN_LOAD_FILE_SYSTEM 0x03
360 #define IRP_MN_TRACK_LINK 0x04
361 #define IRP_MN_KERNEL_CALL 0x04
362
363 #define IRP_MN_LOCK 0x01
364 #define IRP_MN_UNLOCK_SINGLE 0x02
365 #define IRP_MN_UNLOCK_ALL 0x03
366 #define IRP_MN_UNLOCK_ALL_BY_KEY 0x04
367
368 #define IRP_MN_NORMAL 0x00
369 #define IRP_MN_DPC 0x01
370 #define IRP_MN_MDL 0x02
371 #define IRP_MN_COMPLETE 0x04
372 #define IRP_MN_COMPRESSED 0x08
373
374 #define IRP_MN_MDL_DPC (IRP_MN_MDL | IRP_MN_DPC)
375 #define IRP_MN_COMPLETE_MDL (IRP_MN_COMPLETE | IRP_MN_MDL)
376 #define IRP_MN_COMPLETE_MDL_DPC (IRP_MN_COMPLETE_MDL | IRP_MN_DPC)
377
378 #define IRP_MN_QUERY_LEGACY_BUS_INFORMATION 0x18
379
380 typedef EXCEPTION_DISPOSITION
381 (DDKAPI *PEXCEPTION_ROUTINE)(
382 IN struct _EXCEPTION_RECORD *ExceptionRecord,
383 IN PVOID EstablisherFrame,
384 IN OUT struct _CONTEXT *ContextRecord,
385 IN OUT PVOID DispatcherContext);
386
387 typedef NTSTATUS
388 (DDKAPI *PDRIVER_ENTRY)(
389 IN struct _DRIVER_OBJECT *DriverObject,
390 IN PUNICODE_STRING RegistryPath);
391
392 typedef VOID
393 (DDKAPI *PDRIVER_REINITIALIZE)(
394 IN struct _DRIVER_OBJECT *DriverObject,
395 IN PVOID Context,
396 IN ULONG Count);
397
398 typedef BOOLEAN
399 (DDKAPI *PKTRANSFER_ROUTINE)(
400 VOID);
401
402 #define ASSERT_GATE(object) \
403 ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == GateObject) || \
404 (((object)->Header.Type & KOBJECT_TYPE_MASK) == EventSynchronizationObject))
405
406 #define TIMER_TABLE_SIZE 512
407 #define TIMER_TABLE_SHIFT 9
408
409 #define ASSERT_TIMER(E) \
410 ASSERT(((E)->Header.Type == TimerNotificationObject) || \
411 ((E)->Header.Type == TimerSynchronizationObject))
412
413 #define ASSERT_MUTANT(E) \
414 ASSERT((E)->Header.Type == MutantObject)
415
416 #define ASSERT_SEMAPHORE(E) \
417 ASSERT((E)->Header.Type == SemaphoreObject)
418
419 #define ASSERT_EVENT(E) \
420 ASSERT(((E)->Header.Type == NotificationEvent) || \
421 ((E)->Header.Type == SynchronizationEvent))
422
423 #define KEYBOARD_INSERT_ON 0x08
424 #define KEYBOARD_CAPS_LOCK_ON 0x04
425 #define KEYBOARD_NUM_LOCK_ON 0x02
426 #define KEYBOARD_SCROLL_LOCK_ON 0x01
427 #define KEYBOARD_ALT_KEY_DOWN 0x80
428 #define KEYBOARD_CTRL_KEY_DOWN 0x40
429 #define KEYBOARD_LEFT_SHIFT_DOWN 0x20
430 #define KEYBOARD_RIGHT_SHIFT_DOWN 0x10
431
432 typedef struct _IO_COUNTERS {
433 ULONGLONG ReadOperationCount;
434 ULONGLONG WriteOperationCount;
435 ULONGLONG OtherOperationCount;
436 ULONGLONG ReadTransferCount;
437 ULONGLONG WriteTransferCount;
438 ULONGLONG OtherTransferCount;
439 } IO_COUNTERS, *PIO_COUNTERS;
440
441 typedef struct _VM_COUNTERS
442 {
443 SIZE_T PeakVirtualSize;
444 SIZE_T VirtualSize;
445 ULONG PageFaultCount;
446 SIZE_T PeakWorkingSetSize;
447 SIZE_T WorkingSetSize;
448 SIZE_T QuotaPeakPagedPoolUsage;
449 SIZE_T QuotaPagedPoolUsage;
450 SIZE_T QuotaPeakNonPagedPoolUsage;
451 SIZE_T QuotaNonPagedPoolUsage;
452 SIZE_T PagefileUsage;
453 SIZE_T PeakPagefileUsage;
454 } VM_COUNTERS, *PVM_COUNTERS;
455
456 typedef struct _VM_COUNTERS_EX
457 {
458 SIZE_T PeakVirtualSize;
459 SIZE_T VirtualSize;
460 ULONG PageFaultCount;
461 SIZE_T PeakWorkingSetSize;
462 SIZE_T WorkingSetSize;
463 SIZE_T QuotaPeakPagedPoolUsage;
464 SIZE_T QuotaPagedPoolUsage;
465 SIZE_T QuotaPeakNonPagedPoolUsage;
466 SIZE_T QuotaNonPagedPoolUsage;
467 SIZE_T PagefileUsage;
468 SIZE_T PeakPagefileUsage;
469 SIZE_T PrivateUsage;
470 } VM_COUNTERS_EX, *PVM_COUNTERS_EX;
471
472 typedef struct _POOLED_USAGE_AND_LIMITS
473 {
474 SIZE_T PeakPagedPoolUsage;
475 SIZE_T PagedPoolUsage;
476 SIZE_T PagedPoolLimit;
477 SIZE_T PeakNonPagedPoolUsage;
478 SIZE_T NonPagedPoolUsage;
479 SIZE_T NonPagedPoolLimit;
480 SIZE_T PeakPagefileUsage;
481 SIZE_T PagefileUsage;
482 SIZE_T PagefileLimit;
483 } POOLED_USAGE_AND_LIMITS, *PPOOLED_USAGE_AND_LIMITS;
484
485 typedef struct _CONTROLLER_OBJECT {
486 CSHORT Type;
487 CSHORT Size;
488 PVOID ControllerExtension;
489 KDEVICE_QUEUE DeviceWaitQueue;
490 ULONG Spare1;
491 LARGE_INTEGER Spare2;
492 } CONTROLLER_OBJECT, *PCONTROLLER_OBJECT;
493
494 /* DEVICE_OBJECT.Flags */
495
496 #define DO_DEVICE_HAS_NAME 0x00000040
497 #define DO_SYSTEM_BOOT_PARTITION 0x00000100
498 #define DO_LONG_TERM_REQUESTS 0x00000200
499 #define DO_NEVER_LAST_DEVICE 0x00000400
500 #define DO_LOW_PRIORITY_FILESYSTEM 0x00010000
501 #define DO_XIP 0x00020000
502
503 #define DRVO_REINIT_REGISTERED 0x00000008
504 #define DRVO_INITIALIZED 0x00000010
505 #define DRVO_BOOTREINIT_REGISTERED 0x00000020
506 #define DRVO_LEGACY_RESOURCES 0x00000040
507
508 typedef enum _ARBITER_REQUEST_SOURCE {
509 ArbiterRequestUndefined = -1,
510 ArbiterRequestLegacyReported,
511 ArbiterRequestHalReported,
512 ArbiterRequestLegacyAssigned,
513 ArbiterRequestPnpDetected,
514 ArbiterRequestPnpEnumerated
515 } ARBITER_REQUEST_SOURCE;
516
517 typedef enum _ARBITER_RESULT {
518 ArbiterResultUndefined = -1,
519 ArbiterResultSuccess,
520 ArbiterResultExternalConflict,
521 ArbiterResultNullRequest
522 } ARBITER_RESULT;
523
524 typedef enum _ARBITER_ACTION {
525 ArbiterActionTestAllocation,
526 ArbiterActionRetestAllocation,
527 ArbiterActionCommitAllocation,
528 ArbiterActionRollbackAllocation,
529 ArbiterActionQueryAllocatedResources,
530 ArbiterActionWriteReservedResources,
531 ArbiterActionQueryConflict,
532 ArbiterActionQueryArbitrate,
533 ArbiterActionAddReserved,
534 ArbiterActionBootAllocation
535 } ARBITER_ACTION, *PARBITER_ACTION;
536
537 typedef struct _ARBITER_CONFLICT_INFO {
538 PDEVICE_OBJECT OwningObject;
539 ULONGLONG Start;
540 ULONGLONG End;
541 } ARBITER_CONFLICT_INFO, *PARBITER_CONFLICT_INFO;
542
543 typedef struct _ARBITER_PARAMETERS {
544 union {
545 struct {
546 IN OUT PLIST_ENTRY ArbitrationList;
547 IN ULONG AllocateFromCount;
548 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom;
549 } TestAllocation;
550
551 struct {
552 IN OUT PLIST_ENTRY ArbitrationList;
553 IN ULONG AllocateFromCount;
554 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom;
555 } RetestAllocation;
556
557 struct {
558 IN OUT PLIST_ENTRY ArbitrationList;
559 } BootAllocation;
560
561 struct {
562 OUT PCM_PARTIAL_RESOURCE_LIST *AllocatedResources;
563 } QueryAllocatedResources;
564
565 struct {
566 IN PDEVICE_OBJECT PhysicalDeviceObject;
567 IN PIO_RESOURCE_DESCRIPTOR ConflictingResource;
568 OUT PULONG ConflictCount;
569 OUT PARBITER_CONFLICT_INFO *Conflicts;
570 } QueryConflict;
571
572 struct {
573 IN PLIST_ENTRY ArbitrationList;
574 } QueryArbitrate;
575
576 struct {
577 IN PDEVICE_OBJECT ReserveDevice;
578 } AddReserved;
579 } Parameters;
580 } ARBITER_PARAMETERS, *PARBITER_PARAMETERS;
581
582 #define ARBITER_FLAG_BOOT_CONFIG 0x00000001
583
584 typedef struct _ARBITER_LIST_ENTRY {
585 LIST_ENTRY ListEntry;
586 ULONG AlternativeCount;
587 PIO_RESOURCE_DESCRIPTOR Alternatives;
588 PDEVICE_OBJECT PhysicalDeviceObject;
589 ARBITER_REQUEST_SOURCE RequestSource;
590 ULONG Flags;
591 LONG_PTR WorkSpace;
592 INTERFACE_TYPE InterfaceType;
593 ULONG SlotNumber;
594 ULONG BusNumber;
595 PCM_PARTIAL_RESOURCE_DESCRIPTOR Assignment;
596 PIO_RESOURCE_DESCRIPTOR SelectedAlternative;
597 ARBITER_RESULT Result;
598 } ARBITER_LIST_ENTRY, *PARBITER_LIST_ENTRY;
599
600 typedef NTSTATUS
601 (DDKAPI *PARBITER_HANDLER)(
602 IN PVOID Context,
603 IN ARBITER_ACTION Action,
604 IN OUT PARBITER_PARAMETERS Parameters);
605
606 #define ARBITER_PARTIAL 0x00000001
607
608 typedef struct _ARBITER_INTERFACE {
609 USHORT Size;
610 USHORT Version;
611 PVOID Context;
612 PINTERFACE_REFERENCE InterfaceReference;
613 PINTERFACE_DEREFERENCE InterfaceDereference;
614 PARBITER_HANDLER ArbiterHandler;
615 ULONG Flags;
616 } ARBITER_INTERFACE, *PARBITER_INTERFACE;
617
618 typedef enum _HAL_QUERY_INFORMATION_CLASS {
619 HalInstalledBusInformation,
620 HalProfileSourceInformation,
621 HalInformationClassUnused1,
622 HalPowerInformation,
623 HalProcessorSpeedInformation,
624 HalCallbackInformation,
625 HalMapRegisterInformation,
626 HalMcaLogInformation,
627 HalFrameBufferCachingInformation,
628 HalDisplayBiosInformation,
629 HalProcessorFeatureInformation,
630 HalNumaTopologyInterface,
631 HalErrorInformation,
632 HalCmcLogInformation,
633 HalCpeLogInformation,
634 HalQueryMcaInterface,
635 HalQueryAMLIIllegalIOPortAddresses,
636 HalQueryMaxHotPlugMemoryAddress,
637 HalPartitionIpiInterface,
638 HalPlatformInformation,
639 HalQueryProfileSourceList
640 } HAL_QUERY_INFORMATION_CLASS, *PHAL_QUERY_INFORMATION_CLASS;
641
642 typedef enum _HAL_SET_INFORMATION_CLASS {
643 HalProfileSourceInterval,
644 HalProfileSourceInterruptHandler,
645 HalMcaRegisterDriver,
646 HalKernelErrorHandler,
647 HalCmcRegisterDriver,
648 HalCpeRegisterDriver,
649 HalMcaLog,
650 HalCmcLog,
651 HalCpeLog,
652 HalGenerateCmcInterrupt
653 } HAL_SET_INFORMATION_CLASS, *PHAL_SET_INFORMATION_CLASS;
654
655 typedef struct _HAL_PROFILE_SOURCE_INTERVAL
656 {
657 KPROFILE_SOURCE Source;
658 ULONG_PTR Interval;
659 } HAL_PROFILE_SOURCE_INTERVAL, *PHAL_PROFILE_SOURCE_INTERVAL;
660
661 typedef struct _HAL_PROFILE_SOURCE_INFORMATION
662 {
663 KPROFILE_SOURCE Source;
664 BOOLEAN Supported;
665 ULONG Interval;
666 } HAL_PROFILE_SOURCE_INFORMATION, *PHAL_PROFILE_SOURCE_INFORMATION;
667
668 typedef struct _MAP_REGISTER_ENTRY
669 {
670 PVOID MapRegister;
671 BOOLEAN WriteToDevice;
672 } MAP_REGISTER_ENTRY, *PMAP_REGISTER_ENTRY;
673
674 typedef struct
675 {
676 UCHAR Type;
677 BOOLEAN Valid;
678 UCHAR Reserved[2];
679 PUCHAR TranslatedAddress;
680 ULONG Length;
681 } DEBUG_DEVICE_ADDRESS, *PDEBUG_DEVICE_ADDRESS;
682
683 typedef struct
684 {
685 PHYSICAL_ADDRESS Start;
686 PHYSICAL_ADDRESS MaxEnd;
687 PVOID VirtualAddress;
688 ULONG Length;
689 BOOLEAN Cached;
690 BOOLEAN Aligned;
691 } DEBUG_MEMORY_REQUIREMENTS, *PDEBUG_MEMORY_REQUIREMENTS;
692
693 typedef struct
694 {
695 ULONG Bus;
696 ULONG Slot;
697 USHORT VendorID;
698 USHORT DeviceID;
699 UCHAR BaseClass;
700 UCHAR SubClass;
701 UCHAR ProgIf;
702 BOOLEAN Initialized;
703 DEBUG_DEVICE_ADDRESS BaseAddress[6];
704 DEBUG_MEMORY_REQUIREMENTS Memory;
705 } DEBUG_DEVICE_DESCRIPTOR, *PDEBUG_DEVICE_DESCRIPTOR;
706
707 /* Function Type Defintions for Dispatch Functions */
708 struct _DEVICE_CONTROL_CONTEXT;
709
710 typedef VOID
711 (DDKAPI *PDEVICE_CONTROL_COMPLETION)(
712 IN struct _DEVICE_CONTROL_CONTEXT *ControlContext);
713
714 typedef struct _DEVICE_CONTROL_CONTEXT {
715 NTSTATUS Status;
716 PDEVICE_HANDLER_OBJECT DeviceHandler;
717 PDEVICE_OBJECT DeviceObject;
718 ULONG ControlCode;
719 PVOID Buffer;
720 PULONG BufferLength;
721 PVOID Context;
722 } DEVICE_CONTROL_CONTEXT, *PDEVICE_CONTROL_CONTEXT;
723
724 typedef struct _PM_DISPATCH_TABLE {
725 ULONG Signature;
726 ULONG Version;
727 PVOID Function[1];
728 } PM_DISPATCH_TABLE, *PPM_DISPATCH_TABLE;
729
730 typedef enum _RESOURCE_TRANSLATION_DIRECTION {
731 TranslateChildToParent,
732 TranslateParentToChild
733 } RESOURCE_TRANSLATION_DIRECTION;
734
735 typedef NTSTATUS
736 (DDKAPI *PTRANSLATE_RESOURCE_HANDLER)(
737 IN PVOID Context,
738 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Source,
739 IN RESOURCE_TRANSLATION_DIRECTION Direction,
740 IN ULONG AlternativesCount,
741 IN IO_RESOURCE_DESCRIPTOR Alternatives[],
742 IN PDEVICE_OBJECT PhysicalDeviceObject,
743 OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR Target);
744
745 typedef NTSTATUS
746 (DDKAPI *PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER)(
747 IN PVOID Context,
748 IN PIO_RESOURCE_DESCRIPTOR Source,
749 IN PDEVICE_OBJECT PhysicalDeviceObject,
750 OUT PULONG TargetCount,
751 OUT PIO_RESOURCE_DESCRIPTOR *Target);
752
753 typedef struct _TRANSLATOR_INTERFACE {
754 USHORT Size;
755 USHORT Version;
756 PVOID Context;
757 PINTERFACE_REFERENCE InterfaceReference;
758 PINTERFACE_DEREFERENCE InterfaceDereference;
759 PTRANSLATE_RESOURCE_HANDLER TranslateResources;
760 PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER TranslateResourceRequirements;
761 } TRANSLATOR_INTERFACE, *PTRANSLATOR_INTERFACE;
762
763 typedef NTSTATUS
764 (DDKAPI *pHalDeviceControl)(
765 IN PDEVICE_HANDLER_OBJECT DeviceHandler,
766 IN PDEVICE_OBJECT DeviceObject,
767 IN ULONG ControlCode,
768 IN OUT PVOID Buffer OPTIONAL,
769 IN OUT PULONG BufferLength OPTIONAL,
770 IN PVOID Context,
771 IN PDEVICE_CONTROL_COMPLETION CompletionRoutine);
772
773 typedef VOID
774 (FASTCALL *pHalExamineMBR)(
775 IN PDEVICE_OBJECT DeviceObject,
776 IN ULONG SectorSize,
777 IN ULONG MBRTypeIdentifier,
778 OUT PVOID *Buffer);
779
780 typedef VOID
781 (FASTCALL *pHalIoAssignDriveLetters)(
782 IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
783 IN PSTRING NtDeviceName,
784 OUT PUCHAR NtSystemPath,
785 OUT PSTRING NtSystemPathString);
786
787 typedef NTSTATUS
788 (FASTCALL *pHalIoReadPartitionTable)(
789 IN PDEVICE_OBJECT DeviceObject,
790 IN ULONG SectorSize,
791 IN BOOLEAN ReturnRecognizedPartitions,
792 OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer);
793
794 typedef NTSTATUS
795 (FASTCALL *pHalIoSetPartitionInformation)(
796 IN PDEVICE_OBJECT DeviceObject,
797 IN ULONG SectorSize,
798 IN ULONG PartitionNumber,
799 IN ULONG PartitionType);
800
801 typedef NTSTATUS
802 (FASTCALL *pHalIoWritePartitionTable)(
803 IN PDEVICE_OBJECT DeviceObject,
804 IN ULONG SectorSize,
805 IN ULONG SectorsPerTrack,
806 IN ULONG NumberOfHeads,
807 IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer);
808
809 typedef PBUS_HANDLER
810 (FASTCALL *pHalHandlerForBus)(
811 IN INTERFACE_TYPE InterfaceType,
812 IN ULONG BusNumber);
813
814 typedef VOID
815 (FASTCALL *pHalReferenceBusHandler)(
816 IN PBUS_HANDLER BusHandler);
817
818 typedef NTSTATUS
819 (DDKAPI *pHalQuerySystemInformation)(
820 IN HAL_QUERY_INFORMATION_CLASS InformationClass,
821 IN ULONG BufferSize,
822 IN OUT PVOID Buffer,
823 OUT PULONG ReturnedLength);
824
825 typedef NTSTATUS
826 (DDKAPI *pHalSetSystemInformation)(
827 IN HAL_SET_INFORMATION_CLASS InformationClass,
828 IN ULONG BufferSize,
829 IN PVOID Buffer);
830
831 typedef NTSTATUS
832 (DDKAPI *pHalQueryBusSlots)(
833 IN PBUS_HANDLER BusHandler,
834 IN ULONG BufferSize,
835 OUT PULONG SlotNumbers,
836 OUT PULONG ReturnedLength);
837
838 typedef NTSTATUS
839 (DDKAPI *pHalInitPnpDriver)(
840 VOID);
841
842 typedef NTSTATUS
843 (DDKAPI *pHalInitPowerManagement)(
844 IN PPM_DISPATCH_TABLE PmDriverDispatchTable,
845 OUT PPM_DISPATCH_TABLE *PmHalDispatchTable);
846
847 typedef struct _DMA_ADAPTER*
848 (DDKAPI *pHalGetDmaAdapter)(
849 IN PVOID Context,
850 IN struct _DEVICE_DESCRIPTION *DeviceDescriptor,
851 OUT PULONG NumberOfMapRegisters);
852
853 typedef NTSTATUS
854 (DDKAPI *pHalGetInterruptTranslator)(
855 IN INTERFACE_TYPE ParentInterfaceType,
856 IN ULONG ParentBusNumber,
857 IN INTERFACE_TYPE BridgeInterfaceType,
858 IN USHORT Size,
859 IN USHORT Version,
860 OUT PTRANSLATOR_INTERFACE Translator,
861 OUT PULONG BridgeBusNumber);
862
863 typedef NTSTATUS
864 (DDKAPI *pHalStartMirroring)(
865 VOID);
866
867 typedef NTSTATUS
868 (DDKAPI *pHalEndMirroring)(
869 IN ULONG PassNumber);
870
871 typedef NTSTATUS
872 (DDKAPI *pHalMirrorPhysicalMemory)(
873 IN PHYSICAL_ADDRESS PhysicalAddress,
874 IN LARGE_INTEGER NumberOfBytes);
875
876 typedef NTSTATUS
877 (DDKAPI *pHalMirrorVerify)(
878 IN PHYSICAL_ADDRESS PhysicalAddress,
879 IN LARGE_INTEGER NumberOfBytes);
880
881 typedef VOID
882 (DDKAPI *pHalEndOfBoot)(
883 VOID);
884
885 typedef
886 BOOLEAN
887 (DDKAPI *pHalTranslateBusAddress)(
888 IN INTERFACE_TYPE InterfaceType,
889 IN ULONG BusNumber,
890 IN PHYSICAL_ADDRESS BusAddress,
891 IN OUT PULONG AddressSpace,
892 OUT PPHYSICAL_ADDRESS TranslatedAddress
893 );
894
895 typedef
896 NTSTATUS
897 (DDKAPI *pHalAssignSlotResources)(
898 IN PUNICODE_STRING RegistryPath,
899 IN PUNICODE_STRING DriverClassName OPTIONAL,
900 IN PDRIVER_OBJECT DriverObject,
901 IN PDEVICE_OBJECT DeviceObject,
902 IN INTERFACE_TYPE BusType,
903 IN ULONG BusNumber,
904 IN ULONG SlotNumber,
905 IN OUT PCM_RESOURCE_LIST *AllocatedResources
906 );
907
908 typedef
909 VOID
910 (DDKAPI *pHalHaltSystem)(
911 VOID
912 );
913
914 typedef
915 BOOLEAN
916 (DDKAPI *pHalResetDisplay)(
917 VOID
918 );
919
920 typedef
921 UCHAR
922 (DDKAPI *pHalVectorToIDTEntry)(
923 ULONG Vector
924 );
925
926 typedef
927 BOOLEAN
928 (DDKAPI *pHalFindBusAddressTranslation)(
929 IN PHYSICAL_ADDRESS BusAddress,
930 IN OUT PULONG AddressSpace,
931 OUT PPHYSICAL_ADDRESS TranslatedAddress,
932 IN OUT PULONG_PTR Context,
933 IN BOOLEAN NextBus
934 );
935
936 typedef
937 NTSTATUS
938 (DDKAPI *pKdSetupPciDeviceForDebugging)(
939 IN PVOID LoaderBlock OPTIONAL,
940 IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice
941 );
942
943 typedef
944 NTSTATUS
945 (DDKAPI *pKdReleasePciDeviceForDebugging)(
946 IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice
947 );
948
949 typedef
950 PVOID
951 (DDKAPI *pKdGetAcpiTablePhase0)(
952 IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
953 IN ULONG Signature
954 );
955
956 typedef
957 VOID
958 (DDKAPI *pKdCheckPowerButton)(
959 VOID
960 );
961
962 typedef
963 ULONG
964 (DDKAPI *pHalGetInterruptVector)(
965 IN INTERFACE_TYPE InterfaceType,
966 IN ULONG BusNumber,
967 IN ULONG BusInterruptLevel,
968 IN ULONG BusInterruptVector,
969 OUT PKIRQL Irql,
970 OUT PKAFFINITY Affinity
971 );
972
973 typedef
974 NTSTATUS
975 (DDKAPI *pHalGetVectorInput)(
976 IN ULONG Vector,
977 IN KAFFINITY Affinity,
978 OUT PULONG Input,
979 OUT PKINTERRUPT_POLARITY Polarity
980 );
981
982 typedef
983 PVOID
984 (DDKAPI *pKdMapPhysicalMemory64)(
985 IN PHYSICAL_ADDRESS PhysicalAddress,
986 IN ULONG NumberPages
987 );
988
989 typedef
990 VOID
991 (DDKAPI *pKdUnmapVirtualAddress)(
992 IN PVOID VirtualAddress,
993 IN ULONG NumberPages
994 );
995
996 typedef
997 ULONG
998 (DDKAPI *pKdGetPciDataByOffset)(
999 IN ULONG BusNumber,
1000 IN ULONG SlotNumber,
1001 OUT PVOID Buffer,
1002 IN ULONG Offset,
1003 IN ULONG Length
1004 );
1005
1006 typedef
1007 ULONG
1008 (DDKAPI *pKdSetPciDataByOffset)(
1009 IN ULONG BusNumber,
1010 IN ULONG SlotNumber,
1011 IN PVOID Buffer,
1012 IN ULONG Offset,
1013 IN ULONG Length
1014 );
1015
1016 typedef BOOLEAN
1017 (DDKAPI *PHAL_RESET_DISPLAY_PARAMETERS)(
1018 ULONG Columns, ULONG Rows);
1019
1020 typedef struct {
1021 ULONG Version;
1022 pHalQuerySystemInformation HalQuerySystemInformation;
1023 pHalSetSystemInformation HalSetSystemInformation;
1024 pHalQueryBusSlots HalQueryBusSlots;
1025 ULONG Spare1;
1026 pHalExamineMBR HalExamineMBR;
1027 pHalIoAssignDriveLetters HalIoAssignDriveLetters;
1028 pHalIoReadPartitionTable HalIoReadPartitionTable;
1029 pHalIoSetPartitionInformation HalIoSetPartitionInformation;
1030 pHalIoWritePartitionTable HalIoWritePartitionTable;
1031 pHalHandlerForBus HalReferenceHandlerForBus;
1032 pHalReferenceBusHandler HalReferenceBusHandler;
1033 pHalReferenceBusHandler HalDereferenceBusHandler;
1034 pHalInitPnpDriver HalInitPnpDriver;
1035 pHalInitPowerManagement HalInitPowerManagement;
1036 pHalGetDmaAdapter HalGetDmaAdapter;
1037 pHalGetInterruptTranslator HalGetInterruptTranslator;
1038 pHalStartMirroring HalStartMirroring;
1039 pHalEndMirroring HalEndMirroring;
1040 pHalMirrorPhysicalMemory HalMirrorPhysicalMemory;
1041 pHalEndOfBoot HalEndOfBoot;
1042 pHalMirrorVerify HalMirrorVerify;
1043 } HAL_DISPATCH, *PHAL_DISPATCH;
1044
1045 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTHAL_)
1046 extern NTSYSAPI PHAL_DISPATCH HalDispatchTable;
1047 #define HALDISPATCH ((PHAL_DISPATCH)&HalDispatchTable)
1048 #else
1049 extern __declspec(dllexport) HAL_DISPATCH HalDispatchTable;
1050 #define HALDISPATCH (&HalDispatchTable)
1051 #endif
1052
1053 #define HAL_DISPATCH_VERSION 3
1054 #define HalDispatchTableVersion HALDISPATCH->Version
1055 #define HalQuerySystemInformation HALDISPATCH->HalQuerySystemInformation
1056 #define HalSetSystemInformation HALDISPATCH->HalSetSystemInformation
1057 #define HalQueryBusSlots HALDISPATCH->HalQueryBusSlots
1058 #define HalReferenceHandlerForBus HALDISPATCH->HalReferenceHandlerForBus
1059 #define HalReferenceBusHandler HALDISPATCH->HalReferenceBusHandler
1060 #define HalDereferenceBusHandler HALDISPATCH->HalDereferenceBusHandler
1061 #define HalInitPnpDriver HALDISPATCH->HalInitPnpDriver
1062 #define HalInitPowerManagement HALDISPATCH->HalInitPowerManagement
1063 #define HalGetDmaAdapter HALDISPATCH->HalGetDmaAdapter
1064 #define HalGetInterruptTranslator HALDISPATCH->HalGetInterruptTranslator
1065 #define HalStartMirroring HALDISPATCH->HalStartMirroring
1066 #define HalEndMirroring HALDISPATCH->HalEndMirroring
1067 #define HalMirrorPhysicalMemory HALDISPATCH->HalMirrorPhysicalMemory
1068 #define HalEndOfBoot HALDISPATCH->HalEndOfBoot
1069 #define HalMirrorVerify HALDISPATCH->HalMirrorVerify
1070
1071 typedef struct _FILE_ALIGNMENT_INFORMATION {
1072 ULONG AlignmentRequirement;
1073 } FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION;
1074
1075 typedef struct _FILE_NAME_INFORMATION {
1076 ULONG FileNameLength;
1077 WCHAR FileName[1];
1078 } FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;
1079
1080
1081 typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION {
1082 ULONG FileAttributes;
1083 ULONG ReparseTag;
1084 } FILE_ATTRIBUTE_TAG_INFORMATION, *PFILE_ATTRIBUTE_TAG_INFORMATION;
1085
1086 typedef struct _FILE_DISPOSITION_INFORMATION {
1087 BOOLEAN DeleteFile;
1088 } FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION;
1089
1090 typedef struct _FILE_END_OF_FILE_INFORMATION {
1091 LARGE_INTEGER EndOfFile;
1092 } FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION;
1093
1094 typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION {
1095 LARGE_INTEGER ValidDataLength;
1096 } FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION;
1097
1098 typedef union _FILE_SEGMENT_ELEMENT {
1099 PVOID64 Buffer;
1100 ULONGLONG Alignment;
1101 }FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT;
1102
1103 #define SE_UNSOLICITED_INPUT_PRIVILEGE 6
1104
1105 typedef struct _KEY_USER_FLAGS_INFORMATION {
1106 ULONG UserFlags;
1107 } KEY_USER_FLAGS_INFORMATION, *PKEY_USER_FLAGS_INFORMATION;
1108
1109 #define PCI_ADDRESS_MEMORY_SPACE 0x00000000
1110
1111 typedef struct _OSVERSIONINFOA {
1112 ULONG dwOSVersionInfoSize;
1113 ULONG dwMajorVersion;
1114 ULONG dwMinorVersion;
1115 ULONG dwBuildNumber;
1116 ULONG dwPlatformId;
1117 CHAR szCSDVersion[128];
1118 } OSVERSIONINFOA, *POSVERSIONINFOA, *LPOSVERSIONINFOA;
1119
1120 typedef struct _OSVERSIONINFOW {
1121 ULONG dwOSVersionInfoSize;
1122 ULONG dwMajorVersion;
1123 ULONG dwMinorVersion;
1124 ULONG dwBuildNumber;
1125 ULONG dwPlatformId;
1126 WCHAR szCSDVersion[128];
1127 } OSVERSIONINFOW, *POSVERSIONINFOW, *LPOSVERSIONINFOW, RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW;
1128
1129 #ifdef UNICODE
1130 typedef OSVERSIONINFOW OSVERSIONINFO;
1131 typedef POSVERSIONINFOW POSVERSIONINFO;
1132 typedef LPOSVERSIONINFOW LPOSVERSIONINFO;
1133 #else
1134 typedef OSVERSIONINFOA OSVERSIONINFO;
1135 typedef POSVERSIONINFOA POSVERSIONINFO;
1136 typedef LPOSVERSIONINFOA LPOSVERSIONINFO;
1137 #endif // UNICODE
1138
1139 typedef struct _OSVERSIONINFOEXA {
1140 ULONG dwOSVersionInfoSize;
1141 ULONG dwMajorVersion;
1142 ULONG dwMinorVersion;
1143 ULONG dwBuildNumber;
1144 ULONG dwPlatformId;
1145 CHAR szCSDVersion[128];
1146 USHORT wServicePackMajor;
1147 USHORT wServicePackMinor;
1148 USHORT wSuiteMask;
1149 UCHAR wProductType;
1150 UCHAR wReserved;
1151 } OSVERSIONINFOEXA, *POSVERSIONINFOEXA, *LPOSVERSIONINFOEXA;
1152
1153 typedef struct _OSVERSIONINFOEXW {
1154 ULONG dwOSVersionInfoSize;
1155 ULONG dwMajorVersion;
1156 ULONG dwMinorVersion;
1157 ULONG dwBuildNumber;
1158 ULONG dwPlatformId;
1159 WCHAR szCSDVersion[128];
1160 USHORT wServicePackMajor;
1161 USHORT wServicePackMinor;
1162 USHORT wSuiteMask;
1163 UCHAR wProductType;
1164 UCHAR wReserved;
1165 } OSVERSIONINFOEXW, *POSVERSIONINFOEXW, *LPOSVERSIONINFOEXW, RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW;
1166
1167 #ifdef UNICODE
1168 typedef OSVERSIONINFOEXW OSVERSIONINFOEX;
1169 typedef POSVERSIONINFOEXW POSVERSIONINFOEX;
1170 typedef LPOSVERSIONINFOEXW LPOSVERSIONINFOEX;
1171 #else
1172 typedef OSVERSIONINFOEXA OSVERSIONINFOEX;
1173 typedef POSVERSIONINFOEXA POSVERSIONINFOEX;
1174 typedef LPOSVERSIONINFOEXA LPOSVERSIONINFOEX;
1175 #endif // UNICODE
1176
1177 NTSYSAPI
1178 ULONGLONG
1179 DDKAPI
1180 VerSetConditionMask(
1181 IN ULONGLONG ConditionMask,
1182 IN ULONG TypeMask,
1183 IN UCHAR Condition);
1184
1185 #define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType) \
1186 ((ConditionMask) = VerSetConditionMask((ConditionMask), \
1187 (TypeBitMask), (ComparisonType)))
1188
1189 /* RtlVerifyVersionInfo() TypeMask */
1190
1191 #define VER_MINORVERSION 0x0000001
1192 #define VER_MAJORVERSION 0x0000002
1193 #define VER_BUILDNUMBER 0x0000004
1194 #define VER_PLATFORMID 0x0000008
1195 #define VER_SERVICEPACKMINOR 0x0000010
1196 #define VER_SERVICEPACKMAJOR 0x0000020
1197 #define VER_SUITENAME 0x0000040
1198 #define VER_PRODUCT_TYPE 0x0000080
1199
1200 /* RtlVerifyVersionInfo() ComparisonType */
1201
1202 #define VER_EQUAL 1
1203 #define VER_GREATER 2
1204 #define VER_GREATER_EQUAL 3
1205 #define VER_LESS 4
1206 #define VER_LESS_EQUAL 5
1207 #define VER_AND 6
1208 #define VER_OR 7
1209
1210 #define VER_CONDITION_MASK 7
1211 #define VER_NUM_BITS_PER_CONDITION_MASK 3
1212
1213 struct _RTL_RANGE;
1214
1215 typedef BOOLEAN
1216 (NTAPI *PRTL_CONFLICT_RANGE_CALLBACK) (
1217 PVOID Context,
1218 struct _RTL_RANGE *Range
1219 );
1220
1221 typedef struct _CONFIGURATION_INFORMATION {
1222 ULONG DiskCount;
1223 ULONG FloppyCount;
1224 ULONG CdRomCount;
1225 ULONG TapeCount;
1226 ULONG ScsiPortCount;
1227 ULONG SerialCount;
1228 ULONG ParallelCount;
1229 BOOLEAN AtDiskPrimaryAddressClaimed;
1230 BOOLEAN AtDiskSecondaryAddressClaimed;
1231 ULONG Version;
1232 ULONG MediumChangerCount;
1233 } CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION;
1234
1235 typedef enum _CONFIGURATION_TYPE {
1236 ArcSystem,
1237 CentralProcessor,
1238 FloatingPointProcessor,
1239 PrimaryIcache,
1240 PrimaryDcache,
1241 SecondaryIcache,
1242 SecondaryDcache,
1243 SecondaryCache,
1244 EisaAdapter,
1245 TcAdapter,
1246 ScsiAdapter,
1247 DtiAdapter,
1248 MultiFunctionAdapter,
1249 DiskController,
1250 TapeController,
1251 CdromController,
1252 WormController,
1253 SerialController,
1254 NetworkController,
1255 DisplayController,
1256 ParallelController,
1257 PointerController,
1258 KeyboardController,
1259 AudioController,
1260 OtherController,
1261 DiskPeripheral,
1262 FloppyDiskPeripheral,
1263 TapePeripheral,
1264 ModemPeripheral,
1265 MonitorPeripheral,
1266 PrinterPeripheral,
1267 PointerPeripheral,
1268 KeyboardPeripheral,
1269 TerminalPeripheral,
1270 OtherPeripheral,
1271 LinePeripheral,
1272 NetworkPeripheral,
1273 SystemMemory,
1274 DockingInformation,
1275 RealModeIrqRoutingTable,
1276 RealModePCIEnumeration,
1277 MaximumType
1278 } CONFIGURATION_TYPE, *PCONFIGURATION_TYPE;
1279
1280 typedef NTSTATUS
1281 (DDKAPI *PIO_QUERY_DEVICE_ROUTINE)(
1282 IN PVOID Context,
1283 IN PUNICODE_STRING PathName,
1284 IN INTERFACE_TYPE BusType,
1285 IN ULONG BusNumber,
1286 IN PKEY_VALUE_FULL_INFORMATION *BusInformation,
1287 IN CONFIGURATION_TYPE ControllerType,
1288 IN ULONG ControllerNumber,
1289 IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation,
1290 IN CONFIGURATION_TYPE PeripheralType,
1291 IN ULONG PeripheralNumber,
1292 IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation);
1293
1294 typedef enum _IO_QUERY_DEVICE_DATA_FORMAT {
1295 IoQueryDeviceIdentifier = 0,
1296 IoQueryDeviceConfigurationData,
1297 IoQueryDeviceComponentInformation,
1298 IoQueryDeviceMaxData
1299 } IO_QUERY_DEVICE_DATA_FORMAT, *PIO_QUERY_DEVICE_DATA_FORMAT;
1300
1301 typedef VOID
1302 (DDKAPI *PCREATE_PROCESS_NOTIFY_ROUTINE)(
1303 IN HANDLE ParentId,
1304 IN HANDLE ProcessId,
1305 IN BOOLEAN Create);
1306
1307 typedef VOID
1308 (DDKAPI *PCREATE_THREAD_NOTIFY_ROUTINE)(
1309 IN HANDLE ProcessId,
1310 IN HANDLE ThreadId,
1311 IN BOOLEAN Create);
1312
1313 typedef struct _IMAGE_INFO {
1314 _ANONYMOUS_UNION union {
1315 ULONG Properties;
1316 _ANONYMOUS_STRUCT struct {
1317 ULONG ImageAddressingMode : 8;
1318 ULONG SystemModeImage : 1;
1319 ULONG ImageMappedToAllPids : 1;
1320 ULONG Reserved : 22;
1321 } DUMMYSTRUCTNAME;
1322 } DUMMYUNIONNAME;
1323 PVOID ImageBase;
1324 ULONG ImageSelector;
1325 SIZE_T ImageSize;
1326 ULONG ImageSectionNumber;
1327 } IMAGE_INFO, *PIMAGE_INFO;
1328
1329 #define IMAGE_ADDRESSING_MODE_32BIT 3
1330
1331 typedef VOID
1332 (DDKAPI *PLOAD_IMAGE_NOTIFY_ROUTINE)(
1333 IN PUNICODE_STRING FullImageName,
1334 IN HANDLE ProcessId,
1335 IN PIMAGE_INFO ImageInfo);
1336
1337 #pragma pack(push,4)
1338 typedef enum _BUS_DATA_TYPE {
1339 ConfigurationSpaceUndefined = -1,
1340 Cmos,
1341 EisaConfiguration,
1342 Pos,
1343 CbusConfiguration,
1344 PCIConfiguration,
1345 VMEConfiguration,
1346 NuBusConfiguration,
1347 PCMCIAConfiguration,
1348 MPIConfiguration,
1349 MPSAConfiguration,
1350 PNPISAConfiguration,
1351 SgiInternalConfiguration,
1352 MaximumBusDataType
1353 } BUS_DATA_TYPE, *PBUS_DATA_TYPE;
1354 #pragma pack(pop)
1355
1356 typedef struct _NT_TIB {
1357 struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
1358 PVOID StackBase;
1359 PVOID StackLimit;
1360 PVOID SubSystemTib;
1361 _ANONYMOUS_UNION union {
1362 PVOID FiberData;
1363 ULONG Version;
1364 } DUMMYUNIONNAME;
1365 PVOID ArbitraryUserPointer;
1366 struct _NT_TIB *Self;
1367 } NT_TIB, *PNT_TIB;
1368
1369 typedef struct _NT_TIB32 {
1370 ULONG ExceptionList;
1371 ULONG StackBase;
1372 ULONG StackLimit;
1373 ULONG SubSystemTib;
1374 __GNU_EXTENSION union {
1375 ULONG FiberData;
1376 ULONG Version;
1377 };
1378 ULONG ArbitraryUserPointer;
1379 ULONG Self;
1380 } NT_TIB32,*PNT_TIB32;
1381
1382 typedef struct _NT_TIB64 {
1383 ULONG64 ExceptionList;
1384 ULONG64 StackBase;
1385 ULONG64 StackLimit;
1386 ULONG64 SubSystemTib;
1387 __GNU_EXTENSION union {
1388 ULONG64 FiberData;
1389 ULONG Version;
1390 };
1391 ULONG64 ArbitraryUserPointer;
1392 ULONG64 Self;
1393 } NT_TIB64,*PNT_TIB64;
1394
1395 typedef enum _PROCESSINFOCLASS {
1396 ProcessBasicInformation,
1397 ProcessQuotaLimits,
1398 ProcessIoCounters,
1399 ProcessVmCounters,
1400 ProcessTimes,
1401 ProcessBasePriority,
1402 ProcessRaisePriority,
1403 ProcessDebugPort,
1404 ProcessExceptionPort,
1405 ProcessAccessToken,
1406 ProcessLdtInformation,
1407 ProcessLdtSize,
1408 ProcessDefaultHardErrorMode,
1409 ProcessIoPortHandlers,
1410 ProcessPooledUsageAndLimits,
1411 ProcessWorkingSetWatch,
1412 ProcessUserModeIOPL,
1413 ProcessEnableAlignmentFaultFixup,
1414 ProcessPriorityClass,
1415 ProcessWx86Information,
1416 ProcessHandleCount,
1417 ProcessAffinityMask,
1418 ProcessPriorityBoost,
1419 ProcessDeviceMap,
1420 ProcessSessionInformation,
1421 ProcessForegroundInformation,
1422 ProcessWow64Information,
1423 ProcessImageFileName,
1424 ProcessLUIDDeviceMapsEnabled,
1425 ProcessBreakOnTermination,
1426 ProcessDebugObjectHandle,
1427 ProcessDebugFlags,
1428 ProcessHandleTracing,
1429 ProcessIoPriority,
1430 ProcessExecuteFlags,
1431 ProcessTlsInformation,
1432 ProcessCookie,
1433 ProcessImageInformation,
1434 ProcessCycleTime,
1435 ProcessPagePriority,
1436 ProcessInstrumentationCallback,
1437 MaxProcessInfoClass
1438 } PROCESSINFOCLASS;
1439
1440 typedef enum _THREADINFOCLASS {
1441 ThreadBasicInformation,
1442 ThreadTimes,
1443 ThreadPriority,
1444 ThreadBasePriority,
1445 ThreadAffinityMask,
1446 ThreadImpersonationToken,
1447 ThreadDescriptorTableEntry,
1448 ThreadEnableAlignmentFaultFixup,
1449 ThreadEventPair_Reusable,
1450 ThreadQuerySetWin32StartAddress,
1451 ThreadZeroTlsCell,
1452 ThreadPerformanceCount,
1453 ThreadAmILastThread,
1454 ThreadIdealProcessor,
1455 ThreadPriorityBoost,
1456 ThreadSetTlsArrayAddress,
1457 ThreadIsIoPending,
1458 ThreadHideFromDebugger,
1459 ThreadBreakOnTermination,
1460 ThreadSwitchLegacyState,
1461 ThreadIsTerminated,
1462 ThreadLastSystemCall,
1463 ThreadIoPriority,
1464 ThreadCycleTime,
1465 ThreadPagePriority,
1466 ThreadActualBasePriority,
1467 MaxThreadInfoClass
1468 } THREADINFOCLASS;
1469
1470 typedef struct _PROCESS_BASIC_INFORMATION
1471 {
1472 NTSTATUS ExitStatus;
1473 struct _PEB *PebBaseAddress;
1474 ULONG_PTR AffinityMask;
1475 KPRIORITY BasePriority;
1476 ULONG_PTR UniqueProcessId;
1477 ULONG_PTR InheritedFromUniqueProcessId;
1478 } PROCESS_BASIC_INFORMATION,*PPROCESS_BASIC_INFORMATION;
1479
1480 typedef struct _PROCESS_WS_WATCH_INFORMATION
1481 {
1482 PVOID FaultingPc;
1483 PVOID FaultingVa;
1484 } PROCESS_WS_WATCH_INFORMATION, *PPROCESS_WS_WATCH_INFORMATION;
1485
1486 typedef struct _PROCESS_DEVICEMAP_INFORMATION
1487 {
1488 __GNU_EXTENSION union
1489 {
1490 struct
1491 {
1492 HANDLE DirectoryHandle;
1493 } Set;
1494 struct
1495 {
1496 ULONG DriveMap;
1497 UCHAR DriveType[32];
1498 } Query;
1499 };
1500 } PROCESS_DEVICEMAP_INFORMATION, *PPROCESS_DEVICEMAP_INFORMATION;
1501
1502 typedef struct _KERNEL_USER_TIMES
1503 {
1504 LARGE_INTEGER CreateTime;
1505 LARGE_INTEGER ExitTime;
1506 LARGE_INTEGER KernelTime;
1507 LARGE_INTEGER UserTime;
1508 } KERNEL_USER_TIMES, *PKERNEL_USER_TIMES;
1509
1510 typedef struct _PROCESS_ACCESS_TOKEN
1511 {
1512 HANDLE Token;
1513 HANDLE Thread;
1514 } PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN;
1515
1516 typedef struct _PROCESS_SESSION_INFORMATION
1517 {
1518 ULONG SessionId;
1519 } PROCESS_SESSION_INFORMATION, *PPROCESS_SESSION_INFORMATION;
1520
1521 /*
1522 ** Storage structures
1523 */
1524 typedef enum _PARTITION_STYLE {
1525 PARTITION_STYLE_MBR,
1526 PARTITION_STYLE_GPT,
1527 PARTITION_STYLE_RAW
1528 } PARTITION_STYLE;
1529
1530 typedef struct _CREATE_DISK_MBR {
1531 ULONG Signature;
1532 } CREATE_DISK_MBR, *PCREATE_DISK_MBR;
1533
1534 typedef struct _CREATE_DISK_GPT {
1535 GUID DiskId;
1536 ULONG MaxPartitionCount;
1537 } CREATE_DISK_GPT, *PCREATE_DISK_GPT;
1538
1539 typedef struct _CREATE_DISK {
1540 PARTITION_STYLE PartitionStyle;
1541 _ANONYMOUS_UNION union {
1542 CREATE_DISK_MBR Mbr;
1543 CREATE_DISK_GPT Gpt;
1544 } DUMMYUNIONNAME;
1545 } CREATE_DISK, *PCREATE_DISK;
1546
1547 typedef struct _DISK_SIGNATURE {
1548 ULONG PartitionStyle;
1549 _ANONYMOUS_UNION union {
1550 struct {
1551 ULONG Signature;
1552 ULONG CheckSum;
1553 } Mbr;
1554 struct {
1555 GUID DiskId;
1556 } Gpt;
1557 } DUMMYUNIONNAME;
1558 } DISK_SIGNATURE, *PDISK_SIGNATURE;
1559
1560 typedef VOID
1561 (FASTCALL*PTIME_UPDATE_NOTIFY_ROUTINE)(
1562 IN HANDLE ThreadId,
1563 IN KPROCESSOR_MODE Mode);
1564
1565 typedef struct _PHYSICAL_MEMORY_RANGE {
1566 PHYSICAL_ADDRESS BaseAddress;
1567 LARGE_INTEGER NumberOfBytes;
1568 } PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE;
1569
1570 typedef ULONG_PTR
1571 (NTAPI *PDRIVER_VERIFIER_THUNK_ROUTINE)(
1572 IN PVOID Context);
1573
1574 typedef struct _DRIVER_VERIFIER_THUNK_PAIRS {
1575 PDRIVER_VERIFIER_THUNK_ROUTINE PristineRoutine;
1576 PDRIVER_VERIFIER_THUNK_ROUTINE NewRoutine;
1577 } DRIVER_VERIFIER_THUNK_PAIRS, *PDRIVER_VERIFIER_THUNK_PAIRS;
1578
1579 #define DRIVER_VERIFIER_SPECIAL_POOLING 0x0001
1580 #define DRIVER_VERIFIER_FORCE_IRQL_CHECKING 0x0002
1581 #define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES 0x0004
1582 #define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS 0x0008
1583 #define DRIVER_VERIFIER_IO_CHECKING 0x0010
1584
1585 typedef VOID
1586 (DDKAPI *PTIMER_APC_ROUTINE)(
1587 IN PVOID TimerContext,
1588 IN ULONG TimerLowValue,
1589 IN LONG TimerHighValue);
1590
1591 /*
1592 ** Architecture specific structures
1593 */
1594 #define PCR_MINOR_VERSION 1
1595 #define PCR_MAJOR_VERSION 1
1596
1597 #ifdef _X86_
1598
1599 #define SIZE_OF_80387_REGISTERS 80
1600 #define CONTEXT_i386 0x10000
1601 #define CONTEXT_i486 0x10000
1602 #define CONTEXT_CONTROL (CONTEXT_i386|0x00000001L)
1603 #define CONTEXT_INTEGER (CONTEXT_i386|0x00000002L)
1604 #define CONTEXT_SEGMENTS (CONTEXT_i386|0x00000004L)
1605 #define CONTEXT_FLOATING_POINT (CONTEXT_i386|0x00000008L)
1606 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386|0x00000010L)
1607 #define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L)
1608 #define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS)
1609
1610 typedef struct _FLOATING_SAVE_AREA {
1611 ULONG ControlWord;
1612 ULONG StatusWord;
1613 ULONG TagWord;
1614 ULONG ErrorOffset;
1615 ULONG ErrorSelector;
1616 ULONG DataOffset;
1617 ULONG DataSelector;
1618 UCHAR RegisterArea[SIZE_OF_80387_REGISTERS];
1619 ULONG Cr0NpxState;
1620 } FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA;
1621
1622 typedef struct _CONTEXT {
1623 ULONG ContextFlags;
1624 ULONG Dr0;
1625 ULONG Dr1;
1626 ULONG Dr2;
1627 ULONG Dr3;
1628 ULONG Dr6;
1629 ULONG Dr7;
1630 FLOATING_SAVE_AREA FloatSave;
1631 ULONG SegGs;
1632 ULONG SegFs;
1633 ULONG SegEs;
1634 ULONG SegDs;
1635 ULONG Edi;
1636 ULONG Esi;
1637 ULONG Ebx;
1638 ULONG Edx;
1639 ULONG Ecx;
1640 ULONG Eax;
1641 ULONG Ebp;
1642 ULONG Eip;
1643 ULONG SegCs;
1644 ULONG EFlags;
1645 ULONG Esp;
1646 ULONG SegSs;
1647 UCHAR ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];
1648 } CONTEXT;
1649
1650 typedef struct _KPCR_TIB {
1651 PVOID ExceptionList; /* 00 */
1652 PVOID StackBase; /* 04 */
1653 PVOID StackLimit; /* 08 */
1654 PVOID SubSystemTib; /* 0C */
1655 _ANONYMOUS_UNION union {
1656 PVOID FiberData; /* 10 */
1657 ULONG Version; /* 10 */
1658 } DUMMYUNIONNAME;
1659 PVOID ArbitraryUserPointer; /* 14 */
1660 struct _KPCR_TIB *Self; /* 18 */
1661 } KPCR_TIB, *PKPCR_TIB; /* 1C */
1662
1663 typedef struct _KPCR {
1664 KPCR_TIB Tib; /* 00 */
1665 struct _KPCR *Self; /* 1C */
1666 struct _KPRCB *Prcb; /* 20 */
1667 KIRQL Irql; /* 24 */
1668 ULONG IRR; /* 28 */
1669 ULONG IrrActive; /* 2C */
1670 ULONG IDR; /* 30 */
1671 PVOID KdVersionBlock; /* 34 */
1672 PUSHORT IDT; /* 38 */
1673 PUSHORT GDT; /* 3C */
1674 struct _KTSS *TSS; /* 40 */
1675 USHORT MajorVersion; /* 44 */
1676 USHORT MinorVersion; /* 46 */
1677 KAFFINITY SetMember; /* 48 */
1678 ULONG StallScaleFactor; /* 4C */
1679 UCHAR SpareUnused; /* 50 */
1680 UCHAR Number; /* 51 */
1681 UCHAR Spare0;
1682 UCHAR SecondLevelCacheAssociativity;
1683 ULONG VdmAlert;
1684 ULONG KernelReserved[14]; // For use by the kernel
1685 ULONG SecondLevelCacheSize;
1686 ULONG HalReserved[16]; // For use by Hal
1687 } KPCR, *PKPCR; /* 54 */
1688
1689 #define KeGetPcr() PCR
1690
1691 FORCEINLINE
1692 ULONG
1693 KeGetCurrentProcessorNumber(VOID)
1694 {
1695 return (ULONG)__readfsbyte(FIELD_OFFSET(KPCR, Number));
1696 }
1697
1698 extern NTKERNELAPI PVOID MmHighestUserAddress;
1699 extern NTKERNELAPI PVOID MmSystemRangeStart;
1700 extern NTKERNELAPI ULONG_PTR MmUserProbeAddress;
1701
1702 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
1703 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
1704 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
1705 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
1706 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000
1707
1708 #define MM_KSEG0_BASE MM_SYSTEM_RANGE_START
1709 #define MM_SYSTEM_SPACE_END 0xFFFFFFFF
1710
1711 #elif defined(__x86_64__)
1712
1713 #define CONTEXT_AMD64 0x100000
1714 #if !defined(RC_INVOKED)
1715 #define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L)
1716 #define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L)
1717 #define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L)
1718 #define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L)
1719 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L)
1720
1721 #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)
1722 #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS)
1723
1724 #define CONTEXT_EXCEPTION_ACTIVE 0x8000000
1725 #define CONTEXT_SERVICE_ACTIVE 0x10000000
1726 #define CONTEXT_EXCEPTION_REQUEST 0x40000000
1727 #define CONTEXT_EXCEPTION_REPORTING 0x80000000
1728 #endif
1729
1730 typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
1731 ULONG64 P1Home;
1732 ULONG64 P2Home;
1733 ULONG64 P3Home;
1734 ULONG64 P4Home;
1735 ULONG64 P5Home;
1736 ULONG64 P6Home;
1737
1738 /* Control flags */
1739 ULONG ContextFlags;
1740 ULONG MxCsr;
1741
1742 /* Segment */
1743 USHORT SegCs;
1744 USHORT SegDs;
1745 USHORT SegEs;
1746 USHORT SegFs;
1747 USHORT SegGs;
1748 USHORT SegSs;
1749 ULONG EFlags;
1750
1751 /* Debug */
1752 ULONG64 Dr0;
1753 ULONG64 Dr1;
1754 ULONG64 Dr2;
1755 ULONG64 Dr3;
1756 ULONG64 Dr6;
1757 ULONG64 Dr7;
1758
1759 /* Integer */
1760 ULONG64 Rax;
1761 ULONG64 Rcx;
1762 ULONG64 Rdx;
1763 ULONG64 Rbx;
1764 ULONG64 Rsp;
1765 ULONG64 Rbp;
1766 ULONG64 Rsi;
1767 ULONG64 Rdi;
1768 ULONG64 R8;
1769 ULONG64 R9;
1770 ULONG64 R10;
1771 ULONG64 R11;
1772 ULONG64 R12;
1773 ULONG64 R13;
1774 ULONG64 R14;
1775 ULONG64 R15;
1776
1777 /* Counter */
1778 ULONG64 Rip;
1779
1780 /* Floating point */
1781 union {
1782 XMM_SAVE_AREA32 FltSave;
1783 struct {
1784 M128A Header[2];
1785 M128A Legacy[8];
1786 M128A Xmm0;
1787 M128A Xmm1;
1788 M128A Xmm2;
1789 M128A Xmm3;
1790 M128A Xmm4;
1791 M128A Xmm5;
1792 M128A Xmm6;
1793 M128A Xmm7;
1794 M128A Xmm8;
1795 M128A Xmm9;
1796 M128A Xmm10;
1797 M128A Xmm11;
1798 M128A Xmm12;
1799 M128A Xmm13;
1800 M128A Xmm14;
1801 M128A Xmm15;
1802 } DUMMYSTRUCTNAME;
1803 } DUMMYUNIONNAME;
1804
1805 /* Vector */
1806 M128A VectorRegister[26];
1807 ULONG64 VectorControl;
1808
1809 /* Debug control */
1810 ULONG64 DebugControl;
1811 ULONG64 LastBranchToRip;
1812 ULONG64 LastBranchFromRip;
1813 ULONG64 LastExceptionToRip;
1814 ULONG64 LastExceptionFromRip;
1815 } CONTEXT;
1816
1817 #define PAGE_SIZE 0x1000
1818 #define PAGE_SHIFT 12L
1819 #define PTI_SHIFT 12L
1820 #define PDI_SHIFT 21L
1821 #define PPI_SHIFT 30L
1822 #define PXI_SHIFT 39L
1823 #define PTE_PER_PAGE 512
1824 #define PDE_PER_PAGE 512
1825 #define PPE_PER_PAGE 512
1826 #define PXE_PER_PAGE 512
1827 #define PTI_MASK_AMD64 (PTE_PER_PAGE - 1)
1828 #define PDI_MASK_AMD64 (PDE_PER_PAGE - 1)
1829 #define PPI_MASK (PPE_PER_PAGE - 1)
1830 #define PXI_MASK (PXE_PER_PAGE - 1)
1831
1832 #define PXE_BASE 0xFFFFF6FB7DBED000ULL
1833 #define PXE_SELFMAP 0xFFFFF6FB7DBEDF68ULL
1834 #define PPE_BASE 0xFFFFF6FB7DA00000ULL
1835 #define PDE_BASE 0xFFFFF6FB40000000ULL
1836 #define PTE_BASE 0xFFFFF68000000000ULL
1837 #define PXE_TOP 0xFFFFF6FB7DBEDFFFULL
1838 #define PPE_TOP 0xFFFFF6FB7DBFFFFFULL
1839 #define PDE_TOP 0xFFFFF6FB7FFFFFFFULL
1840 #define PTE_TOP 0xFFFFF6FFFFFFFFFFULL
1841
1842 extern NTKERNELAPI PVOID MmHighestUserAddress;
1843 extern NTKERNELAPI PVOID MmSystemRangeStart;
1844 extern NTKERNELAPI ULONG_PTR MmUserProbeAddress;
1845
1846 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
1847 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
1848 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
1849 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
1850 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xFFFF080000000000ULL
1851 #define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL
1852
1853 #define SharedUserData ((PKUSER_SHARED_DATA const)KI_USER_SHARED_DATA)
1854 #define SharedInterruptTime (&SharedUserData->InterruptTime)
1855 #define SharedSystemTime (&SharedUserData->SystemTime)
1856 #define SharedTickCount (&SharedUserData->TickCount)
1857
1858 #define KeQueryInterruptTime() \
1859 (*(volatile ULONG64*)SharedInterruptTime)
1860 #define KeQuerySystemTime(CurrentCount) \
1861 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime
1862 #define KeQueryTickCount(CurrentCount) \
1863 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount
1864
1865 typedef struct _KPCR
1866 {
1867 __GNU_EXTENSION union
1868 {
1869 NT_TIB NtTib;
1870 __GNU_EXTENSION struct
1871 {
1872 union _KGDTENTRY64 *GdtBase;
1873 struct _KTSS64 *TssBase;
1874 ULONG64 UserRsp;
1875 struct _KPCR *Self;
1876 struct _KPRCB *CurrentPrcb;
1877 PKSPIN_LOCK_QUEUE LockArray;
1878 PVOID Used_Self;
1879 };
1880 };
1881 union _KIDTENTRY64 *IdtBase;
1882 ULONG64 Unused[2];
1883 KIRQL Irql;
1884 UCHAR SecondLevelCacheAssociativity;
1885 UCHAR ObsoleteNumber;
1886 UCHAR Fill0;
1887 ULONG Unused0[3];
1888 USHORT MajorVersion;
1889 USHORT MinorVersion;
1890 ULONG StallScaleFactor;
1891 PVOID Unused1[3];
1892 ULONG KernelReserved[15];
1893 ULONG SecondLevelCacheSize;
1894 ULONG HalReserved[16];
1895 ULONG Unused2;
1896 PVOID KdVersionBlock;
1897 PVOID Unused3;
1898 ULONG PcrAlign1[24];
1899 } KPCR, *PKPCR;
1900
1901 typedef struct _KFLOATING_SAVE {
1902 ULONG Dummy;
1903 } KFLOATING_SAVE, *PKFLOATING_SAVE;
1904
1905 FORCEINLINE
1906 PKPCR
1907 KeGetPcr(VOID)
1908 {
1909 return (PKPCR)__readgsqword(FIELD_OFFSET(KPCR, Self));
1910 }
1911
1912 FORCEINLINE
1913 ULONG
1914 KeGetCurrentProcessorNumber(VOID)
1915 {
1916 return (ULONG)__readgsword(0x184);
1917 }
1918
1919 #elif defined(__PowerPC__)
1920
1921 //
1922 // Used to contain PFNs and PFN counts
1923 //
1924 typedef ULONG PFN_COUNT;
1925 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
1926 typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
1927
1928 #define PASSIVE_LEVEL 0
1929 #define LOW_LEVEL 0
1930 #define APC_LEVEL 1
1931 #define DISPATCH_LEVEL 2
1932 #define PROFILE_LEVEL 27
1933 #define CLOCK1_LEVEL 28
1934 #define CLOCK2_LEVEL 28
1935 #define IPI_LEVEL 29
1936 #define POWER_LEVEL 30
1937 #define HIGH_LEVEL 31
1938
1939 typedef struct _KFLOATING_SAVE {
1940 ULONG Dummy;
1941 } KFLOATING_SAVE, *PKFLOATING_SAVE;
1942
1943 typedef struct _KPCR_TIB {
1944 PVOID ExceptionList; /* 00 */
1945 PVOID StackBase; /* 04 */
1946 PVOID StackLimit; /* 08 */
1947 PVOID SubSystemTib; /* 0C */
1948 _ANONYMOUS_UNION union {
1949 PVOID FiberData; /* 10 */
1950 ULONG Version; /* 10 */
1951 } DUMMYUNIONNAME;
1952 PVOID ArbitraryUserPointer; /* 14 */
1953 struct _KPCR_TIB *Self; /* 18 */
1954 } KPCR_TIB, *PKPCR_TIB; /* 1C */
1955
1956 #define PCR_MINOR_VERSION 1
1957 #define PCR_MAJOR_VERSION 1
1958
1959 typedef struct _KPCR {
1960 KPCR_TIB Tib; /* 00 */
1961 struct _KPCR *Self; /* 1C */
1962 struct _KPRCB *Prcb; /* 20 */
1963 KIRQL Irql; /* 24 */
1964 ULONG IRR; /* 28 */
1965 ULONG IrrActive; /* 2C */
1966 ULONG IDR; /* 30 */
1967 PVOID KdVersionBlock; /* 34 */
1968 PUSHORT IDT; /* 38 */
1969 PUSHORT GDT; /* 3C */
1970 struct _KTSS *TSS; /* 40 */
1971 USHORT MajorVersion; /* 44 */
1972 USHORT MinorVersion; /* 46 */
1973 KAFFINITY SetMember; /* 48 */
1974 ULONG StallScaleFactor; /* 4C */
1975 UCHAR SpareUnused; /* 50 */
1976 UCHAR Number; /* 51 */
1977 } KPCR, *PKPCR; /* 54 */
1978
1979 #define KeGetPcr() PCR
1980
1981 static __inline
1982 ULONG
1983 DDKAPI
1984 KeGetCurrentProcessorNumber(VOID)
1985 {
1986 ULONG Number;
1987 __asm__ __volatile__ (
1988 "lwz %0, %c1(12)\n"
1989 : "=r" (Number)
1990 : "i" (FIELD_OFFSET(KPCR, Number))
1991 );
1992 return Number;
1993 }
1994
1995 #elif defined(_MIPS_)
1996
1997 #error MIPS Headers are totally incorrect
1998
1999 //
2000 // Used to contain PFNs and PFN counts
2001 //
2002 typedef ULONG PFN_COUNT;
2003 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
2004 typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
2005
2006 #define PASSIVE_LEVEL 0
2007 #define APC_LEVEL 1
2008 #define DISPATCH_LEVEL 2
2009 #define PROFILE_LEVEL 27
2010 #define IPI_LEVEL 29
2011 #define HIGH_LEVEL 31
2012
2013 typedef struct _KPCR {
2014 struct _KPRCB *Prcb; /* 20 */
2015 KIRQL Irql; /* 24 */
2016 ULONG IRR; /* 28 */
2017 ULONG IDR; /* 30 */
2018 } KPCR, *PKPCR;
2019
2020 #define KeGetPcr() PCR
2021
2022 typedef struct _KFLOATING_SAVE {
2023 } KFLOATING_SAVE, *PKFLOATING_SAVE;
2024
2025 static __inline
2026 ULONG
2027 DDKAPI
2028 KeGetCurrentProcessorNumber(VOID)
2029 {
2030 return 0;
2031 }
2032
2033 #elif defined(_M_ARM)
2034
2035 //
2036 // NT-ARM is not documented, need DDK-ARM
2037 //
2038 #include <armddk.h>
2039
2040 #else
2041 #error Unknown architecture
2042 #endif
2043
2044 typedef enum _INTERLOCKED_RESULT {
2045 ResultNegative = RESULT_NEGATIVE,
2046 ResultZero = RESULT_ZERO,
2047 ResultPositive = RESULT_POSITIVE
2048 } INTERLOCKED_RESULT;
2049
2050 typedef VOID
2051 (NTAPI *PciPin2Line)(
2052 IN struct _BUS_HANDLER *BusHandler,
2053 IN struct _BUS_HANDLER *RootHandler,
2054 IN PCI_SLOT_NUMBER SlotNumber,
2055 IN PPCI_COMMON_CONFIG PciData
2056 );
2057
2058 typedef VOID
2059 (NTAPI *PciLine2Pin)(
2060 IN struct _BUS_HANDLER *BusHandler,
2061 IN struct _BUS_HANDLER *RootHandler,
2062 IN PCI_SLOT_NUMBER SlotNumber,
2063 IN PPCI_COMMON_CONFIG PciNewData,
2064 IN PPCI_COMMON_CONFIG PciOldData
2065 );
2066
2067 typedef VOID
2068 (NTAPI *PciReadWriteConfig)(
2069 IN struct _BUS_HANDLER *BusHandler,
2070 IN PCI_SLOT_NUMBER Slot,
2071 IN PVOID Buffer,
2072 IN ULONG Offset,
2073 IN ULONG Length
2074 );
2075
2076 #define PCI_DATA_TAG ' ICP'
2077 #define PCI_DATA_VERSION 1
2078
2079 typedef struct _PCIBUSDATA
2080 {
2081 ULONG Tag;
2082 ULONG Version;
2083 PciReadWriteConfig ReadConfig;
2084 PciReadWriteConfig WriteConfig;
2085 PciPin2Line Pin2Line;
2086 PciLine2Pin Line2Pin;
2087 PCI_SLOT_NUMBER ParentSlot;
2088 PVOID Reserved[4];
2089 } PCIBUSDATA, *PPCIBUSDATA;
2090
2091
2092 /** SPINLOCK FUNCTIONS ********************************************************/
2093
2094 #if defined (_X86_)
2095
2096 #if defined(WIN9X_COMPAT_SPINLOCK)
2097
2098 NTKERNELAPI
2099 VOID
2100 NTAPI
2101 KeInitializeSpinLock(
2102 IN PKSPIN_LOCK SpinLock
2103 );
2104
2105 #else
2106
2107 FORCEINLINE
2108 VOID
2109 KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock)
2110 {
2111 /* Clear the lock */
2112 *SpinLock = 0;
2113 }
2114
2115 #endif
2116
2117 NTHALAPI
2118 KIRQL
2119 FASTCALL
2120 KfAcquireSpinLock(
2121 IN PKSPIN_LOCK SpinLock);
2122
2123 NTHALAPI
2124 VOID
2125 FASTCALL
2126 KfReleaseSpinLock(
2127 IN PKSPIN_LOCK SpinLock,
2128 IN KIRQL NewIrql);
2129
2130 NTKERNELAPI
2131 VOID
2132 FASTCALL
2133 KefAcquireSpinLockAtDpcLevel(
2134 IN PKSPIN_LOCK SpinLock);
2135
2136 NTKERNELAPI
2137 VOID
2138 FASTCALL
2139 KefReleaseSpinLockFromDpcLevel(
2140 IN PKSPIN_LOCK SpinLock);
2141
2142 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
2143 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
2144 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
2145 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
2146
2147 #define KeGetDcacheFillSize() 1L
2148
2149 #elif defined(_M_ARM) // !defined (_X86_)
2150
2151 FORCEINLINE
2152 VOID
2153 KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock)
2154 {
2155 /* Clear the lock */
2156 *SpinLock = 0;
2157 }
2158
2159 NTHALAPI
2160 KIRQL
2161 FASTCALL
2162 KfAcquireSpinLock(
2163 IN PKSPIN_LOCK SpinLock);
2164
2165 NTHALAPI
2166 VOID
2167 FASTCALL
2168 KfReleaseSpinLock(
2169 IN PKSPIN_LOCK SpinLock,
2170 IN KIRQL NewIrql);
2171
2172
2173 NTKERNELAPI
2174 VOID
2175 FASTCALL
2176 KefAcquireSpinLockAtDpcLevel(
2177 IN PKSPIN_LOCK SpinLock);
2178
2179 NTKERNELAPI
2180 VOID
2181 FASTCALL
2182 KefReleaseSpinLockFromDpcLevel(
2183 IN PKSPIN_LOCK SpinLock);
2184
2185
2186 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
2187 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
2188 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
2189 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
2190
2191 NTKERNELAPI
2192 VOID
2193 NTAPI
2194 KeInitializeSpinLock(
2195 IN PKSPIN_LOCK SpinLock);
2196
2197 #else
2198
2199 FORCEINLINE
2200 VOID
2201 NTAPI
2202 KeInitializeSpinLock(
2203 PKSPIN_LOCK SpinLock)
2204 {
2205 *SpinLock = 0;
2206 }
2207
2208 NTKERNELAPI
2209 VOID
2210 KeReleaseSpinLock(
2211 IN PKSPIN_LOCK SpinLock,
2212 IN KIRQL NewIrql);
2213
2214 NTKERNELAPI
2215 VOID
2216 KeAcquireSpinLockAtDpcLevel(
2217 IN PKSPIN_LOCK SpinLock);
2218
2219 NTKERNELAPI
2220 VOID
2221 KeReleaseSpinLockFromDpcLevel(
2222 IN PKSPIN_LOCK SpinLock);
2223
2224 NTKERNELAPI
2225 KIRQL
2226 KeAcquireSpinLockRaiseToDpc(
2227 IN PKSPIN_LOCK SpinLock);
2228
2229 #define KeAcquireSpinLock(SpinLock, OldIrql) \
2230 *(OldIrql) = KeAcquireSpinLockRaiseToDpc(SpinLock)
2231
2232 #endif // !defined (_X86_)
2233
2234 #define ARGUMENT_PRESENT(ArgumentPointer) \
2235 ((CHAR*)((ULONG_PTR)(ArgumentPointer)) != (CHAR*)NULL)
2236
2237 NTSYSAPI
2238 NTSTATUS
2239 NTAPI
2240 RtlCharToInteger(
2241 IN PCSZ String,
2242 IN ULONG Base OPTIONAL,
2243 IN OUT PULONG Value);
2244
2245 NTSYSAPI
2246 LONG
2247 NTAPI
2248 RtlCompareString(
2249 IN PSTRING String1,
2250 IN PSTRING String2,
2251 BOOLEAN CaseInSensitive);
2252
2253 #if !defined(MIDL_PASS)
2254
2255 FORCEINLINE
2256 LUID
2257 NTAPI
2258 RtlConvertLongToLuid(
2259 IN LONG Val)
2260 {
2261 LUID Luid;
2262 LARGE_INTEGER Temp;
2263
2264 Temp.QuadPart = Val;
2265 Luid.LowPart = Temp.u.LowPart;
2266 Luid.HighPart = Temp.u.HighPart;
2267
2268 return Luid;
2269 }
2270
2271 FORCEINLINE
2272 LUID
2273 NTAPI
2274 RtlConvertUlongToLuid(
2275 IN ULONG Val)
2276 {
2277 LUID Luid;
2278
2279 Luid.LowPart = Val;
2280 Luid.HighPart = 0;
2281
2282 return Luid;
2283 }
2284 #endif
2285
2286
2287 NTSYSAPI
2288 VOID
2289 NTAPI
2290 RtlCopyMemory32(
2291 IN VOID UNALIGNED *Destination,
2292 IN CONST VOID UNALIGNED *Source,
2293 IN ULONG Length);
2294
2295 NTSYSAPI
2296 VOID
2297 NTAPI
2298 RtlCopyString(
2299 IN OUT PSTRING DestinationString,
2300 IN PSTRING SourceString OPTIONAL);
2301
2302 NTSYSAPI
2303 BOOLEAN
2304 NTAPI
2305 RtlEqualString(
2306 IN PSTRING String1,
2307 IN PSTRING String2,
2308 IN BOOLEAN CaseInSensitive);
2309
2310 #if (defined(_M_AMD64) || defined(_M_IA64)) && !defined(_REALLY_GET_CALLERS_CALLER_)
2311 #define RtlGetCallersAddress(CallersAddress, CallersCaller) \
2312 *CallersAddress = (PVOID)_ReturnAddress(); \
2313 *CallersCaller = NULL;
2314 #else
2315 NTSYSAPI
2316 VOID
2317 NTAPI
2318 RtlGetCallersAddress(
2319 OUT PVOID *CallersAddress,
2320 OUT PVOID *CallersCaller);
2321 #endif
2322
2323 NTSYSAPI
2324 NTSTATUS
2325 NTAPI
2326 RtlGetVersion(
2327 IN OUT PRTL_OSVERSIONINFOW lpVersionInformation);
2328
2329 NTSYSAPI
2330 VOID
2331 NTAPI
2332 RtlMapGenericMask(
2333 IN OUT PACCESS_MASK AccessMask,
2334 IN PGENERIC_MAPPING GenericMapping);
2335
2336 NTSYSAPI
2337 BOOLEAN
2338 NTAPI
2339 RtlPrefixUnicodeString(
2340 IN PCUNICODE_STRING String1,
2341 IN PCUNICODE_STRING String2,
2342 IN BOOLEAN CaseInSensitive);
2343
2344 NTSYSAPI
2345 NTSTATUS
2346 NTAPI
2347 RtlUpcaseUnicodeString(
2348 IN OUT PUNICODE_STRING DestinationString OPTIONAL,
2349 IN PCUNICODE_STRING SourceString,
2350 IN BOOLEAN AllocateDestinationString);
2351
2352 NTSYSAPI
2353 CHAR
2354 NTAPI
2355 RtlUpperChar(
2356 IN CHAR Character);
2357
2358 NTSYSAPI
2359 VOID
2360 NTAPI
2361 RtlUpperString(
2362 IN OUT PSTRING DestinationString,
2363 IN PSTRING SourceString);
2364
2365 NTSYSAPI
2366 NTSTATUS
2367 NTAPI
2368 RtlVerifyVersionInfo(
2369 IN PRTL_OSVERSIONINFOEXW VersionInfo,
2370 IN ULONG TypeMask,
2371 IN ULONGLONG ConditionMask);
2372
2373 NTSYSAPI
2374 NTSTATUS
2375 NTAPI
2376 RtlVolumeDeviceToDosName(
2377 IN PVOID VolumeDeviceObject,
2378 OUT PUNICODE_STRING DosName);
2379
2380 NTSYSAPI
2381 ULONG
2382 NTAPI
2383 RtlWalkFrameChain(
2384 OUT PVOID *Callers,
2385 IN ULONG Count,
2386 IN ULONG Flags);
2387
2388 /******************************************************************************
2389 * Executive Types *
2390 ******************************************************************************/
2391
2392 typedef struct _ZONE_SEGMENT_HEADER {
2393 SINGLE_LIST_ENTRY SegmentList;
2394 PVOID Reserved;
2395 } ZONE_SEGMENT_HEADER, *PZONE_SEGMENT_HEADER;
2396
2397 typedef struct _ZONE_HEADER {
2398 SINGLE_LIST_ENTRY FreeList;
2399 SINGLE_LIST_ENTRY SegmentList;
2400 ULONG BlockSize;
2401 ULONG TotalSegmentSize;
2402 } ZONE_HEADER, *PZONE_HEADER;
2403
2404 #define PROTECTED_POOL 0x80000000
2405
2406 /******************************************************************************
2407 * Executive Functions *
2408 ******************************************************************************/
2409
2410 NTKERNELAPI
2411 NTSTATUS
2412 NTAPI
2413 ExExtendZone(
2414 IN PZONE_HEADER Zone,
2415 IN PVOID Segment,
2416 IN ULONG SegmentSize);
2417
2418 static __inline PVOID
2419 ExAllocateFromZone(
2420 IN PZONE_HEADER Zone)
2421 {
2422 if (Zone->FreeList.Next)
2423 Zone->FreeList.Next = Zone->FreeList.Next->Next;
2424 return (PVOID) Zone->FreeList.Next;
2425 }
2426
2427 static __inline PVOID
2428 ExFreeToZone(
2429 IN PZONE_HEADER Zone,
2430 IN PVOID Block)
2431 {
2432 ((PSINGLE_LIST_ENTRY) Block)->Next = Zone->FreeList.Next;
2433 Zone->FreeList.Next = ((PSINGLE_LIST_ENTRY) Block);
2434 return ((PSINGLE_LIST_ENTRY) Block)->Next;
2435 }
2436
2437 NTKERNELAPI
2438 NTSTATUS
2439 NTAPI
2440 ExInitializeZone(
2441 IN PZONE_HEADER Zone,
2442 IN ULONG BlockSize,
2443 IN PVOID InitialSegment,
2444 IN ULONG InitialSegmentSize);
2445
2446 /*
2447 * PVOID
2448 * ExInterlockedAllocateFromZone(
2449 * IN PZONE_HEADER Zone,
2450 * IN PKSPIN_LOCK Lock)
2451 */
2452 #define ExInterlockedAllocateFromZone(Zone, Lock) \
2453 ((PVOID) ExInterlockedPopEntryList(&Zone->FreeList, Lock))
2454
2455 NTKERNELAPI
2456 NTSTATUS
2457 NTAPI
2458 ExInterlockedExtendZone(
2459 IN PZONE_HEADER Zone,
2460 IN PVOID Segment,
2461 IN ULONG SegmentSize,
2462 IN PKSPIN_LOCK Lock);
2463
2464 /* PVOID
2465 * ExInterlockedFreeToZone(
2466 * IN PZONE_HEADER Zone,
2467 * IN PVOID Block,
2468 * IN PKSPIN_LOCK Lock);
2469 */
2470 #define ExInterlockedFreeToZone(Zone, Block, Lock) \
2471 ExInterlockedPushEntryList(&(Zone)->FreeList, (PSINGLE_LIST_ENTRY)(Block), Lock)
2472
2473 /*
2474 * BOOLEAN
2475 * ExIsFullZone(
2476 * IN PZONE_HEADER Zone)
2477 */
2478 #define ExIsFullZone(Zone) \
2479 ((Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY) NULL)
2480
2481 /* BOOLEAN
2482 * ExIsObjectInFirstZoneSegment(
2483 * IN PZONE_HEADER Zone,
2484 * IN PVOID Object);
2485 */
2486 #define ExIsObjectInFirstZoneSegment(Zone,Object) \
2487 ((BOOLEAN)( ((PUCHAR)(Object) >= (PUCHAR)(Zone)->SegmentList.Next) && \
2488 ((PUCHAR)(Object) < (PUCHAR)(Zone)->SegmentList.Next + \
2489 (Zone)->TotalSegmentSize)) )
2490
2491 NTKERNELAPI
2492 DECLSPEC_NORETURN
2493 VOID
2494 NTAPI
2495 ExRaiseAccessViolation(
2496 VOID);
2497
2498 NTKERNELAPI
2499 DECLSPEC_NORETURN
2500 VOID
2501 NTAPI
2502 ExRaiseDatatypeMisalignment(
2503 VOID);
2504
2505 NTKERNELAPI
2506 NTSTATUS
2507 NTAPI
2508 ExUuidCreate(
2509 OUT UUID *Uuid);
2510
2511 #define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite
2512 #define ExAcquireResourceShared ExAcquireResourceSharedLite
2513 #define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite
2514 #define ExDeleteResource ExDeleteResourceLite
2515 #define ExInitializeResource ExInitializeResourceLite
2516 #define ExIsResourceAcquiredExclusive ExIsResourceAcquiredExclusiveLite
2517 #define ExIsResourceAcquiredShared ExIsResourceAcquiredSharedLite
2518 #define ExIsResourceAcquired ExIsResourceAcquiredSharedLite
2519 #define ExReleaseResourceForThread ExReleaseResourceForThreadLite
2520
2521 /** Filesystem runtime library routines **/
2522
2523 NTKERNELAPI
2524 BOOLEAN
2525 NTAPI
2526 FsRtlIsTotalDeviceFailure(
2527 IN NTSTATUS Status);
2528
2529 /** Hardware abstraction layer routines **/
2530
2531 NTHALAPI
2532 BOOLEAN
2533 NTAPI
2534 HalMakeBeep(
2535 IN ULONG Frequency);
2536
2537 NTKERNELAPI
2538 VOID
2539 FASTCALL
2540 HalExamineMBR(
2541 IN PDEVICE_OBJECT DeviceObject,
2542 IN ULONG SectorSize,
2543 IN ULONG MBRTypeIdentifier,
2544 OUT PVOID *Buffer);
2545
2546 VOID
2547 NTAPI
2548 HalPutDmaAdapter(
2549 PADAPTER_OBJECT AdapterObject
2550 );
2551
2552 /** I/O manager routines **/
2553
2554 NTKERNELAPI
2555 VOID
2556 NTAPI
2557 IoAllocateController(
2558 IN PCONTROLLER_OBJECT ControllerObject,
2559 IN PDEVICE_OBJECT DeviceObject,
2560 IN PDRIVER_CONTROL ExecutionRoutine,
2561 IN PVOID Context);
2562
2563 /*
2564 * VOID IoAssignArcName(
2565 * IN PUNICODE_STRING ArcName,
2566 * IN PUNICODE_STRING DeviceName);
2567 */
2568 #define IoAssignArcName(_ArcName, _DeviceName) ( \
2569 IoCreateSymbolicLink((_ArcName), (_DeviceName)))
2570
2571 NTKERNELAPI
2572 VOID
2573 NTAPI
2574 IoCancelFileOpen(
2575 IN PDEVICE_OBJECT DeviceObject,
2576 IN PFILE_OBJECT FileObject);
2577
2578 NTKERNELAPI
2579 PCONTROLLER_OBJECT
2580 NTAPI
2581 IoCreateController(
2582 IN ULONG Size);
2583
2584 NTKERNELAPI
2585 NTSTATUS
2586 NTAPI
2587 IoCreateDisk(
2588 IN PDEVICE_OBJECT DeviceObject,
2589 IN PCREATE_DISK Disk);
2590
2591 NTKERNELAPI
2592 VOID
2593 NTAPI
2594 IoDeleteController(
2595 IN PCONTROLLER_OBJECT ControllerObject);
2596
2597 /*
2598 * VOID
2599 * IoDeassignArcName(
2600 * IN PUNICODE_STRING ArcName)
2601 */
2602 #define IoDeassignArcName IoDeleteSymbolicLink
2603
2604 NTKERNELAPI
2605 VOID
2606 NTAPI
2607 IoFreeController(
2608 IN PCONTROLLER_OBJECT ControllerObject);
2609
2610 NTKERNELAPI
2611 PCONFIGURATION_INFORMATION
2612 NTAPI
2613 IoGetConfigurationInformation(
2614 VOID);
2615
2616 NTKERNELAPI
2617 PDEVICE_OBJECT
2618 NTAPI
2619 IoGetDeviceToVerify(
2620 IN PETHREAD Thread);
2621
2622 NTKERNELAPI
2623 PGENERIC_MAPPING
2624 NTAPI
2625 IoGetFileObjectGenericMapping(
2626 VOID);
2627
2628 NTKERNELAPI
2629 PIRP
2630 NTAPI
2631 IoMakeAssociatedIrp(
2632 IN PIRP Irp,
2633 IN CCHAR StackSize);
2634
2635 NTKERNELAPI
2636 NTSTATUS
2637 NTAPI
2638 IoQueryDeviceDescription(
2639 IN PINTERFACE_TYPE BusType OPTIONAL,
2640 IN PULONG BusNumber OPTIONAL,
2641 IN PCONFIGURATION_TYPE ControllerType OPTIONAL,
2642 IN PULONG ControllerNumber OPTIONAL,
2643 IN PCONFIGURATION_TYPE PeripheralType OPTIONAL,
2644 IN PULONG PeripheralNumber OPTIONAL,
2645 IN PIO_QUERY_DEVICE_ROUTINE CalloutRoutine,
2646 IN PVOID Context);
2647
2648 NTKERNELAPI
2649 VOID
2650 NTAPI
2651 IoRaiseHardError(
2652 IN PIRP Irp,
2653 IN PVPB Vpb OPTIONAL,
2654 IN PDEVICE_OBJECT RealDeviceObject);
2655
2656 NTKERNELAPI
2657 BOOLEAN
2658 NTAPI
2659 IoRaiseInformationalHardError(
2660 IN NTSTATUS ErrorStatus,
2661 IN PUNICODE_STRING String OPTIONAL,
2662 IN PKTHREAD Thread OPTIONAL);
2663
2664 NTKERNELAPI
2665 NTSTATUS
2666 NTAPI
2667 IoReadDiskSignature(
2668 IN PDEVICE_OBJECT DeviceObject,
2669 IN ULONG BytesPerSector,
2670 OUT PDISK_SIGNATURE Signature);
2671
2672 NTKERNELAPI
2673 NTSTATUS
2674 FASTCALL
2675 IoReadPartitionTable(
2676 IN PDEVICE_OBJECT DeviceObject,
2677 IN ULONG SectorSize,
2678 IN BOOLEAN ReturnRecognizedPartitions,
2679 OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer);
2680
2681 NTKERNELAPI
2682 NTSTATUS
2683 NTAPI
2684 IoReadPartitionTableEx(
2685 IN PDEVICE_OBJECT DeviceObject,
2686 IN struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer);
2687
2688 NTKERNELAPI
2689 VOID
2690 NTAPI
2691 IoRegisterBootDriverReinitialization(
2692 IN PDRIVER_OBJECT DriverObject,
2693 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
2694 IN PVOID Context);
2695
2696 NTKERNELAPI
2697 VOID
2698 NTAPI
2699 IoRegisterBootDriverReinitialization(
2700 IN PDRIVER_OBJECT DriverObject,
2701 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
2702 IN PVOID Context);
2703
2704 NTKERNELAPI
2705 VOID
2706 NTAPI
2707 IoRegisterDriverReinitialization(
2708 IN PDRIVER_OBJECT DriverObject,
2709 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
2710 IN PVOID Context);
2711
2712 NTKERNELAPI
2713 NTSTATUS
2714 NTAPI
2715 IoReportDetectedDevice(
2716 IN PDRIVER_OBJECT DriverObject,
2717 IN INTERFACE_TYPE LegacyBusType,
2718 IN ULONG BusNumber,
2719 IN ULONG SlotNumber,
2720 IN PCM_RESOURCE_LIST ResourceList,
2721 IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL,
2722 IN BOOLEAN ResourceAssigned,
2723 IN OUT PDEVICE_OBJECT *DeviceObject);
2724
2725 NTKERNELAPI
2726 NTSTATUS
2727 NTAPI
2728 IoReportResourceForDetection(
2729 IN PDRIVER_OBJECT DriverObject,
2730 IN PCM_RESOURCE_LIST DriverList OPTIONAL,
2731 IN ULONG DriverListSize OPTIONAL,
2732 IN PDEVICE_OBJECT DeviceObject OPTIONAL,
2733 IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
2734 IN ULONG DeviceListSize OPTIONAL,
2735 OUT PBOOLEAN ConflictDetected);
2736
2737 NTKERNELAPI
2738 NTSTATUS
2739 NTAPI
2740 IoReportResourceUsage(
2741 IN PUNICODE_STRING DriverClassName OPTIONAL,
2742 IN PDRIVER_OBJECT DriverObject,
2743 IN PCM_RESOURCE_LIST DriverList OPTIONAL,
2744 IN ULONG DriverListSize OPTIONAL,
2745 IN PDEVICE_OBJECT DeviceObject,
2746 IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
2747 IN ULONG DeviceListSize OPTIONAL,
2748 IN BOOLEAN OverrideConflict,
2749 OUT PBOOLEAN ConflictDetected);
2750
2751 NTKERNELAPI
2752 VOID
2753 NTAPI
2754 IoSetHardErrorOrVerifyDevice(
2755 IN PIRP Irp,
2756 IN PDEVICE_OBJECT DeviceObject);
2757
2758 NTKERNELAPI
2759 NTSTATUS
2760 FASTCALL
2761 IoSetPartitionInformation(
2762 IN PDEVICE_OBJECT DeviceObject,
2763 IN ULONG SectorSize,
2764 IN ULONG PartitionNumber,
2765 IN ULONG PartitionType);
2766
2767 NTKERNELAPI
2768 NTSTATUS
2769 NTAPI
2770 IoSetPartitionInformationEx(
2771 IN PDEVICE_OBJECT DeviceObject,
2772 IN ULONG PartitionNumber,
2773 IN struct _SET_PARTITION_INFORMATION_EX *PartitionInfo);
2774
2775 NTKERNELAPI
2776 NTSTATUS
2777 NTAPI
2778 IoSetSystemPartition(
2779 IN PUNICODE_STRING VolumeNameString);
2780
2781 NTKERNELAPI
2782 BOOLEAN
2783 NTAPI
2784 IoSetThreadHardErrorMode(
2785 IN BOOLEAN EnableHardErrors);
2786
2787 NTKERNELAPI
2788 NTSTATUS
2789 NTAPI
2790 IoVerifyPartitionTable(
2791 IN PDEVICE_OBJECT DeviceObject,
2792 IN BOOLEAN FixErrors);
2793
2794 NTKERNELAPI
2795 NTSTATUS
2796 NTAPI
2797 IoVolumeDeviceToDosName(
2798 IN PVOID VolumeDeviceObject,
2799 OUT PUNICODE_STRING DosName);
2800
2801 NTKERNELAPI
2802 NTSTATUS
2803 FASTCALL
2804 IoWritePartitionTable(
2805 IN PDEVICE_OBJECT DeviceObject,
2806 IN ULONG SectorSize,
2807 IN ULONG SectorsPerTrack,
2808 IN ULONG NumberOfHeads,
2809 IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer);
2810
2811 NTKERNELAPI
2812 NTSTATUS
2813 NTAPI
2814 IoWritePartitionTableEx(
2815 IN PDEVICE_OBJECT DeviceObject,
2816 IN struct _DRIVE_LAYOUT_INFORMATION_EX *PartitionBuffer);
2817
2818 /** Kernel routines **/
2819
2820 NTKERNELAPI
2821 DECLSPEC_NORETURN
2822 VOID
2823 NTAPI
2824 KeBugCheck(
2825 IN ULONG BugCheckCode);
2826
2827 #ifdef _X86_
2828
2829 static __inline
2830 VOID
2831 KeMemoryBarrier(
2832 VOID)
2833 {
2834 volatile LONG Barrier;
2835 #if defined(__GNUC__)
2836 __asm__ __volatile__ ("xchg %%eax, %0" : : "m" (Barrier) : "%eax");
2837 #elif defined(_MSC_VER)
2838 __asm xchg [Barrier], eax
2839 #endif
2840 }
2841
2842 #endif
2843
2844 NTKERNELAPI
2845 LONG
2846 NTAPI
2847 KePulseEvent(
2848 IN PRKEVENT Event,
2849 IN KPRIORITY Increment,
2850 IN BOOLEAN Wait);
2851
2852 NTKERNELAPI
2853 KAFFINITY
2854 NTAPI
2855 KeQueryActiveProcessors(
2856 VOID
2857 );
2858
2859 NTHALAPI
2860 LARGE_INTEGER
2861 NTAPI
2862 KeQueryPerformanceCounter(
2863 OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL);
2864
2865 NTKERNELAPI
2866 KPRIORITY
2867 NTAPI
2868 KeQueryPriorityThread(
2869 IN PRKTHREAD Thread);
2870
2871 NTKERNELAPI
2872 ULONG
2873 NTAPI
2874 KeQueryRuntimeThread(
2875 IN PKTHREAD Thread,
2876 OUT PULONG UserTime);
2877
2878 #if !defined(_M_AMD64)
2879 NTKERNELAPI
2880 ULONGLONG
2881 NTAPI
2882 KeQueryInterruptTime(
2883 VOID);
2884
2885 NTKERNELAPI
2886 VOID
2887 NTAPI
2888 KeQuerySystemTime(
2889 OUT PLARGE_INTEGER CurrentTime);
2890
2891 NTKERNELAPI
2892 VOID
2893 NTAPI
2894 KeQueryTickCount(
2895 OUT PLARGE_INTEGER TickCount);
2896 #endif
2897
2898 NTKERNELAPI
2899 ULONG
2900 NTAPI
2901 KeQueryTimeIncrement(
2902 VOID);
2903
2904 NTKERNELAPI
2905 LONG
2906 NTAPI
2907 KeReadStateEvent(
2908 IN PRKEVENT Event);
2909
2910 NTKERNELAPI
2911 LONG
2912 NTAPI
2913 KeReadStateMutex(
2914 IN PRKMUTEX Mutex);
2915
2916
2917 NTKERNELAPI
2918 LONG
2919 NTAPI
2920 KeReadStateSemaphore(
2921 IN PRKSEMAPHORE Semaphore);
2922
2923 NTKERNELAPI
2924 BOOLEAN
2925 NTAPI
2926 KeReadStateTimer(
2927 IN PKTIMER Timer);
2928
2929 NTKERNELAPI
2930 BOOLEAN
2931 NTAPI
2932 KeRegisterBugCheckCallback(
2933 IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord,
2934 IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine,
2935 IN PVOID Buffer,
2936 IN ULONG Length,
2937 IN PUCHAR Component);
2938
2939 NTKERNELAPI
2940 PVOID
2941 NTAPI
2942 KeRegisterNmiCallback(
2943 IN PNMI_CALLBACK CallbackRoutine,
2944 IN PVOID Context
2945 );
2946
2947 NTKERNELAPI
2948 NTSTATUS
2949 NTAPI
2950 KeDeregisterNmiCallback(
2951 IN PVOID Handle
2952 );
2953
2954 NTKERNELAPI
2955 VOID
2956 FASTCALL
2957 KeReleaseInStackQueuedSpinLockFromDpcLevel(
2958 IN PKLOCK_QUEUE_HANDLE LockHandle);
2959
2960 NTKERNELAPI
2961 VOID
2962 NTAPI
2963 KeReleaseInterruptSpinLock(
2964 IN PKINTERRUPT Interrupt,
2965 IN KIRQL OldIrql);
2966
2967 NTKERNELAPI
2968 LONG
2969 NTAPI
2970 KeReleaseMutex(
2971 IN PRKMUTEX Mutex,
2972 IN BOOLEAN Wait);
2973
2974 NTKERNELAPI
2975 LONG
2976 NTAPI
2977 KeReleaseSemaphore(
2978 IN PRKSEMAPHORE Semaphore,
2979 IN KPRIORITY Increment,
2980 IN LONG Adjustment,
2981 IN BOOLEAN Wait);
2982
2983 NTKERNELAPI
2984 PKDEVICE_QUEUE_ENTRY
2985 NTAPI
2986 KeRemoveByKeyDeviceQueue(
2987 IN PKDEVICE_QUEUE DeviceQueue,
2988 IN ULONG SortKey);
2989
2990 NTKERNELAPI
2991 PKDEVICE_QUEUE_ENTRY
2992 NTAPI
2993 KeRemoveDeviceQueue(
2994 IN PKDEVICE_QUEUE DeviceQueue);
2995
2996 NTKERNELAPI
2997 BOOLEAN
2998 NTAPI
2999 KeRemoveEntryDeviceQueue(
3000 IN PKDEVICE_QUEUE DeviceQueue,
3001 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
3002
3003 NTKERNELAPI
3004 BOOLEAN
3005 NTAPI
3006 KeRemoveQueueDpc(
3007 IN PRKDPC Dpc);
3008
3009 NTKERNELAPI
3010 LONG
3011 NTAPI
3012 KeResetEvent(
3013 IN PRKEVENT Event);
3014
3015 NTKERNELAPI
3016 NTSTATUS
3017 NTAPI
3018 KeRestoreFloatingPointState(
3019 IN PKFLOATING_SAVE FloatSave);
3020
3021 NTKERNELAPI
3022 VOID
3023 NTAPI
3024 KeRevertToUserAffinityThread(VOID);
3025
3026 NTKERNELAPI
3027 NTSTATUS
3028 NTAPI
3029 KeSaveFloatingPointState(
3030 OUT PKFLOATING_SAVE FloatSave);
3031
3032 NTKERNELAPI
3033 LONG
3034 NTAPI
3035 KeSetBasePriorityThread(
3036 IN PRKTHREAD Thread,
3037 IN LONG Increment);
3038
3039 NTKERNELAPI
3040 LONG
3041 NTAPI
3042 KeSetEvent(
3043 IN PRKEVENT Event,
3044 IN KPRIORITY Increment,
3045 IN BOOLEAN Wait);
3046
3047 NTKERNELAPI
3048 VOID
3049 NTAPI
3050 KeSetImportanceDpc(
3051 IN PRKDPC Dpc,
3052 IN KDPC_IMPORTANCE Importance);
3053
3054 NTKERNELAPI
3055 KPRIORITY
3056 NTAPI
3057 KeSetPriorityThread(
3058 IN PKTHREAD Thread,
3059 IN KPRIORITY Priority);
3060
3061 NTKERNELAPI
3062 VOID
3063 NTAPI
3064 KeSetSystemAffinityThread(
3065 IN KAFFINITY Affinity);
3066
3067 NTKERNELAPI
3068 VOID
3069 NTAPI
3070 KeSetTargetProcessorDpc(
3071 IN PRKDPC Dpc,
3072 IN CCHAR Number);
3073
3074 NTKERNELAPI
3075 BOOLEAN
3076 NTAPI
3077 KeSetTimer(
3078 IN PKTIMER Timer,
3079 IN LARGE_INTEGER DueTime,
3080 IN PKDPC Dpc OPTIONAL);
3081
3082 NTKERNELAPI
3083 BOOLEAN
3084 NTAPI
3085 KeSetTimerEx(
3086 IN PKTIMER Timer,
3087 IN LARGE_INTEGER DueTime,
3088 IN LONG Period OPTIONAL,
3089 IN PKDPC Dpc OPTIONAL);
3090
3091 NTKERNELAPI
3092 VOID
3093 FASTCALL
3094 KeSetTimeUpdateNotifyRoutine(
3095 IN PTIME_UPDATE_NOTIFY_ROUTINE NotifyRoutine);
3096
3097 NTHALAPI
3098 VOID
3099 NTAPI
3100 KeStallExecutionProcessor(
3101 IN ULONG MicroSeconds);
3102
3103 NTKERNELAPI
3104 BOOLEAN
3105 NTAPI
3106 KeSynchronizeExecution(
3107 IN PKINTERRUPT Interrupt,
3108 IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine,
3109 IN PVOID SynchronizeContext);
3110
3111 NTKERNELAPI
3112 NTSTATUS
3113 NTAPI
3114 KeWaitForMultipleObjects(
3115 IN ULONG Count,
3116 IN PVOID Object[],
3117 IN WAIT_TYPE WaitType,
3118 IN KWAIT_REASON WaitReason,
3119 IN KPROCESSOR_MODE WaitMode,
3120 IN BOOLEAN Alertable,
3121 IN PLARGE_INTEGER Timeout OPTIONAL,
3122 IN PKWAIT_BLOCK WaitBlockArray OPTIONAL);
3123
3124 NTKERNELAPI
3125 NTSTATUS
3126 NTAPI
3127 KeWaitForMutexObject(
3128 IN PRKMUTEX Mutex,
3129 IN KWAIT_REASON WaitReason,
3130 IN KPROCESSOR_MODE WaitMode,
3131 IN BOOLEAN Alertable,
3132 IN PLARGE_INTEGER Timeout OPTIONAL);
3133
3134 NTKERNELAPI
3135 NTSTATUS
3136 NTAPI
3137 KeWaitForSingleObject(
3138 IN PVOID Object,
3139 IN KWAIT_REASON WaitReason,
3140 IN KPROCESSOR_MODE WaitMode,
3141 IN BOOLEAN Alertable,
3142 IN PLARGE_INTEGER Timeout OPTIONAL);
3143
3144 typedef
3145 ULONG_PTR
3146 (NTAPI *PKIPI_BROADCAST_WORKER)(
3147 IN ULONG_PTR Argument
3148 );
3149
3150 NTKERNELAPI
3151 ULONG_PTR
3152 NTAPI
3153 KeIpiGenericCall(
3154 IN PKIPI_BROADCAST_WORKER BroadcastFunction,
3155 IN ULONG_PTR Context
3156 );
3157
3158 #if defined(_X86_)
3159
3160 NTHALAPI
3161 VOID
3162 FASTCALL
3163 KfLowerIrql(
3164 IN KIRQL NewIrql);
3165
3166 NTHALAPI
3167 KIRQL
3168 FASTCALL
3169 KfRaiseIrql(
3170 IN KIRQL NewIrql);
3171
3172 NTHALAPI
3173 KIRQL
3174 DDKAPI
3175 KeRaiseIrqlToDpcLevel(
3176 VOID);
3177
3178 NTHALAPI
3179 KIRQL
3180 DDKAPI
3181 KeRaiseIrqlToSynchLevel(
3182 VOID);
3183
3184 #define KeLowerIrql(a) KfLowerIrql(a)
3185 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
3186
3187 #elif defined(_M_AMD64)
3188
3189 FORCEINLINE
3190 KIRQL
3191 KeGetCurrentIrql(VOID)
3192 {
3193 return (KIRQL)__readcr8();
3194 }
3195
3196 FORCEINLINE
3197 VOID
3198 KeLowerIrql(IN KIRQL NewIrql)
3199 {
3200 ASSERT(KeGetCurrentIrql() >= NewIrql);
3201 __writecr8(NewIrql);
3202 }
3203
3204 FORCEINLINE
3205 KIRQL
3206 KfRaiseIrql(IN KIRQL NewIrql)
3207 {
3208 KIRQL OldIrql;
3209
3210 OldIrql = __readcr8();
3211 ASSERT(OldIrql <= NewIrql);
3212 __writecr8(NewIrql);
3213 return OldIrql;
3214 }
3215 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
3216
3217 FORCEINLINE
3218 KIRQL
3219 KeRaiseIrqlToDpcLevel(VOID)
3220 {
3221 return KfRaiseIrql(DISPATCH_LEVEL);
3222 }
3223
3224 FORCEINLINE
3225 KIRQL
3226 KeRaiseIrqlToSynchLevel(VOID)
3227 {
3228 return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2
3229 }
3230
3231 #elif defined(__PowerPC__)
3232
3233 NTHALAPI
3234 VOID
3235 FASTCALL
3236 KfLowerIrql(
3237 IN KIRQL NewIrql);
3238
3239 NTHALAPI
3240 KIRQL
3241 FASTCALL
3242 KfRaiseIrql(
3243 IN KIRQL NewIrql);
3244
3245 NTHALAPI
3246 KIRQL
3247 DDKAPI
3248 KeRaiseIrqlToDpcLevel(
3249 VOID);
3250
3251 NTHALAPI
3252 KIRQL
3253 DDKAPI
3254 KeRaiseIrqlToSynchLevel(
3255 VOID);
3256
3257 #define KeLowerIrql(a) KfLowerIrql(a)
3258 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
3259
3260 #elif defined(_M_MIPS)
3261
3262 #define KeLowerIrql(a) KfLowerIrql(a)
3263 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
3264
3265 NTKERNELAPI
3266 VOID
3267 NTAPI
3268 KfLowerIrql(
3269 IN KIRQL NewIrql);
3270
3271 NTKERNELAPI
3272 KIRQL
3273 NTAPI
3274 KfRaiseIrql(
3275 IN KIRQL NewIrql);
3276
3277 NTKERNELAPI
3278 KIRQL
3279 NTAPI
3280 KeRaiseIrqlToDpcLevel(
3281 VOID);
3282
3283 NTKERNELAPI
3284 KIRQL
3285 DDKAPI
3286 KeRaiseIrqlToSynchLevel(
3287 VOID);
3288
3289 #elif defined(_M_ARM)
3290
3291 #include <armddk.h>
3292
3293 #else
3294
3295 NTKERNELAPI
3296 VOID
3297 NTAPI
3298 KeLowerIrql(
3299 IN KIRQL NewIrql);
3300
3301 NTKERNELAPI
3302 VOID
3303 NTAPI
3304 KeRaiseIrql(
3305 IN KIRQL NewIrql,
3306 OUT PKIRQL OldIrql);
3307
3308 NTKERNELAPI
3309 KIRQL
3310 NTAPI
3311 KeRaiseIrqlToDpcLevel(
3312 VOID);
3313
3314 NTKERNELAPI
3315 KIRQL
3316 DDKAPI
3317 KeRaiseIrqlToSynchLevel(
3318 VOID);
3319
3320 #endif
3321
3322 /** Memory manager routines **/
3323
3324 NTKERNELAPI
3325 NTSTATUS
3326 NTAPI
3327 MmAdvanceMdl(
3328 IN PMDL Mdl,
3329 IN ULONG NumberOfBytes);
3330
3331 NTKERNELAPI
3332 PVOID
3333 NTAPI
3334 MmAllocateContiguousMemory(
3335 IN ULONG NumberOfBytes,
3336 IN PHYSICAL_ADDRESS HighestAcceptableAddress);
3337
3338 NTKERNELAPI
3339 PVOID
3340 NTAPI
3341 MmAllocateContiguousMemorySpecifyCache(
3342 IN SIZE_T NumberOfBytes,
3343 IN PHYSICAL_ADDRESS LowestAcceptableAddress,
3344 IN PHYSICAL_ADDRESS HighestAcceptableAddress,
3345 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
3346 IN MEMORY_CACHING_TYPE CacheType);
3347
3348 NTKERNELAPI
3349 PVOID
3350 NTAPI
3351 MmAllocateMappingAddress(
3352 IN SIZE_T NumberOfBytes,
3353 IN ULONG PoolTag);
3354
3355 NTKERNELAPI
3356 PVOID
3357 NTAPI
3358 MmAllocateNonCachedMemory(
3359 IN ULONG NumberOfBytes);
3360
3361 NTKERNELAPI
3362 PMDL
3363 NTAPI
3364 MmAllocatePagesForMdl(
3365 IN PHYSICAL_ADDRESS LowAddress,
3366 IN PHYSICAL_ADDRESS HighAddress,
3367 IN PHYSICAL_ADDRESS SkipBytes,
3368 IN SIZE_T TotalBytes);
3369
3370 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
3371 NTKERNELAPI
3372 PMDL
3373 NTAPI
3374 MmAllocatePagesForMdlEx(
3375 IN PHYSICAL_ADDRESS LowAddress,
3376 IN PHYSICAL_ADDRESS HighAddress,
3377 IN PHYSICAL_ADDRESS SkipBytes,
3378 IN SIZE_T TotalBytes,
3379 IN MEMORY_CACHING_TYPE CacheType,
3380 IN ULONG Flags);
3381 #endif
3382
3383 NTKERNELAPI
3384 VOID
3385 NTAPI
3386 MmBuildMdlForNonPagedPool(
3387 IN OUT PMDL MemoryDescriptorList);
3388
3389 typedef enum _MMFLUSH_TYPE {
3390 MmFlushForDelete,
3391 MmFlushForWrite
3392 } MMFLUSH_TYPE;
3393
3394 NTKERNELAPI
3395 BOOLEAN
3396 NTAPI
3397 MmFlushImageSection(
3398 IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
3399 IN MMFLUSH_TYPE FlushType);
3400
3401 NTKERNELAPI
3402 VOID
3403 NTAPI
3404 MmFreeContiguousMemory(
3405 IN PVOID BaseAddress);
3406
3407 NTKERNELAPI
3408 VOID
3409 NTAPI
3410 MmFreeContiguousMemorySpecifyCache(
3411 IN PVOID BaseAddress,
3412 IN SIZE_T NumberOfBytes,
3413 IN MEMORY_CACHING_TYPE CacheType);
3414
3415 NTKERNELAPI
3416 VOID
3417 NTAPI
3418 MmFreeMappingAddress(
3419 IN PVOID BaseAddress,
3420 IN ULONG PoolTag);
3421
3422 NTKERNELAPI
3423 VOID
3424 NTAPI
3425 MmFreeNonCachedMemory(
3426 IN PVOID BaseAddress,
3427 IN SIZE_T NumberOfBytes);
3428
3429 NTKERNELAPI
3430 VOID
3431 NTAPI
3432 MmFreePagesFromMdl(
3433 IN PMDL MemoryDescriptorList);
3434
3435 /*
3436 * ULONG
3437 * MmGetMdlByteCount(
3438 * IN PMDL Mdl)
3439 */
3440 #define MmGetMdlByteCount(_Mdl) \
3441 ((_Mdl)->ByteCount)
3442
3443 /*
3444 * ULONG
3445 * MmGetMdlByteOffset(
3446 * IN PMDL Mdl)
3447 */
3448 #define MmGetMdlByteOffset(_Mdl) \
3449 ((_Mdl)->ByteOffset)
3450
3451 /*
3452 * PPFN_NUMBER
3453 * MmGetMdlPfnArray(
3454 * IN PMDL Mdl)
3455 */
3456 #define MmGetMdlPfnArray(_Mdl) \
3457 ((PPFN_NUMBER) ((_Mdl) + 1))
3458
3459 /*
3460 * PVOID
3461 * MmGetMdlVirtualAddress(
3462 * IN PMDL Mdl)
3463 */
3464 #define MmGetMdlVirtualAddress(_Mdl) \
3465 ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
3466
3467 NTKERNELAPI
3468 PHYSICAL_ADDRESS
3469 NTAPI
3470 MmGetPhysicalAddress(
3471 IN PVOID BaseAddress);
3472
3473 NTKERNELAPI
3474 PPHYSICAL_MEMORY_RANGE
3475 NTAPI
3476 MmGetPhysicalMemoryRanges(
3477 VOID);
3478
3479 NTKERNELAPI
3480 PVOID
3481 NTAPI
3482 MmGetVirtualForPhysical(
3483 IN PHYSICAL_ADDRESS PhysicalAddress);
3484
3485 NTKERNELAPI
3486 PVOID
3487 NTAPI
3488 MmMapLockedPagesSpecifyCache(
3489 IN PMDL MemoryDescriptorList,
3490 IN KPROCESSOR_MODE AccessMode,
3491 IN MEMORY_CACHING_TYPE CacheType,
3492 IN PVOID BaseAddress,
3493 IN ULONG BugCheckOnFailure,
3494 IN MM_PAGE_PRIORITY Priority);
3495
3496 NTKERNELAPI
3497 PVOID
3498 NTAPI
3499 MmMapLockedPagesWithReservedMapping(
3500 IN PVOID MappingAddress,
3501 IN ULONG PoolTag,
3502 IN PMDL MemoryDescriptorList,
3503 IN MEMORY_CACHING_TYPE CacheType);
3504
3505 NTKERNELAPI
3506 NTSTATUS
3507 NTAPI
3508 MmMapUserAddressesToPage(
3509 IN PVOID BaseAddress,
3510 IN SIZE_T NumberOfBytes,
3511 IN PVOID PageAddress);
3512
3513 NTKERNELAPI
3514 PVOID
3515 NTAPI
3516 MmMapVideoDisplay(
3517 IN PHYSICAL_ADDRESS PhysicalAddress,
3518 IN SIZE_T NumberOfBytes,
3519 IN MEMORY_CACHING_TYPE CacheType);
3520
3521 NTKERNELAPI
3522 NTSTATUS
3523 NTAPI
3524 MmMapViewInSessionSpace(
3525 IN PVOID Section,
3526 OUT PVOID *MappedBase,
3527 IN OUT PSIZE_T ViewSize);
3528
3529 NTKERNELAPI
3530 NTSTATUS
3531 NTAPI
3532 MmMapViewInSystemSpace(
3533 IN PVOID Section,
3534 OUT PVOID *MappedBase,
3535 IN PSIZE_T ViewSize);
3536
3537 NTKERNELAPI
3538 NTSTATUS
3539 NTAPI
3540 MmMarkPhysicalMemoryAsBad(
3541 IN PPHYSICAL_ADDRESS StartAddress,
3542 IN OUT PLARGE_INTEGER NumberOfBytes);
3543
3544 NTKERNELAPI
3545 NTSTATUS
3546 NTAPI
3547 MmMarkPhysicalMemoryAsGood(
3548 IN PPHYSICAL_ADDRESS StartAddress,
3549 IN OUT PLARGE_INTEGER NumberOfBytes);
3550
3551 NTKERNELAPI
3552 PVOID
3553 NTAPI
3554 MmGetSystemRoutineAddress(
3555 IN PUNICODE_STRING SystemRoutineName);
3556
3557 /*
3558 * ULONG
3559 * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
3560 * IN PVOID Va,
3561 * IN ULONG Size)
3562 */
3563 #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, \
3564 _Size) \
3565 ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
3566 + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
3567
3568 /*
3569 * VOID
3570 * MmInitializeMdl(
3571 * IN PMDL MemoryDescriptorList,
3572 * IN PVOID BaseVa,
3573 * IN SIZE_T Length)
3574 */
3575 #define MmInitializeMdl(_MemoryDescriptorList, \
3576 _BaseVa, \
3577 _Length) \
3578 { \
3579 (_MemoryDescriptorList)->Next = (PMDL) NULL; \
3580 (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
3581 (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
3582 (_MemoryDescriptorList)->MdlFlags = 0; \
3583 (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
3584 (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
3585 (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
3586 }
3587
3588 NTKERNELAPI
3589 BOOLEAN
3590 NTAPI
3591 MmIsAddressValid(
3592 IN PVOID VirtualAddress);
3593
3594 NTKERNELAPI
3595 LOGICAL
3596 NTAPI
3597 MmIsDriverVerifying(
3598 IN PDRIVER_OBJECT DriverObject);
3599
3600 NTKERNELAPI
3601 BOOLEAN
3602 NTAPI
3603 MmIsThisAnNtAsSystem(
3604 VOID);
3605
3606 NTKERNELAPI
3607 NTSTATUS
3608 NTAPI
3609 MmIsVerifierEnabled(
3610 OUT PULONG VerifierFlags);
3611
3612 NTKERNELAPI
3613 PVOID
3614 NTAPI
3615 MmLockPagableDataSection(
3616 IN PVOID AddressWithinSection);
3617
3618 NTKERNELAPI
3619 PVOID
3620 NTAPI
3621 MmLockPagableImageSection(
3622 IN PVOID AddressWithinSection);
3623
3624 /*
3625 * PVOID
3626 * MmLockPagableCodeSection(
3627 * IN PVOID AddressWithinSection)
3628 */
3629 #define MmLockPagableCodeSection(Address) MmLockPagableDataSection(Address)
3630
3631 NTKERNELAPI
3632 VOID
3633 NTAPI
3634 MmLockPagableSectionByHandle(
3635 IN PVOID ImageSectionHandle);
3636
3637 NTKERNELAPI
3638 PVOID
3639 NTAPI
3640 MmMapIoSpace(
3641 IN PHYSICAL_ADDRESS PhysicalAddress,
3642 IN ULONG NumberOfBytes,
3643 IN MEMORY_CACHING_TYPE CacheEnable);
3644
3645 NTKERNELAPI
3646 PVOID
3647 NTAPI
3648 MmMapLockedPages(
3649 IN PMDL MemoryDescriptorList,
3650 IN KPROCESSOR_MODE AccessMode);
3651
3652 NTKERNELAPI
3653 PVOID
3654 NTAPI
3655 MmLockPageableDataSection (
3656 IN PVOID AddressWithinSection
3657 );
3658
3659 NTKERNELAPI
3660 VOID
3661 NTAPI
3662 MmUnlockPageableImageSection(
3663 IN PVOID ImageSectionHandle
3664 );
3665
3666 NTKERNELAPI
3667 PVOID
3668 NTAPI
3669 MmPageEntireDriver(
3670 IN PVOID AddressWithinSection);
3671
3672 NTKERNELAPI
3673 VOID
3674 NTAPI
3675 MmProbeAndLockProcessPages(
3676 IN OUT PMDL MemoryDescriptorList,
3677 IN PEPROCESS Process,
3678 IN KPROCESSOR_MODE AccessMode,
3679 IN LOCK_OPERATION Operation);
3680
3681 NTKERNELAPI
3682 NTSTATUS
3683 NTAPI
3684 MmProtectMdlSystemAddress(
3685 IN PMDL MemoryDescriptorList,
3686 IN ULONG NewProtect);
3687
3688 NTKERNELAPI
3689 VOID
3690 NTAPI
3691 MmUnmapLockedPages(
3692 IN PVOID BaseAddress,
3693 IN PMDL MemoryDescriptorList);
3694
3695 NTKERNELAPI
3696 NTSTATUS
3697 NTAPI
3698 MmUnmapViewInSessionSpace(
3699 IN PVOID MappedBase);
3700
3701 NTKERNELAPI
3702 NTSTATUS
3703 NTAPI
3704 MmUnmapViewInSystemSpace(
3705 IN PVOID MappedBase);
3706
3707 NTKERNELAPI
3708 VOID
3709 NTAPI
3710 MmUnsecureVirtualMemory(
3711 IN HANDLE SecureHandle);
3712
3713 /*
3714 * VOID
3715 * MmPrepareMdlForReuse(
3716 * IN PMDL Mdl)
3717 */
3718 #define MmPrepareMdlForReuse(_Mdl) \
3719 { \
3720 if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
3721 ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
3722 MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
3723 } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
3724 ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
3725 } \
3726 }
3727
3728 #define MmGetProcedureAddress(Address) (Address)
3729
3730 NTKERNELAPI
3731 VOID
3732 NTAPI
3733 MmProbeAndLockPages(
3734 IN OUT PMDL MemoryDescriptorList,
3735 IN KPROCESSOR_MODE AccessMode,
3736 IN LOCK_OPERATION Operation);
3737
3738 NTKERNELAPI
3739 MM_SYSTEMSIZE
3740 NTAPI
3741 MmQuerySystemSize(
3742 VOID);
3743
3744 NTKERNELAPI
3745 NTSTATUS
3746 NTAPI
3747 MmRemovePhysicalMemory(
3748 IN PPHYSICAL_ADDRESS StartAddress,
3749 IN OUT PLARGE_INTEGER NumberOfBytes);
3750
3751 NTKERNELAPI
3752 VOID
3753 NTAPI
3754 MmResetDriverPaging(
3755 IN PVOID AddressWithinSection);
3756
3757 NTKERNELAPI
3758 HANDLE
3759 NTAPI
3760 MmSecureVirtualMemory(
3761 IN PVOID Address,
3762 IN SIZE_T Size,
3763 IN ULONG ProbeMode);
3764
3765 NTKERNELAPI
3766 SIZE_T
3767 NTAPI
3768 MmSizeOfMdl(
3769 IN PVOID Base,
3770 IN SIZE_T Length);
3771
3772 NTKERNELAPI
3773 VOID
3774 NTAPI
3775 MmUnlockPagableImageSection(
3776 IN PVOID ImageSectionHandle);
3777
3778 NTKERNELAPI
3779 VOID
3780 NTAPI
3781 MmUnlockPages(
3782 IN PMDL MemoryDescriptorList);
3783
3784 NTKERNELAPI
3785 VOID
3786 NTAPI
3787 MmUnmapIoSpace(
3788 IN PVOID BaseAddress,
3789 IN SIZE_T NumberOfBytes);
3790
3791 NTKERNELAPI
3792 VOID
3793 NTAPI
3794 MmUnmapReservedMapping(
3795 IN PVOID BaseAddress,
3796 IN ULONG PoolTag,
3797 IN PMDL MemoryDescriptorList);
3798
3799 NTKERNELAPI
3800 VOID
3801 NTAPI
3802 MmUnmapVideoDisplay(
3803 IN PVOID BaseAddress,
3804 IN SIZE_T NumberOfBytes);
3805
3806
3807
3808 /** Object manager routines **/
3809
3810 NTKERNELAPI
3811 NTSTATUS
3812 NTAPI
3813 ObAssignSecurity(
3814 IN PACCESS_STATE AccessState,
3815 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
3816 IN PVOID Object,
3817 IN POBJECT_TYPE Type);
3818
3819 NTKERNELAPI
3820 VOID
3821 NTAPI
3822 ObDereferenceSecurityDescriptor(
3823 PSECURITY_DESCRIPTOR SecurityDescriptor,
3824 ULONG Count);
3825
3826 NTKERNELAPI
3827 LONG_PTR
3828 FASTCALL
3829 ObfDereferenceObject(
3830 IN PVOID Object);
3831
3832 /*
3833 * VOID
3834 * ObDereferenceObject(
3835 * IN PVOID Object)
3836 */
3837 #define ObDereferenceObject ObfDereferenceObject
3838
3839 NTKERNELAPI
3840 NTSTATUS
3841 NTAPI
3842 ObGetObjectSecurity(
3843 IN PVOID Object,
3844 OUT PSECURITY_DESCRIPTOR *SecurityDescriptor,
3845 OUT PBOOLEAN MemoryAllocated);
3846
3847 NTKERNELAPI
3848 NTSTATUS
3849 NTAPI
3850 ObInsertObject(
3851 IN PVOID Object,
3852 IN PACCESS_STATE PassedAccessState OPTIONAL,
3853 IN ACCESS_MASK DesiredAccess,
3854 IN ULONG AdditionalReferences,
3855 OUT PVOID* ReferencedObject OPTIONAL,
3856 OUT PHANDLE Handle);
3857
3858 NTKERNELAPI
3859 LONG_PTR
3860 FASTCALL
3861 ObfReferenceObject(
3862 IN PVOID Object);
3863
3864 NTKERNELAPI
3865 NTSTATUS
3866 NTAPI
3867 ObLogSecurityDescriptor(
3868 IN PSECURITY_DESCRIPTOR InputSecurityDescriptor,
3869 OUT PSECURITY_DESCRIPTOR *OutputSecurityDescriptor,
3870 IN ULONG RefBias);
3871 /*
3872 * VOID
3873 * ObReferenceObject(
3874 * IN PVOID Object)
3875 */
3876 #define ObReferenceObject ObfReferenceObject
3877
3878 NTKERNELAPI
3879 VOID
3880 NTAPI
3881 ObMakeTemporaryObject(
3882 IN PVOID Object);
3883
3884 NTKERNELAPI
3885 NTSTATUS
3886 NTAPI
3887 ObOpenObjectByName(
3888 IN POBJECT_ATTRIBUTES ObjectAttributes,
3889 IN POBJECT_TYPE ObjectType,
3890 IN KPROCESSOR_MODE AccessMode,
3891 IN PACCESS_STATE PassedAccessState,
3892 IN ACCESS_MASK DesiredAccess,
3893 IN OUT PVOID ParseContext OPTIONAL,
3894 OUT PHANDLE Handle);
3895
3896 NTKERNELAPI
3897 NTSTATUS
3898 NTAPI
3899 ObOpenObjectByPointer(
3900 IN PVOID Object,
3901 IN ULONG HandleAttributes,
3902 IN PACCESS_STATE PassedAccessState OPTIONAL,
3903 IN ACCESS_MASK DesiredAccess OPTIONAL,
3904 IN POBJECT_TYPE ObjectType OPTIONAL,
3905 IN KPROCESSOR_MODE AccessMode,
3906 OUT PHANDLE Handle);
3907
3908 NTKERNELAPI
3909 NTSTATUS
3910 NTAPI
3911 ObQueryObjectAuditingByHandle(
3912 IN HANDLE Handle,
3913 OUT PBOOLEAN GenerateOnClose);
3914
3915 NTKERNELAPI
3916 NTSTATUS
3917 NTAPI
3918 ObReferenceObjectByHandle(
3919 IN HANDLE Handle,
3920 IN ACCESS_MASK DesiredAccess,
3921 IN POBJECT_TYPE ObjectType OPTIONAL,
3922 IN KPROCESSOR_MODE AccessMode,
3923 OUT PVOID *Object,
3924 OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL);
3925
3926 NTKERNELAPI
3927 NTSTATUS
3928 NTAPI
3929 ObReferenceObjectByName(
3930 IN PUNICODE_STRING ObjectPath,
3931 IN ULONG Attributes,
3932 IN PACCESS_STATE PassedAccessState OPTIONAL,
3933 IN ACCESS_MASK DesiredAccess OPTIONAL,
3934 IN POBJECT_TYPE ObjectType,
3935 IN KPROCESSOR_MODE AccessMode,
3936 IN OUT PVOID ParseContext OPTIONAL,
3937 OUT PVOID *Object);
3938
3939 NTKERNELAPI
3940 NTSTATUS
3941 NTAPI
3942 ObReferenceObjectByPointer(
3943 IN PVOID Object,
3944 IN ACCESS_MASK DesiredAccess,
3945 IN POBJECT_TYPE ObjectType,
3946 IN KPROCESSOR_MODE AccessMode);
3947
3948 NTKERNELAPI
3949 VOID
3950 NTAPI
3951 ObReferenceSecurityDescriptor(
3952 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
3953 IN ULONG Count);
3954
3955 NTKERNELAPI
3956 VOID
3957 NTAPI
3958 ObReleaseObjectSecurity(
3959 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
3960 IN BOOLEAN MemoryAllocated);
3961
3962
3963
3964 /** Process manager routines **/
3965
3966 NTKERNELAPI
3967 NTSTATUS
3968 NTAPI
3969 PsCreateSystemProcess(
3970 IN PHANDLE ProcessHandle,
3971 IN ACCESS_MASK DesiredAccess,
3972 IN POBJECT_ATTRIBUTES ObjectAttributes);
3973
3974 NTKERNELAPI
3975 NTSTATUS
3976 NTAPI
3977 PsCreateSystemThread(
3978 OUT PHANDLE ThreadHandle,
3979 IN ULONG DesiredAccess,
3980 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
3981 IN HANDLE ProcessHandle OPTIONAL,
3982 OUT PCLIENT_ID ClientId OPTIONAL,
3983 IN PKSTART_ROUTINE StartRoutine,
3984 IN PVOID StartContext);
3985
3986 /*
3987 * PEPROCESS
3988 * PsGetCurrentProcess(VOID)
3989 */
3990 #define PsGetCurrentProcess IoGetCurrentProcess
3991
3992 NTKERNELAPI
3993 HANDLE
3994 NTAPI
3995 PsGetCurrentProcessId(
3996 VOID);
3997
3998 /*
3999 * PETHREAD
4000 * PsGetCurrentThread(VOID)
4001 */
4002 #define PsGetCurrentThread() \
4003 ((PETHREAD) KeGetCurrentThread())
4004
4005 NTKERNELAPI
4006 HANDLE
4007 NTAPI
4008 PsGetCurrentThreadId(
4009 VOID);
4010
4011 NTKERNELAPI
4012 HANDLE
4013 NTAPI
4014 PsGetProcessId(PEPROCESS Process);
4015
4016 NTKERNELAPI
4017 BOOLEAN
4018 NTAPI
4019 PsGetVersion(
4020 PULONG MajorVersion OPTIONAL,
4021 PULONG MinorVersion OPTIONAL,
4022 PULONG BuildNumber OPTIONAL,
4023 PUNICODE_STRING CSDVersion OPTIONAL);
4024
4025 NTKERNELAPI
4026 NTSTATUS
4027 NTAPI
4028 PsRemoveCreateThreadNotifyRoutine(
4029 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
4030
4031 NTKERNELAPI
4032 NTSTATUS
4033 NTAPI
4034 PsRemoveLoadImageNotifyRoutine(
4035 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
4036
4037 NTKERNELAPI
4038 NTSTATUS
4039 NTAPI
4040 PsSetCreateProcessNotifyRoutine(
4041 IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
4042 IN BOOLEAN Remove);
4043
4044 NTKERNELAPI
4045 NTSTATUS
4046 NTAPI
4047 PsSetCreateThreadNotifyRoutine(
4048 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
4049
4050 NTKERNELAPI
4051 NTSTATUS
4052 NTAPI
4053 PsSetLoadImageNotifyRoutine(
4054 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
4055
4056 NTKERNELAPI
4057 NTSTATUS
4058 NTAPI
4059 PsTerminateSystemThread(
4060 IN NTSTATUS ExitStatus);
4061
4062 extern NTSYSAPI PEPROCESS PsInitialSystemProcess;
4063
4064
4065 /** Security reference monitor routines **/
4066
4067 NTKERNELAPI
4068 BOOLEAN
4069 NTAPI
4070 SeAccessCheck(
4071 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
4072 IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext,
4073 IN BOOLEAN SubjectContextLocked,
4074 IN ACCESS_MASK DesiredAccess,
4075 IN ACCESS_MASK PreviouslyGrantedAccess,
4076 OUT PPRIVILEGE_SET *Privileges OPTIONAL,
4077 IN PGENERIC_MAPPING GenericMapping,
4078 IN KPROCESSOR_MODE AccessMode,
4079 OUT PACCESS_MASK GrantedAccess,
4080 OUT PNTSTATUS AccessStatus);
4081
4082 NTKERNELAPI
4083 NTSTATUS
4084 NTAPI
4085 SeAssignSecurity(
4086 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
4087 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
4088 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
4089 IN BOOLEAN IsDirectoryObject,
4090 IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
4091 IN PGENERIC_MAPPING GenericMapping,
4092 IN POOL_TYPE PoolType);
4093
4094 NTKERNELAPI
4095 NTSTATUS
4096 NTAPI
4097 SeAssignSecurityEx(
4098 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
4099 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
4100 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
4101 IN GUID *ObjectType OPTIONAL,
4102 IN BOOLEAN IsDirectoryObject,
4103 IN ULONG AutoInheritFlags,
4104 IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
4105 IN PGENERIC_MAPPING GenericMapping,
4106 IN POOL_TYPE PoolType);
4107
4108 NTKERNELAPI
4109 NTSTATUS
4110 NTAPI
4111 SeDeassignSecurity(
4112 IN OUT PSECURITY_DESCRIPTOR *SecurityDescriptor);
4113
4114 NTKERNELAPI
4115 BOOLEAN
4116 NTAPI
4117 SeSinglePrivilegeCheck(
4118 LUID PrivilegeValue,
4119 KPROCESSOR_MODE PreviousMode);
4120
4121 NTKERNELAPI
4122 BOOLEAN
4123 NTAPI
4124 SeValidSecurityDescriptor(
4125 IN ULONG Length,
4126 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
4127
4128
4129
4130 /** NtXxx routines **/
4131
4132 NTSYSCALLAPI
4133 NTSTATUS
4134 NTAPI
4135 NtOpenProcess(
4136 OUT PHANDLE ProcessHandle,
4137 IN ACCESS_MASK DesiredAccess,
4138 IN POBJECT_ATTRIBUTES ObjectAttributes,
4139 IN PCLIENT_ID ClientId OPTIONAL);
4140
4141 NTSYSCALLAPI
4142 NTSTATUS
4143 NTAPI
4144 NtQueryInformationProcess(
4145 IN HANDLE ProcessHandle,
4146 IN PROCESSINFOCLASS ProcessInformationClass,
4147 OUT PVOID ProcessInformation,
4148 IN ULONG ProcessInformationLength,
4149 OUT PULONG ReturnLength OPTIONAL);
4150
4151
4152
4153 /** NtXxx and ZwXxx routines **/
4154
4155 NTSYSAPI
4156 NTSTATUS
4157 NTAPI
4158 ZwCancelTimer(
4159 IN HANDLE TimerHandle,
4160 OUT PBOOLEAN CurrentState OPTIONAL);
4161
4162 NTSYSCALLAPI
4163 NTSTATUS
4164 NTAPI
4165 NtClose(
4166 IN HANDLE Handle);
4167
4168 NTSYSAPI
4169 NTSTATUS
4170 NTAPI
4171 ZwClose(
4172 IN HANDLE Handle);
4173
4174 NTSYSAPI
4175 NTSTATUS
4176 NTAPI
4177 ZwCreateDirectoryObject(
4178 OUT PHANDLE DirectoryHandle,
4179 IN ACCESS_MASK DesiredAccess,
4180 IN POBJECT_ATTRIBUTES ObjectAttributes);
4181
4182 NTSYSCALLAPI
4183 NTSTATUS
4184 NTAPI
4185 NtCreateEvent(
4186 OUT PHANDLE EventHandle,
4187 IN ACCESS_MASK DesiredAccess,
4188 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
4189 IN EVENT_TYPE EventType,
4190 IN BOOLEAN InitialState);
4191
4192 NTSYSAPI
4193 NTSTATUS
4194 NTAPI
4195 ZwCreateEvent(
4196 OUT PHANDLE EventHandle,
4197 IN ACCESS_MASK DesiredAccess,
4198 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
4199 IN EVENT_TYPE EventType,
4200 IN BOOLEAN InitialState);
4201
4202 NTSYSAPI
4203 NTSTATUS
4204 NTAPI
4205 ZwCreateFile(
4206 OUT PHANDLE FileHandle,
4207 IN ACCESS_MASK DesiredAccess,
4208 IN POBJECT_ATTRIBUTES ObjectAttributes,
4209 OUT PIO_STATUS_BLOCK IoStatusBlock,
4210 IN PLARGE_INTEGER AllocationSize OPTIONAL,
4211 IN ULONG FileAttributes,
4212 IN ULONG ShareAccess,
4213 IN ULONG CreateDisposition,
4214 IN ULONG CreateOptions,
4215 IN PVOID EaBuffer OPTIONAL,
4216 IN ULONG EaLength);
4217
4218 NTSYSAPI
4219 NTSTATUS
4220 NTAPI
4221 ZwCreateKey(
4222 OUT PHANDLE KeyHandle,
4223 IN ACCESS_MASK DesiredAccess,
4224 IN POBJECT_ATTRIBUTES ObjectAttributes,
4225 IN ULONG TitleIndex,
4226 IN PUNICODE_STRING Class OPTIONAL,
4227 IN ULONG CreateOptions,
4228 OUT PULONG Disposition OPTIONAL);
4229
4230 NTSYSAPI
4231 NTSTATUS
4232 NTAPI
4233 ZwCreateTimer(
4234 OUT PHANDLE TimerHandle,
4235 IN ACCESS_MASK DesiredAccess,
4236 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
4237 IN TIMER_TYPE TimerType);
4238
4239 NTSYSAPI
4240 NTSTATUS
4241 NTAPI
4242 ZwDeleteKey(
4243 IN HANDLE KeyHandle);
4244
4245 NTSYSAPI
4246 NTSTATUS
4247 NTAPI
4248 ZwDeleteValueKey(
4249 IN HANDLE KeyHandle,
4250 IN PUNICODE_STRING ValueName);
4251
4252 NTSYSCALLAPI
4253 NTSTATUS
4254 NTAPI
4255 NtDeviceIoControlFile(
4256 IN HANDLE DeviceHandle,
4257 IN HANDLE Event OPTIONAL,
4258 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
4259 IN PVOID UserApcContext OPTIONAL,
4260 OUT PIO_STATUS_BLOCK IoStatusBlock,
4261 IN ULONG IoControlCode,
4262 IN PVOID InputBuffer,
4263 IN ULONG InputBufferSize,
4264 OUT PVOID OutputBuffer,
4265 IN ULONG OutputBufferSize);
4266
4267 NTSYSAPI
4268 NTSTATUS
4269 NTAPI
4270 ZwDeviceIoControlFile(
4271 IN HANDLE DeviceHandle,
4272 IN HANDLE Event OPTIONAL,
4273 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
4274 IN PVOID UserApcContext OPTIONAL,
4275 OUT PIO_STATUS_BLOCK IoStatusBlock,
4276 IN ULONG IoControlCode,
4277 IN PVOID InputBuffer,
4278 IN ULONG InputBufferSize,
4279 OUT PVOID OutputBuffer,
4280 IN ULONG OutputBufferSize);
4281
4282 NTSYSAPI
4283 NTSTATUS
4284 NTAPI
4285 ZwEnumerateKey(
4286 IN HANDLE KeyHandle,
4287 IN ULONG Index,
4288 IN KEY_INFORMATION_CLASS KeyInformationClass,
4289 OUT PVOID KeyInformation,
4290 IN ULONG Length,
4291 OUT PULONG ResultLength);
4292
4293 NTSYSAPI
4294 NTSTATUS
4295 NTAPI
4296 ZwEnumerateValueKey(
4297 IN HANDLE KeyHandle,
4298 IN ULONG Index,
4299 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
4300 OUT PVOID KeyValueInformation,
4301 IN ULONG Length,
4302 OUT PULONG ResultLength);
4303
4304 NTSYSAPI
4305 NTSTATUS
4306 NTAPI
4307 ZwFlushKey(
4308 IN HANDLE KeyHandle);
4309
4310 NTSYSAPI
4311 NTSTATUS
4312 NTAPI
4313 ZwMakeTemporaryObject(
4314 IN HANDLE Handle);
4315
4316 NTSYSCALLAPI
4317 NTSTATUS
4318 NTAPI
4319 NtMapViewOfSection(
4320 IN HANDLE SectionHandle,
4321 IN HANDLE ProcessHandle,
4322 IN OUT PVOID *BaseAddress,
4323 IN ULONG_PTR ZeroBits,
4324 IN SIZE_T CommitSize,
4325 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
4326 IN OUT PSIZE_T ViewSize,
4327 IN SECTION_INHERIT InheritDisposition,
4328 IN ULONG AllocationType,
4329 IN ULONG Protect);
4330
4331 NTSYSAPI
4332 NTSTATUS
4333 NTAPI
4334 ZwMapViewOfSection(
4335 IN HANDLE SectionHandle,
4336 IN HANDLE ProcessHandle,
4337 IN OUT PVOID *BaseAddress,
4338 IN ULONG_PTR ZeroBits,
4339 IN SIZE_T CommitSize,
4340 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
4341 IN OUT PSIZE_T ViewSize,
4342 IN SECTION_INHERIT InheritDisposition,
4343 IN ULONG AllocationType,
4344 IN ULONG Protect);
4345
4346 NTSYSCALLAPI
4347 NTSTATUS
4348 NTAPI
4349 NtOpenFile(
4350 OUT PHANDLE FileHandle,
4351 IN ACCESS_MASK DesiredAccess,
4352 IN POBJECT_ATTRIBUTES ObjectAttributes,
4353 OUT PIO_STATUS_BLOCK IoStatusBlock,
4354 IN ULONG ShareAccess,
4355 IN ULONG OpenOptions);
4356
4357 NTSYSAPI
4358 NTSTATUS
4359 NTAPI
4360 ZwOpenFile(
4361 OUT PHANDLE FileHandle,
4362 IN ACCESS_MASK DesiredAccess,
4363 IN POBJECT_ATTRIBUTES ObjectAttributes,
4364 OUT PIO_STATUS_BLOCK IoStatusBlock,
4365 IN ULONG ShareAccess,
4366 IN ULONG OpenOptions);
4367
4368 NTSYSAPI
4369 NTSTATUS
4370 NTAPI
4371 ZwOpenKey(
4372 OUT PHANDLE KeyHandle,
4373 IN ACCESS_MASK DesiredAccess,
4374 IN POBJECT_ATTRIBUTES ObjectAttributes);
4375
4376 NTSYSAPI
4377 NTSTATUS
4378 NTAPI
4379 ZwOpenSection(
4380 OUT PHANDLE SectionHandle,
4381 IN ACCESS_MASK DesiredAccess,
4382 IN POBJECT_ATTRIBUTES ObjectAttributes);
4383
4384 NTSYSAPI
4385 NTSTATUS
4386 NTAPI
4387 ZwOpenSymbolicLinkObject(
4388 OUT PHANDLE LinkHandle,
4389 IN ACCESS_MASK DesiredAccess,
4390 IN POBJECT_ATTRIBUTES ObjectAttributes);
4391
4392 NTSYSAPI
4393 NTSTATUS
4394 NTAPI
4395 ZwOpenTimer(
4396 OUT PHANDLE TimerHandle,
4397 IN ACCESS_MASK DesiredAccess,
4398 IN POBJECT_ATTRIBUTES ObjectAttributes);
4399
4400 NTSYSAPI
4401 NTSTATUS
4402 NTAPI
4403 ZwQueryInformationFile(
4404 IN HANDLE FileHandle,
4405 OUT PIO_STATUS_BLOCK IoStatusBlock,
4406 OUT PVOID FileInformation,
4407 IN ULONG Length,
4408 IN FILE_INFORMATION_CLASS FileInformationClass);
4409
4410 NTSYSAPI
4411 NTSTATUS
4412 NTAPI
4413 ZwQueryKey(
4414 IN HANDLE KeyHandle,
4415 IN KEY_INFORMATION_CLASS KeyInformationClass,
4416 OUT PVOID KeyInformation,
4417 IN ULONG Length,
4418 OUT PULONG ResultLength);
4419
4420 NTSYSAPI
4421 NTSTATUS
4422 NTAPI
4423 ZwQuerySymbolicLinkObject(
4424 IN HANDLE LinkHandle,
4425 IN OUT PUNICODE_STRING LinkTarget,
4426 OUT PULONG ReturnedLength OPTIONAL);
4427
4428 NTSYSAPI
4429 NTSTATUS
4430 NTAPI
4431 ZwQueryValueKey(
4432 IN HANDLE KeyHandle,
4433 IN PUNICODE_STRING ValueName,
4434 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
4435 OUT PVOID KeyValueInformation,
4436 IN ULONG Length,
4437 OUT PULONG ResultLength);
4438
4439 NTSYSCALLAPI
4440 NTSTATUS
4441 NTAPI
4442 NtReadFile(
4443 IN HANDLE FileHandle,
4444 IN HANDLE Event OPTIONAL,
4445 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
4446 IN PVOID ApcContext OPTIONAL,
4447 OUT PIO_STATUS_BLOCK IoStatusBlock,
4448 OUT PVOID Buffer,
4449 IN ULONG Length,
4450 IN PLARGE_INTEGER ByteOffset OPTIONAL,
4451 IN PULONG Key OPTIONAL);
4452
4453 NTSYSAPI
4454 NTSTATUS
4455 NTAPI
4456 ZwReadFile(
4457 IN HANDLE FileHandle,
4458 IN HANDLE Event OPTIONAL,
4459 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
4460 IN PVOID ApcContext OPTIONAL,
4461 OUT PIO_STATUS_BLOCK IoStatusBlock,
4462 OUT PVOID Buffer,
4463 IN ULONG Length,
4464 IN PLARGE_INTEGER ByteOffset OPTIONAL,
4465 IN PULONG Key OPTIONAL);
4466
4467 NTSYSCALLAPI
4468 NTSTATUS
4469 NTAPI
4470 NtSetEvent(
4471 IN HANDLE EventHandle,
4472 OUT PLONG PreviousState OPTIONAL);
4473
4474 NTSYSAPI
4475 NTSTATUS
4476 NTAPI
4477 ZwSetEvent(
4478 IN HANDLE EventHandle,
4479 OUT PLONG PreviousState OPTIONAL);
4480
4481 NTSYSAPI
4482 NTSTATUS
4483 NTAPI
4484 ZwSetInformationFile(
4485 IN HANDLE FileHandle,
4486 OUT PIO_STATUS_BLOCK IoStatusBlock,
4487 IN PVOID FileInformation,
4488 IN ULONG Length,
4489 IN FILE_INFORMATION_CLASS FileInformationClass);
4490
4491 NTSYSAPI
4492 NTSTATUS
4493 NTAPI
4494 ZwSetInformationThread(
4495 IN HANDLE ThreadHandle,
4496 IN THREADINFOCLASS ThreadInformationClass,
4497 IN PVOID ThreadInformation,
4498 IN ULONG ThreadInformationLength);
4499
4500 NTSYSAPI
4501 NTSTATUS
4502 NTAPI
4503 ZwSetTimer(
4504 IN HANDLE TimerHandle,
4505 IN PLARGE_INTEGER DueTime,
4506 IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL,
4507 IN PVOID TimerContext OPTIONAL,
4508 IN BOOLEAN WakeTimer,
4509 IN LONG Period OPTIONAL,
4510 OUT PBOOLEAN PreviousState OPTIONAL);
4511
4512 NTSYSAPI
4513 NTSTATUS
4514 NTAPI
4515 ZwSetValueKey(
4516 IN HANDLE KeyHandle,
4517 IN PUNICODE_STRING ValueName,
4518 IN ULONG TitleIndex OPTIONAL,
4519 IN ULONG Type,
4520 IN PVOID Data,
4521 IN ULONG DataSize);
4522
4523 /* [Nt|Zw]MapViewOfSection.InheritDisposition constants */
4524 #define AT_EXTENDABLE_FILE 0x00002000
4525 #define AT_RESERVED 0x20000000
4526 #define AT_ROUND_TO_PAGE 0x40000000
4527
4528 NTSYSCALLAPI
4529 NTSTATUS
4530 NTAPI
4531 NtUnmapViewOfSection(
4532 IN HANDLE ProcessHandle,
4533 IN PVOID BaseAddress);
4534
4535 NTSYSAPI
4536 NTSTATUS
4537 NTAPI
4538 ZwUnmapViewOfSection(
4539 IN HANDLE ProcessHandle,
4540 IN PVOID BaseAddress);
4541
4542 NTSYSCALLAPI
4543 NTSTATUS
4544 NTAPI
4545 NtWaitForSingleObject(
4546 IN HANDLE ObjectHandle,
4547 IN BOOLEAN Alertable,
4548 IN PLARGE_INTEGER TimeOut OPTIONAL);
4549
4550 NTSYSAPI
4551 NTSTATUS
4552 NTAPI
4553 ZwWaitForSingleObject(
4554 IN HANDLE ObjectHandle,
4555 IN BOOLEAN Alertable,
4556 IN PLARGE_INTEGER TimeOut OPTIONAL);
4557
4558 NTSYSCALLAPI
4559 NTSTATUS
4560 NTAPI
4561 NtWriteFile(
4562 IN HANDLE FileHandle,
4563 IN HANDLE Event OPTIONAL,
4564 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
4565 IN PVOID ApcContext OPTIONAL,
4566 OUT PIO_STATUS_BLOCK IoStatusBlock,
4567 IN PVOID Buffer,
4568 IN ULONG Length,
4569 IN PLARGE_INTEGER ByteOffset OPTIONAL,
4570 IN PULONG Key OPTIONAL);
4571
4572 NTSYSAPI
4573 NTSTATUS
4574 NTAPI
4575 ZwWriteFile(
4576 IN HANDLE FileHandle,
4577 IN HANDLE Event OPTIONAL,
4578 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
4579 IN PVOID ApcContext OPTIONAL,
4580 OUT PIO_STATUS_BLOCK IoStatusBlock,
4581 IN PVOID Buffer,
4582 IN ULONG Length,
4583 IN PLARGE_INTEGER ByteOffset OPTIONAL,
4584 IN PULONG Key OPTIONAL);
4585
4586
4587
4588 /** Power management support routines **/
4589
4590 NTKERNELAPI
4591 NTSTATUS
4592 NTAPI
4593 PoCallDriver(
4594 IN PDEVICE_OBJECT DeviceObject,
4595 IN OUT PIRP Irp);
4596
4597 NTKERNELAPI
4598 PULONG
4599 NTAPI
4600 PoRegisterDeviceForIdleDetection(
4601 IN PDEVICE_OBJECT DeviceObject,
4602 IN ULONG ConservationIdleTime,
4603 IN ULONG PerformanceIdleTime,
4604 IN DEVICE_POWER_STATE State);
4605
4606 NTKERNELAPI
4607 PVOID
4608 NTAPI
4609 PoRegisterSystemState(
4610 IN PVOID StateHandle,
4611 IN EXECUTION_STATE Flags);
4612
4613 NTKERNELAPI
4614 NTSTATUS
4615 NTAPI
4616 PoRequestPowerIrp(
4617 IN PDEVICE_OBJECT DeviceObject,
4618 IN UCHAR MinorFunction,
4619 IN POWER_STATE PowerState,
4620 IN PREQUEST_POWER_COMPLETE CompletionFunction,
4621 IN PVOID Context,
4622 OUT PIRP *Irp OPTIONAL);
4623
4624 NTKERNELAPI
4625 NTSTATUS
4626 NTAPI
4627 PoRequestShutdownEvent(
4628 OUT PVOID *Event);
4629
4630 NTKERNELAPI
4631 VOID
4632 NTAPI
4633 PoSetDeviceBusy(
4634 PULONG IdlePointer);
4635
4636 #define PoSetDeviceBusy(IdlePointer) \
4637 ((void)(*(IdlePointer) = 0))
4638
4639 NTKERNELAPI
4640 POWER_STATE
4641 NTAPI
4642 PoSetPowerState(
4643 IN PDEVICE_OBJECT DeviceObject,
4644 IN POWER_STATE_TYPE Type,
4645 IN POWER_STATE State);
4646
4647 NTKERNELAPI
4648 VOID
4649 NTAPI
4650 PoSetSystemState(
4651 IN EXECUTION_STATE Flags);
4652
4653 NTKERNELAPI
4654 VOID
4655 NTAPI
4656 PoStartNextPowerIrp(
4657 IN PIRP Irp);
4658
4659 NTKERNELAPI
4660 VOID
4661 NTAPI
4662 PoUnregisterSystemState(
4663 IN PVOID StateHandle);
4664
4665
4666
4667 /** WMI library support routines **/
4668
4669 NTSTATUS
4670 NTAPI
4671 WmiCompleteRequest(
4672 IN PDEVICE_OBJECT DeviceObject,
4673 IN PIRP Irp,
4674 IN NTSTATUS Status,
4675 IN ULONG BufferUsed,
4676 IN CCHAR PriorityBoost);
4677
4678 NTSTATUS
4679 NTAPI
4680 WmiFireEvent(
4681 IN PDEVICE_OBJECT DeviceObject,
4682 IN LPGUID Guid,
4683 IN ULONG InstanceIndex,
4684 IN ULONG EventDataSize,
4685 IN PVOID EventData);
4686
4687 NTKERNELAPI
4688 NTSTATUS
4689 NTAPI
4690 WmiQueryTraceInformation(
4691 IN TRACE_INFORMATION_CLASS TraceInformationClass,
4692 OUT PVOID TraceInformation,
4693 IN ULONG TraceInformationLength,
4694 OUT PULONG RequiredLength OPTIONAL,
4695 IN PVOID Buffer OPTIONAL);
4696
4697 NTSTATUS
4698 NTAPI
4699 WmiSystemControl(
4700 IN PWMILIB_CONTEXT WmiLibInfo,
4701 IN PDEVICE_OBJECT DeviceObject,
4702 IN PIRP Irp,
4703 OUT PSYSCTL_IRP_DISPOSITION IrpDisposition);
4704
4705 NTKERNELAPI
4706 NTSTATUS
4707 DDKCDECLAPI
4708 WmiTraceMessage(
4709 IN TRACEHANDLE LoggerHandle,
4710 IN ULONG MessageFlags,
4711 IN LPGUID MessageGuid,
4712 IN USHORT MessageNumber,
4713 IN ...);
4714
4715 #if 0
4716 /* FIXME: Get va_list from where? */
4717 NTKERNELAPI
4718 NTSTATUS
4719 DDKCDECLAPI
4720 WmiTraceMessageVa(
4721 IN TRACEHANDLE LoggerHandle,
4722 IN ULONG MessageFlags,
4723 IN LPGUID MessageGuid,
4724 IN USHORT MessageNumber,
4725 IN va_list MessageArgList);
4726 #endif
4727
4728
4729 /** Kernel debugger routines **/
4730
4731 NTKERNELAPI
4732 NTSTATUS
4733 NTAPI
4734 KdDisableDebugger(
4735 VOID);
4736
4737 NTKERNELAPI
4738 NTSTATUS
4739 NTAPI
4740 KdEnableDebugger(
4741 VOID);
4742
4743 NTKERNELAPI
4744 BOOLEAN
4745 NTAPI
4746 KdRefreshDebuggerNotPresent(
4747 VOID
4748 );
4749
4750 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
4751 NTKERNELAPI
4752 NTSTATUS
4753 NTAPI
4754 KdChangeOption(
4755 IN KD_OPTION Option,
4756 IN ULONG InBufferBytes OPTIONAL,
4757 IN PVOID InBuffer,
4758 IN ULONG OutBufferBytes OPTIONAL,
4759 OUT PVOID OutBuffer,
4760 OUT PULONG OutBufferNeeded OPTIONAL);
4761 #endif
4762
4763 VOID
4764 NTAPI
4765 DbgBreakPoint(
4766 VOID);
4767
4768 NTSYSAPI
4769 VOID
4770 NTAPI
4771 DbgBreakPointWithStatus(
4772 IN ULONG Status);
4773
4774 ULONG
4775 DDKCDECLAPI
4776 DbgPrint(
4777 IN PCCH Format,
4778 IN ...);
4779
4780 NTSYSAPI
4781 ULONG
4782 DDKCDECLAPI
4783 DbgPrintEx(
4784 IN ULONG ComponentId,
4785 IN ULONG Level,
4786 IN PCCH Format,
4787 IN ...);
4788
4789 ULONG
4790 NTAPI
4791 vDbgPrintEx(
4792 IN ULONG ComponentId,
4793 IN ULONG Level,
4794 IN PCCH Format,
4795 IN va_list ap);
4796
4797 ULONG
4798 NTAPI
4799 vDbgPrintExWithPrefix(
4800 IN PCCH Prefix,
4801 IN ULONG ComponentId,
4802 IN ULONG Level,
4803 IN PCCH Format,
4804 IN va_list ap);
4805
4806 NTKERNELAPI
4807 ULONG
4808 DDKCDECLAPI
4809 DbgPrintReturnControlC(
4810 IN PCCH Format,
4811 IN ...);
4812
4813 ULONG
4814 NTAPI
4815 DbgPrompt(
4816 IN PCCH Prompt,
4817 OUT PCH Response,
4818 IN ULONG MaximumResponseLength
4819 );
4820
4821 NTKERNELAPI
4822 NTSTATUS
4823 NTAPI
4824 DbgQueryDebugFilterState(
4825 IN ULONG ComponentId,
4826 IN ULONG Level);
4827
4828 NTKERNELAPI
4829 NTSTATUS
4830 NTAPI
4831 DbgSetDebugFilterState(
4832 IN ULONG ComponentId,
4833 IN ULONG Level,
4834 IN BOOLEAN State);
4835
4836 #if DBG
4837
4838 #define KdPrint(_x_) DbgPrint _x_
4839 #define KdPrintEx(_x_) DbgPrintEx _x_
4840 #define KdBreakPoint() DbgBreakPoint()
4841 #define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
4842
4843 #else /* !DBG */
4844
4845 #define KdPrint(_x_)
4846 #define KdPrintEx(_x_)
4847 #define KdBreakPoint()
4848 #define KdBreakPointWithStatus(s)
4849
4850 #endif /* !DBG */
4851
4852 #if defined(__GNUC__)
4853
4854 extern NTKERNELAPI BOOLEAN KdDebuggerNotPresent;
4855 extern NTKERNELAPI BOOLEAN KdDebuggerEnabled;
4856 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
4857 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
4858
4859 #elif defined(_NTDDK_) || defined(_NTHAL_) || defined(_WDMDDK_) || defined(_NTOSP_)
4860
4861 extern NTKERNELAPI PBOOLEAN KdDebuggerNotPresent;
4862 extern NTKERNELAPI PBOOLEAN KdDebuggerEnabled;
4863 #define KD_DEBUGGER_ENABLED *KdDebuggerEnabled
4864 #define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
4865
4866 #else
4867
4868 extern BOOLEAN KdDebuggerNotPresent;
4869 extern BOOLEAN KdDebuggerEnabled;
4870 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
4871 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
4872
4873 #endif
4874
4875 /** Stuff from winnt4.h */
4876
4877 #ifndef DMA_MACROS_DEFINED
4878
4879 #if (NTDDI_VERSION >= NTDDI_WIN2K)
4880
4881 //DECLSPEC_DEPRECATED_DDK
4882 NTHALAPI
4883 BOOLEAN
4884 NTAPI
4885 IoFlushAdapterBuffers(
4886 IN PADAPTER_OBJECT AdapterObject,
4887 IN PMDL Mdl,
4888 IN PVOID MapRegisterBase,
4889 IN PVOID CurrentVa,
4890 IN ULONG Length,
4891 IN BOOLEAN WriteToDevice);
4892
4893 //DECLSPEC_DEPRECATED_DDK
4894 NTHALAPI
4895 VOID
4896 NTAPI
4897 IoFreeAdapterChannel(
4898 IN PADAPTER_OBJECT AdapterObject);
4899
4900 //DECLSPEC_DEPRECATED_DDK
4901 NTHALAPI
4902 VOID
4903 NTAPI
4904 IoFreeMapRegisters(
4905 IN PADAPTER_OBJECT AdapterObject,
4906 IN PVOID MapRegisterBase,
4907 IN ULONG NumberOfMapRegisters);
4908
4909 //DECLSPEC_DEPRECATED_DDK
4910 NTHALAPI
4911 PHYSICAL_ADDRESS
4912 NTAPI
4913 IoMapTransfer(
4914 IN PADAPTER_OBJECT AdapterObject,
4915 IN PMDL Mdl,
4916 IN PVOID MapRegisterBase,
4917 IN PVOID CurrentVa,
4918 IN OUT PULONG Length,
4919 IN BOOLEAN WriteToDevice);
4920
4921
4922 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
4923 #endif // !defined(DMA_MACROS_DEFINED)
4924
4925 NTKERNELAPI
4926 NTSTATUS
4927 NTAPI
4928 IoAssignResources(
4929 IN PUNICODE_STRING RegistryPath,
4930 IN PUNICODE_STRING DriverClassName OPTIONAL,
4931 IN PDRIVER_OBJECT DriverObject,
4932 IN PDEVICE_OBJECT DeviceObject OPTIONAL,
4933 IN PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources,
4934 IN OUT PCM_RESOURCE_LIST *AllocatedResources);
4935
4936 NTKERNELAPI
4937 NTSTATUS
4938 NTAPI
4939 IoAttachDeviceByPointer(
4940 IN PDEVICE_OBJECT SourceDevice,
4941 IN PDEVICE_OBJECT TargetDevice);
4942
4943 NTKERNELAPI
4944 BOOLEAN
4945 NTAPI
4946 MmIsNonPagedSystemAddressValid(
4947 IN PVOID VirtualAddress);
4948
4949 #if defined(_AMD64_) || defined(_IA64_)
4950 //DECLSPEC_DEPRECATED_DDK_WINXP
4951 static __inline
4952 LARGE_INTEGER
4953 NTAPI_INLINE
4954 RtlLargeIntegerDivide(
4955 IN LARGE_INTEGER Dividend,
4956 IN LARGE_INTEGER Divisor,
4957 IN OUT PLARGE_INTEGER Remainder)
4958 {
4959 LARGE_INTEGER ret;
4960 ret.QuadPart = Dividend.QuadPart / Divisor.QuadPart;
4961 if (Remainder)
4962 Remainder->QuadPart = Dividend.QuadPart % Divisor.QuadPart;
4963 return ret;
4964 }
4965 #else
4966 NTSYSAPI
4967 LARGE_INTEGER
4968 NTAPI
4969 RtlLargeIntegerDivide(
4970 IN LARGE_INTEGER Dividend,
4971 IN LARGE_INTEGER Divisor,
4972 IN OUT PLARGE_INTEGER Remainder);
4973 #endif
4974
4975 NTKERNELAPI
4976 INTERLOCKED_RESULT
4977 NTAPI
4978 ExInterlockedDecrementLong(
4979 IN PLONG Addend,
4980 IN PKSPIN_LOCK Lock);
4981
4982 NTKERNELAPI
4983 ULONG
4984 NTAPI
4985 ExInterlockedExchangeUlong(
4986 IN PULONG Target,
4987 IN ULONG Value,
4988 IN PKSPIN_LOCK Lock);
4989
4990 NTKERNELAPI
4991 INTERLOCKED_RESULT
4992 NTAPI
4993 ExInterlockedIncrementLong(
4994 IN PLONG Addend,
4995 IN PKSPIN_LOCK Lock);
4996
4997 NTHALAPI
4998 VOID
4999 NTAPI
5000 HalAcquireDisplayOwnership(
5001 IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters);
5002
5003 NTHALAPI
5004 NTSTATUS
5005 NTAPI
5006 HalAllocateAdapterChannel(
5007 IN PADAPTER_OBJECT AdapterObject,
5008 IN PWAIT_CONTEXT_BLOCK Wcb,
5009 IN ULONG NumberOfMapRegisters,
5010 IN PDRIVER_CONTROL ExecutionRoutine);
5011
5012 NTHALAPI
5013 PVOID
5014 NTAPI
5015 HalAllocateCommonBuffer(
5016 IN PADAPTER_OBJECT AdapterObject,
5017 IN ULONG Length,
5018 OUT PPHYSICAL_ADDRESS LogicalAddress,
5019 IN BOOLEAN CacheEnabled);
5020
5021 NTHALAPI
5022 NTSTATUS
5023 NTAPI
5024 HalAssignSlotResources(
5025 IN PUNICODE_STRING RegistryPath,
5026 IN PUNICODE_STRING DriverClassName,
5027 IN PDRIVER_OBJECT DriverObject,
5028 IN PDEVICE_OBJECT DeviceObject,
5029 IN INTERFACE_TYPE BusType,
5030 IN ULONG BusNumber,
5031 IN ULONG SlotNumber,
5032 IN OUT PCM_RESOURCE_LIST *AllocatedResources);
5033
5034 NTHALAPI
5035 VOID
5036 NTAPI
5037 HalFreeCommonBuffer(
5038 IN PADAPTER_OBJECT AdapterObject,
5039 IN ULONG Length,
5040 IN PHYSICAL_ADDRESS LogicalAddress,
5041 IN PVOID VirtualAddress,
5042 IN BOOLEAN CacheEnabled);
5043
5044 NTHALAPI
5045 PADAPTER_OBJECT
5046 NTAPI
5047 HalGetAdapter(
5048 IN PDEVICE_DESCRIPTION DeviceDescription,
5049 IN OUT PULONG NumberOfMapRegisters);
5050
5051 NTHALAPI
5052 ULONG
5053 NTAPI
5054 HalGetBusData(
5055 IN BUS_DATA_TYPE BusDataType,
5056 IN ULONG BusNumber,
5057 IN ULONG SlotNumber,
5058 IN PVOID Buffer,
5059 IN ULONG Length);
5060
5061 NTHALAPI
5062 ULONG
5063 NTAPI
5064 HalGetBusDataByOffset(
5065 IN BUS_DATA_TYPE BusDataType,
5066 IN ULONG BusNumber,
5067 IN ULONG SlotNumber,
5068 IN PVOID Buffer,
5069 IN ULONG Offset,
5070 IN ULONG Length);
5071
5072 NTHALAPI
5073 ULONG
5074 NTAPI
5075 HalGetDmaAlignmentRequirement(
5076 VOID);
5077
5078 NTHALAPI
5079 ULONG
5080 NTAPI
5081 HalGetInterruptVector(
5082 IN INTERFACE_TYPE InterfaceType,
5083 IN ULONG BusNumber,
5084 IN ULONG BusInterruptLevel,
5085 IN ULONG BusInterruptVector,
5086 OUT PKIRQL Irql,
5087 OUT PKAFFINITY Affinity);
5088
5089 NTHALAPI
5090 ULONG
5091 NTAPI
5092 HalReadDmaCounter(
5093 IN PADAPTER_OBJECT AdapterObject);
5094
5095 NTHALAPI
5096 ULONG
5097 NTAPI
5098 HalSetBusData(
5099 IN BUS_DATA_TYPE BusDataType,
5100 IN ULONG BusNumber,
5101 IN ULONG SlotNumber,
5102 IN PVOID Buffer,
5103 IN ULONG Length);
5104
5105 NTHALAPI
5106 ULONG
5107 NTAPI
5108 HalSetBusDataByOffset(
5109 IN BUS_DATA_TYPE BusDataType,
5110 IN ULONG BusNumber,
5111 IN ULONG SlotNumber,
5112 IN PVOID Buffer,
5113 IN ULONG Offset,
5114 IN ULONG Length);
5115
5116 NTHALAPI
5117 BOOLEAN
5118 NTAPI
5119 HalTranslateBusAddress(
5120 IN INTERFACE_TYPE InterfaceType,
5121 IN ULONG BusNumber,
5122 IN PHYSICAL_ADDRESS BusAddress,
5123 IN OUT PULONG AddressSpace,
5124 OUT PPHYSICAL_ADDRESS TranslatedAddress);
5125
5126 NTSYSAPI
5127 BOOLEAN
5128 NTAPI
5129 RtlLargeIntegerEqualToZero(
5130 IN LARGE_INTEGER Operand);
5131
5132 NTSYSAPI
5133 BOOLEAN
5134 NTAPI
5135 RtlLargeIntegerGreaterOrEqualToZero(
5136 IN LARGE_INTEGER Operand);
5137
5138 NTSYSAPI
5139 BOOLEAN
5140 NTAPI
5141 RtlLargeIntegerGreaterThan(
5142 IN LARGE_INTEGER Operand1,
5143 IN LARGE_INTEGER Operand2);
5144
5145 NTSYSAPI
5146 BOOLEAN
5147 NTAPI
5148 RtlLargeIntegerGreaterThanOrEqualTo(
5149 IN LARGE_INTEGER Operand1,
5150 IN LARGE_INTEGER Operand2);
5151
5152 NTSYSAPI
5153 BOOLEAN
5154 NTAPI
5155 RtlLargeIntegerGreaterThanZero(
5156 IN LARGE_INTEGER Operand);
5157
5158 NTSYSAPI
5159 BOOLEAN
5160 NTAPI
5161 RtlLargeIntegerLessOrEqualToZero(
5162 IN LARGE_INTEGER Operand);
5163
5164 NTSYSAPI
5165 BOOLEAN
5166 NTAPI
5167 RtlLargeIntegerLessThan(
5168 IN LARGE_INTEGER Operand1,
5169 IN LARGE_INTEGER Operand2);
5170
5171 NTSYSAPI
5172 BOOLEAN
5173 NTAPI
5174 RtlLargeIntegerLessThanOrEqualTo(
5175 IN LARGE_INTEGER Operand1,
5176 IN LARGE_INTEGER Operand2);
5177
5178 NTSYSAPI
5179 BOOLEAN
5180 NTAPI
5181 RtlLargeIntegerLessThanZero(
5182 IN LARGE_INTEGER Operand);
5183
5184 NTSYSAPI
5185 LARGE_INTEGER
5186 NTAPI
5187 RtlLargeIntegerNegate(
5188 IN LARGE_INTEGER Subtrahend);
5189
5190 NTSYSAPI
5191 BOOLEAN
5192 NTAPI
5193 RtlLargeIntegerNotEqualTo(
5194 IN LARGE_INTEGER Operand1,
5195 IN LARGE_INTEGER Operand2);
5196
5197 NTSYSAPI
5198 BOOLEAN
5199 NTAPI
5200 RtlLargeIntegerNotEqualToZero(
5201 IN LARGE_INTEGER Operand);
5202
5203 NTSYSAPI
5204 LARGE_INTEGER
5205 NTAPI
5206 RtlLargeIntegerShiftLeft(
5207 IN LARGE_INTEGER LargeInteger,
5208 IN CCHAR ShiftCount);
5209
5210 NTSYSAPI
5211 LARGE_INTEGER
5212 NTAPI
5213 RtlLargeIntegerShiftRight(
5214 IN LARGE_INTEGER LargeInteger,
5215 IN CCHAR ShiftCount);
5216
5217 NTSYSAPI
5218 LARGE_INTEGER
5219 NTAPI
5220 RtlLargeIntegerSubtract(
5221 IN LARGE_INTEGER Minuend,
5222 IN LARGE_INTEGER Subtrahend);
5223
5224
5225 /*
5226 * ULONG
5227 * COMPUTE_PAGES_SPANNED(
5228 * IN PVOID Va,
5229 * IN ULONG Size)
5230 */
5231 #define COMPUTE_PAGES_SPANNED(Va, \
5232 Size) \
5233 (ADDRESS_AND_SIZE_TO_SPAN_PAGES(Va, Size))
5234
5235
5236 /*
5237 ** Architecture specific structures
5238 */
5239
5240 #ifdef _X86_
5241
5242 NTKERNELAPI
5243 INTERLOCKED_RESULT
5244 FASTCALL
5245 Exfi386InterlockedIncrementLong(
5246 IN PLONG Addend);
5247
5248 NTKERNELAPI
5249 INTERLOCKED_RESULT
5250 FASTCALL
5251 Exfi386InterlockedDecrementLong(
5252 IN PLONG Addend);
5253
5254 NTKERNELAPI
5255 ULONG
5256 FASTCALL
5257 Exfi386InterlockedExchangeUlong(
5258 IN PULONG Target,
5259 IN ULONG Value);
5260
5261 #define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend)
5262 #define ExInterlockedDecrementLong(Addend,Lock) Exfi386InterlockedDecrementLong(Addend)
5263 #define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value)
5264
5265 #endif /* _X86_ */
5266
5267 #ifdef _M_ARM
5268 //
5269 // NT-ARM is not documented
5270 //
5271 #include <armddk.h>
5272 #endif
5273
5274 #ifdef __cplusplus
5275 }
5276 #endif
5277
5278 #endif /* __WINDDK_H */