Sync to trunk (r44371)
[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 _KPROFILE_SOURCE {
2437 ProfileTime,
2438 ProfileAlignmentFixup,
2439 ProfileTotalIssues,
2440 ProfilePipelineDry,
2441 ProfileLoadInstructions,
2442 ProfilePipelineFrozen,
2443 ProfileBranchInstructions,
2444 ProfileTotalNonissues,
2445 ProfileDcacheMisses,
2446 ProfileIcacheMisses,
2447 ProfileCacheMisses,
2448 ProfileBranchMispredictions,
2449 ProfileStoreInstructions,
2450 ProfileFpInstructions,
2451 ProfileIntegerInstructions,
2452 Profile2Issue,
2453 Profile3Issue,
2454 Profile4Issue,
2455 ProfileSpecialInstructions,
2456 ProfileTotalCycles,
2457 ProfileIcacheIssues,
2458 ProfileDcacheAccesses,
2459 ProfileMemoryBarrierCycles,
2460 ProfileLoadLinkedIssues,
2461 ProfileMaximum
2462 } KPROFILE_SOURCE;
2463
2464 typedef enum _HAL_QUERY_INFORMATION_CLASS {
2465 HalInstalledBusInformation,
2466 HalProfileSourceInformation,
2467 HalInformationClassUnused1,
2468 HalPowerInformation,
2469 HalProcessorSpeedInformation,
2470 HalCallbackInformation,
2471 HalMapRegisterInformation,
2472 HalMcaLogInformation,
2473 HalFrameBufferCachingInformation,
2474 HalDisplayBiosInformation,
2475 HalProcessorFeatureInformation,
2476 HalNumaTopologyInterface,
2477 HalErrorInformation,
2478 HalCmcLogInformation,
2479 HalCpeLogInformation,
2480 HalQueryMcaInterface,
2481 HalQueryAMLIIllegalIOPortAddresses,
2482 HalQueryMaxHotPlugMemoryAddress,
2483 HalPartitionIpiInterface,
2484 HalPlatformInformation,
2485 HalQueryProfileSourceList
2486 } HAL_QUERY_INFORMATION_CLASS, *PHAL_QUERY_INFORMATION_CLASS;
2487
2488 typedef enum _HAL_SET_INFORMATION_CLASS {
2489 HalProfileSourceInterval,
2490 HalProfileSourceInterruptHandler,
2491 HalMcaRegisterDriver,
2492 HalKernelErrorHandler,
2493 HalCmcRegisterDriver,
2494 HalCpeRegisterDriver,
2495 HalMcaLog,
2496 HalCmcLog,
2497 HalCpeLog,
2498 HalGenerateCmcInterrupt
2499 } HAL_SET_INFORMATION_CLASS, *PHAL_SET_INFORMATION_CLASS;
2500
2501 typedef struct _HAL_PROFILE_SOURCE_INTERVAL
2502 {
2503 KPROFILE_SOURCE Source;
2504 ULONG_PTR Interval;
2505 } HAL_PROFILE_SOURCE_INTERVAL, *PHAL_PROFILE_SOURCE_INTERVAL;
2506
2507 typedef struct _HAL_PROFILE_SOURCE_INFORMATION
2508 {
2509 KPROFILE_SOURCE Source;
2510 BOOLEAN Supported;
2511 ULONG Interval;
2512 } HAL_PROFILE_SOURCE_INFORMATION, *PHAL_PROFILE_SOURCE_INFORMATION;
2513
2514 typedef struct _MAP_REGISTER_ENTRY
2515 {
2516 PVOID MapRegister;
2517 BOOLEAN WriteToDevice;
2518 } MAP_REGISTER_ENTRY, *PMAP_REGISTER_ENTRY;
2519
2520 typedef struct
2521 {
2522 UCHAR Type;
2523 BOOLEAN Valid;
2524 UCHAR Reserved[2];
2525 PUCHAR TranslatedAddress;
2526 ULONG Length;
2527 } DEBUG_DEVICE_ADDRESS, *PDEBUG_DEVICE_ADDRESS;
2528
2529 typedef struct
2530 {
2531 PHYSICAL_ADDRESS Start;
2532 PHYSICAL_ADDRESS MaxEnd;
2533 PVOID VirtualAddress;
2534 ULONG Length;
2535 BOOLEAN Cached;
2536 BOOLEAN Aligned;
2537 } DEBUG_MEMORY_REQUIREMENTS, *PDEBUG_MEMORY_REQUIREMENTS;
2538
2539 typedef struct
2540 {
2541 ULONG Bus;
2542 ULONG Slot;
2543 USHORT VendorID;
2544 USHORT DeviceID;
2545 UCHAR BaseClass;
2546 UCHAR SubClass;
2547 UCHAR ProgIf;
2548 BOOLEAN Initialized;
2549 DEBUG_DEVICE_ADDRESS BaseAddress[6];
2550 DEBUG_MEMORY_REQUIREMENTS Memory;
2551 } DEBUG_DEVICE_DESCRIPTOR, *PDEBUG_DEVICE_DESCRIPTOR;
2552
2553 typedef enum _KD_OPTION {
2554 KD_OPTION_SET_BLOCK_ENABLE,
2555 } KD_OPTION;
2556
2557 /* Function Type Defintions for Dispatch Functions */
2558 struct _DEVICE_CONTROL_CONTEXT;
2559
2560 typedef VOID
2561 (DDKAPI *PDEVICE_CONTROL_COMPLETION)(
2562 IN struct _DEVICE_CONTROL_CONTEXT *ControlContext);
2563
2564 typedef struct _DEVICE_CONTROL_CONTEXT {
2565 NTSTATUS Status;
2566 PDEVICE_HANDLER_OBJECT DeviceHandler;
2567 PDEVICE_OBJECT DeviceObject;
2568 ULONG ControlCode;
2569 PVOID Buffer;
2570 PULONG BufferLength;
2571 PVOID Context;
2572 } DEVICE_CONTROL_CONTEXT, *PDEVICE_CONTROL_CONTEXT;
2573
2574 typedef struct _PM_DISPATCH_TABLE {
2575 ULONG Signature;
2576 ULONG Version;
2577 PVOID Function[1];
2578 } PM_DISPATCH_TABLE, *PPM_DISPATCH_TABLE;
2579
2580 typedef enum _RESOURCE_TRANSLATION_DIRECTION {
2581 TranslateChildToParent,
2582 TranslateParentToChild
2583 } RESOURCE_TRANSLATION_DIRECTION;
2584
2585 typedef NTSTATUS
2586 (DDKAPI *PTRANSLATE_RESOURCE_HANDLER)(
2587 IN PVOID Context,
2588 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Source,
2589 IN RESOURCE_TRANSLATION_DIRECTION Direction,
2590 IN ULONG AlternativesCount,
2591 IN IO_RESOURCE_DESCRIPTOR Alternatives[],
2592 IN PDEVICE_OBJECT PhysicalDeviceObject,
2593 OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR Target);
2594
2595 typedef NTSTATUS
2596 (DDKAPI *PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER)(
2597 IN PVOID Context,
2598 IN PIO_RESOURCE_DESCRIPTOR Source,
2599 IN PDEVICE_OBJECT PhysicalDeviceObject,
2600 OUT PULONG TargetCount,
2601 OUT PIO_RESOURCE_DESCRIPTOR *Target);
2602
2603 typedef struct _TRANSLATOR_INTERFACE {
2604 USHORT Size;
2605 USHORT Version;
2606 PVOID Context;
2607 PINTERFACE_REFERENCE InterfaceReference;
2608 PINTERFACE_DEREFERENCE InterfaceDereference;
2609 PTRANSLATE_RESOURCE_HANDLER TranslateResources;
2610 PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER TranslateResourceRequirements;
2611 } TRANSLATOR_INTERFACE, *PTRANSLATOR_INTERFACE;
2612
2613 typedef NTSTATUS
2614 (DDKAPI *pHalDeviceControl)(
2615 IN PDEVICE_HANDLER_OBJECT DeviceHandler,
2616 IN PDEVICE_OBJECT DeviceObject,
2617 IN ULONG ControlCode,
2618 IN OUT PVOID Buffer OPTIONAL,
2619 IN OUT PULONG BufferLength OPTIONAL,
2620 IN PVOID Context,
2621 IN PDEVICE_CONTROL_COMPLETION CompletionRoutine);
2622
2623 typedef VOID
2624 (FASTCALL *pHalExamineMBR)(
2625 IN PDEVICE_OBJECT DeviceObject,
2626 IN ULONG SectorSize,
2627 IN ULONG MBRTypeIdentifier,
2628 OUT PVOID *Buffer);
2629
2630 typedef VOID
2631 (FASTCALL *pHalIoAssignDriveLetters)(
2632 IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
2633 IN PSTRING NtDeviceName,
2634 OUT PUCHAR NtSystemPath,
2635 OUT PSTRING NtSystemPathString);
2636
2637 typedef NTSTATUS
2638 (FASTCALL *pHalIoReadPartitionTable)(
2639 IN PDEVICE_OBJECT DeviceObject,
2640 IN ULONG SectorSize,
2641 IN BOOLEAN ReturnRecognizedPartitions,
2642 OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer);
2643
2644 typedef NTSTATUS
2645 (FASTCALL *pHalIoSetPartitionInformation)(
2646 IN PDEVICE_OBJECT DeviceObject,
2647 IN ULONG SectorSize,
2648 IN ULONG PartitionNumber,
2649 IN ULONG PartitionType);
2650
2651 typedef NTSTATUS
2652 (FASTCALL *pHalIoWritePartitionTable)(
2653 IN PDEVICE_OBJECT DeviceObject,
2654 IN ULONG SectorSize,
2655 IN ULONG SectorsPerTrack,
2656 IN ULONG NumberOfHeads,
2657 IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer);
2658
2659 typedef PBUS_HANDLER
2660 (FASTCALL *pHalHandlerForBus)(
2661 IN INTERFACE_TYPE InterfaceType,
2662 IN ULONG BusNumber);
2663
2664 typedef VOID
2665 (FASTCALL *pHalReferenceBusHandler)(
2666 IN PBUS_HANDLER BusHandler);
2667
2668 typedef NTSTATUS
2669 (DDKAPI *pHalQuerySystemInformation)(
2670 IN HAL_QUERY_INFORMATION_CLASS InformationClass,
2671 IN ULONG BufferSize,
2672 IN OUT PVOID Buffer,
2673 OUT PULONG ReturnedLength);
2674
2675 typedef NTSTATUS
2676 (DDKAPI *pHalSetSystemInformation)(
2677 IN HAL_SET_INFORMATION_CLASS InformationClass,
2678 IN ULONG BufferSize,
2679 IN PVOID Buffer);
2680
2681 typedef NTSTATUS
2682 (DDKAPI *pHalQueryBusSlots)(
2683 IN PBUS_HANDLER BusHandler,
2684 IN ULONG BufferSize,
2685 OUT PULONG SlotNumbers,
2686 OUT PULONG ReturnedLength);
2687
2688 typedef NTSTATUS
2689 (DDKAPI *pHalInitPnpDriver)(
2690 VOID);
2691
2692 typedef NTSTATUS
2693 (DDKAPI *pHalInitPowerManagement)(
2694 IN PPM_DISPATCH_TABLE PmDriverDispatchTable,
2695 OUT PPM_DISPATCH_TABLE *PmHalDispatchTable);
2696
2697 typedef struct _DMA_ADAPTER*
2698 (DDKAPI *pHalGetDmaAdapter)(
2699 IN PVOID Context,
2700 IN struct _DEVICE_DESCRIPTION *DeviceDescriptor,
2701 OUT PULONG NumberOfMapRegisters);
2702
2703 typedef NTSTATUS
2704 (DDKAPI *pHalGetInterruptTranslator)(
2705 IN INTERFACE_TYPE ParentInterfaceType,
2706 IN ULONG ParentBusNumber,
2707 IN INTERFACE_TYPE BridgeInterfaceType,
2708 IN USHORT Size,
2709 IN USHORT Version,
2710 OUT PTRANSLATOR_INTERFACE Translator,
2711 OUT PULONG BridgeBusNumber);
2712
2713 typedef NTSTATUS
2714 (DDKAPI *pHalStartMirroring)(
2715 VOID);
2716
2717 typedef NTSTATUS
2718 (DDKAPI *pHalEndMirroring)(
2719 IN ULONG PassNumber);
2720
2721 typedef NTSTATUS
2722 (DDKAPI *pHalMirrorPhysicalMemory)(
2723 IN PHYSICAL_ADDRESS PhysicalAddress,
2724 IN LARGE_INTEGER NumberOfBytes);
2725
2726 typedef NTSTATUS
2727 (DDKAPI *pHalMirrorVerify)(
2728 IN PHYSICAL_ADDRESS PhysicalAddress,
2729 IN LARGE_INTEGER NumberOfBytes);
2730
2731 typedef VOID
2732 (DDKAPI *pHalEndOfBoot)(
2733 VOID);
2734
2735 typedef
2736 BOOLEAN
2737 (DDKAPI *pHalTranslateBusAddress)(
2738 IN INTERFACE_TYPE InterfaceType,
2739 IN ULONG BusNumber,
2740 IN PHYSICAL_ADDRESS BusAddress,
2741 IN OUT PULONG AddressSpace,
2742 OUT PPHYSICAL_ADDRESS TranslatedAddress
2743 );
2744
2745 typedef
2746 NTSTATUS
2747 (DDKAPI *pHalAssignSlotResources)(
2748 IN PUNICODE_STRING RegistryPath,
2749 IN PUNICODE_STRING DriverClassName OPTIONAL,
2750 IN PDRIVER_OBJECT DriverObject,
2751 IN PDEVICE_OBJECT DeviceObject,
2752 IN INTERFACE_TYPE BusType,
2753 IN ULONG BusNumber,
2754 IN ULONG SlotNumber,
2755 IN OUT PCM_RESOURCE_LIST *AllocatedResources
2756 );
2757
2758 typedef
2759 VOID
2760 (DDKAPI *pHalHaltSystem)(
2761 VOID
2762 );
2763
2764 typedef
2765 BOOLEAN
2766 (DDKAPI *pHalResetDisplay)(
2767 VOID
2768 );
2769
2770 typedef
2771 UCHAR
2772 (DDKAPI *pHalVectorToIDTEntry)(
2773 ULONG Vector
2774 );
2775
2776 typedef
2777 BOOLEAN
2778 (DDKAPI *pHalFindBusAddressTranslation)(
2779 IN PHYSICAL_ADDRESS BusAddress,
2780 IN OUT PULONG AddressSpace,
2781 OUT PPHYSICAL_ADDRESS TranslatedAddress,
2782 IN OUT PULONG_PTR Context,
2783 IN BOOLEAN NextBus
2784 );
2785
2786 typedef
2787 NTSTATUS
2788 (DDKAPI *pKdSetupPciDeviceForDebugging)(
2789 IN PVOID LoaderBlock OPTIONAL,
2790 IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice
2791 );
2792
2793 typedef
2794 NTSTATUS
2795 (DDKAPI *pKdReleasePciDeviceForDebugging)(
2796 IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice
2797 );
2798
2799 typedef
2800 PVOID
2801 (DDKAPI *pKdGetAcpiTablePhase0)(
2802 IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
2803 IN ULONG Signature
2804 );
2805
2806 typedef
2807 VOID
2808 (DDKAPI *pKdCheckPowerButton)(
2809 VOID
2810 );
2811
2812 typedef
2813 ULONG
2814 (DDKAPI *pHalGetInterruptVector)(
2815 IN INTERFACE_TYPE InterfaceType,
2816 IN ULONG BusNumber,
2817 IN ULONG BusInterruptLevel,
2818 IN ULONG BusInterruptVector,
2819 OUT PKIRQL Irql,
2820 OUT PKAFFINITY Affinity
2821 );
2822
2823 typedef
2824 NTSTATUS
2825 (DDKAPI *pHalGetVectorInput)(
2826 IN ULONG Vector,
2827 IN KAFFINITY Affinity,
2828 OUT PULONG Input,
2829 OUT PKINTERRUPT_POLARITY Polarity
2830 );
2831
2832 typedef
2833 PVOID
2834 (DDKAPI *pKdMapPhysicalMemory64)(
2835 IN PHYSICAL_ADDRESS PhysicalAddress,
2836 IN ULONG NumberPages
2837 );
2838
2839 typedef
2840 VOID
2841 (DDKAPI *pKdUnmapVirtualAddress)(
2842 IN PVOID VirtualAddress,
2843 IN ULONG NumberPages
2844 );
2845
2846 typedef
2847 ULONG
2848 (DDKAPI *pKdGetPciDataByOffset)(
2849 IN ULONG BusNumber,
2850 IN ULONG SlotNumber,
2851 OUT PVOID Buffer,
2852 IN ULONG Offset,
2853 IN ULONG Length
2854 );
2855
2856 typedef
2857 ULONG
2858 (DDKAPI *pKdSetPciDataByOffset)(
2859 IN ULONG BusNumber,
2860 IN ULONG SlotNumber,
2861 IN PVOID Buffer,
2862 IN ULONG Offset,
2863 IN ULONG Length
2864 );
2865
2866 typedef BOOLEAN
2867 (DDKAPI *PHAL_RESET_DISPLAY_PARAMETERS)(
2868 ULONG Columns, ULONG Rows);
2869
2870 typedef struct {
2871 ULONG Version;
2872 pHalQuerySystemInformation HalQuerySystemInformation;
2873 pHalSetSystemInformation HalSetSystemInformation;
2874 pHalQueryBusSlots HalQueryBusSlots;
2875 ULONG Spare1;
2876 pHalExamineMBR HalExamineMBR;
2877 pHalIoAssignDriveLetters HalIoAssignDriveLetters;
2878 pHalIoReadPartitionTable HalIoReadPartitionTable;
2879 pHalIoSetPartitionInformation HalIoSetPartitionInformation;
2880 pHalIoWritePartitionTable HalIoWritePartitionTable;
2881 pHalHandlerForBus HalReferenceHandlerForBus;
2882 pHalReferenceBusHandler HalReferenceBusHandler;
2883 pHalReferenceBusHandler HalDereferenceBusHandler;
2884 pHalInitPnpDriver HalInitPnpDriver;
2885 pHalInitPowerManagement HalInitPowerManagement;
2886 pHalGetDmaAdapter HalGetDmaAdapter;
2887 pHalGetInterruptTranslator HalGetInterruptTranslator;
2888 pHalStartMirroring HalStartMirroring;
2889 pHalEndMirroring HalEndMirroring;
2890 pHalMirrorPhysicalMemory HalMirrorPhysicalMemory;
2891 pHalEndOfBoot HalEndOfBoot;
2892 pHalMirrorVerify HalMirrorVerify;
2893 } HAL_DISPATCH, *PHAL_DISPATCH;
2894
2895 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTHAL_)
2896 extern NTSYSAPI PHAL_DISPATCH HalDispatchTable;
2897 #define HALDISPATCH ((PHAL_DISPATCH)&HalDispatchTable)
2898 #else
2899 extern __declspec(dllexport) HAL_DISPATCH HalDispatchTable;
2900 #define HALDISPATCH (&HalDispatchTable)
2901 #endif
2902
2903 #define HAL_DISPATCH_VERSION 3
2904 #define HalDispatchTableVersion HALDISPATCH->Version
2905 #define HalQuerySystemInformation HALDISPATCH->HalQuerySystemInformation
2906 #define HalSetSystemInformation HALDISPATCH->HalSetSystemInformation
2907 #define HalQueryBusSlots HALDISPATCH->HalQueryBusSlots
2908 #define HalReferenceHandlerForBus HALDISPATCH->HalReferenceHandlerForBus
2909 #define HalReferenceBusHandler HALDISPATCH->HalReferenceBusHandler
2910 #define HalDereferenceBusHandler HALDISPATCH->HalDereferenceBusHandler
2911 #define HalInitPnpDriver HALDISPATCH->HalInitPnpDriver
2912 #define HalInitPowerManagement HALDISPATCH->HalInitPowerManagement
2913 #define HalGetDmaAdapter HALDISPATCH->HalGetDmaAdapter
2914 #define HalGetInterruptTranslator HALDISPATCH->HalGetInterruptTranslator
2915 #define HalStartMirroring HALDISPATCH->HalStartMirroring
2916 #define HalEndMirroring HALDISPATCH->HalEndMirroring
2917 #define HalMirrorPhysicalMemory HALDISPATCH->HalMirrorPhysicalMemory
2918 #define HalEndOfBoot HALDISPATCH->HalEndOfBoot
2919 #define HalMirrorVerify HALDISPATCH->HalMirrorVerify
2920
2921 typedef enum _FILE_INFORMATION_CLASS {
2922 FileDirectoryInformation = 1,
2923 FileFullDirectoryInformation,
2924 FileBothDirectoryInformation,
2925 FileBasicInformation,
2926 FileStandardInformation,
2927 FileInternalInformation,
2928 FileEaInformation,
2929 FileAccessInformation,
2930 FileNameInformation,
2931 FileRenameInformation,
2932 FileLinkInformation,
2933 FileNamesInformation,
2934 FileDispositionInformation,
2935 FilePositionInformation,
2936 FileFullEaInformation,
2937 FileModeInformation,
2938 FileAlignmentInformation,
2939 FileAllInformation,
2940 FileAllocationInformation,
2941 FileEndOfFileInformation,
2942 FileAlternateNameInformation,
2943 FileStreamInformation,
2944 FilePipeInformation,
2945 FilePipeLocalInformation,
2946 FilePipeRemoteInformation,
2947 FileMailslotQueryInformation,
2948 FileMailslotSetInformation,
2949 FileCompressionInformation,
2950 FileObjectIdInformation,
2951 FileCompletionInformation,
2952 FileMoveClusterInformation,
2953 FileQuotaInformation,
2954 FileReparsePointInformation,
2955 FileNetworkOpenInformation,
2956 FileAttributeTagInformation,
2957 FileTrackingInformation,
2958 FileIdBothDirectoryInformation,
2959 FileIdFullDirectoryInformation,
2960 FileValidDataLengthInformation,
2961 FileShortNameInformation,
2962 FileMaximumInformation
2963 } FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
2964
2965 typedef struct _FILE_POSITION_INFORMATION {
2966 LARGE_INTEGER CurrentByteOffset;
2967 } FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;
2968
2969 typedef struct _FILE_ALIGNMENT_INFORMATION {
2970 ULONG AlignmentRequirement;
2971 } FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION;
2972
2973 typedef struct _FILE_NAME_INFORMATION {
2974 ULONG FileNameLength;
2975 WCHAR FileName[1];
2976 } FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;
2977
2978 #include <pshpack8.h>
2979 typedef struct _FILE_BASIC_INFORMATION {
2980 LARGE_INTEGER CreationTime;
2981 LARGE_INTEGER LastAccessTime;
2982 LARGE_INTEGER LastWriteTime;
2983 LARGE_INTEGER ChangeTime;
2984 ULONG FileAttributes;
2985 } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
2986 #include <poppack.h>
2987
2988 typedef struct _FILE_STANDARD_INFORMATION {
2989 LARGE_INTEGER AllocationSize;
2990 LARGE_INTEGER EndOfFile;
2991 ULONG NumberOfLinks;
2992 BOOLEAN DeletePending;
2993 BOOLEAN Directory;
2994 } FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
2995
2996 typedef struct _FILE_NETWORK_OPEN_INFORMATION {
2997 LARGE_INTEGER CreationTime;
2998 LARGE_INTEGER LastAccessTime;
2999 LARGE_INTEGER LastWriteTime;
3000 LARGE_INTEGER ChangeTime;
3001 LARGE_INTEGER AllocationSize;
3002 LARGE_INTEGER EndOfFile;
3003 ULONG FileAttributes;
3004 } FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;
3005
3006 typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION {
3007 ULONG FileAttributes;
3008 ULONG ReparseTag;
3009 } FILE_ATTRIBUTE_TAG_INFORMATION, *PFILE_ATTRIBUTE_TAG_INFORMATION;
3010
3011 typedef struct _FILE_DISPOSITION_INFORMATION {
3012 BOOLEAN DeleteFile;
3013 } FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION;
3014
3015 typedef struct _FILE_END_OF_FILE_INFORMATION {
3016 LARGE_INTEGER EndOfFile;
3017 } FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION;
3018
3019 typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION {
3020 LARGE_INTEGER ValidDataLength;
3021 } FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION;
3022
3023 typedef union _FILE_SEGMENT_ELEMENT {
3024 PVOID64 Buffer;
3025 ULONGLONG Alignment;
3026 }FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT;
3027
3028 typedef enum _FSINFOCLASS {
3029 FileFsVolumeInformation = 1,
3030 FileFsLabelInformation,
3031 FileFsSizeInformation,
3032 FileFsDeviceInformation,
3033 FileFsAttributeInformation,
3034 FileFsControlInformation,
3035 FileFsFullSizeInformation,
3036 FileFsObjectIdInformation,
3037 FileFsDriverPathInformation,
3038 FileFsMaximumInformation
3039 } FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
3040
3041 typedef struct _FILE_FS_DEVICE_INFORMATION {
3042 DEVICE_TYPE DeviceType;
3043 ULONG Characteristics;
3044 } FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;
3045
3046 typedef struct _FILE_FULL_EA_INFORMATION {
3047 ULONG NextEntryOffset;
3048 UCHAR Flags;
3049 UCHAR EaNameLength;
3050 USHORT EaValueLength;
3051 CHAR EaName[1];
3052 } FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
3053
3054 /* ERESOURCE.Flag */
3055
3056 #define ResourceNeverExclusive 0x0010
3057 #define ResourceReleaseByOtherThread 0x0020
3058 #define ResourceOwnedExclusive 0x0080
3059
3060 #define RESOURCE_HASH_TABLE_SIZE 64
3061
3062 typedef struct _DEVOBJ_EXTENSION
3063 {
3064 CSHORT Type;
3065 USHORT Size;
3066 PDEVICE_OBJECT DeviceObject;
3067 } DEVOBJ_EXTENSION, *PDEVOBJ_EXTENSION;
3068
3069 typedef BOOLEAN
3070 (DDKAPI *PFAST_IO_CHECK_IF_POSSIBLE)(
3071 IN struct _FILE_OBJECT *FileObject,
3072 IN PLARGE_INTEGER FileOffset,
3073 IN ULONG Length,
3074 IN BOOLEAN Wait,
3075 IN ULONG LockKey,
3076 IN BOOLEAN CheckForReadOperation,
3077 OUT PIO_STATUS_BLOCK IoStatus,
3078 IN struct _DEVICE_OBJECT *DeviceObject);
3079
3080 typedef BOOLEAN
3081 (DDKAPI *PFAST_IO_READ)(
3082 IN struct _FILE_OBJECT *FileObject,
3083 IN PLARGE_INTEGER FileOffset,
3084 IN ULONG Length,
3085 IN BOOLEAN Wait,
3086 IN ULONG LockKey,
3087 OUT PVOID Buffer,
3088 OUT PIO_STATUS_BLOCK IoStatus,
3089 IN struct _DEVICE_OBJECT *DeviceObject);
3090
3091 typedef BOOLEAN
3092 (DDKAPI *PFAST_IO_WRITE)(
3093 IN struct _FILE_OBJECT *FileObject,
3094 IN PLARGE_INTEGER FileOffset,
3095 IN ULONG Length,
3096 IN BOOLEAN Wait,
3097 IN ULONG LockKey,
3098 IN PVOID Buffer,
3099 OUT PIO_STATUS_BLOCK IoStatus,
3100 IN struct _DEVICE_OBJECT *DeviceObject);
3101
3102 typedef BOOLEAN
3103 (DDKAPI *PFAST_IO_QUERY_BASIC_INFO)(
3104 IN struct _FILE_OBJECT *FileObject,
3105 IN BOOLEAN Wait,
3106 OUT PFILE_BASIC_INFORMATION Buffer,
3107 OUT PIO_STATUS_BLOCK IoStatus,
3108 IN struct _DEVICE_OBJECT *DeviceObject);
3109
3110 typedef BOOLEAN
3111 (DDKAPI *PFAST_IO_QUERY_STANDARD_INFO)(
3112 IN struct _FILE_OBJECT *FileObject,
3113 IN BOOLEAN Wait,
3114 OUT PFILE_STANDARD_INFORMATION Buffer,
3115 OUT PIO_STATUS_BLOCK IoStatus,
3116 IN struct _DEVICE_OBJECT *DeviceObject);
3117
3118 typedef BOOLEAN
3119 (DDKAPI *PFAST_IO_LOCK)(
3120 IN struct _FILE_OBJECT *FileObject,
3121 IN PLARGE_INTEGER FileOffset,
3122 IN PLARGE_INTEGER Length,
3123 PEPROCESS ProcessId,
3124 ULONG Key,
3125 BOOLEAN FailImmediately,
3126 BOOLEAN ExclusiveLock,
3127 OUT PIO_STATUS_BLOCK IoStatus,
3128 IN struct _DEVICE_OBJECT *DeviceObject);
3129
3130 typedef BOOLEAN
3131 (DDKAPI *PFAST_IO_UNLOCK_SINGLE)(
3132 IN struct _FILE_OBJECT *FileObject,
3133 IN PLARGE_INTEGER FileOffset,
3134 IN PLARGE_INTEGER Length,
3135 PEPROCESS ProcessId,
3136 ULONG Key,
3137 OUT PIO_STATUS_BLOCK IoStatus,
3138 IN struct _DEVICE_OBJECT *DeviceObject);
3139
3140 typedef BOOLEAN
3141 (DDKAPI *PFAST_IO_UNLOCK_ALL)(
3142 IN struct _FILE_OBJECT *FileObject,
3143 PEPROCESS ProcessId,
3144 OUT PIO_STATUS_BLOCK IoStatus,
3145 IN struct _DEVICE_OBJECT *DeviceObject);
3146
3147 typedef BOOLEAN
3148 (DDKAPI *PFAST_IO_UNLOCK_ALL_BY_KEY)(
3149 IN struct _FILE_OBJECT *FileObject,
3150 PVOID ProcessId,
3151 ULONG Key,
3152 OUT PIO_STATUS_BLOCK IoStatus,
3153 IN struct _DEVICE_OBJECT *DeviceObject);
3154
3155 typedef BOOLEAN
3156 (DDKAPI *PFAST_IO_DEVICE_CONTROL)(
3157 IN struct _FILE_OBJECT *FileObject,
3158 IN BOOLEAN Wait,
3159 IN PVOID InputBuffer OPTIONAL,
3160 IN ULONG InputBufferLength,
3161 OUT PVOID OutputBuffer OPTIONAL,
3162 IN ULONG OutputBufferLength,
3163 IN ULONG IoControlCode,
3164 OUT PIO_STATUS_BLOCK IoStatus,
3165 IN struct _DEVICE_OBJECT *DeviceObject);
3166
3167 typedef VOID
3168 (DDKAPI *PFAST_IO_ACQUIRE_FILE)(
3169 IN struct _FILE_OBJECT *FileObject);
3170
3171 typedef VOID
3172 (DDKAPI *PFAST_IO_RELEASE_FILE)(
3173 IN struct _FILE_OBJECT *FileObject);
3174
3175 typedef VOID
3176 (DDKAPI *PFAST_IO_DETACH_DEVICE)(
3177 IN struct _DEVICE_OBJECT *SourceDevice,
3178 IN struct _DEVICE_OBJECT *TargetDevice);
3179
3180 typedef BOOLEAN
3181 (DDKAPI *PFAST_IO_QUERY_NETWORK_OPEN_INFO)(
3182 IN struct _FILE_OBJECT *FileObject,
3183 IN BOOLEAN Wait,
3184 OUT struct _FILE_NETWORK_OPEN_INFORMATION *Buffer,
3185 OUT struct _IO_STATUS_BLOCK *IoStatus,
3186 IN struct _DEVICE_OBJECT *DeviceObject);
3187
3188 typedef NTSTATUS
3189 (DDKAPI *PFAST_IO_ACQUIRE_FOR_MOD_WRITE)(
3190 IN struct _FILE_OBJECT *FileObject,
3191 IN PLARGE_INTEGER EndingOffset,
3192 OUT struct _ERESOURCE **ResourceToRelease,
3193 IN struct _DEVICE_OBJECT *DeviceObject);
3194
3195 typedef BOOLEAN
3196 (DDKAPI *PFAST_IO_MDL_READ)(
3197 IN struct _FILE_OBJECT *FileObject,
3198 IN PLARGE_INTEGER FileOffset,
3199 IN ULONG Length,
3200 IN ULONG LockKey,
3201 OUT PMDL *MdlChain,
3202 OUT PIO_STATUS_BLOCK IoStatus,
3203 IN struct _DEVICE_OBJECT *DeviceObject);
3204
3205 typedef BOOLEAN
3206 (DDKAPI *PFAST_IO_MDL_READ_COMPLETE)(
3207 IN struct _FILE_OBJECT *FileObject,
3208 IN PMDL MdlChain,
3209 IN struct _DEVICE_OBJECT *DeviceObject);
3210
3211 typedef BOOLEAN
3212 (DDKAPI *PFAST_IO_PREPARE_MDL_WRITE)(
3213 IN struct _FILE_OBJECT *FileObject,
3214 IN PLARGE_INTEGER FileOffset,
3215 IN ULONG Length,
3216 IN ULONG LockKey,
3217 OUT PMDL *MdlChain,
3218 OUT PIO_STATUS_BLOCK IoStatus,
3219 IN struct _DEVICE_OBJECT *DeviceObject);
3220
3221 typedef BOOLEAN
3222 (DDKAPI *PFAST_IO_MDL_WRITE_COMPLETE)(
3223 IN struct _FILE_OBJECT *FileObject,
3224 IN PLARGE_INTEGER FileOffset,
3225 IN PMDL MdlChain,
3226 IN struct _DEVICE_OBJECT *DeviceObject);
3227
3228 typedef BOOLEAN
3229 (DDKAPI *PFAST_IO_READ_COMPRESSED)(
3230 IN struct _FILE_OBJECT *FileObject,
3231 IN PLARGE_INTEGER FileOffset,
3232 IN ULONG Length,
3233 IN ULONG LockKey,
3234 OUT PVOID Buffer,
3235 OUT PMDL *MdlChain,
3236 OUT PIO_STATUS_BLOCK IoStatus,
3237 OUT struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
3238 IN ULONG CompressedDataInfoLength,
3239 IN struct _DEVICE_OBJECT *DeviceObject);
3240
3241 typedef BOOLEAN
3242 (DDKAPI *PFAST_IO_WRITE_COMPRESSED)(
3243 IN struct _FILE_OBJECT *FileObject,
3244 IN PLARGE_INTEGER FileOffset,
3245 IN ULONG Length,
3246 IN ULONG LockKey,
3247 IN PVOID Buffer,
3248 OUT PMDL *MdlChain,
3249 OUT PIO_STATUS_BLOCK IoStatus,
3250 IN struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
3251 IN ULONG CompressedDataInfoLength,
3252 IN struct _DEVICE_OBJECT *DeviceObject);
3253
3254 typedef BOOLEAN
3255 (DDKAPI *PFAST_IO_MDL_READ_COMPLETE_COMPRESSED)(
3256 IN struct _FILE_OBJECT *FileObject,
3257 IN PMDL MdlChain,
3258 IN struct _DEVICE_OBJECT *DeviceObject);
3259
3260 typedef BOOLEAN
3261 (DDKAPI *PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED)(
3262 IN struct _FILE_OBJECT *FileObject,
3263 IN PLARGE_INTEGER FileOffset,
3264 IN PMDL MdlChain,
3265 IN struct _DEVICE_OBJECT *DeviceObject);
3266
3267 typedef BOOLEAN
3268 (DDKAPI *PFAST_IO_QUERY_OPEN)(
3269 IN struct _IRP *Irp,
3270 OUT PFILE_NETWORK_OPEN_INFORMATION NetworkInformation,
3271 IN struct _DEVICE_OBJECT *DeviceObject);
3272
3273 typedef NTSTATUS
3274 (DDKAPI *PFAST_IO_RELEASE_FOR_MOD_WRITE)(
3275 IN struct _FILE_OBJECT *FileObject,
3276 IN struct _ERESOURCE *ResourceToRelease,
3277 IN struct _DEVICE_OBJECT *DeviceObject);
3278
3279 typedef NTSTATUS
3280 (DDKAPI *PFAST_IO_ACQUIRE_FOR_CCFLUSH)(
3281 IN struct _FILE_OBJECT *FileObject,
3282 IN struct _DEVICE_OBJECT *DeviceObject);
3283
3284 typedef NTSTATUS
3285 (DDKAPI *PFAST_IO_RELEASE_FOR_CCFLUSH) (
3286 IN struct _FILE_OBJECT *FileObject,
3287 IN struct _DEVICE_OBJECT *DeviceObject);
3288
3289 typedef struct _FAST_IO_DISPATCH {
3290 ULONG SizeOfFastIoDispatch;
3291 PFAST_IO_CHECK_IF_POSSIBLE FastIoCheckIfPossible;
3292 PFAST_IO_READ FastIoRead;
3293 PFAST_IO_WRITE FastIoWrite;
3294 PFAST_IO_QUERY_BASIC_INFO FastIoQueryBasicInfo;
3295 PFAST_IO_QUERY_STANDARD_INFO FastIoQueryStandardInfo;
3296 PFAST_IO_LOCK FastIoLock;
3297 PFAST_IO_UNLOCK_SINGLE FastIoUnlockSingle;
3298 PFAST_IO_UNLOCK_ALL FastIoUnlockAll;
3299 PFAST_IO_UNLOCK_ALL_BY_KEY FastIoUnlockAllByKey;
3300 PFAST_IO_DEVICE_CONTROL FastIoDeviceControl;
3301 PFAST_IO_ACQUIRE_FILE AcquireFileForNtCreateSection;
3302 PFAST_IO_RELEASE_FILE ReleaseFileForNtCreateSection;
3303 PFAST_IO_DETACH_DEVICE FastIoDetachDevice;
3304 PFAST_IO_QUERY_NETWORK_OPEN_INFO FastIoQueryNetworkOpenInfo;
3305 PFAST_IO_ACQUIRE_FOR_MOD_WRITE AcquireForModWrite;
3306 PFAST_IO_MDL_READ MdlRead;
3307 PFAST_IO_MDL_READ_COMPLETE MdlReadComplete;
3308 PFAST_IO_PREPARE_MDL_WRITE PrepareMdlWrite;
3309 PFAST_IO_MDL_WRITE_COMPLETE MdlWriteComplete;
3310 PFAST_IO_READ_COMPRESSED FastIoReadCompressed;
3311 PFAST_IO_WRITE_COMPRESSED FastIoWriteCompressed;
3312 PFAST_IO_MDL_READ_COMPLETE_COMPRESSED MdlReadCompleteCompressed;
3313 PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED MdlWriteCompleteCompressed;
3314 PFAST_IO_QUERY_OPEN FastIoQueryOpen;
3315 PFAST_IO_RELEASE_FOR_MOD_WRITE ReleaseForModWrite;
3316 PFAST_IO_ACQUIRE_FOR_CCFLUSH AcquireForCcFlush;
3317 PFAST_IO_RELEASE_FOR_CCFLUSH ReleaseForCcFlush;
3318 } FAST_IO_DISPATCH, *PFAST_IO_DISPATCH;
3319
3320 typedef struct _SECTION_OBJECT_POINTERS {
3321 PVOID DataSectionObject;
3322 PVOID SharedCacheMap;
3323 PVOID ImageSectionObject;
3324 } SECTION_OBJECT_POINTERS, *PSECTION_OBJECT_POINTERS;
3325
3326 typedef struct _IO_COMPLETION_CONTEXT {
3327 PVOID Port;
3328 PVOID Key;
3329 } IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT;
3330
3331 /* FILE_OBJECT.Flags */
3332
3333 #define FO_FILE_OPEN 0x00000001
3334 #define FO_SYNCHRONOUS_IO 0x00000002
3335 #define FO_ALERTABLE_IO 0x00000004
3336 #define FO_NO_INTERMEDIATE_BUFFERING 0x00000008
3337 #define FO_WRITE_THROUGH 0x00000010
3338 #define FO_SEQUENTIAL_ONLY 0x00000020
3339 #define FO_CACHE_SUPPORTED 0x00000040
3340 #define FO_NAMED_PIPE 0x00000080
3341 #define FO_STREAM_FILE 0x00000100
3342 #define FO_MAILSLOT 0x00000200
3343 #define FO_GENERATE_AUDIT_ON_CLOSE 0x00000400
3344 #define FO_DIRECT_DEVICE_OPEN 0x00000800
3345 #define FO_FILE_MODIFIED 0x00001000
3346 #define FO_FILE_SIZE_CHANGED 0x00002000
3347 #define FO_CLEANUP_COMPLETE 0x00004000
3348 #define FO_TEMPORARY_FILE 0x00008000
3349 #define FO_DELETE_ON_CLOSE 0x00010000
3350 #define FO_OPENED_CASE_SENSITIVE 0x00020000
3351 #define FO_HANDLE_CREATED 0x00040000
3352 #define FO_FILE_FAST_IO_READ 0x00080000
3353 #define FO_RANDOM_ACCESS 0x00100000
3354 #define FO_FILE_OPEN_CANCELLED 0x00200000
3355 #define FO_VOLUME_OPEN 0x00400000
3356 #define FO_REMOTE_ORIGIN 0x01000000
3357
3358 typedef struct _FILE_OBJECT
3359 {
3360 CSHORT Type;
3361 CSHORT Size;
3362 PDEVICE_OBJECT DeviceObject;
3363 PVPB Vpb;
3364 PVOID FsContext;
3365 PVOID FsContext2;
3366 PSECTION_OBJECT_POINTERS SectionObjectPointer;
3367 PVOID PrivateCacheMap;
3368 NTSTATUS FinalStatus;
3369 struct _FILE_OBJECT *RelatedFileObject;
3370 BOOLEAN LockOperation;
3371 BOOLEAN DeletePending;
3372 BOOLEAN ReadAccess;
3373 BOOLEAN WriteAccess;
3374 BOOLEAN DeleteAccess;
3375 BOOLEAN SharedRead;
3376 BOOLEAN SharedWrite;
3377 BOOLEAN SharedDelete;
3378 ULONG Flags;
3379 UNICODE_STRING FileName;
3380 LARGE_INTEGER CurrentByteOffset;
3381 volatile ULONG Waiters;
3382 volatile ULONG Busy;
3383 PVOID LastLock;
3384 KEVENT Lock;
3385 KEVENT Event;
3386 volatile PIO_COMPLETION_CONTEXT CompletionContext;
3387 KSPIN_LOCK IrpListLock;
3388 LIST_ENTRY IrpList;
3389 volatile PVOID FileObjectExtension;
3390 } FILE_OBJECT;
3391 typedef struct _FILE_OBJECT *PFILE_OBJECT;
3392
3393 typedef enum _SECURITY_OPERATION_CODE {
3394 SetSecurityDescriptor,
3395 QuerySecurityDescriptor,
3396 DeleteSecurityDescriptor,
3397 AssignSecurityDescriptor
3398 } SECURITY_OPERATION_CODE, *PSECURITY_OPERATION_CODE;
3399
3400 #define INITIAL_PRIVILEGE_COUNT 3
3401
3402 typedef struct _INITIAL_PRIVILEGE_SET {
3403 ULONG PrivilegeCount;
3404 ULONG Control;
3405 LUID_AND_ATTRIBUTES Privilege[INITIAL_PRIVILEGE_COUNT];
3406 } INITIAL_PRIVILEGE_SET, * PINITIAL_PRIVILEGE_SET;
3407
3408 #define SE_MIN_WELL_KNOWN_PRIVILEGE 2
3409 #define SE_CREATE_TOKEN_PRIVILEGE 2
3410 #define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE 3
3411 #define SE_LOCK_MEMORY_PRIVILEGE 4
3412 #define SE_INCREASE_QUOTA_PRIVILEGE 5
3413 #define SE_UNSOLICITED_INPUT_PRIVILEGE 6
3414 #define SE_MACHINE_ACCOUNT_PRIVILEGE 6
3415 #define SE_TCB_PRIVILEGE 7
3416 #define SE_SECURITY_PRIVILEGE 8
3417 #define SE_TAKE_OWNERSHIP_PRIVILEGE 9
3418 #define SE_LOAD_DRIVER_PRIVILEGE 10
3419 #define SE_SYSTEM_PROFILE_PRIVILEGE 11
3420 #define SE_SYSTEMTIME_PRIVILEGE 12
3421 #define SE_PROF_SINGLE_PROCESS_PRIVILEGE 13
3422 #define SE_INC_BASE_PRIORITY_PRIVILEGE 14
3423 #define SE_CREATE_PAGEFILE_PRIVILEGE 15
3424 #define SE_CREATE_PERMANENT_PRIVILEGE 16
3425 #define SE_BACKUP_PRIVILEGE 17
3426 #define SE_RESTORE_PRIVILEGE 18
3427 #define SE_SHUTDOWN_PRIVILEGE 19
3428 #define SE_DEBUG_PRIVILEGE 20
3429 #define SE_AUDIT_PRIVILEGE 21
3430 #define SE_SYSTEM_ENVIRONMENT_PRIVILEGE 22
3431 #define SE_CHANGE_NOTIFY_PRIVILEGE 23
3432 #define SE_REMOTE_SHUTDOWN_PRIVILEGE 24
3433 #define SE_UNDOCK_PRIVILEGE 25
3434 #define SE_SYNC_AGENT_PRIVILEGE 26
3435 #define SE_ENABLE_DELEGATION_PRIVILEGE 27
3436 #define SE_MANAGE_VOLUME_PRIVILEGE 28
3437 #define SE_IMPERSONATE_PRIVILEGE 29
3438 #define SE_CREATE_GLOBAL_PRIVILEGE 30
3439 #define SE_MAX_WELL_KNOWN_PRIVILEGE SE_CREATE_GLOBAL_PRIVILEGE
3440
3441 typedef struct _SECURITY_SUBJECT_CONTEXT {
3442 PACCESS_TOKEN ClientToken;
3443 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
3444 PACCESS_TOKEN PrimaryToken;
3445 PVOID ProcessAuditId;
3446 } SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT;
3447
3448 #include <pshpack4.h>
3449 typedef struct _ACCESS_STATE {
3450 LUID OperationID;
3451 BOOLEAN SecurityEvaluated;
3452 BOOLEAN GenerateAudit;
3453 BOOLEAN GenerateOnClose;
3454 BOOLEAN PrivilegesAllocated;
3455 ULONG Flags;
3456 ACCESS_MASK RemainingDesiredAccess;
3457 ACCESS_MASK PreviouslyGrantedAccess;
3458 ACCESS_MASK OriginalDesiredAccess;
3459 SECURITY_SUBJECT_CONTEXT SubjectSecurityContext;
3460 PSECURITY_DESCRIPTOR SecurityDescriptor;
3461 PVOID AuxData;
3462 union {
3463 INITIAL_PRIVILEGE_SET InitialPrivilegeSet;
3464 PRIVILEGE_SET PrivilegeSet;
3465 } Privileges;
3466
3467 BOOLEAN AuditPrivileges;
3468 UNICODE_STRING ObjectName;
3469 UNICODE_STRING ObjectTypeName;
3470 } ACCESS_STATE, *PACCESS_STATE;
3471 #include <poppack.h>
3472
3473 typedef struct _IO_SECURITY_CONTEXT {
3474 PSECURITY_QUALITY_OF_SERVICE SecurityQos;
3475 PACCESS_STATE AccessState;
3476 ACCESS_MASK DesiredAccess;
3477 ULONG FullCreateOptions;
3478 } IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT;
3479
3480 #define IO_TYPE_ADAPTER 1
3481 #define IO_TYPE_CONTROLLER 2
3482 #define IO_TYPE_DEVICE 3
3483 #define IO_TYPE_DRIVER 4
3484 #define IO_TYPE_FILE 5
3485 #define IO_TYPE_IRP 6
3486 #define IO_TYPE_MASTER_ADAPTER 7
3487 #define IO_TYPE_OPEN_PACKET 8
3488 #define IO_TYPE_TIMER 9
3489 #define IO_TYPE_VPB 10
3490 #define IO_TYPE_ERROR_LOG 11
3491 #define IO_TYPE_ERROR_MESSAGE 12
3492 #define IO_TYPE_DEVICE_OBJECT_EXTENSION 13
3493
3494 #define IO_TYPE_CSQ_IRP_CONTEXT 1
3495 #define IO_TYPE_CSQ 2
3496
3497 struct _IO_CSQ;
3498
3499 typedef struct _IO_CSQ_IRP_CONTEXT {
3500 ULONG Type;
3501 struct _IRP *Irp;
3502 struct _IO_CSQ *Csq;
3503 } IO_CSQ_IRP_CONTEXT, *PIO_CSQ_IRP_CONTEXT;
3504
3505 typedef VOID
3506 (DDKAPI *PIO_CSQ_INSERT_IRP)(
3507 IN struct _IO_CSQ *Csq,
3508 IN PIRP Irp);
3509
3510 typedef VOID
3511 (DDKAPI *PIO_CSQ_REMOVE_IRP)(
3512 IN struct _IO_CSQ *Csq,
3513 IN PIRP Irp);
3514
3515 typedef PIRP
3516 (DDKAPI *PIO_CSQ_PEEK_NEXT_IRP)(
3517 IN struct _IO_CSQ *Csq,
3518 IN PIRP Irp,
3519 IN PVOID PeekContext);
3520
3521 typedef VOID
3522 (DDKAPI *PIO_CSQ_ACQUIRE_LOCK)(
3523 IN struct _IO_CSQ *Csq,
3524 OUT PKIRQL Irql);
3525
3526 typedef VOID
3527 (DDKAPI *PIO_CSQ_RELEASE_LOCK)(
3528 IN struct _IO_CSQ *Csq,
3529 IN KIRQL Irql);
3530
3531 typedef VOID
3532 (DDKAPI *PIO_CSQ_COMPLETE_CANCELED_IRP)(
3533 IN struct _IO_CSQ *Csq,
3534 IN PIRP Irp);
3535
3536 typedef struct _IO_CSQ {
3537 ULONG Type;
3538 PIO_CSQ_INSERT_IRP CsqInsertIrp;
3539 PIO_CSQ_REMOVE_IRP CsqRemoveIrp;
3540 PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp;
3541 PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock;
3542 PIO_CSQ_RELEASE_LOCK CsqReleaseLock;
3543 PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp;
3544 PVOID ReservePointer;
3545 } IO_CSQ, *PIO_CSQ;
3546
3547 #if !defined(_ALPHA_)
3548 #include <pshpack4.h>
3549 #endif
3550 typedef struct _IO_STACK_LOCATION {
3551 UCHAR MajorFunction;
3552 UCHAR MinorFunction;
3553 UCHAR Flags;
3554 UCHAR Control;
3555 union {
3556 struct {
3557 PIO_SECURITY_CONTEXT SecurityContext;
3558 ULONG Options;
3559 USHORT POINTER_ALIGNMENT FileAttributes;
3560 USHORT ShareAccess;
3561 ULONG POINTER_ALIGNMENT EaLength;
3562 } Create;
3563 struct {
3564 ULONG Length;
3565 ULONG POINTER_ALIGNMENT Key;
3566 LARGE_INTEGER ByteOffset;
3567 } Read;
3568 struct {
3569 ULONG Length;
3570 ULONG POINTER_ALIGNMENT Key;
3571 LARGE_INTEGER ByteOffset;
3572 } Write;
3573 struct {
3574 ULONG Length;
3575 PUNICODE_STRING FileName;
3576 FILE_INFORMATION_CLASS FileInformationClass;
3577 ULONG FileIndex;
3578 } QueryDirectory;
3579 struct {
3580 ULONG Length;
3581 ULONG CompletionFilter;
3582 } NotifyDirectory;
3583 struct {
3584 ULONG Length;
3585 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
3586 } QueryFile;
3587 struct {
3588 ULONG Length;
3589 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
3590 PFILE_OBJECT FileObject;
3591 _ANONYMOUS_UNION union {
3592 _ANONYMOUS_STRUCT struct {
3593 BOOLEAN ReplaceIfExists;
3594 BOOLEAN AdvanceOnly;
3595 } DUMMYSTRUCTNAME;
3596 ULONG ClusterCount;
3597 HANDLE DeleteHandle;
3598 } DUMMYUNIONNAME;
3599 } SetFile;
3600 struct {
3601 ULONG Length;
3602 PVOID EaList;
3603 ULONG EaListLength;
3604 ULONG EaIndex;
3605 } QueryEa;
3606 struct {
3607 ULONG Length;
3608 } SetEa;
3609 struct {
3610 ULONG Length;
3611 FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass;
3612 } QueryVolume;
3613 struct {
3614 ULONG Length;
3615 FS_INFORMATION_CLASS FsInformationClass;
3616 } SetVolume;
3617 struct {
3618 ULONG OutputBufferLength;
3619 ULONG InputBufferLength;
3620 ULONG FsControlCode;
3621 PVOID Type3InputBuffer;
3622 } FileSystemControl;
3623 struct {
3624 PLARGE_INTEGER Length;
3625 ULONG Key;
3626 LARGE_INTEGER ByteOffset;
3627 } LockControl;
3628 struct {
3629 ULONG OutputBufferLength;
3630 ULONG POINTER_ALIGNMENT InputBufferLength;
3631 ULONG POINTER_ALIGNMENT IoControlCode;
3632 PVOID Type3InputBuffer;
3633 } DeviceIoControl;
3634 struct {
3635 SECURITY_INFORMATION SecurityInformation;
3636 ULONG POINTER_ALIGNMENT Length;
3637 } QuerySecurity;
3638 struct {
3639 SECURITY_INFORMATION SecurityInformation;
3640 PSECURITY_DESCRIPTOR SecurityDescriptor;
3641 } SetSecurity;
3642 struct {
3643 PVPB Vpb;
3644 PDEVICE_OBJECT DeviceObject;
3645 } MountVolume;
3646 struct {
3647 PVPB Vpb;
3648 PDEVICE_OBJECT DeviceObject;
3649 } VerifyVolume;
3650 struct {
3651 struct _SCSI_REQUEST_BLOCK *Srb;
3652 } Scsi;
3653 struct {
3654 ULONG Length;
3655 PSID StartSid;
3656 struct _FILE_GET_QUOTA_INFORMATION *SidList;
3657 ULONG SidListLength;
3658 } QueryQuota;
3659 struct {
3660 ULONG Length;
3661 } SetQuota;
3662 struct {
3663 DEVICE_RELATION_TYPE Type;
3664 } QueryDeviceRelations;
3665 struct {
3666 CONST GUID *InterfaceType;
3667 USHORT Size;
3668 USHORT Version;
3669 PINTERFACE Interface;
3670 PVOID InterfaceSpecificData;
3671 } QueryInterface;
3672 struct {
3673 PDEVICE_CAPABILITIES Capabilities;
3674 } DeviceCapabilities;
3675 struct {
3676 PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList;
3677 } FilterResourceRequirements;
3678 struct {
3679 ULONG WhichSpace;
3680 PVOID Buffer;
3681 ULONG Offset;
3682 ULONG POINTER_ALIGNMENT Length;
3683 } ReadWriteConfig;
3684 struct {
3685 BOOLEAN Lock;
3686 } SetLock;
3687 struct {
3688 BUS_QUERY_ID_TYPE IdType;
3689 } QueryId;
3690 struct {
3691 DEVICE_TEXT_TYPE DeviceTextType;
3692 LCID POINTER_ALIGNMENT LocaleId;
3693 } QueryDeviceText;
3694 struct {
3695 BOOLEAN InPath;
3696 BOOLEAN Reserved[3];
3697 DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type;
3698 } UsageNotification;
3699 struct {
3700 SYSTEM_POWER_STATE PowerState;
3701 } WaitWake;
3702 struct {
3703 PPOWER_SEQUENCE PowerSequence;
3704 } PowerSequence;
3705 struct {
3706 ULONG SystemContext;
3707 POWER_STATE_TYPE POINTER_ALIGNMENT Type;
3708 POWER_STATE POINTER_ALIGNMENT State;
3709 POWER_ACTION POINTER_ALIGNMENT ShutdownType;
3710 } Power;
3711 struct {
3712 PCM_RESOURCE_LIST AllocatedResources;
3713 PCM_RESOURCE_LIST AllocatedResourcesTranslated;
3714 } StartDevice;
3715 struct {
3716 ULONG_PTR ProviderId;
3717 PVOID DataPath;
3718 ULONG BufferSize;
3719 PVOID Buffer;
3720 } WMI;
3721 struct {
3722 PVOID Argument1;
3723 PVOID Argument2;
3724 PVOID Argument3;
3725 PVOID Argument4;
3726 } Others;
3727 } Parameters;
3728 PDEVICE_OBJECT DeviceObject;
3729 PFILE_OBJECT FileObject;
3730 PIO_COMPLETION_ROUTINE CompletionRoutine;
3731 PVOID Context;
3732 } IO_STACK_LOCATION, *PIO_STACK_LOCATION;
3733 #if !defined(_ALPHA_)
3734 #include <poppack.h>
3735 #endif
3736
3737 /* IO_STACK_LOCATION.Control */
3738
3739 #define SL_PENDING_RETURNED 0x01
3740 #define SL_ERROR_RETURNED 0x02
3741 #define SL_INVOKE_ON_CANCEL 0x20
3742 #define SL_INVOKE_ON_SUCCESS 0x40
3743 #define SL_INVOKE_ON_ERROR 0x80
3744
3745 /* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */
3746
3747 #define PCI_WHICHSPACE_CONFIG 0x0
3748 #define PCI_WHICHSPACE_ROM 0x52696350 /* 'PciR' */
3749
3750 typedef enum _KEY_INFORMATION_CLASS {
3751 KeyBasicInformation,
3752 KeyNodeInformation,
3753 KeyFullInformation,
3754 KeyNameInformation,
3755 KeyCachedInformation,
3756 KeyFlagsInformation
3757 } KEY_INFORMATION_CLASS;
3758
3759 typedef struct _KEY_BASIC_INFORMATION {
3760 LARGE_INTEGER LastWriteTime;
3761 ULONG TitleIndex;
3762 ULONG NameLength;
3763 WCHAR Name[1];
3764 } KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION;
3765
3766 typedef struct _KEY_FULL_INFORMATION {
3767 LARGE_INTEGER LastWriteTime;
3768 ULONG TitleIndex;
3769 ULONG ClassOffset;
3770 ULONG ClassLength;
3771 ULONG SubKeys;
3772 ULONG MaxNameLen;
3773 ULONG MaxClassLen;
3774 ULONG Values;
3775 ULONG MaxValueNameLen;
3776 ULONG MaxValueDataLen;
3777 WCHAR Class[1];
3778 } KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION;
3779
3780 typedef struct _KEY_NODE_INFORMATION {
3781 LARGE_INTEGER LastWriteTime;
3782 ULONG TitleIndex;
3783 ULONG ClassOffset;
3784 ULONG ClassLength;
3785 ULONG NameLength;
3786 WCHAR Name[1];
3787 } KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION;
3788
3789 typedef struct _KEY_VALUE_BASIC_INFORMATION {
3790 ULONG TitleIndex;
3791 ULONG Type;
3792 ULONG NameLength;
3793 WCHAR Name[1];
3794 } KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION;
3795
3796 typedef struct _KEY_VALUE_FULL_INFORMATION {
3797 ULONG TitleIndex;
3798 ULONG Type;
3799 ULONG DataOffset;
3800 ULONG DataLength;
3801 ULONG NameLength;
3802 WCHAR Name[1];
3803 } KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION;
3804
3805 typedef struct _KEY_VALUE_PARTIAL_INFORMATION {
3806 ULONG TitleIndex;
3807 ULONG Type;
3808 ULONG DataLength;
3809 UCHAR Data[1];
3810 } KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION;
3811
3812 typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 {
3813 ULONG Type;
3814 ULONG DataLength;
3815 UCHAR Data[1];
3816 } KEY_VALUE_PARTIAL_INFORMATION_ALIGN64, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64;
3817
3818 typedef struct _KEY_VALUE_ENTRY {
3819 PUNICODE_STRING ValueName;
3820 ULONG DataLength;
3821 ULONG DataOffset;
3822 ULONG Type;
3823 } KEY_VALUE_ENTRY, *PKEY_VALUE_ENTRY;
3824
3825 typedef enum _KEY_VALUE_INFORMATION_CLASS {
3826 KeyValueBasicInformation,
3827 KeyValueFullInformation,
3828 KeyValuePartialInformation,
3829 KeyValueFullInformationAlign64,
3830 KeyValuePartialInformationAlign64
3831 } KEY_VALUE_INFORMATION_CLASS;
3832
3833 typedef struct _KEY_WRITE_TIME_INFORMATION {
3834 LARGE_INTEGER LastWriteTime;
3835 } KEY_WRITE_TIME_INFORMATION, *PKEY_WRITE_TIME_INFORMATION;
3836
3837 typedef struct _KEY_USER_FLAGS_INFORMATION {
3838 ULONG UserFlags;
3839 } KEY_USER_FLAGS_INFORMATION, *PKEY_USER_FLAGS_INFORMATION;
3840
3841 typedef enum _KEY_SET_INFORMATION_CLASS {
3842 KeyWriteTimeInformation,
3843 KeyUserFlagsInformation,
3844 MaxKeySetInfoClass
3845 } KEY_SET_INFORMATION_CLASS;
3846
3847 /* KEY_VALUE_Xxx.Type */
3848
3849 #define REG_NONE 0
3850 #define REG_SZ 1
3851 #define REG_EXPAND_SZ 2
3852 #define REG_BINARY 3
3853 #define REG_DWORD 4
3854 #define REG_DWORD_LITTLE_ENDIAN 4
3855 #define REG_DWORD_BIG_ENDIAN 5
3856 #define REG_LINK 6
3857 #define REG_MULTI_SZ 7
3858 #define REG_RESOURCE_LIST 8
3859 #define REG_FULL_RESOURCE_DESCRIPTOR 9
3860 #define REG_RESOURCE_REQUIREMENTS_LIST 10
3861 #define REG_QWORD 11
3862 #define REG_QWORD_LITTLE_ENDIAN 11
3863
3864 #define PCI_TYPE0_ADDRESSES 6
3865 #define PCI_TYPE1_ADDRESSES 2
3866 #define PCI_TYPE2_ADDRESSES 5
3867
3868 typedef struct _PCI_COMMON_CONFIG {
3869 USHORT VendorID;
3870 USHORT DeviceID;
3871 USHORT Command;
3872 USHORT Status;
3873 UCHAR RevisionID;
3874 UCHAR ProgIf;
3875 UCHAR SubClass;
3876 UCHAR BaseClass;
3877 UCHAR CacheLineSize;
3878 UCHAR LatencyTimer;
3879 UCHAR HeaderType;
3880 UCHAR BIST;
3881 union {
3882 struct _PCI_HEADER_TYPE_0 {
3883 ULONG BaseAddresses[PCI_TYPE0_ADDRESSES];
3884 ULONG CIS;
3885 USHORT SubVendorID;
3886 USHORT SubSystemID;
3887 ULONG ROMBaseAddress;
3888 UCHAR CapabilitiesPtr;
3889 UCHAR Reserved1[3];
3890 ULONG Reserved2;
3891 UCHAR InterruptLine;
3892 UCHAR InterruptPin;
3893 UCHAR MinimumGrant;
3894 UCHAR MaximumLatency;
3895 } type0;
3896 struct _PCI_HEADER_TYPE_1 {
3897 ULONG BaseAddresses[PCI_TYPE1_ADDRESSES];
3898 UCHAR PrimaryBus;
3899 UCHAR SecondaryBus;
3900 UCHAR SubordinateBus;
3901 UCHAR SecondaryLatency;
3902 UCHAR IOBase;
3903 UCHAR IOLimit;
3904 USHORT SecondaryStatus;
3905 USHORT MemoryBase;
3906 USHORT MemoryLimit;
3907 USHORT PrefetchBase;
3908 USHORT PrefetchLimit;
3909 ULONG PrefetchBaseUpper32;
3910 ULONG PrefetchLimitUpper32;
3911 USHORT IOBaseUpper16;
3912 USHORT IOLimitUpper16;
3913 UCHAR CapabilitiesPtr;
3914 UCHAR Reserved1[3];
3915 ULONG ROMBaseAddress;
3916 UCHAR InterruptLine;
3917 UCHAR InterruptPin;
3918 USHORT BridgeControl;
3919 } type1;
3920 struct _PCI_HEADER_TYPE_2 {
3921 ULONG SocketRegistersBaseAddress;
3922 UCHAR CapabilitiesPtr;
3923 UCHAR Reserved;
3924 USHORT SecondaryStatus;
3925 UCHAR PrimaryBus;
3926 UCHAR SecondaryBus;
3927 UCHAR SubordinateBus;
3928 UCHAR SecondaryLatency;
3929 struct {
3930 ULONG Base;
3931 ULONG Limit;
3932 } Range[PCI_TYPE2_ADDRESSES - 1];
3933 UCHAR InterruptLine;
3934 UCHAR InterruptPin;
3935 USHORT BridgeControl;
3936 } type2;
3937 } u;
3938 UCHAR DeviceSpecific[192];
3939 } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
3940
3941 /* PCI_COMMON_CONFIG.Command */
3942
3943 #define PCI_ENABLE_IO_SPACE 0x0001
3944 #define PCI_ENABLE_MEMORY_SPACE 0x0002
3945 #define PCI_ENABLE_BUS_MASTER 0x0004
3946 #define PCI_ENABLE_SPECIAL_CYCLES 0x0008
3947 #define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010
3948 #define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
3949 #define PCI_ENABLE_PARITY 0x0040
3950 #define PCI_ENABLE_WAIT_CYCLE 0x0080
3951 #define PCI_ENABLE_SERR 0x0100
3952 #define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200
3953
3954 /* PCI_COMMON_CONFIG.Status */
3955
3956 #define PCI_STATUS_CAPABILITIES_LIST 0x0010
3957 #define PCI_STATUS_66MHZ_CAPABLE 0x0020
3958 #define PCI_STATUS_UDF_SUPPORTED 0x0040
3959 #define PCI_STATUS_FAST_BACK_TO_BACK 0x0080
3960 #define PCI_STATUS_DATA_PARITY_DETECTED 0x0100
3961 #define PCI_STATUS_DEVSEL 0x0600
3962 #define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800
3963 #define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000
3964 #define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000
3965 #define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000
3966 #define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000
3967
3968 /* PCI_COMMON_CONFIG.HeaderType */
3969
3970 #define PCI_MULTIFUNCTION 0x80
3971 #define PCI_DEVICE_TYPE 0x00
3972 #define PCI_BRIDGE_TYPE 0x01
3973 #define PCI_CARDBUS_BRIDGE_TYPE 0x02
3974
3975 #define PCI_CONFIGURATION_TYPE(PciData) \
3976 (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
3977
3978 #define PCI_MULTIFUNCTION_DEVICE(PciData) \
3979 ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
3980
3981 /* PCI device classes */
3982
3983 #define PCI_CLASS_PRE_20 0x00
3984 #define PCI_CLASS_MASS_STORAGE_CTLR 0x01
3985 #define PCI_CLASS_NETWORK_CTLR 0x02
3986 #define PCI_CLASS_DISPLAY_CTLR 0x03
3987 #define PCI_CLASS_MULTIMEDIA_DEV 0x04
3988 #define PCI_CLASS_MEMORY_CTLR 0x05
3989 #define PCI_CLASS_BRIDGE_DEV 0x06
3990 #define PCI_CLASS_SIMPLE_COMMS_CTLR 0x07
3991 #define PCI_CLASS_BASE_SYSTEM_DEV 0x08
3992 #define PCI_CLASS_INPUT_DEV 0x09
3993 #define PCI_CLASS_DOCKING_STATION 0x0a
3994 #define PCI_CLASS_PROCESSOR 0x0b
3995 #define PCI_CLASS_SERIAL_BUS_CTLR 0x0c
3996
3997 /* PCI device subclasses for class 0 */
3998
3999 #define PCI_SUBCLASS_PRE_20_NON_VGA 0x00
4000 #define PCI_SUBCLASS_PRE_20_VGA 0x01
4001
4002 /* PCI device subclasses for class 1 (mass storage controllers)*/
4003
4004 #define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR 0x00
4005 #define PCI_SUBCLASS_MSC_IDE_CTLR 0x01
4006 #define PCI_SUBCLASS_MSC_FLOPPY_CTLR 0x02
4007 #define PCI_SUBCLASS_MSC_IPI_CTLR 0x03
4008 #define PCI_SUBCLASS_MSC_RAID_CTLR 0x04
4009 #define PCI_SUBCLASS_MSC_OTHER 0x80
4010
4011 /* PCI device subclasses for class 2 (network controllers)*/
4012
4013 #define PCI_SUBCLASS_NET_ETHERNET_CTLR 0x00
4014 #define PCI_SUBCLASS_NET_TOKEN_RING_CTLR 0x01
4015 #define PCI_SUBCLASS_NET_FDDI_CTLR 0x02
4016 #define PCI_SUBCLASS_NET_ATM_CTLR 0x03
4017 #define PCI_SUBCLASS_NET_OTHER 0x80
4018
4019 /* PCI device subclasses for class 3 (display controllers)*/
4020
4021 #define PCI_SUBCLASS_VID_VGA_CTLR 0x00
4022 #define PCI_SUBCLASS_VID_XGA_CTLR 0x01
4023 #define PCI_SUBCLASS_VID_3D_CTLR 0x02
4024 #define PCI_SUBCLASS_VID_OTHER 0x80
4025
4026 /* PCI device subclasses for class 4 (multimedia device)*/
4027
4028 #define PCI_SUBCLASS_MM_VIDEO_DEV 0x00
4029 #define PCI_SUBCLASS_MM_AUDIO_DEV 0x01
4030 #define PCI_SUBCLASS_MM_TELEPHONY_DEV 0x02
4031 #define PCI_SUBCLASS_MM_OTHER 0x80
4032
4033 /* PCI device subclasses for class 5 (memory controller)*/
4034
4035 #define PCI_SUBCLASS_MEM_RAM 0x00
4036 #define PCI_SUBCLASS_MEM_FLASH 0x01
4037 #define PCI_SUBCLASS_MEM_OTHER 0x80
4038
4039 /* PCI device subclasses for class 6 (bridge device)*/
4040
4041 #define PCI_SUBCLASS_BR_HOST 0x00
4042 #define PCI_SUBCLASS_BR_ISA 0x01
4043 #define PCI_SUBCLASS_BR_EISA 0x02
4044 #define PCI_SUBCLASS_BR_MCA 0x03
4045 #define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04
4046 #define PCI_SUBCLASS_BR_PCMCIA 0x05
4047 #define PCI_SUBCLASS_BR_NUBUS 0x06
4048 #define PCI_SUBCLASS_BR_CARDBUS 0x07
4049 #define PCI_SUBCLASS_BR_OTHER 0x80
4050
4051 /* PCI device subclasses for class C (serial bus controller)*/
4052
4053 #define PCI_SUBCLASS_SB_IEEE1394 0x00
4054 #define PCI_SUBCLASS_SB_ACCESS 0x01
4055 #define PCI_SUBCLASS_SB_SSA 0x02
4056 #define PCI_SUBCLASS_SB_USB 0x03
4057 #define PCI_SUBCLASS_SB_FIBRE_CHANNEL 0x04
4058 #define PCI_SUBCLASS_SB_SMBUS 0x05
4059
4060 #define PCI_MAX_DEVICES 32
4061 #define PCI_MAX_FUNCTION 8
4062 #define PCI_MAX_BRIDGE_NUMBER 0xFF
4063 #define PCI_INVALID_VENDORID 0xFFFF
4064 #define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific))
4065
4066 #define PCI_ADDRESS_IO_SPACE 0x01
4067 #define PCI_ADDRESS_MEMORY_TYPE_MASK 0x06
4068 #define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x08
4069 #define PCI_ADDRESS_IO_ADDRESS_MASK 0xfffffffc
4070 #define PCI_ADDRESS_MEMORY_ADDRESS_MASK 0xfffffff0
4071 #define PCI_ADDRESS_ROM_ADDRESS_MASK 0xfffff800
4072
4073 #define PCI_TYPE_32BIT 0
4074 #define PCI_TYPE_20BIT 2
4075 #define PCI_TYPE_64BIT 4
4076
4077 typedef struct _PCI_SLOT_NUMBER {
4078 union {
4079 struct {
4080 ULONG DeviceNumber : 5;
4081 ULONG FunctionNumber : 3;
4082 ULONG Reserved : 24;
4083 } bits;
4084 ULONG AsULONG;
4085 } u;
4086 } PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER;
4087
4088 #define POOL_COLD_ALLOCATION 256
4089 #define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE 8
4090 #define POOL_RAISE_IF_ALLOCATION_FAILURE 16
4091
4092 typedef struct _OSVERSIONINFOA {
4093 ULONG dwOSVersionInfoSize;
4094 ULONG dwMajorVersion;
4095 ULONG dwMinorVersion;
4096 ULONG dwBuildNumber;
4097 ULONG dwPlatformId;
4098 CHAR szCSDVersion[128];
4099 } OSVERSIONINFOA, *POSVERSIONINFOA, *LPOSVERSIONINFOA;
4100
4101 typedef struct _OSVERSIONINFOW {
4102 ULONG dwOSVersionInfoSize;
4103 ULONG dwMajorVersion;
4104 ULONG dwMinorVersion;
4105 ULONG dwBuildNumber;
4106 ULONG dwPlatformId;
4107 WCHAR szCSDVersion[128];
4108 } OSVERSIONINFOW, *POSVERSIONINFOW, *LPOSVERSIONINFOW, RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW;
4109
4110 #ifdef UNICODE
4111 typedef OSVERSIONINFOW OSVERSIONINFO;
4112 typedef POSVERSIONINFOW POSVERSIONINFO;
4113 typedef LPOSVERSIONINFOW LPOSVERSIONINFO;
4114 #else
4115 typedef OSVERSIONINFOA OSVERSIONINFO;
4116 typedef POSVERSIONINFOA POSVERSIONINFO;
4117 typedef LPOSVERSIONINFOA LPOSVERSIONINFO;
4118 #endif // UNICODE
4119
4120 typedef struct _OSVERSIONINFOEXA {
4121 ULONG dwOSVersionInfoSize;
4122 ULONG dwMajorVersion;
4123 ULONG dwMinorVersion;
4124 ULONG dwBuildNumber;
4125 ULONG dwPlatformId;
4126 CHAR szCSDVersion[128];
4127 USHORT wServicePackMajor;
4128 USHORT wServicePackMinor;
4129 USHORT wSuiteMask;
4130 UCHAR wProductType;
4131 UCHAR wReserved;
4132 } OSVERSIONINFOEXA, *POSVERSIONINFOEXA, *LPOSVERSIONINFOEXA;
4133
4134 typedef struct _OSVERSIONINFOEXW {
4135 ULONG dwOSVersionInfoSize;
4136 ULONG dwMajorVersion;
4137 ULONG dwMinorVersion;
4138 ULONG dwBuildNumber;
4139 ULONG dwPlatformId;
4140 WCHAR szCSDVersion[128];
4141 USHORT wServicePackMajor;
4142 USHORT wServicePackMinor;
4143 USHORT wSuiteMask;
4144 UCHAR wProductType;
4145 UCHAR wReserved;
4146 } OSVERSIONINFOEXW, *POSVERSIONINFOEXW, *LPOSVERSIONINFOEXW, RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW;
4147
4148 #ifdef UNICODE
4149 typedef OSVERSIONINFOEXW OSVERSIONINFOEX;
4150 typedef POSVERSIONINFOEXW POSVERSIONINFOEX;
4151 typedef LPOSVERSIONINFOEXW LPOSVERSIONINFOEX;
4152 #else
4153 typedef OSVERSIONINFOEXA OSVERSIONINFOEX;
4154 typedef POSVERSIONINFOEXA POSVERSIONINFOEX;
4155 typedef LPOSVERSIONINFOEXA LPOSVERSIONINFOEX;
4156 #endif // UNICODE
4157
4158 NTSYSAPI
4159 ULONGLONG
4160 DDKAPI
4161 VerSetConditionMask(
4162 IN ULONGLONG ConditionMask,
4163 IN ULONG TypeMask,
4164 IN UCHAR Condition);
4165
4166 #define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType) \
4167 ((ConditionMask) = VerSetConditionMask((ConditionMask), \
4168 (TypeBitMask), (ComparisonType)))
4169
4170 /* RtlVerifyVersionInfo() TypeMask */
4171
4172 #define VER_MINORVERSION 0x0000001
4173 #define VER_MAJORVERSION 0x0000002
4174 #define VER_BUILDNUMBER 0x0000004
4175 #define VER_PLATFORMID 0x0000008
4176 #define VER_SERVICEPACKMINOR 0x0000010
4177 #define VER_SERVICEPACKMAJOR 0x0000020
4178 #define VER_SUITENAME 0x0000040
4179 #define VER_PRODUCT_TYPE 0x0000080
4180
4181 /* RtlVerifyVersionInfo() ComparisonType */
4182
4183 #define VER_EQUAL 1
4184 #define VER_GREATER 2
4185 #define VER_GREATER_EQUAL 3
4186 #define VER_LESS 4
4187 #define VER_LESS_EQUAL 5
4188 #define VER_AND 6
4189 #define VER_OR 7
4190
4191 #define VER_CONDITION_MASK 7
4192 #define VER_NUM_BITS_PER_CONDITION_MASK 3
4193
4194 struct _RTL_RANGE;
4195
4196 typedef BOOLEAN
4197 (NTAPI *PRTL_CONFLICT_RANGE_CALLBACK) (
4198 PVOID Context,
4199 struct _RTL_RANGE *Range
4200 );
4201
4202 typedef enum _EVENT_TYPE {
4203 NotificationEvent,
4204 SynchronizationEvent
4205 } EVENT_TYPE;
4206
4207 typedef enum _KWAIT_REASON {
4208 Executive,
4209 FreePage,
4210 PageIn,
4211 PoolAllocation,
4212 DelayExecution,
4213 Suspended,
4214 UserRequest,
4215 WrExecutive,
4216 WrFreePage,
4217 WrPageIn,
4218 WrPoolAllocation,
4219 WrDelayExecution,
4220 WrSuspended,
4221 WrUserRequest,
4222 WrEventPair,
4223 WrQueue,
4224 WrLpcReceive,
4225 WrLpcReply,
4226 WrVirtualMemory,
4227 WrPageOut,
4228 WrRendezvous,
4229 Spare2,
4230 WrGuardedMutex,
4231 Spare4,
4232 Spare5,
4233 Spare6,
4234 WrKernel,
4235 WrResource,
4236 WrPushLock,
4237 WrMutex,
4238 WrQuantumEnd,
4239 WrDispatchInt,
4240 WrPreempted,
4241 WrYieldExecution,
4242 MaximumWaitReason
4243 } KWAIT_REASON;
4244
4245 typedef struct _KWAIT_BLOCK {
4246 LIST_ENTRY WaitListEntry;
4247 struct _KTHREAD * RESTRICTED_POINTER Thread;
4248 PVOID Object;
4249 struct _KWAIT_BLOCK * RESTRICTED_POINTER NextWaitBlock;
4250 USHORT WaitKey;
4251 UCHAR WaitType;
4252 UCHAR SpareByte;
4253 } KWAIT_BLOCK, *PKWAIT_BLOCK, *RESTRICTED_POINTER PRKWAIT_BLOCK;
4254
4255 typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK;
4256
4257 typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK {
4258 BOOLEAN Removed;
4259 BOOLEAN Reserved[3];
4260 volatile LONG IoCount;
4261 KEVENT RemoveEvent;
4262 } IO_REMOVE_LOCK_COMMON_BLOCK;
4263
4264 typedef struct _IO_REMOVE_LOCK_DBG_BLOCK {
4265 LONG Signature;
4266 LONG HighWatermark;
4267 LONGLONG MaxLockedTicks;
4268 LONG AllocateTag;
4269 LIST_ENTRY LockList;
4270 KSPIN_LOCK Spin;
4271 volatile LONG LowMemoryCount;
4272 ULONG Reserved1[4];
4273 PVOID Reserved2;
4274 PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks;
4275 } IO_REMOVE_LOCK_DBG_BLOCK;
4276
4277 typedef struct _IO_REMOVE_LOCK {
4278 IO_REMOVE_LOCK_COMMON_BLOCK Common;
4279 #if DBG
4280 IO_REMOVE_LOCK_DBG_BLOCK Dbg;
4281 #endif
4282 } IO_REMOVE_LOCK, *PIO_REMOVE_LOCK;
4283
4284 typedef struct _IO_WORKITEM *PIO_WORKITEM;
4285
4286 typedef VOID
4287 (DDKAPI IO_WORKITEM_ROUTINE)(
4288 IN PDEVICE_OBJECT DeviceObject,
4289 IN PVOID Context);
4290 typedef IO_WORKITEM_ROUTINE *PIO_WORKITEM_ROUTINE;
4291
4292 typedef struct _SHARE_ACCESS {
4293 ULONG OpenCount;
4294 ULONG Readers;
4295 ULONG Writers;
4296 ULONG Deleters;
4297 ULONG SharedRead;
4298 ULONG SharedWrite;
4299 ULONG SharedDelete;
4300 } SHARE_ACCESS, *PSHARE_ACCESS;
4301
4302 typedef enum _KINTERRUPT_MODE {
4303 LevelSensitive,
4304 Latched
4305 } KINTERRUPT_MODE;
4306
4307 #define THREAD_WAIT_OBJECTS 3
4308
4309 typedef VOID
4310 (DDKAPI *PKINTERRUPT_ROUTINE)(
4311 VOID);
4312
4313 typedef enum _CREATE_FILE_TYPE {
4314 CreateFileTypeNone,
4315 CreateFileTypeNamedPipe,
4316 CreateFileTypeMailslot
4317 } CREATE_FILE_TYPE;
4318
4319 typedef struct _CONFIGURATION_INFORMATION {
4320 ULONG DiskCount;
4321 ULONG FloppyCount;
4322 ULONG CdRomCount;
4323 ULONG TapeCount;
4324 ULONG ScsiPortCount;
4325 ULONG SerialCount;
4326 ULONG ParallelCount;
4327 BOOLEAN AtDiskPrimaryAddressClaimed;
4328 BOOLEAN AtDiskSecondaryAddressClaimed;
4329 ULONG Version;
4330 ULONG MediumChangerCount;
4331 } CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION;
4332
4333 typedef enum _CONFIGURATION_TYPE {
4334 ArcSystem,
4335 CentralProcessor,
4336 FloatingPointProcessor,
4337 PrimaryIcache,
4338 PrimaryDcache,
4339 SecondaryIcache,
4340 SecondaryDcache,
4341 SecondaryCache,
4342 EisaAdapter,
4343 TcAdapter,
4344 ScsiAdapter,
4345 DtiAdapter,
4346 MultiFunctionAdapter,
4347 DiskController,
4348 TapeController,
4349 CdromController,
4350 WormController,
4351 SerialController,
4352 NetworkController,
4353 DisplayController,
4354 ParallelController,
4355 PointerController,
4356 KeyboardController,
4357 AudioController,
4358 OtherController,
4359 DiskPeripheral,
4360 FloppyDiskPeripheral,
4361 TapePeripheral,
4362 ModemPeripheral,
4363 MonitorPeripheral,
4364 PrinterPeripheral,
4365 PointerPeripheral,
4366 KeyboardPeripheral,
4367 TerminalPeripheral,
4368 OtherPeripheral,
4369 LinePeripheral,
4370 NetworkPeripheral,
4371 SystemMemory,
4372 DockingInformation,
4373 RealModeIrqRoutingTable,
4374 RealModePCIEnumeration,
4375 MaximumType
4376 } CONFIGURATION_TYPE, *PCONFIGURATION_TYPE;
4377
4378 #define IO_FORCE_ACCESS_CHECK 0x001
4379 #define IO_NO_PARAMETER_CHECKING 0x100
4380
4381 #define IO_REPARSE 0x0
4382 #define IO_REMOUNT 0x1
4383
4384 typedef NTSTATUS
4385 (DDKAPI *PIO_QUERY_DEVICE_ROUTINE)(
4386 IN PVOID Context,
4387 IN PUNICODE_STRING PathName,
4388 IN INTERFACE_TYPE BusType,
4389 IN ULONG BusNumber,
4390 IN PKEY_VALUE_FULL_INFORMATION *BusInformation,
4391 IN CONFIGURATION_TYPE ControllerType,
4392 IN ULONG ControllerNumber,
4393 IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation,
4394 IN CONFIGURATION_TYPE PeripheralType,
4395 IN ULONG PeripheralNumber,
4396 IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation);
4397
4398 typedef enum _IO_QUERY_DEVICE_DATA_FORMAT {
4399 IoQueryDeviceIdentifier = 0,
4400 IoQueryDeviceConfigurationData,
4401 IoQueryDeviceComponentInformation,
4402 IoQueryDeviceMaxData
4403 } IO_QUERY_DEVICE_DATA_FORMAT, *PIO_QUERY_DEVICE_DATA_FORMAT;
4404
4405 typedef enum _KBUGCHECK_CALLBACK_REASON {
4406 KbCallbackInvalid,
4407 KbCallbackReserved1,
4408 KbCallbackSecondaryDumpData,
4409 KbCallbackDumpIo,
4410 } KBUGCHECK_CALLBACK_REASON;
4411
4412 struct _KBUGCHECK_REASON_CALLBACK_RECORD;
4413
4414 typedef VOID
4415 (DDKAPI *PKBUGCHECK_REASON_CALLBACK_ROUTINE)(
4416 IN KBUGCHECK_CALLBACK_REASON Reason,
4417 IN struct _KBUGCHECK_REASON_CALLBACK_RECORD *Record,
4418 IN OUT PVOID ReasonSpecificData,
4419 IN ULONG ReasonSpecificDataLength);
4420
4421 typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD {
4422 LIST_ENTRY Entry;
4423 PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine;
4424 PUCHAR Component;
4425 ULONG_PTR Checksum;
4426 KBUGCHECK_CALLBACK_REASON Reason;
4427 UCHAR State;
4428 } KBUGCHECK_REASON_CALLBACK_RECORD, *PKBUGCHECK_REASON_CALLBACK_RECORD;
4429
4430 typedef enum _KBUGCHECK_BUFFER_DUMP_STATE {
4431 BufferEmpty,
4432 BufferInserted,
4433 BufferStarted,
4434 BufferFinished,
4435 BufferIncomplete
4436 } KBUGCHECK_BUFFER_DUMP_STATE;
4437
4438 typedef VOID
4439 (DDKAPI *PKBUGCHECK_CALLBACK_ROUTINE)(
4440 IN PVOID Buffer,
4441 IN ULONG Length);
4442
4443 typedef struct _KBUGCHECK_CALLBACK_RECORD {
4444 LIST_ENTRY Entry;
4445 PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine;
4446 PVOID Buffer;
4447 ULONG Length;
4448 PUCHAR Component;
4449 ULONG_PTR Checksum;
4450 UCHAR State;
4451 } KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD;
4452
4453 typedef BOOLEAN
4454 (DDKAPI *PNMI_CALLBACK)(
4455 IN PVOID Context,
4456 IN BOOLEAN Handled);
4457
4458 /*
4459 * VOID
4460 * KeInitializeCallbackRecord(
4461 * IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord)
4462 */
4463 #define KeInitializeCallbackRecord(CallbackRecord) \
4464 CallbackRecord->State = BufferEmpty;
4465
4466 typedef enum _KDPC_IMPORTANCE {
4467 LowImportance,
4468 MediumImportance,
4469 HighImportance
4470 } KDPC_IMPORTANCE;
4471
4472 typedef enum _MEMORY_CACHING_TYPE_ORIG {
4473 MmFrameBufferCached = 2
4474 } MEMORY_CACHING_TYPE_ORIG;
4475
4476 typedef enum _MEMORY_CACHING_TYPE {
4477 MmNonCached = FALSE,
4478 MmCached = TRUE,
4479 MmWriteCombined = MmFrameBufferCached,
4480 MmHardwareCoherentCached,
4481 MmNonCachedUnordered,
4482 MmUSWCCached,
4483 MmMaximumCacheType
4484 } MEMORY_CACHING_TYPE;
4485
4486 typedef enum _MM_PAGE_PRIORITY {
4487 LowPagePriority,
4488 NormalPagePriority = 16,
4489 HighPagePriority = 32
4490 } MM_PAGE_PRIORITY;
4491
4492 typedef enum _LOCK_OPERATION {
4493 IoReadAccess,
4494 IoWriteAccess,
4495 IoModifyAccess
4496 } LOCK_OPERATION;
4497
4498 #define FLUSH_MULTIPLE_MAXIMUM 32
4499
4500 typedef enum _MM_SYSTEM_SIZE {
4501 MmSmallSystem,
4502 MmMediumSystem,
4503 MmLargeSystem
4504 } MM_SYSTEMSIZE;
4505
4506 typedef struct _OBJECT_HANDLE_INFORMATION {
4507 ULONG HandleAttributes;
4508 ACCESS_MASK GrantedAccess;
4509 } OBJECT_HANDLE_INFORMATION, *POBJECT_HANDLE_INFORMATION;
4510
4511 typedef struct _CLIENT_ID {
4512 HANDLE UniqueProcess;
4513 HANDLE UniqueThread;
4514 } CLIENT_ID, *PCLIENT_ID;
4515
4516 typedef VOID
4517 (DDKAPI *PKSTART_ROUTINE)(
4518 IN PVOID StartContext);
4519
4520 typedef VOID
4521 (DDKAPI *PCREATE_PROCESS_NOTIFY_ROUTINE)(
4522 IN HANDLE ParentId,
4523 IN HANDLE ProcessId,
4524 IN BOOLEAN Create);
4525
4526 typedef VOID
4527 (DDKAPI *PCREATE_THREAD_NOTIFY_ROUTINE)(
4528 IN HANDLE ProcessId,
4529 IN HANDLE ThreadId,
4530 IN BOOLEAN Create);
4531
4532 typedef struct _IMAGE_INFO {
4533 _ANONYMOUS_UNION union {
4534 ULONG Properties;
4535 _ANONYMOUS_STRUCT struct {
4536 ULONG ImageAddressingMode : 8;
4537 ULONG SystemModeImage : 1;
4538 ULONG ImageMappedToAllPids : 1;
4539 ULONG Reserved : 22;
4540 } DUMMYSTRUCTNAME;
4541 } DUMMYUNIONNAME;
4542 PVOID ImageBase;
4543 ULONG ImageSelector;
4544 SIZE_T ImageSize;
4545 ULONG ImageSectionNumber;
4546 } IMAGE_INFO, *PIMAGE_INFO;
4547
4548 #define IMAGE_ADDRESSING_MODE_32BIT 3
4549
4550 typedef VOID
4551 (DDKAPI *PLOAD_IMAGE_NOTIFY_ROUTINE)(
4552 IN PUNICODE_STRING FullImageName,
4553 IN HANDLE ProcessId,
4554 IN PIMAGE_INFO ImageInfo);
4555
4556 #pragma pack(push,4)
4557 typedef enum _BUS_DATA_TYPE {
4558 ConfigurationSpaceUndefined = -1,
4559 Cmos,
4560 EisaConfiguration,
4561 Pos,
4562 CbusConfiguration,
4563 PCIConfiguration,
4564 VMEConfiguration,
4565 NuBusConfiguration,
4566 PCMCIAConfiguration,
4567 MPIConfiguration,
4568 MPSAConfiguration,
4569 PNPISAConfiguration,
4570 SgiInternalConfiguration,
4571 MaximumBusDataType
4572 } BUS_DATA_TYPE, *PBUS_DATA_TYPE;
4573 #pragma pack(pop)
4574
4575 typedef struct _NT_TIB {
4576 struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
4577 PVOID StackBase;
4578 PVOID StackLimit;
4579 PVOID SubSystemTib;
4580 _ANONYMOUS_UNION union {
4581 PVOID FiberData;
4582 ULONG Version;
4583 } DUMMYUNIONNAME;
4584 PVOID ArbitraryUserPointer;
4585 struct _NT_TIB *Self;
4586 } NT_TIB, *PNT_TIB;
4587
4588 typedef enum _PROCESSINFOCLASS {
4589 ProcessBasicInformation,
4590 ProcessQuotaLimits,
4591 ProcessIoCounters,
4592 ProcessVmCounters,
4593 ProcessTimes,
4594 ProcessBasePriority,
4595 ProcessRaisePriority,
4596 ProcessDebugPort,
4597 ProcessExceptionPort,
4598 ProcessAccessToken,
4599 ProcessLdtInformation,
4600 ProcessLdtSize,
4601 ProcessDefaultHardErrorMode,
4602 ProcessIoPortHandlers,
4603 ProcessPooledUsageAndLimits,
4604 ProcessWorkingSetWatch,
4605 ProcessUserModeIOPL,
4606 ProcessEnableAlignmentFaultFixup,
4607 ProcessPriorityClass,
4608 ProcessWx86Information,
4609 ProcessHandleCount,
4610 ProcessAffinityMask,
4611 ProcessPriorityBoost,
4612 ProcessDeviceMap,
4613 ProcessSessionInformation,
4614 ProcessForegroundInformation,
4615 ProcessWow64Information,
4616 ProcessImageFileName,
4617 ProcessLUIDDeviceMapsEnabled,
4618 ProcessBreakOnTermination,
4619 ProcessDebugObjectHandle,
4620 ProcessDebugFlags,
4621 ProcessHandleTracing,
4622 ProcessIoPriority,
4623 ProcessExecuteFlags,
4624 ProcessTlsInformation,
4625 ProcessCookie,
4626 ProcessImageInformation,
4627 ProcessCycleTime,
4628 ProcessPagePriority,
4629 ProcessInstrumentationCallback,
4630 MaxProcessInfoClass
4631 } PROCESSINFOCLASS;
4632
4633 typedef enum _THREADINFOCLASS {
4634 ThreadBasicInformation,
4635 ThreadTimes,
4636 ThreadPriority,
4637 ThreadBasePriority,
4638 ThreadAffinityMask,
4639 ThreadImpersonationToken,
4640 ThreadDescriptorTableEntry,
4641 ThreadEnableAlignmentFaultFixup,
4642 ThreadEventPair_Reusable,
4643 ThreadQuerySetWin32StartAddress,
4644 ThreadZeroTlsCell,
4645 ThreadPerformanceCount,
4646 ThreadAmILastThread,
4647 ThreadIdealProcessor,
4648 ThreadPriorityBoost,
4649 ThreadSetTlsArrayAddress,
4650 ThreadIsIoPending,
4651 ThreadHideFromDebugger,
4652 ThreadBreakOnTermination,
4653 ThreadSwitchLegacyState,
4654 ThreadIsTerminated,
4655 ThreadLastSystemCall,
4656 ThreadIoPriority,
4657 ThreadCycleTime,
4658 ThreadPagePriority,
4659 ThreadActualBasePriority,
4660 MaxThreadInfoClass
4661 } THREADINFOCLASS;
4662
4663 typedef struct _PROCESS_BASIC_INFORMATION
4664 {
4665 NTSTATUS ExitStatus;
4666 struct _PEB *PebBaseAddress;
4667 ULONG_PTR AffinityMask;
4668 KPRIORITY BasePriority;
4669 ULONG_PTR UniqueProcessId;
4670 ULONG_PTR InheritedFromUniqueProcessId;
4671 } PROCESS_BASIC_INFORMATION,*PPROCESS_BASIC_INFORMATION;
4672
4673 typedef struct _PROCESS_WS_WATCH_INFORMATION
4674 {
4675 PVOID FaultingPc;
4676 PVOID FaultingVa;
4677 } PROCESS_WS_WATCH_INFORMATION, *PPROCESS_WS_WATCH_INFORMATION;
4678
4679 typedef struct _PROCESS_DEVICEMAP_INFORMATION
4680 {
4681 union
4682 {
4683 struct
4684 {
4685 HANDLE DirectoryHandle;
4686 } Set;
4687 struct
4688 {
4689 ULONG DriveMap;
4690 UCHAR DriveType[32];
4691 } Query;
4692 };
4693 } PROCESS_DEVICEMAP_INFORMATION, *PPROCESS_DEVICEMAP_INFORMATION;
4694
4695 typedef struct _KERNEL_USER_TIMES
4696 {
4697 LARGE_INTEGER CreateTime;
4698 LARGE_INTEGER ExitTime;
4699 LARGE_INTEGER KernelTime;
4700 LARGE_INTEGER UserTime;
4701 } KERNEL_USER_TIMES, *PKERNEL_USER_TIMES;
4702
4703 typedef struct _PROCESS_ACCESS_TOKEN
4704 {
4705 HANDLE Token;
4706 HANDLE Thread;
4707 } PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN;
4708
4709 typedef struct _PROCESS_SESSION_INFORMATION
4710 {
4711 ULONG SessionId;
4712 } PROCESS_SESSION_INFORMATION, *PPROCESS_SESSION_INFORMATION;
4713
4714 typedef VOID
4715 (DDKAPI *PREQUEST_POWER_COMPLETE)(
4716 IN PDEVICE_OBJECT DeviceObject,
4717 IN UCHAR MinorFunction,
4718 IN POWER_STATE PowerState,
4719 IN PVOID Context,
4720 IN PIO_STATUS_BLOCK IoStatus);
4721
4722 typedef enum _TRACE_INFORMATION_CLASS {
4723 TraceIdClass,
4724 TraceHandleClass,
4725 TraceEnableFlagsClass,
4726 TraceEnableLevelClass,
4727 GlobalLoggerHandleClass,
4728 EventLoggerHandleClass,
4729 AllLoggerHandlesClass,
4730 TraceHandleByNameClass
4731 } TRACE_INFORMATION_CLASS;
4732
4733 typedef enum _REG_NOTIFY_CLASS
4734 {
4735 RegNtDeleteKey,
4736 RegNtPreDeleteKey = RegNtDeleteKey,
4737 RegNtSetValueKey,
4738 RegNtPreSetValueKey = RegNtSetValueKey,
4739 RegNtDeleteValueKey,
4740 RegNtPreDeleteValueKey = RegNtDeleteValueKey,
4741 RegNtSetInformationKey,
4742 RegNtPreSetInformationKey = RegNtSetInformationKey,
4743 RegNtRenameKey,
4744 RegNtPreRenameKey = RegNtRenameKey,
4745 RegNtEnumerateKey,
4746 RegNtPreEnumerateKey = RegNtEnumerateKey,
4747 RegNtEnumerateValueKey,
4748 RegNtPreEnumerateValueKey = RegNtEnumerateValueKey,
4749 RegNtQueryKey,
4750 RegNtPreQueryKey = RegNtQueryKey,
4751 RegNtQueryValueKey,
4752 RegNtPreQueryValueKey = RegNtQueryValueKey,
4753 RegNtQueryMultipleValueKey,
4754 RegNtPreQueryMultipleValueKey = RegNtQueryMultipleValueKey,
4755 RegNtPreCreateKey,
4756 RegNtPostCreateKey,
4757 RegNtPreOpenKey,
4758 RegNtPostOpenKey,
4759 RegNtKeyHandleClose,
4760 RegNtPreKeyHandleClose = RegNtKeyHandleClose,
4761 RegNtPostDeleteKey,
4762 RegNtPostSetValueKey,
4763 RegNtPostDeleteValueKey,
4764 RegNtPostSetInformationKey,
4765 RegNtPostRenameKey,
4766 RegNtPostEnumerateKey,
4767 RegNtPostEnumerateValueKey,
4768 RegNtPostQueryKey,
4769 RegNtPostQueryValueKey,
4770 RegNtPostQueryMultipleValueKey,
4771 RegNtPostKeyHandleClose,
4772 RegNtPreCreateKeyEx,
4773 RegNtPostCreateKeyEx,
4774 RegNtPreOpenKeyEx,
4775 RegNtPostOpenKeyEx
4776 } REG_NOTIFY_CLASS, *PREG_NOTIFY_CLASS;
4777
4778 typedef NTSTATUS
4779 (NTAPI *PEX_CALLBACK_FUNCTION)(
4780 IN PVOID CallbackContext,
4781 IN PVOID Argument1,
4782 IN PVOID Argument2
4783 );
4784
4785 typedef struct _REG_DELETE_KEY_INFORMATION
4786 {
4787 PVOID Object;
4788 } REG_DELETE_KEY_INFORMATION, *PREG_DELETE_KEY_INFORMATION;
4789
4790 typedef struct _REG_SET_VALUE_KEY_INFORMATION
4791 {
4792 PVOID Object;
4793 PUNICODE_STRING ValueName;
4794 ULONG TitleIndex;
4795 ULONG Type;
4796 PVOID Data;
4797 ULONG DataSize;
4798 } REG_SET_VALUE_KEY_INFORMATION, *PREG_SET_VALUE_KEY_INFORMATION;
4799
4800 typedef struct _REG_DELETE_VALUE_KEY_INFORMATION
4801 {
4802 PVOID Object;
4803 PUNICODE_STRING ValueName;
4804 } REG_DELETE_VALUE_KEY_INFORMATION, *PREG_DELETE_VALUE_KEY_INFORMATION;
4805
4806 typedef struct _REG_SET_INFORMATION_KEY_INFORMATION
4807 {
4808 PVOID Object;
4809 KEY_SET_INFORMATION_CLASS KeySetInformationClass;
4810 PVOID KeySetInformation;
4811 ULONG KeySetInformationLength;
4812 } REG_SET_INFORMATION_KEY_INFORMATION, *PREG_SET_INFORMATION_KEY_INFORMATION;
4813
4814 typedef struct _REG_ENUMERATE_KEY_INFORMATION
4815 {
4816 PVOID Object;
4817 ULONG Index;
4818 KEY_INFORMATION_CLASS KeyInformationClass;
4819 PVOID KeyInformation;
4820 ULONG Length;
4821 PULONG ResultLength;
4822 } REG_ENUMERATE_KEY_INFORMATION, *PREG_ENUMERATE_KEY_INFORMATION;
4823
4824 typedef struct _REG_ENUMERATE_VALUE_KEY_INFORMATION
4825 {
4826 PVOID Object;
4827 ULONG Index;
4828 KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass;
4829 PVOID KeyValueInformation;
4830 ULONG Length;
4831 PULONG ResultLength;
4832 } REG_ENUMERATE_VALUE_KEY_INFORMATION, *PREG_ENUMERATE_VALUE_KEY_INFORMATION;
4833
4834 typedef struct _REG_QUERY_KEY_INFORMATION
4835 {
4836 PVOID Object;
4837 KEY_INFORMATION_CLASS KeyInformationClass;
4838 PVOID KeyInformation;
4839 ULONG Length;
4840 PULONG ResultLength;
4841 } REG_QUERY_KEY_INFORMATION, *PREG_QUERY_KEY_INFORMATION;
4842
4843 typedef struct _REG_QUERY_VALUE_KEY_INFORMATION
4844 {
4845 PVOID Object;
4846 PUNICODE_STRING ValueName;
4847 KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass;
4848 PVOID KeyValueInformation;
4849 ULONG Length;
4850 PULONG ResultLength;
4851 } REG_QUERY_VALUE_KEY_INFORMATION, *PREG_QUERY_VALUE_KEY_INFORMATION;
4852
4853 typedef struct _REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION
4854 {
4855 PVOID Object;
4856 PKEY_VALUE_ENTRY ValueEntries;
4857 ULONG EntryCount;
4858 PVOID ValueBuffer;
4859 PULONG BufferLength;
4860 PULONG RequiredBufferLength;
4861 } REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION, *PREG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION;
4862
4863 typedef struct _REG_PRE_CREATE_KEY_INFORMATION
4864 {
4865 PUNICODE_STRING CompleteName;
4866 } REG_PRE_CREATE_KEY_INFORMATION, *PREG_PRE_CREATE_KEY_INFORMATION;
4867
4868 typedef struct _REG_POST_CREATE_KEY_INFORMATION
4869 {
4870 PUNICODE_STRING CompleteName;
4871 PVOID Object;
4872 NTSTATUS Status;
4873 } REG_POST_CREATE_KEY_INFORMATION, *PREG_POST_CREATE_KEY_INFORMATION;
4874
4875 typedef struct _REG_PRE_OPEN_KEY_INFORMATION
4876 {
4877 PUNICODE_STRING CompleteName;
4878 } REG_PRE_OPEN_KEY_INFORMATION, *PREG_PRE_OPEN_KEY_INFORMATION;
4879
4880 typedef struct _REG_POST_OPEN_KEY_INFORMATION
4881 {
4882 PUNICODE_STRING CompleteName;
4883 PVOID Object;
4884 NTSTATUS Status;
4885 } REG_POST_OPEN_KEY_INFORMATION, *PREG_POST_OPEN_KEY_INFORMATION;
4886
4887 typedef struct _REG_POST_OPERATION_INFORMATION
4888 {
4889 PVOID Object;
4890 NTSTATUS Status;
4891 } REG_POST_OPERATION_INFORMATION,*PREG_POST_OPERATION_INFORMATION;
4892
4893 typedef struct _REG_KEY_HANDLE_CLOSE_INFORMATION
4894 {
4895 PVOID Object;
4896 } REG_KEY_HANDLE_CLOSE_INFORMATION, *PREG_KEY_HANDLE_CLOSE_INFORMATION;
4897
4898 /*
4899 ** Storage structures
4900 */
4901 typedef enum _PARTITION_STYLE {
4902 PARTITION_STYLE_MBR,
4903 PARTITION_STYLE_GPT,
4904 PARTITION_STYLE_RAW
4905 } PARTITION_STYLE;
4906
4907 typedef struct _CREATE_DISK_MBR {
4908 ULONG Signature;
4909 } CREATE_DISK_MBR, *PCREATE_DISK_MBR;
4910
4911 typedef struct _CREATE_DISK_GPT {
4912 GUID DiskId;
4913 ULONG MaxPartitionCount;
4914 } CREATE_DISK_GPT, *PCREATE_DISK_GPT;
4915
4916 typedef struct _CREATE_DISK {
4917 PARTITION_STYLE PartitionStyle;
4918 _ANONYMOUS_UNION union {
4919 CREATE_DISK_MBR Mbr;
4920 CREATE_DISK_GPT Gpt;
4921 } DUMMYUNIONNAME;
4922 } CREATE_DISK, *PCREATE_DISK;
4923
4924 typedef struct _DISK_SIGNATURE {
4925 ULONG PartitionStyle;
4926 _ANONYMOUS_UNION union {
4927 struct {
4928 ULONG Signature;
4929 ULONG CheckSum;
4930 } Mbr;
4931 struct {
4932 GUID DiskId;
4933 } Gpt;
4934 } DUMMYUNIONNAME;
4935 } DISK_SIGNATURE, *PDISK_SIGNATURE;
4936
4937 typedef VOID
4938 (FASTCALL*PTIME_UPDATE_NOTIFY_ROUTINE)(
4939 IN HANDLE ThreadId,
4940 IN KPROCESSOR_MODE Mode);
4941
4942 #define DBG_STATUS_CONTROL_C 1
4943 #define DBG_STATUS_SYSRQ 2
4944 #define DBG_STATUS_BUGCHECK_FIRST 3
4945 #define DBG_STATUS_BUGCHECK_SECOND 4
4946 #define DBG_STATUS_FATAL 5
4947 #define DBG_STATUS_DEBUG_CONTROL 6
4948 #define DBG_STATUS_WORKER 7
4949
4950 typedef struct _PHYSICAL_MEMORY_RANGE {
4951 PHYSICAL_ADDRESS BaseAddress;
4952 LARGE_INTEGER NumberOfBytes;
4953 } PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE;
4954
4955 typedef ULONG_PTR
4956 (NTAPI *PDRIVER_VERIFIER_THUNK_ROUTINE)(
4957 IN PVOID Context);
4958
4959 typedef struct _DRIVER_VERIFIER_THUNK_PAIRS {
4960 PDRIVER_VERIFIER_THUNK_ROUTINE PristineRoutine;
4961 PDRIVER_VERIFIER_THUNK_ROUTINE NewRoutine;
4962 } DRIVER_VERIFIER_THUNK_PAIRS, *PDRIVER_VERIFIER_THUNK_PAIRS;
4963
4964 #define DRIVER_VERIFIER_SPECIAL_POOLING 0x0001
4965 #define DRIVER_VERIFIER_FORCE_IRQL_CHECKING 0x0002
4966 #define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES 0x0004
4967 #define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS 0x0008
4968 #define DRIVER_VERIFIER_IO_CHECKING 0x0010
4969
4970 #define HASH_STRING_ALGORITHM_DEFAULT 0
4971 #define HASH_STRING_ALGORITHM_X65599 1
4972 #define HASH_STRING_ALGORITHM_INVALID 0xffffffff
4973
4974 typedef VOID
4975 (DDKAPI *PTIMER_APC_ROUTINE)(
4976 IN PVOID TimerContext,
4977 IN ULONG TimerLowValue,
4978 IN LONG TimerHighValue);
4979
4980
4981
4982 /*
4983 ** WMI structures
4984 */
4985
4986 typedef VOID
4987 (DDKAPI *WMI_NOTIFICATION_CALLBACK)(
4988 PVOID Wnode,
4989 PVOID Context);
4990
4991
4992 /*
4993 ** Architecture specific structures
4994 */
4995 #define PCR_MINOR_VERSION 1
4996 #define PCR_MAJOR_VERSION 1
4997
4998 #ifdef _X86_
4999
5000 #define SIZE_OF_80387_REGISTERS 80
5001 #define CONTEXT_i386 0x10000
5002 #define CONTEXT_i486 0x10000
5003 #define CONTEXT_CONTROL (CONTEXT_i386|0x00000001L)
5004 #define CONTEXT_INTEGER (CONTEXT_i386|0x00000002L)
5005 #define CONTEXT_SEGMENTS (CONTEXT_i386|0x00000004L)
5006 #define CONTEXT_FLOATING_POINT (CONTEXT_i386|0x00000008L)
5007 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386|0x00000010L)
5008 #define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L)
5009 #define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS)
5010 #define MAXIMUM_SUPPORTED_EXTENSION 512
5011
5012 typedef struct _FLOATING_SAVE_AREA {
5013 ULONG ControlWord;
5014 ULONG StatusWord;
5015 ULONG TagWord;
5016 ULONG ErrorOffset;
5017 ULONG ErrorSelector;
5018 ULONG DataOffset;
5019 ULONG DataSelector;
5020 UCHAR RegisterArea[SIZE_OF_80387_REGISTERS];
5021 ULONG Cr0NpxState;
5022 } FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA;
5023
5024 typedef struct _CONTEXT {
5025 ULONG ContextFlags;
5026 ULONG Dr0;
5027 ULONG Dr1;
5028 ULONG Dr2;
5029 ULONG Dr3;
5030 ULONG Dr6;
5031 ULONG Dr7;
5032 FLOATING_SAVE_AREA FloatSave;
5033 ULONG SegGs;
5034 ULONG SegFs;
5035 ULONG SegEs;
5036 ULONG SegDs;
5037 ULONG Edi;
5038 ULONG Esi;
5039 ULONG Ebx;
5040 ULONG Edx;
5041 ULONG Ecx;
5042 ULONG Eax;
5043 ULONG Ebp;
5044 ULONG Eip;
5045 ULONG SegCs;
5046 ULONG EFlags;
5047 ULONG Esp;
5048 ULONG SegSs;
5049 UCHAR ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];
5050 } CONTEXT;
5051
5052 //
5053 // Used to contain PFNs and PFN counts
5054 //
5055 typedef ULONG PFN_COUNT;
5056 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
5057 typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
5058
5059 #define PASSIVE_LEVEL 0
5060 #define LOW_LEVEL 0
5061 #define APC_LEVEL 1
5062 #define DISPATCH_LEVEL 2
5063 #define PROFILE_LEVEL 27
5064 #define CLOCK1_LEVEL 28
5065 #define CLOCK2_LEVEL 28
5066 #define IPI_LEVEL 29
5067 #define POWER_LEVEL 30
5068 #define HIGH_LEVEL 31
5069
5070 typedef struct _KPCR_TIB {
5071 PVOID ExceptionList; /* 00 */
5072 PVOID StackBase; /* 04 */
5073 PVOID StackLimit; /* 08 */
5074 PVOID SubSystemTib; /* 0C */
5075 _ANONYMOUS_UNION union {
5076 PVOID FiberData; /* 10 */
5077 ULONG Version; /* 10 */
5078 } DUMMYUNIONNAME;
5079 PVOID ArbitraryUserPointer; /* 14 */
5080 struct _KPCR_TIB *Self; /* 18 */
5081 } KPCR_TIB, *PKPCR_TIB; /* 1C */
5082
5083 typedef struct _KPCR {
5084 KPCR_TIB Tib; /* 00 */
5085 struct _KPCR *Self; /* 1C */
5086 struct _KPRCB *Prcb; /* 20 */
5087 KIRQL Irql; /* 24 */
5088 ULONG IRR; /* 28 */
5089 ULONG IrrActive; /* 2C */
5090 ULONG IDR; /* 30 */
5091 PVOID KdVersionBlock; /* 34 */
5092 PUSHORT IDT; /* 38 */
5093 PUSHORT GDT; /* 3C */
5094 struct _KTSS *TSS; /* 40 */
5095 USHORT MajorVersion; /* 44 */
5096 USHORT MinorVersion; /* 46 */
5097 KAFFINITY SetMember; /* 48 */
5098 ULONG StallScaleFactor; /* 4C */
5099 UCHAR SpareUnused; /* 50 */
5100 UCHAR Number; /* 51 */
5101 UCHAR Spare0;
5102 UCHAR SecondLevelCacheAssociativity;
5103 ULONG VdmAlert;
5104 ULONG KernelReserved[14]; // For use by the kernel
5105 ULONG SecondLevelCacheSize;
5106 ULONG HalReserved[16]; // For use by Hal
5107 } KPCR, *PKPCR; /* 54 */
5108
5109 #define KeGetPcr() PCR
5110
5111 typedef struct _KFLOATING_SAVE {
5112 ULONG ControlWord;
5113 ULONG StatusWord;
5114 ULONG ErrorOffset;
5115 ULONG ErrorSelector;
5116 ULONG DataOffset;
5117 ULONG DataSelector;
5118 ULONG Cr0NpxState;
5119 ULONG Spare1;
5120 } KFLOATING_SAVE, *PKFLOATING_SAVE;
5121
5122 FORCEINLINE
5123 ULONG
5124 KeGetCurrentProcessorNumber(VOID)
5125 {
5126 #if defined(__GNUC__)
5127 ULONG ret;
5128 __asm__ __volatile__ (
5129 "movl %%fs:%c1, %0\n"
5130 : "=r" (ret)
5131 : "i" (FIELD_OFFSET(KPCR, Number))
5132 );
5133 return ret;
5134 #elif defined(_MSC_VER)
5135 #if _MSC_FULL_VER >= 13012035
5136 return (ULONG)__readfsbyte(FIELD_OFFSET(KPCR, Number));
5137 #else
5138 __asm { movzx eax, fs:[0] KPCR.Number }
5139 #endif
5140 #else
5141 #error Unknown compiler
5142 #endif
5143 }
5144
5145 NTHALAPI
5146 KIRQL
5147 DDKAPI
5148 KeGetCurrentIrql(
5149 VOID);
5150
5151 NTKERNELAPI
5152 PRKTHREAD
5153 NTAPI
5154 KeGetCurrentThread(
5155 VOID);
5156
5157 #define KI_USER_SHARED_DATA 0xffdf0000
5158
5159 #define PAGE_SIZE 0x1000
5160 #define PAGE_SHIFT 12L
5161
5162 #define SharedUserData ((KUSER_SHARED_DATA * CONST) KI_USER_SHARED_DATA)
5163
5164 extern NTKERNELAPI PVOID MmHighestUserAddress;
5165 extern NTKERNELAPI PVOID MmSystemRangeStart;
5166 extern NTKERNELAPI ULONG_PTR MmUserProbeAddress;
5167
5168 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
5169 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
5170 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
5171 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
5172 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000
5173
5174 #define MM_KSEG0_BASE MM_SYSTEM_RANGE_START
5175 #define MM_SYSTEM_SPACE_END 0xFFFFFFFF
5176
5177 #elif defined(__x86_64__)
5178
5179 #define CONTEXT_AMD64 0x100000
5180 #if !defined(RC_INVOKED)
5181 #define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L)
5182 #define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L)
5183 #define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L)
5184 #define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L)
5185 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L)
5186
5187 #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)
5188 #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS)
5189
5190 #define CONTEXT_EXCEPTION_ACTIVE 0x8000000
5191 #define CONTEXT_SERVICE_ACTIVE 0x10000000
5192 #define CONTEXT_EXCEPTION_REQUEST 0x40000000
5193 #define CONTEXT_EXCEPTION_REPORTING 0x80000000
5194 #endif
5195
5196 typedef struct DECLSPEC_ALIGN(16) _M128A {
5197 ULONGLONG Low;
5198 LONGLONG High;
5199 } M128A, *PM128A;
5200
5201 typedef struct _XMM_SAVE_AREA32 {
5202 USHORT ControlWord;
5203 USHORT StatusWord;
5204 UCHAR TagWord;
5205 UCHAR Reserved1;
5206 USHORT ErrorOpcode;
5207 ULONG ErrorOffset;
5208 USHORT ErrorSelector;
5209 USHORT Reserved2;
5210 ULONG DataOffset;
5211 USHORT DataSelector;
5212 USHORT Reserved3;
5213 ULONG MxCsr;
5214 ULONG MxCsr_Mask;
5215 M128A FloatRegisters[8];
5216 M128A XmmRegisters[16];
5217 UCHAR Reserved4[96];
5218 } XMM_SAVE_AREA32, *PXMM_SAVE_AREA32;
5219
5220 typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
5221 ULONG64 P1Home;
5222 ULONG64 P2Home;
5223 ULONG64 P3Home;
5224 ULONG64 P4Home;
5225 ULONG64 P5Home;
5226 ULONG64 P6Home;
5227
5228 /* Control flags */
5229 ULONG ContextFlags;
5230 ULONG MxCsr;
5231
5232 /* Segment */
5233 USHORT SegCs;
5234 USHORT SegDs;
5235 USHORT SegEs;
5236 USHORT SegFs;
5237 USHORT SegGs;
5238 USHORT SegSs;
5239 ULONG EFlags;
5240
5241 /* Debug */
5242 ULONG64 Dr0;
5243 ULONG64 Dr1;
5244 ULONG64 Dr2;
5245 ULONG64 Dr3;
5246 ULONG64 Dr6;
5247 ULONG64 Dr7;
5248
5249 /* Integer */
5250 ULONG64 Rax;
5251 ULONG64 Rcx;
5252 ULONG64 Rdx;
5253 ULONG64 Rbx;
5254 ULONG64 Rsp;
5255 ULONG64 Rbp;
5256 ULONG64 Rsi;
5257 ULONG64 Rdi;
5258 ULONG64 R8;
5259 ULONG64 R9;
5260 ULONG64 R10;
5261 ULONG64 R11;
5262 ULONG64 R12;
5263 ULONG64 R13;
5264 ULONG64 R14;
5265 ULONG64 R15;
5266
5267 /* Counter */
5268 ULONG64 Rip;
5269
5270 /* Floating point */
5271 union {
5272 XMM_SAVE_AREA32 FltSave;
5273 struct {
5274 M128A Header[2];
5275 M128A Legacy[8];
5276 M128A Xmm0;
5277 M128A Xmm1;
5278 M128A Xmm2;
5279 M128A Xmm3;
5280 M128A Xmm4;
5281 M128A Xmm5;
5282 M128A Xmm6;
5283 M128A Xmm7;
5284 M128A Xmm8;
5285 M128A Xmm9;
5286 M128A Xmm10;
5287 M128A Xmm11;
5288 M128A Xmm12;
5289 M128A Xmm13;
5290 M128A Xmm14;
5291 M128A Xmm15;
5292 } DUMMYSTRUCTNAME;
5293 } DUMMYUNIONNAME;
5294
5295 /* Vector */
5296 M128A VectorRegister[26];
5297 ULONG64 VectorControl;
5298
5299 /* Debug control */
5300 ULONG64 DebugControl;
5301 ULONG64 LastBranchToRip;
5302 ULONG64 LastBranchFromRip;
5303 ULONG64 LastExceptionToRip;
5304 ULONG64 LastExceptionFromRip;
5305 } CONTEXT;
5306
5307 //
5308 // Used to contain PFNs and PFN counts
5309 //
5310 typedef ULONG PFN_COUNT;
5311 typedef ULONG64 PFN_NUMBER, *PPFN_NUMBER;
5312 typedef LONG64 SPFN_NUMBER, *PSPFN_NUMBER;
5313
5314 #define PASSIVE_LEVEL 0
5315 #define LOW_LEVEL 0
5316 #define APC_LEVEL 1
5317 #define DISPATCH_LEVEL 2
5318 #define CLOCK_LEVEL 13
5319 #define IPI_LEVEL 14
5320 #define POWER_LEVEL 14
5321 #define PROFILE_LEVEL 15
5322 #define HIGH_LEVEL 15
5323
5324 #define PAGE_SIZE 0x1000
5325 #define PAGE_SHIFT 12L
5326 #define PTI_SHIFT 12L
5327 #define PDI_SHIFT 21L
5328 #define PPI_SHIFT 30L
5329 #define PXI_SHIFT 39L
5330 #define PTE_PER_PAGE 512
5331 #define PDE_PER_PAGE 512
5332 #define PPE_PER_PAGE 512
5333 #define PXE_PER_PAGE 512
5334 #define PTI_MASK_AMD64 (PTE_PER_PAGE - 1)
5335 #define PDI_MASK_AMD64 (PDE_PER_PAGE - 1)
5336 #define PPI_MASK (PPE_PER_PAGE - 1)
5337 #define PXI_MASK (PXE_PER_PAGE - 1)
5338
5339 #define PXE_BASE 0xFFFFF6FB7DBED000ULL
5340 #define PXE_SELFMAP 0xFFFFF6FB7DBEDF68ULL
5341 #define PPE_BASE 0xFFFFF6FB7DA00000ULL
5342 #define PDE_BASE 0xFFFFF6FB40000000ULL
5343 #define PTE_BASE 0xFFFFF68000000000ULL
5344 #define PXE_TOP 0xFFFFF6FB7DBEDFFFULL
5345 #define PPE_TOP 0xFFFFF6FB7DBFFFFFULL
5346 #define PDE_TOP 0xFFFFF6FB7FFFFFFFULL
5347 #define PTE_TOP 0xFFFFF6FFFFFFFFFFULL
5348
5349 extern NTKERNELAPI PVOID MmHighestUserAddress;
5350 extern NTKERNELAPI PVOID MmSystemRangeStart;
5351 extern NTKERNELAPI ULONG_PTR MmUserProbeAddress;
5352
5353 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
5354 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
5355 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
5356 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
5357 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xFFFF080000000000ULL
5358 #define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL
5359
5360 #define SharedUserData ((PKUSER_SHARED_DATA const)KI_USER_SHARED_DATA)
5361 #define SharedInterruptTime (&SharedUserData->InterruptTime)
5362 #define SharedSystemTime (&SharedUserData->SystemTime)
5363 #define SharedTickCount (&SharedUserData->TickCount)
5364
5365 #define KeQueryInterruptTime() \
5366 (*(volatile ULONG64*)SharedInterruptTime)
5367 #define KeQuerySystemTime(CurrentCount) \
5368 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime
5369 #define KeQueryTickCount(CurrentCount) \
5370 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount
5371
5372 typedef struct _KPCR
5373 {
5374 union
5375 {
5376 NT_TIB NtTib;
5377 struct
5378 {
5379 union _KGDTENTRY64 *GdtBase;
5380 struct _KTSS64 *TssBase;
5381 ULONG64 UserRsp;
5382 struct _KPCR *Self;
5383 struct _KPRCB *CurrentPrcb;
5384 PKSPIN_LOCK_QUEUE LockArray;
5385 PVOID Used_Self;
5386 };
5387 };
5388 union _KIDTENTRY64 *IdtBase;
5389 ULONG64 Unused[2];
5390 KIRQL Irql;
5391 UCHAR SecondLevelCacheAssociativity;
5392 UCHAR ObsoleteNumber;
5393 UCHAR Fill0;
5394 ULONG Unused0[3];
5395 USHORT MajorVersion;
5396 USHORT MinorVersion;
5397 ULONG StallScaleFactor;
5398 PVOID Unused1[3];
5399 ULONG KernelReserved[15];
5400 ULONG SecondLevelCacheSize;
5401 ULONG HalReserved[16];
5402 ULONG Unused2;
5403 PVOID KdVersionBlock;
5404 PVOID Unused3;
5405 ULONG PcrAlign1[24];
5406 } KPCR, *PKPCR;
5407
5408 typedef struct _KFLOATING_SAVE {
5409 ULONG Dummy;
5410 } KFLOATING_SAVE, *PKFLOATING_SAVE;
5411
5412 NTKERNELAPI
5413 PRKTHREAD
5414 NTAPI
5415 KeGetCurrentThread(
5416 VOID);
5417
5418 FORCEINLINE
5419 PKPCR
5420 KeGetPcr(VOID)
5421 {
5422 return (PKPCR)__readgsqword(FIELD_OFFSET(KPCR, Self));
5423 }
5424
5425 FORCEINLINE
5426 ULONG
5427 KeGetCurrentProcessorNumber(VOID)
5428 {
5429 return (ULONG)__readgsword(0x184);
5430 }
5431
5432 #elif defined(__PowerPC__)
5433
5434 //
5435 // Used to contain PFNs and PFN counts
5436 //
5437 typedef ULONG PFN_COUNT;
5438 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
5439 typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
5440
5441 #define PASSIVE_LEVEL 0
5442 #define LOW_LEVEL 0
5443 #define APC_LEVEL 1
5444 #define DISPATCH_LEVEL 2
5445 #define PROFILE_LEVEL 27
5446 #define CLOCK1_LEVEL 28
5447 #define CLOCK2_LEVEL 28
5448 #define IPI_LEVEL 29
5449 #define POWER_LEVEL 30
5450 #define HIGH_LEVEL 31
5451
5452 typedef struct _KFLOATING_SAVE {
5453 ULONG Dummy;
5454 } KFLOATING_SAVE, *PKFLOATING_SAVE;
5455
5456 typedef struct _KPCR_TIB {
5457 PVOID ExceptionList; /* 00 */
5458 PVOID StackBase; /* 04 */
5459 PVOID StackLimit; /* 08 */
5460 PVOID SubSystemTib; /* 0C */
5461 _ANONYMOUS_UNION union {
5462 PVOID FiberData; /* 10 */
5463 ULONG Version; /* 10 */
5464 } DUMMYUNIONNAME;
5465 PVOID ArbitraryUserPointer; /* 14 */
5466 struct _KPCR_TIB *Self; /* 18 */
5467 } KPCR_TIB, *PKPCR_TIB; /* 1C */
5468
5469 #define PCR_MINOR_VERSION 1
5470 #define PCR_MAJOR_VERSION 1
5471
5472 typedef struct _KPCR {
5473 KPCR_TIB Tib; /* 00 */
5474 struct _KPCR *Self; /* 1C */
5475 struct _KPRCB *Prcb; /* 20 */
5476 KIRQL Irql; /* 24 */
5477 ULONG IRR; /* 28 */
5478 ULONG IrrActive; /* 2C */
5479 ULONG IDR; /* 30 */
5480 PVOID KdVersionBlock; /* 34 */
5481 PUSHORT IDT; /* 38 */
5482 PUSHORT GDT; /* 3C */
5483 struct _KTSS *TSS; /* 40 */
5484 USHORT MajorVersion; /* 44 */
5485 USHORT MinorVersion; /* 46 */
5486 KAFFINITY SetMember; /* 48 */
5487 ULONG StallScaleFactor; /* 4C */
5488 UCHAR SpareUnused; /* 50 */
5489 UCHAR Number; /* 51 */
5490 } KPCR, *PKPCR; /* 54 */
5491
5492 #define KeGetPcr() PCR
5493
5494 static __inline
5495 ULONG
5496 DDKAPI
5497 KeGetCurrentProcessorNumber(VOID)
5498 {
5499 ULONG Number;
5500 __asm__ __volatile__ (
5501 "lwz %0, %c1(12)\n"
5502 : "=r" (Number)
5503 : "i" (FIELD_OFFSET(KPCR, Number))
5504 );
5505 return Number;
5506 }
5507
5508 #elif defined(_MIPS_)
5509
5510 #error MIPS Headers are totally incorrect
5511
5512 //
5513 // Used to contain PFNs and PFN counts
5514 //
5515 typedef ULONG PFN_COUNT;
5516 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
5517 typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
5518
5519 #define PASSIVE_LEVEL 0
5520 #define APC_LEVEL 1
5521 #define DISPATCH_LEVEL 2
5522 #define PROFILE_LEVEL 27
5523 #define IPI_LEVEL 29
5524 #define HIGH_LEVEL 31
5525
5526 typedef struct _KPCR {
5527 struct _KPRCB *Prcb; /* 20 */
5528 KIRQL Irql; /* 24 */
5529 ULONG IRR; /* 28 */
5530 ULONG IDR; /* 30 */
5531 } KPCR, *PKPCR;
5532
5533 #define KeGetPcr() PCR
5534
5535 typedef struct _KFLOATING_SAVE {
5536 } KFLOATING_SAVE, *PKFLOATING_SAVE;
5537
5538 static __inline
5539 ULONG
5540 DDKAPI
5541 KeGetCurrentProcessorNumber(VOID)
5542 {
5543 return 0;
5544 }
5545
5546 #elif defined(_M_ARM)
5547
5548 //
5549 // NT-ARM is not documented, need DDK-ARM
5550 //
5551 #include <armddk.h>
5552
5553 #else
5554 #error Unknown architecture
5555 #endif
5556
5557 #define MM_DONT_ZERO_ALLOCATION 0x00000001
5558 #define MM_ALLOCATE_FROM_LOCAL_NODE_ONLY 0x00000002
5559
5560
5561 #define EFLAG_SIGN 0x8000
5562 #define EFLAG_ZERO 0x4000
5563 #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
5564
5565 #define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
5566 #define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
5567 #define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
5568
5569 typedef enum _INTERLOCKED_RESULT {
5570 ResultNegative = RESULT_NEGATIVE,
5571 ResultZero = RESULT_ZERO,
5572 ResultPositive = RESULT_POSITIVE
5573 } INTERLOCKED_RESULT;
5574
5575 typedef VOID
5576 (NTAPI *PciPin2Line)(
5577 IN struct _BUS_HANDLER *BusHandler,
5578 IN struct _BUS_HANDLER *RootHandler,
5579 IN PCI_SLOT_NUMBER SlotNumber,
5580 IN PPCI_COMMON_CONFIG PciData
5581 );
5582
5583 typedef VOID
5584 (NTAPI *PciLine2Pin)(
5585 IN struct _BUS_HANDLER *BusHandler,
5586 IN struct _BUS_HANDLER *RootHandler,
5587 IN PCI_SLOT_NUMBER SlotNumber,
5588 IN PPCI_COMMON_CONFIG PciNewData,
5589 IN PPCI_COMMON_CONFIG PciOldData
5590 );
5591
5592 typedef VOID
5593 (NTAPI *PciReadWriteConfig)(
5594 IN struct _BUS_HANDLER *BusHandler,
5595 IN PCI_SLOT_NUMBER Slot,
5596 IN PVOID Buffer,
5597 IN ULONG Offset,
5598 IN ULONG Length
5599 );
5600
5601 #define PCI_DATA_TAG ' ICP'
5602 #define PCI_DATA_VERSION 1
5603
5604 typedef struct _PCIBUSDATA
5605 {
5606 ULONG Tag;
5607 ULONG Version;
5608 PciReadWriteConfig ReadConfig;
5609 PciReadWriteConfig WriteConfig;
5610 PciPin2Line Pin2Line;
5611 PciLine2Pin Line2Pin;
5612 PCI_SLOT_NUMBER ParentSlot;
5613 PVOID Reserved[4];
5614 } PCIBUSDATA, *PPCIBUSDATA;
5615
5616
5617 /** SPINLOCK FUNCTIONS ********************************************************/
5618
5619 NTKERNELAPI
5620 BOOLEAN
5621 FASTCALL
5622 KeTryToAcquireSpinLockAtDpcLevel(
5623 IN OUT PKSPIN_LOCK SpinLock
5624 );
5625
5626 NTKERNELAPI
5627 BOOLEAN
5628 FASTCALL
5629 KeTestSpinLock(
5630 IN PKSPIN_LOCK SpinLock
5631 );
5632
5633 #if defined (_X86_)
5634
5635 #if defined(WIN9X_COMPAT_SPINLOCK)
5636
5637 NTKERNELAPI
5638 VOID
5639 NTAPI
5640 KeInitializeSpinLock(
5641 IN PKSPIN_LOCK SpinLock
5642 );
5643
5644 #else
5645
5646 FORCEINLINE
5647 VOID
5648 KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock)
5649 {
5650 /* Clear the lock */
5651 *SpinLock = 0;
5652 }
5653
5654 #endif
5655
5656 NTHALAPI
5657 KIRQL
5658 FASTCALL
5659 KfAcquireSpinLock(
5660 IN PKSPIN_LOCK SpinLock);
5661
5662 NTHALAPI
5663 VOID
5664 FASTCALL
5665 KfReleaseSpinLock(
5666 IN PKSPIN_LOCK SpinLock,
5667 IN KIRQL NewIrql);
5668
5669 NTKERNELAPI
5670 VOID
5671 FASTCALL
5672 KefAcquireSpinLockAtDpcLevel(
5673 IN PKSPIN_LOCK SpinLock);
5674
5675 NTKERNELAPI
5676 VOID
5677 FASTCALL
5678 KefReleaseSpinLockFromDpcLevel(
5679 IN PKSPIN_LOCK SpinLock);
5680
5681 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
5682 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
5683 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
5684 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
5685
5686 #define KeGetDcacheFillSize() 1L
5687
5688 #elif defined(_M_ARM) // !defined (_X86_)
5689
5690 FORCEINLINE
5691 VOID
5692 KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock)
5693 {
5694 /* Clear the lock */
5695 *SpinLock = 0;
5696 }
5697
5698 NTHALAPI
5699 KIRQL
5700 FASTCALL
5701 KfAcquireSpinLock(
5702 IN PKSPIN_LOCK SpinLock);
5703
5704 NTHALAPI
5705 VOID
5706 FASTCALL
5707 KfReleaseSpinLock(
5708 IN PKSPIN_LOCK SpinLock,
5709 IN KIRQL NewIrql);
5710
5711
5712 NTKERNELAPI
5713 VOID
5714 FASTCALL
5715 KefAcquireSpinLockAtDpcLevel(
5716 IN PKSPIN_LOCK SpinLock);
5717
5718 NTKERNELAPI
5719 VOID
5720 FASTCALL
5721 KefReleaseSpinLockFromDpcLevel(
5722 IN PKSPIN_LOCK SpinLock);
5723
5724
5725 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
5726 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
5727 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
5728 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
5729
5730 NTKERNELAPI
5731 VOID
5732 NTAPI
5733 KeInitializeSpinLock(
5734 IN PKSPIN_LOCK SpinLock);
5735
5736 #else
5737
5738 FORCEINLINE
5739 VOID
5740 NTAPI
5741 KeInitializeSpinLock(
5742 PKSPIN_LOCK SpinLock)
5743 {
5744 *SpinLock = 0;
5745 }
5746
5747 NTKERNELAPI
5748 VOID
5749 KeReleaseSpinLock(
5750 IN PKSPIN_LOCK SpinLock,
5751 IN KIRQL NewIrql);
5752
5753 NTKERNELAPI
5754 VOID
5755 KeAcquireSpinLockAtDpcLevel(
5756 IN PKSPIN_LOCK SpinLock);
5757
5758 NTKERNELAPI
5759 VOID
5760 KeReleaseSpinLockFromDpcLevel(
5761 IN PKSPIN_LOCK SpinLock);
5762
5763 NTKERNELAPI
5764 KIRQL
5765 KeAcquireSpinLockRaiseToDpc(
5766 IN PKSPIN_LOCK SpinLock);
5767
5768 #define KeAcquireSpinLock(SpinLock, OldIrql) \
5769 *(OldIrql) = KeAcquireSpinLockRaiseToDpc(SpinLock)
5770
5771 #endif // !defined (_X86_)
5772
5773 /*
5774 ** Utillity functions
5775 */
5776
5777 #define ARGUMENT_PRESENT(ArgumentPointer) \
5778 ((CHAR*)((ULONG_PTR)(ArgumentPointer)) != (CHAR*)NULL)
5779
5780 /*
5781 * ULONG
5782 * BYTE_OFFSET(
5783 * IN PVOID Va)
5784 */
5785 #define BYTE_OFFSET(Va) \
5786 ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
5787
5788 /*
5789 * ULONG
5790 * BYTES_TO_PAGES(
5791 * IN ULONG Size)
5792 */
5793 #define BYTES_TO_PAGES(Size) \
5794 ((ULONG) ((ULONG_PTR) (Size) >> PAGE_SHIFT) + (((ULONG) (Size) & (PAGE_SIZE - 1)) != 0))
5795
5796 /*
5797 * PVOID
5798 * PAGE_ALIGN(
5799 * IN PVOID Va)
5800 */
5801 #define PAGE_ALIGN(Va) \
5802 ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
5803
5804 /*
5805 * ULONG_PTR
5806 * ROUND_TO_PAGES(
5807 * IN ULONG_PTR Size)
5808 */
5809 #define ROUND_TO_PAGES(Size) \
5810 ((ULONG_PTR) (((ULONG_PTR) Size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1)))
5811
5812
5813
5814 #if defined(_X86_) || defined(_AMD64_)
5815
5816 //
5817 // x86 and x64 performs a 0x2C interrupt
5818 //
5819 #define DbgRaiseAssertionFailure __int2c
5820
5821 #elif defined(_ARM_)
5822
5823 //
5824 // TODO
5825 //
5826
5827 #else
5828 #error Unsupported Architecture
5829 #endif
5830
5831 #if DBG
5832
5833 #define ASSERT(exp) \
5834 (VOID)((!(exp)) ? \
5835 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ), FALSE : TRUE)
5836
5837 #define ASSERTMSG(msg, exp) \
5838 (VOID)((!(exp)) ? \
5839 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, msg ), FALSE : TRUE)
5840
5841 #define RTL_SOFT_ASSERT(exp) \
5842 (VOID)((!(exp)) ? \
5843 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE)
5844
5845 #define RTL_SOFT_ASSERTMSG(msg, exp) \
5846 (VOID)((!(exp)) ? \
5847 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE)
5848
5849 #define RTL_VERIFY(exp) ASSERT(exp)
5850 #define RTL_VERIFYMSG(msg, exp) ASSERT(msg, exp)
5851
5852 #define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
5853 #define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
5854
5855 #if defined(_MSC_VER)
5856
5857 #define NT_ASSERT(exp) \
5858 ((!(exp)) ? \
5859 (__annotation(L"Debug", L"AssertFail", L#exp), \
5860 DbgRaiseAssertionFailure(), FALSE) : TRUE)
5861
5862 #define NT_ASSERTMSG(msg, exp) \
5863 ((!(exp)) ? \
5864 (__annotation(L"Debug", L"AssertFail", L##msg), \
5865 DbgRaiseAssertionFailure(), FALSE) : TRUE)
5866
5867 #define NT_ASSERTMSGW(msg, exp) \
5868 ((!(exp)) ? \
5869 (__annotation(L"Debug", L"AssertFail", msg), \
5870 DbgRaiseAssertionFailure(), FALSE) : TRUE)
5871
5872 #else
5873
5874 //
5875 // GCC doesn't support __annotation (nor PDB)
5876 //
5877 #define NT_ASSERT(exp) \
5878 (VOID)((!(exp)) ? (DbgRaiseAssertionFailure(), FALSE) : TRUE)
5879
5880 #define NT_ASSERTMSG NT_ASSERT
5881 #define NT_ASSERTMSGW NT_ASSERT
5882
5883 #endif
5884
5885 #else /* !DBG */
5886
5887 #define ASSERT(exp) ((VOID) 0)
5888 #define ASSERTMSG(msg, exp) ((VOID) 0)
5889
5890 #define RTL_SOFT_ASSERT(exp) ((VOID) 0)
5891 #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
5892
5893 #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
5894 #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
5895
5896 #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
5897 #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
5898
5899 #define NT_ASSERT(exp) ((VOID)0)
5900 #define NT_ASSERTMSG(exp) ((VOID)0)
5901 #define NT_ASSERTMSGW(exp) ((VOID)0)
5902
5903 #endif /* DBG */
5904
5905 /* HACK HACK HACK - GCC (or perhaps LD) is messing this up */
5906 #if defined(_NTSYSTEM_) || defined(__GNUC__)
5907 #define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag
5908 #define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag
5909 #else
5910 #define NLS_MB_CODE_PAGE_TAG (*NlsMbCodePageTag)
5911 #define NLS_MB_OEM_CODE_PAGE_TAG (*NlsMbOemCodePageTag)
5912 #endif /* _NT_SYSTEM */
5913
5914 extern BOOLEAN NTSYSAPI NLS_MB_CODE_PAGE_TAG;
5915 extern BOOLEAN NTSYSAPI NLS_MB_OEM_CODE_PAGE_TAG;
5916
5917 /*
5918 ** Driver support routines
5919 */
5920
5921 /** Runtime library routines **/
5922
5923 static __inline VOID
5924 InitializeListHead(
5925 IN PLIST_ENTRY ListHead)
5926 {
5927 ListHead->Flink = ListHead->Blink = ListHead;
5928 }
5929
5930 static __inline VOID
5931 InsertHeadList(
5932 IN PLIST_ENTRY ListHead,
5933 IN PLIST_ENTRY Entry)
5934 {
5935 PLIST_ENTRY OldFlink;
5936 OldFlink = ListHead->Flink;
5937 Entry->Flink = OldFlink;
5938 Entry->Blink = ListHead;
5939 OldFlink->Blink = Entry;
5940 ListHead->Flink = Entry;
5941 }
5942
5943 static __inline VOID
5944 InsertTailList(
5945 IN PLIST_ENTRY ListHead,
5946 IN PLIST_ENTRY Entry)
5947 {
5948 PLIST_ENTRY OldBlink;
5949 OldBlink = ListHead->Blink;
5950 Entry->Flink = ListHead;
5951 Entry->Blink = OldBlink;
5952 OldBlink->Flink = Entry;
5953 ListHead->Blink = Entry;
5954 }
5955
5956 /*
5957 * BOOLEAN
5958 * IsListEmpty(
5959 * IN PLIST_ENTRY ListHead)
5960 */
5961 #define IsListEmpty(_ListHead) \
5962 ((_ListHead)->Flink == (_ListHead))
5963
5964 /*
5965 * PSINGLE_LIST_ENTRY
5966 * PopEntryList(
5967 * IN PSINGLE_LIST_ENTRY ListHead)
5968 */
5969 #define PopEntryList(ListHead) \
5970 (ListHead)->Next; \
5971 { \
5972 PSINGLE_LIST_ENTRY _FirstEntry; \
5973 _FirstEntry = (ListHead)->Next; \
5974 if (_FirstEntry != NULL) \
5975 (ListHead)->Next = _FirstEntry->Next; \
5976 }
5977
5978 /*
5979 * VOID
5980 * PushEntryList(
5981 * IN PSINGLE_LIST_ENTRY ListHead,
5982 * IN PSINGLE_LIST_ENTRY Entry)
5983 */
5984 #define PushEntryList(_ListHead, _Entry) \
5985 (_Entry)->Next = (_ListHead)->Next; \
5986 (_ListHead)->Next = (_Entry); \
5987
5988 static __inline BOOLEAN
5989 RemoveEntryList(
5990 IN PLIST_ENTRY Entry)
5991 {
5992 PLIST_ENTRY OldFlink;
5993 PLIST_ENTRY OldBlink;
5994
5995 OldFlink = Entry->Flink;
5996 OldBlink = Entry->Blink;
5997 OldFlink->Blink = OldBlink;
5998 OldBlink->Flink = OldFlink;
5999 return (BOOLEAN)(OldFlink == OldBlink);
6000 }
6001
6002 static __inline PLIST_ENTRY
6003 RemoveHeadList(
6004 IN PLIST_ENTRY ListHead)
6005 {
6006 PLIST_ENTRY Flink;
6007 PLIST_ENTRY Entry;
6008
6009 Entry = ListHead->Flink;
6010 Flink = Entry->Flink;
6011 ListHead->Flink = Flink;
6012 Flink->Blink = ListHead;
6013 return Entry;
6014 }
6015
6016 static __inline PLIST_ENTRY
6017 RemoveTailList(
6018 IN PLIST_ENTRY ListHead)
6019 {
6020 PLIST_ENTRY Blink;
6021 PLIST_ENTRY Entry;
6022
6023 Entry = ListHead->Blink;
6024 Blink = Entry->Blink;
6025 ListHead->Blink = Blink;
6026 Blink->Flink = ListHead;
6027 return Entry;
6028 }
6029
6030 NTSYSAPI
6031 NTSTATUS
6032 NTAPI
6033 RtlCharToInteger(
6034 IN PCSZ String,
6035 IN ULONG Base OPTIONAL,
6036 IN OUT PULONG Value);
6037
6038 NTSYSAPI
6039 LONG
6040 NTAPI
6041 RtlCompareString(
6042 IN PSTRING String1,
6043 IN PSTRING String2,
6044 BOOLEAN CaseInSensitive);
6045
6046 #if !defined(MIDL_PASS)
6047
6048 FORCEINLINE
6049 LUID
6050 NTAPI
6051 RtlConvertLongToLuid(
6052 IN LONG Val)
6053 {
6054 LUID Luid;
6055 LARGE_INTEGER Temp;
6056
6057 Temp.QuadPart = Val;
6058 Luid.LowPart = Temp.u.LowPart;
6059 Luid.HighPart = Temp.u.HighPart;
6060
6061 return Luid;
6062 }
6063
6064 FORCEINLINE
6065 LUID
6066 NTAPI
6067 RtlConvertUlongToLuid(
6068 IN ULONG Val)
6069 {
6070 LUID Luid;
6071
6072 Luid.LowPart = Val;
6073 Luid.HighPart = 0;
6074
6075 return Luid;
6076 }
6077 #endif
6078
6079
6080 NTSYSAPI
6081 VOID
6082 NTAPI
6083 RtlCopyMemory32(
6084 IN VOID UNALIGNED *Destination,
6085 IN CONST VOID UNALIGNED *Source,
6086 IN ULONG Length);
6087
6088 NTSYSAPI
6089 VOID
6090 NTAPI
6091 RtlCopyString(
6092 IN OUT PSTRING DestinationString,
6093 IN PSTRING SourceString OPTIONAL);
6094
6095 NTSYSAPI
6096 BOOLEAN
6097 NTAPI
6098 RtlEqualString(
6099 IN PSTRING String1,
6100 IN PSTRING String2,
6101 IN BOOLEAN CaseInSensitive);
6102
6103 #if (defined(_M_AMD64) || defined(_M_IA64)) && !defined(_REALLY_GET_CALLERS_CALLER_)
6104 #define RtlGetCallersAddress(CallersAddress, CallersCaller) \
6105 *CallersAddress = (PVOID)_ReturnAddress(); \
6106 *CallersCaller = NULL;
6107 #else
6108 NTSYSAPI
6109 VOID
6110 NTAPI
6111 RtlGetCallersAddress(
6112 OUT PVOID *CallersAddress,
6113 OUT PVOID *CallersCaller);
6114 #endif
6115
6116 NTSYSAPI
6117 NTSTATUS
6118 NTAPI
6119 RtlGetVersion(
6120 IN OUT PRTL_OSVERSIONINFOW lpVersionInformation);
6121
6122 NTSYSAPI
6123 VOID
6124 NTAPI
6125 RtlMapGenericMask(
6126 IN OUT PACCESS_MASK AccessMask,
6127 IN PGENERIC_MAPPING GenericMapping);
6128
6129 NTSYSAPI
6130 BOOLEAN
6131 NTAPI
6132 RtlPrefixUnicodeString(
6133 IN PCUNICODE_STRING String1,
6134 IN PCUNICODE_STRING String2,
6135 IN BOOLEAN CaseInSensitive);
6136
6137 NTSYSAPI
6138 NTSTATUS
6139 NTAPI
6140 RtlUpcaseUnicodeString(
6141 IN OUT PUNICODE_STRING DestinationString OPTIONAL,
6142 IN PCUNICODE_STRING SourceString,
6143 IN BOOLEAN AllocateDestinationString);
6144
6145 NTSYSAPI
6146 CHAR
6147 NTAPI
6148 RtlUpperChar(
6149 IN CHAR Character);
6150
6151 NTSYSAPI
6152 VOID
6153 NTAPI
6154 RtlUpperString(
6155 IN OUT PSTRING DestinationString,
6156 IN PSTRING SourceString);
6157
6158 NTSYSAPI
6159 NTSTATUS
6160 NTAPI
6161 RtlVerifyVersionInfo(
6162 IN PRTL_OSVERSIONINFOEXW VersionInfo,
6163 IN ULONG TypeMask,
6164 IN ULONGLONG ConditionMask);
6165
6166 NTSYSAPI
6167 NTSTATUS
6168 NTAPI
6169 RtlVolumeDeviceToDosName(
6170 IN PVOID VolumeDeviceObject,
6171 OUT PUNICODE_STRING DosName);
6172
6173 NTSYSAPI
6174 ULONG
6175 NTAPI
6176 RtlWalkFrameChain(
6177 OUT PVOID *Callers,
6178 IN ULONG Count,
6179 IN ULONG Flags);
6180
6181 NTKERNELAPI
6182 BOOLEAN
6183 NTAPI
6184 KeAreAllApcsDisabled(
6185 VOID
6186 );
6187
6188 /* Guarded Mutex routines */
6189
6190 NTKERNELAPI
6191 VOID
6192 FASTCALL
6193 KeAcquireGuardedMutex(
6194 IN OUT PKGUARDED_MUTEX GuardedMutex
6195 );
6196
6197 NTKERNELAPI
6198 VOID
6199 FASTCALL
6200 KeAcquireGuardedMutexUnsafe(
6201 IN OUT PKGUARDED_MUTEX GuardedMutex
6202 );
6203
6204 NTKERNELAPI
6205 VOID
6206 NTAPI
6207 KeEnterGuardedRegion(
6208 VOID
6209 );
6210
6211 NTKERNELAPI
6212 VOID
6213 NTAPI
6214 KeLeaveGuardedRegion(
6215 VOID
6216 );
6217
6218 NTKERNELAPI
6219 VOID
6220 FASTCALL
6221 KeInitializeGuardedMutex(
6222 OUT PKGUARDED_MUTEX GuardedMutex
6223 );
6224
6225 NTKERNELAPI
6226 VOID
6227 FASTCALL
6228 KeReleaseGuardedMutexUnsafe(
6229 IN OUT PKGUARDED_MUTEX GuardedMutex
6230 );
6231
6232 NTKERNELAPI
6233 VOID
6234 FASTCALL
6235 KeReleaseGuardedMutex(
6236 IN OUT PKGUARDED_MUTEX GuardedMutex
6237 );
6238
6239 NTKERNELAPI
6240 BOOLEAN
6241 FASTCALL
6242 KeTryToAcquireGuardedMutex(
6243 IN OUT PKGUARDED_MUTEX GuardedMutex
6244 );
6245
6246 /* Fast Mutex */
6247 #define ExInitializeFastMutex(_FastMutex) \
6248 { \
6249 (_FastMutex)->Count = FM_LOCK_BIT; \
6250 (_FastMutex)->Owner = NULL; \
6251 (_FastMutex)->Contention = 0; \
6252 KeInitializeEvent(&(_FastMutex)->Gate, SynchronizationEvent, FALSE); \
6253 }
6254
6255 NTKERNELAPI
6256 VOID
6257 NTAPI
6258 KeInitializeEvent(
6259 IN PRKEVENT Event,
6260 IN EVENT_TYPE Type,
6261 IN BOOLEAN State);
6262
6263 /******************************************************************************
6264 * Executive Types *
6265 ******************************************************************************/
6266
6267 typedef struct _ZONE_SEGMENT_HEADER {
6268 SINGLE_LIST_ENTRY SegmentList;
6269 PVOID Reserved;
6270 } ZONE_SEGMENT_HEADER, *PZONE_SEGMENT_HEADER;
6271
6272 typedef struct _ZONE_HEADER {
6273 SINGLE_LIST_ENTRY FreeList;
6274 SINGLE_LIST_ENTRY SegmentList;
6275 ULONG BlockSize;
6276 ULONG TotalSegmentSize;
6277 } ZONE_HEADER, *PZONE_HEADER;
6278
6279 #define PROTECTED_POOL 0x80000000
6280
6281 /******************************************************************************
6282 * Executive Functions *
6283 ******************************************************************************/
6284
6285 NTKERNELAPI
6286 NTSTATUS
6287 NTAPI
6288 ExExtendZone(
6289 IN PZONE_HEADER Zone,
6290 IN PVOID Segment,
6291 IN ULONG SegmentSize);
6292
6293 static __inline PVOID
6294 ExAllocateFromZone(
6295 IN PZONE_HEADER Zone)
6296 {
6297 if (Zone->FreeList.Next)
6298 Zone->FreeList.Next = Zone->FreeList.Next->Next;
6299 return (PVOID) Zone->FreeList.Next;
6300 }
6301
6302 static __inline PVOID
6303 ExFreeToZone(
6304 IN PZONE_HEADER Zone,
6305 IN PVOID Block)
6306 {
6307 ((PSINGLE_LIST_ENTRY) Block)->Next = Zone->FreeList.Next;
6308 Zone->FreeList.Next = ((PSINGLE_LIST_ENTRY) Block);
6309 return ((PSINGLE_LIST_ENTRY) Block)->Next;
6310 }
6311
6312 NTKERNELAPI
6313 NTSTATUS
6314 NTAPI
6315 ExInitializeZone(
6316 IN PZONE_HEADER Zone,
6317 IN ULONG BlockSize,
6318 IN PVOID InitialSegment,
6319 IN ULONG InitialSegmentSize);
6320
6321 /*
6322 * PVOID
6323 * ExInterlockedAllocateFromZone(
6324 * IN PZONE_HEADER Zone,
6325 * IN PKSPIN_LOCK Lock)
6326 */
6327 #define ExInterlockedAllocateFromZone(Zone, Lock) \
6328 ((PVOID) ExInterlockedPopEntryList(&Zone->FreeList, Lock))
6329
6330 NTKERNELAPI
6331 NTSTATUS
6332 NTAPI
6333 ExInterlockedExtendZone(
6334 IN PZONE_HEADER Zone,
6335 IN PVOID Segment,
6336 IN ULONG SegmentSize,
6337 IN PKSPIN_LOCK Lock);
6338
6339 /* PVOID
6340 * ExInterlockedFreeToZone(
6341 * IN PZONE_HEADER Zone,
6342 * IN PVOID Block,
6343 * IN PKSPIN_LOCK Lock);
6344 */
6345 #define ExInterlockedFreeToZone(Zone, Block, Lock) \
6346 ExInterlockedPushEntryList(&(Zone)->FreeList, (PSINGLE_LIST_ENTRY)(Block), Lock)
6347
6348 /*
6349 * VOID
6350 * InitializeSListHead(
6351 * IN PSLIST_HEADER SListHead)
6352 */
6353 #define InitializeSListHead(_SListHead) \
6354 (_SListHead)->Alignment = 0
6355
6356 #define ExInitializeSListHead InitializeSListHead
6357
6358 /*
6359 * BOOLEAN
6360 * ExIsFullZone(
6361 * IN PZONE_HEADER Zone)
6362 */
6363 #define ExIsFullZone(Zone) \
6364 ((Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY) NULL)
6365
6366 /* BOOLEAN
6367 * ExIsObjectInFirstZoneSegment(
6368 * IN PZONE_HEADER Zone,
6369 * IN PVOID Object);
6370 */
6371 #define ExIsObjectInFirstZoneSegment(Zone,Object) \
6372 ((BOOLEAN)( ((PUCHAR)(Object) >= (PUCHAR)(Zone)->SegmentList.Next) && \
6373 ((PUCHAR)(Object) < (PUCHAR)(Zone)->SegmentList.Next + \
6374 (Zone)->TotalSegmentSize)) )
6375
6376 NTKERNELAPI
6377 DECLSPEC_NORETURN
6378 VOID
6379 NTAPI
6380 ExRaiseAccessViolation(
6381 VOID);
6382
6383 NTKERNELAPI
6384 DECLSPEC_NORETURN
6385 VOID
6386 NTAPI
6387 ExRaiseDatatypeMisalignment(
6388 VOID);
6389
6390 NTKERNELAPI
6391 NTSTATUS
6392 NTAPI
6393 ExUuidCreate(
6394 OUT UUID *Uuid);
6395
6396 #define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite
6397 #define ExAcquireResourceShared ExAcquireResourceSharedLite
6398 #define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite
6399 #define ExDeleteResource ExDeleteResourceLite
6400 #define ExInitializeResource ExInitializeResourceLite
6401 #define ExIsResourceAcquiredExclusive ExIsResourceAcquiredExclusiveLite
6402 #define ExIsResourceAcquiredShared ExIsResourceAcquiredSharedLite
6403 #define ExIsResourceAcquired ExIsResourceAcquiredSharedLite
6404 #define ExReleaseResourceForThread ExReleaseResourceForThreadLite
6405
6406
6407 #if DBG
6408
6409 #define PAGED_CODE() { \
6410 if (KeGetCurrentIrql() > APC_LEVEL) { \
6411 KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
6412 ASSERT(FALSE); \
6413 } \
6414 }
6415
6416 #else
6417
6418 #define PAGED_CODE()
6419
6420 #endif
6421
6422 NTKERNELAPI
6423 VOID
6424 NTAPI
6425 ProbeForRead(
6426 IN CONST VOID *Address,
6427 IN SIZE_T Length,
6428 IN ULONG Alignment);
6429
6430 NTKERNELAPI
6431 VOID
6432 NTAPI
6433 ProbeForWrite(
6434 IN PVOID Address,
6435 IN SIZE_T Length,
6436 IN ULONG Alignment);
6437
6438
6439
6440 /** Configuration manager routines **/
6441
6442 NTKERNELAPI
6443 NTSTATUS
6444 NTAPI
6445 CmRegisterCallback(
6446 IN PEX_CALLBACK_FUNCTION Function,
6447 IN PVOID Context,
6448 IN OUT PLARGE_INTEGER Cookie);
6449
6450 NTKERNELAPI
6451 NTSTATUS
6452 NTAPI
6453 CmUnRegisterCallback(
6454 IN LARGE_INTEGER Cookie);
6455
6456
6457
6458 /** Filesystem runtime library routines **/
6459
6460 NTKERNELAPI
6461 BOOLEAN
6462 NTAPI
6463 FsRtlIsTotalDeviceFailure(
6464 IN NTSTATUS Status);
6465
6466
6467
6468 /** Hardware abstraction layer routines **/
6469
6470 NTHALAPI
6471 BOOLEAN
6472 NTAPI
6473 HalMakeBeep(
6474 IN ULONG Frequency);
6475
6476 NTKERNELAPI
6477 VOID
6478 FASTCALL
6479 HalExamineMBR(
6480 IN PDEVICE_OBJECT DeviceObject,
6481 IN ULONG SectorSize,
6482 IN ULONG MBRTypeIdentifier,
6483 OUT PVOID *Buffer);
6484
6485 VOID
6486 NTAPI
6487 HalPutDmaAdapter(
6488 PADAPTER_OBJECT AdapterObject
6489 );
6490
6491
6492 /** Io access routines **/
6493
6494 #if !defined(_M_AMD64)
6495 NTHALAPI
6496 VOID
6497 NTAPI
6498 READ_PORT_BUFFER_UCHAR(
6499 IN PUCHAR Port,
6500 IN PUCHAR Buffer,
6501 IN ULONG Count);
6502
6503 NTHALAPI
6504 VOID
6505 NTAPI
6506 READ_PORT_BUFFER_ULONG(
6507 IN PULONG Port,
6508 IN PULONG Buffer,
6509 IN ULONG Count);
6510
6511 NTHALAPI
6512 VOID
6513 NTAPI
6514 READ_PORT_BUFFER_USHORT(
6515 IN PUSHORT Port,
6516 IN PUSHORT Buffer,
6517 IN ULONG Count);
6518
6519 NTHALAPI
6520 UCHAR
6521 NTAPI
6522 READ_PORT_UCHAR(
6523 IN PUCHAR Port);
6524
6525 NTHALAPI
6526 ULONG
6527 NTAPI
6528 READ_PORT_ULONG(
6529 IN PULONG Port);
6530
6531 NTHALAPI
6532 USHORT
6533 NTAPI
6534 READ_PORT_USHORT(
6535 IN PUSHORT Port);
6536
6537 NTKERNELAPI
6538 VOID
6539 NTAPI
6540 READ_REGISTER_BUFFER_UCHAR(
6541 IN PUCHAR Register,
6542 IN PUCHAR Buffer,
6543 IN ULONG Count);
6544
6545 NTKERNELAPI
6546 VOID
6547 NTAPI
6548 READ_REGISTER_BUFFER_ULONG(
6549 IN PULONG Register,
6550 IN PULONG Buffer,
6551 IN ULONG Count);
6552
6553 NTKERNELAPI
6554 VOID
6555 NTAPI
6556 READ_REGISTER_BUFFER_USHORT(
6557 IN PUSHORT Register,
6558 IN PUSHORT Buffer,
6559 IN ULONG Count);
6560
6561 NTKERNELAPI
6562 UCHAR
6563 NTAPI
6564 READ_REGISTER_UCHAR(
6565 IN PUCHAR Register);
6566
6567 NTKERNELAPI
6568 ULONG
6569 NTAPI
6570 READ_REGISTER_ULONG(
6571 IN PULONG Register);
6572
6573 NTKERNELAPI
6574 USHORT
6575 NTAPI
6576 READ_REGISTER_USHORT(
6577 IN PUSHORT Register);
6578
6579 NTHALAPI
6580 VOID
6581 NTAPI
6582 WRITE_PORT_BUFFER_UCHAR(
6583 IN PUCHAR Port,
6584 IN PUCHAR Buffer,
6585 IN ULONG Count);
6586
6587 NTHALAPI
6588 VOID
6589 NTAPI
6590 WRITE_PORT_BUFFER_ULONG(
6591 IN PULONG Port,
6592 IN PULONG Buffer,
6593 IN ULONG Count);
6594
6595 NTHALAPI
6596 VOID
6597 NTAPI
6598 WRITE_PORT_BUFFER_USHORT(
6599 IN PUSHORT Port,
6600 IN PUSHORT Buffer,
6601 IN ULONG Count);
6602
6603 NTHALAPI
6604 VOID
6605 NTAPI
6606 WRITE_PORT_UCHAR(
6607 IN PUCHAR Port,
6608 IN UCHAR Value);
6609
6610 NTHALAPI
6611 VOID
6612 NTAPI
6613 WRITE_PORT_ULONG(
6614 IN PULONG Port,
6615 IN ULONG Value);
6616
6617 NTHALAPI
6618 VOID
6619 NTAPI
6620 WRITE_PORT_USHORT(
6621 IN PUSHORT Port,
6622 IN USHORT Value);
6623
6624 NTKERNELAPI
6625 VOID
6626 NTAPI
6627 WRITE_REGISTER_BUFFER_UCHAR(
6628 IN PUCHAR Register,
6629 IN PUCHAR Buffer,
6630 IN ULONG Count);
6631
6632 NTKERNELAPI
6633 VOID
6634 NTAPI
6635 WRITE_REGISTER_BUFFER_ULONG(
6636 IN PULONG Register,
6637 IN PULONG Buffer,
6638 IN ULONG Count);
6639
6640 NTKERNELAPI
6641 VOID
6642 NTAPI
6643 WRITE_REGISTER_BUFFER_USHORT(
6644 IN PUSHORT Register,
6645 IN PUSHORT Buffer,
6646 IN ULONG Count);
6647
6648 NTKERNELAPI
6649 VOID
6650 NTAPI
6651 WRITE_REGISTER_UCHAR(
6652 IN PUCHAR Register,
6653 IN UCHAR Value);
6654
6655 NTKERNELAPI
6656 VOID
6657 NTAPI
6658 WRITE_REGISTER_ULONG(
6659 IN PULONG Register,
6660 IN ULONG Value);
6661
6662 NTKERNELAPI
6663 VOID
6664 NTAPI
6665 WRITE_REGISTER_USHORT(
6666 IN PUSHORT Register,
6667 IN USHORT Value);
6668
6669 #else
6670
6671 FORCEINLINE
6672 VOID
6673 READ_PORT_BUFFER_UCHAR(
6674 IN PUCHAR Port,
6675 IN PUCHAR Buffer,
6676 IN ULONG Count)
6677 {
6678 __inbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
6679 }
6680
6681 FORCEINLINE
6682 VOID
6683 READ_PORT_BUFFER_ULONG(
6684 IN PULONG Port,
6685 IN PULONG Buffer,
6686 IN ULONG Count)
6687 {
6688 __indwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
6689 }
6690
6691 FORCEINLINE
6692 VOID
6693 READ_PORT_BUFFER_USHORT(
6694 IN PUSHORT Port,
6695 IN PUSHORT Buffer,
6696 IN ULONG Count)
6697 {
6698 __inwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
6699 }
6700
6701 FORCEINLINE
6702 UCHAR
6703 READ_PORT_UCHAR(
6704 IN PUCHAR Port)
6705 {
6706 return __inbyte((USHORT)(ULONG_PTR)Port);
6707 }
6708
6709 FORCEINLINE
6710 ULONG
6711 READ_PORT_ULONG(
6712 IN PULONG Port)
6713 {
6714 return __indword((USHORT)(ULONG_PTR)Port);
6715 }
6716
6717 FORCEINLINE
6718 USHORT
6719 READ_PORT_USHORT(
6720 IN PUSHORT Port)
6721 {
6722 return __inword((USHORT)(ULONG_PTR)Port);
6723 }
6724
6725 FORCEINLINE
6726 VOID
6727 READ_REGISTER_BUFFER_UCHAR(
6728 IN PUCHAR Register,
6729 IN PUCHAR Buffer,
6730 IN ULONG Count)
6731 {
6732 __movsb(Register, Buffer, Count);
6733 }
6734
6735 FORCEINLINE
6736 VOID
6737 READ_REGISTER_BUFFER_ULONG(
6738 IN PULONG Register,
6739 IN PULONG Buffer,
6740 IN ULONG Count)
6741 {
6742 __movsd(Register, Buffer, Count);
6743 }
6744
6745 FORCEINLINE
6746 VOID
6747 READ_REGISTER_BUFFER_USHORT(
6748 IN PUSHORT Register,
6749 IN PUSHORT Buffer,
6750 IN ULONG Count)
6751 {
6752 __movsw(Register, Buffer, Count);
6753 }
6754
6755 FORCEINLINE
6756 UCHAR
6757 READ_REGISTER_UCHAR(
6758 IN PUCHAR Register)
6759 {
6760 return *Register;
6761 }
6762
6763 FORCEINLINE
6764 ULONG
6765 READ_REGISTER_ULONG(
6766 IN PULONG Register)
6767 {
6768 return *Register;
6769 }
6770
6771 FORCEINLINE
6772 USHORT
6773 READ_REGISTER_USHORT(
6774 IN PUSHORT Register)
6775 {
6776 return *Register;
6777 }
6778
6779 FORCEINLINE
6780 VOID
6781 WRITE_PORT_BUFFER_UCHAR(
6782 IN PUCHAR Port,
6783 IN PUCHAR Buffer,
6784 IN ULONG Count)
6785 {
6786 __outbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
6787 }
6788
6789 FORCEINLINE
6790 VOID
6791 WRITE_PORT_BUFFER_ULONG(
6792 IN PULONG Port,
6793 IN PULONG Buffer,
6794 IN ULONG Count)
6795 {
6796 __outdwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
6797 }
6798
6799 FORCEINLINE
6800 VOID
6801 WRITE_PORT_BUFFER_USHORT(
6802 IN PUSHORT Port,
6803 IN PUSHORT Buffer,
6804 IN ULONG Count)
6805 {
6806 __outwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
6807 }
6808
6809 FORCEINLINE
6810 VOID
6811 WRITE_PORT_UCHAR(
6812 IN PUCHAR Port,
6813 IN UCHAR Value)
6814 {
6815 __outbyte((USHORT)(ULONG_PTR)Port, Value);
6816 }
6817
6818 FORCEINLINE
6819 VOID
6820 WRITE_PORT_ULONG(
6821 IN PULONG Port,
6822 IN ULONG Value)
6823 {
6824 __outdword((USHORT)(ULONG_PTR)Port, Value);
6825 }
6826
6827 FORCEINLINE
6828 VOID
6829 WRITE_PORT_USHORT(
6830 IN PUSHORT Port,
6831 IN USHORT Value)
6832 {
6833 __outword((USHORT)(ULONG_PTR)Port, Value);
6834 }
6835
6836 FORCEINLINE
6837 VOID
6838 WRITE_REGISTER_BUFFER_UCHAR(
6839 IN PUCHAR Register,
6840 IN PUCHAR Buffer,
6841 IN ULONG Count)
6842 {
6843 LONG Synch;
6844 __movsb(Register, Buffer, Count);
6845 InterlockedOr(&Synch, 1);
6846 }
6847
6848 FORCEINLINE
6849 VOID
6850 WRITE_REGISTER_BUFFER_ULONG(
6851 IN PULONG Register,
6852 IN PULONG Buffer,
6853 IN ULONG Count)
6854 {
6855 LONG Synch;
6856 __movsd(Register, Buffer, Count);
6857 InterlockedOr(&Synch, 1);
6858 }
6859
6860 FORCEINLINE
6861 VOID
6862 WRITE_REGISTER_BUFFER_USHORT(
6863 IN PUSHORT Register,
6864 IN PUSHORT Buffer,
6865 IN ULONG Count)
6866 {
6867 LONG Synch;
6868 __movsw(Register, Buffer, Count);
6869 InterlockedOr(&Synch, 1);
6870 }
6871
6872 FORCEINLINE
6873 VOID
6874 WRITE_REGISTER_UCHAR(
6875 IN PUCHAR Register,
6876 IN UCHAR Value)
6877 {
6878 LONG Synch;
6879 *Register = Value;
6880 InterlockedOr(&Synch, 1);
6881 }
6882
6883 FORCEINLINE
6884 VOID
6885 WRITE_REGISTER_ULONG(
6886 IN PULONG Register,
6887 IN ULONG Value)
6888 {
6889 LONG Synch;
6890 *Register = Value;
6891 InterlockedOr(&Synch, 1);
6892 }
6893
6894 FORCEINLINE
6895 VOID
6896 WRITE_REGISTER_USHORT(
6897 IN PUSHORT Register,
6898 IN USHORT Value)
6899 {
6900 LONG Sync;
6901 *Register = Value;
6902 InterlockedOr(&Sync, 1);
6903 }
6904
6905 #endif
6906
6907 /** I/O manager routines **/
6908
6909 NTKERNELAPI
6910 VOID
6911 NTAPI
6912 IoAcquireCancelSpinLock(
6913 OUT PKIRQL Irql);
6914
6915 NTKERNELAPI
6916 NTSTATUS
6917 NTAPI
6918 IoAcquireRemoveLockEx(
6919 IN PIO_REMOVE_LOCK RemoveLock,
6920 IN OPTIONAL PVOID Tag OPTIONAL,
6921 IN PCSTR File,
6922 IN ULONG Line,
6923 IN ULONG RemlockSize);
6924
6925 /*
6926 * NTSTATUS
6927 * IoAcquireRemoveLock(
6928 * IN PIO_REMOVE_LOCK RemoveLock,
6929 * IN OPTIONAL PVOID Tag)
6930 */
6931 #define IoAcquireRemoveLock(_RemoveLock, \
6932 _Tag) \
6933 IoAcquireRemoveLockEx(_RemoveLock, _Tag, __FILE__, __LINE__, sizeof(IO_REMOVE_LOCK))
6934
6935 /*
6936 * VOID
6937 * IoAdjustPagingPathCount(
6938 * IN PLONG Count,
6939 * IN BOOLEAN Increment)
6940 */
6941 #define IoAdjustPagingPathCount(_Count, \
6942 _Increment) \
6943 { \
6944 if (_Increment) \
6945 { \
6946 InterlockedIncrement(_Count); \
6947 } \
6948 else \
6949 { \
6950 InterlockedDecrement(_Count); \
6951 } \
6952 }
6953
6954 #ifndef DMA_MACROS_DEFINED
6955 NTKERNELAPI
6956 NTSTATUS
6957 NTAPI
6958 IoAllocateAdapterChannel(
6959 IN PADAPTER_OBJECT AdapterObject,
6960 IN PDEVICE_OBJECT DeviceObject,
6961 IN ULONG NumberOfMapRegisters,
6962 IN PDRIVER_CONTROL ExecutionRoutine,
6963 IN PVOID Context);
6964 #endif
6965
6966 NTKERNELAPI
6967 VOID
6968 NTAPI
6969 IoAllocateController(
6970 IN PCONTROLLER_OBJECT ControllerObject,
6971 IN PDEVICE_OBJECT DeviceObject,
6972 IN PDRIVER_CONTROL ExecutionRoutine,
6973 IN PVOID Context);
6974
6975 NTKERNELAPI
6976 NTSTATUS
6977 NTAPI
6978 IoAllocateDriverObjectExtension(
6979 IN PDRIVER_OBJECT DriverObject,
6980 IN PVOID ClientIdentificationAddress,
6981 IN ULONG DriverObjectExtensionSize,
6982 OUT PVOID *DriverObjectExtension);
6983
6984 NTKERNELAPI
6985 PVOID
6986 NTAPI
6987 IoAllocateErrorLogEntry(
6988 IN PVOID IoObject,
6989 IN UCHAR EntrySize);
6990
6991 NTKERNELAPI
6992 PIRP
6993 NTAPI
6994 IoAllocateIrp(
6995 IN CCHAR StackSize,
6996 IN BOOLEAN ChargeQuota);
6997
6998 NTKERNELAPI
6999 PMDL
7000 NTAPI
7001 IoAllocateMdl(
7002 IN PVOID VirtualAddress,
7003 IN ULONG Length,
7004 IN BOOLEAN SecondaryBuffer,
7005 IN BOOLEAN ChargeQuota,
7006 IN OUT PIRP Irp OPTIONAL);
7007
7008 NTKERNELAPI
7009 PIO_WORKITEM
7010 NTAPI
7011 IoAllocateWorkItem(
7012 IN PDEVICE_OBJECT DeviceObject);
7013
7014 /*
7015 * VOID IoAssignArcName(
7016 * IN PUNICODE_STRING ArcName,
7017 * IN PUNICODE_STRING DeviceName);
7018 */
7019 #define IoAssignArcName(_ArcName, _DeviceName) ( \
7020 IoCreateSymbolicLink((_ArcName), (_DeviceName)))
7021
7022 NTKERNELAPI
7023 NTSTATUS
7024 NTAPI
7025 IoAttachDevice(
7026 IN PDEVICE_OBJECT SourceDevice,
7027 IN PUNICODE_STRING TargetDevice,
7028 OUT PDEVICE_OBJECT *AttachedDevice);
7029
7030 NTKERNELAPI
7031 PDEVICE_OBJECT
7032 NTAPI
7033 IoAttachDeviceToDeviceStack(
7034 IN PDEVICE_OBJECT SourceDevice,
7035 IN PDEVICE_OBJECT TargetDevice);
7036
7037 NTKERNELAPI
7038 PIRP
7039 NTAPI
7040 IoBuildAsynchronousFsdRequest(
7041 IN ULONG MajorFunction,
7042 IN PDEVICE_OBJECT DeviceObject,
7043 IN OUT PVOID Buffer OPTIONAL,
7044 IN ULONG Length OPTIONAL,
7045 IN PLARGE_INTEGER StartingOffset OPTIONAL,
7046 IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL);
7047
7048 NTKERNELAPI
7049 PIRP
7050 NTAPI
7051 IoBuildDeviceIoControlRequest(
7052 IN ULONG IoControlCode,
7053 IN PDEVICE_OBJECT DeviceObject,
7054 IN PVOID InputBuffer OPTIONAL,
7055 IN ULONG InputBufferLength,
7056 OUT PVOID OutputBuffer OPTIONAL,
7057 IN ULONG OutputBufferLength,
7058 IN BOOLEAN InternalDeviceIoControl,
7059 IN PKEVENT Event,
7060 OUT PIO_STATUS_BLOCK IoStatusBlock);
7061
7062 NTKERNELAPI
7063 VOID
7064 NTAPI
7065 IoBuildPartialMdl(
7066 IN PMDL SourceMdl,
7067 IN OUT PMDL TargetMdl,
7068 IN PVOID VirtualAddress,
7069 IN ULONG Length);
7070
7071 NTKERNELAPI
7072 PIRP
7073 NTAPI
7074 IoBuildSynchronousFsdRequest(
7075 IN ULONG MajorFunction,
7076 IN PDEVICE_OBJECT DeviceObject,
7077 IN OUT PVOID Buffer OPTIONAL,
7078 IN ULONG Length OPTIONAL,
7079 IN PLARGE_INTEGER StartingOffset OPTIONAL,
7080 IN PKEVENT Event,
7081 OUT PIO_STATUS_BLOCK IoStatusBlock);
7082
7083 NTKERNELAPI
7084 NTSTATUS
7085 FASTCALL
7086 IofCallDriver(
7087 IN PDEVICE_OBJECT DeviceObject,
7088 IN OUT PIRP Irp);
7089
7090 /*
7091 * NTSTATUS
7092 * IoCallDriver(
7093 * IN PDEVICE_OBJECT DeviceObject,
7094 * IN OUT PIRP Irp)
7095 */
7096 #define IoCallDriver IofCallDriver
7097
7098 NTKERNELAPI
7099 VOID
7100 NTAPI
7101 IoCancelFileOpen(
7102 IN PDEVICE_OBJECT DeviceObject,
7103 IN PFILE_OBJECT FileObject);
7104
7105 NTKERNELAPI
7106 BOOLEAN
7107 NTAPI
7108 IoCancelIrp(
7109 IN PIRP Irp);
7110
7111 NTKERNELAPI
7112 NTSTATUS
7113 NTAPI
7114 IoCheckShareAccess(
7115 IN ACCESS_MASK DesiredAccess,
7116 IN ULONG DesiredShareAccess,
7117 IN OUT PFILE_OBJECT FileObject,
7118 IN OUT PSHARE_ACCESS ShareAccess,
7119 IN BOOLEAN Update);
7120
7121 NTKERNELAPI
7122 VOID
7123 FASTCALL
7124 IofCompleteRequest(
7125 IN PIRP Irp,
7126 IN CCHAR PriorityBoost);
7127
7128 /*
7129 * VOID
7130 * IoCompleteRequest(
7131 * IN PIRP Irp,
7132 * IN CCHAR PriorityBoost)
7133 */
7134 #define IoCompleteRequest IofCompleteRequest
7135
7136 NTKERNELAPI
7137 NTSTATUS
7138 NTAPI
7139 IoConnectInterrupt(
7140 OUT PKINTERRUPT *InterruptObject,
7141 IN PKSERVICE_ROUTINE ServiceRoutine,
7142 IN PVOID ServiceContext,
7143 IN PKSPIN_LOCK SpinLock OPTIONAL,
7144 IN ULONG Vector,
7145 IN KIRQL Irql,
7146 IN KIRQL SynchronizeIrql,
7147 IN KINTERRUPT_MODE InterruptMode,
7148 IN BOOLEAN ShareVector,
7149 IN KAFFINITY ProcessorEnableMask,
7150 IN BOOLEAN FloatingSave);
7151
7152 /*
7153 * PIO_STACK_LOCATION
7154 * IoGetCurrentIrpStackLocation(
7155 * IN PIRP Irp)
7156 */
7157 #define IoGetCurrentIrpStackLocation(_Irp) \
7158 ((_Irp)->Tail.Overlay.CurrentStackLocation)
7159
7160 /*
7161 * PIO_STACK_LOCATION
7162 * IoGetNextIrpStackLocation(
7163 * IN PIRP Irp)
7164 */
7165 #define IoGetNextIrpStackLocation(_Irp) \
7166 ((_Irp)->Tail.Overlay.CurrentStackLocation - 1)
7167
7168 /*
7169 * VOID
7170 * IoCopyCurrentIrpStackLocationToNext(
7171 * IN PIRP Irp)
7172 */
7173 #define IoCopyCurrentIrpStackLocationToNext(_Irp) \
7174 { \
7175 PIO_STACK_LOCATION _IrpSp; \
7176 PIO_STACK_LOCATION _NextIrpSp; \
7177 _IrpSp = IoGetCurrentIrpStackLocation(_Irp); \
7178 _NextIrpSp = IoGetNextIrpStackLocation(_Irp); \
7179 RtlCopyMemory(_NextIrpSp, _IrpSp, \
7180 FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine)); \
7181 _NextIrpSp->Control = 0; \
7182 }
7183
7184 NTKERNELAPI
7185 PCONTROLLER_OBJECT
7186 NTAPI
7187 IoCreateController(
7188 IN ULONG Size);
7189
7190 NTKERNELAPI
7191 NTSTATUS
7192 NTAPI
7193 IoCreateDevice(
7194 IN PDRIVER_OBJECT DriverObject,
7195 IN ULONG DeviceExtensionSize,
7196 IN PUNICODE_STRING DeviceName OPTIONAL,
7197 IN DEVICE_TYPE DeviceType,
7198 IN ULONG DeviceCharacteristics,
7199 IN BOOLEAN Exclusive,
7200 OUT PDEVICE_OBJECT *DeviceObject);
7201
7202 NTKERNELAPI
7203 NTSTATUS
7204 NTAPI
7205 IoCreateDisk(
7206 IN PDEVICE_OBJECT DeviceObject,
7207 IN PCREATE_DISK Disk);
7208
7209 NTKERNELAPI
7210 NTSTATUS
7211 NTAPI
7212 IoCreateFile(
7213 OUT PHANDLE FileHandle,
7214 IN ACCESS_MASK DesiredAccess,
7215 IN POBJECT_ATTRIBUTES ObjectAttributes,
7216 OUT PIO_STATUS_BLOCK IoStatusBlock,
7217 IN PLARGE_INTEGER AllocationSize OPTIONAL,
7218 IN ULONG FileAttributes,
7219 IN ULONG ShareAccess,
7220 IN ULONG Disposition,
7221 IN ULONG CreateOptions,
7222 IN PVOID EaBuffer OPTIONAL,
7223 IN ULONG EaLength,
7224 IN CREATE_FILE_TYPE CreateFileType,
7225 IN PVOID ExtraCreateParameters OPTIONAL,
7226 IN ULONG Options);
7227
7228 NTKERNELAPI
7229 PKEVENT
7230 NTAPI
7231 IoCreateNotificationEvent(
7232 IN PUNICODE_STRING EventName,
7233 OUT PHANDLE EventHandle);
7234
7235 NTKERNELAPI
7236 NTSTATUS
7237 NTAPI
7238 IoCreateSymbolicLink(
7239 IN PUNICODE_STRING SymbolicLinkName,
7240 IN PUNICODE_STRING DeviceName);
7241
7242 NTKERNELAPI
7243 PKEVENT
7244 NTAPI
7245 IoCreateSynchronizationEvent(
7246 IN PUNICODE_STRING EventName,
7247 OUT PHANDLE EventHandle);
7248
7249 NTKERNELAPI
7250 NTSTATUS
7251 NTAPI
7252 IoCreateUnprotectedSymbolicLink(
7253 IN PUNICODE_STRING SymbolicLinkName,
7254 IN PUNICODE_STRING DeviceName);
7255
7256 NTKERNELAPI
7257 NTSTATUS
7258 NTAPI
7259 IoCsqInitialize(
7260 PIO_CSQ Csq,
7261 IN PIO_CSQ_INSERT_IRP CsqInsertIrp,
7262 IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
7263 IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
7264 IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
7265 IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
7266 IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp);
7267
7268 NTKERNELAPI
7269 VOID
7270 NTAPI
7271 IoCsqInsertIrp(
7272 IN PIO_CSQ Csq,
7273 IN PIRP Irp,
7274 IN PIO_CSQ_IRP_CONTEXT Context);
7275
7276 NTKERNELAPI
7277 PIRP
7278 NTAPI
7279 IoCsqRemoveIrp(
7280 IN PIO_CSQ Csq,
7281 IN PIO_CSQ_IRP_CONTEXT Context);
7282
7283 NTKERNELAPI
7284 PIRP
7285 NTAPI
7286 IoCsqRemoveNextIrp(
7287 IN PIO_CSQ Csq,
7288 IN PVOID PeekContext);
7289
7290 NTKERNELAPI
7291 VOID
7292 NTAPI
7293 IoDeleteController(
7294 IN PCONTROLLER_OBJECT ControllerObject);
7295
7296 NTKERNELAPI
7297 VOID
7298 NTAPI
7299 IoDeleteDevice(
7300 IN PDEVICE_OBJECT DeviceObject);
7301
7302 NTKERNELAPI
7303 NTSTATUS
7304 NTAPI
7305 IoDeleteSymbolicLink(
7306 IN PUNICODE_STRING SymbolicLinkName);
7307
7308 /*
7309 * VOID
7310 * IoDeassignArcName(
7311 * IN PUNICODE_STRING ArcName)
7312 */
7313 #define IoDeassignArcName IoDeleteSymbolicLink
7314
7315 NTKERNELAPI
7316 VOID
7317 NTAPI
7318 IoDetachDevice(
7319 IN OUT PDEVICE_OBJECT TargetDevice);
7320
7321 NTKERNELAPI
7322 VOID
7323 NTAPI
7324 IoDisconnectInterrupt(
7325 IN PKINTERRUPT InterruptObject);
7326
7327 NTKERNELAPI
7328 BOOLEAN
7329 NTAPI
7330 IoForwardIrpSynchronously(
7331 IN PDEVICE_OBJECT DeviceObject,
7332 IN PIRP Irp);
7333
7334 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
7335
7336 NTKERNELAPI
7337 VOID
7338 NTAPI
7339 IoFreeController(
7340 IN PCONTROLLER_OBJECT ControllerObject);
7341
7342 NTKERNELAPI
7343 VOID
7344 NTAPI
7345 IoFreeErrorLogEntry(
7346 PVOID ElEntry);
7347
7348 NTKERNELAPI
7349 VOID
7350 NTAPI
7351 IoFreeIrp(
7352 IN PIRP Irp);
7353
7354 NTKERNELAPI
7355 VOID
7356 NTAPI
7357 IoFreeMdl(
7358 IN PMDL Mdl);
7359
7360 NTKERNELAPI
7361 VOID
7362 NTAPI
7363 IoFreeWorkItem(
7364 IN PIO_WORKITEM pIOWorkItem);
7365
7366 NTKERNELAPI
7367 PDEVICE_OBJECT
7368 NTAPI
7369 IoGetAttachedDevice(
7370 IN PDEVICE_OBJECT DeviceObject);
7371
7372 NTKERNELAPI
7373 PDEVICE_OBJECT
7374 NTAPI
7375 IoGetAttachedDeviceReference(
7376 IN PDEVICE_OBJECT DeviceObject);
7377
7378 NTKERNELAPI
7379 NTSTATUS
7380 NTAPI
7381 IoGetBootDiskInformation(
7382 IN OUT PBOOTDISK_INFORMATION BootDiskInformation,
7383 IN ULONG Size);
7384
7385 NTKERNELAPI
7386 PCONFIGURATION_INFORMATION
7387 NTAPI
7388 IoGetConfigurationInformation(
7389 VOID);
7390
7391 NTKERNELAPI
7392 PEPROCESS
7393 NTAPI
7394 IoGetCurrentProcess(
7395 VOID);
7396
7397 NTKERNELAPI
7398 NTSTATUS
7399 NTAPI
7400 IoGetDeviceInterfaceAlias(
7401 IN PUNICODE_STRING SymbolicLinkName,
7402 IN CONST GUID *AliasInterfaceClassGuid,
7403 OUT PUNICODE_STRING AliasSymbolicLinkName);
7404
7405 #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
7406
7407 NTKERNELAPI
7408 NTSTATUS
7409 NTAPI
7410 IoGetDeviceInterfaces(
7411 IN CONST GUID *InterfaceClassGuid,
7412 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
7413 IN ULONG Flags,
7414 OUT PWSTR *SymbolicLinkList);
7415
7416 NTKERNELAPI
7417 NTSTATUS
7418 NTAPI
7419 IoGetDeviceObjectPointer(
7420 IN PUNICODE_STRING ObjectName,
7421 IN ACCESS_MASK DesiredAccess,
7422 OUT PFILE_OBJECT *FileObject,
7423 OUT PDEVICE_OBJECT *DeviceObject);
7424
7425 NTKERNELAPI
7426 NTSTATUS
7427 NTAPI
7428 IoGetDeviceProperty(
7429 IN PDEVICE_OBJECT DeviceObject,
7430 IN DEVICE_REGISTRY_PROPERTY DeviceProperty,
7431 IN ULONG BufferLength,
7432 OUT PVOID PropertyBuffer,
7433 OUT PULONG ResultLength);
7434
7435 NTKERNELAPI
7436 PDEVICE_OBJECT
7437 NTAPI
7438 IoGetDeviceToVerify(
7439 IN PETHREAD Thread);
7440
7441 NTKERNELAPI
7442 PDMA_ADAPTER
7443 NTAPI
7444 IoGetDmaAdapter(
7445 IN PDEVICE_OBJECT PhysicalDeviceObject,
7446 IN PDEVICE_DESCRIPTION DeviceDescription,
7447 IN OUT PULONG NumberOfMapRegisters);
7448
7449 NTKERNELAPI
7450 PVOID
7451 NTAPI
7452 IoGetDriverObjectExtension(
7453 IN PDRIVER_OBJECT DriverObject,
7454 IN PVOID ClientIdentificationAddress);
7455
7456 NTKERNELAPI
7457 PGENERIC_MAPPING
7458 NTAPI
7459 IoGetFileObjectGenericMapping(
7460 VOID);
7461
7462 /*
7463 * ULONG
7464 * IoGetFunctionCodeFromCtlCode(
7465 * IN ULONG ControlCode)
7466 */
7467 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
7468 (((_ControlCode) >> 2) & 0x00000FFF)
7469
7470 NTKERNELAPI
7471 PVOID
7472 NTAPI
7473 IoGetInitialStack(
7474 VOID);
7475
7476 NTKERNELAPI
7477 PDEVICE_OBJECT
7478 NTAPI
7479 IoGetRelatedDeviceObject(
7480 IN PFILE_OBJECT FileObject);
7481
7482 NTKERNELAPI
7483 VOID
7484 NTAPI
7485 IoGetStackLimits(
7486 OUT PULONG_PTR LowLimit,
7487 OUT PULONG_PTR HighLimit);
7488
7489 FORCEINLINE
7490 ULONG_PTR
7491 IoGetRemainingStackSize(
7492 VOID
7493 )
7494 {
7495 ULONG_PTR End, Begin;
7496 ULONG_PTR Result;
7497
7498 IoGetStackLimits(&Begin, &End);
7499 Result = (ULONG_PTR)(&End) - Begin;
7500 return Result;
7501 }
7502
7503 NTKERNELAPI
7504 VOID
7505 NTAPI
7506 KeInitializeDpc(
7507 IN PRKDPC Dpc,
7508 IN PKDEFERRED_ROUTINE DeferredRoutine,
7509 IN PVOID DeferredContext);
7510
7511 /*
7512 * VOID
7513 * IoInitializeDpcRequest(
7514 * IN PDEVICE_OBJECT DeviceObject,
7515 * IN PIO_DPC_ROUTINE DpcRoutine)
7516 */
7517 #define IoInitializeDpcRequest(_DeviceObject, \
7518 _DpcRoutine) \
7519 KeInitializeDpc(&(_DeviceObject)->Dpc, \
7520 (PKDEFERRED_ROUTINE) (_DpcRoutine), \
7521 _DeviceObject)
7522
7523 NTKERNELAPI
7524 VOID
7525 NTAPI
7526 IoInitializeIrp(
7527 IN OUT PIRP Irp,
7528 IN USHORT PacketSize,
7529 IN CCHAR StackSize);
7530
7531 NTKERNELAPI
7532 VOID
7533 NTAPI
7534 IoInitializeRemoveLockEx(
7535 IN PIO_REMOVE_LOCK Lock,
7536 IN ULONG AllocateTag,
7537 IN ULONG MaxLockedMinutes,
7538 IN ULONG HighWatermark,
7539 IN ULONG RemlockSize);
7540
7541 /* VOID
7542 * IoInitializeRemoveLock(
7543 * IN PIO_REMOVE_LOCK Lock,
7544 * IN ULONG AllocateTag,
7545 * IN ULONG MaxLockedMinutes,
7546 * IN ULONG HighWatermark)
7547 */
7548 #define IoInitializeRemoveLock( \
7549 Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
7550 IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
7551 HighWatermark, sizeof(IO_REMOVE_LOCK))
7552
7553 NTKERNELAPI
7554 NTSTATUS
7555 NTAPI
7556 IoInitializeTimer(
7557 IN PDEVICE_OBJECT DeviceObject,
7558 IN PIO_TIMER_ROUTINE TimerRoutine,
7559 IN PVOID Context);
7560
7561 NTKERNELAPI
7562 VOID
7563 NTAPI
7564 IoInvalidateDeviceRelations(
7565 IN PDEVICE_OBJECT DeviceObject,
7566 IN DEVICE_RELATION_TYPE Type);
7567
7568 NTKERNELAPI
7569 VOID
7570 NTAPI
7571 IoInvalidateDeviceState(
7572 IN PDEVICE_OBJECT PhysicalDeviceObject);
7573
7574 NTKERNELAPI
7575 BOOLEAN
7576 NTAPI
7577 IoIs32bitProcess(
7578 IN PIRP Irp OPTIONAL);
7579
7580 /*
7581 * BOOLEAN
7582 * IoIsErrorUserInduced(
7583 * IN NTSTATUS Status);
7584 */
7585 #define IoIsErrorUserInduced(Status) \
7586 ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
7587 ((Status) == STATUS_IO_TIMEOUT) || \
7588 ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
7589 ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
7590 ((Status) == STATUS_VERIFY_REQUIRED) || \
7591 ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
7592 ((Status) == STATUS_WRONG_VOLUME)))
7593
7594 NTKERNELAPI
7595 BOOLEAN
7596 NTAPI
7597 IoIsWdmVersionAvailable(
7598 IN UCHAR MajorVersion,
7599 IN UCHAR MinorVersion);
7600
7601 NTKERNELAPI
7602 PIRP
7603 NTAPI
7604 IoMakeAssociatedIrp(
7605 IN PIRP Irp,
7606 IN CCHAR StackSize);
7607
7608 /*
7609 * VOID
7610 * IoMarkIrpPending(
7611 * IN OUT PIRP Irp)
7612 */
7613 #define IoMarkIrpPending(_Irp) \
7614 (IoGetCurrentIrpStackLocation(_Irp)->Control |= SL_PENDING_RETURNED)
7615
7616 NTKERNELAPI
7617 NTSTATUS
7618 NTAPI
7619 IoOpenDeviceInterfaceRegistryKey(
7620 IN PUNICODE_STRING SymbolicLinkName,
7621 IN ACCESS_MASK DesiredAccess,
7622 OUT PHANDLE DeviceInterfaceKey);
7623
7624 #define PLUGPLAY_REGKEY_DEVICE 1
7625 #define PLUGPLAY_REGKEY_DRIVER 2
7626 #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4
7627
7628 NTKERNELAPI
7629 NTSTATUS
7630 NTAPI
7631 IoOpenDeviceRegistryKey(
7632 IN PDEVICE_OBJECT DeviceObject,
7633 IN ULONG DevInstKeyType,
7634 IN ACCESS_MASK DesiredAccess,
7635 OUT PHANDLE DevInstRegKey);
7636
7637 NTKERNELAPI
7638 NTSTATUS
7639 NTAPI
7640 IoQueryDeviceDescription(
7641 IN PINTERFACE_TYPE BusType OPTIONAL,
7642 IN PULONG BusNumber OPTIONAL,
7643 IN PCONFIGURATION_TYPE ControllerType OPTIONAL,
7644 IN PULONG ControllerNumber OPTIONAL,
7645 IN PCONFIGURATION_TYPE PeripheralType OPTIONAL,
7646 IN PULONG PeripheralNumber OPTIONAL,
7647 IN PIO_QUERY_DEVICE_ROUTINE CalloutRoutine,
7648 IN PVOID Context);
7649
7650 NTKERNELAPI
7651 VOID
7652 NTAPI
7653 IoQueueWorkItem(
7654 IN PIO_WORKITEM pIOWorkItem,
7655 IN PIO_WORKITEM_ROUTINE Routine,
7656 IN WORK_QUEUE_TYPE QueueType,
7657 IN PVOID Context);
7658
7659 NTKERNELAPI
7660 VOID
7661 NTAPI
7662 IoRaiseHardError(
7663 IN PIRP Irp,
7664 IN PVPB Vpb OPTIONAL,
7665 IN PDEVICE_OBJECT RealDeviceObject);
7666
7667 NTKERNELAPI
7668 BOOLEAN
7669 NTAPI
7670 IoRaiseInformationalHardError(
7671 IN NTSTATUS ErrorStatus,
7672 IN PUNICODE_STRING String OPTIONAL,
7673 IN PKTHREAD Thread OPTIONAL);
7674
7675 NTKERNELAPI
7676 NTSTATUS
7677 NTAPI
7678 IoReadDiskSignature(
7679 IN PDEVICE_OBJECT DeviceObject,
7680 IN ULONG BytesPerSector,
7681 OUT PDISK_SIGNATURE Signature);
7682
7683 NTKERNELAPI
7684 NTSTATUS
7685 FASTCALL
7686 IoReadPartitionTable(
7687 IN PDEVICE_OBJECT DeviceObject,
7688 IN ULONG SectorSize,
7689 IN BOOLEAN ReturnRecognizedPartitions,
7690 OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer);
7691
7692 NTKERNELAPI
7693 NTSTATUS
7694 NTAPI
7695 IoReadPartitionTableEx(
7696 IN PDEVICE_OBJECT DeviceObject,
7697 IN struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer);
7698
7699 NTKERNELAPI
7700 VOID
7701 NTAPI
7702 IoRegisterBootDriverReinitialization(
7703 IN PDRIVER_OBJECT DriverObject,
7704 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
7705 IN PVOID Context);
7706
7707 NTKERNELAPI
7708 VOID
7709 NTAPI
7710 IoRegisterBootDriverReinitialization(
7711 IN PDRIVER_OBJECT DriverObject,
7712 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
7713 IN PVOID Context);
7714
7715 NTKERNELAPI
7716 NTSTATUS
7717 NTAPI
7718 IoRegisterDeviceInterface(
7719 IN PDEVICE_OBJECT PhysicalDeviceObject,
7720 IN CONST GUID *InterfaceClassGuid,
7721 IN PUNICODE_STRING ReferenceString OPTIONAL,
7722 OUT PUNICODE_STRING SymbolicLinkName);
7723
7724 NTKERNELAPI
7725 VOID
7726 NTAPI
7727 IoRegisterDriverReinitialization(
7728 IN PDRIVER_OBJECT DriverObject,
7729 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
7730 IN PVOID Context);
7731
7732 NTKERNELAPI
7733 NTSTATUS
7734 NTAPI
7735 IoRegisterPlugPlayNotification(
7736 IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
7737 IN ULONG EventCategoryFlags,
7738 IN PVOID EventCategoryData OPTIONAL,
7739 IN PDRIVER_OBJECT DriverObject,
7740 IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine,
7741 IN PVOID Context,
7742 OUT PVOID *NotificationEntry);
7743
7744 NTKERNELAPI
7745 NTSTATUS
7746 NTAPI
7747 IoRegisterShutdownNotification(
7748 IN PDEVICE_OBJECT DeviceObject);
7749
7750 NTKERNELAPI
7751 VOID
7752 NTAPI
7753 IoReleaseCancelSpinLock(
7754 IN KIRQL Irql);
7755
7756 NTKERNELAPI
7757 VOID
7758 NTAPI
7759 IoReleaseRemoveLockAndWaitEx(
7760 IN PIO_REMOVE_LOCK RemoveLock,
7761 IN PVOID Tag,
7762 IN ULONG RemlockSize);
7763
7764 NTKERNELAPI
7765 VOID
7766 NTAPI
7767 IoReleaseRemoveLockEx(
7768 IN PIO_REMOVE_LOCK RemoveLock,
7769 IN PVOID Tag,
7770 IN ULONG RemlockSize);
7771
7772 /*
7773 * VOID
7774 * IoReleaseRemoveLock(
7775 * IN PIO_REMOVE_LOCK RemoveLock,
7776 * IN PVOID Tag)
7777 */
7778 #define IoReleaseRemoveLock(_RemoveLock, \
7779 _Tag) \
7780 IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
7781
7782 /*
7783 * VOID
7784 * IoReleaseRemoveLockAndWait(
7785 * IN PIO_REMOVE_LOCK RemoveLock,
7786 * IN PVOID Tag)
7787 */
7788 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
7789 _Tag) \
7790 IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
7791
7792 NTKERNELAPI
7793 VOID
7794 NTAPI
7795 IoRemoveShareAccess(
7796 IN PFILE_OBJECT FileObject,
7797 IN OUT PSHARE_ACCESS ShareAccess);
7798
7799 NTKERNELAPI
7800 NTSTATUS
7801 NTAPI
7802 IoReportDetectedDevice(
7803 IN PDRIVER_OBJECT DriverObject,
7804 IN INTERFACE_TYPE LegacyBusType,
7805 IN ULONG BusNumber,
7806 IN ULONG SlotNumber,
7807 IN PCM_RESOURCE_LIST ResourceList,
7808 IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL,
7809 IN BOOLEAN ResourceAssigned,
7810 IN OUT PDEVICE_OBJECT *DeviceObject);
7811
7812 NTKERNELAPI
7813 NTSTATUS
7814 NTAPI
7815 IoReportResourceForDetection(
7816 IN PDRIVER_OBJECT DriverObject,
7817 IN PCM_RESOURCE_LIST DriverList OPTIONAL,
7818 IN ULONG DriverListSize OPTIONAL,
7819 IN PDEVICE_OBJECT DeviceObject OPTIONAL,
7820 IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
7821 IN ULONG DeviceListSize OPTIONAL,
7822 OUT PBOOLEAN ConflictDetected);
7823
7824 NTKERNELAPI
7825 NTSTATUS
7826 NTAPI
7827 IoReportResourceUsage(
7828 IN PUNICODE_STRING DriverClassName OPTIONAL,
7829 IN PDRIVER_OBJECT DriverObject,
7830 IN PCM_RESOURCE_LIST DriverList OPTIONAL,
7831 IN ULONG DriverListSize OPTIONAL,
7832 IN PDEVICE_OBJECT DeviceObject,
7833 IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
7834 IN ULONG DeviceListSize OPTIONAL,
7835 IN BOOLEAN OverrideConflict,
7836 OUT PBOOLEAN ConflictDetected);
7837
7838 NTKERNELAPI
7839 NTSTATUS
7840 NTAPI
7841 IoReportTargetDeviceChange(
7842 IN PDEVICE_OBJECT PhysicalDeviceObject,
7843 IN PVOID NotificationStructure);
7844
7845 NTKERNELAPI
7846 NTSTATUS
7847 NTAPI
7848 IoReportTargetDeviceChangeAsynchronous(
7849 IN PDEVICE_OBJECT PhysicalDeviceObject,
7850 IN PVOID NotificationStructure,
7851 IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL,
7852 IN PVOID Context OPTIONAL);
7853
7854 NTKERNELAPI
7855 VOID
7856 NTAPI
7857 IoRequestDeviceEject(
7858 IN PDEVICE_OBJECT PhysicalDeviceObject);
7859
7860 /*
7861 * VOID
7862 * IoRequestDpc(
7863 * IN PDEVICE_OBJECT DeviceObject,
7864 * IN PIRP Irp,
7865 * IN PVOID Context);
7866 */
7867 #define IoRequestDpc(DeviceObject, Irp, Context)( \
7868 KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
7869
7870 NTKERNELAPI
7871 VOID
7872 NTAPI
7873 IoReuseIrp(
7874 IN OUT PIRP Irp,
7875 IN NTSTATUS Status);
7876
7877 /*
7878 * PDRIVER_CANCEL
7879 * IoSetCancelRoutine(
7880 * IN PIRP Irp,
7881 * IN PDRIVER_CANCEL CancelRoutine)
7882 */
7883 #define IoSetCancelRoutine(_Irp, \
7884 _CancelRoutine) \
7885 ((PDRIVER_CANCEL) InterlockedExchangePointer( \
7886 (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (_CancelRoutine)))
7887
7888 /*
7889 * VOID
7890 * IoSetCompletionRoutine(
7891 * IN PIRP Irp,
7892 * IN PIO_COMPLETION_ROUTINE CompletionRoutine,
7893 * IN PVOID Context,
7894 * IN BOOLEAN InvokeOnSuccess,
7895 * IN BOOLEAN InvokeOnError,
7896 * IN BOOLEAN InvokeOnCancel)
7897 */
7898 #define IoSetCompletionRoutine(_Irp, \
7899 _CompletionRoutine, \
7900 _Context, \
7901 _InvokeOnSuccess, \
7902 _InvokeOnError, \
7903 _InvokeOnCancel) \
7904 { \
7905 PIO_STACK_LOCATION _IrpSp; \
7906 ASSERT((_InvokeOnSuccess) || (_InvokeOnError) || (_InvokeOnCancel) ? \
7907 (_CompletionRoutine) != NULL : TRUE); \
7908 _IrpSp = IoGetNextIrpStackLocation(_Irp); \
7909 _IrpSp->CompletionRoutine = (PIO_COMPLETION_ROUTINE)(_CompletionRoutine); \
7910 _IrpSp->Context = (_Context); \
7911 _IrpSp->Control = 0; \
7912 if (_InvokeOnSuccess) _IrpSp->Control = SL_INVOKE_ON_SUCCESS; \
7913 if (_InvokeOnError) _IrpSp->Control |= SL_INVOKE_ON_ERROR; \
7914 if (_InvokeOnCancel) _IrpSp->Control |= SL_INVOKE_ON_CANCEL; \
7915 }
7916
7917 NTKERNELAPI
7918 NTSTATUS
7919 NTAPI
7920 IoSetCompletionRoutineEx(
7921 IN PDEVICE_OBJECT DeviceObject,
7922 IN PIRP Irp,
7923 IN PIO_COMPLETION_ROUTINE CompletionRoutine,
7924 IN PVOID Context,
7925 IN BOOLEAN InvokeOnSuccess,
7926 IN BOOLEAN InvokeOnError,
7927 IN BOOLEAN InvokeOnCancel);
7928
7929 NTKERNELAPI
7930 NTSTATUS
7931 NTAPI
7932 IoSetDeviceInterfaceState(
7933 IN PUNICODE_STRING SymbolicLinkName,
7934 IN BOOLEAN Enable);
7935
7936 NTKERNELAPI
7937 VOID
7938 NTAPI
7939 IoSetHardErrorOrVerifyDevice(
7940 IN PIRP Irp,
7941 IN PDEVICE_OBJECT DeviceObject);
7942
7943 /*
7944 * VOID
7945 * IoSetNextIrpStackLocation(
7946 * IN OUT PIRP Irp)
7947 */
7948 #define IoSetNextIrpStackLocation(_Irp) \
7949 { \
7950 (_Irp)->CurrentLocation--; \
7951 (_Irp)->Tail.Overlay.CurrentStackLocation--; \
7952 }
7953
7954 NTKERNELAPI
7955 NTSTATUS
7956 FASTCALL
7957 IoSetPartitionInformation(
7958 IN PDEVICE_OBJECT DeviceObject,
7959 IN ULONG SectorSize,
7960 IN ULONG PartitionNumber,
7961 IN ULONG PartitionType);
7962
7963 NTKERNELAPI
7964 NTSTATUS
7965 NTAPI
7966 IoSetPartitionInformationEx(
7967 IN PDEVICE_OBJECT DeviceObject,
7968 IN ULONG PartitionNumber,
7969 IN struct _SET_PARTITION_INFORMATION_EX *PartitionInfo);
7970
7971 NTKERNELAPI
7972 VOID
7973 NTAPI
7974 IoSetShareAccess(
7975 IN ACCESS_MASK DesiredAccess,
7976 IN ULONG DesiredShareAccess,
7977 IN OUT PFILE_OBJECT FileObject,
7978 OUT PSHARE_ACCESS ShareAccess);
7979
7980 NTKERNELAPI
7981 VOID
7982 NTAPI
7983 IoSetStartIoAttributes(
7984 IN PDEVICE_OBJECT DeviceObject,
7985 IN BOOLEAN DeferredStartIo,
7986 IN BOOLEAN NonCancelable);
7987
7988 NTKERNELAPI
7989 NTSTATUS
7990 NTAPI
7991 IoSetSystemPartition(
7992 IN PUNICODE_STRING VolumeNameString);
7993
7994 NTKERNELAPI
7995 BOOLEAN
7996 NTAPI
7997 IoSetThreadHardErrorMode(
7998 IN BOOLEAN EnableHardErrors);
7999
8000 /*
8001 * USHORT
8002 * IoSizeOfIrp(
8003 * IN CCHAR StackSize)
8004 */
8005 #define IoSizeOfIrp(_StackSize) \
8006 ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
8007
8008 /*
8009 * VOID
8010 * IoSkipCurrentIrpStackLocation(
8011 * IN PIRP Irp)
8012 */
8013 #define IoSkipCurrentIrpStackLocation(_Irp) \
8014 { \
8015 (_Irp)->CurrentLocation++; \
8016 (_Irp)->Tail.Overlay.CurrentStackLocation++; \
8017 }
8018
8019 NTKERNELAPI
8020 VOID
8021 NTAPI
8022 IoStartNextPacket(
8023 IN PDEVICE_OBJECT DeviceObject,
8024 IN BOOLEAN Cancelable);
8025
8026 NTKERNELAPI
8027 VOID
8028 NTAPI
8029 IoStartNextPacketByKey(
8030 IN PDEVICE_OBJECT DeviceObject,
8031 IN BOOLEAN Cancelable,
8032 IN ULONG Key);
8033
8034 NTKERNELAPI
8035 VOID
8036 NTAPI
8037 IoStartPacket(
8038 IN PDEVICE_OBJECT DeviceObject,
8039 IN PIRP Irp,
8040 IN PULONG Key OPTIONAL,
8041 IN PDRIVER_CANCEL CancelFunction OPTIONAL);
8042
8043 NTKERNELAPI
8044 VOID
8045 NTAPI
8046 IoStartTimer(
8047 IN PDEVICE_OBJECT DeviceObject);
8048
8049 NTKERNELAPI
8050 VOID
8051 NTAPI
8052 IoStopTimer(
8053 IN PDEVICE_OBJECT DeviceObject);
8054
8055 NTKERNELAPI
8056 NTSTATUS
8057 NTAPI
8058 IoUnregisterPlugPlayNotification(
8059 IN PVOID NotificationEntry);
8060
8061 NTKERNELAPI
8062 VOID
8063 NTAPI
8064 IoUnregisterShutdownNotification(
8065 IN PDEVICE_OBJECT DeviceObject);
8066
8067 NTKERNELAPI
8068 VOID
8069 NTAPI
8070 IoUpdateShareAccess(
8071 IN PFILE_OBJECT FileObject,
8072 IN OUT PSHARE_ACCESS ShareAccess);
8073
8074 NTKERNELAPI
8075 NTSTATUS
8076 NTAPI
8077 IoVerifyPartitionTable(
8078 IN PDEVICE_OBJECT DeviceObject,
8079 IN BOOLEAN FixErrors);
8080
8081 NTKERNELAPI
8082 NTSTATUS
8083 NTAPI
8084 IoVolumeDeviceToDosName(
8085 IN PVOID VolumeDeviceObject,
8086 OUT PUNICODE_STRING DosName);
8087
8088 NTKERNELAPI
8089 NTSTATUS
8090 NTAPI
8091 IoWMIAllocateInstanceIds(
8092 IN GUID *Guid,
8093 IN ULONG InstanceCount,
8094 OUT ULONG *FirstInstanceId);
8095
8096 NTKERNELAPI
8097 ULONG
8098 NTAPI
8099 IoWMIDeviceObjectToProviderId(
8100 IN PDEVICE_OBJECT DeviceObject);
8101
8102 NTKERNELAPI
8103 NTSTATUS
8104 NTAPI
8105 IoWMIDeviceObjectToInstanceName(
8106 IN PVOID DataBlockObject,
8107 IN PDEVICE_OBJECT DeviceObject,
8108 OUT PUNICODE_STRING InstanceName);
8109
8110 NTKERNELAPI
8111 NTSTATUS
8112 NTAPI
8113 IoWMIExecuteMethod(
8114 IN PVOID DataBlockObject,
8115 IN PUNICODE_STRING InstanceName,
8116 IN ULONG MethodId,
8117 IN ULONG InBufferSize,
8118 IN OUT PULONG OutBufferSize,
8119 IN OUT PUCHAR InOutBuffer);
8120
8121 NTKERNELAPI
8122 NTSTATUS
8123 NTAPI
8124 IoWMIHandleToInstanceName(
8125 IN PVOID DataBlockObject,
8126 IN HANDLE FileHandle,
8127 OUT PUNICODE_STRING InstanceName);
8128
8129 NTKERNELAPI
8130 NTSTATUS
8131 NTAPI
8132 IoWMIOpenBlock(
8133 IN GUID *DataBlockGuid,
8134 IN ULONG DesiredAccess,
8135 OUT PVOID *DataBlockObject);
8136
8137 NTKERNELAPI
8138 NTSTATUS
8139 NTAPI
8140 IoWMIQueryAllData(
8141 IN PVOID DataBlockObject,
8142 IN OUT ULONG *InOutBufferSize,
8143 OUT PVOID OutBuffer);
8144
8145 NTKERNELAPI
8146 NTSTATUS
8147 NTAPI
8148 IoWMIQueryAllDataMultiple(
8149 IN PVOID *DataBlockObjectList,
8150 IN ULONG ObjectCount,
8151 IN OUT ULONG *InOutBufferSize,
8152 OUT PVOID OutBuffer);
8153
8154 NTKERNELAPI
8155 NTSTATUS
8156 NTAPI
8157 IoWMIQuerySingleInstance(
8158 IN PVOID DataBlockObject,
8159 IN PUNICODE_STRING InstanceName,
8160 IN OUT ULONG *InOutBufferSize,
8161 OUT PVOID OutBuffer);
8162
8163 NTKERNELAPI
8164 NTSTATUS
8165 NTAPI
8166 IoWMIQuerySingleInstanceMultiple(
8167 IN PVOID *DataBlockObjectList,
8168 IN PUNICODE_STRING InstanceNames,
8169 IN ULONG ObjectCount,
8170 IN OUT ULONG *InOutBufferSize,
8171 OUT PVOID OutBuffer);
8172
8173 NTKERNELAPI
8174 NTSTATUS
8175 NTAPI
8176 IoWMIRegistrationControl(
8177 IN PDEVICE_OBJECT DeviceObject,
8178 IN ULONG Action);
8179
8180 NTKERNELAPI
8181 NTSTATUS
8182 NTAPI
8183 IoWMISetNotificationCallback(
8184 IN PVOID Object,
8185 IN WMI_NOTIFICATION_CALLBACK Callback,
8186 IN PVOID Context);
8187
8188 NTKERNELAPI
8189 NTSTATUS
8190 NTAPI
8191 IoWMISetSingleInstance(
8192 IN PVOID DataBlockObject,
8193 IN PUNICODE_STRING InstanceName,
8194 IN ULONG Version,
8195 IN ULONG ValueBufferSize,
8196 IN PVOID ValueBuffer);
8197
8198 NTKERNELAPI
8199 NTSTATUS
8200 NTAPI
8201 IoWMISetSingleItem(
8202 IN PVOID DataBlockObject,
8203 IN PUNICODE_STRING InstanceName,
8204 IN ULONG DataItemId,
8205 IN ULONG Version,
8206 IN ULONG ValueBufferSize,
8207 IN PVOID ValueBuffer);
8208
8209 NTKERNELAPI
8210 NTSTATUS
8211 NTAPI
8212 IoWMISuggestInstanceName(
8213 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
8214 IN PUNICODE_STRING SymbolicLinkName OPTIONAL,
8215 IN BOOLEAN CombineNames,
8216 OUT PUNICODE_STRING SuggestedInstanceName);
8217
8218 NTKERNELAPI
8219 NTSTATUS
8220 NTAPI
8221 IoWMIWriteEvent(
8222 IN PVOID WnodeEventItem);
8223
8224 NTKERNELAPI
8225 VOID
8226 NTAPI
8227 IoWriteErrorLogEntry(
8228 IN PVOID ElEntry);
8229
8230 NTKERNELAPI
8231 NTSTATUS
8232 FASTCALL
8233 IoWritePartitionTable(
8234 IN PDEVICE_OBJECT DeviceObject,
8235 IN ULONG SectorSize,
8236 IN ULONG SectorsPerTrack,
8237 IN ULONG NumberOfHeads,
8238 IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer);
8239
8240 NTKERNELAPI
8241 NTSTATUS
8242 NTAPI
8243 IoWritePartitionTableEx(
8244 IN PDEVICE_OBJECT DeviceObject,
8245 IN struct _DRIVE_LAYOUT_INFORMATION_EX *PartitionBuffer);
8246
8247
8248
8249 /** Kernel routines **/
8250
8251 #if defined (_M_AMD64)
8252 NTKERNELAPI
8253 VOID
8254 FASTCALL
8255 KeAcquireInStackQueuedSpinLock(
8256 IN PKSPIN_LOCK SpinLock,
8257 IN PKLOCK_QUEUE_HANDLE LockHandle);
8258
8259 NTKERNELAPI
8260 VOID
8261 FASTCALL
8262 KeReleaseInStackQueuedSpinLock(
8263 IN PKLOCK_QUEUE_HANDLE LockHandle);
8264 #else
8265 NTHALAPI
8266 VOID
8267 FASTCALL
8268 KeAcquireInStackQueuedSpinLock(
8269 IN PKSPIN_LOCK SpinLock,
8270 IN PKLOCK_QUEUE_HANDLE LockHandle);
8271
8272 NTHALAPI
8273 VOID
8274 FASTCALL
8275 KeReleaseInStackQueuedSpinLock(
8276 IN PKLOCK_QUEUE_HANDLE LockHandle);
8277 #endif
8278
8279 NTKERNELAPI
8280 VOID
8281 FASTCALL
8282 KeAcquireInStackQueuedSpinLockAtDpcLevel(
8283 IN PKSPIN_LOCK SpinLock,
8284 IN PKLOCK_QUEUE_HANDLE LockHandle);
8285
8286 NTKERNELAPI
8287 KIRQL
8288 NTAPI
8289 KeAcquireInterruptSpinLock(
8290 IN PKINTERRUPT Interrupt);
8291
8292 NTKERNELAPI
8293 BOOLEAN
8294 NTAPI
8295 KeAreApcsDisabled(
8296 VOID);
8297
8298 NTKERNELAPI
8299 DECLSPEC_NORETURN
8300 VOID
8301 NTAPI
8302 KeBugCheck(
8303 IN ULONG BugCheckCode);
8304
8305 NTKERNELAPI
8306 DECLSPEC_NORETURN
8307 VOID
8308 NTAPI
8309 KeBugCheckEx(
8310 IN ULONG BugCheckCode,
8311 IN ULONG_PTR BugCheckParameter1,
8312 IN ULONG_PTR BugCheckParameter2,
8313 IN ULONG_PTR BugCheckParameter3,
8314 IN ULONG_PTR BugCheckParameter4);
8315
8316 NTKERNELAPI
8317 BOOLEAN
8318 NTAPI
8319 KeCancelTimer(
8320 IN PKTIMER Timer);
8321
8322 NTKERNELAPI
8323 VOID
8324 NTAPI
8325 KeClearEvent(
8326 IN PRKEVENT Event);
8327
8328 NTKERNELAPI
8329 NTSTATUS
8330 NTAPI
8331 KeDelayExecutionThread(
8332 IN KPROCESSOR_MODE WaitMode,
8333 IN BOOLEAN Alertable,
8334 IN PLARGE_INTEGER Interval);
8335
8336 NTKERNELAPI
8337 BOOLEAN
8338 NTAPI
8339 KeDeregisterBugCheckCallback(
8340 IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord);
8341
8342 NTKERNELAPI
8343 VOID
8344 NTAPI
8345 KeEnterCriticalRegion(
8346 VOID);
8347
8348 /*
8349 * VOID
8350 * KeFlushIoBuffers(
8351 * IN PMDL Mdl,
8352 * IN BOOLEAN ReadOperation,
8353 * IN BOOLEAN DmaOperation)
8354 */
8355 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
8356
8357 #define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql))
8358 #define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql))
8359 #define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock)
8360 #define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock)
8361
8362 NTKERNELAPI
8363 VOID
8364 NTAPI
8365 KeFlushQueuedDpcs(
8366 VOID
8367 );
8368
8369 NTHALAPI
8370 VOID
8371 NTAPI
8372 KeFlushWriteBuffer(VOID);
8373
8374 NTKERNELAPI
8375 ULONG
8376 NTAPI
8377 KeGetRecommendedSharedDataAlignment(
8378 VOID);
8379
8380 NTKERNELAPI
8381 VOID
8382 NTAPI
8383 KeInitializeDeviceQueue(
8384 IN PKDEVICE_QUEUE DeviceQueue);
8385
8386 NTKERNELAPI
8387 VOID
8388 NTAPI
8389 KeInitializeMutex(
8390 IN PRKMUTEX Mutex,
8391 IN ULONG Level);
8392
8393 NTKERNELAPI
8394 VOID
8395 NTAPI
8396 KeInitializeSemaphore(
8397 IN PRKSEMAPHORE Semaphore,
8398 IN LONG Count,
8399 IN LONG Limit);
8400
8401 NTKERNELAPI
8402 VOID
8403 NTAPI
8404 KeInitializeTimer(
8405 IN PKTIMER Timer);
8406
8407 NTKERNELAPI
8408 VOID
8409 NTAPI
8410 KeInitializeTimerEx(
8411 IN PKTIMER Timer,
8412 IN TIMER_TYPE Type);
8413
8414 NTKERNELAPI
8415 BOOLEAN
8416 NTAPI
8417 KeInsertByKeyDeviceQueue(
8418 IN PKDEVICE_QUEUE DeviceQueue,
8419 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry,
8420 IN ULONG SortKey);
8421
8422 NTKERNELAPI
8423 BOOLEAN
8424 NTAPI
8425 KeInsertDeviceQueue(
8426 IN PKDEVICE_QUEUE DeviceQueue,
8427 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
8428
8429 NTKERNELAPI
8430 BOOLEAN
8431 NTAPI
8432 KeInsertQueueDpc(
8433 IN PRKDPC Dpc,
8434 IN PVOID SystemArgument1,
8435 IN PVOID SystemArgument2);
8436
8437 NTKERNELAPI
8438 VOID
8439 NTAPI
8440 KeLeaveCriticalRegion(
8441 VOID);
8442
8443 #ifdef _X86_
8444
8445 static __inline
8446 VOID
8447 KeMemoryBarrier(
8448 VOID)
8449 {
8450 volatile LONG Barrier;
8451 #if defined(__GNUC__)
8452 __asm__ __volatile__ ("xchg %%eax, %0" : : "m" (Barrier) : "%eax");
8453 #elif defined(_MSC_VER)
8454 __asm xchg [Barrier], eax
8455 #endif
8456 }
8457
8458 #endif
8459
8460 NTKERNELAPI
8461 LONG
8462 NTAPI
8463 KePulseEvent(
8464 IN PRKEVENT Event,
8465 IN KPRIORITY Increment,
8466 IN BOOLEAN Wait);
8467
8468 NTKERNELAPI
8469 KAFFINITY
8470 NTAPI
8471 KeQueryActiveProcessors(
8472 VOID
8473 );
8474
8475 NTHALAPI
8476 LARGE_INTEGER
8477 NTAPI
8478 KeQueryPerformanceCounter(
8479 OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL);
8480
8481 NTKERNELAPI
8482 KPRIORITY
8483 NTAPI
8484 KeQueryPriorityThread(
8485 IN PRKTHREAD Thread);
8486
8487 NTKERNELAPI
8488 ULONG
8489 NTAPI
8490 KeQueryRuntimeThread(
8491 IN PKTHREAD Thread,
8492 OUT PULONG UserTime);
8493
8494 #if !defined(_M_AMD64)
8495 NTKERNELAPI
8496 ULONGLONG
8497 NTAPI
8498 KeQueryInterruptTime(
8499 VOID);
8500
8501 NTKERNELAPI
8502 VOID
8503 NTAPI
8504 KeQuerySystemTime(
8505 OUT PLARGE_INTEGER CurrentTime);
8506
8507 NTKERNELAPI
8508 VOID
8509 NTAPI
8510 KeQueryTickCount(
8511 OUT PLARGE_INTEGER TickCount);
8512 #endif
8513
8514 NTKERNELAPI
8515 ULONG
8516 NTAPI
8517 KeQueryTimeIncrement(
8518 VOID);
8519
8520 NTKERNELAPI
8521 LONG
8522 NTAPI
8523 KeReadStateEvent(
8524 IN PRKEVENT Event);
8525
8526 NTKERNELAPI
8527 LONG
8528 NTAPI
8529 KeReadStateMutex(
8530 IN PRKMUTEX Mutex);
8531
8532
8533 NTKERNELAPI
8534 LONG
8535 NTAPI
8536 KeReadStateSemaphore(
8537 IN PRKSEMAPHORE Semaphore);
8538
8539 NTKERNELAPI
8540 BOOLEAN
8541 NTAPI
8542 KeReadStateTimer(
8543 IN PKTIMER Timer);
8544
8545 NTKERNELAPI
8546 BOOLEAN
8547 NTAPI
8548 KeRegisterBugCheckCallback(
8549 IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord,
8550 IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine,
8551 IN PVOID Buffer,
8552 IN ULONG Length,
8553 IN PUCHAR Component);
8554
8555 NTKERNELAPI
8556 VOID
8557 FASTCALL
8558 KeReleaseInStackQueuedSpinLockFromDpcLevel(
8559 IN PKLOCK_QUEUE_HANDLE LockHandle);
8560
8561 NTKERNELAPI
8562 VOID
8563 NTAPI
8564 KeReleaseInterruptSpinLock(
8565 IN PKINTERRUPT Interrupt,
8566 IN KIRQL OldIrql);
8567
8568 NTKERNELAPI
8569 LONG
8570 NTAPI
8571 KeReleaseMutex(
8572 IN PRKMUTEX Mutex,
8573 IN BOOLEAN Wait);
8574
8575 NTKERNELAPI
8576 LONG
8577 NTAPI
8578 KeReleaseSemaphore(
8579 IN PRKSEMAPHORE Semaphore,
8580 IN KPRIORITY Increment,
8581 IN LONG Adjustment,
8582 IN BOOLEAN Wait);
8583
8584 NTKERNELAPI
8585 PKDEVICE_QUEUE_ENTRY
8586 NTAPI
8587 KeRemoveByKeyDeviceQueue(
8588 IN PKDEVICE_QUEUE DeviceQueue,
8589 IN ULONG SortKey);
8590
8591 NTKERNELAPI
8592 PKDEVICE_QUEUE_ENTRY
8593 NTAPI
8594 KeRemoveDeviceQueue(
8595 IN PKDEVICE_QUEUE DeviceQueue);
8596
8597 NTKERNELAPI
8598 BOOLEAN
8599 NTAPI
8600 KeRemoveEntryDeviceQueue(
8601 IN PKDEVICE_QUEUE DeviceQueue,
8602 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
8603
8604 NTKERNELAPI
8605 BOOLEAN
8606 NTAPI
8607 KeRemoveQueueDpc(
8608 IN PRKDPC Dpc);
8609
8610 NTKERNELAPI
8611 LONG
8612 NTAPI
8613 KeResetEvent(
8614 IN PRKEVENT Event);
8615
8616 NTKERNELAPI
8617 NTSTATUS
8618 NTAPI
8619 KeRestoreFloatingPointState(
8620 IN PKFLOATING_SAVE FloatSave);
8621
8622 NTKERNELAPI
8623 VOID
8624 NTAPI
8625 KeRevertToUserAffinityThread(VOID);
8626
8627 NTKERNELAPI
8628 NTSTATUS
8629 NTAPI
8630 KeSaveFloatingPointState(
8631 OUT PKFLOATING_SAVE FloatSave);
8632
8633 NTKERNELAPI
8634 LONG
8635 NTAPI
8636 KeSetBasePriorityThread(
8637 IN PRKTHREAD Thread,
8638 IN LONG Increment);
8639
8640 NTKERNELAPI
8641 LONG
8642 NTAPI
8643 KeSetEvent(
8644 IN PRKEVENT Event,
8645 IN KPRIORITY Increment,
8646 IN BOOLEAN Wait);
8647
8648 NTKERNELAPI
8649 VOID
8650 NTAPI
8651 KeSetImportanceDpc(
8652 IN PRKDPC Dpc,
8653 IN KDPC_IMPORTANCE Importance);
8654
8655 NTKERNELAPI
8656 KPRIORITY
8657 NTAPI
8658 KeSetPriorityThread(
8659 IN PKTHREAD Thread,
8660 IN KPRIORITY Priority);
8661
8662 NTKERNELAPI
8663 VOID
8664 NTAPI
8665 KeSetSystemAffinityThread(
8666 IN KAFFINITY Affinity);
8667
8668 NTKERNELAPI
8669 VOID
8670 NTAPI
8671 KeSetTargetProcessorDpc(
8672 IN PRKDPC Dpc,
8673 IN CCHAR Number);
8674
8675 NTKERNELAPI
8676 BOOLEAN
8677 NTAPI
8678 KeSetTimer(
8679 IN PKTIMER Timer,
8680 IN LARGE_INTEGER DueTime,
8681 IN PKDPC Dpc OPTIONAL);
8682
8683 NTKERNELAPI
8684 BOOLEAN
8685 NTAPI
8686 KeSetTimerEx(
8687 IN PKTIMER Timer,
8688 IN LARGE_INTEGER DueTime,
8689 IN LONG Period OPTIONAL,
8690 IN PKDPC Dpc OPTIONAL);
8691
8692 NTKERNELAPI
8693 VOID
8694 FASTCALL
8695 KeSetTimeUpdateNotifyRoutine(
8696 IN PTIME_UPDATE_NOTIFY_ROUTINE NotifyRoutine);
8697
8698 NTHALAPI
8699 VOID
8700 NTAPI
8701 KeStallExecutionProcessor(
8702 IN ULONG MicroSeconds);
8703
8704 NTKERNELAPI
8705 BOOLEAN
8706 NTAPI
8707 KeSynchronizeExecution(
8708 IN PKINTERRUPT Interrupt,
8709 IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine,
8710 IN PVOID SynchronizeContext);
8711
8712 NTKERNELAPI
8713 NTSTATUS
8714 NTAPI
8715 KeWaitForMultipleObjects(
8716 IN ULONG Count,
8717 IN PVOID Object[],
8718 IN WAIT_TYPE WaitType,
8719 IN KWAIT_REASON WaitReason,
8720 IN KPROCESSOR_MODE WaitMode,
8721 IN BOOLEAN Alertable,
8722 IN PLARGE_INTEGER Timeout OPTIONAL,
8723 IN PKWAIT_BLOCK WaitBlockArray OPTIONAL);
8724
8725 NTKERNELAPI
8726 NTSTATUS
8727 NTAPI
8728 KeWaitForMutexObject(
8729 IN PRKMUTEX Mutex,
8730 IN KWAIT_REASON WaitReason,
8731 IN KPROCESSOR_MODE WaitMode,
8732 IN BOOLEAN Alertable,
8733 IN PLARGE_INTEGER Timeout OPTIONAL);
8734
8735 NTKERNELAPI
8736 NTSTATUS
8737 NTAPI
8738 KeWaitForSingleObject(
8739 IN PVOID Object,
8740 IN KWAIT_REASON WaitReason,
8741 IN KPROCESSOR_MODE WaitMode,
8742 IN BOOLEAN Alertable,
8743 IN PLARGE_INTEGER Timeout OPTIONAL);
8744
8745 typedef
8746 ULONG_PTR
8747 (NTAPI *PKIPI_BROADCAST_WORKER)(
8748 IN ULONG_PTR Argument
8749 );
8750
8751 NTKERNELAPI
8752 ULONG_PTR
8753 NTAPI
8754 KeIpiGenericCall(
8755 IN PKIPI_BROADCAST_WORKER BroadcastFunction,
8756 IN ULONG_PTR Context
8757 );
8758
8759 #if defined(_X86_)
8760
8761 NTHALAPI
8762 VOID
8763 FASTCALL
8764 KfLowerIrql(
8765 IN KIRQL NewIrql);
8766
8767 NTHALAPI
8768 KIRQL
8769 FASTCALL
8770 KfRaiseIrql(
8771 IN KIRQL NewIrql);
8772
8773 NTHALAPI
8774 KIRQL
8775 DDKAPI
8776 KeRaiseIrqlToDpcLevel(
8777 VOID);
8778
8779 NTHALAPI
8780 KIRQL
8781 DDKAPI
8782 KeRaiseIrqlToSynchLevel(
8783 VOID);
8784
8785 #define KeLowerIrql(a) KfLowerIrql(a)
8786 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
8787
8788 #elif defined(_M_AMD64)
8789
8790 FORCEINLINE
8791 KIRQL
8792 KeGetCurrentIrql(VOID)
8793 {
8794 return (KIRQL)__readcr8();
8795 }
8796
8797 FORCEINLINE
8798 VOID
8799 KeLowerIrql(IN KIRQL NewIrql)
8800 {
8801 ASSERT(KeGetCurrentIrql() >= NewIrql);
8802 __writecr8(NewIrql);
8803 }
8804
8805 FORCEINLINE
8806 KIRQL
8807 KfRaiseIrql(IN KIRQL NewIrql)
8808 {
8809 KIRQL OldIrql;
8810
8811 OldIrql = __readcr8();
8812 ASSERT(OldIrql <= NewIrql);
8813 __writecr8(NewIrql);
8814 return OldIrql;
8815 }
8816 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
8817
8818 FORCEINLINE
8819 KIRQL
8820 KeRaiseIrqlToDpcLevel(VOID)
8821 {
8822 return KfRaiseIrql(DISPATCH_LEVEL);
8823 }
8824
8825 FORCEINLINE
8826 KIRQL
8827 KeRaiseIrqlToSynchLevel(VOID)
8828 {
8829 return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2
8830 }
8831
8832 #elif defined(__PowerPC__)
8833
8834 NTHALAPI
8835 VOID
8836 FASTCALL
8837 KfLowerIrql(
8838 IN KIRQL NewIrql);
8839
8840 NTHALAPI
8841 KIRQL
8842 FASTCALL
8843 KfRaiseIrql(
8844 IN KIRQL NewIrql);
8845
8846 NTHALAPI
8847 KIRQL
8848 DDKAPI
8849 KeRaiseIrqlToDpcLevel(
8850 VOID);
8851
8852 NTHALAPI
8853 KIRQL
8854 DDKAPI
8855 KeRaiseIrqlToSynchLevel(
8856 VOID);
8857
8858 #define KeLowerIrql(a) KfLowerIrql(a)
8859 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
8860
8861 #elif defined(_M_MIPS)
8862
8863 #define KeLowerIrql(a) KfLowerIrql(a)
8864 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
8865
8866 NTKERNELAPI
8867 VOID
8868 NTAPI
8869 KfLowerIrql(
8870 IN KIRQL NewIrql);
8871
8872 NTKERNELAPI
8873 KIRQL
8874 NTAPI
8875 KfRaiseIrql(
8876 IN KIRQL NewIrql);
8877
8878 NTKERNELAPI
8879 KIRQL
8880 NTAPI
8881 KeRaiseIrqlToDpcLevel(
8882 VOID);
8883
8884 NTKERNELAPI
8885 KIRQL
8886 DDKAPI
8887 KeRaiseIrqlToSynchLevel(
8888 VOID);
8889
8890 #elif defined(_M_ARM)
8891
8892 #include <armddk.h>
8893
8894 #else
8895
8896 NTKERNELAPI
8897 VOID
8898 NTAPI
8899 KeLowerIrql(
8900 IN KIRQL NewIrql);
8901
8902 NTKERNELAPI
8903 VOID
8904 NTAPI
8905 KeRaiseIrql(
8906 IN KIRQL NewIrql,
8907 OUT PKIRQL OldIrql);
8908
8909 NTKERNELAPI
8910 KIRQL
8911 NTAPI
8912 KeRaiseIrqlToDpcLevel(
8913 VOID);
8914
8915 NTKERNELAPI
8916 KIRQL
8917 DDKAPI
8918 KeRaiseIrqlToSynchLevel(
8919 VOID);
8920
8921 #endif
8922
8923 /** Memory manager routines **/
8924
8925 NTKERNELAPI
8926 NTSTATUS
8927 NTAPI
8928 MmAdvanceMdl(
8929 IN PMDL Mdl,
8930 IN ULONG NumberOfBytes);
8931
8932 NTKERNELAPI
8933 PVOID
8934 NTAPI
8935 MmAllocateContiguousMemory(
8936 IN ULONG NumberOfBytes,
8937 IN PHYSICAL_ADDRESS HighestAcceptableAddress);
8938
8939 NTKERNELAPI
8940 PVOID
8941 NTAPI
8942 MmAllocateContiguousMemorySpecifyCache(
8943 IN SIZE_T NumberOfBytes,
8944 IN PHYSICAL_ADDRESS LowestAcceptableAddress,
8945 IN PHYSICAL_ADDRESS HighestAcceptableAddress,
8946 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
8947 IN MEMORY_CACHING_TYPE CacheType);
8948
8949 NTKERNELAPI
8950 PVOID
8951 NTAPI
8952 MmAllocateMappingAddress(
8953 IN SIZE_T NumberOfBytes,
8954 IN ULONG PoolTag);
8955
8956 NTKERNELAPI
8957 PVOID
8958 NTAPI
8959 MmAllocateNonCachedMemory(
8960 IN ULONG NumberOfBytes);
8961
8962 NTKERNELAPI
8963 PMDL
8964 NTAPI
8965 MmAllocatePagesForMdl(
8966 IN PHYSICAL_ADDRESS LowAddress,
8967 IN PHYSICAL_ADDRESS HighAddress,
8968 IN PHYSICAL_ADDRESS SkipBytes,
8969 IN SIZE_T TotalBytes);
8970
8971 NTKERNELAPI
8972 VOID
8973 NTAPI
8974 MmBuildMdlForNonPagedPool(
8975 IN OUT PMDL MemoryDescriptorList);
8976
8977 typedef enum _MMFLUSH_TYPE {
8978 MmFlushForDelete,
8979 MmFlushForWrite
8980 } MMFLUSH_TYPE;
8981
8982 NTKERNELAPI
8983 BOOLEAN
8984 NTAPI
8985 MmFlushImageSection(
8986 IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
8987 IN MMFLUSH_TYPE FlushType);
8988
8989 NTKERNELAPI
8990 VOID
8991 NTAPI
8992 MmFreeContiguousMemory(
8993 IN PVOID BaseAddress);
8994
8995 NTKERNELAPI
8996 VOID
8997 NTAPI
8998 MmFreeContiguousMemorySpecifyCache(
8999 IN PVOID BaseAddress,
9000 IN SIZE_T NumberOfBytes,
9001 IN MEMORY_CACHING_TYPE CacheType);
9002
9003 NTKERNELAPI
9004 VOID
9005 NTAPI
9006 MmFreeMappingAddress(
9007 IN PVOID BaseAddress,
9008 IN ULONG PoolTag);
9009
9010 NTKERNELAPI
9011 VOID
9012 NTAPI
9013 MmFreeNonCachedMemory(
9014 IN PVOID BaseAddress,
9015 IN SIZE_T NumberOfBytes);
9016
9017 NTKERNELAPI
9018 VOID
9019 NTAPI
9020 MmFreePagesFromMdl(
9021 IN PMDL MemoryDescriptorList);
9022
9023 /*
9024 * ULONG
9025 * MmGetMdlByteCount(
9026 * IN PMDL Mdl)
9027 */
9028 #define MmGetMdlByteCount(_Mdl) \
9029 ((_Mdl)->ByteCount)
9030
9031 /*
9032 * ULONG
9033 * MmGetMdlByteOffset(
9034 * IN PMDL Mdl)
9035 */
9036 #define MmGetMdlByteOffset(_Mdl) \
9037 ((_Mdl)->ByteOffset)
9038
9039 /*
9040 * PPFN_NUMBER
9041 * MmGetMdlPfnArray(
9042 * IN PMDL Mdl)
9043 */
9044 #define MmGetMdlPfnArray(_Mdl) \
9045 ((PPFN_NUMBER) ((_Mdl) + 1))
9046
9047 /*
9048 * PVOID
9049 * MmGetMdlVirtualAddress(
9050 * IN PMDL Mdl)
9051 */
9052 #define MmGetMdlVirtualAddress(_Mdl) \
9053 ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
9054
9055 NTKERNELAPI
9056 PHYSICAL_ADDRESS
9057 NTAPI
9058 MmGetPhysicalAddress(
9059 IN PVOID BaseAddress);
9060
9061 NTKERNELAPI
9062 PPHYSICAL_MEMORY_RANGE
9063 NTAPI
9064 MmGetPhysicalMemoryRanges(
9065 VOID);
9066
9067 NTKERNELAPI
9068 PVOID
9069 NTAPI
9070 MmGetVirtualForPhysical(
9071 IN PHYSICAL_ADDRESS PhysicalAddress);
9072
9073 NTKERNELAPI
9074 PVOID
9075 NTAPI
9076 MmMapLockedPagesSpecifyCache(
9077 IN PMDL MemoryDescriptorList,
9078 IN KPROCESSOR_MODE AccessMode,
9079 IN MEMORY_CACHING_TYPE CacheType,
9080 IN PVOID BaseAddress,
9081 IN ULONG BugCheckOnFailure,
9082 IN MM_PAGE_PRIORITY Priority);
9083
9084 NTKERNELAPI
9085 PVOID
9086 NTAPI
9087 MmMapLockedPagesWithReservedMapping(
9088 IN PVOID MappingAddress,
9089 IN ULONG PoolTag,
9090 IN PMDL MemoryDescriptorList,
9091 IN MEMORY_CACHING_TYPE CacheType);
9092
9093 NTKERNELAPI
9094 NTSTATUS
9095 NTAPI
9096 MmMapUserAddressesToPage(
9097 IN PVOID BaseAddress,
9098 IN SIZE_T NumberOfBytes,
9099 IN PVOID PageAddress);
9100
9101 NTKERNELAPI
9102 PVOID
9103 NTAPI
9104 MmMapVideoDisplay(
9105 IN PHYSICAL_ADDRESS PhysicalAddress,
9106 IN SIZE_T NumberOfBytes,
9107 IN MEMORY_CACHING_TYPE CacheType);
9108
9109 NTKERNELAPI
9110 NTSTATUS
9111 NTAPI
9112 MmMapViewInSessionSpace(
9113 IN PVOID Section,
9114 OUT PVOID *MappedBase,
9115 IN OUT PSIZE_T ViewSize);
9116
9117 NTKERNELAPI
9118 NTSTATUS
9119 NTAPI
9120 MmMapViewInSystemSpace(
9121 IN PVOID Section,
9122 OUT PVOID *MappedBase,
9123 IN PSIZE_T ViewSize);
9124
9125 NTKERNELAPI
9126 NTSTATUS
9127 NTAPI
9128 MmMarkPhysicalMemoryAsBad(
9129 IN PPHYSICAL_ADDRESS StartAddress,
9130 IN OUT PLARGE_INTEGER NumberOfBytes);
9131
9132 NTKERNELAPI
9133 NTSTATUS
9134 NTAPI
9135 MmMarkPhysicalMemoryAsGood(
9136 IN PPHYSICAL_ADDRESS StartAddress,
9137 IN OUT PLARGE_INTEGER NumberOfBytes);
9138
9139 NTKERNELAPI
9140 PVOID
9141 NTAPI
9142 MmGetSystemRoutineAddress(
9143 IN PUNICODE_STRING SystemRoutineName);
9144
9145 /*
9146 * ULONG
9147 * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
9148 * IN PVOID Va,
9149 * IN ULONG Size)
9150 */
9151 #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, \
9152 _Size) \
9153 ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
9154 + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
9155
9156 /*
9157 * VOID
9158 * MmInitializeMdl(
9159 * IN PMDL MemoryDescriptorList,
9160 * IN PVOID BaseVa,
9161 * IN SIZE_T Length)
9162 */
9163 #define MmInitializeMdl(_MemoryDescriptorList, \
9164 _BaseVa, \
9165 _Length) \
9166 { \
9167 (_MemoryDescriptorList)->Next = (PMDL) NULL; \
9168 (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
9169 (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
9170 (_MemoryDescriptorList)->MdlFlags = 0; \
9171 (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
9172 (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
9173 (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
9174 }
9175
9176 NTKERNELAPI
9177 BOOLEAN
9178 NTAPI
9179 MmIsAddressValid(
9180 IN PVOID VirtualAddress);
9181
9182 NTKERNELAPI
9183 LOGICAL
9184 NTAPI
9185 MmIsDriverVerifying(
9186 IN PDRIVER_OBJECT DriverObject);
9187
9188 NTKERNELAPI
9189 BOOLEAN
9190 NTAPI
9191 MmIsThisAnNtAsSystem(
9192 VOID);
9193
9194 NTKERNELAPI
9195 NTSTATUS
9196 NTAPI
9197 MmIsVerifierEnabled(
9198 OUT PULONG VerifierFlags);
9199
9200 NTKERNELAPI
9201 PVOID
9202 NTAPI
9203 MmLockPagableDataSection(
9204 IN PVOID AddressWithinSection);
9205
9206 NTKERNELAPI
9207 PVOID
9208 NTAPI
9209 MmLockPagableImageSection(
9210 IN PVOID AddressWithinSection);
9211
9212 /*
9213 * PVOID
9214 * MmLockPagableCodeSection(
9215 * IN PVOID AddressWithinSection)
9216 */
9217 #define MmLockPagableCodeSection(Address) MmLockPagableDataSection(Address)
9218
9219 NTKERNELAPI
9220 VOID
9221 NTAPI
9222 MmLockPagableSectionByHandle(
9223 IN PVOID ImageSectionHandle);
9224
9225 NTKERNELAPI
9226 PVOID
9227 NTAPI
9228 MmMapIoSpace(
9229 IN PHYSICAL_ADDRESS PhysicalAddress,
9230 IN ULONG NumberOfBytes,
9231 IN MEMORY_CACHING_TYPE CacheEnable);
9232
9233 NTKERNELAPI
9234 PVOID
9235 NTAPI
9236 MmMapLockedPages(
9237 IN PMDL MemoryDescriptorList,
9238 IN KPROCESSOR_MODE AccessMode);
9239
9240 NTKERNELAPI
9241 PVOID
9242 NTAPI
9243 MmLockPageableDataSection (
9244 IN PVOID AddressWithinSection
9245 );
9246
9247 NTKERNELAPI
9248 VOID
9249 NTAPI
9250 MmUnlockPageableImageSection(
9251 IN PVOID ImageSectionHandle
9252 );
9253
9254 NTKERNELAPI
9255 PVOID
9256 NTAPI
9257 MmPageEntireDriver(
9258 IN PVOID AddressWithinSection);
9259
9260 NTKERNELAPI
9261 VOID
9262 NTAPI
9263 MmProbeAndLockProcessPages(
9264 IN OUT PMDL MemoryDescriptorList,
9265 IN PEPROCESS Process,
9266 IN KPROCESSOR_MODE AccessMode,
9267 IN LOCK_OPERATION Operation);
9268
9269 NTKERNELAPI
9270 NTSTATUS
9271 NTAPI
9272 MmProtectMdlSystemAddress(
9273 IN PMDL MemoryDescriptorList,
9274 IN ULONG NewProtect);
9275
9276 NTKERNELAPI
9277 VOID
9278 NTAPI
9279 MmUnmapLockedPages(
9280 IN PVOID BaseAddress,
9281 IN PMDL MemoryDescriptorList);
9282
9283 NTKERNELAPI
9284 NTSTATUS
9285 NTAPI
9286 MmUnmapViewInSessionSpace(
9287 IN PVOID MappedBase);
9288
9289 NTKERNELAPI
9290 NTSTATUS
9291 NTAPI
9292 MmUnmapViewInSystemSpace(
9293 IN PVOID MappedBase);
9294
9295 NTKERNELAPI
9296 VOID
9297 NTAPI
9298 MmUnsecureVirtualMemory(
9299 IN HANDLE SecureHandle);
9300
9301 /*
9302 * VOID
9303 * MmPrepareMdlForReuse(
9304 * IN PMDL Mdl)
9305 */
9306 #define MmPrepareMdlForReuse(_Mdl) \
9307 { \
9308 if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
9309 ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
9310 MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
9311 } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
9312 ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
9313 } \
9314 }
9315
9316 #define MmGetProcedureAddress(Address) (Address)
9317
9318 NTKERNELAPI
9319 VOID
9320 NTAPI
9321 MmProbeAndLockPages(
9322 IN OUT PMDL MemoryDescriptorList,
9323 IN KPROCESSOR_MODE AccessMode,
9324 IN LOCK_OPERATION Operation);
9325
9326 NTKERNELAPI
9327 MM_SYSTEMSIZE
9328 NTAPI
9329 MmQuerySystemSize(
9330 VOID);
9331
9332 NTKERNELAPI
9333 NTSTATUS
9334 NTAPI
9335 MmRemovePhysicalMemory(
9336 IN PPHYSICAL_ADDRESS StartAddress,
9337 IN OUT PLARGE_INTEGER NumberOfBytes);
9338
9339 NTKERNELAPI
9340 VOID
9341 NTAPI
9342 MmResetDriverPaging(
9343 IN PVOID AddressWithinSection);
9344
9345 NTKERNELAPI
9346 HANDLE
9347 NTAPI
9348 MmSecureVirtualMemory(
9349 IN PVOID Address,
9350 IN SIZE_T Size,
9351 IN ULONG ProbeMode);
9352
9353 NTKERNELAPI
9354 SIZE_T
9355 NTAPI
9356 MmSizeOfMdl(
9357 IN PVOID Base,
9358 IN SIZE_T Length);
9359
9360 NTKERNELAPI
9361 VOID
9362 NTAPI
9363 MmUnlockPagableImageSection(
9364 IN PVOID ImageSectionHandle);
9365
9366 NTKERNELAPI
9367 VOID
9368 NTAPI
9369 MmUnlockPages(
9370 IN PMDL MemoryDescriptorList);
9371
9372 NTKERNELAPI
9373 VOID
9374 NTAPI
9375 MmUnmapIoSpace(
9376 IN PVOID BaseAddress,
9377 IN SIZE_T NumberOfBytes);
9378
9379 NTKERNELAPI
9380 VOID
9381 NTAPI
9382 MmUnmapReservedMapping(
9383 IN PVOID BaseAddress,
9384 IN ULONG PoolTag,
9385 IN PMDL MemoryDescriptorList);
9386
9387 NTKERNELAPI
9388 VOID
9389 NTAPI
9390 MmUnmapVideoDisplay(
9391 IN PVOID BaseAddress,
9392 IN SIZE_T NumberOfBytes);
9393
9394
9395
9396 /** Object manager routines **/
9397
9398 NTKERNELAPI
9399 NTSTATUS
9400 NTAPI
9401 ObAssignSecurity(
9402 IN PACCESS_STATE AccessState,
9403 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
9404 IN PVOID Object,
9405 IN POBJECT_TYPE Type);
9406
9407 NTKERNELAPI
9408 VOID
9409 NTAPI
9410 ObDereferenceSecurityDescriptor(
9411 PSECURITY_DESCRIPTOR SecurityDescriptor,
9412 ULONG Count);
9413
9414 NTKERNELAPI
9415 LONG_PTR
9416 FASTCALL
9417 ObfDereferenceObject(
9418 IN PVOID Object);
9419
9420 /*
9421 * VOID
9422 * ObDereferenceObject(
9423 * IN PVOID Object)
9424 */
9425 #define ObDereferenceObject ObfDereferenceObject
9426
9427 NTKERNELAPI
9428 NTSTATUS
9429 NTAPI
9430 ObGetObjectSecurity(
9431 IN PVOID Object,
9432 OUT PSECURITY_DESCRIPTOR *SecurityDescriptor,
9433 OUT PBOOLEAN MemoryAllocated);
9434
9435 NTKERNELAPI
9436 NTSTATUS
9437 NTAPI
9438 ObInsertObject(
9439 IN PVOID Object,
9440 IN PACCESS_STATE PassedAccessState OPTIONAL,
9441 IN ACCESS_MASK DesiredAccess,
9442 IN ULONG AdditionalReferences,
9443 OUT PVOID* ReferencedObject OPTIONAL,
9444 OUT PHANDLE Handle);
9445
9446 NTKERNELAPI
9447 LONG_PTR
9448 FASTCALL
9449 ObfReferenceObject(
9450 IN PVOID Object);
9451
9452 NTKERNELAPI
9453 NTSTATUS
9454 NTAPI
9455 ObLogSecurityDescriptor(
9456 IN PSECURITY_DESCRIPTOR InputSecurityDescriptor,
9457 OUT PSECURITY_DESCRIPTOR *OutputSecurityDescriptor,
9458 IN ULONG RefBias);
9459 /*
9460 * VOID
9461 * ObReferenceObject(
9462 * IN PVOID Object)
9463 */
9464 #define ObReferenceObject ObfReferenceObject
9465
9466 NTKERNELAPI
9467 VOID
9468 NTAPI
9469 ObMakeTemporaryObject(
9470 IN PVOID Object);
9471
9472 NTKERNELAPI
9473 NTSTATUS
9474 NTAPI
9475 ObOpenObjectByName(
9476 IN POBJECT_ATTRIBUTES ObjectAttributes,
9477 IN POBJECT_TYPE ObjectType,
9478 IN KPROCESSOR_MODE AccessMode,
9479 IN PACCESS_STATE PassedAccessState,
9480 IN ACCESS_MASK DesiredAccess,
9481 IN OUT PVOID ParseContext OPTIONAL,
9482 OUT PHANDLE Handle);
9483
9484 NTKERNELAPI
9485 NTSTATUS
9486 NTAPI
9487 ObOpenObjectByPointer(
9488 IN PVOID Object,
9489 IN ULONG HandleAttributes,
9490 IN PACCESS_STATE PassedAccessState OPTIONAL,
9491 IN ACCESS_MASK DesiredAccess OPTIONAL,
9492 IN POBJECT_TYPE ObjectType OPTIONAL,
9493 IN KPROCESSOR_MODE AccessMode,
9494 OUT PHANDLE Handle);
9495
9496 NTKERNELAPI
9497 NTSTATUS
9498 NTAPI
9499 ObQueryObjectAuditingByHandle(
9500 IN HANDLE Handle,
9501 OUT PBOOLEAN GenerateOnClose);
9502
9503 NTKERNELAPI
9504 NTSTATUS
9505 NTAPI
9506 ObReferenceObjectByHandle(
9507 IN HANDLE Handle,
9508 IN ACCESS_MASK DesiredAccess,
9509 IN POBJECT_TYPE ObjectType OPTIONAL,
9510 IN KPROCESSOR_MODE AccessMode,
9511 OUT PVOID *Object,
9512 OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL);
9513
9514 NTKERNELAPI
9515 NTSTATUS
9516 NTAPI
9517 ObReferenceObjectByName(
9518 IN PUNICODE_STRING ObjectPath,
9519 IN ULONG Attributes,
9520 IN PACCESS_STATE PassedAccessState OPTIONAL,
9521 IN ACCESS_MASK DesiredAccess OPTIONAL,
9522 IN POBJECT_TYPE ObjectType,
9523 IN KPROCESSOR_MODE AccessMode,
9524 IN OUT PVOID ParseContext OPTIONAL,
9525 OUT PVOID *Object);
9526
9527 NTKERNELAPI
9528 NTSTATUS
9529 NTAPI
9530 ObReferenceObjectByPointer(
9531 IN PVOID Object,
9532 IN ACCESS_MASK DesiredAccess,
9533 IN POBJECT_TYPE ObjectType,
9534 IN KPROCESSOR_MODE AccessMode);
9535
9536 NTKERNELAPI
9537 VOID
9538 NTAPI
9539 ObReferenceSecurityDescriptor(
9540 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
9541 IN ULONG Count);
9542
9543 NTKERNELAPI
9544 VOID
9545 NTAPI
9546 ObReleaseObjectSecurity(
9547 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
9548 IN BOOLEAN MemoryAllocated);
9549
9550
9551
9552 /** Process manager routines **/
9553
9554 NTKERNELAPI
9555 NTSTATUS
9556 NTAPI
9557 PsCreateSystemProcess(
9558 IN PHANDLE ProcessHandle,
9559 IN ACCESS_MASK DesiredAccess,
9560 IN POBJECT_ATTRIBUTES ObjectAttributes);
9561
9562 NTKERNELAPI
9563 NTSTATUS
9564 NTAPI
9565 PsCreateSystemThread(
9566 OUT PHANDLE ThreadHandle,
9567 IN ULONG DesiredAccess,
9568 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
9569 IN HANDLE ProcessHandle OPTIONAL,
9570 OUT PCLIENT_ID ClientId OPTIONAL,
9571 IN PKSTART_ROUTINE StartRoutine,
9572 IN PVOID StartContext);
9573
9574 /*
9575 * PEPROCESS
9576 * PsGetCurrentProcess(VOID)
9577 */
9578 #define PsGetCurrentProcess IoGetCurrentProcess
9579
9580 NTKERNELAPI
9581 HANDLE
9582 NTAPI
9583 PsGetCurrentProcessId(
9584 VOID);
9585
9586 /*
9587 * PETHREAD
9588 * PsGetCurrentThread(VOID)
9589 */
9590 #define PsGetCurrentThread() \
9591 ((PETHREAD) KeGetCurrentThread())
9592
9593 NTKERNELAPI
9594 HANDLE
9595 NTAPI
9596 PsGetCurrentThreadId(
9597 VOID);
9598
9599 NTKERNELAPI
9600 HANDLE
9601 NTAPI
9602 PsGetProcessId(PEPROCESS Process);
9603
9604 NTKERNELAPI
9605 BOOLEAN
9606 NTAPI
9607 PsGetVersion(
9608 PULONG MajorVersion OPTIONAL,
9609 PULONG MinorVersion OPTIONAL,
9610 PULONG BuildNumber OPTIONAL,
9611 PUNICODE_STRING CSDVersion OPTIONAL);
9612
9613 NTKERNELAPI
9614 NTSTATUS
9615 NTAPI
9616 PsRemoveCreateThreadNotifyRoutine(
9617 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
9618
9619 NTKERNELAPI
9620 NTSTATUS
9621 NTAPI
9622 PsRemoveLoadImageNotifyRoutine(
9623 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
9624
9625 NTKERNELAPI
9626 NTSTATUS
9627 NTAPI
9628 PsSetCreateProcessNotifyRoutine(
9629 IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
9630 IN BOOLEAN Remove);
9631
9632 NTKERNELAPI
9633 NTSTATUS
9634 NTAPI
9635 PsSetCreateThreadNotifyRoutine(
9636 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
9637
9638 NTKERNELAPI
9639 NTSTATUS
9640 NTAPI
9641 PsSetLoadImageNotifyRoutine(
9642 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
9643
9644 NTKERNELAPI
9645 NTSTATUS
9646 NTAPI
9647 PsTerminateSystemThread(
9648 IN NTSTATUS ExitStatus);
9649
9650 extern NTSYSAPI PEPROCESS PsInitialSystemProcess;
9651
9652
9653 /** Security reference monitor routines **/
9654
9655 NTKERNELAPI
9656 BOOLEAN
9657 NTAPI
9658 SeAccessCheck(
9659 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
9660 IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext,
9661 IN BOOLEAN SubjectContextLocked,
9662 IN ACCESS_MASK DesiredAccess,
9663 IN ACCESS_MASK PreviouslyGrantedAccess,
9664 OUT PPRIVILEGE_SET *Privileges OPTIONAL,
9665 IN PGENERIC_MAPPING GenericMapping,
9666 IN KPROCESSOR_MODE AccessMode,
9667 OUT PACCESS_MASK GrantedAccess,
9668 OUT PNTSTATUS AccessStatus);
9669
9670 NTKERNELAPI
9671 NTSTATUS
9672 NTAPI
9673 SeAssignSecurity(
9674 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
9675 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
9676 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
9677 IN BOOLEAN IsDirectoryObject,
9678 IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
9679 IN PGENERIC_MAPPING GenericMapping,
9680 IN POOL_TYPE PoolType);
9681
9682 NTKERNELAPI
9683 NTSTATUS
9684 NTAPI
9685 SeAssignSecurityEx(
9686 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
9687 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
9688 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
9689 IN GUID *ObjectType OPTIONAL,
9690 IN BOOLEAN IsDirectoryObject,
9691 IN ULONG AutoInheritFlags,
9692 IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
9693 IN PGENERIC_MAPPING GenericMapping,
9694 IN POOL_TYPE PoolType);
9695
9696 NTKERNELAPI
9697 NTSTATUS
9698 NTAPI
9699 SeDeassignSecurity(
9700 IN OUT PSECURITY_DESCRIPTOR *SecurityDescriptor);
9701
9702 NTKERNELAPI
9703 BOOLEAN
9704 NTAPI
9705 SeSinglePrivilegeCheck(
9706 LUID PrivilegeValue,
9707 KPROCESSOR_MODE PreviousMode);
9708
9709 NTKERNELAPI
9710 BOOLEAN
9711 NTAPI
9712 SeValidSecurityDescriptor(
9713 IN ULONG Length,
9714 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
9715
9716
9717
9718 /** NtXxx routines **/
9719
9720 NTSYSCALLAPI
9721 NTSTATUS
9722 NTAPI
9723 NtOpenProcess(
9724 OUT PHANDLE ProcessHandle,
9725 IN ACCESS_MASK DesiredAccess,
9726 IN POBJECT_ATTRIBUTES ObjectAttributes,
9727 IN PCLIENT_ID ClientId OPTIONAL);
9728
9729 NTSYSCALLAPI
9730 NTSTATUS
9731 NTAPI
9732 NtQueryInformationProcess(
9733 IN HANDLE ProcessHandle,
9734 IN PROCESSINFOCLASS ProcessInformationClass,
9735 OUT PVOID ProcessInformation,
9736 IN ULONG ProcessInformationLength,
9737 OUT PULONG ReturnLength OPTIONAL);
9738
9739
9740
9741 /** NtXxx and ZwXxx routines **/
9742
9743 NTSYSAPI
9744 NTSTATUS
9745 NTAPI
9746 ZwCancelTimer(
9747 IN HANDLE TimerHandle,
9748 OUT PBOOLEAN CurrentState OPTIONAL);
9749
9750 NTSYSCALLAPI
9751 NTSTATUS
9752 NTAPI
9753 NtClose(
9754 IN HANDLE Handle);
9755
9756 NTSYSAPI
9757 NTSTATUS
9758 NTAPI
9759 ZwClose(
9760 IN HANDLE Handle);
9761
9762 NTSYSAPI
9763 NTSTATUS
9764 NTAPI
9765 ZwCreateDirectoryObject(
9766 OUT PHANDLE DirectoryHandle,
9767 IN ACCESS_MASK DesiredAccess,
9768 IN POBJECT_ATTRIBUTES ObjectAttributes);
9769
9770 NTSYSCALLAPI
9771 NTSTATUS
9772 NTAPI
9773 NtCreateEvent(
9774 OUT PHANDLE EventHandle,
9775 IN ACCESS_MASK DesiredAccess,
9776 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
9777 IN EVENT_TYPE EventType,
9778 IN BOOLEAN InitialState);
9779
9780 NTSYSAPI
9781 NTSTATUS
9782 NTAPI
9783 ZwCreateEvent(
9784 OUT PHANDLE EventHandle,
9785 IN ACCESS_MASK DesiredAccess,
9786 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
9787 IN EVENT_TYPE EventType,
9788 IN BOOLEAN InitialState);
9789
9790 NTSYSAPI
9791 NTSTATUS
9792 NTAPI
9793 ZwCreateFile(
9794 OUT PHANDLE FileHandle,
9795 IN ACCESS_MASK DesiredAccess,
9796 IN POBJECT_ATTRIBUTES ObjectAttributes,
9797 OUT PIO_STATUS_BLOCK IoStatusBlock,
9798 IN PLARGE_INTEGER AllocationSize OPTIONAL,
9799 IN ULONG FileAttributes,
9800 IN ULONG ShareAccess,
9801 IN ULONG CreateDisposition,
9802 IN ULONG CreateOptions,
9803 IN PVOID EaBuffer OPTIONAL,
9804 IN ULONG EaLength);
9805
9806 NTSYSAPI
9807 NTSTATUS
9808 NTAPI
9809 ZwCreateKey(
9810 OUT PHANDLE KeyHandle,
9811 IN ACCESS_MASK DesiredAccess,
9812 IN POBJECT_ATTRIBUTES ObjectAttributes,
9813 IN ULONG TitleIndex,
9814 IN PUNICODE_STRING Class OPTIONAL,
9815 IN ULONG CreateOptions,
9816 OUT PULONG Disposition OPTIONAL);
9817
9818 NTSYSAPI
9819 NTSTATUS
9820 NTAPI
9821 ZwCreateTimer(
9822 OUT PHANDLE TimerHandle,
9823 IN ACCESS_MASK DesiredAccess,
9824 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
9825 IN TIMER_TYPE TimerType);
9826
9827 NTSYSAPI
9828 NTSTATUS
9829 NTAPI
9830 ZwDeleteKey(
9831 IN HANDLE KeyHandle);
9832
9833 NTSYSAPI
9834 NTSTATUS
9835 NTAPI
9836 ZwDeleteValueKey(
9837 IN HANDLE KeyHandle,
9838 IN PUNICODE_STRING ValueName);
9839
9840 NTSYSCALLAPI
9841 NTSTATUS
9842 NTAPI
9843 NtDeviceIoControlFile(
9844 IN HANDLE DeviceHandle,
9845 IN HANDLE Event OPTIONAL,
9846 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
9847 IN PVOID UserApcContext OPTIONAL,
9848 OUT PIO_STATUS_BLOCK IoStatusBlock,
9849 IN ULONG IoControlCode,
9850 IN PVOID InputBuffer,
9851 IN ULONG InputBufferSize,
9852 OUT PVOID OutputBuffer,
9853 IN ULONG OutputBufferSize);
9854
9855 NTSYSAPI
9856 NTSTATUS
9857 NTAPI
9858 ZwDeviceIoControlFile(
9859 IN HANDLE DeviceHandle,
9860 IN HANDLE Event OPTIONAL,
9861 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
9862 IN PVOID UserApcContext OPTIONAL,
9863 OUT PIO_STATUS_BLOCK IoStatusBlock,
9864 IN ULONG IoControlCode,
9865 IN PVOID InputBuffer,
9866 IN ULONG InputBufferSize,
9867 OUT PVOID OutputBuffer,
9868 IN ULONG OutputBufferSize);
9869
9870 NTSYSAPI
9871 NTSTATUS
9872 NTAPI
9873 ZwEnumerateKey(
9874 IN HANDLE KeyHandle,
9875 IN ULONG Index,
9876 IN KEY_INFORMATION_CLASS KeyInformationClass,
9877 OUT PVOID KeyInformation,
9878 IN ULONG Length,
9879 OUT PULONG ResultLength);
9880
9881 NTSYSAPI
9882 NTSTATUS
9883 NTAPI
9884 ZwEnumerateValueKey(
9885 IN HANDLE KeyHandle,
9886 IN ULONG Index,
9887 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
9888 OUT PVOID KeyValueInformation,
9889 IN ULONG Length,
9890 OUT PULONG ResultLength);
9891
9892 NTSYSAPI
9893 NTSTATUS
9894 NTAPI
9895 ZwFlushKey(
9896 IN HANDLE KeyHandle);
9897
9898 NTSYSAPI
9899 NTSTATUS
9900 NTAPI
9901 ZwMakeTemporaryObject(
9902 IN HANDLE Handle);
9903
9904 NTSYSCALLAPI
9905 NTSTATUS
9906 NTAPI
9907 NtMapViewOfSection(
9908 IN HANDLE SectionHandle,
9909 IN HANDLE ProcessHandle,
9910 IN OUT PVOID *BaseAddress,
9911 IN ULONG_PTR ZeroBits,
9912 IN SIZE_T CommitSize,
9913 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
9914 IN OUT PSIZE_T ViewSize,
9915 IN SECTION_INHERIT InheritDisposition,
9916 IN ULONG AllocationType,
9917 IN ULONG Protect);
9918
9919 NTSYSAPI
9920 NTSTATUS
9921 NTAPI
9922 ZwMapViewOfSection(
9923 IN HANDLE SectionHandle,
9924 IN HANDLE ProcessHandle,
9925 IN OUT PVOID *BaseAddress,
9926 IN ULONG_PTR ZeroBits,
9927 IN SIZE_T CommitSize,
9928 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
9929 IN OUT PSIZE_T ViewSize,
9930 IN SECTION_INHERIT InheritDisposition,
9931 IN ULONG AllocationType,
9932 IN ULONG Protect);
9933
9934 NTSYSCALLAPI
9935 NTSTATUS
9936 NTAPI
9937 NtOpenFile(
9938 OUT PHANDLE FileHandle,
9939 IN ACCESS_MASK DesiredAccess,
9940 IN POBJECT_ATTRIBUTES ObjectAttributes,
9941 OUT PIO_STATUS_BLOCK IoStatusBlock,
9942 IN ULONG ShareAccess,
9943 IN ULONG OpenOptions);
9944
9945 NTSYSAPI
9946 NTSTATUS
9947 NTAPI
9948 ZwOpenFile(
9949 OUT PHANDLE FileHandle,
9950 IN ACCESS_MASK DesiredAccess,
9951 IN POBJECT_ATTRIBUTES ObjectAttributes,
9952 OUT PIO_STATUS_BLOCK IoStatusBlock,
9953 IN ULONG ShareAccess,
9954 IN ULONG OpenOptions);
9955
9956 NTSYSAPI
9957 NTSTATUS
9958 NTAPI
9959 ZwOpenKey(
9960 OUT PHANDLE KeyHandle,
9961 IN ACCESS_MASK DesiredAccess,
9962 IN POBJECT_ATTRIBUTES ObjectAttributes);
9963
9964 NTSYSAPI
9965 NTSTATUS
9966 NTAPI
9967 ZwOpenSection(
9968 OUT PHANDLE SectionHandle,
9969 IN ACCESS_MASK DesiredAccess,
9970 IN POBJECT_ATTRIBUTES ObjectAttributes);
9971
9972 NTSYSAPI
9973 NTSTATUS
9974 NTAPI
9975 ZwOpenSymbolicLinkObject(
9976 OUT PHANDLE LinkHandle,
9977 IN ACCESS_MASK DesiredAccess,
9978 IN POBJECT_ATTRIBUTES ObjectAttributes);
9979
9980 NTSYSAPI
9981 NTSTATUS
9982 NTAPI
9983 ZwOpenTimer(
9984 OUT PHANDLE TimerHandle,
9985 IN ACCESS_MASK DesiredAccess,
9986 IN POBJECT_ATTRIBUTES ObjectAttributes);
9987
9988 NTSYSAPI
9989 NTSTATUS
9990 NTAPI
9991 ZwQueryInformationFile(
9992 IN HANDLE FileHandle,
9993 OUT PIO_STATUS_BLOCK IoStatusBlock,
9994 OUT PVOID FileInformation,
9995 IN ULONG Length,
9996 IN FILE_INFORMATION_CLASS FileInformationClass);
9997
9998 NTSYSAPI
9999 NTSTATUS
10000 NTAPI
10001 ZwQueryKey(
10002 IN HANDLE KeyHandle,
10003 IN KEY_INFORMATION_CLASS KeyInformationClass,
10004 OUT PVOID KeyInformation,
10005 IN ULONG Length,
10006 OUT PULONG ResultLength);
10007
10008 NTSYSAPI
10009 NTSTATUS
10010 NTAPI
10011 ZwQuerySymbolicLinkObject(
10012 IN HANDLE LinkHandle,
10013 IN OUT PUNICODE_STRING LinkTarget,
10014 OUT PULONG ReturnedLength OPTIONAL);
10015
10016 NTSYSAPI
10017 NTSTATUS
10018 NTAPI
10019 ZwQueryValueKey(
10020 IN HANDLE KeyHandle,
10021 IN PUNICODE_STRING ValueName,
10022 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
10023 OUT PVOID KeyValueInformation,
10024 IN ULONG Length,
10025 OUT PULONG ResultLength);
10026
10027 NTSYSCALLAPI
10028 NTSTATUS
10029 NTAPI
10030 NtReadFile(
10031 IN HANDLE FileHandle,
10032 IN HANDLE Event OPTIONAL,
10033 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
10034 IN PVOID ApcContext OPTIONAL,
10035 OUT PIO_STATUS_BLOCK IoStatusBlock,
10036 OUT PVOID Buffer,
10037 IN ULONG Length,
10038 IN PLARGE_INTEGER ByteOffset OPTIONAL,
10039 IN PULONG Key OPTIONAL);
10040
10041 NTSYSAPI
10042 NTSTATUS
10043 NTAPI
10044 ZwReadFile(
10045 IN HANDLE FileHandle,
10046 IN HANDLE Event OPTIONAL,
10047 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
10048 IN PVOID ApcContext OPTIONAL,
10049 OUT PIO_STATUS_BLOCK IoStatusBlock,
10050 OUT PVOID Buffer,
10051 IN ULONG Length,
10052 IN PLARGE_INTEGER ByteOffset OPTIONAL,
10053 IN PULONG Key OPTIONAL);
10054
10055 NTSYSCALLAPI
10056 NTSTATUS
10057 NTAPI
10058 NtSetEvent(
10059 IN HANDLE EventHandle,
10060 OUT PLONG PreviousState OPTIONAL);
10061
10062 NTSYSAPI
10063 NTSTATUS
10064 NTAPI
10065 ZwSetEvent(
10066 IN HANDLE EventHandle,
10067 OUT PLONG PreviousState OPTIONAL);
10068
10069 NTSYSAPI
10070 NTSTATUS
10071 NTAPI
10072 ZwSetInformationFile(
10073 IN HANDLE FileHandle,
10074 OUT PIO_STATUS_BLOCK IoStatusBlock,
10075 IN PVOID FileInformation,
10076 IN ULONG Length,
10077 IN FILE_INFORMATION_CLASS FileInformationClass);
10078
10079 NTSYSAPI
10080 NTSTATUS
10081 NTAPI
10082 ZwSetInformationThread(
10083 IN HANDLE ThreadHandle,
10084 IN THREADINFOCLASS ThreadInformationClass,
10085 IN PVOID ThreadInformation,
10086 IN ULONG ThreadInformationLength);
10087
10088 NTSYSAPI
10089 NTSTATUS
10090 NTAPI
10091 ZwSetTimer(
10092 IN HANDLE TimerHandle,
10093 IN PLARGE_INTEGER DueTime,
10094 IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL,
10095 IN PVOID TimerContext OPTIONAL,
10096 IN BOOLEAN WakeTimer,
10097 IN LONG Period OPTIONAL,
10098 OUT PBOOLEAN PreviousState OPTIONAL);
10099
10100 NTSYSAPI
10101 NTSTATUS
10102 NTAPI
10103 ZwSetValueKey(
10104 IN HANDLE KeyHandle,
10105 IN PUNICODE_STRING ValueName,
10106 IN ULONG TitleIndex OPTIONAL,
10107 IN ULONG Type,
10108 IN PVOID Data,
10109 IN ULONG DataSize);
10110
10111 /* [Nt|Zw]MapViewOfSection.InheritDisposition constants */
10112 #define AT_EXTENDABLE_FILE 0x00002000
10113 #define AT_RESERVED 0x20000000
10114 #define AT_ROUND_TO_PAGE 0x40000000
10115
10116 NTSYSCALLAPI
10117 NTSTATUS
10118 NTAPI
10119 NtUnmapViewOfSection(
10120 IN HANDLE ProcessHandle,
10121 IN PVOID BaseAddress);
10122
10123 NTSYSAPI
10124 NTSTATUS
10125 NTAPI
10126 ZwUnmapViewOfSection(
10127 IN HANDLE ProcessHandle,
10128 IN PVOID BaseAddress);
10129
10130 NTSYSCALLAPI
10131 NTSTATUS
10132 NTAPI
10133 NtWaitForSingleObject(
10134 IN HANDLE ObjectHandle,
10135 IN BOOLEAN Alertable,
10136 IN PLARGE_INTEGER TimeOut OPTIONAL);
10137
10138 NTSYSAPI
10139 NTSTATUS
10140 NTAPI
10141 ZwWaitForSingleObject(
10142 IN HANDLE ObjectHandle,
10143 IN BOOLEAN Alertable,
10144 IN PLARGE_INTEGER TimeOut OPTIONAL);
10145
10146 NTSYSCALLAPI
10147 NTSTATUS
10148 NTAPI
10149 NtWriteFile(
10150 IN HANDLE FileHandle,
10151 IN HANDLE Event OPTIONAL,
10152 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
10153 IN PVOID ApcContext OPTIONAL,
10154 OUT PIO_STATUS_BLOCK IoStatusBlock,
10155 IN PVOID Buffer,
10156 IN ULONG Length,
10157 IN PLARGE_INTEGER ByteOffset OPTIONAL,
10158 IN PULONG Key OPTIONAL);
10159
10160 NTSYSAPI
10161 NTSTATUS
10162 NTAPI
10163 ZwWriteFile(
10164 IN HANDLE FileHandle,
10165 IN HANDLE Event OPTIONAL,
10166 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
10167 IN PVOID ApcContext OPTIONAL,
10168 OUT PIO_STATUS_BLOCK IoStatusBlock,
10169 IN PVOID Buffer,
10170 IN ULONG Length,
10171 IN PLARGE_INTEGER ByteOffset OPTIONAL,
10172 IN PULONG Key OPTIONAL);
10173
10174
10175
10176 /** Power management support routines **/
10177
10178 NTKERNELAPI
10179 NTSTATUS
10180 NTAPI
10181 PoCallDriver(
10182 IN PDEVICE_OBJECT DeviceObject,
10183 IN OUT PIRP Irp);
10184
10185 NTKERNELAPI
10186 PULONG
10187 NTAPI
10188 PoRegisterDeviceForIdleDetection(
10189 IN PDEVICE_OBJECT DeviceObject,
10190 IN ULONG ConservationIdleTime,
10191 IN ULONG PerformanceIdleTime,
10192 IN DEVICE_POWER_STATE State);
10193
10194 NTKERNELAPI
10195 PVOID
10196 NTAPI
10197 PoRegisterSystemState(
10198 IN PVOID StateHandle,
10199 IN EXECUTION_STATE Flags);
10200
10201 NTKERNELAPI
10202 NTSTATUS
10203 NTAPI
10204 PoRequestPowerIrp(
10205 IN PDEVICE_OBJECT DeviceObject,
10206 IN UCHAR MinorFunction,
10207 IN POWER_STATE PowerState,
10208 IN PREQUEST_POWER_COMPLETE CompletionFunction,
10209 IN PVOID Context,
10210 OUT PIRP *Irp OPTIONAL);
10211
10212 NTKERNELAPI
10213 NTSTATUS
10214 NTAPI
10215 PoRequestShutdownEvent(
10216 OUT PVOID *Event);
10217
10218 NTKERNELAPI
10219 VOID
10220 NTAPI
10221 PoSetDeviceBusy(
10222 PULONG IdlePointer);
10223
10224 #define PoSetDeviceBusy(IdlePointer) \
10225 ((void)(*(IdlePointer) = 0))
10226
10227 NTKERNELAPI
10228 POWER_STATE
10229 NTAPI
10230 PoSetPowerState(
10231 IN PDEVICE_OBJECT DeviceObject,
10232 IN POWER_STATE_TYPE Type,
10233 IN POWER_STATE State);
10234
10235 NTKERNELAPI
10236 VOID
10237 NTAPI
10238 PoSetSystemState(
10239 IN EXECUTION_STATE Flags);
10240
10241 NTKERNELAPI
10242 VOID
10243 NTAPI
10244 PoStartNextPowerIrp(
10245 IN PIRP Irp);
10246
10247 NTKERNELAPI
10248 VOID
10249 NTAPI
10250 PoUnregisterSystemState(
10251 IN PVOID StateHandle);
10252
10253
10254
10255 /** WMI library support routines **/
10256
10257 NTSTATUS
10258 NTAPI
10259 WmiCompleteRequest(
10260 IN PDEVICE_OBJECT DeviceObject,
10261 IN PIRP Irp,
10262 IN NTSTATUS Status,
10263 IN ULONG BufferUsed,
10264 IN CCHAR PriorityBoost);
10265
10266 NTSTATUS
10267 NTAPI
10268 WmiFireEvent(
10269 IN PDEVICE_OBJECT DeviceObject,
10270 IN LPGUID Guid,
10271 IN ULONG InstanceIndex,
10272 IN ULONG EventDataSize,
10273 IN PVOID EventData);
10274
10275 NTKERNELAPI
10276 NTSTATUS
10277 NTAPI
10278 WmiQueryTraceInformation(
10279 IN TRACE_INFORMATION_CLASS TraceInformationClass,
10280 OUT PVOID TraceInformation,
10281 IN ULONG TraceInformationLength,
10282 OUT PULONG RequiredLength OPTIONAL,
10283 IN PVOID Buffer OPTIONAL);
10284
10285 NTSTATUS
10286 NTAPI
10287 WmiSystemControl(
10288 IN PWMILIB_CONTEXT WmiLibInfo,
10289 IN PDEVICE_OBJECT DeviceObject,
10290 IN PIRP Irp,
10291 OUT PSYSCTL_IRP_DISPOSITION IrpDisposition);
10292
10293 NTKERNELAPI
10294 NTSTATUS
10295 DDKCDECLAPI
10296 WmiTraceMessage(
10297 IN TRACEHANDLE LoggerHandle,
10298 IN ULONG MessageFlags,
10299 IN LPGUID MessageGuid,
10300 IN USHORT MessageNumber,
10301 IN ...);
10302
10303 #if 0
10304 /* FIXME: Get va_list from where? */
10305 NTKERNELAPI
10306 NTSTATUS
10307 DDKCDECLAPI
10308 WmiTraceMessageVa(
10309 IN TRACEHANDLE LoggerHandle,
10310 IN ULONG MessageFlags,
10311 IN LPGUID MessageGuid,
10312 IN USHORT MessageNumber,
10313 IN va_list MessageArgList);
10314 #endif
10315
10316
10317 /** Kernel debugger routines **/
10318
10319 NTKERNELAPI
10320 NTSTATUS
10321 NTAPI
10322 KdDisableDebugger(
10323 VOID);
10324
10325 NTKERNELAPI
10326 NTSTATUS
10327 NTAPI
10328 KdEnableDebugger(
10329 VOID);
10330
10331 NTKERNELAPI
10332 BOOLEAN
10333 NTAPI
10334 KdRefreshDebuggerNotPresent(
10335 VOID
10336 );
10337
10338 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
10339 NTKERNELAPI
10340 NTSTATUS
10341 NTAPI
10342 KdChangeOption(
10343 IN KD_OPTION Option,
10344 IN ULONG InBufferBytes OPTIONAL,
10345 IN PVOID InBuffer,
10346 IN ULONG OutBufferBytes OPTIONAL,
10347 OUT PVOID OutBuffer,
10348 OUT PULONG OutBufferNeeded OPTIONAL);
10349 #endif
10350
10351 VOID
10352 NTAPI
10353 DbgBreakPoint(
10354 VOID);
10355
10356 NTSYSAPI
10357 VOID
10358 NTAPI
10359 DbgBreakPointWithStatus(
10360 IN ULONG Status);
10361
10362 ULONG
10363 DDKCDECLAPI
10364 DbgPrint(
10365 IN PCCH Format,
10366 IN ...);
10367
10368 NTSYSAPI
10369 ULONG
10370 DDKCDECLAPI
10371 DbgPrintEx(
10372 IN ULONG ComponentId,
10373 IN ULONG Level,
10374 IN PCCH Format,
10375 IN ...);
10376
10377 ULONG
10378 NTAPI
10379 vDbgPrintEx(
10380 IN ULONG ComponentId,
10381 IN ULONG Level,
10382 IN PCCH Format,
10383 IN va_list ap);
10384
10385 ULONG
10386 NTAPI
10387 vDbgPrintExWithPrefix(
10388 IN PCCH Prefix,
10389 IN ULONG ComponentId,
10390 IN ULONG Level,
10391 IN PCCH Format,
10392 IN va_list ap);
10393
10394 NTKERNELAPI
10395 ULONG
10396 DDKCDECLAPI
10397 DbgPrintReturnControlC(
10398 IN PCCH Format,
10399 IN ...);
10400
10401 ULONG
10402 NTAPI
10403 DbgPrompt(
10404 IN PCCH Prompt,
10405 OUT PCH Response,
10406 IN ULONG MaximumResponseLength
10407 );
10408
10409 NTKERNELAPI
10410 NTSTATUS
10411 NTAPI
10412 DbgQueryDebugFilterState(
10413 IN ULONG ComponentId,
10414 IN ULONG Level);
10415
10416 NTKERNELAPI
10417 NTSTATUS
10418 NTAPI
10419 DbgSetDebugFilterState(
10420 IN ULONG ComponentId,
10421 IN ULONG Level,
10422 IN BOOLEAN State);
10423
10424 #if DBG
10425
10426 #define KdPrint(_x_) DbgPrint _x_
10427 #define KdPrintEx(_x_) DbgPrintEx _x_
10428 #define KdBreakPoint() DbgBreakPoint()
10429 #define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
10430
10431 #else /* !DBG */
10432
10433 #define KdPrint(_x_)
10434 #define KdPrintEx(_x_)
10435 #define KdBreakPoint()
10436 #define KdBreakPointWithStatus(s)
10437
10438 #endif /* !DBG */
10439
10440 #if defined(__GNUC__)
10441
10442 extern NTKERNELAPI BOOLEAN KdDebuggerNotPresent;
10443 extern NTKERNELAPI BOOLEAN KdDebuggerEnabled;
10444 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
10445 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
10446
10447 #elif defined(_NTDDK_) || defined(_NTHAL_) || defined(_WDMDDK_) || defined(_NTOSP_)
10448
10449 extern NTKERNELAPI PBOOLEAN KdDebuggerNotPresent;
10450 extern NTKERNELAPI PBOOLEAN KdDebuggerEnabled;
10451 #define KD_DEBUGGER_ENABLED *KdDebuggerEnabled
10452 #define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
10453
10454 #else
10455
10456 extern BOOLEAN KdDebuggerNotPresent;
10457 extern BOOLEAN KdDebuggerEnabled;
10458 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
10459 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
10460
10461 #endif
10462
10463 /** Stuff from winnt4.h */
10464
10465 #ifndef DMA_MACROS_DEFINED
10466
10467 #if (NTDDI_VERSION >= NTDDI_WIN2K)
10468
10469 //DECLSPEC_DEPRECATED_DDK
10470 NTHALAPI
10471 BOOLEAN
10472 NTAPI
10473 IoFlushAdapterBuffers(
10474 IN PADAPTER_OBJECT AdapterObject,
10475 IN PMDL Mdl,
10476 IN PVOID MapRegisterBase,
10477 IN PVOID CurrentVa,
10478 IN ULONG Length,
10479 IN BOOLEAN WriteToDevice);
10480
10481 //DECLSPEC_DEPRECATED_DDK
10482 NTHALAPI
10483 VOID
10484 NTAPI
10485 IoFreeAdapterChannel(
10486 IN PADAPTER_OBJECT AdapterObject);
10487
10488 //DECLSPEC_DEPRECATED_DDK
10489 NTHALAPI
10490 VOID
10491 NTAPI
10492 IoFreeMapRegisters(
10493 IN PADAPTER_OBJECT AdapterObject,
10494 IN PVOID MapRegisterBase,
10495 IN ULONG NumberOfMapRegisters);
10496
10497 //DECLSPEC_DEPRECATED_DDK
10498 NTHALAPI
10499 PHYSICAL_ADDRESS
10500 NTAPI
10501 IoMapTransfer(
10502 IN PADAPTER_OBJECT AdapterObject,
10503 IN PMDL Mdl,
10504 IN PVOID MapRegisterBase,
10505 IN PVOID CurrentVa,
10506 IN OUT PULONG Length,
10507 IN BOOLEAN WriteToDevice);
10508
10509
10510 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
10511 #endif // !defined(DMA_MACROS_DEFINED)
10512
10513 NTKERNELAPI
10514 NTSTATUS
10515 NTAPI
10516 IoAssignResources(
10517 IN PUNICODE_STRING RegistryPath,
10518 IN PUNICODE_STRING DriverClassName OPTIONAL,
10519 IN PDRIVER_OBJECT DriverObject,
10520 IN PDEVICE_OBJECT DeviceObject OPTIONAL,
10521 IN PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources,
10522 IN OUT PCM_RESOURCE_LIST *AllocatedResources);
10523
10524 NTKERNELAPI
10525 NTSTATUS
10526 NTAPI
10527 IoAttachDeviceByPointer(
10528 IN PDEVICE_OBJECT SourceDevice,
10529 IN PDEVICE_OBJECT TargetDevice);
10530
10531 NTKERNELAPI
10532 BOOLEAN
10533 NTAPI
10534 MmIsNonPagedSystemAddressValid(
10535 IN PVOID VirtualAddress);
10536
10537 #if defined(_AMD64_) || defined(_IA64_)
10538 //DECLSPEC_DEPRECATED_DDK_WINXP
10539 static __inline
10540 LARGE_INTEGER
10541 NTAPI_INLINE
10542 RtlLargeIntegerDivide(
10543 IN LARGE_INTEGER Dividend,
10544 IN LARGE_INTEGER Divisor,
10545 IN OUT PLARGE_INTEGER Remainder)
10546 {
10547 LARGE_INTEGER ret;
10548 ret.QuadPart = Dividend.QuadPart / Divisor.QuadPart;
10549 if (Remainder)
10550 Remainder->QuadPart = Dividend.QuadPart % Divisor.QuadPart;
10551 return ret;
10552 }
10553 #else
10554 NTSYSAPI
10555 LARGE_INTEGER
10556 NTAPI
10557 RtlLargeIntegerDivide(
10558 IN LARGE_INTEGER Dividend,
10559 IN LARGE_INTEGER Divisor,
10560 IN OUT PLARGE_INTEGER Remainder);
10561 #endif
10562
10563 NTKERNELAPI
10564 INTERLOCKED_RESULT
10565 NTAPI
10566 ExInterlockedDecrementLong(
10567 IN PLONG Addend,
10568 IN PKSPIN_LOCK Lock);
10569
10570 NTKERNELAPI
10571 ULONG
10572 NTAPI
10573 ExInterlockedExchangeUlong(
10574 IN PULONG Target,
10575 IN ULONG Value,
10576 IN PKSPIN_LOCK Lock);
10577
10578 NTKERNELAPI
10579 INTERLOCKED_RESULT
10580 NTAPI
10581 ExInterlockedIncrementLong(
10582 IN PLONG Addend,
10583 IN PKSPIN_LOCK Lock);
10584
10585 NTHALAPI
10586 VOID
10587 NTAPI
10588 HalAcquireDisplayOwnership(
10589 IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters);
10590
10591 NTHALAPI
10592 NTSTATUS
10593 NTAPI
10594 HalAllocateAdapterChannel(
10595 IN PADAPTER_OBJECT AdapterObject,
10596 IN PWAIT_CONTEXT_BLOCK Wcb,
10597 IN ULONG NumberOfMapRegisters,
10598 IN PDRIVER_CONTROL ExecutionRoutine);
10599
10600 NTHALAPI
10601 PVOID
10602 NTAPI
10603 HalAllocateCommonBuffer(
10604 IN PADAPTER_OBJECT AdapterObject,
10605 IN ULONG Length,
10606 OUT PPHYSICAL_ADDRESS LogicalAddress,
10607 IN BOOLEAN CacheEnabled);
10608
10609 NTHALAPI
10610 NTSTATUS
10611 NTAPI
10612 HalAssignSlotResources(
10613 IN PUNICODE_STRING RegistryPath,
10614 IN PUNICODE_STRING DriverClassName,
10615 IN PDRIVER_OBJECT DriverObject,
10616 IN PDEVICE_OBJECT DeviceObject,
10617 IN INTERFACE_TYPE BusType,
10618 IN ULONG BusNumber,
10619 IN ULONG SlotNumber,
10620 IN OUT PCM_RESOURCE_LIST *AllocatedResources);
10621
10622 NTHALAPI
10623 VOID
10624 NTAPI
10625 HalFreeCommonBuffer(
10626 IN PADAPTER_OBJECT AdapterObject,
10627 IN ULONG Length,
10628 IN PHYSICAL_ADDRESS LogicalAddress,
10629 IN PVOID VirtualAddress,
10630 IN BOOLEAN CacheEnabled);
10631
10632 NTHALAPI
10633 PADAPTER_OBJECT
10634 NTAPI
10635 HalGetAdapter(
10636 IN PDEVICE_DESCRIPTION DeviceDescription,
10637 IN OUT PULONG NumberOfMapRegisters);
10638
10639 NTHALAPI
10640 ULONG
10641 NTAPI
10642 HalGetBusData(
10643 IN BUS_DATA_TYPE BusDataType,
10644 IN ULONG BusNumber,
10645 IN ULONG SlotNumber,
10646 IN PVOID Buffer,
10647 IN ULONG Length);
10648
10649 NTHALAPI
10650 ULONG
10651 NTAPI
10652 HalGetBusDataByOffset(
10653 IN BUS_DATA_TYPE BusDataType,
10654 IN ULONG BusNumber,
10655 IN ULONG SlotNumber,
10656 IN PVOID Buffer,
10657 IN ULONG Offset,
10658 IN ULONG Length);
10659
10660 NTHALAPI
10661 ULONG
10662 NTAPI
10663 HalGetDmaAlignmentRequirement(
10664 VOID);
10665
10666 NTHALAPI
10667 ULONG
10668 NTAPI
10669 HalGetInterruptVector(
10670 IN INTERFACE_TYPE InterfaceType,
10671 IN ULONG BusNumber,
10672 IN ULONG BusInterruptLevel,
10673 IN ULONG BusInterruptVector,
10674 OUT PKIRQL Irql,
10675 OUT PKAFFINITY Affinity);
10676
10677 NTHALAPI
10678 ULONG
10679 NTAPI
10680 HalReadDmaCounter(
10681 IN PADAPTER_OBJECT AdapterObject);
10682
10683 NTHALAPI
10684 ULONG
10685 NTAPI
10686 HalSetBusData(
10687 IN BUS_DATA_TYPE BusDataType,
10688 IN ULONG BusNumber,
10689 IN ULONG SlotNumber,
10690 IN PVOID Buffer,
10691 IN ULONG Length);
10692
10693 NTHALAPI
10694 ULONG
10695 NTAPI
10696 HalSetBusDataByOffset(
10697 IN BUS_DATA_TYPE BusDataType,
10698 IN ULONG BusNumber,
10699 IN ULONG SlotNumber,
10700 IN PVOID Buffer,
10701 IN ULONG Offset,
10702 IN ULONG Length);
10703
10704 NTHALAPI
10705 BOOLEAN
10706 NTAPI
10707 HalTranslateBusAddress(
10708 IN INTERFACE_TYPE InterfaceType,
10709 IN ULONG BusNumber,
10710 IN PHYSICAL_ADDRESS BusAddress,
10711 IN OUT PULONG AddressSpace,
10712 OUT PPHYSICAL_ADDRESS TranslatedAddress);
10713
10714 NTSYSAPI
10715 BOOLEAN
10716 NTAPI
10717 RtlLargeIntegerEqualToZero(
10718 IN LARGE_INTEGER Operand);
10719
10720 NTSYSAPI
10721 BOOLEAN
10722 NTAPI
10723 RtlLargeIntegerGreaterOrEqualToZero(
10724 IN LARGE_INTEGER Operand);
10725
10726 NTSYSAPI
10727 BOOLEAN
10728 NTAPI
10729 RtlLargeIntegerGreaterThan(
10730 IN LARGE_INTEGER Operand1,
10731 IN LARGE_INTEGER Operand2);
10732
10733 NTSYSAPI
10734 BOOLEAN
10735 NTAPI
10736 RtlLargeIntegerGreaterThanOrEqualTo(
10737 IN LARGE_INTEGER Operand1,
10738 IN LARGE_INTEGER Operand2);
10739
10740 NTSYSAPI
10741 BOOLEAN
10742 NTAPI
10743 RtlLargeIntegerGreaterThanZero(
10744 IN LARGE_INTEGER Operand);
10745
10746 NTSYSAPI
10747 BOOLEAN
10748 NTAPI
10749 RtlLargeIntegerLessOrEqualToZero(
10750 IN LARGE_INTEGER Operand);
10751
10752 NTSYSAPI
10753 BOOLEAN
10754 NTAPI
10755 RtlLargeIntegerLessThan(
10756 IN LARGE_INTEGER Operand1,
10757 IN LARGE_INTEGER Operand2);
10758
10759 NTSYSAPI
10760 BOOLEAN
10761 NTAPI
10762 RtlLargeIntegerLessThanOrEqualTo(
10763 IN LARGE_INTEGER Operand1,
10764 IN LARGE_INTEGER Operand2);
10765
10766 NTSYSAPI
10767 BOOLEAN
10768 NTAPI
10769 RtlLargeIntegerLessThanZero(
10770 IN LARGE_INTEGER Operand);
10771
10772 NTSYSAPI
10773 LARGE_INTEGER
10774 NTAPI
10775 RtlLargeIntegerNegate(
10776 IN LARGE_INTEGER Subtrahend);
10777
10778 NTSYSAPI
10779 BOOLEAN
10780 NTAPI
10781 RtlLargeIntegerNotEqualTo(
10782 IN LARGE_INTEGER Operand1,
10783 IN LARGE_INTEGER Operand2);
10784
10785 NTSYSAPI
10786 BOOLEAN
10787 NTAPI
10788 RtlLargeIntegerNotEqualToZero(
10789 IN LARGE_INTEGER Operand);
10790
10791 NTSYSAPI
10792 LARGE_INTEGER
10793 NTAPI
10794 RtlLargeIntegerShiftLeft(
10795 IN LARGE_INTEGER LargeInteger,
10796 IN CCHAR ShiftCount);
10797
10798 NTSYSAPI
10799 LARGE_INTEGER
10800 NTAPI
10801 RtlLargeIntegerShiftRight(
10802 IN LARGE_INTEGER LargeInteger,
10803 IN CCHAR ShiftCount);
10804
10805 NTSYSAPI
10806 LARGE_INTEGER
10807 NTAPI
10808 RtlLargeIntegerSubtract(
10809 IN LARGE_INTEGER Minuend,
10810 IN LARGE_INTEGER Subtrahend);
10811
10812
10813 /*
10814 * ULONG
10815 * COMPUTE_PAGES_SPANNED(
10816 * IN PVOID Va,
10817 * IN ULONG Size)
10818 */
10819 #define COMPUTE_PAGES_SPANNED(Va, \
10820 Size) \
10821 (ADDRESS_AND_SIZE_TO_SPAN_PAGES(Va, Size))
10822
10823
10824 /*
10825 ** Architecture specific structures
10826 */
10827
10828 #ifdef _X86_
10829
10830 NTKERNELAPI
10831 INTERLOCKED_RESULT
10832 FASTCALL
10833 Exfi386InterlockedIncrementLong(
10834 IN PLONG Addend);
10835
10836 NTKERNELAPI
10837 INTERLOCKED_RESULT
10838 FASTCALL
10839 Exfi386InterlockedDecrementLong(
10840 IN PLONG Addend);
10841
10842 NTKERNELAPI
10843 ULONG
10844 FASTCALL
10845 Exfi386InterlockedExchangeUlong(
10846 IN PULONG Target,
10847 IN ULONG Value);
10848
10849 #define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend)
10850 #define ExInterlockedDecrementLong(Addend,Lock) Exfi386InterlockedDecrementLong(Addend)
10851 #define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value)
10852
10853 #endif /* _X86_ */
10854
10855 #ifdef _M_ARM
10856 //
10857 // NT-ARM is not documented
10858 //
10859 #include <armddk.h>
10860 #endif
10861
10862 #ifdef __cplusplus
10863 }
10864 #endif
10865
10866 #endif /* __WINDDK_H */