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