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