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