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