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