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