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