[wingdi]
[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 return (ULONG)__readfsbyte(FIELD_OFFSET(KPCR, Number));
5153 }
5154
5155 NTHALAPI
5156 KIRQL
5157 DDKAPI
5158 KeGetCurrentIrql(
5159 VOID);
5160
5161 NTKERNELAPI
5162 PRKTHREAD
5163 NTAPI
5164 KeGetCurrentThread(
5165 VOID);
5166
5167 #define KI_USER_SHARED_DATA 0xffdf0000
5168
5169 #define PAGE_SIZE 0x1000
5170 #define PAGE_SHIFT 12L
5171
5172 #define SharedUserData ((KUSER_SHARED_DATA * CONST) KI_USER_SHARED_DATA)
5173
5174 extern NTKERNELAPI PVOID MmHighestUserAddress;
5175 extern NTKERNELAPI PVOID MmSystemRangeStart;
5176 extern NTKERNELAPI ULONG_PTR MmUserProbeAddress;
5177
5178 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
5179 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
5180 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
5181 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
5182 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000
5183
5184 #define MM_KSEG0_BASE MM_SYSTEM_RANGE_START
5185 #define MM_SYSTEM_SPACE_END 0xFFFFFFFF
5186
5187 #elif defined(__x86_64__)
5188
5189 #define CONTEXT_AMD64 0x100000
5190 #if !defined(RC_INVOKED)
5191 #define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L)
5192 #define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L)
5193 #define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L)
5194 #define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L)
5195 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L)
5196
5197 #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)
5198 #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS)
5199
5200 #define CONTEXT_EXCEPTION_ACTIVE 0x8000000
5201 #define CONTEXT_SERVICE_ACTIVE 0x10000000
5202 #define CONTEXT_EXCEPTION_REQUEST 0x40000000
5203 #define CONTEXT_EXCEPTION_REPORTING 0x80000000
5204 #endif
5205
5206 typedef struct DECLSPEC_ALIGN(16) _M128A {
5207 ULONGLONG Low;
5208 LONGLONG High;
5209 } M128A, *PM128A;
5210
5211 typedef struct _XMM_SAVE_AREA32 {
5212 USHORT ControlWord;
5213 USHORT StatusWord;
5214 UCHAR TagWord;
5215 UCHAR Reserved1;
5216 USHORT ErrorOpcode;
5217 ULONG ErrorOffset;
5218 USHORT ErrorSelector;
5219 USHORT Reserved2;
5220 ULONG DataOffset;
5221 USHORT DataSelector;
5222 USHORT Reserved3;
5223 ULONG MxCsr;
5224 ULONG MxCsr_Mask;
5225 M128A FloatRegisters[8];
5226 M128A XmmRegisters[16];
5227 UCHAR Reserved4[96];
5228 } XMM_SAVE_AREA32, *PXMM_SAVE_AREA32;
5229
5230 typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
5231 ULONG64 P1Home;
5232 ULONG64 P2Home;
5233 ULONG64 P3Home;
5234 ULONG64 P4Home;
5235 ULONG64 P5Home;
5236 ULONG64 P6Home;
5237
5238 /* Control flags */
5239 ULONG ContextFlags;
5240 ULONG MxCsr;
5241
5242 /* Segment */
5243 USHORT SegCs;
5244 USHORT SegDs;
5245 USHORT SegEs;
5246 USHORT SegFs;
5247 USHORT SegGs;
5248 USHORT SegSs;
5249 ULONG EFlags;
5250
5251 /* Debug */
5252 ULONG64 Dr0;
5253 ULONG64 Dr1;
5254 ULONG64 Dr2;
5255 ULONG64 Dr3;
5256 ULONG64 Dr6;
5257 ULONG64 Dr7;
5258
5259 /* Integer */
5260 ULONG64 Rax;
5261 ULONG64 Rcx;
5262 ULONG64 Rdx;
5263 ULONG64 Rbx;
5264 ULONG64 Rsp;
5265 ULONG64 Rbp;
5266 ULONG64 Rsi;
5267 ULONG64 Rdi;
5268 ULONG64 R8;
5269 ULONG64 R9;
5270 ULONG64 R10;
5271 ULONG64 R11;
5272 ULONG64 R12;
5273 ULONG64 R13;
5274 ULONG64 R14;
5275 ULONG64 R15;
5276
5277 /* Counter */
5278 ULONG64 Rip;
5279
5280 /* Floating point */
5281 union {
5282 XMM_SAVE_AREA32 FltSave;
5283 struct {
5284 M128A Header[2];
5285 M128A Legacy[8];
5286 M128A Xmm0;
5287 M128A Xmm1;
5288 M128A Xmm2;
5289 M128A Xmm3;
5290 M128A Xmm4;
5291 M128A Xmm5;
5292 M128A Xmm6;
5293 M128A Xmm7;
5294 M128A Xmm8;
5295 M128A Xmm9;
5296 M128A Xmm10;
5297 M128A Xmm11;
5298 M128A Xmm12;
5299 M128A Xmm13;
5300 M128A Xmm14;
5301 M128A Xmm15;
5302 } DUMMYSTRUCTNAME;
5303 } DUMMYUNIONNAME;
5304
5305 /* Vector */
5306 M128A VectorRegister[26];
5307 ULONG64 VectorControl;
5308
5309 /* Debug control */
5310 ULONG64 DebugControl;
5311 ULONG64 LastBranchToRip;
5312 ULONG64 LastBranchFromRip;
5313 ULONG64 LastExceptionToRip;
5314 ULONG64 LastExceptionFromRip;
5315 } CONTEXT;
5316
5317 //
5318 // Used to contain PFNs and PFN counts
5319 //
5320 typedef ULONG PFN_COUNT;
5321 typedef ULONG64 PFN_NUMBER, *PPFN_NUMBER;
5322 typedef LONG64 SPFN_NUMBER, *PSPFN_NUMBER;
5323
5324 #define PASSIVE_LEVEL 0
5325 #define LOW_LEVEL 0
5326 #define APC_LEVEL 1
5327 #define DISPATCH_LEVEL 2
5328 #define CLOCK_LEVEL 13
5329 #define IPI_LEVEL 14
5330 #define POWER_LEVEL 14
5331 #define PROFILE_LEVEL 15
5332 #define HIGH_LEVEL 15
5333
5334 #define PAGE_SIZE 0x1000
5335 #define PAGE_SHIFT 12L
5336 #define PTI_SHIFT 12L
5337 #define PDI_SHIFT 21L
5338 #define PPI_SHIFT 30L
5339 #define PXI_SHIFT 39L
5340 #define PTE_PER_PAGE 512
5341 #define PDE_PER_PAGE 512
5342 #define PPE_PER_PAGE 512
5343 #define PXE_PER_PAGE 512
5344 #define PTI_MASK_AMD64 (PTE_PER_PAGE - 1)
5345 #define PDI_MASK_AMD64 (PDE_PER_PAGE - 1)
5346 #define PPI_MASK (PPE_PER_PAGE - 1)
5347 #define PXI_MASK (PXE_PER_PAGE - 1)
5348
5349 #define PXE_BASE 0xFFFFF6FB7DBED000ULL
5350 #define PXE_SELFMAP 0xFFFFF6FB7DBEDF68ULL
5351 #define PPE_BASE 0xFFFFF6FB7DA00000ULL
5352 #define PDE_BASE 0xFFFFF6FB40000000ULL
5353 #define PTE_BASE 0xFFFFF68000000000ULL
5354 #define PXE_TOP 0xFFFFF6FB7DBEDFFFULL
5355 #define PPE_TOP 0xFFFFF6FB7DBFFFFFULL
5356 #define PDE_TOP 0xFFFFF6FB7FFFFFFFULL
5357 #define PTE_TOP 0xFFFFF6FFFFFFFFFFULL
5358
5359 extern NTKERNELAPI PVOID MmHighestUserAddress;
5360 extern NTKERNELAPI PVOID MmSystemRangeStart;
5361 extern NTKERNELAPI ULONG_PTR MmUserProbeAddress;
5362
5363 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
5364 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
5365 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
5366 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
5367 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xFFFF080000000000ULL
5368 #define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL
5369
5370 #define SharedUserData ((PKUSER_SHARED_DATA const)KI_USER_SHARED_DATA)
5371 #define SharedInterruptTime (&SharedUserData->InterruptTime)
5372 #define SharedSystemTime (&SharedUserData->SystemTime)
5373 #define SharedTickCount (&SharedUserData->TickCount)
5374
5375 #define KeQueryInterruptTime() \
5376 (*(volatile ULONG64*)SharedInterruptTime)
5377 #define KeQuerySystemTime(CurrentCount) \
5378 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime
5379 #define KeQueryTickCount(CurrentCount) \
5380 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount
5381
5382 typedef struct _KPCR
5383 {
5384 union
5385 {
5386 NT_TIB NtTib;
5387 struct
5388 {
5389 union _KGDTENTRY64 *GdtBase;
5390 struct _KTSS64 *TssBase;
5391 ULONG64 UserRsp;
5392 struct _KPCR *Self;
5393 struct _KPRCB *CurrentPrcb;
5394 PKSPIN_LOCK_QUEUE LockArray;
5395 PVOID Used_Self;
5396 };
5397 };
5398 union _KIDTENTRY64 *IdtBase;
5399 ULONG64 Unused[2];
5400 KIRQL Irql;
5401 UCHAR SecondLevelCacheAssociativity;
5402 UCHAR ObsoleteNumber;
5403 UCHAR Fill0;
5404 ULONG Unused0[3];
5405 USHORT MajorVersion;
5406 USHORT MinorVersion;
5407 ULONG StallScaleFactor;
5408 PVOID Unused1[3];
5409 ULONG KernelReserved[15];
5410 ULONG SecondLevelCacheSize;
5411 ULONG HalReserved[16];
5412 ULONG Unused2;
5413 PVOID KdVersionBlock;
5414 PVOID Unused3;
5415 ULONG PcrAlign1[24];
5416 } KPCR, *PKPCR;
5417
5418 typedef struct _KFLOATING_SAVE {
5419 ULONG Dummy;
5420 } KFLOATING_SAVE, *PKFLOATING_SAVE;
5421
5422 NTKERNELAPI
5423 PRKTHREAD
5424 NTAPI
5425 KeGetCurrentThread(
5426 VOID);
5427
5428 FORCEINLINE
5429 PKPCR
5430 KeGetPcr(VOID)
5431 {
5432 return (PKPCR)__readgsqword(FIELD_OFFSET(KPCR, Self));
5433 }
5434
5435 FORCEINLINE
5436 ULONG
5437 KeGetCurrentProcessorNumber(VOID)
5438 {
5439 return (ULONG)__readgsword(0x184);
5440 }
5441
5442 #elif defined(__PowerPC__)
5443
5444 //
5445 // Used to contain PFNs and PFN counts
5446 //
5447 typedef ULONG PFN_COUNT;
5448 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
5449 typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
5450
5451 #define PASSIVE_LEVEL 0
5452 #define LOW_LEVEL 0
5453 #define APC_LEVEL 1
5454 #define DISPATCH_LEVEL 2
5455 #define PROFILE_LEVEL 27
5456 #define CLOCK1_LEVEL 28
5457 #define CLOCK2_LEVEL 28
5458 #define IPI_LEVEL 29
5459 #define POWER_LEVEL 30
5460 #define HIGH_LEVEL 31
5461
5462 typedef struct _KFLOATING_SAVE {
5463 ULONG Dummy;
5464 } KFLOATING_SAVE, *PKFLOATING_SAVE;
5465
5466 typedef struct _KPCR_TIB {
5467 PVOID ExceptionList; /* 00 */
5468 PVOID StackBase; /* 04 */
5469 PVOID StackLimit; /* 08 */
5470 PVOID SubSystemTib; /* 0C */
5471 _ANONYMOUS_UNION union {
5472 PVOID FiberData; /* 10 */
5473 ULONG Version; /* 10 */
5474 } DUMMYUNIONNAME;
5475 PVOID ArbitraryUserPointer; /* 14 */
5476 struct _KPCR_TIB *Self; /* 18 */
5477 } KPCR_TIB, *PKPCR_TIB; /* 1C */
5478
5479 #define PCR_MINOR_VERSION 1
5480 #define PCR_MAJOR_VERSION 1
5481
5482 typedef struct _KPCR {
5483 KPCR_TIB Tib; /* 00 */
5484 struct _KPCR *Self; /* 1C */
5485 struct _KPRCB *Prcb; /* 20 */
5486 KIRQL Irql; /* 24 */
5487 ULONG IRR; /* 28 */
5488 ULONG IrrActive; /* 2C */
5489 ULONG IDR; /* 30 */
5490 PVOID KdVersionBlock; /* 34 */
5491 PUSHORT IDT; /* 38 */
5492 PUSHORT GDT; /* 3C */
5493 struct _KTSS *TSS; /* 40 */
5494 USHORT MajorVersion; /* 44 */
5495 USHORT MinorVersion; /* 46 */
5496 KAFFINITY SetMember; /* 48 */
5497 ULONG StallScaleFactor; /* 4C */
5498 UCHAR SpareUnused; /* 50 */
5499 UCHAR Number; /* 51 */
5500 } KPCR, *PKPCR; /* 54 */
5501
5502 #define KeGetPcr() PCR
5503
5504 static __inline
5505 ULONG
5506 DDKAPI
5507 KeGetCurrentProcessorNumber(VOID)
5508 {
5509 ULONG Number;
5510 __asm__ __volatile__ (
5511 "lwz %0, %c1(12)\n"
5512 : "=r" (Number)
5513 : "i" (FIELD_OFFSET(KPCR, Number))
5514 );
5515 return Number;
5516 }
5517
5518 #elif defined(_MIPS_)
5519
5520 #error MIPS Headers are totally incorrect
5521
5522 //
5523 // Used to contain PFNs and PFN counts
5524 //
5525 typedef ULONG PFN_COUNT;
5526 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
5527 typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
5528
5529 #define PASSIVE_LEVEL 0
5530 #define APC_LEVEL 1
5531 #define DISPATCH_LEVEL 2
5532 #define PROFILE_LEVEL 27
5533 #define IPI_LEVEL 29
5534 #define HIGH_LEVEL 31
5535
5536 typedef struct _KPCR {
5537 struct _KPRCB *Prcb; /* 20 */
5538 KIRQL Irql; /* 24 */
5539 ULONG IRR; /* 28 */
5540 ULONG IDR; /* 30 */
5541 } KPCR, *PKPCR;
5542
5543 #define KeGetPcr() PCR
5544
5545 typedef struct _KFLOATING_SAVE {
5546 } KFLOATING_SAVE, *PKFLOATING_SAVE;
5547
5548 static __inline
5549 ULONG
5550 DDKAPI
5551 KeGetCurrentProcessorNumber(VOID)
5552 {
5553 return 0;
5554 }
5555
5556 #elif defined(_M_ARM)
5557
5558 //
5559 // NT-ARM is not documented, need DDK-ARM
5560 //
5561 #include <armddk.h>
5562
5563 #else
5564 #error Unknown architecture
5565 #endif
5566
5567 #define MM_DONT_ZERO_ALLOCATION 0x00000001
5568 #define MM_ALLOCATE_FROM_LOCAL_NODE_ONLY 0x00000002
5569
5570
5571 #define EFLAG_SIGN 0x8000
5572 #define EFLAG_ZERO 0x4000
5573 #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
5574
5575 #define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
5576 #define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
5577 #define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
5578
5579 typedef enum _INTERLOCKED_RESULT {
5580 ResultNegative = RESULT_NEGATIVE,
5581 ResultZero = RESULT_ZERO,
5582 ResultPositive = RESULT_POSITIVE
5583 } INTERLOCKED_RESULT;
5584
5585 typedef VOID
5586 (NTAPI *PciPin2Line)(
5587 IN struct _BUS_HANDLER *BusHandler,
5588 IN struct _BUS_HANDLER *RootHandler,
5589 IN PCI_SLOT_NUMBER SlotNumber,
5590 IN PPCI_COMMON_CONFIG PciData
5591 );
5592
5593 typedef VOID
5594 (NTAPI *PciLine2Pin)(
5595 IN struct _BUS_HANDLER *BusHandler,
5596 IN struct _BUS_HANDLER *RootHandler,
5597 IN PCI_SLOT_NUMBER SlotNumber,
5598 IN PPCI_COMMON_CONFIG PciNewData,
5599 IN PPCI_COMMON_CONFIG PciOldData
5600 );
5601
5602 typedef VOID
5603 (NTAPI *PciReadWriteConfig)(
5604 IN struct _BUS_HANDLER *BusHandler,
5605 IN PCI_SLOT_NUMBER Slot,
5606 IN PVOID Buffer,
5607 IN ULONG Offset,
5608 IN ULONG Length
5609 );
5610
5611 #define PCI_DATA_TAG ' ICP'
5612 #define PCI_DATA_VERSION 1
5613
5614 typedef struct _PCIBUSDATA
5615 {
5616 ULONG Tag;
5617 ULONG Version;
5618 PciReadWriteConfig ReadConfig;
5619 PciReadWriteConfig WriteConfig;
5620 PciPin2Line Pin2Line;
5621 PciLine2Pin Line2Pin;
5622 PCI_SLOT_NUMBER ParentSlot;
5623 PVOID Reserved[4];
5624 } PCIBUSDATA, *PPCIBUSDATA;
5625
5626
5627 /** SPINLOCK FUNCTIONS ********************************************************/
5628
5629 NTKERNELAPI
5630 BOOLEAN
5631 FASTCALL
5632 KeTryToAcquireSpinLockAtDpcLevel(
5633 IN OUT PKSPIN_LOCK SpinLock
5634 );
5635
5636 NTKERNELAPI
5637 BOOLEAN
5638 FASTCALL
5639 KeTestSpinLock(
5640 IN PKSPIN_LOCK SpinLock
5641 );
5642
5643 #if defined (_X86_)
5644
5645 #if defined(WIN9X_COMPAT_SPINLOCK)
5646
5647 NTKERNELAPI
5648 VOID
5649 NTAPI
5650 KeInitializeSpinLock(
5651 IN PKSPIN_LOCK SpinLock
5652 );
5653
5654 #else
5655
5656 FORCEINLINE
5657 VOID
5658 KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock)
5659 {
5660 /* Clear the lock */
5661 *SpinLock = 0;
5662 }
5663
5664 #endif
5665
5666 NTHALAPI
5667 KIRQL
5668 FASTCALL
5669 KfAcquireSpinLock(
5670 IN PKSPIN_LOCK SpinLock);
5671
5672 NTHALAPI
5673 VOID
5674 FASTCALL
5675 KfReleaseSpinLock(
5676 IN PKSPIN_LOCK SpinLock,
5677 IN KIRQL NewIrql);
5678
5679 NTKERNELAPI
5680 VOID
5681 FASTCALL
5682 KefAcquireSpinLockAtDpcLevel(
5683 IN PKSPIN_LOCK SpinLock);
5684
5685 NTKERNELAPI
5686 VOID
5687 FASTCALL
5688 KefReleaseSpinLockFromDpcLevel(
5689 IN PKSPIN_LOCK SpinLock);
5690
5691 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
5692 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
5693 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
5694 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
5695
5696 #define KeGetDcacheFillSize() 1L
5697
5698 #elif defined(_M_ARM) // !defined (_X86_)
5699
5700 FORCEINLINE
5701 VOID
5702 KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock)
5703 {
5704 /* Clear the lock */
5705 *SpinLock = 0;
5706 }
5707
5708 NTHALAPI
5709 KIRQL
5710 FASTCALL
5711 KfAcquireSpinLock(
5712 IN PKSPIN_LOCK SpinLock);
5713
5714 NTHALAPI
5715 VOID
5716 FASTCALL
5717 KfReleaseSpinLock(
5718 IN PKSPIN_LOCK SpinLock,
5719 IN KIRQL NewIrql);
5720
5721
5722 NTKERNELAPI
5723 VOID
5724 FASTCALL
5725 KefAcquireSpinLockAtDpcLevel(
5726 IN PKSPIN_LOCK SpinLock);
5727
5728 NTKERNELAPI
5729 VOID
5730 FASTCALL
5731 KefReleaseSpinLockFromDpcLevel(
5732 IN PKSPIN_LOCK SpinLock);
5733
5734
5735 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
5736 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
5737 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
5738 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
5739
5740 NTKERNELAPI
5741 VOID
5742 NTAPI
5743 KeInitializeSpinLock(
5744 IN PKSPIN_LOCK SpinLock);
5745
5746 #else
5747
5748 FORCEINLINE
5749 VOID
5750 NTAPI
5751 KeInitializeSpinLock(
5752 PKSPIN_LOCK SpinLock)
5753 {
5754 *SpinLock = 0;
5755 }
5756
5757 NTKERNELAPI
5758 VOID
5759 KeReleaseSpinLock(
5760 IN PKSPIN_LOCK SpinLock,
5761 IN KIRQL NewIrql);
5762
5763 NTKERNELAPI
5764 VOID
5765 KeAcquireSpinLockAtDpcLevel(
5766 IN PKSPIN_LOCK SpinLock);
5767
5768 NTKERNELAPI
5769 VOID
5770 KeReleaseSpinLockFromDpcLevel(
5771 IN PKSPIN_LOCK SpinLock);
5772
5773 NTKERNELAPI
5774 KIRQL
5775 KeAcquireSpinLockRaiseToDpc(
5776 IN PKSPIN_LOCK SpinLock);
5777
5778 #define KeAcquireSpinLock(SpinLock, OldIrql) \
5779 *(OldIrql) = KeAcquireSpinLockRaiseToDpc(SpinLock)
5780
5781 #endif // !defined (_X86_)
5782
5783 /*
5784 ** Utillity functions
5785 */
5786
5787 #define ARGUMENT_PRESENT(ArgumentPointer) \
5788 ((CHAR*)((ULONG_PTR)(ArgumentPointer)) != (CHAR*)NULL)
5789
5790 /*
5791 * ULONG
5792 * BYTE_OFFSET(
5793 * IN PVOID Va)
5794 */
5795 #define BYTE_OFFSET(Va) \
5796 ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
5797
5798 /*
5799 * ULONG
5800 * BYTES_TO_PAGES(
5801 * IN ULONG Size)
5802 */
5803 #define BYTES_TO_PAGES(Size) \
5804 ((ULONG) ((ULONG_PTR) (Size) >> PAGE_SHIFT) + (((ULONG) (Size) & (PAGE_SIZE - 1)) != 0))
5805
5806 /*
5807 * PVOID
5808 * PAGE_ALIGN(
5809 * IN PVOID Va)
5810 */
5811 #define PAGE_ALIGN(Va) \
5812 ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
5813
5814 /*
5815 * ULONG_PTR
5816 * ROUND_TO_PAGES(
5817 * IN ULONG_PTR Size)
5818 */
5819 #define ROUND_TO_PAGES(Size) \
5820 ((ULONG_PTR) (((ULONG_PTR) Size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1)))
5821
5822
5823
5824 #if defined(_X86_) || defined(_AMD64_)
5825
5826 //
5827 // x86 and x64 performs a 0x2C interrupt
5828 //
5829 #define DbgRaiseAssertionFailure __int2c
5830
5831 #elif defined(_ARM_)
5832
5833 //
5834 // TODO
5835 //
5836
5837 #else
5838 #error Unsupported Architecture
5839 #endif
5840
5841 #if DBG
5842
5843 #define ASSERT(exp) \
5844 (VOID)((!(exp)) ? \
5845 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ), FALSE : TRUE)
5846
5847 #define ASSERTMSG(msg, exp) \
5848 (VOID)((!(exp)) ? \
5849 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, msg ), FALSE : TRUE)
5850
5851 #define RTL_SOFT_ASSERT(exp) \
5852 (VOID)((!(exp)) ? \
5853 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE)
5854
5855 #define RTL_SOFT_ASSERTMSG(msg, exp) \
5856 (VOID)((!(exp)) ? \
5857 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE)
5858
5859 #define RTL_VERIFY(exp) ASSERT(exp)
5860 #define RTL_VERIFYMSG(msg, exp) ASSERT(msg, exp)
5861
5862 #define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
5863 #define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
5864
5865 #if defined(_MSC_VER)
5866
5867 #define NT_ASSERT(exp) \
5868 ((!(exp)) ? \
5869 (__annotation(L"Debug", L"AssertFail", L#exp), \
5870 DbgRaiseAssertionFailure(), FALSE) : TRUE)
5871
5872 #define NT_ASSERTMSG(msg, exp) \
5873 ((!(exp)) ? \
5874 (__annotation(L"Debug", L"AssertFail", L##msg), \
5875 DbgRaiseAssertionFailure(), FALSE) : TRUE)
5876
5877 #define NT_ASSERTMSGW(msg, exp) \
5878 ((!(exp)) ? \
5879 (__annotation(L"Debug", L"AssertFail", msg), \
5880 DbgRaiseAssertionFailure(), FALSE) : TRUE)
5881
5882 #else
5883
5884 //
5885 // GCC doesn't support __annotation (nor PDB)
5886 //
5887 #define NT_ASSERT(exp) \
5888 (VOID)((!(exp)) ? (DbgRaiseAssertionFailure(), FALSE) : TRUE)
5889
5890 #define NT_ASSERTMSG NT_ASSERT
5891 #define NT_ASSERTMSGW NT_ASSERT
5892
5893 #endif
5894
5895 #else /* !DBG */
5896
5897 #define ASSERT(exp) ((VOID) 0)
5898 #define ASSERTMSG(msg, exp) ((VOID) 0)
5899
5900 #define RTL_SOFT_ASSERT(exp) ((VOID) 0)
5901 #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
5902
5903 #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
5904 #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
5905
5906 #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
5907 #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
5908
5909 #define NT_ASSERT(exp) ((VOID)0)
5910 #define NT_ASSERTMSG(exp) ((VOID)0)
5911 #define NT_ASSERTMSGW(exp) ((VOID)0)
5912
5913 #endif /* DBG */
5914
5915 /* HACK HACK HACK - GCC (or perhaps LD) is messing this up */
5916 #if defined(_NTSYSTEM_) || defined(__GNUC__)
5917 #define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag
5918 #define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag
5919 #else
5920 #define NLS_MB_CODE_PAGE_TAG (*NlsMbCodePageTag)
5921 #define NLS_MB_OEM_CODE_PAGE_TAG (*NlsMbOemCodePageTag)
5922 #endif /* _NT_SYSTEM */
5923
5924 extern BOOLEAN NTSYSAPI NLS_MB_CODE_PAGE_TAG;
5925 extern BOOLEAN NTSYSAPI NLS_MB_OEM_CODE_PAGE_TAG;
5926
5927 /*
5928 ** Driver support routines
5929 */
5930
5931 /** Runtime library routines **/
5932
5933 static __inline VOID
5934 InitializeListHead(
5935 IN PLIST_ENTRY ListHead)
5936 {
5937 ListHead->Flink = ListHead->Blink = ListHead;
5938 }
5939
5940 static __inline VOID
5941 InsertHeadList(
5942 IN PLIST_ENTRY ListHead,
5943 IN PLIST_ENTRY Entry)
5944 {
5945 PLIST_ENTRY OldFlink;
5946 OldFlink = ListHead->Flink;
5947 Entry->Flink = OldFlink;
5948 Entry->Blink = ListHead;
5949 OldFlink->Blink = Entry;
5950 ListHead->Flink = Entry;
5951 }
5952
5953 static __inline VOID
5954 InsertTailList(
5955 IN PLIST_ENTRY ListHead,
5956 IN PLIST_ENTRY Entry)
5957 {
5958 PLIST_ENTRY OldBlink;
5959 OldBlink = ListHead->Blink;
5960 Entry->Flink = ListHead;
5961 Entry->Blink = OldBlink;
5962 OldBlink->Flink = Entry;
5963 ListHead->Blink = Entry;
5964 }
5965
5966 /*
5967 * BOOLEAN
5968 * IsListEmpty(
5969 * IN PLIST_ENTRY ListHead)
5970 */
5971 #define IsListEmpty(_ListHead) \
5972 ((_ListHead)->Flink == (_ListHead))
5973
5974 /*
5975 * PSINGLE_LIST_ENTRY
5976 * PopEntryList(
5977 * IN PSINGLE_LIST_ENTRY ListHead)
5978 */
5979 #define PopEntryList(ListHead) \
5980 (ListHead)->Next; \
5981 { \
5982 PSINGLE_LIST_ENTRY _FirstEntry; \
5983 _FirstEntry = (ListHead)->Next; \
5984 if (_FirstEntry != NULL) \
5985 (ListHead)->Next = _FirstEntry->Next; \
5986 }
5987
5988 /*
5989 * VOID
5990 * PushEntryList(
5991 * IN PSINGLE_LIST_ENTRY ListHead,
5992 * IN PSINGLE_LIST_ENTRY Entry)
5993 */
5994 #define PushEntryList(_ListHead, _Entry) \
5995 (_Entry)->Next = (_ListHead)->Next; \
5996 (_ListHead)->Next = (_Entry); \
5997
5998 static __inline BOOLEAN
5999 RemoveEntryList(
6000 IN PLIST_ENTRY Entry)
6001 {
6002 PLIST_ENTRY OldFlink;
6003 PLIST_ENTRY OldBlink;
6004
6005 OldFlink = Entry->Flink;
6006 OldBlink = Entry->Blink;
6007 OldFlink->Blink = OldBlink;
6008 OldBlink->Flink = OldFlink;
6009 return (BOOLEAN)(OldFlink == OldBlink);
6010 }
6011
6012 static __inline PLIST_ENTRY
6013 RemoveHeadList(
6014 IN PLIST_ENTRY ListHead)
6015 {
6016 PLIST_ENTRY Flink;
6017 PLIST_ENTRY Entry;
6018
6019 Entry = ListHead->Flink;
6020 Flink = Entry->Flink;
6021 ListHead->Flink = Flink;
6022 Flink->Blink = ListHead;
6023 return Entry;
6024 }
6025
6026 static __inline PLIST_ENTRY
6027 RemoveTailList(
6028 IN PLIST_ENTRY ListHead)
6029 {
6030 PLIST_ENTRY Blink;
6031 PLIST_ENTRY Entry;
6032
6033 Entry = ListHead->Blink;
6034 Blink = Entry->Blink;
6035 ListHead->Blink = Blink;
6036 Blink->Flink = ListHead;
6037 return Entry;
6038 }
6039
6040 NTSYSAPI
6041 NTSTATUS
6042 NTAPI
6043 RtlCharToInteger(
6044 IN PCSZ String,
6045 IN ULONG Base OPTIONAL,
6046 IN OUT PULONG Value);
6047
6048 NTSYSAPI
6049 LONG
6050 NTAPI
6051 RtlCompareString(
6052 IN PSTRING String1,
6053 IN PSTRING String2,
6054 BOOLEAN CaseInSensitive);
6055
6056 #if !defined(MIDL_PASS)
6057
6058 FORCEINLINE
6059 LUID
6060 NTAPI
6061 RtlConvertLongToLuid(
6062 IN LONG Val)
6063 {
6064 LUID Luid;
6065 LARGE_INTEGER Temp;
6066
6067 Temp.QuadPart = Val;
6068 Luid.LowPart = Temp.u.LowPart;
6069 Luid.HighPart = Temp.u.HighPart;
6070
6071 return Luid;
6072 }
6073
6074 FORCEINLINE
6075 LUID
6076 NTAPI
6077 RtlConvertUlongToLuid(
6078 IN ULONG Val)
6079 {
6080 LUID Luid;
6081
6082 Luid.LowPart = Val;
6083 Luid.HighPart = 0;
6084
6085 return Luid;
6086 }
6087 #endif
6088
6089
6090 NTSYSAPI
6091 VOID
6092 NTAPI
6093 RtlCopyMemory32(
6094 IN VOID UNALIGNED *Destination,
6095 IN CONST VOID UNALIGNED *Source,
6096 IN ULONG Length);
6097
6098 NTSYSAPI
6099 VOID
6100 NTAPI
6101 RtlCopyString(
6102 IN OUT PSTRING DestinationString,
6103 IN PSTRING SourceString OPTIONAL);
6104
6105 NTSYSAPI
6106 BOOLEAN
6107 NTAPI
6108 RtlEqualString(
6109 IN PSTRING String1,
6110 IN PSTRING String2,
6111 IN BOOLEAN CaseInSensitive);
6112
6113 #if (defined(_M_AMD64) || defined(_M_IA64)) && !defined(_REALLY_GET_CALLERS_CALLER_)
6114 #define RtlGetCallersAddress(CallersAddress, CallersCaller) \
6115 *CallersAddress = (PVOID)_ReturnAddress(); \
6116 *CallersCaller = NULL;
6117 #else
6118 NTSYSAPI
6119 VOID
6120 NTAPI
6121 RtlGetCallersAddress(
6122 OUT PVOID *CallersAddress,
6123 OUT PVOID *CallersCaller);
6124 #endif
6125
6126 NTSYSAPI
6127 NTSTATUS
6128 NTAPI
6129 RtlGetVersion(
6130 IN OUT PRTL_OSVERSIONINFOW lpVersionInformation);
6131
6132 NTSYSAPI
6133 VOID
6134 NTAPI
6135 RtlMapGenericMask(
6136 IN OUT PACCESS_MASK AccessMask,
6137 IN PGENERIC_MAPPING GenericMapping);
6138
6139 NTSYSAPI
6140 BOOLEAN
6141 NTAPI
6142 RtlPrefixUnicodeString(
6143 IN PCUNICODE_STRING String1,
6144 IN PCUNICODE_STRING String2,
6145 IN BOOLEAN CaseInSensitive);
6146
6147 NTSYSAPI
6148 NTSTATUS
6149 NTAPI
6150 RtlUpcaseUnicodeString(
6151 IN OUT PUNICODE_STRING DestinationString OPTIONAL,
6152 IN PCUNICODE_STRING SourceString,
6153 IN BOOLEAN AllocateDestinationString);
6154
6155 NTSYSAPI
6156 CHAR
6157 NTAPI
6158 RtlUpperChar(
6159 IN CHAR Character);
6160
6161 NTSYSAPI
6162 VOID
6163 NTAPI
6164 RtlUpperString(
6165 IN OUT PSTRING DestinationString,
6166 IN PSTRING SourceString);
6167
6168 NTSYSAPI
6169 NTSTATUS
6170 NTAPI
6171 RtlVerifyVersionInfo(
6172 IN PRTL_OSVERSIONINFOEXW VersionInfo,
6173 IN ULONG TypeMask,
6174 IN ULONGLONG ConditionMask);
6175
6176 NTSYSAPI
6177 NTSTATUS
6178 NTAPI
6179 RtlVolumeDeviceToDosName(
6180 IN PVOID VolumeDeviceObject,
6181 OUT PUNICODE_STRING DosName);
6182
6183 NTSYSAPI
6184 ULONG
6185 NTAPI
6186 RtlWalkFrameChain(
6187 OUT PVOID *Callers,
6188 IN ULONG Count,
6189 IN ULONG Flags);
6190
6191 NTKERNELAPI
6192 BOOLEAN
6193 NTAPI
6194 KeAreAllApcsDisabled(
6195 VOID
6196 );
6197
6198 /* Guarded Mutex routines */
6199
6200 NTKERNELAPI
6201 VOID
6202 FASTCALL
6203 KeAcquireGuardedMutex(
6204 IN OUT PKGUARDED_MUTEX GuardedMutex
6205 );
6206
6207 NTKERNELAPI
6208 VOID
6209 FASTCALL
6210 KeAcquireGuardedMutexUnsafe(
6211 IN OUT PKGUARDED_MUTEX GuardedMutex
6212 );
6213
6214 NTKERNELAPI
6215 VOID
6216 NTAPI
6217 KeEnterGuardedRegion(
6218 VOID
6219 );
6220
6221 NTKERNELAPI
6222 VOID
6223 NTAPI
6224 KeLeaveGuardedRegion(
6225 VOID
6226 );
6227
6228 NTKERNELAPI
6229 VOID
6230 FASTCALL
6231 KeInitializeGuardedMutex(
6232 OUT PKGUARDED_MUTEX GuardedMutex
6233 );
6234
6235 NTKERNELAPI
6236 VOID
6237 FASTCALL
6238 KeReleaseGuardedMutexUnsafe(
6239 IN OUT PKGUARDED_MUTEX GuardedMutex
6240 );
6241
6242 NTKERNELAPI
6243 VOID
6244 FASTCALL
6245 KeReleaseGuardedMutex(
6246 IN OUT PKGUARDED_MUTEX GuardedMutex
6247 );
6248
6249 NTKERNELAPI
6250 BOOLEAN
6251 FASTCALL
6252 KeTryToAcquireGuardedMutex(
6253 IN OUT PKGUARDED_MUTEX GuardedMutex
6254 );
6255
6256 /* Fast Mutex */
6257 #define ExInitializeFastMutex(_FastMutex) \
6258 { \
6259 (_FastMutex)->Count = FM_LOCK_BIT; \
6260 (_FastMutex)->Owner = NULL; \
6261 (_FastMutex)->Contention = 0; \
6262 KeInitializeEvent(&(_FastMutex)->Gate, SynchronizationEvent, FALSE); \
6263 }
6264
6265 NTKERNELAPI
6266 VOID
6267 NTAPI
6268 KeInitializeEvent(
6269 IN PRKEVENT Event,
6270 IN EVENT_TYPE Type,
6271 IN BOOLEAN State);
6272
6273 /******************************************************************************
6274 * Executive Types *
6275 ******************************************************************************/
6276
6277 typedef struct _ZONE_SEGMENT_HEADER {
6278 SINGLE_LIST_ENTRY SegmentList;
6279 PVOID Reserved;
6280 } ZONE_SEGMENT_HEADER, *PZONE_SEGMENT_HEADER;
6281
6282 typedef struct _ZONE_HEADER {
6283 SINGLE_LIST_ENTRY FreeList;
6284 SINGLE_LIST_ENTRY SegmentList;
6285 ULONG BlockSize;
6286 ULONG TotalSegmentSize;
6287 } ZONE_HEADER, *PZONE_HEADER;
6288
6289 #define PROTECTED_POOL 0x80000000
6290
6291 /******************************************************************************
6292 * Executive Functions *
6293 ******************************************************************************/
6294
6295 NTKERNELAPI
6296 NTSTATUS
6297 NTAPI
6298 ExExtendZone(
6299 IN PZONE_HEADER Zone,
6300 IN PVOID Segment,
6301 IN ULONG SegmentSize);
6302
6303 static __inline PVOID
6304 ExAllocateFromZone(
6305 IN PZONE_HEADER Zone)
6306 {
6307 if (Zone->FreeList.Next)
6308 Zone->FreeList.Next = Zone->FreeList.Next->Next;
6309 return (PVOID) Zone->FreeList.Next;
6310 }
6311
6312 static __inline PVOID
6313 ExFreeToZone(
6314 IN PZONE_HEADER Zone,
6315 IN PVOID Block)
6316 {
6317 ((PSINGLE_LIST_ENTRY) Block)->Next = Zone->FreeList.Next;
6318 Zone->FreeList.Next = ((PSINGLE_LIST_ENTRY) Block);
6319 return ((PSINGLE_LIST_ENTRY) Block)->Next;
6320 }
6321
6322 NTKERNELAPI
6323 NTSTATUS
6324 NTAPI
6325 ExInitializeZone(
6326 IN PZONE_HEADER Zone,
6327 IN ULONG BlockSize,
6328 IN PVOID InitialSegment,
6329 IN ULONG InitialSegmentSize);
6330
6331 /*
6332 * PVOID
6333 * ExInterlockedAllocateFromZone(
6334 * IN PZONE_HEADER Zone,
6335 * IN PKSPIN_LOCK Lock)
6336 */
6337 #define ExInterlockedAllocateFromZone(Zone, Lock) \
6338 ((PVOID) ExInterlockedPopEntryList(&Zone->FreeList, Lock))
6339
6340 NTKERNELAPI
6341 NTSTATUS
6342 NTAPI
6343 ExInterlockedExtendZone(
6344 IN PZONE_HEADER Zone,
6345 IN PVOID Segment,
6346 IN ULONG SegmentSize,
6347 IN PKSPIN_LOCK Lock);
6348
6349 /* PVOID
6350 * ExInterlockedFreeToZone(
6351 * IN PZONE_HEADER Zone,
6352 * IN PVOID Block,
6353 * IN PKSPIN_LOCK Lock);
6354 */
6355 #define ExInterlockedFreeToZone(Zone, Block, Lock) \
6356 ExInterlockedPushEntryList(&(Zone)->FreeList, (PSINGLE_LIST_ENTRY)(Block), Lock)
6357
6358 /*
6359 * VOID
6360 * InitializeSListHead(
6361 * IN PSLIST_HEADER SListHead)
6362 */
6363 #define InitializeSListHead(_SListHead) \
6364 (_SListHead)->Alignment = 0
6365
6366 #define ExInitializeSListHead InitializeSListHead
6367
6368 /*
6369 * BOOLEAN
6370 * ExIsFullZone(
6371 * IN PZONE_HEADER Zone)
6372 */
6373 #define ExIsFullZone(Zone) \
6374 ((Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY) NULL)
6375
6376 /* BOOLEAN
6377 * ExIsObjectInFirstZoneSegment(
6378 * IN PZONE_HEADER Zone,
6379 * IN PVOID Object);
6380 */
6381 #define ExIsObjectInFirstZoneSegment(Zone,Object) \
6382 ((BOOLEAN)( ((PUCHAR)(Object) >= (PUCHAR)(Zone)->SegmentList.Next) && \
6383 ((PUCHAR)(Object) < (PUCHAR)(Zone)->SegmentList.Next + \
6384 (Zone)->TotalSegmentSize)) )
6385
6386 NTKERNELAPI
6387 DECLSPEC_NORETURN
6388 VOID
6389 NTAPI
6390 ExRaiseAccessViolation(
6391 VOID);
6392
6393 NTKERNELAPI
6394 DECLSPEC_NORETURN
6395 VOID
6396 NTAPI
6397 ExRaiseDatatypeMisalignment(
6398 VOID);
6399
6400 NTKERNELAPI
6401 NTSTATUS
6402 NTAPI
6403 ExUuidCreate(
6404 OUT UUID *Uuid);
6405
6406 #define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite
6407 #define ExAcquireResourceShared ExAcquireResourceSharedLite
6408 #define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite
6409 #define ExDeleteResource ExDeleteResourceLite
6410 #define ExInitializeResource ExInitializeResourceLite
6411 #define ExIsResourceAcquiredExclusive ExIsResourceAcquiredExclusiveLite
6412 #define ExIsResourceAcquiredShared ExIsResourceAcquiredSharedLite
6413 #define ExIsResourceAcquired ExIsResourceAcquiredSharedLite
6414 #define ExReleaseResourceForThread ExReleaseResourceForThreadLite
6415
6416
6417 #if DBG
6418
6419 #define PAGED_CODE() { \
6420 if (KeGetCurrentIrql() > APC_LEVEL) { \
6421 KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
6422 ASSERT(FALSE); \
6423 } \
6424 }
6425
6426 #else
6427
6428 #define PAGED_CODE()
6429
6430 #endif
6431
6432 NTKERNELAPI
6433 VOID
6434 NTAPI
6435 ProbeForRead(
6436 IN CONST VOID *Address,
6437 IN SIZE_T Length,
6438 IN ULONG Alignment);
6439
6440 NTKERNELAPI
6441 VOID
6442 NTAPI
6443 ProbeForWrite(
6444 IN PVOID Address,
6445 IN SIZE_T Length,
6446 IN ULONG Alignment);
6447
6448
6449
6450 /** Configuration manager routines **/
6451
6452 NTKERNELAPI
6453 NTSTATUS
6454 NTAPI
6455 CmRegisterCallback(
6456 IN PEX_CALLBACK_FUNCTION Function,
6457 IN PVOID Context,
6458 IN OUT PLARGE_INTEGER Cookie);
6459
6460 NTKERNELAPI
6461 NTSTATUS
6462 NTAPI
6463 CmUnRegisterCallback(
6464 IN LARGE_INTEGER Cookie);
6465
6466
6467
6468 /** Filesystem runtime library routines **/
6469
6470 NTKERNELAPI
6471 BOOLEAN
6472 NTAPI
6473 FsRtlIsTotalDeviceFailure(
6474 IN NTSTATUS Status);
6475
6476
6477
6478 /** Hardware abstraction layer routines **/
6479
6480 NTHALAPI
6481 BOOLEAN
6482 NTAPI
6483 HalMakeBeep(
6484 IN ULONG Frequency);
6485
6486 NTKERNELAPI
6487 VOID
6488 FASTCALL
6489 HalExamineMBR(
6490 IN PDEVICE_OBJECT DeviceObject,
6491 IN ULONG SectorSize,
6492 IN ULONG MBRTypeIdentifier,
6493 OUT PVOID *Buffer);
6494
6495 VOID
6496 NTAPI
6497 HalPutDmaAdapter(
6498 PADAPTER_OBJECT AdapterObject
6499 );
6500
6501
6502 /** Io access routines **/
6503
6504 #if !defined(_M_AMD64)
6505 NTHALAPI
6506 VOID
6507 NTAPI
6508 READ_PORT_BUFFER_UCHAR(
6509 IN PUCHAR Port,
6510 IN PUCHAR Buffer,
6511 IN ULONG Count);
6512
6513 NTHALAPI
6514 VOID
6515 NTAPI
6516 READ_PORT_BUFFER_ULONG(
6517 IN PULONG Port,
6518 IN PULONG Buffer,
6519 IN ULONG Count);
6520
6521 NTHALAPI
6522 VOID
6523 NTAPI
6524 READ_PORT_BUFFER_USHORT(
6525 IN PUSHORT Port,
6526 IN PUSHORT Buffer,
6527 IN ULONG Count);
6528
6529 NTHALAPI
6530 UCHAR
6531 NTAPI
6532 READ_PORT_UCHAR(
6533 IN PUCHAR Port);
6534
6535 NTHALAPI
6536 ULONG
6537 NTAPI
6538 READ_PORT_ULONG(
6539 IN PULONG Port);
6540
6541 NTHALAPI
6542 USHORT
6543 NTAPI
6544 READ_PORT_USHORT(
6545 IN PUSHORT Port);
6546
6547 NTKERNELAPI
6548 VOID
6549 NTAPI
6550 READ_REGISTER_BUFFER_UCHAR(
6551 IN PUCHAR Register,
6552 IN PUCHAR Buffer,
6553 IN ULONG Count);
6554
6555 NTKERNELAPI
6556 VOID
6557 NTAPI
6558 READ_REGISTER_BUFFER_ULONG(
6559 IN PULONG Register,
6560 IN PULONG Buffer,
6561 IN ULONG Count);
6562
6563 NTKERNELAPI
6564 VOID
6565 NTAPI
6566 READ_REGISTER_BUFFER_USHORT(
6567 IN PUSHORT Register,
6568 IN PUSHORT Buffer,
6569 IN ULONG Count);
6570
6571 NTKERNELAPI
6572 UCHAR
6573 NTAPI
6574 READ_REGISTER_UCHAR(
6575 IN PUCHAR Register);
6576
6577 NTKERNELAPI
6578 ULONG
6579 NTAPI
6580 READ_REGISTER_ULONG(
6581 IN PULONG Register);
6582
6583 NTKERNELAPI
6584 USHORT
6585 NTAPI
6586 READ_REGISTER_USHORT(
6587 IN PUSHORT Register);
6588
6589 NTHALAPI
6590 VOID
6591 NTAPI
6592 WRITE_PORT_BUFFER_UCHAR(
6593 IN PUCHAR Port,
6594 IN PUCHAR Buffer,
6595 IN ULONG Count);
6596
6597 NTHALAPI
6598 VOID
6599 NTAPI
6600 WRITE_PORT_BUFFER_ULONG(
6601 IN PULONG Port,
6602 IN PULONG Buffer,
6603 IN ULONG Count);
6604
6605 NTHALAPI
6606 VOID
6607 NTAPI
6608 WRITE_PORT_BUFFER_USHORT(
6609 IN PUSHORT Port,
6610 IN PUSHORT Buffer,
6611 IN ULONG Count);
6612
6613 NTHALAPI
6614 VOID
6615 NTAPI
6616 WRITE_PORT_UCHAR(
6617 IN PUCHAR Port,
6618 IN UCHAR Value);
6619
6620 NTHALAPI
6621 VOID
6622 NTAPI
6623 WRITE_PORT_ULONG(
6624 IN PULONG Port,
6625 IN ULONG Value);
6626
6627 NTHALAPI
6628 VOID
6629 NTAPI
6630 WRITE_PORT_USHORT(
6631 IN PUSHORT Port,
6632 IN USHORT Value);
6633
6634 NTKERNELAPI
6635 VOID
6636 NTAPI
6637 WRITE_REGISTER_BUFFER_UCHAR(
6638 IN PUCHAR Register,
6639 IN PUCHAR Buffer,
6640 IN ULONG Count);
6641
6642 NTKERNELAPI
6643 VOID
6644 NTAPI
6645 WRITE_REGISTER_BUFFER_ULONG(
6646 IN PULONG Register,
6647 IN PULONG Buffer,
6648 IN ULONG Count);
6649
6650 NTKERNELAPI
6651 VOID
6652 NTAPI
6653 WRITE_REGISTER_BUFFER_USHORT(
6654 IN PUSHORT Register,
6655 IN PUSHORT Buffer,
6656 IN ULONG Count);
6657
6658 NTKERNELAPI
6659 VOID
6660 NTAPI
6661 WRITE_REGISTER_UCHAR(
6662 IN PUCHAR Register,
6663 IN UCHAR Value);
6664
6665 NTKERNELAPI
6666 VOID
6667 NTAPI
6668 WRITE_REGISTER_ULONG(
6669 IN PULONG Register,
6670 IN ULONG Value);
6671
6672 NTKERNELAPI
6673 VOID
6674 NTAPI
6675 WRITE_REGISTER_USHORT(
6676 IN PUSHORT Register,
6677 IN USHORT Value);
6678
6679 #else
6680
6681 FORCEINLINE
6682 VOID
6683 READ_PORT_BUFFER_UCHAR(
6684 IN PUCHAR Port,
6685 IN PUCHAR Buffer,
6686 IN ULONG Count)
6687 {
6688 __inbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
6689 }
6690
6691 FORCEINLINE
6692 VOID
6693 READ_PORT_BUFFER_ULONG(
6694 IN PULONG Port,
6695 IN PULONG Buffer,
6696 IN ULONG Count)
6697 {
6698 __indwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
6699 }
6700
6701 FORCEINLINE
6702 VOID
6703 READ_PORT_BUFFER_USHORT(
6704 IN PUSHORT Port,
6705 IN PUSHORT Buffer,
6706 IN ULONG Count)
6707 {
6708 __inwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
6709 }
6710
6711 FORCEINLINE
6712 UCHAR
6713 READ_PORT_UCHAR(
6714 IN PUCHAR Port)
6715 {
6716 return __inbyte((USHORT)(ULONG_PTR)Port);
6717 }
6718
6719 FORCEINLINE
6720 ULONG
6721 READ_PORT_ULONG(
6722 IN PULONG Port)
6723 {
6724 return __indword((USHORT)(ULONG_PTR)Port);
6725 }
6726
6727 FORCEINLINE
6728 USHORT
6729 READ_PORT_USHORT(
6730 IN PUSHORT Port)
6731 {
6732 return __inword((USHORT)(ULONG_PTR)Port);
6733 }
6734
6735 FORCEINLINE
6736 VOID
6737 READ_REGISTER_BUFFER_UCHAR(
6738 IN PUCHAR Register,
6739 IN PUCHAR Buffer,
6740 IN ULONG Count)
6741 {
6742 __movsb(Register, Buffer, Count);
6743 }
6744
6745 FORCEINLINE
6746 VOID
6747 READ_REGISTER_BUFFER_ULONG(
6748 IN PULONG Register,
6749 IN PULONG Buffer,
6750 IN ULONG Count)
6751 {
6752 __movsd(Register, Buffer, Count);
6753 }
6754
6755 FORCEINLINE
6756 VOID
6757 READ_REGISTER_BUFFER_USHORT(
6758 IN PUSHORT Register,
6759 IN PUSHORT Buffer,
6760 IN ULONG Count)
6761 {
6762 __movsw(Register, Buffer, Count);
6763 }
6764
6765 FORCEINLINE
6766 UCHAR
6767 READ_REGISTER_UCHAR(
6768 IN PUCHAR Register)
6769 {
6770 return *Register;
6771 }
6772
6773 FORCEINLINE
6774 ULONG
6775 READ_REGISTER_ULONG(
6776 IN PULONG Register)
6777 {
6778 return *Register;
6779 }
6780
6781 FORCEINLINE
6782 USHORT
6783 READ_REGISTER_USHORT(
6784 IN PUSHORT Register)
6785 {
6786 return *Register;
6787 }
6788
6789 FORCEINLINE
6790 VOID
6791 WRITE_PORT_BUFFER_UCHAR(
6792 IN PUCHAR Port,
6793 IN PUCHAR Buffer,
6794 IN ULONG Count)
6795 {
6796 __outbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
6797 }
6798
6799 FORCEINLINE
6800 VOID
6801 WRITE_PORT_BUFFER_ULONG(
6802 IN PULONG Port,
6803 IN PULONG Buffer,
6804 IN ULONG Count)
6805 {
6806 __outdwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
6807 }
6808
6809 FORCEINLINE
6810 VOID
6811 WRITE_PORT_BUFFER_USHORT(
6812 IN PUSHORT Port,
6813 IN PUSHORT Buffer,
6814 IN ULONG Count)
6815 {
6816 __outwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
6817 }
6818
6819 FORCEINLINE
6820 VOID
6821 WRITE_PORT_UCHAR(
6822 IN PUCHAR Port,
6823 IN UCHAR Value)
6824 {
6825 __outbyte((USHORT)(ULONG_PTR)Port, Value);
6826 }
6827
6828 FORCEINLINE
6829 VOID
6830 WRITE_PORT_ULONG(
6831 IN PULONG Port,
6832 IN ULONG Value)
6833 {
6834 __outdword((USHORT)(ULONG_PTR)Port, Value);
6835 }
6836
6837 FORCEINLINE
6838 VOID
6839 WRITE_PORT_USHORT(
6840 IN PUSHORT Port,
6841 IN USHORT Value)
6842 {
6843 __outword((USHORT)(ULONG_PTR)Port, Value);
6844 }
6845
6846 FORCEINLINE
6847 VOID
6848 WRITE_REGISTER_BUFFER_UCHAR(
6849 IN PUCHAR Register,
6850 IN PUCHAR Buffer,
6851 IN ULONG Count)
6852 {
6853 LONG Synch;
6854 __movsb(Register, Buffer, Count);
6855 InterlockedOr(&Synch, 1);
6856 }
6857
6858 FORCEINLINE
6859 VOID
6860 WRITE_REGISTER_BUFFER_ULONG(
6861 IN PULONG Register,
6862 IN PULONG Buffer,
6863 IN ULONG Count)
6864 {
6865 LONG Synch;
6866 __movsd(Register, Buffer, Count);
6867 InterlockedOr(&Synch, 1);
6868 }
6869
6870 FORCEINLINE
6871 VOID
6872 WRITE_REGISTER_BUFFER_USHORT(
6873 IN PUSHORT Register,
6874 IN PUSHORT Buffer,
6875 IN ULONG Count)
6876 {
6877 LONG Synch;
6878 __movsw(Register, Buffer, Count);
6879 InterlockedOr(&Synch, 1);
6880 }
6881
6882 FORCEINLINE
6883 VOID
6884 WRITE_REGISTER_UCHAR(
6885 IN PUCHAR Register,
6886 IN UCHAR Value)
6887 {
6888 LONG Synch;
6889 *Register = Value;
6890 InterlockedOr(&Synch, 1);
6891 }
6892
6893 FORCEINLINE
6894 VOID
6895 WRITE_REGISTER_ULONG(
6896 IN PULONG Register,
6897 IN ULONG Value)
6898 {
6899 LONG Synch;
6900 *Register = Value;
6901 InterlockedOr(&Synch, 1);
6902 }
6903
6904 FORCEINLINE
6905 VOID
6906 WRITE_REGISTER_USHORT(
6907 IN PUSHORT Register,
6908 IN USHORT Value)
6909 {
6910 LONG Sync;
6911 *Register = Value;
6912 InterlockedOr(&Sync, 1);
6913 }
6914
6915 #endif
6916
6917 /** I/O manager routines **/
6918
6919 NTKERNELAPI
6920 VOID
6921 NTAPI
6922 IoAcquireCancelSpinLock(
6923 OUT PKIRQL Irql);
6924
6925 NTKERNELAPI
6926 NTSTATUS
6927 NTAPI
6928 IoAcquireRemoveLockEx(
6929 IN PIO_REMOVE_LOCK RemoveLock,
6930 IN OPTIONAL PVOID Tag OPTIONAL,
6931 IN PCSTR File,
6932 IN ULONG Line,
6933 IN ULONG RemlockSize);
6934
6935 /*
6936 * NTSTATUS
6937 * IoAcquireRemoveLock(
6938 * IN PIO_REMOVE_LOCK RemoveLock,
6939 * IN OPTIONAL PVOID Tag)
6940 */
6941 #define IoAcquireRemoveLock(_RemoveLock, \
6942 _Tag) \
6943 IoAcquireRemoveLockEx(_RemoveLock, _Tag, __FILE__, __LINE__, sizeof(IO_REMOVE_LOCK))
6944
6945 /*
6946 * VOID
6947 * IoAdjustPagingPathCount(
6948 * IN PLONG Count,
6949 * IN BOOLEAN Increment)
6950 */
6951 #define IoAdjustPagingPathCount(_Count, \
6952 _Increment) \
6953 { \
6954 if (_Increment) \
6955 { \
6956 InterlockedIncrement(_Count); \
6957 } \
6958 else \
6959 { \
6960 InterlockedDecrement(_Count); \
6961 } \
6962 }
6963
6964 #ifndef DMA_MACROS_DEFINED
6965 NTKERNELAPI
6966 NTSTATUS
6967 NTAPI
6968 IoAllocateAdapterChannel(
6969 IN PADAPTER_OBJECT AdapterObject,
6970 IN PDEVICE_OBJECT DeviceObject,
6971 IN ULONG NumberOfMapRegisters,
6972 IN PDRIVER_CONTROL ExecutionRoutine,
6973 IN PVOID Context);
6974 #endif
6975
6976 NTKERNELAPI
6977 VOID
6978 NTAPI
6979 IoAllocateController(
6980 IN PCONTROLLER_OBJECT ControllerObject,
6981 IN PDEVICE_OBJECT DeviceObject,
6982 IN PDRIVER_CONTROL ExecutionRoutine,
6983 IN PVOID Context);
6984
6985 NTKERNELAPI
6986 NTSTATUS
6987 NTAPI
6988 IoAllocateDriverObjectExtension(
6989 IN PDRIVER_OBJECT DriverObject,
6990 IN PVOID ClientIdentificationAddress,
6991 IN ULONG DriverObjectExtensionSize,
6992 OUT PVOID *DriverObjectExtension);
6993
6994 NTKERNELAPI
6995 PVOID
6996 NTAPI
6997 IoAllocateErrorLogEntry(
6998 IN PVOID IoObject,
6999 IN UCHAR EntrySize);
7000
7001 NTKERNELAPI
7002 PIRP
7003 NTAPI
7004 IoAllocateIrp(
7005 IN CCHAR StackSize,
7006 IN BOOLEAN ChargeQuota);
7007
7008 NTKERNELAPI
7009 PMDL
7010 NTAPI
7011 IoAllocateMdl(
7012 IN PVOID VirtualAddress,
7013 IN ULONG Length,
7014 IN BOOLEAN SecondaryBuffer,
7015 IN BOOLEAN ChargeQuota,
7016 IN OUT PIRP Irp OPTIONAL);
7017
7018 NTKERNELAPI
7019 PIO_WORKITEM
7020 NTAPI
7021 IoAllocateWorkItem(
7022 IN PDEVICE_OBJECT DeviceObject);
7023
7024 /*
7025 * VOID IoAssignArcName(
7026 * IN PUNICODE_STRING ArcName,
7027 * IN PUNICODE_STRING DeviceName);
7028 */
7029 #define IoAssignArcName(_ArcName, _DeviceName) ( \
7030 IoCreateSymbolicLink((_ArcName), (_DeviceName)))
7031
7032 NTKERNELAPI
7033 NTSTATUS
7034 NTAPI
7035 IoAttachDevice(
7036 IN PDEVICE_OBJECT SourceDevice,
7037 IN PUNICODE_STRING TargetDevice,
7038 OUT PDEVICE_OBJECT *AttachedDevice);
7039
7040 NTKERNELAPI
7041 PDEVICE_OBJECT
7042 NTAPI
7043 IoAttachDeviceToDeviceStack(
7044 IN PDEVICE_OBJECT SourceDevice,
7045 IN PDEVICE_OBJECT TargetDevice);
7046
7047 NTKERNELAPI
7048 PIRP
7049 NTAPI
7050 IoBuildAsynchronousFsdRequest(
7051 IN ULONG MajorFunction,
7052 IN PDEVICE_OBJECT DeviceObject,
7053 IN OUT PVOID Buffer OPTIONAL,
7054 IN ULONG Length OPTIONAL,
7055 IN PLARGE_INTEGER StartingOffset OPTIONAL,
7056 IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL);
7057
7058 NTKERNELAPI
7059 PIRP
7060 NTAPI
7061 IoBuildDeviceIoControlRequest(
7062 IN ULONG IoControlCode,
7063 IN PDEVICE_OBJECT DeviceObject,
7064 IN PVOID InputBuffer OPTIONAL,
7065 IN ULONG InputBufferLength,
7066 OUT PVOID OutputBuffer OPTIONAL,
7067 IN ULONG OutputBufferLength,
7068 IN BOOLEAN InternalDeviceIoControl,
7069 IN PKEVENT Event,
7070 OUT PIO_STATUS_BLOCK IoStatusBlock);
7071
7072 NTKERNELAPI
7073 VOID
7074 NTAPI
7075 IoBuildPartialMdl(
7076 IN PMDL SourceMdl,
7077 IN OUT PMDL TargetMdl,
7078 IN PVOID VirtualAddress,
7079 IN ULONG Length);
7080
7081 NTKERNELAPI
7082 PIRP
7083 NTAPI
7084 IoBuildSynchronousFsdRequest(
7085 IN ULONG MajorFunction,
7086 IN PDEVICE_OBJECT DeviceObject,
7087 IN OUT PVOID Buffer OPTIONAL,
7088 IN ULONG Length OPTIONAL,
7089 IN PLARGE_INTEGER StartingOffset OPTIONAL,
7090 IN PKEVENT Event,
7091 OUT PIO_STATUS_BLOCK IoStatusBlock);
7092
7093 NTKERNELAPI
7094 NTSTATUS
7095 FASTCALL
7096 IofCallDriver(
7097 IN PDEVICE_OBJECT DeviceObject,
7098 IN OUT PIRP Irp);
7099
7100 /*
7101 * NTSTATUS
7102 * IoCallDriver(
7103 * IN PDEVICE_OBJECT DeviceObject,
7104 * IN OUT PIRP Irp)
7105 */
7106 #define IoCallDriver IofCallDriver
7107
7108 NTKERNELAPI
7109 VOID
7110 NTAPI
7111 IoCancelFileOpen(
7112 IN PDEVICE_OBJECT DeviceObject,
7113 IN PFILE_OBJECT FileObject);
7114
7115 NTKERNELAPI
7116 BOOLEAN
7117 NTAPI
7118 IoCancelIrp(
7119 IN PIRP Irp);
7120
7121 NTKERNELAPI
7122 NTSTATUS
7123 NTAPI
7124 IoCheckShareAccess(
7125 IN ACCESS_MASK DesiredAccess,
7126 IN ULONG DesiredShareAccess,
7127 IN OUT PFILE_OBJECT FileObject,
7128 IN OUT PSHARE_ACCESS ShareAccess,
7129 IN BOOLEAN Update);
7130
7131 NTKERNELAPI
7132 VOID
7133 FASTCALL
7134 IofCompleteRequest(
7135 IN PIRP Irp,
7136 IN CCHAR PriorityBoost);
7137
7138 /*
7139 * VOID
7140 * IoCompleteRequest(
7141 * IN PIRP Irp,
7142 * IN CCHAR PriorityBoost)
7143 */
7144 #define IoCompleteRequest IofCompleteRequest
7145
7146 NTKERNELAPI
7147 NTSTATUS
7148 NTAPI
7149 IoConnectInterrupt(
7150 OUT PKINTERRUPT *InterruptObject,
7151 IN PKSERVICE_ROUTINE ServiceRoutine,
7152 IN PVOID ServiceContext,
7153 IN PKSPIN_LOCK SpinLock OPTIONAL,
7154 IN ULONG Vector,
7155 IN KIRQL Irql,
7156 IN KIRQL SynchronizeIrql,
7157 IN KINTERRUPT_MODE InterruptMode,
7158 IN BOOLEAN ShareVector,
7159 IN KAFFINITY ProcessorEnableMask,
7160 IN BOOLEAN FloatingSave);
7161
7162 /*
7163 * PIO_STACK_LOCATION
7164 * IoGetCurrentIrpStackLocation(
7165 * IN PIRP Irp)
7166 */
7167 #define IoGetCurrentIrpStackLocation(_Irp) \
7168 ((_Irp)->Tail.Overlay.CurrentStackLocation)
7169
7170 /*
7171 * PIO_STACK_LOCATION
7172 * IoGetNextIrpStackLocation(
7173 * IN PIRP Irp)
7174 */
7175 #define IoGetNextIrpStackLocation(_Irp) \
7176 ((_Irp)->Tail.Overlay.CurrentStackLocation - 1)
7177
7178 /*
7179 * VOID
7180 * IoCopyCurrentIrpStackLocationToNext(
7181 * IN PIRP Irp)
7182 */
7183 #define IoCopyCurrentIrpStackLocationToNext(_Irp) \
7184 { \
7185 PIO_STACK_LOCATION _IrpSp; \
7186 PIO_STACK_LOCATION _NextIrpSp; \
7187 _IrpSp = IoGetCurrentIrpStackLocation(_Irp); \
7188 _NextIrpSp = IoGetNextIrpStackLocation(_Irp); \
7189 RtlCopyMemory(_NextIrpSp, _IrpSp, \
7190 FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine)); \
7191 _NextIrpSp->Control = 0; \
7192 }
7193
7194 NTKERNELAPI
7195 PCONTROLLER_OBJECT
7196 NTAPI
7197 IoCreateController(
7198 IN ULONG Size);
7199
7200 NTKERNELAPI
7201 NTSTATUS
7202 NTAPI
7203 IoCreateDevice(
7204 IN PDRIVER_OBJECT DriverObject,
7205 IN ULONG DeviceExtensionSize,
7206 IN PUNICODE_STRING DeviceName OPTIONAL,
7207 IN DEVICE_TYPE DeviceType,
7208 IN ULONG DeviceCharacteristics,
7209 IN BOOLEAN Exclusive,
7210 OUT PDEVICE_OBJECT *DeviceObject);
7211
7212 NTKERNELAPI
7213 NTSTATUS
7214 NTAPI
7215 IoCreateDisk(
7216 IN PDEVICE_OBJECT DeviceObject,
7217 IN PCREATE_DISK Disk);
7218
7219 NTKERNELAPI
7220 NTSTATUS
7221 NTAPI
7222 IoCreateFile(
7223 OUT PHANDLE FileHandle,
7224 IN ACCESS_MASK DesiredAccess,
7225 IN POBJECT_ATTRIBUTES ObjectAttributes,
7226 OUT PIO_STATUS_BLOCK IoStatusBlock,
7227 IN PLARGE_INTEGER AllocationSize OPTIONAL,
7228 IN ULONG FileAttributes,
7229 IN ULONG ShareAccess,
7230 IN ULONG Disposition,
7231 IN ULONG CreateOptions,
7232 IN PVOID EaBuffer OPTIONAL,
7233 IN ULONG EaLength,
7234 IN CREATE_FILE_TYPE CreateFileType,
7235 IN PVOID ExtraCreateParameters OPTIONAL,
7236 IN ULONG Options);
7237
7238 NTKERNELAPI
7239 PKEVENT
7240 NTAPI
7241 IoCreateNotificationEvent(
7242 IN PUNICODE_STRING EventName,
7243 OUT PHANDLE EventHandle);
7244
7245 NTKERNELAPI
7246 NTSTATUS
7247 NTAPI
7248 IoCreateSymbolicLink(
7249 IN PUNICODE_STRING SymbolicLinkName,
7250 IN PUNICODE_STRING DeviceName);
7251
7252 NTKERNELAPI
7253 PKEVENT
7254 NTAPI
7255 IoCreateSynchronizationEvent(
7256 IN PUNICODE_STRING EventName,
7257 OUT PHANDLE EventHandle);
7258
7259 NTKERNELAPI
7260 NTSTATUS
7261 NTAPI
7262 IoCreateUnprotectedSymbolicLink(
7263 IN PUNICODE_STRING SymbolicLinkName,
7264 IN PUNICODE_STRING DeviceName);
7265
7266 NTKERNELAPI
7267 NTSTATUS
7268 NTAPI
7269 IoCsqInitialize(
7270 PIO_CSQ Csq,
7271 IN PIO_CSQ_INSERT_IRP CsqInsertIrp,
7272 IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
7273 IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
7274 IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
7275 IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
7276 IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp);
7277
7278 NTKERNELAPI
7279 VOID
7280 NTAPI
7281 IoCsqInsertIrp(
7282 IN PIO_CSQ Csq,
7283 IN PIRP Irp,
7284 IN PIO_CSQ_IRP_CONTEXT Context);
7285
7286 NTKERNELAPI
7287 PIRP
7288 NTAPI
7289 IoCsqRemoveIrp(
7290 IN PIO_CSQ Csq,
7291 IN PIO_CSQ_IRP_CONTEXT Context);
7292
7293 NTKERNELAPI
7294 PIRP
7295 NTAPI
7296 IoCsqRemoveNextIrp(
7297 IN PIO_CSQ Csq,
7298 IN PVOID PeekContext);
7299
7300 NTKERNELAPI
7301 VOID
7302 NTAPI
7303 IoDeleteController(
7304 IN PCONTROLLER_OBJECT ControllerObject);
7305
7306 NTKERNELAPI
7307 VOID
7308 NTAPI
7309 IoDeleteDevice(
7310 IN PDEVICE_OBJECT DeviceObject);
7311
7312 NTKERNELAPI
7313 NTSTATUS
7314 NTAPI
7315 IoDeleteSymbolicLink(
7316 IN PUNICODE_STRING SymbolicLinkName);
7317
7318 /*
7319 * VOID
7320 * IoDeassignArcName(
7321 * IN PUNICODE_STRING ArcName)
7322 */
7323 #define IoDeassignArcName IoDeleteSymbolicLink
7324
7325 NTKERNELAPI
7326 VOID
7327 NTAPI
7328 IoDetachDevice(
7329 IN OUT PDEVICE_OBJECT TargetDevice);
7330
7331 NTKERNELAPI
7332 VOID
7333 NTAPI
7334 IoDisconnectInterrupt(
7335 IN PKINTERRUPT InterruptObject);
7336
7337 NTKERNELAPI
7338 BOOLEAN
7339 NTAPI
7340 IoForwardIrpSynchronously(
7341 IN PDEVICE_OBJECT DeviceObject,
7342 IN PIRP Irp);
7343
7344 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
7345
7346 NTKERNELAPI
7347 VOID
7348 NTAPI
7349 IoFreeController(
7350 IN PCONTROLLER_OBJECT ControllerObject);
7351
7352 NTKERNELAPI
7353 VOID
7354 NTAPI
7355 IoFreeErrorLogEntry(
7356 PVOID ElEntry);
7357
7358 NTKERNELAPI
7359 VOID
7360 NTAPI
7361 IoFreeIrp(
7362 IN PIRP Irp);
7363
7364 NTKERNELAPI
7365 VOID
7366 NTAPI
7367 IoFreeMdl(
7368 IN PMDL Mdl);
7369
7370 NTKERNELAPI
7371 VOID
7372 NTAPI
7373 IoFreeWorkItem(
7374 IN PIO_WORKITEM pIOWorkItem);
7375
7376 NTKERNELAPI
7377 PDEVICE_OBJECT
7378 NTAPI
7379 IoGetAttachedDevice(
7380 IN PDEVICE_OBJECT DeviceObject);
7381
7382 NTKERNELAPI
7383 PDEVICE_OBJECT
7384 NTAPI
7385 IoGetAttachedDeviceReference(
7386 IN PDEVICE_OBJECT DeviceObject);
7387
7388 NTKERNELAPI
7389 NTSTATUS
7390 NTAPI
7391 IoGetBootDiskInformation(
7392 IN OUT PBOOTDISK_INFORMATION BootDiskInformation,
7393 IN ULONG Size);
7394
7395 NTKERNELAPI
7396 PCONFIGURATION_INFORMATION
7397 NTAPI
7398 IoGetConfigurationInformation(
7399 VOID);
7400
7401 NTKERNELAPI
7402 PEPROCESS
7403 NTAPI
7404 IoGetCurrentProcess(
7405 VOID);
7406
7407 NTKERNELAPI
7408 NTSTATUS
7409 NTAPI
7410 IoGetDeviceInterfaceAlias(
7411 IN PUNICODE_STRING SymbolicLinkName,
7412 IN CONST GUID *AliasInterfaceClassGuid,
7413 OUT PUNICODE_STRING AliasSymbolicLinkName);
7414
7415 #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
7416
7417 NTKERNELAPI
7418 NTSTATUS
7419 NTAPI
7420 IoGetDeviceInterfaces(
7421 IN CONST GUID *InterfaceClassGuid,
7422 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
7423 IN ULONG Flags,
7424 OUT PWSTR *SymbolicLinkList);
7425
7426 NTKERNELAPI
7427 NTSTATUS
7428 NTAPI
7429 IoGetDeviceObjectPointer(
7430 IN PUNICODE_STRING ObjectName,
7431 IN ACCESS_MASK DesiredAccess,
7432 OUT PFILE_OBJECT *FileObject,
7433 OUT PDEVICE_OBJECT *DeviceObject);
7434
7435 NTKERNELAPI
7436 NTSTATUS
7437 NTAPI
7438 IoGetDeviceProperty(
7439 IN PDEVICE_OBJECT DeviceObject,
7440 IN DEVICE_REGISTRY_PROPERTY DeviceProperty,
7441 IN ULONG BufferLength,
7442 OUT PVOID PropertyBuffer,
7443 OUT PULONG ResultLength);
7444
7445 NTKERNELAPI
7446 PDEVICE_OBJECT
7447 NTAPI
7448 IoGetDeviceToVerify(
7449 IN PETHREAD Thread);
7450
7451 NTKERNELAPI
7452 PDMA_ADAPTER
7453 NTAPI
7454 IoGetDmaAdapter(
7455 IN PDEVICE_OBJECT PhysicalDeviceObject,
7456 IN PDEVICE_DESCRIPTION DeviceDescription,
7457 IN OUT PULONG NumberOfMapRegisters);
7458
7459 NTKERNELAPI
7460 PVOID
7461 NTAPI
7462 IoGetDriverObjectExtension(
7463 IN PDRIVER_OBJECT DriverObject,
7464 IN PVOID ClientIdentificationAddress);
7465
7466 NTKERNELAPI
7467 PGENERIC_MAPPING
7468 NTAPI
7469 IoGetFileObjectGenericMapping(
7470 VOID);
7471
7472 /*
7473 * ULONG
7474 * IoGetFunctionCodeFromCtlCode(
7475 * IN ULONG ControlCode)
7476 */
7477 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
7478 (((_ControlCode) >> 2) & 0x00000FFF)
7479
7480 NTKERNELAPI
7481 PVOID
7482 NTAPI
7483 IoGetInitialStack(
7484 VOID);
7485
7486 NTKERNELAPI
7487 PDEVICE_OBJECT
7488 NTAPI
7489 IoGetRelatedDeviceObject(
7490 IN PFILE_OBJECT FileObject);
7491
7492 NTKERNELAPI
7493 VOID
7494 NTAPI
7495 IoGetStackLimits(
7496 OUT PULONG_PTR LowLimit,
7497 OUT PULONG_PTR HighLimit);
7498
7499 FORCEINLINE
7500 ULONG_PTR
7501 IoGetRemainingStackSize(
7502 VOID
7503 )
7504 {
7505 ULONG_PTR End, Begin;
7506 ULONG_PTR Result;
7507
7508 IoGetStackLimits(&Begin, &End);
7509 Result = (ULONG_PTR)(&End) - Begin;
7510 return Result;
7511 }
7512
7513 NTKERNELAPI
7514 VOID
7515 NTAPI
7516 KeInitializeDpc(
7517 IN PRKDPC Dpc,
7518 IN PKDEFERRED_ROUTINE DeferredRoutine,
7519 IN PVOID DeferredContext);
7520
7521 /*
7522 * VOID
7523 * IoInitializeDpcRequest(
7524 * IN PDEVICE_OBJECT DeviceObject,
7525 * IN PIO_DPC_ROUTINE DpcRoutine)
7526 */
7527 #define IoInitializeDpcRequest(_DeviceObject, \
7528 _DpcRoutine) \
7529 KeInitializeDpc(&(_DeviceObject)->Dpc, \
7530 (PKDEFERRED_ROUTINE) (_DpcRoutine), \
7531 _DeviceObject)
7532
7533 NTKERNELAPI
7534 VOID
7535 NTAPI
7536 IoInitializeIrp(
7537 IN OUT PIRP Irp,
7538 IN USHORT PacketSize,
7539 IN CCHAR StackSize);
7540
7541 NTKERNELAPI
7542 VOID
7543 NTAPI
7544 IoInitializeRemoveLockEx(
7545 IN PIO_REMOVE_LOCK Lock,
7546 IN ULONG AllocateTag,
7547 IN ULONG MaxLockedMinutes,
7548 IN ULONG HighWatermark,
7549 IN ULONG RemlockSize);
7550
7551 /* VOID
7552 * IoInitializeRemoveLock(
7553 * IN PIO_REMOVE_LOCK Lock,
7554 * IN ULONG AllocateTag,
7555 * IN ULONG MaxLockedMinutes,
7556 * IN ULONG HighWatermark)
7557 */
7558 #define IoInitializeRemoveLock( \
7559 Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
7560 IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
7561 HighWatermark, sizeof(IO_REMOVE_LOCK))
7562
7563 NTKERNELAPI
7564 NTSTATUS
7565 NTAPI
7566 IoInitializeTimer(
7567 IN PDEVICE_OBJECT DeviceObject,
7568 IN PIO_TIMER_ROUTINE TimerRoutine,
7569 IN PVOID Context);
7570
7571 NTKERNELAPI
7572 VOID
7573 NTAPI
7574 IoInvalidateDeviceRelations(
7575 IN PDEVICE_OBJECT DeviceObject,
7576 IN DEVICE_RELATION_TYPE Type);
7577
7578 NTKERNELAPI
7579 VOID
7580 NTAPI
7581 IoInvalidateDeviceState(
7582 IN PDEVICE_OBJECT PhysicalDeviceObject);
7583
7584 NTKERNELAPI
7585 BOOLEAN
7586 NTAPI
7587 IoIs32bitProcess(
7588 IN PIRP Irp OPTIONAL);
7589
7590 /*
7591 * BOOLEAN
7592 * IoIsErrorUserInduced(
7593 * IN NTSTATUS Status);
7594 */
7595 #define IoIsErrorUserInduced(Status) \
7596 ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
7597 ((Status) == STATUS_IO_TIMEOUT) || \
7598 ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
7599 ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
7600 ((Status) == STATUS_VERIFY_REQUIRED) || \
7601 ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
7602 ((Status) == STATUS_WRONG_VOLUME)))
7603
7604 NTKERNELAPI
7605 BOOLEAN
7606 NTAPI
7607 IoIsWdmVersionAvailable(
7608 IN UCHAR MajorVersion,
7609 IN UCHAR MinorVersion);
7610
7611 NTKERNELAPI
7612 PIRP
7613 NTAPI
7614 IoMakeAssociatedIrp(
7615 IN PIRP Irp,
7616 IN CCHAR StackSize);
7617
7618 /*
7619 * VOID
7620 * IoMarkIrpPending(
7621 * IN OUT PIRP Irp)
7622 */
7623 #define IoMarkIrpPending(_Irp) \
7624 (IoGetCurrentIrpStackLocation(_Irp)->Control |= SL_PENDING_RETURNED)
7625
7626 NTKERNELAPI
7627 NTSTATUS
7628 NTAPI
7629 IoOpenDeviceInterfaceRegistryKey(
7630 IN PUNICODE_STRING SymbolicLinkName,
7631 IN ACCESS_MASK DesiredAccess,
7632 OUT PHANDLE DeviceInterfaceKey);
7633
7634 #define PLUGPLAY_REGKEY_DEVICE 1
7635 #define PLUGPLAY_REGKEY_DRIVER 2
7636 #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4
7637
7638 NTKERNELAPI
7639 NTSTATUS
7640 NTAPI
7641 IoOpenDeviceRegistryKey(
7642 IN PDEVICE_OBJECT DeviceObject,
7643 IN ULONG DevInstKeyType,
7644 IN ACCESS_MASK DesiredAccess,
7645 OUT PHANDLE DevInstRegKey);
7646
7647 NTKERNELAPI
7648 NTSTATUS
7649 NTAPI
7650 IoQueryDeviceDescription(
7651 IN PINTERFACE_TYPE BusType OPTIONAL,
7652 IN PULONG BusNumber OPTIONAL,
7653 IN PCONFIGURATION_TYPE ControllerType OPTIONAL,
7654 IN PULONG ControllerNumber OPTIONAL,
7655 IN PCONFIGURATION_TYPE PeripheralType OPTIONAL,
7656 IN PULONG PeripheralNumber OPTIONAL,
7657 IN PIO_QUERY_DEVICE_ROUTINE CalloutRoutine,
7658 IN PVOID Context);
7659
7660 NTKERNELAPI
7661 VOID
7662 NTAPI
7663 IoQueueWorkItem(
7664 IN PIO_WORKITEM pIOWorkItem,
7665 IN PIO_WORKITEM_ROUTINE Routine,
7666 IN WORK_QUEUE_TYPE QueueType,
7667 IN PVOID Context);
7668
7669 NTKERNELAPI
7670 VOID
7671 NTAPI
7672 IoRaiseHardError(
7673 IN PIRP Irp,
7674 IN PVPB Vpb OPTIONAL,
7675 IN PDEVICE_OBJECT RealDeviceObject);
7676
7677 NTKERNELAPI
7678 BOOLEAN
7679 NTAPI
7680 IoRaiseInformationalHardError(
7681 IN NTSTATUS ErrorStatus,
7682 IN PUNICODE_STRING String OPTIONAL,
7683 IN PKTHREAD Thread OPTIONAL);
7684
7685 NTKERNELAPI
7686 NTSTATUS
7687 NTAPI
7688 IoReadDiskSignature(
7689 IN PDEVICE_OBJECT DeviceObject,
7690 IN ULONG BytesPerSector,
7691 OUT PDISK_SIGNATURE Signature);
7692
7693 NTKERNELAPI
7694 NTSTATUS
7695 FASTCALL
7696 IoReadPartitionTable(
7697 IN PDEVICE_OBJECT DeviceObject,
7698 IN ULONG SectorSize,
7699 IN BOOLEAN ReturnRecognizedPartitions,
7700 OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer);
7701
7702 NTKERNELAPI
7703 NTSTATUS
7704 NTAPI
7705 IoReadPartitionTableEx(
7706 IN PDEVICE_OBJECT DeviceObject,
7707 IN struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer);
7708
7709 NTKERNELAPI
7710 VOID
7711 NTAPI
7712 IoRegisterBootDriverReinitialization(
7713 IN PDRIVER_OBJECT DriverObject,
7714 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
7715 IN PVOID Context);
7716
7717 NTKERNELAPI
7718 VOID
7719 NTAPI
7720 IoRegisterBootDriverReinitialization(
7721 IN PDRIVER_OBJECT DriverObject,
7722 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
7723 IN PVOID Context);
7724
7725 NTKERNELAPI
7726 NTSTATUS
7727 NTAPI
7728 IoRegisterDeviceInterface(
7729 IN PDEVICE_OBJECT PhysicalDeviceObject,
7730 IN CONST GUID *InterfaceClassGuid,
7731 IN PUNICODE_STRING ReferenceString OPTIONAL,
7732 OUT PUNICODE_STRING SymbolicLinkName);
7733
7734 NTKERNELAPI
7735 VOID
7736 NTAPI
7737 IoRegisterDriverReinitialization(
7738 IN PDRIVER_OBJECT DriverObject,
7739 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
7740 IN PVOID Context);
7741
7742 NTKERNELAPI
7743 NTSTATUS
7744 NTAPI
7745 IoRegisterPlugPlayNotification(
7746 IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
7747 IN ULONG EventCategoryFlags,
7748 IN PVOID EventCategoryData OPTIONAL,
7749 IN PDRIVER_OBJECT DriverObject,
7750 IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine,
7751 IN PVOID Context,
7752 OUT PVOID *NotificationEntry);
7753
7754 NTKERNELAPI
7755 NTSTATUS
7756 NTAPI
7757 IoRegisterShutdownNotification(
7758 IN PDEVICE_OBJECT DeviceObject);
7759
7760 NTKERNELAPI
7761 VOID
7762 NTAPI
7763 IoReleaseCancelSpinLock(
7764 IN KIRQL Irql);
7765
7766 NTKERNELAPI
7767 VOID
7768 NTAPI
7769 IoReleaseRemoveLockAndWaitEx(
7770 IN PIO_REMOVE_LOCK RemoveLock,
7771 IN PVOID Tag,
7772 IN ULONG RemlockSize);
7773
7774 NTKERNELAPI
7775 VOID
7776 NTAPI
7777 IoReleaseRemoveLockEx(
7778 IN PIO_REMOVE_LOCK RemoveLock,
7779 IN PVOID Tag,
7780 IN ULONG RemlockSize);
7781
7782 /*
7783 * VOID
7784 * IoReleaseRemoveLock(
7785 * IN PIO_REMOVE_LOCK RemoveLock,
7786 * IN PVOID Tag)
7787 */
7788 #define IoReleaseRemoveLock(_RemoveLock, \
7789 _Tag) \
7790 IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
7791
7792 /*
7793 * VOID
7794 * IoReleaseRemoveLockAndWait(
7795 * IN PIO_REMOVE_LOCK RemoveLock,
7796 * IN PVOID Tag)
7797 */
7798 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
7799 _Tag) \
7800 IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
7801
7802 NTKERNELAPI
7803 VOID
7804 NTAPI
7805 IoRemoveShareAccess(
7806 IN PFILE_OBJECT FileObject,
7807 IN OUT PSHARE_ACCESS ShareAccess);
7808
7809 NTKERNELAPI
7810 NTSTATUS
7811 NTAPI
7812 IoReportDetectedDevice(
7813 IN PDRIVER_OBJECT DriverObject,
7814 IN INTERFACE_TYPE LegacyBusType,
7815 IN ULONG BusNumber,
7816 IN ULONG SlotNumber,
7817 IN PCM_RESOURCE_LIST ResourceList,
7818 IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL,
7819 IN BOOLEAN ResourceAssigned,
7820 IN OUT PDEVICE_OBJECT *DeviceObject);
7821
7822 NTKERNELAPI
7823 NTSTATUS
7824 NTAPI
7825 IoReportResourceForDetection(
7826 IN PDRIVER_OBJECT DriverObject,
7827 IN PCM_RESOURCE_LIST DriverList OPTIONAL,
7828 IN ULONG DriverListSize OPTIONAL,
7829 IN PDEVICE_OBJECT DeviceObject OPTIONAL,
7830 IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
7831 IN ULONG DeviceListSize OPTIONAL,
7832 OUT PBOOLEAN ConflictDetected);
7833
7834 NTKERNELAPI
7835 NTSTATUS
7836 NTAPI
7837 IoReportResourceUsage(
7838 IN PUNICODE_STRING DriverClassName OPTIONAL,
7839 IN PDRIVER_OBJECT DriverObject,
7840 IN PCM_RESOURCE_LIST DriverList OPTIONAL,
7841 IN ULONG DriverListSize OPTIONAL,
7842 IN PDEVICE_OBJECT DeviceObject,
7843 IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
7844 IN ULONG DeviceListSize OPTIONAL,
7845 IN BOOLEAN OverrideConflict,
7846 OUT PBOOLEAN ConflictDetected);
7847
7848 NTKERNELAPI
7849 NTSTATUS
7850 NTAPI
7851 IoReportTargetDeviceChange(
7852 IN PDEVICE_OBJECT PhysicalDeviceObject,
7853 IN PVOID NotificationStructure);
7854
7855 NTKERNELAPI
7856 NTSTATUS
7857 NTAPI
7858 IoReportTargetDeviceChangeAsynchronous(
7859 IN PDEVICE_OBJECT PhysicalDeviceObject,
7860 IN PVOID NotificationStructure,
7861 IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL,
7862 IN PVOID Context OPTIONAL);
7863
7864 NTKERNELAPI
7865 VOID
7866 NTAPI
7867 IoRequestDeviceEject(
7868 IN PDEVICE_OBJECT PhysicalDeviceObject);
7869
7870 /*
7871 * VOID
7872 * IoRequestDpc(
7873 * IN PDEVICE_OBJECT DeviceObject,
7874 * IN PIRP Irp,
7875 * IN PVOID Context);
7876 */
7877 #define IoRequestDpc(DeviceObject, Irp, Context)( \
7878 KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
7879
7880 NTKERNELAPI
7881 VOID
7882 NTAPI
7883 IoReuseIrp(
7884 IN OUT PIRP Irp,
7885 IN NTSTATUS Status);
7886
7887 /*
7888 * PDRIVER_CANCEL
7889 * IoSetCancelRoutine(
7890 * IN PIRP Irp,
7891 * IN PDRIVER_CANCEL CancelRoutine)
7892 */
7893 #define IoSetCancelRoutine(_Irp, \
7894 _CancelRoutine) \
7895 ((PDRIVER_CANCEL) InterlockedExchangePointer( \
7896 (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (_CancelRoutine)))
7897
7898 /*
7899 * VOID
7900 * IoSetCompletionRoutine(
7901 * IN PIRP Irp,
7902 * IN PIO_COMPLETION_ROUTINE CompletionRoutine,
7903 * IN PVOID Context,
7904 * IN BOOLEAN InvokeOnSuccess,
7905 * IN BOOLEAN InvokeOnError,
7906 * IN BOOLEAN InvokeOnCancel)
7907 */
7908 #define IoSetCompletionRoutine(_Irp, \
7909 _CompletionRoutine, \
7910 _Context, \
7911 _InvokeOnSuccess, \
7912 _InvokeOnError, \
7913 _InvokeOnCancel) \
7914 { \
7915 PIO_STACK_LOCATION _IrpSp; \
7916 ASSERT((_InvokeOnSuccess) || (_InvokeOnError) || (_InvokeOnCancel) ? \
7917 (_CompletionRoutine) != NULL : TRUE); \
7918 _IrpSp = IoGetNextIrpStackLocation(_Irp); \
7919 _IrpSp->CompletionRoutine = (PIO_COMPLETION_ROUTINE)(_CompletionRoutine); \
7920 _IrpSp->Context = (_Context); \
7921 _IrpSp->Control = 0; \
7922 if (_InvokeOnSuccess) _IrpSp->Control = SL_INVOKE_ON_SUCCESS; \
7923 if (_InvokeOnError) _IrpSp->Control |= SL_INVOKE_ON_ERROR; \
7924 if (_InvokeOnCancel) _IrpSp->Control |= SL_INVOKE_ON_CANCEL; \
7925 }
7926
7927 NTKERNELAPI
7928 NTSTATUS
7929 NTAPI
7930 IoSetCompletionRoutineEx(
7931 IN PDEVICE_OBJECT DeviceObject,
7932 IN PIRP Irp,
7933 IN PIO_COMPLETION_ROUTINE CompletionRoutine,
7934 IN PVOID Context,
7935 IN BOOLEAN InvokeOnSuccess,
7936 IN BOOLEAN InvokeOnError,
7937 IN BOOLEAN InvokeOnCancel);
7938
7939 NTKERNELAPI
7940 NTSTATUS
7941 NTAPI
7942 IoSetDeviceInterfaceState(
7943 IN PUNICODE_STRING SymbolicLinkName,
7944 IN BOOLEAN Enable);
7945
7946 NTKERNELAPI
7947 VOID
7948 NTAPI
7949 IoSetHardErrorOrVerifyDevice(
7950 IN PIRP Irp,
7951 IN PDEVICE_OBJECT DeviceObject);
7952
7953 /*
7954 * VOID
7955 * IoSetNextIrpStackLocation(
7956 * IN OUT PIRP Irp)
7957 */
7958 #define IoSetNextIrpStackLocation(_Irp) \
7959 { \
7960 (_Irp)->CurrentLocation--; \
7961 (_Irp)->Tail.Overlay.CurrentStackLocation--; \
7962 }
7963
7964 NTKERNELAPI
7965 NTSTATUS
7966 FASTCALL
7967 IoSetPartitionInformation(
7968 IN PDEVICE_OBJECT DeviceObject,
7969 IN ULONG SectorSize,
7970 IN ULONG PartitionNumber,
7971 IN ULONG PartitionType);
7972
7973 NTKERNELAPI
7974 NTSTATUS
7975 NTAPI
7976 IoSetPartitionInformationEx(
7977 IN PDEVICE_OBJECT DeviceObject,
7978 IN ULONG PartitionNumber,
7979 IN struct _SET_PARTITION_INFORMATION_EX *PartitionInfo);
7980
7981 NTKERNELAPI
7982 VOID
7983 NTAPI
7984 IoSetShareAccess(
7985 IN ACCESS_MASK DesiredAccess,
7986 IN ULONG DesiredShareAccess,
7987 IN OUT PFILE_OBJECT FileObject,
7988 OUT PSHARE_ACCESS ShareAccess);
7989
7990 NTKERNELAPI
7991 VOID
7992 NTAPI
7993 IoSetStartIoAttributes(
7994 IN PDEVICE_OBJECT DeviceObject,
7995 IN BOOLEAN DeferredStartIo,
7996 IN BOOLEAN NonCancelable);
7997
7998 NTKERNELAPI
7999 NTSTATUS
8000 NTAPI
8001 IoSetSystemPartition(
8002 IN PUNICODE_STRING VolumeNameString);
8003
8004 NTKERNELAPI
8005 BOOLEAN
8006 NTAPI
8007 IoSetThreadHardErrorMode(
8008 IN BOOLEAN EnableHardErrors);
8009
8010 /*
8011 * USHORT
8012 * IoSizeOfIrp(
8013 * IN CCHAR StackSize)
8014 */
8015 #define IoSizeOfIrp(_StackSize) \
8016 ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
8017
8018 /*
8019 * VOID
8020 * IoSkipCurrentIrpStackLocation(
8021 * IN PIRP Irp)
8022 */
8023 #define IoSkipCurrentIrpStackLocation(_Irp) \
8024 { \
8025 (_Irp)->CurrentLocation++; \
8026 (_Irp)->Tail.Overlay.CurrentStackLocation++; \
8027 }
8028
8029 NTKERNELAPI
8030 VOID
8031 NTAPI
8032 IoStartNextPacket(
8033 IN PDEVICE_OBJECT DeviceObject,
8034 IN BOOLEAN Cancelable);
8035
8036 NTKERNELAPI
8037 VOID
8038 NTAPI
8039 IoStartNextPacketByKey(
8040 IN PDEVICE_OBJECT DeviceObject,
8041 IN BOOLEAN Cancelable,
8042 IN ULONG Key);
8043
8044 NTKERNELAPI
8045 VOID
8046 NTAPI
8047 IoStartPacket(
8048 IN PDEVICE_OBJECT DeviceObject,
8049 IN PIRP Irp,
8050 IN PULONG Key OPTIONAL,
8051 IN PDRIVER_CANCEL CancelFunction OPTIONAL);
8052
8053 NTKERNELAPI
8054 VOID
8055 NTAPI
8056 IoStartTimer(
8057 IN PDEVICE_OBJECT DeviceObject);
8058
8059 NTKERNELAPI
8060 VOID
8061 NTAPI
8062 IoStopTimer(
8063 IN PDEVICE_OBJECT DeviceObject);
8064
8065 NTKERNELAPI
8066 NTSTATUS
8067 NTAPI
8068 IoUnregisterPlugPlayNotification(
8069 IN PVOID NotificationEntry);
8070
8071 NTKERNELAPI
8072 VOID
8073 NTAPI
8074 IoUnregisterShutdownNotification(
8075 IN PDEVICE_OBJECT DeviceObject);
8076
8077 NTKERNELAPI
8078 VOID
8079 NTAPI
8080 IoUpdateShareAccess(
8081 IN PFILE_OBJECT FileObject,
8082 IN OUT PSHARE_ACCESS ShareAccess);
8083
8084 NTKERNELAPI
8085 NTSTATUS
8086 NTAPI
8087 IoVerifyPartitionTable(
8088 IN PDEVICE_OBJECT DeviceObject,
8089 IN BOOLEAN FixErrors);
8090
8091 NTKERNELAPI
8092 NTSTATUS
8093 NTAPI
8094 IoVolumeDeviceToDosName(
8095 IN PVOID VolumeDeviceObject,
8096 OUT PUNICODE_STRING DosName);
8097
8098 NTKERNELAPI
8099 NTSTATUS
8100 NTAPI
8101 IoWMIAllocateInstanceIds(
8102 IN GUID *Guid,
8103 IN ULONG InstanceCount,
8104 OUT ULONG *FirstInstanceId);
8105
8106 NTKERNELAPI
8107 ULONG
8108 NTAPI
8109 IoWMIDeviceObjectToProviderId(
8110 IN PDEVICE_OBJECT DeviceObject);
8111
8112 NTKERNELAPI
8113 NTSTATUS
8114 NTAPI
8115 IoWMIDeviceObjectToInstanceName(
8116 IN PVOID DataBlockObject,
8117 IN PDEVICE_OBJECT DeviceObject,
8118 OUT PUNICODE_STRING InstanceName);
8119
8120 NTKERNELAPI
8121 NTSTATUS
8122 NTAPI
8123 IoWMIExecuteMethod(
8124 IN PVOID DataBlockObject,
8125 IN PUNICODE_STRING InstanceName,
8126 IN ULONG MethodId,
8127 IN ULONG InBufferSize,
8128 IN OUT PULONG OutBufferSize,
8129 IN OUT PUCHAR InOutBuffer);
8130
8131 NTKERNELAPI
8132 NTSTATUS
8133 NTAPI
8134 IoWMIHandleToInstanceName(
8135 IN PVOID DataBlockObject,
8136 IN HANDLE FileHandle,
8137 OUT PUNICODE_STRING InstanceName);
8138
8139 NTKERNELAPI
8140 NTSTATUS
8141 NTAPI
8142 IoWMIOpenBlock(
8143 IN GUID *DataBlockGuid,
8144 IN ULONG DesiredAccess,
8145 OUT PVOID *DataBlockObject);
8146
8147 NTKERNELAPI
8148 NTSTATUS
8149 NTAPI
8150 IoWMIQueryAllData(
8151 IN PVOID DataBlockObject,
8152 IN OUT ULONG *InOutBufferSize,
8153 OUT PVOID OutBuffer);
8154
8155 NTKERNELAPI
8156 NTSTATUS
8157 NTAPI
8158 IoWMIQueryAllDataMultiple(
8159 IN PVOID *DataBlockObjectList,
8160 IN ULONG ObjectCount,
8161 IN OUT ULONG *InOutBufferSize,
8162 OUT PVOID OutBuffer);
8163
8164 NTKERNELAPI
8165 NTSTATUS
8166 NTAPI
8167 IoWMIQuerySingleInstance(
8168 IN PVOID DataBlockObject,
8169 IN PUNICODE_STRING InstanceName,
8170 IN OUT ULONG *InOutBufferSize,
8171 OUT PVOID OutBuffer);
8172
8173 NTKERNELAPI
8174 NTSTATUS
8175 NTAPI
8176 IoWMIQuerySingleInstanceMultiple(
8177 IN PVOID *DataBlockObjectList,
8178 IN PUNICODE_STRING InstanceNames,
8179 IN ULONG ObjectCount,
8180 IN OUT ULONG *InOutBufferSize,
8181 OUT PVOID OutBuffer);
8182
8183 NTKERNELAPI
8184 NTSTATUS
8185 NTAPI
8186 IoWMIRegistrationControl(
8187 IN PDEVICE_OBJECT DeviceObject,
8188 IN ULONG Action);
8189
8190 NTKERNELAPI
8191 NTSTATUS
8192 NTAPI
8193 IoWMISetNotificationCallback(
8194 IN PVOID Object,
8195 IN WMI_NOTIFICATION_CALLBACK Callback,
8196 IN PVOID Context);
8197
8198 NTKERNELAPI
8199 NTSTATUS
8200 NTAPI
8201 IoWMISetSingleInstance(
8202 IN PVOID DataBlockObject,
8203 IN PUNICODE_STRING InstanceName,
8204 IN ULONG Version,
8205 IN ULONG ValueBufferSize,
8206 IN PVOID ValueBuffer);
8207
8208 NTKERNELAPI
8209 NTSTATUS
8210 NTAPI
8211 IoWMISetSingleItem(
8212 IN PVOID DataBlockObject,
8213 IN PUNICODE_STRING InstanceName,
8214 IN ULONG DataItemId,
8215 IN ULONG Version,
8216 IN ULONG ValueBufferSize,
8217 IN PVOID ValueBuffer);
8218
8219 NTKERNELAPI
8220 NTSTATUS
8221 NTAPI
8222 IoWMISuggestInstanceName(
8223 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
8224 IN PUNICODE_STRING SymbolicLinkName OPTIONAL,
8225 IN BOOLEAN CombineNames,
8226 OUT PUNICODE_STRING SuggestedInstanceName);
8227
8228 NTKERNELAPI
8229 NTSTATUS
8230 NTAPI
8231 IoWMIWriteEvent(
8232 IN PVOID WnodeEventItem);
8233
8234 NTKERNELAPI
8235 VOID
8236 NTAPI
8237 IoWriteErrorLogEntry(
8238 IN PVOID ElEntry);
8239
8240 NTKERNELAPI
8241 NTSTATUS
8242 FASTCALL
8243 IoWritePartitionTable(
8244 IN PDEVICE_OBJECT DeviceObject,
8245 IN ULONG SectorSize,
8246 IN ULONG SectorsPerTrack,
8247 IN ULONG NumberOfHeads,
8248 IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer);
8249
8250 NTKERNELAPI
8251 NTSTATUS
8252 NTAPI
8253 IoWritePartitionTableEx(
8254 IN PDEVICE_OBJECT DeviceObject,
8255 IN struct _DRIVE_LAYOUT_INFORMATION_EX *PartitionBuffer);
8256
8257
8258
8259 /** Kernel routines **/
8260
8261 #if defined (_M_AMD64)
8262 NTKERNELAPI
8263 VOID
8264 FASTCALL
8265 KeAcquireInStackQueuedSpinLock(
8266 IN PKSPIN_LOCK SpinLock,
8267 IN PKLOCK_QUEUE_HANDLE LockHandle);
8268
8269 NTKERNELAPI
8270 VOID
8271 FASTCALL
8272 KeReleaseInStackQueuedSpinLock(
8273 IN PKLOCK_QUEUE_HANDLE LockHandle);
8274 #else
8275 NTHALAPI
8276 VOID
8277 FASTCALL
8278 KeAcquireInStackQueuedSpinLock(
8279 IN PKSPIN_LOCK SpinLock,
8280 IN PKLOCK_QUEUE_HANDLE LockHandle);
8281
8282 NTHALAPI
8283 VOID
8284 FASTCALL
8285 KeReleaseInStackQueuedSpinLock(
8286 IN PKLOCK_QUEUE_HANDLE LockHandle);
8287 #endif
8288
8289 NTKERNELAPI
8290 VOID
8291 FASTCALL
8292 KeAcquireInStackQueuedSpinLockAtDpcLevel(
8293 IN PKSPIN_LOCK SpinLock,
8294 IN PKLOCK_QUEUE_HANDLE LockHandle);
8295
8296 NTKERNELAPI
8297 KIRQL
8298 NTAPI
8299 KeAcquireInterruptSpinLock(
8300 IN PKINTERRUPT Interrupt);
8301
8302 NTKERNELAPI
8303 BOOLEAN
8304 NTAPI
8305 KeAreApcsDisabled(
8306 VOID);
8307
8308 NTKERNELAPI
8309 DECLSPEC_NORETURN
8310 VOID
8311 NTAPI
8312 KeBugCheck(
8313 IN ULONG BugCheckCode);
8314
8315 NTKERNELAPI
8316 DECLSPEC_NORETURN
8317 VOID
8318 NTAPI
8319 KeBugCheckEx(
8320 IN ULONG BugCheckCode,
8321 IN ULONG_PTR BugCheckParameter1,
8322 IN ULONG_PTR BugCheckParameter2,
8323 IN ULONG_PTR BugCheckParameter3,
8324 IN ULONG_PTR BugCheckParameter4);
8325
8326 NTKERNELAPI
8327 BOOLEAN
8328 NTAPI
8329 KeCancelTimer(
8330 IN PKTIMER Timer);
8331
8332 NTKERNELAPI
8333 VOID
8334 NTAPI
8335 KeClearEvent(
8336 IN PRKEVENT Event);
8337
8338 NTKERNELAPI
8339 NTSTATUS
8340 NTAPI
8341 KeDelayExecutionThread(
8342 IN KPROCESSOR_MODE WaitMode,
8343 IN BOOLEAN Alertable,
8344 IN PLARGE_INTEGER Interval);
8345
8346 NTKERNELAPI
8347 BOOLEAN
8348 NTAPI
8349 KeDeregisterBugCheckCallback(
8350 IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord);
8351
8352 NTKERNELAPI
8353 VOID
8354 NTAPI
8355 KeEnterCriticalRegion(
8356 VOID);
8357
8358 /*
8359 * VOID
8360 * KeFlushIoBuffers(
8361 * IN PMDL Mdl,
8362 * IN BOOLEAN ReadOperation,
8363 * IN BOOLEAN DmaOperation)
8364 */
8365 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
8366
8367 #define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql))
8368 #define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql))
8369 #define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock)
8370 #define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock)
8371
8372 NTKERNELAPI
8373 VOID
8374 NTAPI
8375 KeFlushQueuedDpcs(
8376 VOID
8377 );
8378
8379 NTHALAPI
8380 VOID
8381 NTAPI
8382 KeFlushWriteBuffer(VOID);
8383
8384 NTKERNELAPI
8385 ULONG
8386 NTAPI
8387 KeGetRecommendedSharedDataAlignment(
8388 VOID);
8389
8390 NTKERNELAPI
8391 VOID
8392 NTAPI
8393 KeInitializeDeviceQueue(
8394 IN PKDEVICE_QUEUE DeviceQueue);
8395
8396 NTKERNELAPI
8397 VOID
8398 NTAPI
8399 KeInitializeMutex(
8400 IN PRKMUTEX Mutex,
8401 IN ULONG Level);
8402
8403 NTKERNELAPI
8404 VOID
8405 NTAPI
8406 KeInitializeSemaphore(
8407 IN PRKSEMAPHORE Semaphore,
8408 IN LONG Count,
8409 IN LONG Limit);
8410
8411 NTKERNELAPI
8412 VOID
8413 NTAPI
8414 KeInitializeTimer(
8415 IN PKTIMER Timer);
8416
8417 NTKERNELAPI
8418 VOID
8419 NTAPI
8420 KeInitializeTimerEx(
8421 IN PKTIMER Timer,
8422 IN TIMER_TYPE Type);
8423
8424 NTKERNELAPI
8425 BOOLEAN
8426 NTAPI
8427 KeInsertByKeyDeviceQueue(
8428 IN PKDEVICE_QUEUE DeviceQueue,
8429 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry,
8430 IN ULONG SortKey);
8431
8432 NTKERNELAPI
8433 BOOLEAN
8434 NTAPI
8435 KeInsertDeviceQueue(
8436 IN PKDEVICE_QUEUE DeviceQueue,
8437 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
8438
8439 NTKERNELAPI
8440 BOOLEAN
8441 NTAPI
8442 KeInsertQueueDpc(
8443 IN PRKDPC Dpc,
8444 IN PVOID SystemArgument1,
8445 IN PVOID SystemArgument2);
8446
8447 NTKERNELAPI
8448 VOID
8449 NTAPI
8450 KeLeaveCriticalRegion(
8451 VOID);
8452
8453 #ifdef _X86_
8454
8455 static __inline
8456 VOID
8457 KeMemoryBarrier(
8458 VOID)
8459 {
8460 volatile LONG Barrier;
8461 #if defined(__GNUC__)
8462 __asm__ __volatile__ ("xchg %%eax, %0" : : "m" (Barrier) : "%eax");
8463 #elif defined(_MSC_VER)
8464 __asm xchg [Barrier], eax
8465 #endif
8466 }
8467
8468 #endif
8469
8470 NTKERNELAPI
8471 LONG
8472 NTAPI
8473 KePulseEvent(
8474 IN PRKEVENT Event,
8475 IN KPRIORITY Increment,
8476 IN BOOLEAN Wait);
8477
8478 NTKERNELAPI
8479 KAFFINITY
8480 NTAPI
8481 KeQueryActiveProcessors(
8482 VOID
8483 );
8484
8485 NTHALAPI
8486 LARGE_INTEGER
8487 NTAPI
8488 KeQueryPerformanceCounter(
8489 OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL);
8490
8491 NTKERNELAPI
8492 KPRIORITY
8493 NTAPI
8494 KeQueryPriorityThread(
8495 IN PRKTHREAD Thread);
8496
8497 NTKERNELAPI
8498 ULONG
8499 NTAPI
8500 KeQueryRuntimeThread(
8501 IN PKTHREAD Thread,
8502 OUT PULONG UserTime);
8503
8504 #if !defined(_M_AMD64)
8505 NTKERNELAPI
8506 ULONGLONG
8507 NTAPI
8508 KeQueryInterruptTime(
8509 VOID);
8510
8511 NTKERNELAPI
8512 VOID
8513 NTAPI
8514 KeQuerySystemTime(
8515 OUT PLARGE_INTEGER CurrentTime);
8516
8517 NTKERNELAPI
8518 VOID
8519 NTAPI
8520 KeQueryTickCount(
8521 OUT PLARGE_INTEGER TickCount);
8522 #endif
8523
8524 NTKERNELAPI
8525 ULONG
8526 NTAPI
8527 KeQueryTimeIncrement(
8528 VOID);
8529
8530 NTKERNELAPI
8531 LONG
8532 NTAPI
8533 KeReadStateEvent(
8534 IN PRKEVENT Event);
8535
8536 NTKERNELAPI
8537 LONG
8538 NTAPI
8539 KeReadStateMutex(
8540 IN PRKMUTEX Mutex);
8541
8542
8543 NTKERNELAPI
8544 LONG
8545 NTAPI
8546 KeReadStateSemaphore(
8547 IN PRKSEMAPHORE Semaphore);
8548
8549 NTKERNELAPI
8550 BOOLEAN
8551 NTAPI
8552 KeReadStateTimer(
8553 IN PKTIMER Timer);
8554
8555 NTKERNELAPI
8556 BOOLEAN
8557 NTAPI
8558 KeRegisterBugCheckCallback(
8559 IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord,
8560 IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine,
8561 IN PVOID Buffer,
8562 IN ULONG Length,
8563 IN PUCHAR Component);
8564
8565 NTKERNELAPI
8566 PVOID
8567 NTAPI
8568 KeRegisterNmiCallback(
8569 IN PNMI_CALLBACK CallbackRoutine,
8570 IN PVOID Context
8571 );
8572
8573 NTKERNELAPI
8574 NTSTATUS
8575 NTAPI
8576 KeDeregisterNmiCallback(
8577 IN PVOID Handle
8578 );
8579
8580 NTKERNELAPI
8581 VOID
8582 FASTCALL
8583 KeReleaseInStackQueuedSpinLockFromDpcLevel(
8584 IN PKLOCK_QUEUE_HANDLE LockHandle);
8585
8586 NTKERNELAPI
8587 VOID
8588 NTAPI
8589 KeReleaseInterruptSpinLock(
8590 IN PKINTERRUPT Interrupt,
8591 IN KIRQL OldIrql);
8592
8593 NTKERNELAPI
8594 LONG
8595 NTAPI
8596 KeReleaseMutex(
8597 IN PRKMUTEX Mutex,
8598 IN BOOLEAN Wait);
8599
8600 NTKERNELAPI
8601 LONG
8602 NTAPI
8603 KeReleaseSemaphore(
8604 IN PRKSEMAPHORE Semaphore,
8605 IN KPRIORITY Increment,
8606 IN LONG Adjustment,
8607 IN BOOLEAN Wait);
8608
8609 NTKERNELAPI
8610 PKDEVICE_QUEUE_ENTRY
8611 NTAPI
8612 KeRemoveByKeyDeviceQueue(
8613 IN PKDEVICE_QUEUE DeviceQueue,
8614 IN ULONG SortKey);
8615
8616 NTKERNELAPI
8617 PKDEVICE_QUEUE_ENTRY
8618 NTAPI
8619 KeRemoveDeviceQueue(
8620 IN PKDEVICE_QUEUE DeviceQueue);
8621
8622 NTKERNELAPI
8623 BOOLEAN
8624 NTAPI
8625 KeRemoveEntryDeviceQueue(
8626 IN PKDEVICE_QUEUE DeviceQueue,
8627 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
8628
8629 NTKERNELAPI
8630 BOOLEAN
8631 NTAPI
8632 KeRemoveQueueDpc(
8633 IN PRKDPC Dpc);
8634
8635 NTKERNELAPI
8636 LONG
8637 NTAPI
8638 KeResetEvent(
8639 IN PRKEVENT Event);
8640
8641 NTKERNELAPI
8642 NTSTATUS
8643 NTAPI
8644 KeRestoreFloatingPointState(
8645 IN PKFLOATING_SAVE FloatSave);
8646
8647 NTKERNELAPI
8648 VOID
8649 NTAPI
8650 KeRevertToUserAffinityThread(VOID);
8651
8652 NTKERNELAPI
8653 NTSTATUS
8654 NTAPI
8655 KeSaveFloatingPointState(
8656 OUT PKFLOATING_SAVE FloatSave);
8657
8658 NTKERNELAPI
8659 LONG
8660 NTAPI
8661 KeSetBasePriorityThread(
8662 IN PRKTHREAD Thread,
8663 IN LONG Increment);
8664
8665 NTKERNELAPI
8666 LONG
8667 NTAPI
8668 KeSetEvent(
8669 IN PRKEVENT Event,
8670 IN KPRIORITY Increment,
8671 IN BOOLEAN Wait);
8672
8673 NTKERNELAPI
8674 VOID
8675 NTAPI
8676 KeSetImportanceDpc(
8677 IN PRKDPC Dpc,
8678 IN KDPC_IMPORTANCE Importance);
8679
8680 NTKERNELAPI
8681 KPRIORITY
8682 NTAPI
8683 KeSetPriorityThread(
8684 IN PKTHREAD Thread,
8685 IN KPRIORITY Priority);
8686
8687 NTKERNELAPI
8688 VOID
8689 NTAPI
8690 KeSetSystemAffinityThread(
8691 IN KAFFINITY Affinity);
8692
8693 NTKERNELAPI
8694 VOID
8695 NTAPI
8696 KeSetTargetProcessorDpc(
8697 IN PRKDPC Dpc,
8698 IN CCHAR Number);
8699
8700 NTKERNELAPI
8701 BOOLEAN
8702 NTAPI
8703 KeSetTimer(
8704 IN PKTIMER Timer,
8705 IN LARGE_INTEGER DueTime,
8706 IN PKDPC Dpc OPTIONAL);
8707
8708 NTKERNELAPI
8709 BOOLEAN
8710 NTAPI
8711 KeSetTimerEx(
8712 IN PKTIMER Timer,
8713 IN LARGE_INTEGER DueTime,
8714 IN LONG Period OPTIONAL,
8715 IN PKDPC Dpc OPTIONAL);
8716
8717 NTKERNELAPI
8718 VOID
8719 FASTCALL
8720 KeSetTimeUpdateNotifyRoutine(
8721 IN PTIME_UPDATE_NOTIFY_ROUTINE NotifyRoutine);
8722
8723 NTHALAPI
8724 VOID
8725 NTAPI
8726 KeStallExecutionProcessor(
8727 IN ULONG MicroSeconds);
8728
8729 NTKERNELAPI
8730 BOOLEAN
8731 NTAPI
8732 KeSynchronizeExecution(
8733 IN PKINTERRUPT Interrupt,
8734 IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine,
8735 IN PVOID SynchronizeContext);
8736
8737 NTKERNELAPI
8738 NTSTATUS
8739 NTAPI
8740 KeWaitForMultipleObjects(
8741 IN ULONG Count,
8742 IN PVOID Object[],
8743 IN WAIT_TYPE WaitType,
8744 IN KWAIT_REASON WaitReason,
8745 IN KPROCESSOR_MODE WaitMode,
8746 IN BOOLEAN Alertable,
8747 IN PLARGE_INTEGER Timeout OPTIONAL,
8748 IN PKWAIT_BLOCK WaitBlockArray OPTIONAL);
8749
8750 NTKERNELAPI
8751 NTSTATUS
8752 NTAPI
8753 KeWaitForMutexObject(
8754 IN PRKMUTEX Mutex,
8755 IN KWAIT_REASON WaitReason,
8756 IN KPROCESSOR_MODE WaitMode,
8757 IN BOOLEAN Alertable,
8758 IN PLARGE_INTEGER Timeout OPTIONAL);
8759
8760 NTKERNELAPI
8761 NTSTATUS
8762 NTAPI
8763 KeWaitForSingleObject(
8764 IN PVOID Object,
8765 IN KWAIT_REASON WaitReason,
8766 IN KPROCESSOR_MODE WaitMode,
8767 IN BOOLEAN Alertable,
8768 IN PLARGE_INTEGER Timeout OPTIONAL);
8769
8770 typedef
8771 ULONG_PTR
8772 (NTAPI *PKIPI_BROADCAST_WORKER)(
8773 IN ULONG_PTR Argument
8774 );
8775
8776 NTKERNELAPI
8777 ULONG_PTR
8778 NTAPI
8779 KeIpiGenericCall(
8780 IN PKIPI_BROADCAST_WORKER BroadcastFunction,
8781 IN ULONG_PTR Context
8782 );
8783
8784 #if defined(_X86_)
8785
8786 NTHALAPI
8787 VOID
8788 FASTCALL
8789 KfLowerIrql(
8790 IN KIRQL NewIrql);
8791
8792 NTHALAPI
8793 KIRQL
8794 FASTCALL
8795 KfRaiseIrql(
8796 IN KIRQL NewIrql);
8797
8798 NTHALAPI
8799 KIRQL
8800 DDKAPI
8801 KeRaiseIrqlToDpcLevel(
8802 VOID);
8803
8804 NTHALAPI
8805 KIRQL
8806 DDKAPI
8807 KeRaiseIrqlToSynchLevel(
8808 VOID);
8809
8810 #define KeLowerIrql(a) KfLowerIrql(a)
8811 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
8812
8813 #elif defined(_M_AMD64)
8814
8815 FORCEINLINE
8816 KIRQL
8817 KeGetCurrentIrql(VOID)
8818 {
8819 return (KIRQL)__readcr8();
8820 }
8821
8822 FORCEINLINE
8823 VOID
8824 KeLowerIrql(IN KIRQL NewIrql)
8825 {
8826 ASSERT(KeGetCurrentIrql() >= NewIrql);
8827 __writecr8(NewIrql);
8828 }
8829
8830 FORCEINLINE
8831 KIRQL
8832 KfRaiseIrql(IN KIRQL NewIrql)
8833 {
8834 KIRQL OldIrql;
8835
8836 OldIrql = __readcr8();
8837 ASSERT(OldIrql <= NewIrql);
8838 __writecr8(NewIrql);
8839 return OldIrql;
8840 }
8841 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
8842
8843 FORCEINLINE
8844 KIRQL
8845 KeRaiseIrqlToDpcLevel(VOID)
8846 {
8847 return KfRaiseIrql(DISPATCH_LEVEL);
8848 }
8849
8850 FORCEINLINE
8851 KIRQL
8852 KeRaiseIrqlToSynchLevel(VOID)
8853 {
8854 return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2
8855 }
8856
8857 #elif defined(__PowerPC__)
8858
8859 NTHALAPI
8860 VOID
8861 FASTCALL
8862 KfLowerIrql(
8863 IN KIRQL NewIrql);
8864
8865 NTHALAPI
8866 KIRQL
8867 FASTCALL
8868 KfRaiseIrql(
8869 IN KIRQL NewIrql);
8870
8871 NTHALAPI
8872 KIRQL
8873 DDKAPI
8874 KeRaiseIrqlToDpcLevel(
8875 VOID);
8876
8877 NTHALAPI
8878 KIRQL
8879 DDKAPI
8880 KeRaiseIrqlToSynchLevel(
8881 VOID);
8882
8883 #define KeLowerIrql(a) KfLowerIrql(a)
8884 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
8885
8886 #elif defined(_M_MIPS)
8887
8888 #define KeLowerIrql(a) KfLowerIrql(a)
8889 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
8890
8891 NTKERNELAPI
8892 VOID
8893 NTAPI
8894 KfLowerIrql(
8895 IN KIRQL NewIrql);
8896
8897 NTKERNELAPI
8898 KIRQL
8899 NTAPI
8900 KfRaiseIrql(
8901 IN KIRQL NewIrql);
8902
8903 NTKERNELAPI
8904 KIRQL
8905 NTAPI
8906 KeRaiseIrqlToDpcLevel(
8907 VOID);
8908
8909 NTKERNELAPI
8910 KIRQL
8911 DDKAPI
8912 KeRaiseIrqlToSynchLevel(
8913 VOID);
8914
8915 #elif defined(_M_ARM)
8916
8917 #include <armddk.h>
8918
8919 #else
8920
8921 NTKERNELAPI
8922 VOID
8923 NTAPI
8924 KeLowerIrql(
8925 IN KIRQL NewIrql);
8926
8927 NTKERNELAPI
8928 VOID
8929 NTAPI
8930 KeRaiseIrql(
8931 IN KIRQL NewIrql,
8932 OUT PKIRQL OldIrql);
8933
8934 NTKERNELAPI
8935 KIRQL
8936 NTAPI
8937 KeRaiseIrqlToDpcLevel(
8938 VOID);
8939
8940 NTKERNELAPI
8941 KIRQL
8942 DDKAPI
8943 KeRaiseIrqlToSynchLevel(
8944 VOID);
8945
8946 #endif
8947
8948 /** Memory manager routines **/
8949
8950 NTKERNELAPI
8951 NTSTATUS
8952 NTAPI
8953 MmAdvanceMdl(
8954 IN PMDL Mdl,
8955 IN ULONG NumberOfBytes);
8956
8957 NTKERNELAPI
8958 PVOID
8959 NTAPI
8960 MmAllocateContiguousMemory(
8961 IN ULONG NumberOfBytes,
8962 IN PHYSICAL_ADDRESS HighestAcceptableAddress);
8963
8964 NTKERNELAPI
8965 PVOID
8966 NTAPI
8967 MmAllocateContiguousMemorySpecifyCache(
8968 IN SIZE_T NumberOfBytes,
8969 IN PHYSICAL_ADDRESS LowestAcceptableAddress,
8970 IN PHYSICAL_ADDRESS HighestAcceptableAddress,
8971 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
8972 IN MEMORY_CACHING_TYPE CacheType);
8973
8974 NTKERNELAPI
8975 PVOID
8976 NTAPI
8977 MmAllocateMappingAddress(
8978 IN SIZE_T NumberOfBytes,
8979 IN ULONG PoolTag);
8980
8981 NTKERNELAPI
8982 PVOID
8983 NTAPI
8984 MmAllocateNonCachedMemory(
8985 IN ULONG NumberOfBytes);
8986
8987 NTKERNELAPI
8988 PMDL
8989 NTAPI
8990 MmAllocatePagesForMdl(
8991 IN PHYSICAL_ADDRESS LowAddress,
8992 IN PHYSICAL_ADDRESS HighAddress,
8993 IN PHYSICAL_ADDRESS SkipBytes,
8994 IN SIZE_T TotalBytes);
8995
8996 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
8997 NTKERNELAPI
8998 PMDL
8999 NTAPI
9000 MmAllocatePagesForMdlEx(
9001 IN PHYSICAL_ADDRESS LowAddress,
9002 IN PHYSICAL_ADDRESS HighAddress,
9003 IN PHYSICAL_ADDRESS SkipBytes,
9004 IN SIZE_T TotalBytes,
9005 IN MEMORY_CACHING_TYPE CacheType,
9006 IN ULONG Flags);
9007 #endif
9008
9009 NTKERNELAPI
9010 VOID
9011 NTAPI
9012 MmBuildMdlForNonPagedPool(
9013 IN OUT PMDL MemoryDescriptorList);
9014
9015 typedef enum _MMFLUSH_TYPE {
9016 MmFlushForDelete,
9017 MmFlushForWrite
9018 } MMFLUSH_TYPE;
9019
9020 NTKERNELAPI
9021 BOOLEAN
9022 NTAPI
9023 MmFlushImageSection(
9024 IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
9025 IN MMFLUSH_TYPE FlushType);
9026
9027 NTKERNELAPI
9028 VOID
9029 NTAPI
9030 MmFreeContiguousMemory(
9031 IN PVOID BaseAddress);
9032
9033 NTKERNELAPI
9034 VOID
9035 NTAPI
9036 MmFreeContiguousMemorySpecifyCache(
9037 IN PVOID BaseAddress,
9038 IN SIZE_T NumberOfBytes,
9039 IN MEMORY_CACHING_TYPE CacheType);
9040
9041 NTKERNELAPI
9042 VOID
9043 NTAPI
9044 MmFreeMappingAddress(
9045 IN PVOID BaseAddress,
9046 IN ULONG PoolTag);
9047
9048 NTKERNELAPI
9049 VOID
9050 NTAPI
9051 MmFreeNonCachedMemory(
9052 IN PVOID BaseAddress,
9053 IN SIZE_T NumberOfBytes);
9054
9055 NTKERNELAPI
9056 VOID
9057 NTAPI
9058 MmFreePagesFromMdl(
9059 IN PMDL MemoryDescriptorList);
9060
9061 /*
9062 * ULONG
9063 * MmGetMdlByteCount(
9064 * IN PMDL Mdl)
9065 */
9066 #define MmGetMdlByteCount(_Mdl) \
9067 ((_Mdl)->ByteCount)
9068
9069 /*
9070 * ULONG
9071 * MmGetMdlByteOffset(
9072 * IN PMDL Mdl)
9073 */
9074 #define MmGetMdlByteOffset(_Mdl) \
9075 ((_Mdl)->ByteOffset)
9076
9077 /*
9078 * PPFN_NUMBER
9079 * MmGetMdlPfnArray(
9080 * IN PMDL Mdl)
9081 */
9082 #define MmGetMdlPfnArray(_Mdl) \
9083 ((PPFN_NUMBER) ((_Mdl) + 1))
9084
9085 /*
9086 * PVOID
9087 * MmGetMdlVirtualAddress(
9088 * IN PMDL Mdl)
9089 */
9090 #define MmGetMdlVirtualAddress(_Mdl) \
9091 ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
9092
9093 NTKERNELAPI
9094 PHYSICAL_ADDRESS
9095 NTAPI
9096 MmGetPhysicalAddress(
9097 IN PVOID BaseAddress);
9098
9099 NTKERNELAPI
9100 PPHYSICAL_MEMORY_RANGE
9101 NTAPI
9102 MmGetPhysicalMemoryRanges(
9103 VOID);
9104
9105 NTKERNELAPI
9106 PVOID
9107 NTAPI
9108 MmGetVirtualForPhysical(
9109 IN PHYSICAL_ADDRESS PhysicalAddress);
9110
9111 NTKERNELAPI
9112 PVOID
9113 NTAPI
9114 MmMapLockedPagesSpecifyCache(
9115 IN PMDL MemoryDescriptorList,
9116 IN KPROCESSOR_MODE AccessMode,
9117 IN MEMORY_CACHING_TYPE CacheType,
9118 IN PVOID BaseAddress,
9119 IN ULONG BugCheckOnFailure,
9120 IN MM_PAGE_PRIORITY Priority);
9121
9122 NTKERNELAPI
9123 PVOID
9124 NTAPI
9125 MmMapLockedPagesWithReservedMapping(
9126 IN PVOID MappingAddress,
9127 IN ULONG PoolTag,
9128 IN PMDL MemoryDescriptorList,
9129 IN MEMORY_CACHING_TYPE CacheType);
9130
9131 NTKERNELAPI
9132 NTSTATUS
9133 NTAPI
9134 MmMapUserAddressesToPage(
9135 IN PVOID BaseAddress,
9136 IN SIZE_T NumberOfBytes,
9137 IN PVOID PageAddress);
9138
9139 NTKERNELAPI
9140 PVOID
9141 NTAPI
9142 MmMapVideoDisplay(
9143 IN PHYSICAL_ADDRESS PhysicalAddress,
9144 IN SIZE_T NumberOfBytes,
9145 IN MEMORY_CACHING_TYPE CacheType);
9146
9147 NTKERNELAPI
9148 NTSTATUS
9149 NTAPI
9150 MmMapViewInSessionSpace(
9151 IN PVOID Section,
9152 OUT PVOID *MappedBase,
9153 IN OUT PSIZE_T ViewSize);
9154
9155 NTKERNELAPI
9156 NTSTATUS
9157 NTAPI
9158 MmMapViewInSystemSpace(
9159 IN PVOID Section,
9160 OUT PVOID *MappedBase,
9161 IN PSIZE_T ViewSize);
9162
9163 NTKERNELAPI
9164 NTSTATUS
9165 NTAPI
9166 MmMarkPhysicalMemoryAsBad(
9167 IN PPHYSICAL_ADDRESS StartAddress,
9168 IN OUT PLARGE_INTEGER NumberOfBytes);
9169
9170 NTKERNELAPI
9171 NTSTATUS
9172 NTAPI
9173 MmMarkPhysicalMemoryAsGood(
9174 IN PPHYSICAL_ADDRESS StartAddress,
9175 IN OUT PLARGE_INTEGER NumberOfBytes);
9176
9177 NTKERNELAPI
9178 PVOID
9179 NTAPI
9180 MmGetSystemRoutineAddress(
9181 IN PUNICODE_STRING SystemRoutineName);
9182
9183 /*
9184 * ULONG
9185 * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
9186 * IN PVOID Va,
9187 * IN ULONG Size)
9188 */
9189 #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, \
9190 _Size) \
9191 ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
9192 + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
9193
9194 /*
9195 * VOID
9196 * MmInitializeMdl(
9197 * IN PMDL MemoryDescriptorList,
9198 * IN PVOID BaseVa,
9199 * IN SIZE_T Length)
9200 */
9201 #define MmInitializeMdl(_MemoryDescriptorList, \
9202 _BaseVa, \
9203 _Length) \
9204 { \
9205 (_MemoryDescriptorList)->Next = (PMDL) NULL; \
9206 (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
9207 (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
9208 (_MemoryDescriptorList)->MdlFlags = 0; \
9209 (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
9210 (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
9211 (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
9212 }
9213
9214 NTKERNELAPI
9215 BOOLEAN
9216 NTAPI
9217 MmIsAddressValid(
9218 IN PVOID VirtualAddress);
9219
9220 NTKERNELAPI
9221 LOGICAL
9222 NTAPI
9223 MmIsDriverVerifying(
9224 IN PDRIVER_OBJECT DriverObject);
9225
9226 NTKERNELAPI
9227 BOOLEAN
9228 NTAPI
9229 MmIsThisAnNtAsSystem(
9230 VOID);
9231
9232 NTKERNELAPI
9233 NTSTATUS
9234 NTAPI
9235 MmIsVerifierEnabled(
9236 OUT PULONG VerifierFlags);
9237
9238 NTKERNELAPI
9239 PVOID
9240 NTAPI
9241 MmLockPagableDataSection(
9242 IN PVOID AddressWithinSection);
9243
9244 NTKERNELAPI
9245 PVOID
9246 NTAPI
9247 MmLockPagableImageSection(
9248 IN PVOID AddressWithinSection);
9249
9250 /*
9251 * PVOID
9252 * MmLockPagableCodeSection(
9253 * IN PVOID AddressWithinSection)
9254 */
9255 #define MmLockPagableCodeSection(Address) MmLockPagableDataSection(Address)
9256
9257 NTKERNELAPI
9258 VOID
9259 NTAPI
9260 MmLockPagableSectionByHandle(
9261 IN PVOID ImageSectionHandle);
9262
9263 NTKERNELAPI
9264 PVOID
9265 NTAPI
9266 MmMapIoSpace(
9267 IN PHYSICAL_ADDRESS PhysicalAddress,
9268 IN ULONG NumberOfBytes,
9269 IN MEMORY_CACHING_TYPE CacheEnable);
9270
9271 NTKERNELAPI
9272 PVOID
9273 NTAPI
9274 MmMapLockedPages(
9275 IN PMDL MemoryDescriptorList,
9276 IN KPROCESSOR_MODE AccessMode);
9277
9278 NTKERNELAPI
9279 PVOID
9280 NTAPI
9281 MmLockPageableDataSection (
9282 IN PVOID AddressWithinSection
9283 );
9284
9285 NTKERNELAPI
9286 VOID
9287 NTAPI
9288 MmUnlockPageableImageSection(
9289 IN PVOID ImageSectionHandle
9290 );
9291
9292 NTKERNELAPI
9293 PVOID
9294 NTAPI
9295 MmPageEntireDriver(
9296 IN PVOID AddressWithinSection);
9297
9298 NTKERNELAPI
9299 VOID
9300 NTAPI
9301 MmProbeAndLockProcessPages(
9302 IN OUT PMDL MemoryDescriptorList,
9303 IN PEPROCESS Process,
9304 IN KPROCESSOR_MODE AccessMode,
9305 IN LOCK_OPERATION Operation);
9306
9307 NTKERNELAPI
9308 NTSTATUS
9309 NTAPI
9310 MmProtectMdlSystemAddress(
9311 IN PMDL MemoryDescriptorList,
9312 IN ULONG NewProtect);
9313
9314 NTKERNELAPI
9315 VOID
9316 NTAPI
9317 MmUnmapLockedPages(
9318 IN PVOID BaseAddress,
9319 IN PMDL MemoryDescriptorList);
9320
9321 NTKERNELAPI
9322 NTSTATUS
9323 NTAPI
9324 MmUnmapViewInSessionSpace(
9325 IN PVOID MappedBase);
9326
9327 NTKERNELAPI
9328 NTSTATUS
9329 NTAPI
9330 MmUnmapViewInSystemSpace(
9331 IN PVOID MappedBase);
9332
9333 NTKERNELAPI
9334 VOID
9335 NTAPI
9336 MmUnsecureVirtualMemory(
9337 IN HANDLE SecureHandle);
9338
9339 /*
9340 * VOID
9341 * MmPrepareMdlForReuse(
9342 * IN PMDL Mdl)
9343 */
9344 #define MmPrepareMdlForReuse(_Mdl) \
9345 { \
9346 if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
9347 ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
9348 MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
9349 } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
9350 ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
9351 } \
9352 }
9353
9354 #define MmGetProcedureAddress(Address) (Address)
9355
9356 NTKERNELAPI
9357 VOID
9358 NTAPI
9359 MmProbeAndLockPages(
9360 IN OUT PMDL MemoryDescriptorList,
9361 IN KPROCESSOR_MODE AccessMode,
9362 IN LOCK_OPERATION Operation);
9363
9364 NTKERNELAPI
9365 MM_SYSTEMSIZE
9366 NTAPI
9367 MmQuerySystemSize(
9368 VOID);
9369
9370 NTKERNELAPI
9371 NTSTATUS
9372 NTAPI
9373 MmRemovePhysicalMemory(
9374 IN PPHYSICAL_ADDRESS StartAddress,
9375 IN OUT PLARGE_INTEGER NumberOfBytes);
9376
9377 NTKERNELAPI
9378 VOID
9379 NTAPI
9380 MmResetDriverPaging(
9381 IN PVOID AddressWithinSection);
9382
9383 NTKERNELAPI
9384 HANDLE
9385 NTAPI
9386 MmSecureVirtualMemory(
9387 IN PVOID Address,
9388 IN SIZE_T Size,
9389 IN ULONG ProbeMode);
9390
9391 NTKERNELAPI
9392 SIZE_T
9393 NTAPI
9394 MmSizeOfMdl(
9395 IN PVOID Base,
9396 IN SIZE_T Length);
9397
9398 NTKERNELAPI
9399 VOID
9400 NTAPI
9401 MmUnlockPagableImageSection(
9402 IN PVOID ImageSectionHandle);
9403
9404 NTKERNELAPI
9405 VOID
9406 NTAPI
9407 MmUnlockPages(
9408 IN PMDL MemoryDescriptorList);
9409
9410 NTKERNELAPI
9411 VOID
9412 NTAPI
9413 MmUnmapIoSpace(
9414 IN PVOID BaseAddress,
9415 IN SIZE_T NumberOfBytes);
9416
9417 NTKERNELAPI
9418 VOID
9419 NTAPI
9420 MmUnmapReservedMapping(
9421 IN PVOID BaseAddress,
9422 IN ULONG PoolTag,
9423 IN PMDL MemoryDescriptorList);
9424
9425 NTKERNELAPI
9426 VOID
9427 NTAPI
9428 MmUnmapVideoDisplay(
9429 IN PVOID BaseAddress,
9430 IN SIZE_T NumberOfBytes);
9431
9432
9433
9434 /** Object manager routines **/
9435
9436 NTKERNELAPI
9437 NTSTATUS
9438 NTAPI
9439 ObAssignSecurity(
9440 IN PACCESS_STATE AccessState,
9441 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
9442 IN PVOID Object,
9443 IN POBJECT_TYPE Type);
9444
9445 NTKERNELAPI
9446 VOID
9447 NTAPI
9448 ObDereferenceSecurityDescriptor(
9449 PSECURITY_DESCRIPTOR SecurityDescriptor,
9450 ULONG Count);
9451
9452 NTKERNELAPI
9453 LONG_PTR
9454 FASTCALL
9455 ObfDereferenceObject(
9456 IN PVOID Object);
9457
9458 /*
9459 * VOID
9460 * ObDereferenceObject(
9461 * IN PVOID Object)
9462 */
9463 #define ObDereferenceObject ObfDereferenceObject
9464
9465 NTKERNELAPI
9466 NTSTATUS
9467 NTAPI
9468 ObGetObjectSecurity(
9469 IN PVOID Object,
9470 OUT PSECURITY_DESCRIPTOR *SecurityDescriptor,
9471 OUT PBOOLEAN MemoryAllocated);
9472
9473 NTKERNELAPI
9474 NTSTATUS
9475 NTAPI
9476 ObInsertObject(
9477 IN PVOID Object,
9478 IN PACCESS_STATE PassedAccessState OPTIONAL,
9479 IN ACCESS_MASK DesiredAccess,
9480 IN ULONG AdditionalReferences,
9481 OUT PVOID* ReferencedObject OPTIONAL,
9482 OUT PHANDLE Handle);
9483
9484 NTKERNELAPI
9485 LONG_PTR
9486 FASTCALL
9487 ObfReferenceObject(
9488 IN PVOID Object);
9489
9490 NTKERNELAPI
9491 NTSTATUS
9492 NTAPI
9493 ObLogSecurityDescriptor(
9494 IN PSECURITY_DESCRIPTOR InputSecurityDescriptor,
9495 OUT PSECURITY_DESCRIPTOR *OutputSecurityDescriptor,
9496 IN ULONG RefBias);
9497 /*
9498 * VOID
9499 * ObReferenceObject(
9500 * IN PVOID Object)
9501 */
9502 #define ObReferenceObject ObfReferenceObject
9503
9504 NTKERNELAPI
9505 VOID
9506 NTAPI
9507 ObMakeTemporaryObject(
9508 IN PVOID Object);
9509
9510 NTKERNELAPI
9511 NTSTATUS
9512 NTAPI
9513 ObOpenObjectByName(
9514 IN POBJECT_ATTRIBUTES ObjectAttributes,
9515 IN POBJECT_TYPE ObjectType,
9516 IN KPROCESSOR_MODE AccessMode,
9517 IN PACCESS_STATE PassedAccessState,
9518 IN ACCESS_MASK DesiredAccess,
9519 IN OUT PVOID ParseContext OPTIONAL,
9520 OUT PHANDLE Handle);
9521
9522 NTKERNELAPI
9523 NTSTATUS
9524 NTAPI
9525 ObOpenObjectByPointer(
9526 IN PVOID Object,
9527 IN ULONG HandleAttributes,
9528 IN PACCESS_STATE PassedAccessState OPTIONAL,
9529 IN ACCESS_MASK DesiredAccess OPTIONAL,
9530 IN POBJECT_TYPE ObjectType OPTIONAL,
9531 IN KPROCESSOR_MODE AccessMode,
9532 OUT PHANDLE Handle);
9533
9534 NTKERNELAPI
9535 NTSTATUS
9536 NTAPI
9537 ObQueryObjectAuditingByHandle(
9538 IN HANDLE Handle,
9539 OUT PBOOLEAN GenerateOnClose);
9540
9541 NTKERNELAPI
9542 NTSTATUS
9543 NTAPI
9544 ObReferenceObjectByHandle(
9545 IN HANDLE Handle,
9546 IN ACCESS_MASK DesiredAccess,
9547 IN POBJECT_TYPE ObjectType OPTIONAL,
9548 IN KPROCESSOR_MODE AccessMode,
9549 OUT PVOID *Object,
9550 OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL);
9551
9552 NTKERNELAPI
9553 NTSTATUS
9554 NTAPI
9555 ObReferenceObjectByName(
9556 IN PUNICODE_STRING ObjectPath,
9557 IN ULONG Attributes,
9558 IN PACCESS_STATE PassedAccessState OPTIONAL,
9559 IN ACCESS_MASK DesiredAccess OPTIONAL,
9560 IN POBJECT_TYPE ObjectType,
9561 IN KPROCESSOR_MODE AccessMode,
9562 IN OUT PVOID ParseContext OPTIONAL,
9563 OUT PVOID *Object);
9564
9565 NTKERNELAPI
9566 NTSTATUS
9567 NTAPI
9568 ObReferenceObjectByPointer(
9569 IN PVOID Object,
9570 IN ACCESS_MASK DesiredAccess,
9571 IN POBJECT_TYPE ObjectType,
9572 IN KPROCESSOR_MODE AccessMode);
9573
9574 NTKERNELAPI
9575 VOID
9576 NTAPI
9577 ObReferenceSecurityDescriptor(
9578 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
9579 IN ULONG Count);
9580
9581 NTKERNELAPI
9582 VOID
9583 NTAPI
9584 ObReleaseObjectSecurity(
9585 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
9586 IN BOOLEAN MemoryAllocated);
9587
9588
9589
9590 /** Process manager routines **/
9591
9592 NTKERNELAPI
9593 NTSTATUS
9594 NTAPI
9595 PsCreateSystemProcess(
9596 IN PHANDLE ProcessHandle,
9597 IN ACCESS_MASK DesiredAccess,
9598 IN POBJECT_ATTRIBUTES ObjectAttributes);
9599
9600 NTKERNELAPI
9601 NTSTATUS
9602 NTAPI
9603 PsCreateSystemThread(
9604 OUT PHANDLE ThreadHandle,
9605 IN ULONG DesiredAccess,
9606 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
9607 IN HANDLE ProcessHandle OPTIONAL,
9608 OUT PCLIENT_ID ClientId OPTIONAL,
9609 IN PKSTART_ROUTINE StartRoutine,
9610 IN PVOID StartContext);
9611
9612 /*
9613 * PEPROCESS
9614 * PsGetCurrentProcess(VOID)
9615 */
9616 #define PsGetCurrentProcess IoGetCurrentProcess
9617
9618 NTKERNELAPI
9619 HANDLE
9620 NTAPI
9621 PsGetCurrentProcessId(
9622 VOID);
9623
9624 /*
9625 * PETHREAD
9626 * PsGetCurrentThread(VOID)
9627 */
9628 #define PsGetCurrentThread() \
9629 ((PETHREAD) KeGetCurrentThread())
9630
9631 NTKERNELAPI
9632 HANDLE
9633 NTAPI
9634 PsGetCurrentThreadId(
9635 VOID);
9636
9637 NTKERNELAPI
9638 HANDLE
9639 NTAPI
9640 PsGetProcessId(PEPROCESS Process);
9641
9642 NTKERNELAPI
9643 BOOLEAN
9644 NTAPI
9645 PsGetVersion(
9646 PULONG MajorVersion OPTIONAL,
9647 PULONG MinorVersion OPTIONAL,
9648 PULONG BuildNumber OPTIONAL,
9649 PUNICODE_STRING CSDVersion OPTIONAL);
9650
9651 NTKERNELAPI
9652 NTSTATUS
9653 NTAPI
9654 PsRemoveCreateThreadNotifyRoutine(
9655 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
9656
9657 NTKERNELAPI
9658 NTSTATUS
9659 NTAPI
9660 PsRemoveLoadImageNotifyRoutine(
9661 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
9662
9663 NTKERNELAPI
9664 NTSTATUS
9665 NTAPI
9666 PsSetCreateProcessNotifyRoutine(
9667 IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
9668 IN BOOLEAN Remove);
9669
9670 NTKERNELAPI
9671 NTSTATUS
9672 NTAPI
9673 PsSetCreateThreadNotifyRoutine(
9674 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
9675
9676 NTKERNELAPI
9677 NTSTATUS
9678 NTAPI
9679 PsSetLoadImageNotifyRoutine(
9680 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
9681
9682 NTKERNELAPI
9683 NTSTATUS
9684 NTAPI
9685 PsTerminateSystemThread(
9686 IN NTSTATUS ExitStatus);
9687
9688 extern NTSYSAPI PEPROCESS PsInitialSystemProcess;
9689
9690
9691 /** Security reference monitor routines **/
9692
9693 NTKERNELAPI
9694 BOOLEAN
9695 NTAPI
9696 SeAccessCheck(
9697 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
9698 IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext,
9699 IN BOOLEAN SubjectContextLocked,
9700 IN ACCESS_MASK DesiredAccess,
9701 IN ACCESS_MASK PreviouslyGrantedAccess,
9702 OUT PPRIVILEGE_SET *Privileges OPTIONAL,
9703 IN PGENERIC_MAPPING GenericMapping,
9704 IN KPROCESSOR_MODE AccessMode,
9705 OUT PACCESS_MASK GrantedAccess,
9706 OUT PNTSTATUS AccessStatus);
9707
9708 NTKERNELAPI
9709 NTSTATUS
9710 NTAPI
9711 SeAssignSecurity(
9712 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
9713 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
9714 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
9715 IN BOOLEAN IsDirectoryObject,
9716 IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
9717 IN PGENERIC_MAPPING GenericMapping,
9718 IN POOL_TYPE PoolType);
9719
9720 NTKERNELAPI
9721 NTSTATUS
9722 NTAPI
9723 SeAssignSecurityEx(
9724 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
9725 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
9726 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
9727 IN GUID *ObjectType OPTIONAL,
9728 IN BOOLEAN IsDirectoryObject,
9729 IN ULONG AutoInheritFlags,
9730 IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
9731 IN PGENERIC_MAPPING GenericMapping,
9732 IN POOL_TYPE PoolType);
9733
9734 NTKERNELAPI
9735 NTSTATUS
9736 NTAPI
9737 SeDeassignSecurity(
9738 IN OUT PSECURITY_DESCRIPTOR *SecurityDescriptor);
9739
9740 NTKERNELAPI
9741 BOOLEAN
9742 NTAPI
9743 SeSinglePrivilegeCheck(
9744 LUID PrivilegeValue,
9745 KPROCESSOR_MODE PreviousMode);
9746
9747 NTKERNELAPI
9748 BOOLEAN
9749 NTAPI
9750 SeValidSecurityDescriptor(
9751 IN ULONG Length,
9752 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
9753
9754
9755
9756 /** NtXxx routines **/
9757
9758 NTSYSCALLAPI
9759 NTSTATUS
9760 NTAPI
9761 NtOpenProcess(
9762 OUT PHANDLE ProcessHandle,
9763 IN ACCESS_MASK DesiredAccess,
9764 IN POBJECT_ATTRIBUTES ObjectAttributes,
9765 IN PCLIENT_ID ClientId OPTIONAL);
9766
9767 NTSYSCALLAPI
9768 NTSTATUS
9769 NTAPI
9770 NtQueryInformationProcess(
9771 IN HANDLE ProcessHandle,
9772 IN PROCESSINFOCLASS ProcessInformationClass,
9773 OUT PVOID ProcessInformation,
9774 IN ULONG ProcessInformationLength,
9775 OUT PULONG ReturnLength OPTIONAL);
9776
9777
9778
9779 /** NtXxx and ZwXxx routines **/
9780
9781 NTSYSAPI
9782 NTSTATUS
9783 NTAPI
9784 ZwCancelTimer(
9785 IN HANDLE TimerHandle,
9786 OUT PBOOLEAN CurrentState OPTIONAL);
9787
9788 NTSYSCALLAPI
9789 NTSTATUS
9790 NTAPI
9791 NtClose(
9792 IN HANDLE Handle);
9793
9794 NTSYSAPI
9795 NTSTATUS
9796 NTAPI
9797 ZwClose(
9798 IN HANDLE Handle);
9799
9800 NTSYSAPI
9801 NTSTATUS
9802 NTAPI
9803 ZwCreateDirectoryObject(
9804 OUT PHANDLE DirectoryHandle,
9805 IN ACCESS_MASK DesiredAccess,
9806 IN POBJECT_ATTRIBUTES ObjectAttributes);
9807
9808 NTSYSCALLAPI
9809 NTSTATUS
9810 NTAPI
9811 NtCreateEvent(
9812 OUT PHANDLE EventHandle,
9813 IN ACCESS_MASK DesiredAccess,
9814 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
9815 IN EVENT_TYPE EventType,
9816 IN BOOLEAN InitialState);
9817
9818 NTSYSAPI
9819 NTSTATUS
9820 NTAPI
9821 ZwCreateEvent(
9822 OUT PHANDLE EventHandle,
9823 IN ACCESS_MASK DesiredAccess,
9824 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
9825 IN EVENT_TYPE EventType,
9826 IN BOOLEAN InitialState);
9827
9828 NTSYSAPI
9829 NTSTATUS
9830 NTAPI
9831 ZwCreateFile(
9832 OUT PHANDLE FileHandle,
9833 IN ACCESS_MASK DesiredAccess,
9834 IN POBJECT_ATTRIBUTES ObjectAttributes,
9835 OUT PIO_STATUS_BLOCK IoStatusBlock,
9836 IN PLARGE_INTEGER AllocationSize OPTIONAL,
9837 IN ULONG FileAttributes,
9838 IN ULONG ShareAccess,
9839 IN ULONG CreateDisposition,
9840 IN ULONG CreateOptions,
9841 IN PVOID EaBuffer OPTIONAL,
9842 IN ULONG EaLength);
9843
9844 NTSYSAPI
9845 NTSTATUS
9846 NTAPI
9847 ZwCreateKey(
9848 OUT PHANDLE KeyHandle,
9849 IN ACCESS_MASK DesiredAccess,
9850 IN POBJECT_ATTRIBUTES ObjectAttributes,
9851 IN ULONG TitleIndex,
9852 IN PUNICODE_STRING Class OPTIONAL,
9853 IN ULONG CreateOptions,
9854 OUT PULONG Disposition OPTIONAL);
9855
9856 NTSYSAPI
9857 NTSTATUS
9858 NTAPI
9859 ZwCreateTimer(
9860 OUT PHANDLE TimerHandle,
9861 IN ACCESS_MASK DesiredAccess,
9862 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
9863 IN TIMER_TYPE TimerType);
9864
9865 NTSYSAPI
9866 NTSTATUS
9867 NTAPI
9868 ZwDeleteKey(
9869 IN HANDLE KeyHandle);
9870
9871 NTSYSAPI
9872 NTSTATUS
9873 NTAPI
9874 ZwDeleteValueKey(
9875 IN HANDLE KeyHandle,
9876 IN PUNICODE_STRING ValueName);
9877
9878 NTSYSCALLAPI
9879 NTSTATUS
9880 NTAPI
9881 NtDeviceIoControlFile(
9882 IN HANDLE DeviceHandle,
9883 IN HANDLE Event OPTIONAL,
9884 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
9885 IN PVOID UserApcContext OPTIONAL,
9886 OUT PIO_STATUS_BLOCK IoStatusBlock,
9887 IN ULONG IoControlCode,
9888 IN PVOID InputBuffer,
9889 IN ULONG InputBufferSize,
9890 OUT PVOID OutputBuffer,
9891 IN ULONG OutputBufferSize);
9892
9893 NTSYSAPI
9894 NTSTATUS
9895 NTAPI
9896 ZwDeviceIoControlFile(
9897 IN HANDLE DeviceHandle,
9898 IN HANDLE Event OPTIONAL,
9899 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
9900 IN PVOID UserApcContext OPTIONAL,
9901 OUT PIO_STATUS_BLOCK IoStatusBlock,
9902 IN ULONG IoControlCode,
9903 IN PVOID InputBuffer,
9904 IN ULONG InputBufferSize,
9905 OUT PVOID OutputBuffer,
9906 IN ULONG OutputBufferSize);
9907
9908 NTSYSAPI
9909 NTSTATUS
9910 NTAPI
9911 ZwEnumerateKey(
9912 IN HANDLE KeyHandle,
9913 IN ULONG Index,
9914 IN KEY_INFORMATION_CLASS KeyInformationClass,
9915 OUT PVOID KeyInformation,
9916 IN ULONG Length,
9917 OUT PULONG ResultLength);
9918
9919 NTSYSAPI
9920 NTSTATUS
9921 NTAPI
9922 ZwEnumerateValueKey(
9923 IN HANDLE KeyHandle,
9924 IN ULONG Index,
9925 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
9926 OUT PVOID KeyValueInformation,
9927 IN ULONG Length,
9928 OUT PULONG ResultLength);
9929
9930 NTSYSAPI
9931 NTSTATUS
9932 NTAPI
9933 ZwFlushKey(
9934 IN HANDLE KeyHandle);
9935
9936 NTSYSAPI
9937 NTSTATUS
9938 NTAPI
9939 ZwMakeTemporaryObject(
9940 IN HANDLE Handle);
9941
9942 NTSYSCALLAPI
9943 NTSTATUS
9944 NTAPI
9945 NtMapViewOfSection(
9946 IN HANDLE SectionHandle,
9947 IN HANDLE ProcessHandle,
9948 IN OUT PVOID *BaseAddress,
9949 IN ULONG_PTR ZeroBits,
9950 IN SIZE_T CommitSize,
9951 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
9952 IN OUT PSIZE_T ViewSize,
9953 IN SECTION_INHERIT InheritDisposition,
9954 IN ULONG AllocationType,
9955 IN ULONG Protect);
9956
9957 NTSYSAPI
9958 NTSTATUS
9959 NTAPI
9960 ZwMapViewOfSection(
9961 IN HANDLE SectionHandle,
9962 IN HANDLE ProcessHandle,
9963 IN OUT PVOID *BaseAddress,
9964 IN ULONG_PTR ZeroBits,
9965 IN SIZE_T CommitSize,
9966 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
9967 IN OUT PSIZE_T ViewSize,
9968 IN SECTION_INHERIT InheritDisposition,
9969 IN ULONG AllocationType,
9970 IN ULONG Protect);
9971
9972 NTSYSCALLAPI
9973 NTSTATUS
9974 NTAPI
9975 NtOpenFile(
9976 OUT PHANDLE FileHandle,
9977 IN ACCESS_MASK DesiredAccess,
9978 IN POBJECT_ATTRIBUTES ObjectAttributes,
9979 OUT PIO_STATUS_BLOCK IoStatusBlock,
9980 IN ULONG ShareAccess,
9981 IN ULONG OpenOptions);
9982
9983 NTSYSAPI
9984 NTSTATUS
9985 NTAPI
9986 ZwOpenFile(
9987 OUT PHANDLE FileHandle,
9988 IN ACCESS_MASK DesiredAccess,
9989 IN POBJECT_ATTRIBUTES ObjectAttributes,
9990 OUT PIO_STATUS_BLOCK IoStatusBlock,
9991 IN ULONG ShareAccess,
9992 IN ULONG OpenOptions);
9993
9994 NTSYSAPI
9995 NTSTATUS
9996 NTAPI
9997 ZwOpenKey(
9998 OUT PHANDLE KeyHandle,
9999 IN ACCESS_MASK DesiredAccess,
10000 IN POBJECT_ATTRIBUTES ObjectAttributes);
10001
10002 NTSYSAPI
10003 NTSTATUS
10004 NTAPI
10005 ZwOpenSection(
10006 OUT PHANDLE SectionHandle,
10007 IN ACCESS_MASK DesiredAccess,
10008 IN POBJECT_ATTRIBUTES ObjectAttributes);
10009
10010 NTSYSAPI
10011 NTSTATUS
10012 NTAPI
10013 ZwOpenSymbolicLinkObject(
10014 OUT PHANDLE LinkHandle,
10015 IN ACCESS_MASK DesiredAccess,
10016 IN POBJECT_ATTRIBUTES ObjectAttributes);
10017
10018 NTSYSAPI
10019 NTSTATUS
10020 NTAPI
10021 ZwOpenTimer(
10022 OUT PHANDLE TimerHandle,
10023 IN ACCESS_MASK DesiredAccess,
10024 IN POBJECT_ATTRIBUTES ObjectAttributes);
10025
10026 NTSYSAPI
10027 NTSTATUS
10028 NTAPI
10029 ZwQueryInformationFile(
10030 IN HANDLE FileHandle,
10031 OUT PIO_STATUS_BLOCK IoStatusBlock,
10032 OUT PVOID FileInformation,
10033 IN ULONG Length,
10034 IN FILE_INFORMATION_CLASS FileInformationClass);
10035
10036 NTSYSAPI
10037 NTSTATUS
10038 NTAPI
10039 ZwQueryKey(
10040 IN HANDLE KeyHandle,
10041 IN KEY_INFORMATION_CLASS KeyInformationClass,
10042 OUT PVOID KeyInformation,
10043 IN ULONG Length,
10044 OUT PULONG ResultLength);
10045
10046 NTSYSAPI
10047 NTSTATUS
10048 NTAPI
10049 ZwQuerySymbolicLinkObject(
10050 IN HANDLE LinkHandle,
10051 IN OUT PUNICODE_STRING LinkTarget,
10052 OUT PULONG ReturnedLength OPTIONAL);
10053
10054 NTSYSAPI
10055 NTSTATUS
10056 NTAPI
10057 ZwQueryValueKey(
10058 IN HANDLE KeyHandle,
10059 IN PUNICODE_STRING ValueName,
10060 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
10061 OUT PVOID KeyValueInformation,
10062 IN ULONG Length,
10063 OUT PULONG ResultLength);
10064
10065 NTSYSCALLAPI
10066 NTSTATUS
10067 NTAPI
10068 NtReadFile(
10069 IN HANDLE FileHandle,
10070 IN HANDLE Event OPTIONAL,
10071 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
10072 IN PVOID ApcContext OPTIONAL,
10073 OUT PIO_STATUS_BLOCK IoStatusBlock,
10074 OUT PVOID Buffer,
10075 IN ULONG Length,
10076 IN PLARGE_INTEGER ByteOffset OPTIONAL,
10077 IN PULONG Key OPTIONAL);
10078
10079 NTSYSAPI
10080 NTSTATUS
10081 NTAPI
10082 ZwReadFile(
10083 IN HANDLE FileHandle,
10084 IN HANDLE Event OPTIONAL,
10085 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
10086 IN PVOID ApcContext OPTIONAL,
10087 OUT PIO_STATUS_BLOCK IoStatusBlock,
10088 OUT PVOID Buffer,
10089 IN ULONG Length,
10090 IN PLARGE_INTEGER ByteOffset OPTIONAL,
10091 IN PULONG Key OPTIONAL);
10092
10093 NTSYSCALLAPI
10094 NTSTATUS
10095 NTAPI
10096 NtSetEvent(
10097 IN HANDLE EventHandle,
10098 OUT PLONG PreviousState OPTIONAL);
10099
10100 NTSYSAPI
10101 NTSTATUS
10102 NTAPI
10103 ZwSetEvent(
10104 IN HANDLE EventHandle,
10105 OUT PLONG PreviousState OPTIONAL);
10106
10107 NTSYSAPI
10108 NTSTATUS
10109 NTAPI
10110 ZwSetInformationFile(
10111 IN HANDLE FileHandle,
10112 OUT PIO_STATUS_BLOCK IoStatusBlock,
10113 IN PVOID FileInformation,
10114 IN ULONG Length,
10115 IN FILE_INFORMATION_CLASS FileInformationClass);
10116
10117 NTSYSAPI
10118 NTSTATUS
10119 NTAPI
10120 ZwSetInformationThread(
10121 IN HANDLE ThreadHandle,
10122 IN THREADINFOCLASS ThreadInformationClass,
10123 IN PVOID ThreadInformation,
10124 IN ULONG ThreadInformationLength);
10125
10126 NTSYSAPI
10127 NTSTATUS
10128 NTAPI
10129 ZwSetTimer(
10130 IN HANDLE TimerHandle,
10131 IN PLARGE_INTEGER DueTime,
10132 IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL,
10133 IN PVOID TimerContext OPTIONAL,
10134 IN BOOLEAN WakeTimer,
10135 IN LONG Period OPTIONAL,
10136 OUT PBOOLEAN PreviousState OPTIONAL);
10137
10138 NTSYSAPI
10139 NTSTATUS
10140 NTAPI
10141 ZwSetValueKey(
10142 IN HANDLE KeyHandle,
10143 IN PUNICODE_STRING ValueName,
10144 IN ULONG TitleIndex OPTIONAL,
10145 IN ULONG Type,
10146 IN PVOID Data,
10147 IN ULONG DataSize);
10148
10149 /* [Nt|Zw]MapViewOfSection.InheritDisposition constants */
10150 #define AT_EXTENDABLE_FILE 0x00002000
10151 #define AT_RESERVED 0x20000000
10152 #define AT_ROUND_TO_PAGE 0x40000000
10153
10154 NTSYSCALLAPI
10155 NTSTATUS
10156 NTAPI
10157 NtUnmapViewOfSection(
10158 IN HANDLE ProcessHandle,
10159 IN PVOID BaseAddress);
10160
10161 NTSYSAPI
10162 NTSTATUS
10163 NTAPI
10164 ZwUnmapViewOfSection(
10165 IN HANDLE ProcessHandle,
10166 IN PVOID BaseAddress);
10167
10168 NTSYSCALLAPI
10169 NTSTATUS
10170 NTAPI
10171 NtWaitForSingleObject(
10172 IN HANDLE ObjectHandle,
10173 IN BOOLEAN Alertable,
10174 IN PLARGE_INTEGER TimeOut OPTIONAL);
10175
10176 NTSYSAPI
10177 NTSTATUS
10178 NTAPI
10179 ZwWaitForSingleObject(
10180 IN HANDLE ObjectHandle,
10181 IN BOOLEAN Alertable,
10182 IN PLARGE_INTEGER TimeOut OPTIONAL);
10183
10184 NTSYSCALLAPI
10185 NTSTATUS
10186 NTAPI
10187 NtWriteFile(
10188 IN HANDLE FileHandle,
10189 IN HANDLE Event OPTIONAL,
10190 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
10191 IN PVOID ApcContext OPTIONAL,
10192 OUT PIO_STATUS_BLOCK IoStatusBlock,
10193 IN PVOID Buffer,
10194 IN ULONG Length,
10195 IN PLARGE_INTEGER ByteOffset OPTIONAL,
10196 IN PULONG Key OPTIONAL);
10197
10198 NTSYSAPI
10199 NTSTATUS
10200 NTAPI
10201 ZwWriteFile(
10202 IN HANDLE FileHandle,
10203 IN HANDLE Event OPTIONAL,
10204 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
10205 IN PVOID ApcContext OPTIONAL,
10206 OUT PIO_STATUS_BLOCK IoStatusBlock,
10207 IN PVOID Buffer,
10208 IN ULONG Length,
10209 IN PLARGE_INTEGER ByteOffset OPTIONAL,
10210 IN PULONG Key OPTIONAL);
10211
10212
10213
10214 /** Power management support routines **/
10215
10216 NTKERNELAPI
10217 NTSTATUS
10218 NTAPI
10219 PoCallDriver(
10220 IN PDEVICE_OBJECT DeviceObject,
10221 IN OUT PIRP Irp);
10222
10223 NTKERNELAPI
10224 PULONG
10225 NTAPI
10226 PoRegisterDeviceForIdleDetection(
10227 IN PDEVICE_OBJECT DeviceObject,
10228 IN ULONG ConservationIdleTime,
10229 IN ULONG PerformanceIdleTime,
10230 IN DEVICE_POWER_STATE State);
10231
10232 NTKERNELAPI
10233 PVOID
10234 NTAPI
10235 PoRegisterSystemState(
10236 IN PVOID StateHandle,
10237 IN EXECUTION_STATE Flags);
10238
10239 NTKERNELAPI
10240 NTSTATUS
10241 NTAPI
10242 PoRequestPowerIrp(
10243 IN PDEVICE_OBJECT DeviceObject,
10244 IN UCHAR MinorFunction,
10245 IN POWER_STATE PowerState,
10246 IN PREQUEST_POWER_COMPLETE CompletionFunction,
10247 IN PVOID Context,
10248 OUT PIRP *Irp OPTIONAL);
10249
10250 NTKERNELAPI
10251 NTSTATUS
10252 NTAPI
10253 PoRequestShutdownEvent(
10254 OUT PVOID *Event);
10255
10256 NTKERNELAPI
10257 VOID
10258 NTAPI
10259 PoSetDeviceBusy(
10260 PULONG IdlePointer);
10261
10262 #define PoSetDeviceBusy(IdlePointer) \
10263 ((void)(*(IdlePointer) = 0))
10264
10265 NTKERNELAPI
10266 POWER_STATE
10267 NTAPI
10268 PoSetPowerState(
10269 IN PDEVICE_OBJECT DeviceObject,
10270 IN POWER_STATE_TYPE Type,
10271 IN POWER_STATE State);
10272
10273 NTKERNELAPI
10274 VOID
10275 NTAPI
10276 PoSetSystemState(
10277 IN EXECUTION_STATE Flags);
10278
10279 NTKERNELAPI
10280 VOID
10281 NTAPI
10282 PoStartNextPowerIrp(
10283 IN PIRP Irp);
10284
10285 NTKERNELAPI
10286 VOID
10287 NTAPI
10288 PoUnregisterSystemState(
10289 IN PVOID StateHandle);
10290
10291
10292
10293 /** WMI library support routines **/
10294
10295 NTSTATUS
10296 NTAPI
10297 WmiCompleteRequest(
10298 IN PDEVICE_OBJECT DeviceObject,
10299 IN PIRP Irp,
10300 IN NTSTATUS Status,
10301 IN ULONG BufferUsed,
10302 IN CCHAR PriorityBoost);
10303
10304 NTSTATUS
10305 NTAPI
10306 WmiFireEvent(
10307 IN PDEVICE_OBJECT DeviceObject,
10308 IN LPGUID Guid,
10309 IN ULONG InstanceIndex,
10310 IN ULONG EventDataSize,
10311 IN PVOID EventData);
10312
10313 NTKERNELAPI
10314 NTSTATUS
10315 NTAPI
10316 WmiQueryTraceInformation(
10317 IN TRACE_INFORMATION_CLASS TraceInformationClass,
10318 OUT PVOID TraceInformation,
10319 IN ULONG TraceInformationLength,
10320 OUT PULONG RequiredLength OPTIONAL,
10321 IN PVOID Buffer OPTIONAL);
10322
10323 NTSTATUS
10324 NTAPI
10325 WmiSystemControl(
10326 IN PWMILIB_CONTEXT WmiLibInfo,
10327 IN PDEVICE_OBJECT DeviceObject,
10328 IN PIRP Irp,
10329 OUT PSYSCTL_IRP_DISPOSITION IrpDisposition);
10330
10331 NTKERNELAPI
10332 NTSTATUS
10333 DDKCDECLAPI
10334 WmiTraceMessage(
10335 IN TRACEHANDLE LoggerHandle,
10336 IN ULONG MessageFlags,
10337 IN LPGUID MessageGuid,
10338 IN USHORT MessageNumber,
10339 IN ...);
10340
10341 #if 0
10342 /* FIXME: Get va_list from where? */
10343 NTKERNELAPI
10344 NTSTATUS
10345 DDKCDECLAPI
10346 WmiTraceMessageVa(
10347 IN TRACEHANDLE LoggerHandle,
10348 IN ULONG MessageFlags,
10349 IN LPGUID MessageGuid,
10350 IN USHORT MessageNumber,
10351 IN va_list MessageArgList);
10352 #endif
10353
10354
10355 /** Kernel debugger routines **/
10356
10357 NTKERNELAPI
10358 NTSTATUS
10359 NTAPI
10360 KdDisableDebugger(
10361 VOID);
10362
10363 NTKERNELAPI
10364 NTSTATUS
10365 NTAPI
10366 KdEnableDebugger(
10367 VOID);
10368
10369 NTKERNELAPI
10370 BOOLEAN
10371 NTAPI
10372 KdRefreshDebuggerNotPresent(
10373 VOID
10374 );
10375
10376 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
10377 NTKERNELAPI
10378 NTSTATUS
10379 NTAPI
10380 KdChangeOption(
10381 IN KD_OPTION Option,
10382 IN ULONG InBufferBytes OPTIONAL,
10383 IN PVOID InBuffer,
10384 IN ULONG OutBufferBytes OPTIONAL,
10385 OUT PVOID OutBuffer,
10386 OUT PULONG OutBufferNeeded OPTIONAL);
10387 #endif
10388
10389 VOID
10390 NTAPI
10391 DbgBreakPoint(
10392 VOID);
10393
10394 NTSYSAPI
10395 VOID
10396 NTAPI
10397 DbgBreakPointWithStatus(
10398 IN ULONG Status);
10399
10400 ULONG
10401 DDKCDECLAPI
10402 DbgPrint(
10403 IN PCCH Format,
10404 IN ...);
10405
10406 NTSYSAPI
10407 ULONG
10408 DDKCDECLAPI
10409 DbgPrintEx(
10410 IN ULONG ComponentId,
10411 IN ULONG Level,
10412 IN PCCH Format,
10413 IN ...);
10414
10415 ULONG
10416 NTAPI
10417 vDbgPrintEx(
10418 IN ULONG ComponentId,
10419 IN ULONG Level,
10420 IN PCCH Format,
10421 IN va_list ap);
10422
10423 ULONG
10424 NTAPI
10425 vDbgPrintExWithPrefix(
10426 IN PCCH Prefix,
10427 IN ULONG ComponentId,
10428 IN ULONG Level,
10429 IN PCCH Format,
10430 IN va_list ap);
10431
10432 NTKERNELAPI
10433 ULONG
10434 DDKCDECLAPI
10435 DbgPrintReturnControlC(
10436 IN PCCH Format,
10437 IN ...);
10438
10439 ULONG
10440 NTAPI
10441 DbgPrompt(
10442 IN PCCH Prompt,
10443 OUT PCH Response,
10444 IN ULONG MaximumResponseLength
10445 );
10446
10447 NTKERNELAPI
10448 NTSTATUS
10449 NTAPI
10450 DbgQueryDebugFilterState(
10451 IN ULONG ComponentId,
10452 IN ULONG Level);
10453
10454 NTKERNELAPI
10455 NTSTATUS
10456 NTAPI
10457 DbgSetDebugFilterState(
10458 IN ULONG ComponentId,
10459 IN ULONG Level,
10460 IN BOOLEAN State);
10461
10462 #if DBG
10463
10464 #define KdPrint(_x_) DbgPrint _x_
10465 #define KdPrintEx(_x_) DbgPrintEx _x_
10466 #define KdBreakPoint() DbgBreakPoint()
10467 #define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
10468
10469 #else /* !DBG */
10470
10471 #define KdPrint(_x_)
10472 #define KdPrintEx(_x_)
10473 #define KdBreakPoint()
10474 #define KdBreakPointWithStatus(s)
10475
10476 #endif /* !DBG */
10477
10478 #if defined(__GNUC__)
10479
10480 extern NTKERNELAPI BOOLEAN KdDebuggerNotPresent;
10481 extern NTKERNELAPI BOOLEAN KdDebuggerEnabled;
10482 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
10483 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
10484
10485 #elif defined(_NTDDK_) || defined(_NTHAL_) || defined(_WDMDDK_) || defined(_NTOSP_)
10486
10487 extern NTKERNELAPI PBOOLEAN KdDebuggerNotPresent;
10488 extern NTKERNELAPI PBOOLEAN KdDebuggerEnabled;
10489 #define KD_DEBUGGER_ENABLED *KdDebuggerEnabled
10490 #define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
10491
10492 #else
10493
10494 extern BOOLEAN KdDebuggerNotPresent;
10495 extern BOOLEAN KdDebuggerEnabled;
10496 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
10497 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
10498
10499 #endif
10500
10501 /** Stuff from winnt4.h */
10502
10503 #ifndef DMA_MACROS_DEFINED
10504
10505 #if (NTDDI_VERSION >= NTDDI_WIN2K)
10506
10507 //DECLSPEC_DEPRECATED_DDK
10508 NTHALAPI
10509 BOOLEAN
10510 NTAPI
10511 IoFlushAdapterBuffers(
10512 IN PADAPTER_OBJECT AdapterObject,
10513 IN PMDL Mdl,
10514 IN PVOID MapRegisterBase,
10515 IN PVOID CurrentVa,
10516 IN ULONG Length,
10517 IN BOOLEAN WriteToDevice);
10518
10519 //DECLSPEC_DEPRECATED_DDK
10520 NTHALAPI
10521 VOID
10522 NTAPI
10523 IoFreeAdapterChannel(
10524 IN PADAPTER_OBJECT AdapterObject);
10525
10526 //DECLSPEC_DEPRECATED_DDK
10527 NTHALAPI
10528 VOID
10529 NTAPI
10530 IoFreeMapRegisters(
10531 IN PADAPTER_OBJECT AdapterObject,
10532 IN PVOID MapRegisterBase,
10533 IN ULONG NumberOfMapRegisters);
10534
10535 //DECLSPEC_DEPRECATED_DDK
10536 NTHALAPI
10537 PHYSICAL_ADDRESS
10538 NTAPI
10539 IoMapTransfer(
10540 IN PADAPTER_OBJECT AdapterObject,
10541 IN PMDL Mdl,
10542 IN PVOID MapRegisterBase,
10543 IN PVOID CurrentVa,
10544 IN OUT PULONG Length,
10545 IN BOOLEAN WriteToDevice);
10546
10547
10548 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
10549 #endif // !defined(DMA_MACROS_DEFINED)
10550
10551 NTKERNELAPI
10552 NTSTATUS
10553 NTAPI
10554 IoAssignResources(
10555 IN PUNICODE_STRING RegistryPath,
10556 IN PUNICODE_STRING DriverClassName OPTIONAL,
10557 IN PDRIVER_OBJECT DriverObject,
10558 IN PDEVICE_OBJECT DeviceObject OPTIONAL,
10559 IN PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources,
10560 IN OUT PCM_RESOURCE_LIST *AllocatedResources);
10561
10562 NTKERNELAPI
10563 NTSTATUS
10564 NTAPI
10565 IoAttachDeviceByPointer(
10566 IN PDEVICE_OBJECT SourceDevice,
10567 IN PDEVICE_OBJECT TargetDevice);
10568
10569 NTKERNELAPI
10570 BOOLEAN
10571 NTAPI
10572 MmIsNonPagedSystemAddressValid(
10573 IN PVOID VirtualAddress);
10574
10575 #if defined(_AMD64_) || defined(_IA64_)
10576 //DECLSPEC_DEPRECATED_DDK_WINXP
10577 static __inline
10578 LARGE_INTEGER
10579 NTAPI_INLINE
10580 RtlLargeIntegerDivide(
10581 IN LARGE_INTEGER Dividend,
10582 IN LARGE_INTEGER Divisor,
10583 IN OUT PLARGE_INTEGER Remainder)
10584 {
10585 LARGE_INTEGER ret;
10586 ret.QuadPart = Dividend.QuadPart / Divisor.QuadPart;
10587 if (Remainder)
10588 Remainder->QuadPart = Dividend.QuadPart % Divisor.QuadPart;
10589 return ret;
10590 }
10591 #else
10592 NTSYSAPI
10593 LARGE_INTEGER
10594 NTAPI
10595 RtlLargeIntegerDivide(
10596 IN LARGE_INTEGER Dividend,
10597 IN LARGE_INTEGER Divisor,
10598 IN OUT PLARGE_INTEGER Remainder);
10599 #endif
10600
10601 NTKERNELAPI
10602 INTERLOCKED_RESULT
10603 NTAPI
10604 ExInterlockedDecrementLong(
10605 IN PLONG Addend,
10606 IN PKSPIN_LOCK Lock);
10607
10608 NTKERNELAPI
10609 ULONG
10610 NTAPI
10611 ExInterlockedExchangeUlong(
10612 IN PULONG Target,
10613 IN ULONG Value,
10614 IN PKSPIN_LOCK Lock);
10615
10616 NTKERNELAPI
10617 INTERLOCKED_RESULT
10618 NTAPI
10619 ExInterlockedIncrementLong(
10620 IN PLONG Addend,
10621 IN PKSPIN_LOCK Lock);
10622
10623 NTHALAPI
10624 VOID
10625 NTAPI
10626 HalAcquireDisplayOwnership(
10627 IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters);
10628
10629 NTHALAPI
10630 NTSTATUS
10631 NTAPI
10632 HalAllocateAdapterChannel(
10633 IN PADAPTER_OBJECT AdapterObject,
10634 IN PWAIT_CONTEXT_BLOCK Wcb,
10635 IN ULONG NumberOfMapRegisters,
10636 IN PDRIVER_CONTROL ExecutionRoutine);
10637
10638 NTHALAPI
10639 PVOID
10640 NTAPI
10641 HalAllocateCommonBuffer(
10642 IN PADAPTER_OBJECT AdapterObject,
10643 IN ULONG Length,
10644 OUT PPHYSICAL_ADDRESS LogicalAddress,
10645 IN BOOLEAN CacheEnabled);
10646
10647 NTHALAPI
10648 NTSTATUS
10649 NTAPI
10650 HalAssignSlotResources(
10651 IN PUNICODE_STRING RegistryPath,
10652 IN PUNICODE_STRING DriverClassName,
10653 IN PDRIVER_OBJECT DriverObject,
10654 IN PDEVICE_OBJECT DeviceObject,
10655 IN INTERFACE_TYPE BusType,
10656 IN ULONG BusNumber,
10657 IN ULONG SlotNumber,
10658 IN OUT PCM_RESOURCE_LIST *AllocatedResources);
10659
10660 NTHALAPI
10661 VOID
10662 NTAPI
10663 HalFreeCommonBuffer(
10664 IN PADAPTER_OBJECT AdapterObject,
10665 IN ULONG Length,
10666 IN PHYSICAL_ADDRESS LogicalAddress,
10667 IN PVOID VirtualAddress,
10668 IN BOOLEAN CacheEnabled);
10669
10670 NTHALAPI
10671 PADAPTER_OBJECT
10672 NTAPI
10673 HalGetAdapter(
10674 IN PDEVICE_DESCRIPTION DeviceDescription,
10675 IN OUT PULONG NumberOfMapRegisters);
10676
10677 NTHALAPI
10678 ULONG
10679 NTAPI
10680 HalGetBusData(
10681 IN BUS_DATA_TYPE BusDataType,
10682 IN ULONG BusNumber,
10683 IN ULONG SlotNumber,
10684 IN PVOID Buffer,
10685 IN ULONG Length);
10686
10687 NTHALAPI
10688 ULONG
10689 NTAPI
10690 HalGetBusDataByOffset(
10691 IN BUS_DATA_TYPE BusDataType,
10692 IN ULONG BusNumber,
10693 IN ULONG SlotNumber,
10694 IN PVOID Buffer,
10695 IN ULONG Offset,
10696 IN ULONG Length);
10697
10698 NTHALAPI
10699 ULONG
10700 NTAPI
10701 HalGetDmaAlignmentRequirement(
10702 VOID);
10703
10704 NTHALAPI
10705 ULONG
10706 NTAPI
10707 HalGetInterruptVector(
10708 IN INTERFACE_TYPE InterfaceType,
10709 IN ULONG BusNumber,
10710 IN ULONG BusInterruptLevel,
10711 IN ULONG BusInterruptVector,
10712 OUT PKIRQL Irql,
10713 OUT PKAFFINITY Affinity);
10714
10715 NTHALAPI
10716 ULONG
10717 NTAPI
10718 HalReadDmaCounter(
10719 IN PADAPTER_OBJECT AdapterObject);
10720
10721 NTHALAPI
10722 ULONG
10723 NTAPI
10724 HalSetBusData(
10725 IN BUS_DATA_TYPE BusDataType,
10726 IN ULONG BusNumber,
10727 IN ULONG SlotNumber,
10728 IN PVOID Buffer,
10729 IN ULONG Length);
10730
10731 NTHALAPI
10732 ULONG
10733 NTAPI
10734 HalSetBusDataByOffset(
10735 IN BUS_DATA_TYPE BusDataType,
10736 IN ULONG BusNumber,
10737 IN ULONG SlotNumber,
10738 IN PVOID Buffer,
10739 IN ULONG Offset,
10740 IN ULONG Length);
10741
10742 NTHALAPI
10743 BOOLEAN
10744 NTAPI
10745 HalTranslateBusAddress(
10746 IN INTERFACE_TYPE InterfaceType,
10747 IN ULONG BusNumber,
10748 IN PHYSICAL_ADDRESS BusAddress,
10749 IN OUT PULONG AddressSpace,
10750 OUT PPHYSICAL_ADDRESS TranslatedAddress);
10751
10752 NTSYSAPI
10753 BOOLEAN
10754 NTAPI
10755 RtlLargeIntegerEqualToZero(
10756 IN LARGE_INTEGER Operand);
10757
10758 NTSYSAPI
10759 BOOLEAN
10760 NTAPI
10761 RtlLargeIntegerGreaterOrEqualToZero(
10762 IN LARGE_INTEGER Operand);
10763
10764 NTSYSAPI
10765 BOOLEAN
10766 NTAPI
10767 RtlLargeIntegerGreaterThan(
10768 IN LARGE_INTEGER Operand1,
10769 IN LARGE_INTEGER Operand2);
10770
10771 NTSYSAPI
10772 BOOLEAN
10773 NTAPI
10774 RtlLargeIntegerGreaterThanOrEqualTo(
10775 IN LARGE_INTEGER Operand1,
10776 IN LARGE_INTEGER Operand2);
10777
10778 NTSYSAPI
10779 BOOLEAN
10780 NTAPI
10781 RtlLargeIntegerGreaterThanZero(
10782 IN LARGE_INTEGER Operand);
10783
10784 NTSYSAPI
10785 BOOLEAN
10786 NTAPI
10787 RtlLargeIntegerLessOrEqualToZero(
10788 IN LARGE_INTEGER Operand);
10789
10790 NTSYSAPI
10791 BOOLEAN
10792 NTAPI
10793 RtlLargeIntegerLessThan(
10794 IN LARGE_INTEGER Operand1,
10795 IN LARGE_INTEGER Operand2);
10796
10797 NTSYSAPI
10798 BOOLEAN
10799 NTAPI
10800 RtlLargeIntegerLessThanOrEqualTo(
10801 IN LARGE_INTEGER Operand1,
10802 IN LARGE_INTEGER Operand2);
10803
10804 NTSYSAPI
10805 BOOLEAN
10806 NTAPI
10807 RtlLargeIntegerLessThanZero(
10808 IN LARGE_INTEGER Operand);
10809
10810 NTSYSAPI
10811 LARGE_INTEGER
10812 NTAPI
10813 RtlLargeIntegerNegate(
10814 IN LARGE_INTEGER Subtrahend);
10815
10816 NTSYSAPI
10817 BOOLEAN
10818 NTAPI
10819 RtlLargeIntegerNotEqualTo(
10820 IN LARGE_INTEGER Operand1,
10821 IN LARGE_INTEGER Operand2);
10822
10823 NTSYSAPI
10824 BOOLEAN
10825 NTAPI
10826 RtlLargeIntegerNotEqualToZero(
10827 IN LARGE_INTEGER Operand);
10828
10829 NTSYSAPI
10830 LARGE_INTEGER
10831 NTAPI
10832 RtlLargeIntegerShiftLeft(
10833 IN LARGE_INTEGER LargeInteger,
10834 IN CCHAR ShiftCount);
10835
10836 NTSYSAPI
10837 LARGE_INTEGER
10838 NTAPI
10839 RtlLargeIntegerShiftRight(
10840 IN LARGE_INTEGER LargeInteger,
10841 IN CCHAR ShiftCount);
10842
10843 NTSYSAPI
10844 LARGE_INTEGER
10845 NTAPI
10846 RtlLargeIntegerSubtract(
10847 IN LARGE_INTEGER Minuend,
10848 IN LARGE_INTEGER Subtrahend);
10849
10850
10851 /*
10852 * ULONG
10853 * COMPUTE_PAGES_SPANNED(
10854 * IN PVOID Va,
10855 * IN ULONG Size)
10856 */
10857 #define COMPUTE_PAGES_SPANNED(Va, \
10858 Size) \
10859 (ADDRESS_AND_SIZE_TO_SPAN_PAGES(Va, Size))
10860
10861
10862 /*
10863 ** Architecture specific structures
10864 */
10865
10866 #ifdef _X86_
10867
10868 NTKERNELAPI
10869 INTERLOCKED_RESULT
10870 FASTCALL
10871 Exfi386InterlockedIncrementLong(
10872 IN PLONG Addend);
10873
10874 NTKERNELAPI
10875 INTERLOCKED_RESULT
10876 FASTCALL
10877 Exfi386InterlockedDecrementLong(
10878 IN PLONG Addend);
10879
10880 NTKERNELAPI
10881 ULONG
10882 FASTCALL
10883 Exfi386InterlockedExchangeUlong(
10884 IN PULONG Target,
10885 IN ULONG Value);
10886
10887 #define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend)
10888 #define ExInterlockedDecrementLong(Addend,Lock) Exfi386InterlockedDecrementLong(Addend)
10889 #define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value)
10890
10891 #endif /* _X86_ */
10892
10893 #ifdef _M_ARM
10894 //
10895 // NT-ARM is not documented
10896 //
10897 #include <armddk.h>
10898 #endif
10899
10900 #ifdef __cplusplus
10901 }
10902 #endif
10903
10904 #endif /* __WINDDK_H */