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