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