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