096056478ac7a7f4a5953fc2b038da3e0df9908c
[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
5800
5801 #if defined(_X86_) || defined(_AMD64_)
5802
5803 //
5804 // x86 and x64 performs a 0x2C interrupt
5805 //
5806 #define DbgRaiseAssertionFailure __int2c
5807
5808 #elif defined(_ARM_)
5809
5810 //
5811 // TODO
5812 //
5813
5814 #else
5815 #error Unsupported Architecture
5816 #endif
5817
5818 #if DBG
5819
5820 #define ASSERT(exp) \
5821 (VOID)((!(exp)) ? \
5822 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ), FALSE : TRUE)
5823
5824 #define ASSERTMSG(msg, exp) \
5825 (VOID)((!(exp)) ? \
5826 RtlAssert( #exp, __FILE__, __LINE__, msg ), FALSE : TRUE)
5827
5828 #define RTL_SOFT_ASSERT(exp) \
5829 (VOID)((!(exp)) ? \
5830 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE)
5831
5832 #define RTL_SOFT_ASSERTMSG(msg, exp) \
5833 (VOID)((!(exp)) ? \
5834 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE)
5835
5836 #define RTL_VERIFY(exp) ASSERT(exp)
5837 #define RTL_VERIFYMSG(msg, exp) ASSERT(msg, exp)
5838
5839 #define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
5840 #define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
5841
5842 #if defined(_MSC_VER)
5843
5844 #define NT_ASSERT(exp) \
5845 ((!(exp)) ? \
5846 (__annotation(L"Debug", L"AssertFail", L#exp), \
5847 DbgRaiseAssertionFailure(), FALSE) : TRUE)
5848
5849 #define NT_ASSERTMSG(msg, exp) \
5850 ((!(exp)) ? \
5851 (__annotation(L"Debug", L"AssertFail", L##msg), \
5852 DbgRaiseAssertionFailure(), FALSE) : TRUE)
5853
5854 #define NT_ASSERTMSGW(msg, exp) \
5855 ((!(exp)) ? \
5856 (__annotation(L"Debug", L"AssertFail", msg), \
5857 DbgRaiseAssertionFailure(), FALSE) : TRUE)
5858
5859 #else
5860
5861 //
5862 // GCC doesn't support __annotation (nor PDB)
5863 //
5864 #define NT_ASSERT(exp) \
5865 (VOID)((!(exp)) ? (DbgRaiseAssertionFailure(), FALSE) : TRUE)
5866
5867 #define NT_ASSERTMSG NT_ASSERT
5868 #define NT_ASSERTMSGW NT_ASSERT
5869
5870 #endif
5871
5872 #else /* !DBG */
5873
5874 #define ASSERT(exp) ((VOID) 0)
5875 #define ASSERTMSG(msg, exp) ((VOID) 0)
5876
5877 #define RTL_SOFT_ASSERT(exp) ((VOID) 0)
5878 #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
5879
5880 #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
5881 #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
5882
5883 #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
5884 #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
5885
5886 #define NT_ASSERT(exp) ((VOID)0)
5887 #define NT_ASSERTMSG(exp) ((VOID)0)
5888 #define NT_ASSERTMSGW(exp) ((VOID)0)
5889
5890 #endif /* DBG */
5891
5892 /* HACK HACK HACK - GCC (or perhaps LD) is messing this up */
5893 #if defined(_NTSYSTEM_) || defined(__GNUC__)
5894 #define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag
5895 #define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag
5896 #else
5897 #define NLS_MB_CODE_PAGE_TAG (*NlsMbCodePageTag)
5898 #define NLS_MB_OEM_CODE_PAGE_TAG (*NlsMbOemCodePageTag)
5899 #endif /* _NT_SYSTEM */
5900
5901 extern BOOLEAN NTSYSAPI NLS_MB_CODE_PAGE_TAG;
5902 extern BOOLEAN NTSYSAPI NLS_MB_OEM_CODE_PAGE_TAG;
5903
5904 /*
5905 ** Driver support routines
5906 */
5907
5908 /** Runtime library routines **/
5909
5910 static __inline VOID
5911 InitializeListHead(
5912 IN PLIST_ENTRY ListHead)
5913 {
5914 ListHead->Flink = ListHead->Blink = ListHead;
5915 }
5916
5917 static __inline VOID
5918 InsertHeadList(
5919 IN PLIST_ENTRY ListHead,
5920 IN PLIST_ENTRY Entry)
5921 {
5922 PLIST_ENTRY OldFlink;
5923 OldFlink = ListHead->Flink;
5924 Entry->Flink = OldFlink;
5925 Entry->Blink = ListHead;
5926 OldFlink->Blink = Entry;
5927 ListHead->Flink = Entry;
5928 }
5929
5930 static __inline VOID
5931 InsertTailList(
5932 IN PLIST_ENTRY ListHead,
5933 IN PLIST_ENTRY Entry)
5934 {
5935 PLIST_ENTRY OldBlink;
5936 OldBlink = ListHead->Blink;
5937 Entry->Flink = ListHead;
5938 Entry->Blink = OldBlink;
5939 OldBlink->Flink = Entry;
5940 ListHead->Blink = Entry;
5941 }
5942
5943 /*
5944 * BOOLEAN
5945 * IsListEmpty(
5946 * IN PLIST_ENTRY ListHead)
5947 */
5948 #define IsListEmpty(_ListHead) \
5949 ((_ListHead)->Flink == (_ListHead))
5950
5951 /*
5952 * PSINGLE_LIST_ENTRY
5953 * PopEntryList(
5954 * IN PSINGLE_LIST_ENTRY ListHead)
5955 */
5956 #define PopEntryList(ListHead) \
5957 (ListHead)->Next; \
5958 { \
5959 PSINGLE_LIST_ENTRY _FirstEntry; \
5960 _FirstEntry = (ListHead)->Next; \
5961 if (_FirstEntry != NULL) \
5962 (ListHead)->Next = _FirstEntry->Next; \
5963 }
5964
5965 /*
5966 * VOID
5967 * PushEntryList(
5968 * IN PSINGLE_LIST_ENTRY ListHead,
5969 * IN PSINGLE_LIST_ENTRY Entry)
5970 */
5971 #define PushEntryList(_ListHead, _Entry) \
5972 (_Entry)->Next = (_ListHead)->Next; \
5973 (_ListHead)->Next = (_Entry); \
5974
5975 static __inline BOOLEAN
5976 RemoveEntryList(
5977 IN PLIST_ENTRY Entry)
5978 {
5979 PLIST_ENTRY OldFlink;
5980 PLIST_ENTRY OldBlink;
5981
5982 OldFlink = Entry->Flink;
5983 OldBlink = Entry->Blink;
5984 OldFlink->Blink = OldBlink;
5985 OldBlink->Flink = OldFlink;
5986 return (BOOLEAN)(OldFlink == OldBlink);
5987 }
5988
5989 static __inline PLIST_ENTRY
5990 RemoveHeadList(
5991 IN PLIST_ENTRY ListHead)
5992 {
5993 PLIST_ENTRY Flink;
5994 PLIST_ENTRY Entry;
5995
5996 Entry = ListHead->Flink;
5997 Flink = Entry->Flink;
5998 ListHead->Flink = Flink;
5999 Flink->Blink = ListHead;
6000 return Entry;
6001 }
6002
6003 static __inline PLIST_ENTRY
6004 RemoveTailList(
6005 IN PLIST_ENTRY ListHead)
6006 {
6007 PLIST_ENTRY Blink;
6008 PLIST_ENTRY Entry;
6009
6010 Entry = ListHead->Blink;
6011 Blink = Entry->Blink;
6012 ListHead->Blink = Blink;
6013 Blink->Flink = ListHead;
6014 return Entry;
6015 }
6016
6017 NTSYSAPI
6018 NTSTATUS
6019 NTAPI
6020 RtlCharToInteger(
6021 IN PCSZ String,
6022 IN ULONG Base OPTIONAL,
6023 IN OUT PULONG Value);
6024
6025 NTSYSAPI
6026 LONG
6027 NTAPI
6028 RtlCompareString(
6029 IN PSTRING String1,
6030 IN PSTRING String2,
6031 BOOLEAN CaseInSensitive);
6032
6033 #if !defined(MIDL_PASS)
6034
6035 FORCEINLINE
6036 LUID
6037 NTAPI
6038 RtlConvertLongToLuid(
6039 IN LONG Val)
6040 {
6041 LUID Luid;
6042 LARGE_INTEGER Temp;
6043
6044 Temp.QuadPart = Val;
6045 Luid.LowPart = Temp.u.LowPart;
6046 Luid.HighPart = Temp.u.HighPart;
6047
6048 return Luid;
6049 }
6050
6051 FORCEINLINE
6052 LUID
6053 NTAPI
6054 RtlConvertUlongToLuid(
6055 IN ULONG Val)
6056 {
6057 LUID Luid;
6058
6059 Luid.LowPart = Val;
6060 Luid.HighPart = 0;
6061
6062 return Luid;
6063 }
6064 #endif
6065
6066
6067 NTSYSAPI
6068 VOID
6069 NTAPI
6070 RtlCopyMemory32(
6071 IN VOID UNALIGNED *Destination,
6072 IN CONST VOID UNALIGNED *Source,
6073 IN ULONG Length);
6074
6075 NTSYSAPI
6076 VOID
6077 NTAPI
6078 RtlCopyString(
6079 IN OUT PSTRING DestinationString,
6080 IN PSTRING SourceString OPTIONAL);
6081
6082 NTSYSAPI
6083 BOOLEAN
6084 NTAPI
6085 RtlEqualString(
6086 IN PSTRING String1,
6087 IN PSTRING String2,
6088 IN BOOLEAN CaseInSensitive);
6089
6090 #if (defined(_M_AMD64) || defined(_M_IA64)) && !defined(_REALLY_GET_CALLERS_CALLER_)
6091 #define RtlGetCallersAddress(CallersAddress, CallersCaller) \
6092 *CallersAddress = (PVOID)_ReturnAddress(); \
6093 *CallersCaller = NULL;
6094 #else
6095 NTSYSAPI
6096 VOID
6097 NTAPI
6098 RtlGetCallersAddress(
6099 OUT PVOID *CallersAddress,
6100 OUT PVOID *CallersCaller);
6101 #endif
6102
6103 NTSYSAPI
6104 NTSTATUS
6105 NTAPI
6106 RtlGetVersion(
6107 IN OUT PRTL_OSVERSIONINFOW lpVersionInformation);
6108
6109 NTSYSAPI
6110 VOID
6111 NTAPI
6112 RtlMapGenericMask(
6113 IN OUT PACCESS_MASK AccessMask,
6114 IN PGENERIC_MAPPING GenericMapping);
6115
6116 NTSYSAPI
6117 BOOLEAN
6118 NTAPI
6119 RtlPrefixUnicodeString(
6120 IN PCUNICODE_STRING String1,
6121 IN PCUNICODE_STRING String2,
6122 IN BOOLEAN CaseInSensitive);
6123
6124 NTSYSAPI
6125 NTSTATUS
6126 NTAPI
6127 RtlUpcaseUnicodeString(
6128 IN OUT PUNICODE_STRING DestinationString OPTIONAL,
6129 IN PCUNICODE_STRING SourceString,
6130 IN BOOLEAN AllocateDestinationString);
6131
6132 NTSYSAPI
6133 CHAR
6134 NTAPI
6135 RtlUpperChar(
6136 IN CHAR Character);
6137
6138 NTSYSAPI
6139 VOID
6140 NTAPI
6141 RtlUpperString(
6142 IN OUT PSTRING DestinationString,
6143 IN PSTRING SourceString);
6144
6145 NTSYSAPI
6146 NTSTATUS
6147 NTAPI
6148 RtlVerifyVersionInfo(
6149 IN PRTL_OSVERSIONINFOEXW VersionInfo,
6150 IN ULONG TypeMask,
6151 IN ULONGLONG ConditionMask);
6152
6153 NTSYSAPI
6154 NTSTATUS
6155 NTAPI
6156 RtlVolumeDeviceToDosName(
6157 IN PVOID VolumeDeviceObject,
6158 OUT PUNICODE_STRING DosName);
6159
6160 NTSYSAPI
6161 ULONG
6162 NTAPI
6163 RtlWalkFrameChain(
6164 OUT PVOID *Callers,
6165 IN ULONG Count,
6166 IN ULONG Flags);
6167
6168 NTKERNELAPI
6169 BOOLEAN
6170 NTAPI
6171 KeAreAllApcsDisabled(
6172 VOID
6173 );
6174
6175 /* Guarded Mutex routines */
6176
6177 NTKERNELAPI
6178 VOID
6179 FASTCALL
6180 KeAcquireGuardedMutex(
6181 IN OUT PKGUARDED_MUTEX GuardedMutex
6182 );
6183
6184 NTKERNELAPI
6185 VOID
6186 FASTCALL
6187 KeAcquireGuardedMutexUnsafe(
6188 IN OUT PKGUARDED_MUTEX GuardedMutex
6189 );
6190
6191 NTKERNELAPI
6192 VOID
6193 NTAPI
6194 KeEnterGuardedRegion(
6195 VOID
6196 );
6197
6198 NTKERNELAPI
6199 VOID
6200 NTAPI
6201 KeLeaveGuardedRegion(
6202 VOID
6203 );
6204
6205 NTKERNELAPI
6206 VOID
6207 FASTCALL
6208 KeInitializeGuardedMutex(
6209 OUT PKGUARDED_MUTEX GuardedMutex
6210 );
6211
6212 NTKERNELAPI
6213 VOID
6214 FASTCALL
6215 KeReleaseGuardedMutexUnsafe(
6216 IN OUT PKGUARDED_MUTEX GuardedMutex
6217 );
6218
6219 NTKERNELAPI
6220 VOID
6221 FASTCALL
6222 KeReleaseGuardedMutex(
6223 IN OUT PKGUARDED_MUTEX GuardedMutex
6224 );
6225
6226 NTKERNELAPI
6227 BOOLEAN
6228 FASTCALL
6229 KeTryToAcquireGuardedMutex(
6230 IN OUT PKGUARDED_MUTEX GuardedMutex
6231 );
6232
6233 /* Fast Mutex */
6234 #define ExInitializeFastMutex(_FastMutex) \
6235 { \
6236 (_FastMutex)->Count = FM_LOCK_BIT; \
6237 (_FastMutex)->Owner = NULL; \
6238 (_FastMutex)->Contention = 0; \
6239 KeInitializeEvent(&(_FastMutex)->Gate, SynchronizationEvent, FALSE); \
6240 }
6241
6242 NTKERNELAPI
6243 VOID
6244 NTAPI
6245 KeInitializeEvent(
6246 IN PRKEVENT Event,
6247 IN EVENT_TYPE Type,
6248 IN BOOLEAN State);
6249
6250 /******************************************************************************
6251 * Executive Types *
6252 ******************************************************************************/
6253
6254 typedef struct _ZONE_SEGMENT_HEADER {
6255 SINGLE_LIST_ENTRY SegmentList;
6256 PVOID Reserved;
6257 } ZONE_SEGMENT_HEADER, *PZONE_SEGMENT_HEADER;
6258
6259 typedef struct _ZONE_HEADER {
6260 SINGLE_LIST_ENTRY FreeList;
6261 SINGLE_LIST_ENTRY SegmentList;
6262 ULONG BlockSize;
6263 ULONG TotalSegmentSize;
6264 } ZONE_HEADER, *PZONE_HEADER;
6265
6266 #define PROTECTED_POOL 0x80000000
6267
6268 /******************************************************************************
6269 * Executive Functions *
6270 ******************************************************************************/
6271
6272 NTKERNELAPI
6273 NTSTATUS
6274 NTAPI
6275 ExExtendZone(
6276 IN PZONE_HEADER Zone,
6277 IN PVOID Segment,
6278 IN ULONG SegmentSize);
6279
6280 static __inline PVOID
6281 ExAllocateFromZone(
6282 IN PZONE_HEADER Zone)
6283 {
6284 if (Zone->FreeList.Next)
6285 Zone->FreeList.Next = Zone->FreeList.Next->Next;
6286 return (PVOID) Zone->FreeList.Next;
6287 }
6288
6289 static __inline PVOID
6290 ExFreeToZone(
6291 IN PZONE_HEADER Zone,
6292 IN PVOID Block)
6293 {
6294 ((PSINGLE_LIST_ENTRY) Block)->Next = Zone->FreeList.Next;
6295 Zone->FreeList.Next = ((PSINGLE_LIST_ENTRY) Block);
6296 return ((PSINGLE_LIST_ENTRY) Block)->Next;
6297 }
6298
6299 NTKERNELAPI
6300 NTSTATUS
6301 NTAPI
6302 ExInitializeZone(
6303 IN PZONE_HEADER Zone,
6304 IN ULONG BlockSize,
6305 IN PVOID InitialSegment,
6306 IN ULONG InitialSegmentSize);
6307
6308 /*
6309 * PVOID
6310 * ExInterlockedAllocateFromZone(
6311 * IN PZONE_HEADER Zone,
6312 * IN PKSPIN_LOCK Lock)
6313 */
6314 #define ExInterlockedAllocateFromZone(Zone, Lock) \
6315 ((PVOID) ExInterlockedPopEntryList(&Zone->FreeList, Lock))
6316
6317 NTKERNELAPI
6318 NTSTATUS
6319 NTAPI
6320 ExInterlockedExtendZone(
6321 IN PZONE_HEADER Zone,
6322 IN PVOID Segment,
6323 IN ULONG SegmentSize,
6324 IN PKSPIN_LOCK Lock);
6325
6326 /* PVOID
6327 * ExInterlockedFreeToZone(
6328 * IN PZONE_HEADER Zone,
6329 * IN PVOID Block,
6330 * IN PKSPIN_LOCK Lock);
6331 */
6332 #define ExInterlockedFreeToZone(Zone, Block, Lock) \
6333 ExInterlockedPushEntryList(&(Zone)->FreeList, (PSINGLE_LIST_ENTRY)(Block), Lock)
6334
6335 /*
6336 * VOID
6337 * InitializeSListHead(
6338 * IN PSLIST_HEADER SListHead)
6339 */
6340 #define InitializeSListHead(_SListHead) \
6341 (_SListHead)->Alignment = 0
6342
6343 #define ExInitializeSListHead InitializeSListHead
6344
6345 /*
6346 * BOOLEAN
6347 * ExIsFullZone(
6348 * IN PZONE_HEADER Zone)
6349 */
6350 #define ExIsFullZone(Zone) \
6351 ((Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY) NULL)
6352
6353 /* BOOLEAN
6354 * ExIsObjectInFirstZoneSegment(
6355 * IN PZONE_HEADER Zone,
6356 * IN PVOID Object);
6357 */
6358 #define ExIsObjectInFirstZoneSegment(Zone,Object) \
6359 ((BOOLEAN)( ((PUCHAR)(Object) >= (PUCHAR)(Zone)->SegmentList.Next) && \
6360 ((PUCHAR)(Object) < (PUCHAR)(Zone)->SegmentList.Next + \
6361 (Zone)->TotalSegmentSize)) )
6362
6363 NTKERNELAPI
6364 DECLSPEC_NORETURN
6365 VOID
6366 NTAPI
6367 ExRaiseAccessViolation(
6368 VOID);
6369
6370 NTKERNELAPI
6371 DECLSPEC_NORETURN
6372 VOID
6373 NTAPI
6374 ExRaiseDatatypeMisalignment(
6375 VOID);
6376
6377 NTKERNELAPI
6378 NTSTATUS
6379 NTAPI
6380 ExUuidCreate(
6381 OUT UUID *Uuid);
6382
6383 #define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite
6384 #define ExAcquireResourceShared ExAcquireResourceSharedLite
6385 #define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite
6386 #define ExDeleteResource ExDeleteResourceLite
6387 #define ExInitializeResource ExInitializeResourceLite
6388 #define ExIsResourceAcquiredExclusive ExIsResourceAcquiredExclusiveLite
6389 #define ExIsResourceAcquiredShared ExIsResourceAcquiredSharedLite
6390 #define ExIsResourceAcquired ExIsResourceAcquiredSharedLite
6391 #define ExReleaseResourceForThread ExReleaseResourceForThreadLite
6392
6393
6394 #if DBG
6395
6396 #define PAGED_CODE() { \
6397 if (KeGetCurrentIrql() > APC_LEVEL) { \
6398 KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
6399 ASSERT(FALSE); \
6400 } \
6401 }
6402
6403 #else
6404
6405 #define PAGED_CODE()
6406
6407 #endif
6408
6409 NTKERNELAPI
6410 VOID
6411 NTAPI
6412 ProbeForRead(
6413 IN CONST VOID *Address,
6414 IN SIZE_T Length,
6415 IN ULONG Alignment);
6416
6417 NTKERNELAPI
6418 VOID
6419 NTAPI
6420 ProbeForWrite(
6421 IN PVOID Address,
6422 IN SIZE_T Length,
6423 IN ULONG Alignment);
6424
6425
6426
6427 /** Configuration manager routines **/
6428
6429 NTKERNELAPI
6430 NTSTATUS
6431 NTAPI
6432 CmRegisterCallback(
6433 IN PEX_CALLBACK_FUNCTION Function,
6434 IN PVOID Context,
6435 IN OUT PLARGE_INTEGER Cookie);
6436
6437 NTKERNELAPI
6438 NTSTATUS
6439 NTAPI
6440 CmUnRegisterCallback(
6441 IN LARGE_INTEGER Cookie);
6442
6443
6444
6445 /** Filesystem runtime library routines **/
6446
6447 NTKERNELAPI
6448 BOOLEAN
6449 NTAPI
6450 FsRtlIsTotalDeviceFailure(
6451 IN NTSTATUS Status);
6452
6453
6454
6455 /** Hardware abstraction layer routines **/
6456
6457 NTHALAPI
6458 BOOLEAN
6459 NTAPI
6460 HalMakeBeep(
6461 IN ULONG Frequency);
6462
6463 NTKERNELAPI
6464 VOID
6465 FASTCALL
6466 HalExamineMBR(
6467 IN PDEVICE_OBJECT DeviceObject,
6468 IN ULONG SectorSize,
6469 IN ULONG MBRTypeIdentifier,
6470 OUT PVOID *Buffer);
6471
6472 VOID
6473 NTAPI
6474 HalPutDmaAdapter(
6475 PADAPTER_OBJECT AdapterObject
6476 );
6477
6478
6479 /** Io access routines **/
6480
6481 #if !defined(_M_AMD64)
6482 NTHALAPI
6483 VOID
6484 NTAPI
6485 READ_PORT_BUFFER_UCHAR(
6486 IN PUCHAR Port,
6487 IN PUCHAR Buffer,
6488 IN ULONG Count);
6489
6490 NTHALAPI
6491 VOID
6492 NTAPI
6493 READ_PORT_BUFFER_ULONG(
6494 IN PULONG Port,
6495 IN PULONG Buffer,
6496 IN ULONG Count);
6497
6498 NTHALAPI
6499 VOID
6500 NTAPI
6501 READ_PORT_BUFFER_USHORT(
6502 IN PUSHORT Port,
6503 IN PUSHORT Buffer,
6504 IN ULONG Count);
6505
6506 NTHALAPI
6507 UCHAR
6508 NTAPI
6509 READ_PORT_UCHAR(
6510 IN PUCHAR Port);
6511
6512 NTHALAPI
6513 ULONG
6514 NTAPI
6515 READ_PORT_ULONG(
6516 IN PULONG Port);
6517
6518 NTHALAPI
6519 USHORT
6520 NTAPI
6521 READ_PORT_USHORT(
6522 IN PUSHORT Port);
6523
6524 NTKERNELAPI
6525 VOID
6526 NTAPI
6527 READ_REGISTER_BUFFER_UCHAR(
6528 IN PUCHAR Register,
6529 IN PUCHAR Buffer,
6530 IN ULONG Count);
6531
6532 NTKERNELAPI
6533 VOID
6534 NTAPI
6535 READ_REGISTER_BUFFER_ULONG(
6536 IN PULONG Register,
6537 IN PULONG Buffer,
6538 IN ULONG Count);
6539
6540 NTKERNELAPI
6541 VOID
6542 NTAPI
6543 READ_REGISTER_BUFFER_USHORT(
6544 IN PUSHORT Register,
6545 IN PUSHORT Buffer,
6546 IN ULONG Count);
6547
6548 NTKERNELAPI
6549 UCHAR
6550 NTAPI
6551 READ_REGISTER_UCHAR(
6552 IN PUCHAR Register);
6553
6554 NTKERNELAPI
6555 ULONG
6556 NTAPI
6557 READ_REGISTER_ULONG(
6558 IN PULONG Register);
6559
6560 NTKERNELAPI
6561 USHORT
6562 NTAPI
6563 READ_REGISTER_USHORT(
6564 IN PUSHORT Register);
6565
6566 NTHALAPI
6567 VOID
6568 NTAPI
6569 WRITE_PORT_BUFFER_UCHAR(
6570 IN PUCHAR Port,
6571 IN PUCHAR Buffer,
6572 IN ULONG Count);
6573
6574 NTHALAPI
6575 VOID
6576 NTAPI
6577 WRITE_PORT_BUFFER_ULONG(
6578 IN PULONG Port,
6579 IN PULONG Buffer,
6580 IN ULONG Count);
6581
6582 NTHALAPI
6583 VOID
6584 NTAPI
6585 WRITE_PORT_BUFFER_USHORT(
6586 IN PUSHORT Port,
6587 IN PUSHORT Buffer,
6588 IN ULONG Count);
6589
6590 NTHALAPI
6591 VOID
6592 NTAPI
6593 WRITE_PORT_UCHAR(
6594 IN PUCHAR Port,
6595 IN UCHAR Value);
6596
6597 NTHALAPI
6598 VOID
6599 NTAPI
6600 WRITE_PORT_ULONG(
6601 IN PULONG Port,
6602 IN ULONG Value);
6603
6604 NTHALAPI
6605 VOID
6606 NTAPI
6607 WRITE_PORT_USHORT(
6608 IN PUSHORT Port,
6609 IN USHORT Value);
6610
6611 NTKERNELAPI
6612 VOID
6613 NTAPI
6614 WRITE_REGISTER_BUFFER_UCHAR(
6615 IN PUCHAR Register,
6616 IN PUCHAR Buffer,
6617 IN ULONG Count);
6618
6619 NTKERNELAPI
6620 VOID
6621 NTAPI
6622 WRITE_REGISTER_BUFFER_ULONG(
6623 IN PULONG Register,
6624 IN PULONG Buffer,
6625 IN ULONG Count);
6626
6627 NTKERNELAPI
6628 VOID
6629 NTAPI
6630 WRITE_REGISTER_BUFFER_USHORT(
6631 IN PUSHORT Register,
6632 IN PUSHORT Buffer,
6633 IN ULONG Count);
6634
6635 NTKERNELAPI
6636 VOID
6637 NTAPI
6638 WRITE_REGISTER_UCHAR(
6639 IN PUCHAR Register,
6640 IN UCHAR Value);
6641
6642 NTKERNELAPI
6643 VOID
6644 NTAPI
6645 WRITE_REGISTER_ULONG(
6646 IN PULONG Register,
6647 IN ULONG Value);
6648
6649 NTKERNELAPI
6650 VOID
6651 NTAPI
6652 WRITE_REGISTER_USHORT(
6653 IN PUSHORT Register,
6654 IN USHORT Value);
6655
6656 #else
6657
6658 FORCEINLINE
6659 VOID
6660 READ_PORT_BUFFER_UCHAR(
6661 IN PUCHAR Port,
6662 IN PUCHAR Buffer,
6663 IN ULONG Count)
6664 {
6665 __inbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
6666 }
6667
6668 FORCEINLINE
6669 VOID
6670 READ_PORT_BUFFER_ULONG(
6671 IN PULONG Port,
6672 IN PULONG Buffer,
6673 IN ULONG Count)
6674 {
6675 __indwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
6676 }
6677
6678 FORCEINLINE
6679 VOID
6680 READ_PORT_BUFFER_USHORT(
6681 IN PUSHORT Port,
6682 IN PUSHORT Buffer,
6683 IN ULONG Count)
6684 {
6685 __inwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
6686 }
6687
6688 FORCEINLINE
6689 UCHAR
6690 READ_PORT_UCHAR(
6691 IN PUCHAR Port)
6692 {
6693 return __inbyte((USHORT)(ULONG_PTR)Port);
6694 }
6695
6696 FORCEINLINE
6697 ULONG
6698 READ_PORT_ULONG(
6699 IN PULONG Port)
6700 {
6701 return __indword((USHORT)(ULONG_PTR)Port);
6702 }
6703
6704 FORCEINLINE
6705 USHORT
6706 READ_PORT_USHORT(
6707 IN PUSHORT Port)
6708 {
6709 return __inword((USHORT)(ULONG_PTR)Port);
6710 }
6711
6712 FORCEINLINE
6713 VOID
6714 READ_REGISTER_BUFFER_UCHAR(
6715 IN PUCHAR Register,
6716 IN PUCHAR Buffer,
6717 IN ULONG Count)
6718 {
6719 __movsb(Register, Buffer, Count);
6720 }
6721
6722 FORCEINLINE
6723 VOID
6724 READ_REGISTER_BUFFER_ULONG(
6725 IN PULONG Register,
6726 IN PULONG Buffer,
6727 IN ULONG Count)
6728 {
6729 __movsd(Register, Buffer, Count);
6730 }
6731
6732 FORCEINLINE
6733 VOID
6734 READ_REGISTER_BUFFER_USHORT(
6735 IN PUSHORT Register,
6736 IN PUSHORT Buffer,
6737 IN ULONG Count)
6738 {
6739 __movsw(Register, Buffer, Count);
6740 }
6741
6742 FORCEINLINE
6743 UCHAR
6744 READ_REGISTER_UCHAR(
6745 IN PUCHAR Register)
6746 {
6747 return *Register;
6748 }
6749
6750 FORCEINLINE
6751 ULONG
6752 READ_REGISTER_ULONG(
6753 IN PULONG Register)
6754 {
6755 return *Register;
6756 }
6757
6758 FORCEINLINE
6759 USHORT
6760 READ_REGISTER_USHORT(
6761 IN PUSHORT Register)
6762 {
6763 return *Register;
6764 }
6765
6766 FORCEINLINE
6767 VOID
6768 WRITE_PORT_BUFFER_UCHAR(
6769 IN PUCHAR Port,
6770 IN PUCHAR Buffer,
6771 IN ULONG Count)
6772 {
6773 __outbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
6774 }
6775
6776 FORCEINLINE
6777 VOID
6778 WRITE_PORT_BUFFER_ULONG(
6779 IN PULONG Port,
6780 IN PULONG Buffer,
6781 IN ULONG Count)
6782 {
6783 __outdwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
6784 }
6785
6786 FORCEINLINE
6787 VOID
6788 WRITE_PORT_BUFFER_USHORT(
6789 IN PUSHORT Port,
6790 IN PUSHORT Buffer,
6791 IN ULONG Count)
6792 {
6793 __outwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
6794 }
6795
6796 FORCEINLINE
6797 VOID
6798 WRITE_PORT_UCHAR(
6799 IN PUCHAR Port,
6800 IN UCHAR Value)
6801 {
6802 __outbyte((USHORT)(ULONG_PTR)Port, Value);
6803 }
6804
6805 FORCEINLINE
6806 VOID
6807 WRITE_PORT_ULONG(
6808 IN PULONG Port,
6809 IN ULONG Value)
6810 {
6811 __outdword((USHORT)(ULONG_PTR)Port, Value);
6812 }
6813
6814 FORCEINLINE
6815 VOID
6816 WRITE_PORT_USHORT(
6817 IN PUSHORT Port,
6818 IN USHORT Value)
6819 {
6820 __outword((USHORT)(ULONG_PTR)Port, Value);
6821 }
6822
6823 FORCEINLINE
6824 VOID
6825 WRITE_REGISTER_BUFFER_UCHAR(
6826 IN PUCHAR Register,
6827 IN PUCHAR Buffer,
6828 IN ULONG Count)
6829 {
6830 LONG Synch;
6831 __movsb(Register, Buffer, Count);
6832 InterlockedOr(&Synch, 1);
6833 }
6834
6835 FORCEINLINE
6836 VOID
6837 WRITE_REGISTER_BUFFER_ULONG(
6838 IN PULONG Register,
6839 IN PULONG Buffer,
6840 IN ULONG Count)
6841 {
6842 LONG Synch;
6843 __movsd(Register, Buffer, Count);
6844 InterlockedOr(&Synch, 1);
6845 }
6846
6847 FORCEINLINE
6848 VOID
6849 WRITE_REGISTER_BUFFER_USHORT(
6850 IN PUSHORT Register,
6851 IN PUSHORT Buffer,
6852 IN ULONG Count)
6853 {
6854 LONG Synch;
6855 __movsw(Register, Buffer, Count);
6856 InterlockedOr(&Synch, 1);
6857 }
6858
6859 FORCEINLINE
6860 VOID
6861 WRITE_REGISTER_UCHAR(
6862 IN PUCHAR Register,
6863 IN UCHAR Value)
6864 {
6865 LONG Synch;
6866 *Register = Value;
6867 InterlockedOr(&Synch, 1);
6868 }
6869
6870 FORCEINLINE
6871 VOID
6872 WRITE_REGISTER_ULONG(
6873 IN PULONG Register,
6874 IN ULONG Value)
6875 {
6876 LONG Synch;
6877 *Register = Value;
6878 InterlockedOr(&Synch, 1);
6879 }
6880
6881 FORCEINLINE
6882 VOID
6883 WRITE_REGISTER_USHORT(
6884 IN PUSHORT Register,
6885 IN USHORT Value)
6886 {
6887 LONG Sync;
6888 *Register = Value;
6889 InterlockedOr(&Sync, 1);
6890 }
6891
6892 #endif
6893
6894 /** I/O manager routines **/
6895
6896 NTKERNELAPI
6897 VOID
6898 NTAPI
6899 IoAcquireCancelSpinLock(
6900 OUT PKIRQL Irql);
6901
6902 NTKERNELAPI
6903 NTSTATUS
6904 NTAPI
6905 IoAcquireRemoveLockEx(
6906 IN PIO_REMOVE_LOCK RemoveLock,
6907 IN OPTIONAL PVOID Tag OPTIONAL,
6908 IN PCSTR File,
6909 IN ULONG Line,
6910 IN ULONG RemlockSize);
6911
6912 /*
6913 * NTSTATUS
6914 * IoAcquireRemoveLock(
6915 * IN PIO_REMOVE_LOCK RemoveLock,
6916 * IN OPTIONAL PVOID Tag)
6917 */
6918 #define IoAcquireRemoveLock(_RemoveLock, \
6919 _Tag) \
6920 IoAcquireRemoveLockEx(_RemoveLock, _Tag, __FILE__, __LINE__, sizeof(IO_REMOVE_LOCK))
6921
6922 /*
6923 * VOID
6924 * IoAdjustPagingPathCount(
6925 * IN PLONG Count,
6926 * IN BOOLEAN Increment)
6927 */
6928 #define IoAdjustPagingPathCount(_Count, \
6929 _Increment) \
6930 { \
6931 if (_Increment) \
6932 { \
6933 InterlockedIncrement(_Count); \
6934 } \
6935 else \
6936 { \
6937 InterlockedDecrement(_Count); \
6938 } \
6939 }
6940
6941 #ifndef DMA_MACROS_DEFINED
6942 NTKERNELAPI
6943 NTSTATUS
6944 NTAPI
6945 IoAllocateAdapterChannel(
6946 IN PADAPTER_OBJECT AdapterObject,
6947 IN PDEVICE_OBJECT DeviceObject,
6948 IN ULONG NumberOfMapRegisters,
6949 IN PDRIVER_CONTROL ExecutionRoutine,
6950 IN PVOID Context);
6951 #endif
6952
6953 NTKERNELAPI
6954 VOID
6955 NTAPI
6956 IoAllocateController(
6957 IN PCONTROLLER_OBJECT ControllerObject,
6958 IN PDEVICE_OBJECT DeviceObject,
6959 IN PDRIVER_CONTROL ExecutionRoutine,
6960 IN PVOID Context);
6961
6962 NTKERNELAPI
6963 NTSTATUS
6964 NTAPI
6965 IoAllocateDriverObjectExtension(
6966 IN PDRIVER_OBJECT DriverObject,
6967 IN PVOID ClientIdentificationAddress,
6968 IN ULONG DriverObjectExtensionSize,
6969 OUT PVOID *DriverObjectExtension);
6970
6971 NTKERNELAPI
6972 PVOID
6973 NTAPI
6974 IoAllocateErrorLogEntry(
6975 IN PVOID IoObject,
6976 IN UCHAR EntrySize);
6977
6978 NTKERNELAPI
6979 PIRP
6980 NTAPI
6981 IoAllocateIrp(
6982 IN CCHAR StackSize,
6983 IN BOOLEAN ChargeQuota);
6984
6985 NTKERNELAPI
6986 PMDL
6987 NTAPI
6988 IoAllocateMdl(
6989 IN PVOID VirtualAddress,
6990 IN ULONG Length,
6991 IN BOOLEAN SecondaryBuffer,
6992 IN BOOLEAN ChargeQuota,
6993 IN OUT PIRP Irp OPTIONAL);
6994
6995 NTKERNELAPI
6996 PIO_WORKITEM
6997 NTAPI
6998 IoAllocateWorkItem(
6999 IN PDEVICE_OBJECT DeviceObject);
7000
7001 /*
7002 * VOID IoAssignArcName(
7003 * IN PUNICODE_STRING ArcName,
7004 * IN PUNICODE_STRING DeviceName);
7005 */
7006 #define IoAssignArcName(_ArcName, _DeviceName) ( \
7007 IoCreateSymbolicLink((_ArcName), (_DeviceName)))
7008
7009 NTKERNELAPI
7010 NTSTATUS
7011 NTAPI
7012 IoAttachDevice(
7013 IN PDEVICE_OBJECT SourceDevice,
7014 IN PUNICODE_STRING TargetDevice,
7015 OUT PDEVICE_OBJECT *AttachedDevice);
7016
7017 NTKERNELAPI
7018 PDEVICE_OBJECT
7019 NTAPI
7020 IoAttachDeviceToDeviceStack(
7021 IN PDEVICE_OBJECT SourceDevice,
7022 IN PDEVICE_OBJECT TargetDevice);
7023
7024 NTKERNELAPI
7025 PIRP
7026 NTAPI
7027 IoBuildAsynchronousFsdRequest(
7028 IN ULONG MajorFunction,
7029 IN PDEVICE_OBJECT DeviceObject,
7030 IN OUT PVOID Buffer OPTIONAL,
7031 IN ULONG Length OPTIONAL,
7032 IN PLARGE_INTEGER StartingOffset OPTIONAL,
7033 IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL);
7034
7035 NTKERNELAPI
7036 PIRP
7037 NTAPI
7038 IoBuildDeviceIoControlRequest(
7039 IN ULONG IoControlCode,
7040 IN PDEVICE_OBJECT DeviceObject,
7041 IN PVOID InputBuffer OPTIONAL,
7042 IN ULONG InputBufferLength,
7043 OUT PVOID OutputBuffer OPTIONAL,
7044 IN ULONG OutputBufferLength,
7045 IN BOOLEAN InternalDeviceIoControl,
7046 IN PKEVENT Event,
7047 OUT PIO_STATUS_BLOCK IoStatusBlock);
7048
7049 NTKERNELAPI
7050 VOID
7051 NTAPI
7052 IoBuildPartialMdl(
7053 IN PMDL SourceMdl,
7054 IN OUT PMDL TargetMdl,
7055 IN PVOID VirtualAddress,
7056 IN ULONG Length);
7057
7058 NTKERNELAPI
7059 PIRP
7060 NTAPI
7061 IoBuildSynchronousFsdRequest(
7062 IN ULONG MajorFunction,
7063 IN PDEVICE_OBJECT DeviceObject,
7064 IN OUT PVOID Buffer OPTIONAL,
7065 IN ULONG Length OPTIONAL,
7066 IN PLARGE_INTEGER StartingOffset OPTIONAL,
7067 IN PKEVENT Event,
7068 OUT PIO_STATUS_BLOCK IoStatusBlock);
7069
7070 NTKERNELAPI
7071 NTSTATUS
7072 FASTCALL
7073 IofCallDriver(
7074 IN PDEVICE_OBJECT DeviceObject,
7075 IN OUT PIRP Irp);
7076
7077 /*
7078 * NTSTATUS
7079 * IoCallDriver(
7080 * IN PDEVICE_OBJECT DeviceObject,
7081 * IN OUT PIRP Irp)
7082 */
7083 #define IoCallDriver IofCallDriver
7084
7085 NTKERNELAPI
7086 VOID
7087 NTAPI
7088 IoCancelFileOpen(
7089 IN PDEVICE_OBJECT DeviceObject,
7090 IN PFILE_OBJECT FileObject);
7091
7092 NTKERNELAPI
7093 BOOLEAN
7094 NTAPI
7095 IoCancelIrp(
7096 IN PIRP Irp);
7097
7098 NTKERNELAPI
7099 NTSTATUS
7100 NTAPI
7101 IoCheckShareAccess(
7102 IN ACCESS_MASK DesiredAccess,
7103 IN ULONG DesiredShareAccess,
7104 IN OUT PFILE_OBJECT FileObject,
7105 IN OUT PSHARE_ACCESS ShareAccess,
7106 IN BOOLEAN Update);
7107
7108 NTKERNELAPI
7109 VOID
7110 FASTCALL
7111 IofCompleteRequest(
7112 IN PIRP Irp,
7113 IN CCHAR PriorityBoost);
7114
7115 /*
7116 * VOID
7117 * IoCompleteRequest(
7118 * IN PIRP Irp,
7119 * IN CCHAR PriorityBoost)
7120 */
7121 #define IoCompleteRequest IofCompleteRequest
7122
7123 NTKERNELAPI
7124 NTSTATUS
7125 NTAPI
7126 IoConnectInterrupt(
7127 OUT PKINTERRUPT *InterruptObject,
7128 IN PKSERVICE_ROUTINE ServiceRoutine,
7129 IN PVOID ServiceContext,
7130 IN PKSPIN_LOCK SpinLock OPTIONAL,
7131 IN ULONG Vector,
7132 IN KIRQL Irql,
7133 IN KIRQL SynchronizeIrql,
7134 IN KINTERRUPT_MODE InterruptMode,
7135 IN BOOLEAN ShareVector,
7136 IN KAFFINITY ProcessorEnableMask,
7137 IN BOOLEAN FloatingSave);
7138
7139 /*
7140 * PIO_STACK_LOCATION
7141 * IoGetCurrentIrpStackLocation(
7142 * IN PIRP Irp)
7143 */
7144 #define IoGetCurrentIrpStackLocation(_Irp) \
7145 ((_Irp)->Tail.Overlay.CurrentStackLocation)
7146
7147 /*
7148 * PIO_STACK_LOCATION
7149 * IoGetNextIrpStackLocation(
7150 * IN PIRP Irp)
7151 */
7152 #define IoGetNextIrpStackLocation(_Irp) \
7153 ((_Irp)->Tail.Overlay.CurrentStackLocation - 1)
7154
7155 /*
7156 * VOID
7157 * IoCopyCurrentIrpStackLocationToNext(
7158 * IN PIRP Irp)
7159 */
7160 #define IoCopyCurrentIrpStackLocationToNext(_Irp) \
7161 { \
7162 PIO_STACK_LOCATION _IrpSp; \
7163 PIO_STACK_LOCATION _NextIrpSp; \
7164 _IrpSp = IoGetCurrentIrpStackLocation(_Irp); \
7165 _NextIrpSp = IoGetNextIrpStackLocation(_Irp); \
7166 RtlCopyMemory(_NextIrpSp, _IrpSp, \
7167 FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine)); \
7168 _NextIrpSp->Control = 0; \
7169 }
7170
7171 NTKERNELAPI
7172 PCONTROLLER_OBJECT
7173 NTAPI
7174 IoCreateController(
7175 IN ULONG Size);
7176
7177 NTKERNELAPI
7178 NTSTATUS
7179 NTAPI
7180 IoCreateDevice(
7181 IN PDRIVER_OBJECT DriverObject,
7182 IN ULONG DeviceExtensionSize,
7183 IN PUNICODE_STRING DeviceName OPTIONAL,
7184 IN DEVICE_TYPE DeviceType,
7185 IN ULONG DeviceCharacteristics,
7186 IN BOOLEAN Exclusive,
7187 OUT PDEVICE_OBJECT *DeviceObject);
7188
7189 NTKERNELAPI
7190 NTSTATUS
7191 NTAPI
7192 IoCreateDisk(
7193 IN PDEVICE_OBJECT DeviceObject,
7194 IN PCREATE_DISK Disk);
7195
7196 NTKERNELAPI
7197 NTSTATUS
7198 NTAPI
7199 IoCreateFile(
7200 OUT PHANDLE FileHandle,
7201 IN ACCESS_MASK DesiredAccess,
7202 IN POBJECT_ATTRIBUTES ObjectAttributes,
7203 OUT PIO_STATUS_BLOCK IoStatusBlock,
7204 IN PLARGE_INTEGER AllocationSize OPTIONAL,
7205 IN ULONG FileAttributes,
7206 IN ULONG ShareAccess,
7207 IN ULONG Disposition,
7208 IN ULONG CreateOptions,
7209 IN PVOID EaBuffer OPTIONAL,
7210 IN ULONG EaLength,
7211 IN CREATE_FILE_TYPE CreateFileType,
7212 IN PVOID ExtraCreateParameters OPTIONAL,
7213 IN ULONG Options);
7214
7215 NTKERNELAPI
7216 PKEVENT
7217 NTAPI
7218 IoCreateNotificationEvent(
7219 IN PUNICODE_STRING EventName,
7220 OUT PHANDLE EventHandle);
7221
7222 NTKERNELAPI
7223 NTSTATUS
7224 NTAPI
7225 IoCreateSymbolicLink(
7226 IN PUNICODE_STRING SymbolicLinkName,
7227 IN PUNICODE_STRING DeviceName);
7228
7229 NTKERNELAPI
7230 PKEVENT
7231 NTAPI
7232 IoCreateSynchronizationEvent(
7233 IN PUNICODE_STRING EventName,
7234 OUT PHANDLE EventHandle);
7235
7236 NTKERNELAPI
7237 NTSTATUS
7238 NTAPI
7239 IoCreateUnprotectedSymbolicLink(
7240 IN PUNICODE_STRING SymbolicLinkName,
7241 IN PUNICODE_STRING DeviceName);
7242
7243 NTKERNELAPI
7244 NTSTATUS
7245 NTAPI
7246 IoCsqInitialize(
7247 PIO_CSQ Csq,
7248 IN PIO_CSQ_INSERT_IRP CsqInsertIrp,
7249 IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
7250 IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
7251 IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
7252 IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
7253 IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp);
7254
7255 NTKERNELAPI
7256 VOID
7257 NTAPI
7258 IoCsqInsertIrp(
7259 IN PIO_CSQ Csq,
7260 IN PIRP Irp,
7261 IN PIO_CSQ_IRP_CONTEXT Context);
7262
7263 NTKERNELAPI
7264 PIRP
7265 NTAPI
7266 IoCsqRemoveIrp(
7267 IN PIO_CSQ Csq,
7268 IN PIO_CSQ_IRP_CONTEXT Context);
7269
7270 NTKERNELAPI
7271 PIRP
7272 NTAPI
7273 IoCsqRemoveNextIrp(
7274 IN PIO_CSQ Csq,
7275 IN PVOID PeekContext);
7276
7277 NTKERNELAPI
7278 VOID
7279 NTAPI
7280 IoDeleteController(
7281 IN PCONTROLLER_OBJECT ControllerObject);
7282
7283 NTKERNELAPI
7284 VOID
7285 NTAPI
7286 IoDeleteDevice(
7287 IN PDEVICE_OBJECT DeviceObject);
7288
7289 NTKERNELAPI
7290 NTSTATUS
7291 NTAPI
7292 IoDeleteSymbolicLink(
7293 IN PUNICODE_STRING SymbolicLinkName);
7294
7295 /*
7296 * VOID
7297 * IoDeassignArcName(
7298 * IN PUNICODE_STRING ArcName)
7299 */
7300 #define IoDeassignArcName IoDeleteSymbolicLink
7301
7302 NTKERNELAPI
7303 VOID
7304 NTAPI
7305 IoDetachDevice(
7306 IN OUT PDEVICE_OBJECT TargetDevice);
7307
7308 NTKERNELAPI
7309 VOID
7310 NTAPI
7311 IoDisconnectInterrupt(
7312 IN PKINTERRUPT InterruptObject);
7313
7314 NTKERNELAPI
7315 BOOLEAN
7316 NTAPI
7317 IoForwardIrpSynchronously(
7318 IN PDEVICE_OBJECT DeviceObject,
7319 IN PIRP Irp);
7320
7321 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
7322
7323 NTKERNELAPI
7324 VOID
7325 NTAPI
7326 IoFreeController(
7327 IN PCONTROLLER_OBJECT ControllerObject);
7328
7329 NTKERNELAPI
7330 VOID
7331 NTAPI
7332 IoFreeErrorLogEntry(
7333 PVOID ElEntry);
7334
7335 NTKERNELAPI
7336 VOID
7337 NTAPI
7338 IoFreeIrp(
7339 IN PIRP Irp);
7340
7341 NTKERNELAPI
7342 VOID
7343 NTAPI
7344 IoFreeMdl(
7345 IN PMDL Mdl);
7346
7347 NTKERNELAPI
7348 VOID
7349 NTAPI
7350 IoFreeWorkItem(
7351 IN PIO_WORKITEM pIOWorkItem);
7352
7353 NTKERNELAPI
7354 PDEVICE_OBJECT
7355 NTAPI
7356 IoGetAttachedDevice(
7357 IN PDEVICE_OBJECT DeviceObject);
7358
7359 NTKERNELAPI
7360 PDEVICE_OBJECT
7361 NTAPI
7362 IoGetAttachedDeviceReference(
7363 IN PDEVICE_OBJECT DeviceObject);
7364
7365 NTKERNELAPI
7366 NTSTATUS
7367 NTAPI
7368 IoGetBootDiskInformation(
7369 IN OUT PBOOTDISK_INFORMATION BootDiskInformation,
7370 IN ULONG Size);
7371
7372 NTKERNELAPI
7373 PCONFIGURATION_INFORMATION
7374 NTAPI
7375 IoGetConfigurationInformation(
7376 VOID);
7377
7378 NTKERNELAPI
7379 PEPROCESS
7380 NTAPI
7381 IoGetCurrentProcess(
7382 VOID);
7383
7384 NTKERNELAPI
7385 NTSTATUS
7386 NTAPI
7387 IoGetDeviceInterfaceAlias(
7388 IN PUNICODE_STRING SymbolicLinkName,
7389 IN CONST GUID *AliasInterfaceClassGuid,
7390 OUT PUNICODE_STRING AliasSymbolicLinkName);
7391
7392 #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
7393
7394 NTKERNELAPI
7395 NTSTATUS
7396 NTAPI
7397 IoGetDeviceInterfaces(
7398 IN CONST GUID *InterfaceClassGuid,
7399 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
7400 IN ULONG Flags,
7401 OUT PWSTR *SymbolicLinkList);
7402
7403 NTKERNELAPI
7404 NTSTATUS
7405 NTAPI
7406 IoGetDeviceObjectPointer(
7407 IN PUNICODE_STRING ObjectName,
7408 IN ACCESS_MASK DesiredAccess,
7409 OUT PFILE_OBJECT *FileObject,
7410 OUT PDEVICE_OBJECT *DeviceObject);
7411
7412 NTKERNELAPI
7413 NTSTATUS
7414 NTAPI
7415 IoGetDeviceProperty(
7416 IN PDEVICE_OBJECT DeviceObject,
7417 IN DEVICE_REGISTRY_PROPERTY DeviceProperty,
7418 IN ULONG BufferLength,
7419 OUT PVOID PropertyBuffer,
7420 OUT PULONG ResultLength);
7421
7422 NTKERNELAPI
7423 PDEVICE_OBJECT
7424 NTAPI
7425 IoGetDeviceToVerify(
7426 IN PETHREAD Thread);
7427
7428 NTKERNELAPI
7429 PDMA_ADAPTER
7430 NTAPI
7431 IoGetDmaAdapter(
7432 IN PDEVICE_OBJECT PhysicalDeviceObject,
7433 IN PDEVICE_DESCRIPTION DeviceDescription,
7434 IN OUT PULONG NumberOfMapRegisters);
7435
7436 NTKERNELAPI
7437 PVOID
7438 NTAPI
7439 IoGetDriverObjectExtension(
7440 IN PDRIVER_OBJECT DriverObject,
7441 IN PVOID ClientIdentificationAddress);
7442
7443 NTKERNELAPI
7444 PGENERIC_MAPPING
7445 NTAPI
7446 IoGetFileObjectGenericMapping(
7447 VOID);
7448
7449 /*
7450 * ULONG
7451 * IoGetFunctionCodeFromCtlCode(
7452 * IN ULONG ControlCode)
7453 */
7454 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
7455 (((_ControlCode) >> 2) & 0x00000FFF)
7456
7457 NTKERNELAPI
7458 PVOID
7459 NTAPI
7460 IoGetInitialStack(
7461 VOID);
7462
7463 NTKERNELAPI
7464 PDEVICE_OBJECT
7465 NTAPI
7466 IoGetRelatedDeviceObject(
7467 IN PFILE_OBJECT FileObject);
7468
7469 NTKERNELAPI
7470 VOID
7471 NTAPI
7472 IoGetStackLimits(
7473 OUT PULONG_PTR LowLimit,
7474 OUT PULONG_PTR HighLimit);
7475
7476 FORCEINLINE
7477 ULONG_PTR
7478 IoGetRemainingStackSize(
7479 VOID
7480 )
7481 {
7482 ULONG_PTR End, Begin;
7483 ULONG_PTR Result;
7484
7485 IoGetStackLimits(&Begin, &End);
7486 Result = (ULONG_PTR)(&End) - Begin;
7487 return Result;
7488 }
7489
7490 NTKERNELAPI
7491 VOID
7492 NTAPI
7493 KeInitializeDpc(
7494 IN PRKDPC Dpc,
7495 IN PKDEFERRED_ROUTINE DeferredRoutine,
7496 IN PVOID DeferredContext);
7497
7498 /*
7499 * VOID
7500 * IoInitializeDpcRequest(
7501 * IN PDEVICE_OBJECT DeviceObject,
7502 * IN PIO_DPC_ROUTINE DpcRoutine)
7503 */
7504 #define IoInitializeDpcRequest(_DeviceObject, \
7505 _DpcRoutine) \
7506 KeInitializeDpc(&(_DeviceObject)->Dpc, \
7507 (PKDEFERRED_ROUTINE) (_DpcRoutine), \
7508 _DeviceObject)
7509
7510 NTKERNELAPI
7511 VOID
7512 NTAPI
7513 IoInitializeIrp(
7514 IN OUT PIRP Irp,
7515 IN USHORT PacketSize,
7516 IN CCHAR StackSize);
7517
7518 NTKERNELAPI
7519 VOID
7520 NTAPI
7521 IoInitializeRemoveLockEx(
7522 IN PIO_REMOVE_LOCK Lock,
7523 IN ULONG AllocateTag,
7524 IN ULONG MaxLockedMinutes,
7525 IN ULONG HighWatermark,
7526 IN ULONG RemlockSize);
7527
7528 /* VOID
7529 * IoInitializeRemoveLock(
7530 * IN PIO_REMOVE_LOCK Lock,
7531 * IN ULONG AllocateTag,
7532 * IN ULONG MaxLockedMinutes,
7533 * IN ULONG HighWatermark)
7534 */
7535 #define IoInitializeRemoveLock( \
7536 Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
7537 IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
7538 HighWatermark, sizeof(IO_REMOVE_LOCK))
7539
7540 NTKERNELAPI
7541 NTSTATUS
7542 NTAPI
7543 IoInitializeTimer(
7544 IN PDEVICE_OBJECT DeviceObject,
7545 IN PIO_TIMER_ROUTINE TimerRoutine,
7546 IN PVOID Context);
7547
7548 NTKERNELAPI
7549 VOID
7550 NTAPI
7551 IoInvalidateDeviceRelations(
7552 IN PDEVICE_OBJECT DeviceObject,
7553 IN DEVICE_RELATION_TYPE Type);
7554
7555 NTKERNELAPI
7556 VOID
7557 NTAPI
7558 IoInvalidateDeviceState(
7559 IN PDEVICE_OBJECT PhysicalDeviceObject);
7560
7561 NTKERNELAPI
7562 BOOLEAN
7563 NTAPI
7564 IoIs32bitProcess(
7565 IN PIRP Irp OPTIONAL);
7566
7567 /*
7568 * BOOLEAN
7569 * IoIsErrorUserInduced(
7570 * IN NTSTATUS Status);
7571 */
7572 #define IoIsErrorUserInduced(Status) \
7573 ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
7574 ((Status) == STATUS_IO_TIMEOUT) || \
7575 ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
7576 ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
7577 ((Status) == STATUS_VERIFY_REQUIRED) || \
7578 ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
7579 ((Status) == STATUS_WRONG_VOLUME)))
7580
7581 NTKERNELAPI
7582 BOOLEAN
7583 NTAPI
7584 IoIsWdmVersionAvailable(
7585 IN UCHAR MajorVersion,
7586 IN UCHAR MinorVersion);
7587
7588 NTKERNELAPI
7589 PIRP
7590 NTAPI
7591 IoMakeAssociatedIrp(
7592 IN PIRP Irp,
7593 IN CCHAR StackSize);
7594
7595 /*
7596 * VOID
7597 * IoMarkIrpPending(
7598 * IN OUT PIRP Irp)
7599 */
7600 #define IoMarkIrpPending(_Irp) \
7601 (IoGetCurrentIrpStackLocation(_Irp)->Control |= SL_PENDING_RETURNED)
7602
7603 NTKERNELAPI
7604 NTSTATUS
7605 NTAPI
7606 IoOpenDeviceInterfaceRegistryKey(
7607 IN PUNICODE_STRING SymbolicLinkName,
7608 IN ACCESS_MASK DesiredAccess,
7609 OUT PHANDLE DeviceInterfaceKey);
7610
7611 #define PLUGPLAY_REGKEY_DEVICE 1
7612 #define PLUGPLAY_REGKEY_DRIVER 2
7613 #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4
7614
7615 NTKERNELAPI
7616 NTSTATUS
7617 NTAPI
7618 IoOpenDeviceRegistryKey(
7619 IN PDEVICE_OBJECT DeviceObject,
7620 IN ULONG DevInstKeyType,
7621 IN ACCESS_MASK DesiredAccess,
7622 OUT PHANDLE DevInstRegKey);
7623
7624 NTKERNELAPI
7625 NTSTATUS
7626 NTAPI
7627 IoQueryDeviceDescription(
7628 IN PINTERFACE_TYPE BusType OPTIONAL,
7629 IN PULONG BusNumber OPTIONAL,
7630 IN PCONFIGURATION_TYPE ControllerType OPTIONAL,
7631 IN PULONG ControllerNumber OPTIONAL,
7632 IN PCONFIGURATION_TYPE PeripheralType OPTIONAL,
7633 IN PULONG PeripheralNumber OPTIONAL,
7634 IN PIO_QUERY_DEVICE_ROUTINE CalloutRoutine,
7635 IN PVOID Context);
7636
7637 NTKERNELAPI
7638 VOID
7639 NTAPI
7640 IoQueueWorkItem(
7641 IN PIO_WORKITEM pIOWorkItem,
7642 IN PIO_WORKITEM_ROUTINE Routine,
7643 IN WORK_QUEUE_TYPE QueueType,
7644 IN PVOID Context);
7645
7646 NTKERNELAPI
7647 VOID
7648 NTAPI
7649 IoRaiseHardError(
7650 IN PIRP Irp,
7651 IN PVPB Vpb OPTIONAL,
7652 IN PDEVICE_OBJECT RealDeviceObject);
7653
7654 NTKERNELAPI
7655 BOOLEAN
7656 NTAPI
7657 IoRaiseInformationalHardError(
7658 IN NTSTATUS ErrorStatus,
7659 IN PUNICODE_STRING String OPTIONAL,
7660 IN PKTHREAD Thread OPTIONAL);
7661
7662 NTKERNELAPI
7663 NTSTATUS
7664 NTAPI
7665 IoReadDiskSignature(
7666 IN PDEVICE_OBJECT DeviceObject,
7667 IN ULONG BytesPerSector,
7668 OUT PDISK_SIGNATURE Signature);
7669
7670 NTKERNELAPI
7671 NTSTATUS
7672 FASTCALL
7673 IoReadPartitionTable(
7674 IN PDEVICE_OBJECT DeviceObject,
7675 IN ULONG SectorSize,
7676 IN BOOLEAN ReturnRecognizedPartitions,
7677 OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer);
7678
7679 NTKERNELAPI
7680 NTSTATUS
7681 NTAPI
7682 IoReadPartitionTableEx(
7683 IN PDEVICE_OBJECT DeviceObject,
7684 IN struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer);
7685
7686 NTKERNELAPI
7687 VOID
7688 NTAPI
7689 IoRegisterBootDriverReinitialization(
7690 IN PDRIVER_OBJECT DriverObject,
7691 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
7692 IN PVOID Context);
7693
7694 NTKERNELAPI
7695 VOID
7696 NTAPI
7697 IoRegisterBootDriverReinitialization(
7698 IN PDRIVER_OBJECT DriverObject,
7699 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
7700 IN PVOID Context);
7701
7702 NTKERNELAPI
7703 NTSTATUS
7704 NTAPI
7705 IoRegisterDeviceInterface(
7706 IN PDEVICE_OBJECT PhysicalDeviceObject,
7707 IN CONST GUID *InterfaceClassGuid,
7708 IN PUNICODE_STRING ReferenceString OPTIONAL,
7709 OUT PUNICODE_STRING SymbolicLinkName);
7710
7711 NTKERNELAPI
7712 VOID
7713 NTAPI
7714 IoRegisterDriverReinitialization(
7715 IN PDRIVER_OBJECT DriverObject,
7716 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
7717 IN PVOID Context);
7718
7719 NTKERNELAPI
7720 NTSTATUS
7721 NTAPI
7722 IoRegisterPlugPlayNotification(
7723 IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
7724 IN ULONG EventCategoryFlags,
7725 IN PVOID EventCategoryData OPTIONAL,
7726 IN PDRIVER_OBJECT DriverObject,
7727 IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine,
7728 IN PVOID Context,
7729 OUT PVOID *NotificationEntry);
7730
7731 NTKERNELAPI
7732 NTSTATUS
7733 NTAPI
7734 IoRegisterShutdownNotification(
7735 IN PDEVICE_OBJECT DeviceObject);
7736
7737 NTKERNELAPI
7738 VOID
7739 NTAPI
7740 IoReleaseCancelSpinLock(
7741 IN KIRQL Irql);
7742
7743 NTKERNELAPI
7744 VOID
7745 NTAPI
7746 IoReleaseRemoveLockAndWaitEx(
7747 IN PIO_REMOVE_LOCK RemoveLock,
7748 IN PVOID Tag,
7749 IN ULONG RemlockSize);
7750
7751 NTKERNELAPI
7752 VOID
7753 NTAPI
7754 IoReleaseRemoveLockEx(
7755 IN PIO_REMOVE_LOCK RemoveLock,
7756 IN PVOID Tag,
7757 IN ULONG RemlockSize);
7758
7759 /*
7760 * VOID
7761 * IoReleaseRemoveLock(
7762 * IN PIO_REMOVE_LOCK RemoveLock,
7763 * IN PVOID Tag)
7764 */
7765 #define IoReleaseRemoveLock(_RemoveLock, \
7766 _Tag) \
7767 IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
7768
7769 /*
7770 * VOID
7771 * IoReleaseRemoveLockAndWait(
7772 * IN PIO_REMOVE_LOCK RemoveLock,
7773 * IN PVOID Tag)
7774 */
7775 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
7776 _Tag) \
7777 IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
7778
7779 NTKERNELAPI
7780 VOID
7781 NTAPI
7782 IoRemoveShareAccess(
7783 IN PFILE_OBJECT FileObject,
7784 IN OUT PSHARE_ACCESS ShareAccess);
7785
7786 NTKERNELAPI
7787 NTSTATUS
7788 NTAPI
7789 IoReportDetectedDevice(
7790 IN PDRIVER_OBJECT DriverObject,
7791 IN INTERFACE_TYPE LegacyBusType,
7792 IN ULONG BusNumber,
7793 IN ULONG SlotNumber,
7794 IN PCM_RESOURCE_LIST ResourceList,
7795 IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL,
7796 IN BOOLEAN ResourceAssigned,
7797 IN OUT PDEVICE_OBJECT *DeviceObject);
7798
7799 NTKERNELAPI
7800 NTSTATUS
7801 NTAPI
7802 IoReportResourceForDetection(
7803 IN PDRIVER_OBJECT DriverObject,
7804 IN PCM_RESOURCE_LIST DriverList OPTIONAL,
7805 IN ULONG DriverListSize OPTIONAL,
7806 IN PDEVICE_OBJECT DeviceObject OPTIONAL,
7807 IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
7808 IN ULONG DeviceListSize OPTIONAL,
7809 OUT PBOOLEAN ConflictDetected);
7810
7811 NTKERNELAPI
7812 NTSTATUS
7813 NTAPI
7814 IoReportResourceUsage(
7815 IN PUNICODE_STRING DriverClassName OPTIONAL,
7816 IN PDRIVER_OBJECT DriverObject,
7817 IN PCM_RESOURCE_LIST DriverList OPTIONAL,
7818 IN ULONG DriverListSize OPTIONAL,
7819 IN PDEVICE_OBJECT DeviceObject,
7820 IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
7821 IN ULONG DeviceListSize OPTIONAL,
7822 IN BOOLEAN OverrideConflict,
7823 OUT PBOOLEAN ConflictDetected);
7824
7825 NTKERNELAPI
7826 NTSTATUS
7827 NTAPI
7828 IoReportTargetDeviceChange(
7829 IN PDEVICE_OBJECT PhysicalDeviceObject,
7830 IN PVOID NotificationStructure);
7831
7832 NTKERNELAPI
7833 NTSTATUS
7834 NTAPI
7835 IoReportTargetDeviceChangeAsynchronous(
7836 IN PDEVICE_OBJECT PhysicalDeviceObject,
7837 IN PVOID NotificationStructure,
7838 IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL,
7839 IN PVOID Context OPTIONAL);
7840
7841 NTKERNELAPI
7842 VOID
7843 NTAPI
7844 IoRequestDeviceEject(
7845 IN PDEVICE_OBJECT PhysicalDeviceObject);
7846
7847 /*
7848 * VOID
7849 * IoRequestDpc(
7850 * IN PDEVICE_OBJECT DeviceObject,
7851 * IN PIRP Irp,
7852 * IN PVOID Context);
7853 */
7854 #define IoRequestDpc(DeviceObject, Irp, Context)( \
7855 KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
7856
7857 NTKERNELAPI
7858 VOID
7859 NTAPI
7860 IoReuseIrp(
7861 IN OUT PIRP Irp,
7862 IN NTSTATUS Status);
7863
7864 /*
7865 * PDRIVER_CANCEL
7866 * IoSetCancelRoutine(
7867 * IN PIRP Irp,
7868 * IN PDRIVER_CANCEL CancelRoutine)
7869 */
7870 #define IoSetCancelRoutine(_Irp, \
7871 _CancelRoutine) \
7872 ((PDRIVER_CANCEL) InterlockedExchangePointer( \
7873 (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (_CancelRoutine)))
7874
7875 /*
7876 * VOID
7877 * IoSetCompletionRoutine(
7878 * IN PIRP Irp,
7879 * IN PIO_COMPLETION_ROUTINE CompletionRoutine,
7880 * IN PVOID Context,
7881 * IN BOOLEAN InvokeOnSuccess,
7882 * IN BOOLEAN InvokeOnError,
7883 * IN BOOLEAN InvokeOnCancel)
7884 */
7885 #define IoSetCompletionRoutine(_Irp, \
7886 _CompletionRoutine, \
7887 _Context, \
7888 _InvokeOnSuccess, \
7889 _InvokeOnError, \
7890 _InvokeOnCancel) \
7891 { \
7892 PIO_STACK_LOCATION _IrpSp; \
7893 ASSERT((_InvokeOnSuccess) || (_InvokeOnError) || (_InvokeOnCancel) ? \
7894 (_CompletionRoutine) != NULL : TRUE); \
7895 _IrpSp = IoGetNextIrpStackLocation(_Irp); \
7896 _IrpSp->CompletionRoutine = (PIO_COMPLETION_ROUTINE)(_CompletionRoutine); \
7897 _IrpSp->Context = (_Context); \
7898 _IrpSp->Control = 0; \
7899 if (_InvokeOnSuccess) _IrpSp->Control = SL_INVOKE_ON_SUCCESS; \
7900 if (_InvokeOnError) _IrpSp->Control |= SL_INVOKE_ON_ERROR; \
7901 if (_InvokeOnCancel) _IrpSp->Control |= SL_INVOKE_ON_CANCEL; \
7902 }
7903
7904 NTKERNELAPI
7905 NTSTATUS
7906 NTAPI
7907 IoSetCompletionRoutineEx(
7908 IN PDEVICE_OBJECT DeviceObject,
7909 IN PIRP Irp,
7910 IN PIO_COMPLETION_ROUTINE CompletionRoutine,
7911 IN PVOID Context,
7912 IN BOOLEAN InvokeOnSuccess,
7913 IN BOOLEAN InvokeOnError,
7914 IN BOOLEAN InvokeOnCancel);
7915
7916 NTKERNELAPI
7917 NTSTATUS
7918 NTAPI
7919 IoSetDeviceInterfaceState(
7920 IN PUNICODE_STRING SymbolicLinkName,
7921 IN BOOLEAN Enable);
7922
7923 NTKERNELAPI
7924 VOID
7925 NTAPI
7926 IoSetHardErrorOrVerifyDevice(
7927 IN PIRP Irp,
7928 IN PDEVICE_OBJECT DeviceObject);
7929
7930 /*
7931 * VOID
7932 * IoSetNextIrpStackLocation(
7933 * IN OUT PIRP Irp)
7934 */
7935 #define IoSetNextIrpStackLocation(_Irp) \
7936 { \
7937 (_Irp)->CurrentLocation--; \
7938 (_Irp)->Tail.Overlay.CurrentStackLocation--; \
7939 }
7940
7941 NTKERNELAPI
7942 NTSTATUS
7943 FASTCALL
7944 IoSetPartitionInformation(
7945 IN PDEVICE_OBJECT DeviceObject,
7946 IN ULONG SectorSize,
7947 IN ULONG PartitionNumber,
7948 IN ULONG PartitionType);
7949
7950 NTKERNELAPI
7951 NTSTATUS
7952 NTAPI
7953 IoSetPartitionInformationEx(
7954 IN PDEVICE_OBJECT DeviceObject,
7955 IN ULONG PartitionNumber,
7956 IN struct _SET_PARTITION_INFORMATION_EX *PartitionInfo);
7957
7958 NTKERNELAPI
7959 VOID
7960 NTAPI
7961 IoSetShareAccess(
7962 IN ACCESS_MASK DesiredAccess,
7963 IN ULONG DesiredShareAccess,
7964 IN OUT PFILE_OBJECT FileObject,
7965 OUT PSHARE_ACCESS ShareAccess);
7966
7967 NTKERNELAPI
7968 VOID
7969 NTAPI
7970 IoSetStartIoAttributes(
7971 IN PDEVICE_OBJECT DeviceObject,
7972 IN BOOLEAN DeferredStartIo,
7973 IN BOOLEAN NonCancelable);
7974
7975 NTKERNELAPI
7976 NTSTATUS
7977 NTAPI
7978 IoSetSystemPartition(
7979 IN PUNICODE_STRING VolumeNameString);
7980
7981 NTKERNELAPI
7982 BOOLEAN
7983 NTAPI
7984 IoSetThreadHardErrorMode(
7985 IN BOOLEAN EnableHardErrors);
7986
7987 /*
7988 * USHORT
7989 * IoSizeOfIrp(
7990 * IN CCHAR StackSize)
7991 */
7992 #define IoSizeOfIrp(_StackSize) \
7993 ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
7994
7995 /*
7996 * VOID
7997 * IoSkipCurrentIrpStackLocation(
7998 * IN PIRP Irp)
7999 */
8000 #define IoSkipCurrentIrpStackLocation(_Irp) \
8001 { \
8002 (_Irp)->CurrentLocation++; \
8003 (_Irp)->Tail.Overlay.CurrentStackLocation++; \
8004 }
8005
8006 NTKERNELAPI
8007 VOID
8008 NTAPI
8009 IoStartNextPacket(
8010 IN PDEVICE_OBJECT DeviceObject,
8011 IN BOOLEAN Cancelable);
8012
8013 NTKERNELAPI
8014 VOID
8015 NTAPI
8016 IoStartNextPacketByKey(
8017 IN PDEVICE_OBJECT DeviceObject,
8018 IN BOOLEAN Cancelable,
8019 IN ULONG Key);
8020
8021 NTKERNELAPI
8022 VOID
8023 NTAPI
8024 IoStartPacket(
8025 IN PDEVICE_OBJECT DeviceObject,
8026 IN PIRP Irp,
8027 IN PULONG Key OPTIONAL,
8028 IN PDRIVER_CANCEL CancelFunction OPTIONAL);
8029
8030 NTKERNELAPI
8031 VOID
8032 NTAPI
8033 IoStartTimer(
8034 IN PDEVICE_OBJECT DeviceObject);
8035
8036 NTKERNELAPI
8037 VOID
8038 NTAPI
8039 IoStopTimer(
8040 IN PDEVICE_OBJECT DeviceObject);
8041
8042 NTKERNELAPI
8043 NTSTATUS
8044 NTAPI
8045 IoUnregisterPlugPlayNotification(
8046 IN PVOID NotificationEntry);
8047
8048 NTKERNELAPI
8049 VOID
8050 NTAPI
8051 IoUnregisterShutdownNotification(
8052 IN PDEVICE_OBJECT DeviceObject);
8053
8054 NTKERNELAPI
8055 VOID
8056 NTAPI
8057 IoUpdateShareAccess(
8058 IN PFILE_OBJECT FileObject,
8059 IN OUT PSHARE_ACCESS ShareAccess);
8060
8061 NTKERNELAPI
8062 NTSTATUS
8063 NTAPI
8064 IoVerifyPartitionTable(
8065 IN PDEVICE_OBJECT DeviceObject,
8066 IN BOOLEAN FixErrors);
8067
8068 NTKERNELAPI
8069 NTSTATUS
8070 NTAPI
8071 IoVolumeDeviceToDosName(
8072 IN PVOID VolumeDeviceObject,
8073 OUT PUNICODE_STRING DosName);
8074
8075 NTKERNELAPI
8076 NTSTATUS
8077 NTAPI
8078 IoWMIAllocateInstanceIds(
8079 IN GUID *Guid,
8080 IN ULONG InstanceCount,
8081 OUT ULONG *FirstInstanceId);
8082
8083 NTKERNELAPI
8084 ULONG
8085 NTAPI
8086 IoWMIDeviceObjectToProviderId(
8087 IN PDEVICE_OBJECT DeviceObject);
8088
8089 NTKERNELAPI
8090 NTSTATUS
8091 NTAPI
8092 IoWMIDeviceObjectToInstanceName(
8093 IN PVOID DataBlockObject,
8094 IN PDEVICE_OBJECT DeviceObject,
8095 OUT PUNICODE_STRING InstanceName);
8096
8097 NTKERNELAPI
8098 NTSTATUS
8099 NTAPI
8100 IoWMIExecuteMethod(
8101 IN PVOID DataBlockObject,
8102 IN PUNICODE_STRING InstanceName,
8103 IN ULONG MethodId,
8104 IN ULONG InBufferSize,
8105 IN OUT PULONG OutBufferSize,
8106 IN OUT PUCHAR InOutBuffer);
8107
8108 NTKERNELAPI
8109 NTSTATUS
8110 NTAPI
8111 IoWMIHandleToInstanceName(
8112 IN PVOID DataBlockObject,
8113 IN HANDLE FileHandle,
8114 OUT PUNICODE_STRING InstanceName);
8115
8116 NTKERNELAPI
8117 NTSTATUS
8118 NTAPI
8119 IoWMIOpenBlock(
8120 IN GUID *DataBlockGuid,
8121 IN ULONG DesiredAccess,
8122 OUT PVOID *DataBlockObject);
8123
8124 NTKERNELAPI
8125 NTSTATUS
8126 NTAPI
8127 IoWMIQueryAllData(
8128 IN PVOID DataBlockObject,
8129 IN OUT ULONG *InOutBufferSize,
8130 OUT PVOID OutBuffer);
8131
8132 NTKERNELAPI
8133 NTSTATUS
8134 NTAPI
8135 IoWMIQueryAllDataMultiple(
8136 IN PVOID *DataBlockObjectList,
8137 IN ULONG ObjectCount,
8138 IN OUT ULONG *InOutBufferSize,
8139 OUT PVOID OutBuffer);
8140
8141 NTKERNELAPI
8142 NTSTATUS
8143 NTAPI
8144 IoWMIQuerySingleInstance(
8145 IN PVOID DataBlockObject,
8146 IN PUNICODE_STRING InstanceName,
8147 IN OUT ULONG *InOutBufferSize,
8148 OUT PVOID OutBuffer);
8149
8150 NTKERNELAPI
8151 NTSTATUS
8152 NTAPI
8153 IoWMIQuerySingleInstanceMultiple(
8154 IN PVOID *DataBlockObjectList,
8155 IN PUNICODE_STRING InstanceNames,
8156 IN ULONG ObjectCount,
8157 IN OUT ULONG *InOutBufferSize,
8158 OUT PVOID OutBuffer);
8159
8160 NTKERNELAPI
8161 NTSTATUS
8162 NTAPI
8163 IoWMIRegistrationControl(
8164 IN PDEVICE_OBJECT DeviceObject,
8165 IN ULONG Action);
8166
8167 NTKERNELAPI
8168 NTSTATUS
8169 NTAPI
8170 IoWMISetNotificationCallback(
8171 IN PVOID Object,
8172 IN WMI_NOTIFICATION_CALLBACK Callback,
8173 IN PVOID Context);
8174
8175 NTKERNELAPI
8176 NTSTATUS
8177 NTAPI
8178 IoWMISetSingleInstance(
8179 IN PVOID DataBlockObject,
8180 IN PUNICODE_STRING InstanceName,
8181 IN ULONG Version,
8182 IN ULONG ValueBufferSize,
8183 IN PVOID ValueBuffer);
8184
8185 NTKERNELAPI
8186 NTSTATUS
8187 NTAPI
8188 IoWMISetSingleItem(
8189 IN PVOID DataBlockObject,
8190 IN PUNICODE_STRING InstanceName,
8191 IN ULONG DataItemId,
8192 IN ULONG Version,
8193 IN ULONG ValueBufferSize,
8194 IN PVOID ValueBuffer);
8195
8196 NTKERNELAPI
8197 NTSTATUS
8198 NTAPI
8199 IoWMISuggestInstanceName(
8200 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
8201 IN PUNICODE_STRING SymbolicLinkName OPTIONAL,
8202 IN BOOLEAN CombineNames,
8203 OUT PUNICODE_STRING SuggestedInstanceName);
8204
8205 NTKERNELAPI
8206 NTSTATUS
8207 NTAPI
8208 IoWMIWriteEvent(
8209 IN PVOID WnodeEventItem);
8210
8211 NTKERNELAPI
8212 VOID
8213 NTAPI
8214 IoWriteErrorLogEntry(
8215 IN PVOID ElEntry);
8216
8217 NTKERNELAPI
8218 NTSTATUS
8219 FASTCALL
8220 IoWritePartitionTable(
8221 IN PDEVICE_OBJECT DeviceObject,
8222 IN ULONG SectorSize,
8223 IN ULONG SectorsPerTrack,
8224 IN ULONG NumberOfHeads,
8225 IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer);
8226
8227 NTKERNELAPI
8228 NTSTATUS
8229 NTAPI
8230 IoWritePartitionTableEx(
8231 IN PDEVICE_OBJECT DeviceObject,
8232 IN struct _DRIVE_LAYOUT_INFORMATION_EX *PartitionBuffer);
8233
8234
8235
8236 /** Kernel routines **/
8237
8238 #if defined (_M_AMD64)
8239 NTKERNELAPI
8240 VOID
8241 FASTCALL
8242 KeAcquireInStackQueuedSpinLock(
8243 IN PKSPIN_LOCK SpinLock,
8244 IN PKLOCK_QUEUE_HANDLE LockHandle);
8245
8246 NTKERNELAPI
8247 VOID
8248 FASTCALL
8249 KeReleaseInStackQueuedSpinLock(
8250 IN PKLOCK_QUEUE_HANDLE LockHandle);
8251 #else
8252 NTHALAPI
8253 VOID
8254 FASTCALL
8255 KeAcquireInStackQueuedSpinLock(
8256 IN PKSPIN_LOCK SpinLock,
8257 IN PKLOCK_QUEUE_HANDLE LockHandle);
8258
8259 NTHALAPI
8260 VOID
8261 FASTCALL
8262 KeReleaseInStackQueuedSpinLock(
8263 IN PKLOCK_QUEUE_HANDLE LockHandle);
8264 #endif
8265
8266 NTKERNELAPI
8267 VOID
8268 FASTCALL
8269 KeAcquireInStackQueuedSpinLockAtDpcLevel(
8270 IN PKSPIN_LOCK SpinLock,
8271 IN PKLOCK_QUEUE_HANDLE LockHandle);
8272
8273 NTKERNELAPI
8274 KIRQL
8275 NTAPI
8276 KeAcquireInterruptSpinLock(
8277 IN PKINTERRUPT Interrupt);
8278
8279 NTKERNELAPI
8280 BOOLEAN
8281 NTAPI
8282 KeAreApcsDisabled(
8283 VOID);
8284
8285 NTKERNELAPI
8286 DECLSPEC_NORETURN
8287 VOID
8288 NTAPI
8289 KeBugCheck(
8290 IN ULONG BugCheckCode);
8291
8292 NTKERNELAPI
8293 DECLSPEC_NORETURN
8294 VOID
8295 NTAPI
8296 KeBugCheckEx(
8297 IN ULONG BugCheckCode,
8298 IN ULONG_PTR BugCheckParameter1,
8299 IN ULONG_PTR BugCheckParameter2,
8300 IN ULONG_PTR BugCheckParameter3,
8301 IN ULONG_PTR BugCheckParameter4);
8302
8303 NTKERNELAPI
8304 BOOLEAN
8305 NTAPI
8306 KeCancelTimer(
8307 IN PKTIMER Timer);
8308
8309 NTKERNELAPI
8310 VOID
8311 NTAPI
8312 KeClearEvent(
8313 IN PRKEVENT Event);
8314
8315 NTKERNELAPI
8316 NTSTATUS
8317 NTAPI
8318 KeDelayExecutionThread(
8319 IN KPROCESSOR_MODE WaitMode,
8320 IN BOOLEAN Alertable,
8321 IN PLARGE_INTEGER Interval);
8322
8323 NTKERNELAPI
8324 BOOLEAN
8325 NTAPI
8326 KeDeregisterBugCheckCallback(
8327 IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord);
8328
8329 NTKERNELAPI
8330 VOID
8331 NTAPI
8332 KeEnterCriticalRegion(
8333 VOID);
8334
8335 /*
8336 * VOID
8337 * KeFlushIoBuffers(
8338 * IN PMDL Mdl,
8339 * IN BOOLEAN ReadOperation,
8340 * IN BOOLEAN DmaOperation)
8341 */
8342 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
8343
8344 #define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql))
8345 #define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql))
8346 #define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock)
8347 #define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock)
8348
8349 NTKERNELAPI
8350 VOID
8351 NTAPI
8352 KeFlushQueuedDpcs(
8353 VOID
8354 );
8355
8356 NTHALAPI
8357 VOID
8358 NTAPI
8359 KeFlushWriteBuffer(VOID);
8360
8361 NTKERNELAPI
8362 ULONG
8363 NTAPI
8364 KeGetRecommendedSharedDataAlignment(
8365 VOID);
8366
8367 NTKERNELAPI
8368 VOID
8369 NTAPI
8370 KeInitializeDeviceQueue(
8371 IN PKDEVICE_QUEUE DeviceQueue);
8372
8373 NTKERNELAPI
8374 VOID
8375 NTAPI
8376 KeInitializeMutex(
8377 IN PRKMUTEX Mutex,
8378 IN ULONG Level);
8379
8380 NTKERNELAPI
8381 VOID
8382 NTAPI
8383 KeInitializeSemaphore(
8384 IN PRKSEMAPHORE Semaphore,
8385 IN LONG Count,
8386 IN LONG Limit);
8387
8388 NTKERNELAPI
8389 VOID
8390 NTAPI
8391 KeInitializeTimer(
8392 IN PKTIMER Timer);
8393
8394 NTKERNELAPI
8395 VOID
8396 NTAPI
8397 KeInitializeTimerEx(
8398 IN PKTIMER Timer,
8399 IN TIMER_TYPE Type);
8400
8401 NTKERNELAPI
8402 BOOLEAN
8403 NTAPI
8404 KeInsertByKeyDeviceQueue(
8405 IN PKDEVICE_QUEUE DeviceQueue,
8406 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry,
8407 IN ULONG SortKey);
8408
8409 NTKERNELAPI
8410 BOOLEAN
8411 NTAPI
8412 KeInsertDeviceQueue(
8413 IN PKDEVICE_QUEUE DeviceQueue,
8414 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
8415
8416 NTKERNELAPI
8417 BOOLEAN
8418 NTAPI
8419 KeInsertQueueDpc(
8420 IN PRKDPC Dpc,
8421 IN PVOID SystemArgument1,
8422 IN PVOID SystemArgument2);
8423
8424 NTKERNELAPI
8425 VOID
8426 NTAPI
8427 KeLeaveCriticalRegion(
8428 VOID);
8429
8430 #ifdef _X86_
8431
8432 static __inline
8433 VOID
8434 KeMemoryBarrier(
8435 VOID)
8436 {
8437 volatile LONG Barrier;
8438 #if defined(__GNUC__)
8439 __asm__ __volatile__ ("xchg %%eax, %0" : : "m" (Barrier) : "%eax");
8440 #elif defined(_MSC_VER)
8441 __asm xchg [Barrier], eax
8442 #endif
8443 }
8444
8445 #endif
8446
8447 NTKERNELAPI
8448 LONG
8449 NTAPI
8450 KePulseEvent(
8451 IN PRKEVENT Event,
8452 IN KPRIORITY Increment,
8453 IN BOOLEAN Wait);
8454
8455 NTKERNELAPI
8456 KAFFINITY
8457 NTAPI
8458 KeQueryActiveProcessors(
8459 VOID
8460 );
8461
8462 NTHALAPI
8463 LARGE_INTEGER
8464 NTAPI
8465 KeQueryPerformanceCounter(
8466 OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL);
8467
8468 NTKERNELAPI
8469 KPRIORITY
8470 NTAPI
8471 KeQueryPriorityThread(
8472 IN PRKTHREAD Thread);
8473
8474 NTKERNELAPI
8475 ULONG
8476 NTAPI
8477 KeQueryRuntimeThread(
8478 IN PKTHREAD Thread,
8479 OUT PULONG UserTime);
8480
8481 #if !defined(_M_AMD64)
8482 NTKERNELAPI
8483 ULONGLONG
8484 NTAPI
8485 KeQueryInterruptTime(
8486 VOID);
8487
8488 NTKERNELAPI
8489 VOID
8490 NTAPI
8491 KeQuerySystemTime(
8492 OUT PLARGE_INTEGER CurrentTime);
8493
8494 NTKERNELAPI
8495 VOID
8496 NTAPI
8497 KeQueryTickCount(
8498 OUT PLARGE_INTEGER TickCount);
8499 #endif
8500
8501 NTKERNELAPI
8502 ULONG
8503 NTAPI
8504 KeQueryTimeIncrement(
8505 VOID);
8506
8507 NTKERNELAPI
8508 LONG
8509 NTAPI
8510 KeReadStateEvent(
8511 IN PRKEVENT Event);
8512
8513 NTKERNELAPI
8514 LONG
8515 NTAPI
8516 KeReadStateMutex(
8517 IN PRKMUTEX Mutex);
8518
8519
8520 NTKERNELAPI
8521 LONG
8522 NTAPI
8523 KeReadStateSemaphore(
8524 IN PRKSEMAPHORE Semaphore);
8525
8526 NTKERNELAPI
8527 BOOLEAN
8528 NTAPI
8529 KeReadStateTimer(
8530 IN PKTIMER Timer);
8531
8532 NTKERNELAPI
8533 BOOLEAN
8534 NTAPI
8535 KeRegisterBugCheckCallback(
8536 IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord,
8537 IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine,
8538 IN PVOID Buffer,
8539 IN ULONG Length,
8540 IN PUCHAR Component);
8541
8542 NTKERNELAPI
8543 VOID
8544 FASTCALL
8545 KeReleaseInStackQueuedSpinLockFromDpcLevel(
8546 IN PKLOCK_QUEUE_HANDLE LockHandle);
8547
8548 NTKERNELAPI
8549 VOID
8550 NTAPI
8551 KeReleaseInterruptSpinLock(
8552 IN PKINTERRUPT Interrupt,
8553 IN KIRQL OldIrql);
8554
8555 NTKERNELAPI
8556 LONG
8557 NTAPI
8558 KeReleaseMutex(
8559 IN PRKMUTEX Mutex,
8560 IN BOOLEAN Wait);
8561
8562 NTKERNELAPI
8563 LONG
8564 NTAPI
8565 KeReleaseSemaphore(
8566 IN PRKSEMAPHORE Semaphore,
8567 IN KPRIORITY Increment,
8568 IN LONG Adjustment,
8569 IN BOOLEAN Wait);
8570
8571 NTKERNELAPI
8572 PKDEVICE_QUEUE_ENTRY
8573 NTAPI
8574 KeRemoveByKeyDeviceQueue(
8575 IN PKDEVICE_QUEUE DeviceQueue,
8576 IN ULONG SortKey);
8577
8578 NTKERNELAPI
8579 PKDEVICE_QUEUE_ENTRY
8580 NTAPI
8581 KeRemoveDeviceQueue(
8582 IN PKDEVICE_QUEUE DeviceQueue);
8583
8584 NTKERNELAPI
8585 BOOLEAN
8586 NTAPI
8587 KeRemoveEntryDeviceQueue(
8588 IN PKDEVICE_QUEUE DeviceQueue,
8589 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
8590
8591 NTKERNELAPI
8592 BOOLEAN
8593 NTAPI
8594 KeRemoveQueueDpc(
8595 IN PRKDPC Dpc);
8596
8597 NTKERNELAPI
8598 LONG
8599 NTAPI
8600 KeResetEvent(
8601 IN PRKEVENT Event);
8602
8603 NTKERNELAPI
8604 NTSTATUS
8605 NTAPI
8606 KeRestoreFloatingPointState(
8607 IN PKFLOATING_SAVE FloatSave);
8608
8609 NTKERNELAPI
8610 VOID
8611 NTAPI
8612 KeRevertToUserAffinityThread(VOID);
8613
8614 NTKERNELAPI
8615 NTSTATUS
8616 NTAPI
8617 KeSaveFloatingPointState(
8618 OUT PKFLOATING_SAVE FloatSave);
8619
8620 NTKERNELAPI
8621 LONG
8622 NTAPI
8623 KeSetBasePriorityThread(
8624 IN PRKTHREAD Thread,
8625 IN LONG Increment);
8626
8627 NTKERNELAPI
8628 LONG
8629 NTAPI
8630 KeSetEvent(
8631 IN PRKEVENT Event,
8632 IN KPRIORITY Increment,
8633 IN BOOLEAN Wait);
8634
8635 NTKERNELAPI
8636 VOID
8637 NTAPI
8638 KeSetImportanceDpc(
8639 IN PRKDPC Dpc,
8640 IN KDPC_IMPORTANCE Importance);
8641
8642 NTKERNELAPI
8643 KPRIORITY
8644 NTAPI
8645 KeSetPriorityThread(
8646 IN PKTHREAD Thread,
8647 IN KPRIORITY Priority);
8648
8649 NTKERNELAPI
8650 VOID
8651 NTAPI
8652 KeSetSystemAffinityThread(
8653 IN KAFFINITY Affinity);
8654
8655 NTKERNELAPI
8656 VOID
8657 NTAPI
8658 KeSetTargetProcessorDpc(
8659 IN PRKDPC Dpc,
8660 IN CCHAR Number);
8661
8662 NTKERNELAPI
8663 BOOLEAN
8664 NTAPI
8665 KeSetTimer(
8666 IN PKTIMER Timer,
8667 IN LARGE_INTEGER DueTime,
8668 IN PKDPC Dpc OPTIONAL);
8669
8670 NTKERNELAPI
8671 BOOLEAN
8672 NTAPI
8673 KeSetTimerEx(
8674 IN PKTIMER Timer,
8675 IN LARGE_INTEGER DueTime,
8676 IN LONG Period OPTIONAL,
8677 IN PKDPC Dpc OPTIONAL);
8678
8679 NTKERNELAPI
8680 VOID
8681 FASTCALL
8682 KeSetTimeUpdateNotifyRoutine(
8683 IN PTIME_UPDATE_NOTIFY_ROUTINE NotifyRoutine);
8684
8685 NTHALAPI
8686 VOID
8687 NTAPI
8688 KeStallExecutionProcessor(
8689 IN ULONG MicroSeconds);
8690
8691 NTKERNELAPI
8692 BOOLEAN
8693 NTAPI
8694 KeSynchronizeExecution(
8695 IN PKINTERRUPT Interrupt,
8696 IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine,
8697 IN PVOID SynchronizeContext);
8698
8699 NTKERNELAPI
8700 NTSTATUS
8701 NTAPI
8702 KeWaitForMultipleObjects(
8703 IN ULONG Count,
8704 IN PVOID Object[],
8705 IN WAIT_TYPE WaitType,
8706 IN KWAIT_REASON WaitReason,
8707 IN KPROCESSOR_MODE WaitMode,
8708 IN BOOLEAN Alertable,
8709 IN PLARGE_INTEGER Timeout OPTIONAL,
8710 IN PKWAIT_BLOCK WaitBlockArray OPTIONAL);
8711
8712 NTKERNELAPI
8713 NTSTATUS
8714 NTAPI
8715 KeWaitForMutexObject(
8716 IN PRKMUTEX Mutex,
8717 IN KWAIT_REASON WaitReason,
8718 IN KPROCESSOR_MODE WaitMode,
8719 IN BOOLEAN Alertable,
8720 IN PLARGE_INTEGER Timeout OPTIONAL);
8721
8722 NTKERNELAPI
8723 NTSTATUS
8724 NTAPI
8725 KeWaitForSingleObject(
8726 IN PVOID Object,
8727 IN KWAIT_REASON WaitReason,
8728 IN KPROCESSOR_MODE WaitMode,
8729 IN BOOLEAN Alertable,
8730 IN PLARGE_INTEGER Timeout OPTIONAL);
8731
8732 typedef
8733 ULONG_PTR
8734 (NTAPI *PKIPI_BROADCAST_WORKER)(
8735 IN ULONG_PTR Argument
8736 );
8737
8738 NTKERNELAPI
8739 ULONG_PTR
8740 NTAPI
8741 KeIpiGenericCall(
8742 IN PKIPI_BROADCAST_WORKER BroadcastFunction,
8743 IN ULONG_PTR Context
8744 );
8745
8746 #if defined(_X86_)
8747
8748 NTHALAPI
8749 VOID
8750 FASTCALL
8751 KfLowerIrql(
8752 IN KIRQL NewIrql);
8753
8754 NTHALAPI
8755 KIRQL
8756 FASTCALL
8757 KfRaiseIrql(
8758 IN KIRQL NewIrql);
8759
8760 NTHALAPI
8761 KIRQL
8762 DDKAPI
8763 KeRaiseIrqlToDpcLevel(
8764 VOID);
8765
8766 NTHALAPI
8767 KIRQL
8768 DDKAPI
8769 KeRaiseIrqlToSynchLevel(
8770 VOID);
8771
8772 #define KeLowerIrql(a) KfLowerIrql(a)
8773 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
8774
8775 #elif defined(_M_AMD64)
8776
8777 FORCEINLINE
8778 KIRQL
8779 KeGetCurrentIrql(VOID)
8780 {
8781 return (KIRQL)__readcr8();
8782 }
8783
8784 FORCEINLINE
8785 VOID
8786 KeLowerIrql(IN KIRQL NewIrql)
8787 {
8788 ASSERT(KeGetCurrentIrql() >= NewIrql);
8789 __writecr8(NewIrql);
8790 }
8791
8792 FORCEINLINE
8793 KIRQL
8794 KfRaiseIrql(IN KIRQL NewIrql)
8795 {
8796 KIRQL OldIrql;
8797
8798 OldIrql = __readcr8();
8799 ASSERT(OldIrql <= NewIrql);
8800 __writecr8(NewIrql);
8801 return OldIrql;
8802 }
8803 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
8804
8805 FORCEINLINE
8806 KIRQL
8807 KeRaiseIrqlToDpcLevel(VOID)
8808 {
8809 return KfRaiseIrql(DISPATCH_LEVEL);
8810 }
8811
8812 FORCEINLINE
8813 KIRQL
8814 KeRaiseIrqlToSynchLevel(VOID)
8815 {
8816 return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2
8817 }
8818
8819 #elif defined(__PowerPC__)
8820
8821 NTHALAPI
8822 VOID
8823 FASTCALL
8824 KfLowerIrql(
8825 IN KIRQL NewIrql);
8826
8827 NTHALAPI
8828 KIRQL
8829 FASTCALL
8830 KfRaiseIrql(
8831 IN KIRQL NewIrql);
8832
8833 NTHALAPI
8834 KIRQL
8835 DDKAPI
8836 KeRaiseIrqlToDpcLevel(
8837 VOID);
8838
8839 NTHALAPI
8840 KIRQL
8841 DDKAPI
8842 KeRaiseIrqlToSynchLevel(
8843 VOID);
8844
8845 #define KeLowerIrql(a) KfLowerIrql(a)
8846 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
8847
8848 #elif defined(_M_MIPS)
8849
8850 #define KeLowerIrql(a) KfLowerIrql(a)
8851 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
8852
8853 NTKERNELAPI
8854 VOID
8855 NTAPI
8856 KfLowerIrql(
8857 IN KIRQL NewIrql);
8858
8859 NTKERNELAPI
8860 KIRQL
8861 NTAPI
8862 KfRaiseIrql(
8863 IN KIRQL NewIrql);
8864
8865 NTKERNELAPI
8866 KIRQL
8867 NTAPI
8868 KeRaiseIrqlToDpcLevel(
8869 VOID);
8870
8871 NTKERNELAPI
8872 KIRQL
8873 DDKAPI
8874 KeRaiseIrqlToSynchLevel(
8875 VOID);
8876
8877 #elif defined(_M_ARM)
8878
8879 #include <armddk.h>
8880
8881 #else
8882
8883 NTKERNELAPI
8884 VOID
8885 NTAPI
8886 KeLowerIrql(
8887 IN KIRQL NewIrql);
8888
8889 NTKERNELAPI
8890 VOID
8891 NTAPI
8892 KeRaiseIrql(
8893 IN KIRQL NewIrql,
8894 OUT PKIRQL OldIrql);
8895
8896 NTKERNELAPI
8897 KIRQL
8898 NTAPI
8899 KeRaiseIrqlToDpcLevel(
8900 VOID);
8901
8902 NTKERNELAPI
8903 KIRQL
8904 DDKAPI
8905 KeRaiseIrqlToSynchLevel(
8906 VOID);
8907
8908 #endif
8909
8910 /** Memory manager routines **/
8911
8912 NTKERNELAPI
8913 NTSTATUS
8914 NTAPI
8915 MmAdvanceMdl(
8916 IN PMDL Mdl,
8917 IN ULONG NumberOfBytes);
8918
8919 NTKERNELAPI
8920 PVOID
8921 NTAPI
8922 MmAllocateContiguousMemory(
8923 IN ULONG NumberOfBytes,
8924 IN PHYSICAL_ADDRESS HighestAcceptableAddress);
8925
8926 NTKERNELAPI
8927 PVOID
8928 NTAPI
8929 MmAllocateContiguousMemorySpecifyCache(
8930 IN SIZE_T NumberOfBytes,
8931 IN PHYSICAL_ADDRESS LowestAcceptableAddress,
8932 IN PHYSICAL_ADDRESS HighestAcceptableAddress,
8933 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
8934 IN MEMORY_CACHING_TYPE CacheType);
8935
8936 NTKERNELAPI
8937 PVOID
8938 NTAPI
8939 MmAllocateMappingAddress(
8940 IN SIZE_T NumberOfBytes,
8941 IN ULONG PoolTag);
8942
8943 NTKERNELAPI
8944 PVOID
8945 NTAPI
8946 MmAllocateNonCachedMemory(
8947 IN ULONG NumberOfBytes);
8948
8949 NTKERNELAPI
8950 PMDL
8951 NTAPI
8952 MmAllocatePagesForMdl(
8953 IN PHYSICAL_ADDRESS LowAddress,
8954 IN PHYSICAL_ADDRESS HighAddress,
8955 IN PHYSICAL_ADDRESS SkipBytes,
8956 IN SIZE_T TotalBytes);
8957
8958 NTKERNELAPI
8959 VOID
8960 NTAPI
8961 MmBuildMdlForNonPagedPool(
8962 IN OUT PMDL MemoryDescriptorList);
8963
8964 typedef enum _MMFLUSH_TYPE {
8965 MmFlushForDelete,
8966 MmFlushForWrite
8967 } MMFLUSH_TYPE;
8968
8969 NTKERNELAPI
8970 BOOLEAN
8971 NTAPI
8972 MmFlushImageSection(
8973 IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
8974 IN MMFLUSH_TYPE FlushType);
8975
8976 NTKERNELAPI
8977 VOID
8978 NTAPI
8979 MmFreeContiguousMemory(
8980 IN PVOID BaseAddress);
8981
8982 NTKERNELAPI
8983 VOID
8984 NTAPI
8985 MmFreeContiguousMemorySpecifyCache(
8986 IN PVOID BaseAddress,
8987 IN SIZE_T NumberOfBytes,
8988 IN MEMORY_CACHING_TYPE CacheType);
8989
8990 NTKERNELAPI
8991 VOID
8992 NTAPI
8993 MmFreeMappingAddress(
8994 IN PVOID BaseAddress,
8995 IN ULONG PoolTag);
8996
8997 NTKERNELAPI
8998 VOID
8999 NTAPI
9000 MmFreeNonCachedMemory(
9001 IN PVOID BaseAddress,
9002 IN SIZE_T NumberOfBytes);
9003
9004 NTKERNELAPI
9005 VOID
9006 NTAPI
9007 MmFreePagesFromMdl(
9008 IN PMDL MemoryDescriptorList);
9009
9010 /*
9011 * ULONG
9012 * MmGetMdlByteCount(
9013 * IN PMDL Mdl)
9014 */
9015 #define MmGetMdlByteCount(_Mdl) \
9016 ((_Mdl)->ByteCount)
9017
9018 /*
9019 * ULONG
9020 * MmGetMdlByteOffset(
9021 * IN PMDL Mdl)
9022 */
9023 #define MmGetMdlByteOffset(_Mdl) \
9024 ((_Mdl)->ByteOffset)
9025
9026 /*
9027 * PPFN_NUMBER
9028 * MmGetMdlPfnArray(
9029 * IN PMDL Mdl)
9030 */
9031 #define MmGetMdlPfnArray(_Mdl) \
9032 ((PPFN_NUMBER) ((_Mdl) + 1))
9033
9034 /*
9035 * PVOID
9036 * MmGetMdlVirtualAddress(
9037 * IN PMDL Mdl)
9038 */
9039 #define MmGetMdlVirtualAddress(_Mdl) \
9040 ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
9041
9042 NTKERNELAPI
9043 PHYSICAL_ADDRESS
9044 NTAPI
9045 MmGetPhysicalAddress(
9046 IN PVOID BaseAddress);
9047
9048 NTKERNELAPI
9049 PPHYSICAL_MEMORY_RANGE
9050 NTAPI
9051 MmGetPhysicalMemoryRanges(
9052 VOID);
9053
9054 NTKERNELAPI
9055 PVOID
9056 NTAPI
9057 MmGetVirtualForPhysical(
9058 IN PHYSICAL_ADDRESS PhysicalAddress);
9059
9060 NTKERNELAPI
9061 PVOID
9062 NTAPI
9063 MmMapLockedPagesSpecifyCache(
9064 IN PMDL MemoryDescriptorList,
9065 IN KPROCESSOR_MODE AccessMode,
9066 IN MEMORY_CACHING_TYPE CacheType,
9067 IN PVOID BaseAddress,
9068 IN ULONG BugCheckOnFailure,
9069 IN MM_PAGE_PRIORITY Priority);
9070
9071 NTKERNELAPI
9072 PVOID
9073 NTAPI
9074 MmMapLockedPagesWithReservedMapping(
9075 IN PVOID MappingAddress,
9076 IN ULONG PoolTag,
9077 IN PMDL MemoryDescriptorList,
9078 IN MEMORY_CACHING_TYPE CacheType);
9079
9080 NTKERNELAPI
9081 NTSTATUS
9082 NTAPI
9083 MmMapUserAddressesToPage(
9084 IN PVOID BaseAddress,
9085 IN SIZE_T NumberOfBytes,
9086 IN PVOID PageAddress);
9087
9088 NTKERNELAPI
9089 PVOID
9090 NTAPI
9091 MmMapVideoDisplay(
9092 IN PHYSICAL_ADDRESS PhysicalAddress,
9093 IN SIZE_T NumberOfBytes,
9094 IN MEMORY_CACHING_TYPE CacheType);
9095
9096 NTKERNELAPI
9097 NTSTATUS
9098 NTAPI
9099 MmMapViewInSessionSpace(
9100 IN PVOID Section,
9101 OUT PVOID *MappedBase,
9102 IN OUT PSIZE_T ViewSize);
9103
9104 NTKERNELAPI
9105 NTSTATUS
9106 NTAPI
9107 MmMapViewInSystemSpace(
9108 IN PVOID Section,
9109 OUT PVOID *MappedBase,
9110 IN PSIZE_T ViewSize);
9111
9112 NTKERNELAPI
9113 NTSTATUS
9114 NTAPI
9115 MmMarkPhysicalMemoryAsBad(
9116 IN PPHYSICAL_ADDRESS StartAddress,
9117 IN OUT PLARGE_INTEGER NumberOfBytes);
9118
9119 NTKERNELAPI
9120 NTSTATUS
9121 NTAPI
9122 MmMarkPhysicalMemoryAsGood(
9123 IN PPHYSICAL_ADDRESS StartAddress,
9124 IN OUT PLARGE_INTEGER NumberOfBytes);
9125
9126 NTKERNELAPI
9127 PVOID
9128 NTAPI
9129 MmGetSystemRoutineAddress(
9130 IN PUNICODE_STRING SystemRoutineName);
9131
9132 /*
9133 * ULONG
9134 * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
9135 * IN PVOID Va,
9136 * IN ULONG Size)
9137 */
9138 #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, \
9139 _Size) \
9140 ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
9141 + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
9142
9143 /*
9144 * VOID
9145 * MmInitializeMdl(
9146 * IN PMDL MemoryDescriptorList,
9147 * IN PVOID BaseVa,
9148 * IN SIZE_T Length)
9149 */
9150 #define MmInitializeMdl(_MemoryDescriptorList, \
9151 _BaseVa, \
9152 _Length) \
9153 { \
9154 (_MemoryDescriptorList)->Next = (PMDL) NULL; \
9155 (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
9156 (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
9157 (_MemoryDescriptorList)->MdlFlags = 0; \
9158 (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
9159 (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
9160 (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
9161 }
9162
9163 NTKERNELAPI
9164 BOOLEAN
9165 NTAPI
9166 MmIsAddressValid(
9167 IN PVOID VirtualAddress);
9168
9169 NTKERNELAPI
9170 LOGICAL
9171 NTAPI
9172 MmIsDriverVerifying(
9173 IN PDRIVER_OBJECT DriverObject);
9174
9175 NTKERNELAPI
9176 BOOLEAN
9177 NTAPI
9178 MmIsThisAnNtAsSystem(
9179 VOID);
9180
9181 NTKERNELAPI
9182 NTSTATUS
9183 NTAPI
9184 MmIsVerifierEnabled(
9185 OUT PULONG VerifierFlags);
9186
9187 NTKERNELAPI
9188 PVOID
9189 NTAPI
9190 MmLockPagableDataSection(
9191 IN PVOID AddressWithinSection);
9192
9193 NTKERNELAPI
9194 PVOID
9195 NTAPI
9196 MmLockPagableImageSection(
9197 IN PVOID AddressWithinSection);
9198
9199 /*
9200 * PVOID
9201 * MmLockPagableCodeSection(
9202 * IN PVOID AddressWithinSection)
9203 */
9204 #define MmLockPagableCodeSection(Address) MmLockPagableDataSection(Address)
9205
9206 NTKERNELAPI
9207 VOID
9208 NTAPI
9209 MmLockPagableSectionByHandle(
9210 IN PVOID ImageSectionHandle);
9211
9212 NTKERNELAPI
9213 PVOID
9214 NTAPI
9215 MmMapIoSpace(
9216 IN PHYSICAL_ADDRESS PhysicalAddress,
9217 IN ULONG NumberOfBytes,
9218 IN MEMORY_CACHING_TYPE CacheEnable);
9219
9220 NTKERNELAPI
9221 PVOID
9222 NTAPI
9223 MmMapLockedPages(
9224 IN PMDL MemoryDescriptorList,
9225 IN KPROCESSOR_MODE AccessMode);
9226
9227 NTKERNELAPI
9228 PVOID
9229 NTAPI
9230 MmLockPageableDataSection (
9231 IN PVOID AddressWithinSection
9232 );
9233
9234 NTKERNELAPI
9235 VOID
9236 NTAPI
9237 MmUnlockPageableImageSection(
9238 IN PVOID ImageSectionHandle
9239 );
9240
9241 NTKERNELAPI
9242 PVOID
9243 NTAPI
9244 MmPageEntireDriver(
9245 IN PVOID AddressWithinSection);
9246
9247 NTKERNELAPI
9248 VOID
9249 NTAPI
9250 MmProbeAndLockProcessPages(
9251 IN OUT PMDL MemoryDescriptorList,
9252 IN PEPROCESS Process,
9253 IN KPROCESSOR_MODE AccessMode,
9254 IN LOCK_OPERATION Operation);
9255
9256 NTKERNELAPI
9257 NTSTATUS
9258 NTAPI
9259 MmProtectMdlSystemAddress(
9260 IN PMDL MemoryDescriptorList,
9261 IN ULONG NewProtect);
9262
9263 NTKERNELAPI
9264 VOID
9265 NTAPI
9266 MmUnmapLockedPages(
9267 IN PVOID BaseAddress,
9268 IN PMDL MemoryDescriptorList);
9269
9270 NTKERNELAPI
9271 NTSTATUS
9272 NTAPI
9273 MmUnmapViewInSessionSpace(
9274 IN PVOID MappedBase);
9275
9276 NTKERNELAPI
9277 NTSTATUS
9278 NTAPI
9279 MmUnmapViewInSystemSpace(
9280 IN PVOID MappedBase);
9281
9282 NTKERNELAPI
9283 VOID
9284 NTAPI
9285 MmUnsecureVirtualMemory(
9286 IN HANDLE SecureHandle);
9287
9288 /*
9289 * VOID
9290 * MmPrepareMdlForReuse(
9291 * IN PMDL Mdl)
9292 */
9293 #define MmPrepareMdlForReuse(_Mdl) \
9294 { \
9295 if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
9296 ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
9297 MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
9298 } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
9299 ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
9300 } \
9301 }
9302
9303 #define MmGetProcedureAddress(Address) (Address)
9304
9305 NTKERNELAPI
9306 VOID
9307 NTAPI
9308 MmProbeAndLockPages(
9309 IN OUT PMDL MemoryDescriptorList,
9310 IN KPROCESSOR_MODE AccessMode,
9311 IN LOCK_OPERATION Operation);
9312
9313 NTKERNELAPI
9314 MM_SYSTEMSIZE
9315 NTAPI
9316 MmQuerySystemSize(
9317 VOID);
9318
9319 NTKERNELAPI
9320 NTSTATUS
9321 NTAPI
9322 MmRemovePhysicalMemory(
9323 IN PPHYSICAL_ADDRESS StartAddress,
9324 IN OUT PLARGE_INTEGER NumberOfBytes);
9325
9326 NTKERNELAPI
9327 VOID
9328 NTAPI
9329 MmResetDriverPaging(
9330 IN PVOID AddressWithinSection);
9331
9332 NTKERNELAPI
9333 HANDLE
9334 NTAPI
9335 MmSecureVirtualMemory(
9336 IN PVOID Address,
9337 IN SIZE_T Size,
9338 IN ULONG ProbeMode);
9339
9340 NTKERNELAPI
9341 SIZE_T
9342 NTAPI
9343 MmSizeOfMdl(
9344 IN PVOID Base,
9345 IN SIZE_T Length);
9346
9347 NTKERNELAPI
9348 VOID
9349 NTAPI
9350 MmUnlockPagableImageSection(
9351 IN PVOID ImageSectionHandle);
9352
9353 NTKERNELAPI
9354 VOID
9355 NTAPI
9356 MmUnlockPages(
9357 IN PMDL MemoryDescriptorList);
9358
9359 NTKERNELAPI
9360 VOID
9361 NTAPI
9362 MmUnmapIoSpace(
9363 IN PVOID BaseAddress,
9364 IN SIZE_T NumberOfBytes);
9365
9366 NTKERNELAPI
9367 VOID
9368 NTAPI
9369 MmUnmapReservedMapping(
9370 IN PVOID BaseAddress,
9371 IN ULONG PoolTag,
9372 IN PMDL MemoryDescriptorList);
9373
9374 NTKERNELAPI
9375 VOID
9376 NTAPI
9377 MmUnmapVideoDisplay(
9378 IN PVOID BaseAddress,
9379 IN SIZE_T NumberOfBytes);
9380
9381
9382
9383 /** Object manager routines **/
9384
9385 NTKERNELAPI
9386 NTSTATUS
9387 NTAPI
9388 ObAssignSecurity(
9389 IN PACCESS_STATE AccessState,
9390 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
9391 IN PVOID Object,
9392 IN POBJECT_TYPE Type);
9393
9394 NTKERNELAPI
9395 VOID
9396 NTAPI
9397 ObDereferenceSecurityDescriptor(
9398 PSECURITY_DESCRIPTOR SecurityDescriptor,
9399 ULONG Count);
9400
9401 NTKERNELAPI
9402 LONG_PTR
9403 FASTCALL
9404 ObfDereferenceObject(
9405 IN PVOID Object);
9406
9407 /*
9408 * VOID
9409 * ObDereferenceObject(
9410 * IN PVOID Object)
9411 */
9412 #define ObDereferenceObject ObfDereferenceObject
9413
9414 NTKERNELAPI
9415 NTSTATUS
9416 NTAPI
9417 ObGetObjectSecurity(
9418 IN PVOID Object,
9419 OUT PSECURITY_DESCRIPTOR *SecurityDescriptor,
9420 OUT PBOOLEAN MemoryAllocated);
9421
9422 NTKERNELAPI
9423 NTSTATUS
9424 NTAPI
9425 ObInsertObject(
9426 IN PVOID Object,
9427 IN PACCESS_STATE PassedAccessState OPTIONAL,
9428 IN ACCESS_MASK DesiredAccess,
9429 IN ULONG AdditionalReferences,
9430 OUT PVOID* ReferencedObject OPTIONAL,
9431 OUT PHANDLE Handle);
9432
9433 NTKERNELAPI
9434 LONG_PTR
9435 FASTCALL
9436 ObfReferenceObject(
9437 IN PVOID Object);
9438
9439 NTKERNELAPI
9440 NTSTATUS
9441 NTAPI
9442 ObLogSecurityDescriptor(
9443 IN PSECURITY_DESCRIPTOR InputSecurityDescriptor,
9444 OUT PSECURITY_DESCRIPTOR *OutputSecurityDescriptor,
9445 IN ULONG RefBias);
9446 /*
9447 * VOID
9448 * ObReferenceObject(
9449 * IN PVOID Object)
9450 */
9451 #define ObReferenceObject ObfReferenceObject
9452
9453 NTKERNELAPI
9454 VOID
9455 NTAPI
9456 ObMakeTemporaryObject(
9457 IN PVOID Object);
9458
9459 NTKERNELAPI
9460 NTSTATUS
9461 NTAPI
9462 ObOpenObjectByName(
9463 IN POBJECT_ATTRIBUTES ObjectAttributes,
9464 IN POBJECT_TYPE ObjectType,
9465 IN KPROCESSOR_MODE AccessMode,
9466 IN PACCESS_STATE PassedAccessState,
9467 IN ACCESS_MASK DesiredAccess,
9468 IN OUT PVOID ParseContext OPTIONAL,
9469 OUT PHANDLE Handle);
9470
9471 NTKERNELAPI
9472 NTSTATUS
9473 NTAPI
9474 ObOpenObjectByPointer(
9475 IN PVOID Object,
9476 IN ULONG HandleAttributes,
9477 IN PACCESS_STATE PassedAccessState OPTIONAL,
9478 IN ACCESS_MASK DesiredAccess OPTIONAL,
9479 IN POBJECT_TYPE ObjectType OPTIONAL,
9480 IN KPROCESSOR_MODE AccessMode,
9481 OUT PHANDLE Handle);
9482
9483 NTKERNELAPI
9484 NTSTATUS
9485 NTAPI
9486 ObQueryObjectAuditingByHandle(
9487 IN HANDLE Handle,
9488 OUT PBOOLEAN GenerateOnClose);
9489
9490 NTKERNELAPI
9491 NTSTATUS
9492 NTAPI
9493 ObReferenceObjectByHandle(
9494 IN HANDLE Handle,
9495 IN ACCESS_MASK DesiredAccess,
9496 IN POBJECT_TYPE ObjectType OPTIONAL,
9497 IN KPROCESSOR_MODE AccessMode,
9498 OUT PVOID *Object,
9499 OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL);
9500
9501 NTKERNELAPI
9502 NTSTATUS
9503 NTAPI
9504 ObReferenceObjectByName(
9505 IN PUNICODE_STRING ObjectPath,
9506 IN ULONG Attributes,
9507 IN PACCESS_STATE PassedAccessState OPTIONAL,
9508 IN ACCESS_MASK DesiredAccess OPTIONAL,
9509 IN POBJECT_TYPE ObjectType,
9510 IN KPROCESSOR_MODE AccessMode,
9511 IN OUT PVOID ParseContext OPTIONAL,
9512 OUT PVOID *Object);
9513
9514 NTKERNELAPI
9515 NTSTATUS
9516 NTAPI
9517 ObReferenceObjectByPointer(
9518 IN PVOID Object,
9519 IN ACCESS_MASK DesiredAccess,
9520 IN POBJECT_TYPE ObjectType,
9521 IN KPROCESSOR_MODE AccessMode);
9522
9523 NTKERNELAPI
9524 VOID
9525 NTAPI
9526 ObReferenceSecurityDescriptor(
9527 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
9528 IN ULONG Count);
9529
9530 NTKERNELAPI
9531 VOID
9532 NTAPI
9533 ObReleaseObjectSecurity(
9534 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
9535 IN BOOLEAN MemoryAllocated);
9536
9537
9538
9539 /** Process manager routines **/
9540
9541 NTKERNELAPI
9542 NTSTATUS
9543 NTAPI
9544 PsCreateSystemProcess(
9545 IN PHANDLE ProcessHandle,
9546 IN ACCESS_MASK DesiredAccess,
9547 IN POBJECT_ATTRIBUTES ObjectAttributes);
9548
9549 NTKERNELAPI
9550 NTSTATUS
9551 NTAPI
9552 PsCreateSystemThread(
9553 OUT PHANDLE ThreadHandle,
9554 IN ULONG DesiredAccess,
9555 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
9556 IN HANDLE ProcessHandle OPTIONAL,
9557 OUT PCLIENT_ID ClientId OPTIONAL,
9558 IN PKSTART_ROUTINE StartRoutine,
9559 IN PVOID StartContext);
9560
9561 /*
9562 * PEPROCESS
9563 * PsGetCurrentProcess(VOID)
9564 */
9565 #define PsGetCurrentProcess IoGetCurrentProcess
9566
9567 NTKERNELAPI
9568 HANDLE
9569 NTAPI
9570 PsGetCurrentProcessId(
9571 VOID);
9572
9573 /*
9574 * PETHREAD
9575 * PsGetCurrentThread(VOID)
9576 */
9577 #define PsGetCurrentThread() \
9578 ((PETHREAD) KeGetCurrentThread())
9579
9580 NTKERNELAPI
9581 HANDLE
9582 NTAPI
9583 PsGetCurrentThreadId(
9584 VOID);
9585
9586 NTKERNELAPI
9587 HANDLE
9588 NTAPI
9589 PsGetProcessId(PEPROCESS Process);
9590
9591 NTKERNELAPI
9592 BOOLEAN
9593 NTAPI
9594 PsGetVersion(
9595 PULONG MajorVersion OPTIONAL,
9596 PULONG MinorVersion OPTIONAL,
9597 PULONG BuildNumber OPTIONAL,
9598 PUNICODE_STRING CSDVersion OPTIONAL);
9599
9600 NTKERNELAPI
9601 NTSTATUS
9602 NTAPI
9603 PsRemoveCreateThreadNotifyRoutine(
9604 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
9605
9606 NTKERNELAPI
9607 NTSTATUS
9608 NTAPI
9609 PsRemoveLoadImageNotifyRoutine(
9610 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
9611
9612 NTKERNELAPI
9613 NTSTATUS
9614 NTAPI
9615 PsSetCreateProcessNotifyRoutine(
9616 IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
9617 IN BOOLEAN Remove);
9618
9619 NTKERNELAPI
9620 NTSTATUS
9621 NTAPI
9622 PsSetCreateThreadNotifyRoutine(
9623 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
9624
9625 NTKERNELAPI
9626 NTSTATUS
9627 NTAPI
9628 PsSetLoadImageNotifyRoutine(
9629 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
9630
9631 NTKERNELAPI
9632 NTSTATUS
9633 NTAPI
9634 PsTerminateSystemThread(
9635 IN NTSTATUS ExitStatus);
9636
9637 extern NTSYSAPI PEPROCESS PsInitialSystemProcess;
9638
9639
9640 /** Security reference monitor routines **/
9641
9642 NTKERNELAPI
9643 BOOLEAN
9644 NTAPI
9645 SeAccessCheck(
9646 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
9647 IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext,
9648 IN BOOLEAN SubjectContextLocked,
9649 IN ACCESS_MASK DesiredAccess,
9650 IN ACCESS_MASK PreviouslyGrantedAccess,
9651 OUT PPRIVILEGE_SET *Privileges OPTIONAL,
9652 IN PGENERIC_MAPPING GenericMapping,
9653 IN KPROCESSOR_MODE AccessMode,
9654 OUT PACCESS_MASK GrantedAccess,
9655 OUT PNTSTATUS AccessStatus);
9656
9657 NTKERNELAPI
9658 NTSTATUS
9659 NTAPI
9660 SeAssignSecurity(
9661 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
9662 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
9663 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
9664 IN BOOLEAN IsDirectoryObject,
9665 IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
9666 IN PGENERIC_MAPPING GenericMapping,
9667 IN POOL_TYPE PoolType);
9668
9669 NTKERNELAPI
9670 NTSTATUS
9671 NTAPI
9672 SeAssignSecurityEx(
9673 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
9674 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
9675 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
9676 IN GUID *ObjectType OPTIONAL,
9677 IN BOOLEAN IsDirectoryObject,
9678 IN ULONG AutoInheritFlags,
9679 IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
9680 IN PGENERIC_MAPPING GenericMapping,
9681 IN POOL_TYPE PoolType);
9682
9683 NTKERNELAPI
9684 NTSTATUS
9685 NTAPI
9686 SeDeassignSecurity(
9687 IN OUT PSECURITY_DESCRIPTOR *SecurityDescriptor);
9688
9689 NTKERNELAPI
9690 BOOLEAN
9691 NTAPI
9692 SeSinglePrivilegeCheck(
9693 LUID PrivilegeValue,
9694 KPROCESSOR_MODE PreviousMode);
9695
9696 NTKERNELAPI
9697 BOOLEAN
9698 NTAPI
9699 SeValidSecurityDescriptor(
9700 IN ULONG Length,
9701 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
9702
9703
9704
9705 /** NtXxx routines **/
9706
9707 NTSYSCALLAPI
9708 NTSTATUS
9709 NTAPI
9710 NtOpenProcess(
9711 OUT PHANDLE ProcessHandle,
9712 IN ACCESS_MASK DesiredAccess,
9713 IN POBJECT_ATTRIBUTES ObjectAttributes,
9714 IN PCLIENT_ID ClientId OPTIONAL);
9715
9716 NTSYSCALLAPI
9717 NTSTATUS
9718 NTAPI
9719 NtQueryInformationProcess(
9720 IN HANDLE ProcessHandle,
9721 IN PROCESSINFOCLASS ProcessInformationClass,
9722 OUT PVOID ProcessInformation,
9723 IN ULONG ProcessInformationLength,
9724 OUT PULONG ReturnLength OPTIONAL);
9725
9726
9727
9728 /** NtXxx and ZwXxx routines **/
9729
9730 NTSYSAPI
9731 NTSTATUS
9732 NTAPI
9733 ZwCancelTimer(
9734 IN HANDLE TimerHandle,
9735 OUT PBOOLEAN CurrentState OPTIONAL);
9736
9737 NTSYSCALLAPI
9738 NTSTATUS
9739 NTAPI
9740 NtClose(
9741 IN HANDLE Handle);
9742
9743 NTSYSAPI
9744 NTSTATUS
9745 NTAPI
9746 ZwClose(
9747 IN HANDLE Handle);
9748
9749 NTSYSAPI
9750 NTSTATUS
9751 NTAPI
9752 ZwCreateDirectoryObject(
9753 OUT PHANDLE DirectoryHandle,
9754 IN ACCESS_MASK DesiredAccess,
9755 IN POBJECT_ATTRIBUTES ObjectAttributes);
9756
9757 NTSYSCALLAPI
9758 NTSTATUS
9759 NTAPI
9760 NtCreateEvent(
9761 OUT PHANDLE EventHandle,
9762 IN ACCESS_MASK DesiredAccess,
9763 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
9764 IN EVENT_TYPE EventType,
9765 IN BOOLEAN InitialState);
9766
9767 NTSYSAPI
9768 NTSTATUS
9769 NTAPI
9770 ZwCreateEvent(
9771 OUT PHANDLE EventHandle,
9772 IN ACCESS_MASK DesiredAccess,
9773 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
9774 IN EVENT_TYPE EventType,
9775 IN BOOLEAN InitialState);
9776
9777 NTSYSAPI
9778 NTSTATUS
9779 NTAPI
9780 ZwCreateFile(
9781 OUT PHANDLE FileHandle,
9782 IN ACCESS_MASK DesiredAccess,
9783 IN POBJECT_ATTRIBUTES ObjectAttributes,
9784 OUT PIO_STATUS_BLOCK IoStatusBlock,
9785 IN PLARGE_INTEGER AllocationSize OPTIONAL,
9786 IN ULONG FileAttributes,
9787 IN ULONG ShareAccess,
9788 IN ULONG CreateDisposition,
9789 IN ULONG CreateOptions,
9790 IN PVOID EaBuffer OPTIONAL,
9791 IN ULONG EaLength);
9792
9793 NTSYSAPI
9794 NTSTATUS
9795 NTAPI
9796 ZwCreateKey(
9797 OUT PHANDLE KeyHandle,
9798 IN ACCESS_MASK DesiredAccess,
9799 IN POBJECT_ATTRIBUTES ObjectAttributes,
9800 IN ULONG TitleIndex,
9801 IN PUNICODE_STRING Class OPTIONAL,
9802 IN ULONG CreateOptions,
9803 OUT PULONG Disposition OPTIONAL);
9804
9805 NTSYSAPI
9806 NTSTATUS
9807 NTAPI
9808 ZwCreateTimer(
9809 OUT PHANDLE TimerHandle,
9810 IN ACCESS_MASK DesiredAccess,
9811 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
9812 IN TIMER_TYPE TimerType);
9813
9814 NTSYSAPI
9815 NTSTATUS
9816 NTAPI
9817 ZwDeleteKey(
9818 IN HANDLE KeyHandle);
9819
9820 NTSYSAPI
9821 NTSTATUS
9822 NTAPI
9823 ZwDeleteValueKey(
9824 IN HANDLE KeyHandle,
9825 IN PUNICODE_STRING ValueName);
9826
9827 NTSYSCALLAPI
9828 NTSTATUS
9829 NTAPI
9830 NtDeviceIoControlFile(
9831 IN HANDLE DeviceHandle,
9832 IN HANDLE Event OPTIONAL,
9833 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
9834 IN PVOID UserApcContext OPTIONAL,
9835 OUT PIO_STATUS_BLOCK IoStatusBlock,
9836 IN ULONG IoControlCode,
9837 IN PVOID InputBuffer,
9838 IN ULONG InputBufferSize,
9839 OUT PVOID OutputBuffer,
9840 IN ULONG OutputBufferSize);
9841
9842 NTSYSAPI
9843 NTSTATUS
9844 NTAPI
9845 ZwDeviceIoControlFile(
9846 IN HANDLE DeviceHandle,
9847 IN HANDLE Event OPTIONAL,
9848 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
9849 IN PVOID UserApcContext OPTIONAL,
9850 OUT PIO_STATUS_BLOCK IoStatusBlock,
9851 IN ULONG IoControlCode,
9852 IN PVOID InputBuffer,
9853 IN ULONG InputBufferSize,
9854 OUT PVOID OutputBuffer,
9855 IN ULONG OutputBufferSize);
9856
9857 NTSYSAPI
9858 NTSTATUS
9859 NTAPI
9860 ZwEnumerateKey(
9861 IN HANDLE KeyHandle,
9862 IN ULONG Index,
9863 IN KEY_INFORMATION_CLASS KeyInformationClass,
9864 OUT PVOID KeyInformation,
9865 IN ULONG Length,
9866 OUT PULONG ResultLength);
9867
9868 NTSYSAPI
9869 NTSTATUS
9870 NTAPI
9871 ZwEnumerateValueKey(
9872 IN HANDLE KeyHandle,
9873 IN ULONG Index,
9874 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
9875 OUT PVOID KeyValueInformation,
9876 IN ULONG Length,
9877 OUT PULONG ResultLength);
9878
9879 NTSYSAPI
9880 NTSTATUS
9881 NTAPI
9882 ZwFlushKey(
9883 IN HANDLE KeyHandle);
9884
9885 NTSYSAPI
9886 NTSTATUS
9887 NTAPI
9888 ZwMakeTemporaryObject(
9889 IN HANDLE Handle);
9890
9891 NTSYSCALLAPI
9892 NTSTATUS
9893 NTAPI
9894 NtMapViewOfSection(
9895 IN HANDLE SectionHandle,
9896 IN HANDLE ProcessHandle,
9897 IN OUT PVOID *BaseAddress,
9898 IN ULONG_PTR ZeroBits,
9899 IN SIZE_T CommitSize,
9900 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
9901 IN OUT PSIZE_T ViewSize,
9902 IN SECTION_INHERIT InheritDisposition,
9903 IN ULONG AllocationType,
9904 IN ULONG Protect);
9905
9906 NTSYSAPI
9907 NTSTATUS
9908 NTAPI
9909 ZwMapViewOfSection(
9910 IN HANDLE SectionHandle,
9911 IN HANDLE ProcessHandle,
9912 IN OUT PVOID *BaseAddress,
9913 IN ULONG_PTR ZeroBits,
9914 IN SIZE_T CommitSize,
9915 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
9916 IN OUT PSIZE_T ViewSize,
9917 IN SECTION_INHERIT InheritDisposition,
9918 IN ULONG AllocationType,
9919 IN ULONG Protect);
9920
9921 NTSYSCALLAPI
9922 NTSTATUS
9923 NTAPI
9924 NtOpenFile(
9925 OUT PHANDLE FileHandle,
9926 IN ACCESS_MASK DesiredAccess,
9927 IN POBJECT_ATTRIBUTES ObjectAttributes,
9928 OUT PIO_STATUS_BLOCK IoStatusBlock,
9929 IN ULONG ShareAccess,
9930 IN ULONG OpenOptions);
9931
9932 NTSYSAPI
9933 NTSTATUS
9934 NTAPI
9935 ZwOpenFile(
9936 OUT PHANDLE FileHandle,
9937 IN ACCESS_MASK DesiredAccess,
9938 IN POBJECT_ATTRIBUTES ObjectAttributes,
9939 OUT PIO_STATUS_BLOCK IoStatusBlock,
9940 IN ULONG ShareAccess,
9941 IN ULONG OpenOptions);
9942
9943 NTSYSAPI
9944 NTSTATUS
9945 NTAPI
9946 ZwOpenKey(
9947 OUT PHANDLE KeyHandle,
9948 IN ACCESS_MASK DesiredAccess,
9949 IN POBJECT_ATTRIBUTES ObjectAttributes);
9950
9951 NTSYSAPI
9952 NTSTATUS
9953 NTAPI
9954 ZwOpenSection(
9955 OUT PHANDLE SectionHandle,
9956 IN ACCESS_MASK DesiredAccess,
9957 IN POBJECT_ATTRIBUTES ObjectAttributes);
9958
9959 NTSYSAPI
9960 NTSTATUS
9961 NTAPI
9962 ZwOpenSymbolicLinkObject(
9963 OUT PHANDLE LinkHandle,
9964 IN ACCESS_MASK DesiredAccess,
9965 IN POBJECT_ATTRIBUTES ObjectAttributes);
9966
9967 NTSYSAPI
9968 NTSTATUS
9969 NTAPI
9970 ZwOpenTimer(
9971 OUT PHANDLE TimerHandle,
9972 IN ACCESS_MASK DesiredAccess,
9973 IN POBJECT_ATTRIBUTES ObjectAttributes);
9974
9975 NTSYSAPI
9976 NTSTATUS
9977 NTAPI
9978 ZwQueryInformationFile(
9979 IN HANDLE FileHandle,
9980 OUT PIO_STATUS_BLOCK IoStatusBlock,
9981 OUT PVOID FileInformation,
9982 IN ULONG Length,
9983 IN FILE_INFORMATION_CLASS FileInformationClass);
9984
9985 NTSYSAPI
9986 NTSTATUS
9987 NTAPI
9988 ZwQueryKey(
9989 IN HANDLE KeyHandle,
9990 IN KEY_INFORMATION_CLASS KeyInformationClass,
9991 OUT PVOID KeyInformation,
9992 IN ULONG Length,
9993 OUT PULONG ResultLength);
9994
9995 NTSYSAPI
9996 NTSTATUS
9997 NTAPI
9998 ZwQuerySymbolicLinkObject(
9999 IN HANDLE LinkHandle,
10000 IN OUT PUNICODE_STRING LinkTarget,
10001 OUT PULONG ReturnedLength OPTIONAL);
10002
10003 NTSYSAPI
10004 NTSTATUS
10005 NTAPI
10006 ZwQueryValueKey(
10007 IN HANDLE KeyHandle,
10008 IN PUNICODE_STRING ValueName,
10009 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
10010 OUT PVOID KeyValueInformation,
10011 IN ULONG Length,
10012 OUT PULONG ResultLength);
10013
10014 NTSYSCALLAPI
10015 NTSTATUS
10016 NTAPI
10017 NtReadFile(
10018 IN HANDLE FileHandle,
10019 IN HANDLE Event OPTIONAL,
10020 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
10021 IN PVOID ApcContext OPTIONAL,
10022 OUT PIO_STATUS_BLOCK IoStatusBlock,
10023 OUT PVOID Buffer,
10024 IN ULONG Length,
10025 IN PLARGE_INTEGER ByteOffset OPTIONAL,
10026 IN PULONG Key OPTIONAL);
10027
10028 NTSYSAPI
10029 NTSTATUS
10030 NTAPI
10031 ZwReadFile(
10032 IN HANDLE FileHandle,
10033 IN HANDLE Event OPTIONAL,
10034 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
10035 IN PVOID ApcContext OPTIONAL,
10036 OUT PIO_STATUS_BLOCK IoStatusBlock,
10037 OUT PVOID Buffer,
10038 IN ULONG Length,
10039 IN PLARGE_INTEGER ByteOffset OPTIONAL,
10040 IN PULONG Key OPTIONAL);
10041
10042 NTSYSCALLAPI
10043 NTSTATUS
10044 NTAPI
10045 NtSetEvent(
10046 IN HANDLE EventHandle,
10047 OUT PLONG PreviousState OPTIONAL);
10048
10049 NTSYSAPI
10050 NTSTATUS
10051 NTAPI
10052 ZwSetEvent(
10053 IN HANDLE EventHandle,
10054 OUT PLONG PreviousState OPTIONAL);
10055
10056 NTSYSAPI
10057 NTSTATUS
10058 NTAPI
10059 ZwSetInformationFile(
10060 IN HANDLE FileHandle,
10061 OUT PIO_STATUS_BLOCK IoStatusBlock,
10062 IN PVOID FileInformation,
10063 IN ULONG Length,
10064 IN FILE_INFORMATION_CLASS FileInformationClass);
10065
10066 NTSYSAPI
10067 NTSTATUS
10068 NTAPI
10069 ZwSetInformationThread(
10070 IN HANDLE ThreadHandle,
10071 IN THREADINFOCLASS ThreadInformationClass,
10072 IN PVOID ThreadInformation,
10073 IN ULONG ThreadInformationLength);
10074
10075 NTSYSAPI
10076 NTSTATUS
10077 NTAPI
10078 ZwSetTimer(
10079 IN HANDLE TimerHandle,
10080 IN PLARGE_INTEGER DueTime,
10081 IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL,
10082 IN PVOID TimerContext OPTIONAL,
10083 IN BOOLEAN WakeTimer,
10084 IN LONG Period OPTIONAL,
10085 OUT PBOOLEAN PreviousState OPTIONAL);
10086
10087 NTSYSAPI
10088 NTSTATUS
10089 NTAPI
10090 ZwSetValueKey(
10091 IN HANDLE KeyHandle,
10092 IN PUNICODE_STRING ValueName,
10093 IN ULONG TitleIndex OPTIONAL,
10094 IN ULONG Type,
10095 IN PVOID Data,
10096 IN ULONG DataSize);
10097
10098 /* [Nt|Zw]MapViewOfSection.InheritDisposition constants */
10099 #define AT_EXTENDABLE_FILE 0x00002000
10100 #define AT_RESERVED 0x20000000
10101 #define AT_ROUND_TO_PAGE 0x40000000
10102
10103 NTSYSCALLAPI
10104 NTSTATUS
10105 NTAPI
10106 NtUnmapViewOfSection(
10107 IN HANDLE ProcessHandle,
10108 IN PVOID BaseAddress);
10109
10110 NTSYSAPI
10111 NTSTATUS
10112 NTAPI
10113 ZwUnmapViewOfSection(
10114 IN HANDLE ProcessHandle,
10115 IN PVOID BaseAddress);
10116
10117 NTSYSCALLAPI
10118 NTSTATUS
10119 NTAPI
10120 NtWaitForSingleObject(
10121 IN HANDLE ObjectHandle,
10122 IN BOOLEAN Alertable,
10123 IN PLARGE_INTEGER TimeOut OPTIONAL);
10124
10125 NTSYSAPI
10126 NTSTATUS
10127 NTAPI
10128 ZwWaitForSingleObject(
10129 IN HANDLE ObjectHandle,
10130 IN BOOLEAN Alertable,
10131 IN PLARGE_INTEGER TimeOut OPTIONAL);
10132
10133 NTSYSCALLAPI
10134 NTSTATUS
10135 NTAPI
10136 NtWriteFile(
10137 IN HANDLE FileHandle,
10138 IN HANDLE Event OPTIONAL,
10139 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
10140 IN PVOID ApcContext OPTIONAL,
10141 OUT PIO_STATUS_BLOCK IoStatusBlock,
10142 IN PVOID Buffer,
10143 IN ULONG Length,
10144 IN PLARGE_INTEGER ByteOffset OPTIONAL,
10145 IN PULONG Key OPTIONAL);
10146
10147 NTSYSAPI
10148 NTSTATUS
10149 NTAPI
10150 ZwWriteFile(
10151 IN HANDLE FileHandle,
10152 IN HANDLE Event OPTIONAL,
10153 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
10154 IN PVOID ApcContext OPTIONAL,
10155 OUT PIO_STATUS_BLOCK IoStatusBlock,
10156 IN PVOID Buffer,
10157 IN ULONG Length,
10158 IN PLARGE_INTEGER ByteOffset OPTIONAL,
10159 IN PULONG Key OPTIONAL);
10160
10161
10162
10163 /** Power management support routines **/
10164
10165 NTKERNELAPI
10166 NTSTATUS
10167 NTAPI
10168 PoCallDriver(
10169 IN PDEVICE_OBJECT DeviceObject,
10170 IN OUT PIRP Irp);
10171
10172 NTKERNELAPI
10173 PULONG
10174 NTAPI
10175 PoRegisterDeviceForIdleDetection(
10176 IN PDEVICE_OBJECT DeviceObject,
10177 IN ULONG ConservationIdleTime,
10178 IN ULONG PerformanceIdleTime,
10179 IN DEVICE_POWER_STATE State);
10180
10181 NTKERNELAPI
10182 PVOID
10183 NTAPI
10184 PoRegisterSystemState(
10185 IN PVOID StateHandle,
10186 IN EXECUTION_STATE Flags);
10187
10188 NTKERNELAPI
10189 NTSTATUS
10190 NTAPI
10191 PoRequestPowerIrp(
10192 IN PDEVICE_OBJECT DeviceObject,
10193 IN UCHAR MinorFunction,
10194 IN POWER_STATE PowerState,
10195 IN PREQUEST_POWER_COMPLETE CompletionFunction,
10196 IN PVOID Context,
10197 OUT PIRP *Irp OPTIONAL);
10198
10199 NTKERNELAPI
10200 NTSTATUS
10201 NTAPI
10202 PoRequestShutdownEvent(
10203 OUT PVOID *Event);
10204
10205 NTKERNELAPI
10206 VOID
10207 NTAPI
10208 PoSetDeviceBusy(
10209 PULONG IdlePointer);
10210
10211 #define PoSetDeviceBusy(IdlePointer) \
10212 ((void)(*(IdlePointer) = 0))
10213
10214 NTKERNELAPI
10215 POWER_STATE
10216 NTAPI
10217 PoSetPowerState(
10218 IN PDEVICE_OBJECT DeviceObject,
10219 IN POWER_STATE_TYPE Type,
10220 IN POWER_STATE State);
10221
10222 NTKERNELAPI
10223 VOID
10224 NTAPI
10225 PoSetSystemState(
10226 IN EXECUTION_STATE Flags);
10227
10228 NTKERNELAPI
10229 VOID
10230 NTAPI
10231 PoStartNextPowerIrp(
10232 IN PIRP Irp);
10233
10234 NTKERNELAPI
10235 VOID
10236 NTAPI
10237 PoUnregisterSystemState(
10238 IN PVOID StateHandle);
10239
10240
10241
10242 /** WMI library support routines **/
10243
10244 NTSTATUS
10245 NTAPI
10246 WmiCompleteRequest(
10247 IN PDEVICE_OBJECT DeviceObject,
10248 IN PIRP Irp,
10249 IN NTSTATUS Status,
10250 IN ULONG BufferUsed,
10251 IN CCHAR PriorityBoost);
10252
10253 NTSTATUS
10254 NTAPI
10255 WmiFireEvent(
10256 IN PDEVICE_OBJECT DeviceObject,
10257 IN LPGUID Guid,
10258 IN ULONG InstanceIndex,
10259 IN ULONG EventDataSize,
10260 IN PVOID EventData);
10261
10262 NTKERNELAPI
10263 NTSTATUS
10264 NTAPI
10265 WmiQueryTraceInformation(
10266 IN TRACE_INFORMATION_CLASS TraceInformationClass,
10267 OUT PVOID TraceInformation,
10268 IN ULONG TraceInformationLength,
10269 OUT PULONG RequiredLength OPTIONAL,
10270 IN PVOID Buffer OPTIONAL);
10271
10272 NTSTATUS
10273 NTAPI
10274 WmiSystemControl(
10275 IN PWMILIB_CONTEXT WmiLibInfo,
10276 IN PDEVICE_OBJECT DeviceObject,
10277 IN PIRP Irp,
10278 OUT PSYSCTL_IRP_DISPOSITION IrpDisposition);
10279
10280 NTKERNELAPI
10281 NTSTATUS
10282 DDKCDECLAPI
10283 WmiTraceMessage(
10284 IN TRACEHANDLE LoggerHandle,
10285 IN ULONG MessageFlags,
10286 IN LPGUID MessageGuid,
10287 IN USHORT MessageNumber,
10288 IN ...);
10289
10290 #if 0
10291 /* FIXME: Get va_list from where? */
10292 NTKERNELAPI
10293 NTSTATUS
10294 DDKCDECLAPI
10295 WmiTraceMessageVa(
10296 IN TRACEHANDLE LoggerHandle,
10297 IN ULONG MessageFlags,
10298 IN LPGUID MessageGuid,
10299 IN USHORT MessageNumber,
10300 IN va_list MessageArgList);
10301 #endif
10302
10303
10304 /** Kernel debugger routines **/
10305
10306 NTKERNELAPI
10307 NTSTATUS
10308 NTAPI
10309 KdDisableDebugger(
10310 VOID);
10311
10312 NTKERNELAPI
10313 NTSTATUS
10314 NTAPI
10315 KdEnableDebugger(
10316 VOID);
10317
10318 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
10319 NTKERNELAPI
10320 NTSTATUS
10321 NTAPI
10322 KdChangeOption(
10323 IN KD_OPTION Option,
10324 IN ULONG InBufferBytes OPTIONAL,
10325 IN PVOID InBuffer,
10326 IN ULONG OutBufferBytes OPTIONAL,
10327 OUT PVOID OutBuffer,
10328 OUT PULONG OutBufferNeeded OPTIONAL);
10329 #endif
10330
10331 VOID
10332 NTAPI
10333 DbgBreakPoint(
10334 VOID);
10335
10336 NTSYSAPI
10337 VOID
10338 NTAPI
10339 DbgBreakPointWithStatus(
10340 IN ULONG Status);
10341
10342 ULONG
10343 DDKCDECLAPI
10344 DbgPrint(
10345 IN PCCH Format,
10346 IN ...);
10347
10348 NTSYSAPI
10349 ULONG
10350 DDKCDECLAPI
10351 DbgPrintEx(
10352 IN ULONG ComponentId,
10353 IN ULONG Level,
10354 IN PCCH Format,
10355 IN ...);
10356
10357 ULONG
10358 NTAPI
10359 vDbgPrintEx(
10360 IN ULONG ComponentId,
10361 IN ULONG Level,
10362 IN PCCH Format,
10363 IN va_list ap);
10364
10365 ULONG
10366 NTAPI
10367 vDbgPrintExWithPrefix(
10368 IN PCCH Prefix,
10369 IN ULONG ComponentId,
10370 IN ULONG Level,
10371 IN PCCH Format,
10372 IN va_list ap);
10373
10374 NTKERNELAPI
10375 ULONG
10376 DDKCDECLAPI
10377 DbgPrintReturnControlC(
10378 IN PCCH Format,
10379 IN ...);
10380
10381 ULONG
10382 NTAPI
10383 DbgPrompt(
10384 IN PCCH Prompt,
10385 OUT PCH Response,
10386 IN ULONG MaximumResponseLength
10387 );
10388
10389 NTKERNELAPI
10390 NTSTATUS
10391 NTAPI
10392 DbgQueryDebugFilterState(
10393 IN ULONG ComponentId,
10394 IN ULONG Level);
10395
10396 NTKERNELAPI
10397 NTSTATUS
10398 NTAPI
10399 DbgSetDebugFilterState(
10400 IN ULONG ComponentId,
10401 IN ULONG Level,
10402 IN BOOLEAN State);
10403
10404 #if DBG
10405
10406 #define KdPrint(_x_) DbgPrint _x_
10407 #define KdPrintEx(_x_) DbgPrintEx _x_
10408 #define KdBreakPoint() DbgBreakPoint()
10409 #define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
10410
10411 #else /* !DBG */
10412
10413 #define KdPrint(_x_)
10414 #define KdPrintEx(_x_)
10415 #define KdBreakPoint()
10416 #define KdBreakPointWithStatus(s)
10417
10418 #endif /* !DBG */
10419
10420 #if defined(_NTDDK_) || defined(_NTHAL_) || defined(_WDMDDK_) || defined(_NTOSP_)
10421
10422 extern NTKERNELAPI PBOOLEAN KdDebuggerNotPresent;
10423 extern NTKERNELAPI PBOOLEAN KdDebuggerEnabled;
10424 #define KD_DEBUGGER_ENABLED *KdDebuggerEnabled
10425 #define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
10426
10427 #else
10428
10429 extern BOOLEAN KdDebuggerNotPresent;
10430 extern BOOLEAN KdDebuggerEnabled;
10431 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
10432 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
10433
10434 #endif
10435
10436 /** Stuff from winnt4.h */
10437
10438 #ifndef DMA_MACROS_DEFINED
10439
10440 #if (NTDDI_VERSION >= NTDDI_WIN2K)
10441
10442 //DECLSPEC_DEPRECATED_DDK
10443 NTHALAPI
10444 BOOLEAN
10445 NTAPI
10446 IoFlushAdapterBuffers(
10447 IN PADAPTER_OBJECT AdapterObject,
10448 IN PMDL Mdl,
10449 IN PVOID MapRegisterBase,
10450 IN PVOID CurrentVa,
10451 IN ULONG Length,
10452 IN BOOLEAN WriteToDevice);
10453
10454 //DECLSPEC_DEPRECATED_DDK
10455 NTHALAPI
10456 VOID
10457 NTAPI
10458 IoFreeAdapterChannel(
10459 IN PADAPTER_OBJECT AdapterObject);
10460
10461 //DECLSPEC_DEPRECATED_DDK
10462 NTHALAPI
10463 VOID
10464 NTAPI
10465 IoFreeMapRegisters(
10466 IN PADAPTER_OBJECT AdapterObject,
10467 IN PVOID MapRegisterBase,
10468 IN ULONG NumberOfMapRegisters);
10469
10470 //DECLSPEC_DEPRECATED_DDK
10471 NTHALAPI
10472 PHYSICAL_ADDRESS
10473 NTAPI
10474 IoMapTransfer(
10475 IN PADAPTER_OBJECT AdapterObject,
10476 IN PMDL Mdl,
10477 IN PVOID MapRegisterBase,
10478 IN PVOID CurrentVa,
10479 IN OUT PULONG Length,
10480 IN BOOLEAN WriteToDevice);
10481
10482
10483 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
10484 #endif // !defined(DMA_MACROS_DEFINED)
10485
10486 NTKERNELAPI
10487 NTSTATUS
10488 NTAPI
10489 IoAssignResources(
10490 IN PUNICODE_STRING RegistryPath,
10491 IN PUNICODE_STRING DriverClassName OPTIONAL,
10492 IN PDRIVER_OBJECT DriverObject,
10493 IN PDEVICE_OBJECT DeviceObject OPTIONAL,
10494 IN PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources,
10495 IN OUT PCM_RESOURCE_LIST *AllocatedResources);
10496
10497 NTKERNELAPI
10498 NTSTATUS
10499 NTAPI
10500 IoAttachDeviceByPointer(
10501 IN PDEVICE_OBJECT SourceDevice,
10502 IN PDEVICE_OBJECT TargetDevice);
10503
10504 NTKERNELAPI
10505 BOOLEAN
10506 NTAPI
10507 MmIsNonPagedSystemAddressValid(
10508 IN PVOID VirtualAddress);
10509
10510 #if defined(_AMD64_) || defined(_IA64_)
10511 //DECLSPEC_DEPRECATED_DDK_WINXP
10512 static __inline
10513 LARGE_INTEGER
10514 NTAPI_INLINE
10515 RtlLargeIntegerDivide(
10516 IN LARGE_INTEGER Dividend,
10517 IN LARGE_INTEGER Divisor,
10518 IN OUT PLARGE_INTEGER Remainder)
10519 {
10520 LARGE_INTEGER ret;
10521 ret.QuadPart = Dividend.QuadPart / Divisor.QuadPart;
10522 if (Remainder)
10523 Remainder->QuadPart = Dividend.QuadPart % Divisor.QuadPart;
10524 return ret;
10525 }
10526 #else
10527 NTSYSAPI
10528 LARGE_INTEGER
10529 NTAPI
10530 RtlLargeIntegerDivide(
10531 IN LARGE_INTEGER Dividend,
10532 IN LARGE_INTEGER Divisor,
10533 IN OUT PLARGE_INTEGER Remainder);
10534 #endif
10535
10536 NTKERNELAPI
10537 INTERLOCKED_RESULT
10538 NTAPI
10539 ExInterlockedDecrementLong(
10540 IN PLONG Addend,
10541 IN PKSPIN_LOCK Lock);
10542
10543 NTKERNELAPI
10544 ULONG
10545 NTAPI
10546 ExInterlockedExchangeUlong(
10547 IN PULONG Target,
10548 IN ULONG Value,
10549 IN PKSPIN_LOCK Lock);
10550
10551 NTKERNELAPI
10552 INTERLOCKED_RESULT
10553 NTAPI
10554 ExInterlockedIncrementLong(
10555 IN PLONG Addend,
10556 IN PKSPIN_LOCK Lock);
10557
10558 NTHALAPI
10559 VOID
10560 NTAPI
10561 HalAcquireDisplayOwnership(
10562 IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters);
10563
10564 NTHALAPI
10565 NTSTATUS
10566 NTAPI
10567 HalAllocateAdapterChannel(
10568 IN PADAPTER_OBJECT AdapterObject,
10569 IN PWAIT_CONTEXT_BLOCK Wcb,
10570 IN ULONG NumberOfMapRegisters,
10571 IN PDRIVER_CONTROL ExecutionRoutine);
10572
10573 NTHALAPI
10574 PVOID
10575 NTAPI
10576 HalAllocateCommonBuffer(
10577 IN PADAPTER_OBJECT AdapterObject,
10578 IN ULONG Length,
10579 OUT PPHYSICAL_ADDRESS LogicalAddress,
10580 IN BOOLEAN CacheEnabled);
10581
10582 NTHALAPI
10583 NTSTATUS
10584 NTAPI
10585 HalAssignSlotResources(
10586 IN PUNICODE_STRING RegistryPath,
10587 IN PUNICODE_STRING DriverClassName,
10588 IN PDRIVER_OBJECT DriverObject,
10589 IN PDEVICE_OBJECT DeviceObject,
10590 IN INTERFACE_TYPE BusType,
10591 IN ULONG BusNumber,
10592 IN ULONG SlotNumber,
10593 IN OUT PCM_RESOURCE_LIST *AllocatedResources);
10594
10595 NTHALAPI
10596 VOID
10597 NTAPI
10598 HalFreeCommonBuffer(
10599 IN PADAPTER_OBJECT AdapterObject,
10600 IN ULONG Length,
10601 IN PHYSICAL_ADDRESS LogicalAddress,
10602 IN PVOID VirtualAddress,
10603 IN BOOLEAN CacheEnabled);
10604
10605 NTHALAPI
10606 PADAPTER_OBJECT
10607 NTAPI
10608 HalGetAdapter(
10609 IN PDEVICE_DESCRIPTION DeviceDescription,
10610 IN OUT PULONG NumberOfMapRegisters);
10611
10612 NTHALAPI
10613 ULONG
10614 NTAPI
10615 HalGetBusData(
10616 IN BUS_DATA_TYPE BusDataType,
10617 IN ULONG BusNumber,
10618 IN ULONG SlotNumber,
10619 IN PVOID Buffer,
10620 IN ULONG Length);
10621
10622 NTHALAPI
10623 ULONG
10624 NTAPI
10625 HalGetBusDataByOffset(
10626 IN BUS_DATA_TYPE BusDataType,
10627 IN ULONG BusNumber,
10628 IN ULONG SlotNumber,
10629 IN PVOID Buffer,
10630 IN ULONG Offset,
10631 IN ULONG Length);
10632
10633 NTHALAPI
10634 ULONG
10635 NTAPI
10636 HalGetDmaAlignmentRequirement(
10637 VOID);
10638
10639 NTHALAPI
10640 ULONG
10641 NTAPI
10642 HalGetInterruptVector(
10643 IN INTERFACE_TYPE InterfaceType,
10644 IN ULONG BusNumber,
10645 IN ULONG BusInterruptLevel,
10646 IN ULONG BusInterruptVector,
10647 OUT PKIRQL Irql,
10648 OUT PKAFFINITY Affinity);
10649
10650 NTHALAPI
10651 ULONG
10652 NTAPI
10653 HalReadDmaCounter(
10654 IN PADAPTER_OBJECT AdapterObject);
10655
10656 NTHALAPI
10657 ULONG
10658 NTAPI
10659 HalSetBusData(
10660 IN BUS_DATA_TYPE BusDataType,
10661 IN ULONG BusNumber,
10662 IN ULONG SlotNumber,
10663 IN PVOID Buffer,
10664 IN ULONG Length);
10665
10666 NTHALAPI
10667 ULONG
10668 NTAPI
10669 HalSetBusDataByOffset(
10670 IN BUS_DATA_TYPE BusDataType,
10671 IN ULONG BusNumber,
10672 IN ULONG SlotNumber,
10673 IN PVOID Buffer,
10674 IN ULONG Offset,
10675 IN ULONG Length);
10676
10677 NTHALAPI
10678 BOOLEAN
10679 NTAPI
10680 HalTranslateBusAddress(
10681 IN INTERFACE_TYPE InterfaceType,
10682 IN ULONG BusNumber,
10683 IN PHYSICAL_ADDRESS BusAddress,
10684 IN OUT PULONG AddressSpace,
10685 OUT PPHYSICAL_ADDRESS TranslatedAddress);
10686
10687 NTSYSAPI
10688 BOOLEAN
10689 NTAPI
10690 RtlLargeIntegerEqualToZero(
10691 IN LARGE_INTEGER Operand);
10692
10693 NTSYSAPI
10694 BOOLEAN
10695 NTAPI
10696 RtlLargeIntegerGreaterOrEqualToZero(
10697 IN LARGE_INTEGER Operand);
10698
10699 NTSYSAPI
10700 BOOLEAN
10701 NTAPI
10702 RtlLargeIntegerGreaterThan(
10703 IN LARGE_INTEGER Operand1,
10704 IN LARGE_INTEGER Operand2);
10705
10706 NTSYSAPI
10707 BOOLEAN
10708 NTAPI
10709 RtlLargeIntegerGreaterThanOrEqualTo(
10710 IN LARGE_INTEGER Operand1,
10711 IN LARGE_INTEGER Operand2);
10712
10713 NTSYSAPI
10714 BOOLEAN
10715 NTAPI
10716 RtlLargeIntegerGreaterThanZero(
10717 IN LARGE_INTEGER Operand);
10718
10719 NTSYSAPI
10720 BOOLEAN
10721 NTAPI
10722 RtlLargeIntegerLessOrEqualToZero(
10723 IN LARGE_INTEGER Operand);
10724
10725 NTSYSAPI
10726 BOOLEAN
10727 NTAPI
10728 RtlLargeIntegerLessThan(
10729 IN LARGE_INTEGER Operand1,
10730 IN LARGE_INTEGER Operand2);
10731
10732 NTSYSAPI
10733 BOOLEAN
10734 NTAPI
10735 RtlLargeIntegerLessThanOrEqualTo(
10736 IN LARGE_INTEGER Operand1,
10737 IN LARGE_INTEGER Operand2);
10738
10739 NTSYSAPI
10740 BOOLEAN
10741 NTAPI
10742 RtlLargeIntegerLessThanZero(
10743 IN LARGE_INTEGER Operand);
10744
10745 NTSYSAPI
10746 LARGE_INTEGER
10747 NTAPI
10748 RtlLargeIntegerNegate(
10749 IN LARGE_INTEGER Subtrahend);
10750
10751 NTSYSAPI
10752 BOOLEAN
10753 NTAPI
10754 RtlLargeIntegerNotEqualTo(
10755 IN LARGE_INTEGER Operand1,
10756 IN LARGE_INTEGER Operand2);
10757
10758 NTSYSAPI
10759 BOOLEAN
10760 NTAPI
10761 RtlLargeIntegerNotEqualToZero(
10762 IN LARGE_INTEGER Operand);
10763
10764 NTSYSAPI
10765 LARGE_INTEGER
10766 NTAPI
10767 RtlLargeIntegerShiftLeft(
10768 IN LARGE_INTEGER LargeInteger,
10769 IN CCHAR ShiftCount);
10770
10771 NTSYSAPI
10772 LARGE_INTEGER
10773 NTAPI
10774 RtlLargeIntegerShiftRight(
10775 IN LARGE_INTEGER LargeInteger,
10776 IN CCHAR ShiftCount);
10777
10778 NTSYSAPI
10779 LARGE_INTEGER
10780 NTAPI
10781 RtlLargeIntegerSubtract(
10782 IN LARGE_INTEGER Minuend,
10783 IN LARGE_INTEGER Subtrahend);
10784
10785
10786 /*
10787 * ULONG
10788 * COMPUTE_PAGES_SPANNED(
10789 * IN PVOID Va,
10790 * IN ULONG Size)
10791 */
10792 #define COMPUTE_PAGES_SPANNED(Va, \
10793 Size) \
10794 (ADDRESS_AND_SIZE_TO_SPAN_PAGES(Va, Size))
10795
10796
10797 /*
10798 ** Architecture specific structures
10799 */
10800
10801 #ifdef _X86_
10802
10803 NTKERNELAPI
10804 INTERLOCKED_RESULT
10805 FASTCALL
10806 Exfi386InterlockedIncrementLong(
10807 IN PLONG Addend);
10808
10809 NTKERNELAPI
10810 INTERLOCKED_RESULT
10811 FASTCALL
10812 Exfi386InterlockedDecrementLong(
10813 IN PLONG Addend);
10814
10815 NTKERNELAPI
10816 ULONG
10817 FASTCALL
10818 Exfi386InterlockedExchangeUlong(
10819 IN PULONG Target,
10820 IN ULONG Value);
10821
10822 #define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend)
10823 #define ExInterlockedDecrementLong(Addend,Lock) Exfi386InterlockedDecrementLong(Addend)
10824 #define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value)
10825
10826 #endif /* _X86_ */
10827
10828 #ifdef _M_ARM
10829 //
10830 // NT-ARM is not documented
10831 //
10832 #include <armddk.h>
10833 #endif
10834
10835 #ifdef __cplusplus
10836 }
10837 #endif
10838
10839 #endif /* __WINDDK_H */