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