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