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