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