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