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