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