ddk: update AMD64 intrinsic Interlocked functions
[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 #elif defined(__PowerPC__)
5504
5505 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
5506
5507 #define PASSIVE_LEVEL 0
5508 #define LOW_LEVEL 0
5509 #define APC_LEVEL 1
5510 #define DISPATCH_LEVEL 2
5511 #define PROFILE_LEVEL 27
5512 #define CLOCK1_LEVEL 28
5513 #define CLOCK2_LEVEL 28
5514 #define IPI_LEVEL 29
5515 #define POWER_LEVEL 30
5516 #define HIGH_LEVEL 31
5517
5518 typedef struct _KFLOATING_SAVE {
5519 ULONG Dummy;
5520 } KFLOATING_SAVE, *PKFLOATING_SAVE;
5521
5522 typedef struct _KPCR_TIB {
5523 PVOID ExceptionList; /* 00 */
5524 PVOID StackBase; /* 04 */
5525 PVOID StackLimit; /* 08 */
5526 PVOID SubSystemTib; /* 0C */
5527 _ANONYMOUS_UNION union {
5528 PVOID FiberData; /* 10 */
5529 DWORD Version; /* 10 */
5530 } DUMMYUNIONNAME;
5531 PVOID ArbitraryUserPointer; /* 14 */
5532 struct _KPCR_TIB *Self; /* 18 */
5533 } KPCR_TIB, *PKPCR_TIB; /* 1C */
5534
5535 #define PCR_MINOR_VERSION 1
5536 #define PCR_MAJOR_VERSION 1
5537
5538 typedef struct _KPCR {
5539 KPCR_TIB Tib; /* 00 */
5540 struct _KPCR *Self; /* 1C */
5541 struct _KPRCB *Prcb; /* 20 */
5542 KIRQL Irql; /* 24 */
5543 ULONG IRR; /* 28 */
5544 ULONG IrrActive; /* 2C */
5545 ULONG IDR; /* 30 */
5546 PVOID KdVersionBlock; /* 34 */
5547 PUSHORT IDT; /* 38 */
5548 PUSHORT GDT; /* 3C */
5549 struct _KTSS *TSS; /* 40 */
5550 USHORT MajorVersion; /* 44 */
5551 USHORT MinorVersion; /* 46 */
5552 KAFFINITY SetMember; /* 48 */
5553 ULONG StallScaleFactor; /* 4C */
5554 UCHAR SpareUnused; /* 50 */
5555 UCHAR Number; /* 51 */
5556 } KPCR, *PKPCR; /* 54 */
5557
5558 static __inline
5559 ULONG
5560 DDKAPI
5561 KeGetCurrentProcessorNumber(VOID)
5562 {
5563 ULONG Number;
5564 __asm__ __volatile__ (
5565 "lwz %0, %c1(12)\n"
5566 : "=r" (Number)
5567 : "i" (FIELD_OFFSET(KPCR, Number))
5568 );
5569 return Number;
5570 }
5571
5572 #elif defined(_MIPS_)
5573
5574 #error MIPS Headers are totally incorrect
5575
5576 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
5577
5578 #define PASSIVE_LEVEL 0
5579 #define APC_LEVEL 1
5580 #define DISPATCH_LEVEL 2
5581 #define PROFILE_LEVEL 27
5582 #define IPI_LEVEL 29
5583 #define HIGH_LEVEL 31
5584
5585 typedef struct _KPCR {
5586 struct _KPRCB *Prcb; /* 20 */
5587 KIRQL Irql; /* 24 */
5588 ULONG IRR; /* 28 */
5589 ULONG IDR; /* 30 */
5590 } KPCR, *PKPCR;
5591
5592 typedef struct _KFLOATING_SAVE {
5593 } KFLOATING_SAVE, *PKFLOATING_SAVE;
5594
5595 static __inline
5596 ULONG
5597 DDKAPI
5598 KeGetCurrentProcessorNumber(VOID)
5599 {
5600 return 0;
5601 }
5602
5603 #elif defined(_M_ARM)
5604
5605 //
5606 // NT-ARM is not documented, need DDK-ARM
5607 //
5608 #include <armddk.h>
5609
5610 #else
5611 #error Unknown architecture
5612 #endif
5613
5614 #define PAGE_SIZE 0x1000
5615 #define PAGE_SHIFT 12L
5616
5617 #define SharedUserData ((KUSER_SHARED_DATA * CONST) KI_USER_SHARED_DATA)
5618
5619 extern NTKERNELAPI PVOID MmHighestUserAddress;
5620 extern NTKERNELAPI PVOID MmSystemRangeStart;
5621 extern NTKERNELAPI ULONG_PTR MmUserProbeAddress;
5622
5623 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
5624 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
5625 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
5626 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
5627 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000
5628
5629 #define MM_KSEG0_BASE MM_SYSTEM_RANGE_START
5630 #define MM_SYSTEM_SPACE_END 0xFFFFFFFF
5631
5632
5633 #define EFLAG_SIGN 0x8000
5634 #define EFLAG_ZERO 0x4000
5635 #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
5636
5637 #define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
5638 #define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
5639 #define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
5640
5641 typedef enum _INTERLOCKED_RESULT {
5642 ResultNegative = RESULT_NEGATIVE,
5643 ResultZero = RESULT_ZERO,
5644 ResultPositive = RESULT_POSITIVE
5645 } INTERLOCKED_RESULT;
5646
5647 typedef VOID
5648 (NTAPI *PciPin2Line)(
5649 IN struct _BUS_HANDLER *BusHandler,
5650 IN struct _BUS_HANDLER *RootHandler,
5651 IN PCI_SLOT_NUMBER SlotNumber,
5652 IN PPCI_COMMON_CONFIG PciData
5653 );
5654
5655 typedef VOID
5656 (NTAPI *PciLine2Pin)(
5657 IN struct _BUS_HANDLER *BusHandler,
5658 IN struct _BUS_HANDLER *RootHandler,
5659 IN PCI_SLOT_NUMBER SlotNumber,
5660 IN PPCI_COMMON_CONFIG PciNewData,
5661 IN PPCI_COMMON_CONFIG PciOldData
5662 );
5663
5664 typedef VOID
5665 (NTAPI *PciReadWriteConfig)(
5666 IN struct _BUS_HANDLER *BusHandler,
5667 IN PCI_SLOT_NUMBER Slot,
5668 IN PVOID Buffer,
5669 IN ULONG Offset,
5670 IN ULONG Length
5671 );
5672
5673 #define PCI_DATA_TAG TAG('P', 'C', 'I', ' ')
5674 #define PCI_DATA_VERSION 1
5675
5676 typedef struct _PCIBUSDATA
5677 {
5678 ULONG Tag;
5679 ULONG Version;
5680 PciReadWriteConfig ReadConfig;
5681 PciReadWriteConfig WriteConfig;
5682 PciPin2Line Pin2Line;
5683 PciLine2Pin Line2Pin;
5684 PCI_SLOT_NUMBER ParentSlot;
5685 PVOID Reserved[4];
5686 } PCIBUSDATA, *PPCIBUSDATA;
5687
5688
5689
5690 #if !defined(__INTERLOCKED_DECLARED)
5691 #define __INTERLOCKED_DECLARED
5692
5693 NTKERNELAPI
5694 LONG
5695 FASTCALL
5696 InterlockedIncrement(
5697 IN OUT LONG volatile *Addend);
5698
5699 NTKERNELAPI
5700 LONG
5701 FASTCALL
5702 InterlockedDecrement(
5703 IN OUT LONG volatile *Addend);
5704
5705 NTKERNELAPI
5706 LONG
5707 FASTCALL
5708 InterlockedCompareExchange(
5709 IN OUT LONG volatile *Destination,
5710 IN LONG Exchange,
5711 IN LONG Comparand);
5712
5713 NTKERNELAPI
5714 LONG
5715 FASTCALL
5716 InterlockedExchange(
5717 IN OUT LONG volatile *Destination,
5718 IN LONG Value);
5719
5720 NTKERNELAPI
5721 LONG
5722 FASTCALL
5723 InterlockedExchangeAdd(
5724 IN OUT LONG volatile *Addend,
5725 IN LONG Value);
5726
5727 /*
5728 * PVOID
5729 * InterlockedExchangePointer(
5730 * IN OUT PVOID VOLATILE *Target,
5731 * IN PVOID Value)
5732 */
5733 #if !defined (_M_AMD64)
5734 #define InterlockedExchangePointer(Target, Value) \
5735 ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
5736 #endif
5737
5738 /*
5739 * PVOID
5740 * InterlockedCompareExchangePointer(
5741 * IN OUT PVOID *Destination,
5742 * IN PVOID Exchange,
5743 * IN PVOID Comparand)
5744 */
5745 #if !defined (_M_AMD64)
5746 #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
5747 ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
5748 #endif
5749
5750 #if defined (_M_AMD64)
5751 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
5752 #define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
5753 #define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
5754 #define InterlockedAnd _InterlockedAnd
5755 #define InterlockedOr _InterlockedOr
5756 #define InterlockedXor _InterlockedXor
5757 #define InterlockedIncrement _InterlockedIncrement
5758 #define InterlockedDecrement _InterlockedDecrement
5759 #define InterlockedAdd _InterlockedAdd
5760 #define InterlockedExchange _InterlockedExchange
5761 #define InterlockedExchangeAdd _InterlockedExchangeAdd
5762 #define InterlockedCompareExchange _InterlockedCompareExchange
5763 #define InterlockedAnd64 _InterlockedAnd64
5764 #define InterlockedOr64 _InterlockedOr64
5765 #define InterlockedXor64 _InterlockedXor64
5766 #define InterlockedIncrement64 _InterlockedIncrement64
5767 #define InterlockedDecrement64 _InterlockedDecrement64
5768 #define InterlockedAdd64 _InterlockedAdd64
5769 #define InterlockedExchange64 _InterlockedExchange64
5770 #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
5771 #define InterlockedCompareExchange64 _InterlockedCompareExchange64
5772 #define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
5773 #define InterlockedExchangePointer _InterlockedExchangePointer
5774
5775 #define ExInterlockedPopEntrySList(Head, Lock) ExpInterlockedPopEntrySList(Head)
5776 #define ExInterlockedPushEntrySList(Head, Entry, Lock) ExpInterlockedPushEntrySList(Head, Entry)
5777 #define ExInterlockedFlushSList(Head) ExpInterlockedFlushSList(Head)
5778
5779 #if !defined(_WINBASE_)
5780 #define InterlockedPopEntrySList(Head) ExpInterlockedPopEntrySList(Head)
5781 #define InterlockedPushEntrySList(Head, Entry) ExpInterlockedPushEntrySList(Head, Entry)
5782 #define InterlockedFlushSList(Head) ExpInterlockedFlushSList(Head)
5783 #define QueryDepthSList(Head) ExQueryDepthSList(Head)
5784 #endif // !defined(_WINBASE_
5785
5786 #endif // defined (_WIN64)
5787
5788 #endif /* !__INTERLOCKED_DECLARED */
5789
5790 NTKERNELAPI
5791 VOID
5792 FASTCALL
5793 KefAcquireSpinLockAtDpcLevel(
5794 IN PKSPIN_LOCK SpinLock);
5795
5796 NTKERNELAPI
5797 VOID
5798 FASTCALL
5799 KefReleaseSpinLockFromDpcLevel(
5800 IN PKSPIN_LOCK SpinLock);
5801
5802 NTHALAPI
5803 KIRQL
5804 FASTCALL
5805 KfAcquireSpinLock(
5806 IN PKSPIN_LOCK SpinLock);
5807
5808 NTHALAPI
5809 VOID
5810 FASTCALL
5811 KfReleaseSpinLock(
5812 IN PKSPIN_LOCK SpinLock,
5813 IN KIRQL NewIrql);
5814
5815 NTKERNELAPI
5816 BOOLEAN
5817 FASTCALL
5818 KeTryToAcquireSpinLockAtDpcLevel(
5819 IN OUT PKSPIN_LOCK SpinLock
5820 );
5821
5822 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
5823 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
5824 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
5825 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
5826
5827 #define RtlCopyMemoryNonTemporal RtlCopyMemory
5828
5829 #define KeGetDcacheFillSize() 1L
5830
5831
5832
5833 /*
5834 ** Utillity functions
5835 */
5836
5837 #define ARGUMENT_PRESENT(ArgumentPointer) \
5838 ((CHAR*)((ULONG_PTR)(ArgumentPointer)) != (CHAR*)NULL)
5839
5840 /*
5841 * ULONG
5842 * BYTE_OFFSET(
5843 * IN PVOID Va)
5844 */
5845 #define BYTE_OFFSET(Va) \
5846 ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
5847
5848 /*
5849 * ULONG
5850 * BYTES_TO_PAGES(
5851 * IN ULONG Size)
5852 */
5853 #define BYTES_TO_PAGES(Size) \
5854 ((ULONG) ((ULONG_PTR) (Size) >> PAGE_SHIFT) + (((ULONG) (Size) & (PAGE_SIZE - 1)) != 0))
5855
5856 /*
5857 * PCHAR
5858 * CONTAINING_RECORD(
5859 * IN PCHAR Address,
5860 * IN TYPE Type,
5861 * IN PCHAR Field);
5862 */
5863 #ifndef CONTAINING_RECORD
5864 #define CONTAINING_RECORD(address, type, field) \
5865 ((type *)(((ULONG_PTR)address) - (ULONG_PTR)(&(((type *)0)->field))))
5866 #endif
5867
5868 /* LONG
5869 * FIELD_OFFSET(
5870 * IN TYPE Type,
5871 * IN PCHAR Field);
5872 */
5873 #ifndef FIELD_OFFSET
5874 #define FIELD_OFFSET(Type, Field) \
5875 ((LONG) (&(((Type *) 0)->Field)))
5876 #endif
5877
5878 /*
5879 * PVOID
5880 * PAGE_ALIGN(
5881 * IN PVOID Va)
5882 */
5883 #define PAGE_ALIGN(Va) \
5884 ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
5885
5886 /*
5887 * ULONG_PTR
5888 * ROUND_TO_PAGES(
5889 * IN ULONG_PTR Size)
5890 */
5891 #define ROUND_TO_PAGES(Size) \
5892 ((ULONG_PTR) (((ULONG_PTR) Size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1)))
5893
5894 NTSYSAPI
5895 VOID
5896 NTAPI
5897 RtlAssert(
5898 IN PVOID FailedAssertion,
5899 IN PVOID FileName,
5900 IN ULONG LineNumber,
5901 IN PCHAR Message);
5902
5903 #ifdef DBG
5904
5905 #define ASSERT(exp) \
5906 (VOID)((!(exp)) ? \
5907 RtlAssert( #exp, __FILE__, __LINE__, NULL ), FALSE : TRUE)
5908
5909 #define ASSERTMSG(msg, exp) \
5910 (VOID)((!(exp)) ? \
5911 RtlAssert( #exp, __FILE__, __LINE__, msg ), FALSE : TRUE)
5912
5913 #define RTL_SOFT_ASSERT(exp) \
5914 (VOID)((!(_exp)) ? \
5915 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE)
5916
5917 #define RTL_SOFT_ASSERTMSG(msg, exp) \
5918 (VOID)((!(exp)) ? \
5919 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE)
5920
5921 #define RTL_VERIFY(exp) ASSERT(exp)
5922 #define RTL_VERIFYMSG(msg, exp) ASSERT(msg, exp)
5923
5924 #define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
5925 #define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
5926
5927 #else /* !DBG */
5928
5929 #define ASSERT(exp) ((VOID) 0)
5930 #define ASSERTMSG(msg, exp) ((VOID) 0)
5931
5932 #define RTL_SOFT_ASSERT(exp) ((VOID) 0)
5933 #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
5934
5935 #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
5936 #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
5937
5938 #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
5939 #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
5940
5941 #endif /* DBG */
5942
5943 /* HACK HACK HACK - GCC (or perhaps LD) is messing this up */
5944 #if defined(_NTSYSTEM_) || defined(__GNUC__)
5945 #define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag
5946 #define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag
5947 #else
5948 #define NLS_MB_CODE_PAGE_TAG (*NlsMbCodePageTag)
5949 #define NLS_MB_OEM_CODE_PAGE_TAG (*NlsMbOemCodePageTag)
5950 #endif /* _NT_SYSTEM */
5951
5952 extern BOOLEAN NTSYSAPI NLS_MB_CODE_PAGE_TAG;
5953 extern BOOLEAN NTSYSAPI NLS_MB_OEM_CODE_PAGE_TAG;
5954
5955 /*
5956 ** Driver support routines
5957 */
5958
5959 /** Runtime library routines **/
5960
5961 static __inline VOID
5962 InitializeListHead(
5963 IN PLIST_ENTRY ListHead)
5964 {
5965 ListHead->Flink = ListHead->Blink = ListHead;
5966 }
5967
5968 static __inline VOID
5969 InsertHeadList(
5970 IN PLIST_ENTRY ListHead,
5971 IN PLIST_ENTRY Entry)
5972 {
5973 PLIST_ENTRY OldFlink;
5974 OldFlink = ListHead->Flink;
5975 Entry->Flink = OldFlink;
5976 Entry->Blink = ListHead;
5977 OldFlink->Blink = Entry;
5978 ListHead->Flink = Entry;
5979 }
5980
5981 static __inline VOID
5982 InsertTailList(
5983 IN PLIST_ENTRY ListHead,
5984 IN PLIST_ENTRY Entry)
5985 {
5986 PLIST_ENTRY OldBlink;
5987 OldBlink = ListHead->Blink;
5988 Entry->Flink = ListHead;
5989 Entry->Blink = OldBlink;
5990 OldBlink->Flink = Entry;
5991 ListHead->Blink = Entry;
5992 }
5993
5994 /*
5995 * BOOLEAN
5996 * IsListEmpty(
5997 * IN PLIST_ENTRY ListHead)
5998 */
5999 #define IsListEmpty(_ListHead) \
6000 ((_ListHead)->Flink == (_ListHead))
6001
6002 /*
6003 * PSINGLE_LIST_ENTRY
6004 * PopEntryList(
6005 * IN PSINGLE_LIST_ENTRY ListHead)
6006 */
6007 #define PopEntryList(ListHead) \
6008 (ListHead)->Next; \
6009 { \
6010 PSINGLE_LIST_ENTRY _FirstEntry; \
6011 _FirstEntry = (ListHead)->Next; \
6012 if (_FirstEntry != NULL) \
6013 (ListHead)->Next = _FirstEntry->Next; \
6014 }
6015
6016 /*
6017 * VOID
6018 * PushEntryList(
6019 * IN PSINGLE_LIST_ENTRY ListHead,
6020 * IN PSINGLE_LIST_ENTRY Entry)
6021 */
6022 #define PushEntryList(_ListHead, _Entry) \
6023 (_Entry)->Next = (_ListHead)->Next; \
6024 (_ListHead)->Next = (_Entry); \
6025
6026 static __inline BOOLEAN
6027 RemoveEntryList(
6028 IN PLIST_ENTRY Entry)
6029 {
6030 PLIST_ENTRY OldFlink;
6031 PLIST_ENTRY OldBlink;
6032
6033 OldFlink = Entry->Flink;
6034 OldBlink = Entry->Blink;
6035 OldFlink->Blink = OldBlink;
6036 OldBlink->Flink = OldFlink;
6037 return (OldFlink == OldBlink);
6038 }
6039
6040 static __inline PLIST_ENTRY
6041 RemoveHeadList(
6042 IN PLIST_ENTRY ListHead)
6043 {
6044 PLIST_ENTRY Flink;
6045 PLIST_ENTRY Entry;
6046
6047 Entry = ListHead->Flink;
6048 Flink = Entry->Flink;
6049 ListHead->Flink = Flink;
6050 Flink->Blink = ListHead;
6051 return Entry;
6052 }
6053
6054 static __inline PLIST_ENTRY
6055 RemoveTailList(
6056 IN PLIST_ENTRY ListHead)
6057 {
6058 PLIST_ENTRY Blink;
6059 PLIST_ENTRY Entry;
6060
6061 Entry = ListHead->Blink;
6062 Blink = Entry->Blink;
6063 ListHead->Blink = Blink;
6064 Blink->Flink = ListHead;
6065 return Entry;
6066 }
6067
6068 #if !defined(_WINBASE_) || _WIN32_WINNT < 0x0501
6069
6070 NTKERNELAPI
6071 PSLIST_ENTRY
6072 FASTCALL
6073 InterlockedPopEntrySList(
6074 IN PSLIST_HEADER ListHead);
6075
6076 NTKERNELAPI
6077 PSLIST_ENTRY
6078 FASTCALL
6079 InterlockedPushEntrySList(
6080 IN PSLIST_HEADER ListHead,
6081 IN PSLIST_ENTRY ListEntry);
6082
6083 #endif
6084
6085 /*
6086 * USHORT
6087 * QueryDepthSList(
6088 * IN PSLIST_HEADER SListHead)
6089 */
6090 #define QueryDepthSList(_SListHead) \
6091 ((USHORT) ((_SListHead)->Alignment & 0xffff))
6092
6093 #define InterlockedFlushSList(ListHead) ExInterlockedFlushSList(ListHead)
6094
6095 NTSYSAPI
6096 ULONG
6097 NTAPI
6098 RtlxAnsiStringToUnicodeSize(
6099 IN PCANSI_STRING AnsiString);
6100
6101 #define RtlAnsiStringToUnicodeSize(STRING) ( \
6102 NLS_MB_CODE_PAGE_TAG ? \
6103 RtlxAnsiStringToUnicodeSize(STRING) : \
6104 ((STRING)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
6105 )
6106
6107 NTSYSAPI
6108 NTSTATUS
6109 NTAPI
6110 RtlAnsiStringToUnicodeString(
6111 IN OUT PUNICODE_STRING DestinationString,
6112 IN PANSI_STRING SourceString,
6113 IN BOOLEAN AllocateDestinationString);
6114
6115 NTSYSAPI
6116 NTSTATUS
6117 NTAPI
6118 RtlAppendUnicodeStringToString(
6119 IN OUT PUNICODE_STRING Destination,
6120 IN PCUNICODE_STRING Source);
6121
6122 NTSYSAPI
6123 NTSTATUS
6124 NTAPI
6125 RtlAppendUnicodeToString(
6126 IN OUT PUNICODE_STRING Destination,
6127 IN PCWSTR Source);
6128
6129 NTSYSAPI
6130 BOOLEAN
6131 NTAPI
6132 RtlAreBitsClear(
6133 IN PRTL_BITMAP BitMapHeader,
6134 IN ULONG StartingIndex,
6135 IN ULONG Length);
6136
6137 NTSYSAPI
6138 BOOLEAN
6139 NTAPI
6140 RtlAreBitsSet(
6141 IN PRTL_BITMAP BitMapHeader,
6142 IN ULONG StartingIndex,
6143 IN ULONG Length);
6144
6145 NTSYSAPI
6146 NTSTATUS
6147 NTAPI
6148 RtlCharToInteger(
6149 IN PCSZ String,
6150 IN ULONG Base OPTIONAL,
6151 IN OUT PULONG Value);
6152
6153 #if 0
6154 NTSYSAPI
6155 ULONG
6156 NTAPI
6157 RtlCheckBit(
6158 IN PRTL_BITMAP BitMapHeader,
6159 IN ULONG BitPosition);
6160 #endif
6161
6162 NTSYSAPI
6163 NTSTATUS
6164 NTAPI
6165 RtlCheckRegistryKey(
6166 IN ULONG RelativeTo,
6167 IN PWSTR Path);
6168
6169 NTSYSAPI
6170 VOID
6171 NTAPI
6172 RtlClearAllBits(
6173 IN PRTL_BITMAP BitMapHeader);
6174
6175 NTSYSAPI
6176 VOID
6177 NTAPI
6178 RtlClearBit(
6179 PRTL_BITMAP BitMapHeader,
6180 ULONG BitNumber);
6181
6182 NTSYSAPI
6183 VOID
6184 NTAPI
6185 RtlClearBits(
6186 IN PRTL_BITMAP BitMapHeader,
6187 IN ULONG StartingIndex,
6188 IN ULONG NumberToClear);
6189
6190 NTSYSAPI
6191 SIZE_T
6192 NTAPI
6193 RtlCompareMemory(
6194 IN CONST VOID *Source1,
6195 IN CONST VOID *Source2,
6196 IN SIZE_T Length);
6197
6198 NTSYSAPI
6199 LONG
6200 NTAPI
6201 RtlCompareString(
6202 IN PSTRING String1,
6203 IN PSTRING String2,
6204 BOOLEAN CaseInSensitive);
6205
6206 NTSYSAPI
6207 LONG
6208 NTAPI
6209 RtlCompareUnicodeString(
6210 IN PCUNICODE_STRING String1,
6211 IN PCUNICODE_STRING String2,
6212 IN BOOLEAN CaseInSensitive);
6213
6214 static __inline
6215 LARGE_INTEGER
6216 NTAPI_INLINE
6217 RtlConvertLongToLargeInteger(LONG SignedInteger)
6218 {
6219 LARGE_INTEGER Result;
6220
6221 Result.QuadPart = SignedInteger;
6222 return Result;
6223 }
6224
6225 NTSYSAPI
6226 LUID
6227 NTAPI
6228 RtlConvertLongToLuid(
6229 IN LONG Long);
6230
6231 NTSYSAPI
6232 LARGE_INTEGER
6233 NTAPI
6234 RtlConvertUlongToLargeInteger(
6235 IN ULONG UnsignedInteger);
6236
6237 NTSYSAPI
6238 LUID
6239 NTAPI
6240 RtlConvertUlongToLuid(
6241 ULONG Ulong);
6242
6243 /*
6244 * VOID
6245 * RtlCopyMemory(
6246 * IN VOID UNALIGNED *Destination,
6247 * IN CONST VOID UNALIGNED *Source,
6248 * IN SIZE_T Length)
6249 */
6250 #ifndef RtlCopyMemory
6251 #define RtlCopyMemory(Destination, Source, Length) \
6252 memcpy(Destination, Source, Length)
6253 #endif
6254
6255 #ifndef RtlCopyBytes
6256 #define RtlCopyBytes RtlCopyMemory
6257 #endif
6258
6259 NTSYSAPI
6260 VOID
6261 NTAPI
6262 RtlCopyMemory32(
6263 IN VOID UNALIGNED *Destination,
6264 IN CONST VOID UNALIGNED *Source,
6265 IN ULONG Length);
6266
6267 NTSYSAPI
6268 VOID
6269 NTAPI
6270 RtlCopyString(
6271 IN OUT PSTRING DestinationString,
6272 IN PSTRING SourceString OPTIONAL);
6273
6274 NTSYSAPI
6275 VOID
6276 NTAPI
6277 RtlCopyUnicodeString(
6278 IN OUT PUNICODE_STRING DestinationString,
6279 IN PCUNICODE_STRING SourceString);
6280
6281 NTSYSAPI
6282 NTSTATUS
6283 NTAPI
6284 RtlCreateRegistryKey(
6285 IN ULONG RelativeTo,
6286 IN PWSTR Path);
6287
6288 NTSYSAPI
6289 NTSTATUS
6290 NTAPI
6291 RtlCreateSecurityDescriptor(
6292 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
6293 IN ULONG Revision);
6294
6295 NTSYSAPI
6296 NTSTATUS
6297 NTAPI
6298 RtlDeleteRegistryValue(
6299 IN ULONG RelativeTo,
6300 IN PCWSTR Path,
6301 IN PCWSTR ValueName);
6302
6303 /*
6304 * BOOLEAN
6305 * RtlEqualLuid(
6306 * IN PLUID Luid1,
6307 * IN PLUID Luid2)
6308 */
6309 #define RtlEqualLuid(Luid1, \
6310 Luid2) \
6311 (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
6312
6313 /*
6314 * ULONG
6315 * RtlEqualMemory(
6316 * IN VOID UNALIGNED *Destination,
6317 * IN CONST VOID UNALIGNED *Source,
6318 * IN SIZE_T Length)
6319 */
6320 #define RtlEqualMemory(Destination, Source, Length) (!memcmp(Destination, Source, Length))
6321
6322 NTSYSAPI
6323 BOOLEAN
6324 NTAPI
6325 RtlEqualString(
6326 IN PSTRING String1,
6327 IN PSTRING String2,
6328 IN BOOLEAN CaseInSensitive);
6329
6330 NTSYSAPI
6331 BOOLEAN
6332 NTAPI
6333 RtlEqualUnicodeString(
6334 IN CONST UNICODE_STRING *String1,
6335 IN CONST UNICODE_STRING *String2,
6336 IN BOOLEAN CaseInSensitive);
6337
6338 /*
6339 * VOID
6340 * RtlFillMemory(
6341 * IN VOID UNALIGNED *Destination,
6342 * IN SIZE_T Length,
6343 * IN UCHAR Fill)
6344 */
6345 #ifndef RtlFillMemory
6346 #define RtlFillMemory(Destination, Length, Fill) \
6347 memset(Destination, Fill, Length)
6348 #endif
6349
6350 #ifndef RtlFillBytes
6351 #define RtlFillBytes RtlFillMemory
6352 #endif
6353
6354 NTSYSAPI
6355 ULONG
6356 NTAPI
6357 RtlFindClearBits(
6358 IN PRTL_BITMAP BitMapHeader,
6359 IN ULONG NumberToFind,
6360 IN ULONG HintIndex);
6361
6362 NTSYSAPI
6363 ULONG
6364 NTAPI
6365 RtlFindClearBitsAndSet(
6366 IN PRTL_BITMAP BitMapHeader,
6367 IN ULONG NumberToFind,
6368 IN ULONG HintIndex);
6369
6370 NTSYSAPI
6371 ULONG
6372 NTAPI
6373 RtlFindClearRuns(
6374 IN PRTL_BITMAP BitMapHeader,
6375 OUT PRTL_BITMAP_RUN RunArray,
6376 IN ULONG SizeOfRunArray,
6377 IN BOOLEAN LocateLongestRuns);
6378
6379 NTSYSAPI
6380 ULONG
6381 NTAPI
6382 RtlFindFirstRunClear(
6383 IN PRTL_BITMAP BitMapHeader,
6384 OUT PULONG StartingIndex);
6385
6386 NTSYSAPI
6387 ULONG
6388 NTAPI
6389 RtlFindLastBackwardRunClear(
6390 IN PRTL_BITMAP BitMapHeader,
6391 IN ULONG FromIndex,
6392 OUT PULONG StartingRunIndex);
6393
6394 NTSYSAPI
6395 CCHAR
6396 NTAPI
6397 RtlFindLeastSignificantBit(
6398 IN ULONGLONG Set);
6399
6400 NTSYSAPI
6401 ULONG
6402 NTAPI
6403 RtlFindLongestRunClear(
6404 IN PRTL_BITMAP BitMapHeader,
6405 OUT PULONG StartingIndex);
6406
6407 NTSYSAPI
6408 CCHAR
6409 NTAPI
6410 RtlFindMostSignificantBit(
6411 IN ULONGLONG Set);
6412
6413 NTSYSAPI
6414 ULONG
6415 NTAPI
6416 RtlFindNextForwardRunClear(
6417 IN PRTL_BITMAP BitMapHeader,
6418 IN ULONG FromIndex,
6419 OUT PULONG StartingRunIndex);
6420
6421 NTSYSAPI
6422 ULONG
6423 NTAPI
6424 RtlFindSetBits(
6425 IN PRTL_BITMAP BitMapHeader,
6426 IN ULONG NumberToFind,
6427 IN ULONG HintIndex);
6428
6429 NTSYSAPI
6430 ULONG
6431 NTAPI
6432 RtlFindSetBitsAndClear(
6433 IN PRTL_BITMAP BitMapHeader,
6434 IN ULONG NumberToFind,
6435 IN ULONG HintIndex);
6436
6437 NTSYSAPI
6438 VOID
6439 NTAPI
6440 RtlFreeAnsiString(
6441 IN PANSI_STRING AnsiString);
6442
6443 NTSYSAPI
6444 VOID
6445 NTAPI
6446 RtlFreeUnicodeString(
6447 IN PUNICODE_STRING UnicodeString);
6448
6449 NTSYSAPI
6450 VOID
6451 NTAPI
6452 RtlGetCallersAddress(
6453 OUT PVOID *CallersAddress,
6454 OUT PVOID *CallersCaller);
6455
6456 NTSYSAPI
6457 NTSTATUS
6458 NTAPI
6459 RtlGetVersion(
6460 IN OUT PRTL_OSVERSIONINFOW lpVersionInformation);
6461
6462 NTSYSAPI
6463 NTSTATUS
6464 NTAPI
6465 RtlGUIDFromString(
6466 IN PUNICODE_STRING GuidString,
6467 OUT GUID *Guid);
6468
6469 NTSYSAPI
6470 NTSTATUS
6471 NTAPI
6472 RtlHashUnicodeString(
6473 IN CONST UNICODE_STRING *String,
6474 IN BOOLEAN CaseInSensitive,
6475 IN ULONG HashAlgorithm,
6476 OUT PULONG HashValue);
6477
6478 NTSYSAPI
6479 VOID
6480 NTAPI
6481 RtlInitAnsiString(
6482 IN OUT PANSI_STRING DestinationString,
6483 IN PCSZ SourceString);
6484
6485 NTSYSAPI
6486 VOID
6487 NTAPI
6488 RtlInitializeBitMap(
6489 IN PRTL_BITMAP BitMapHeader,
6490 IN PULONG BitMapBuffer,
6491 IN ULONG SizeOfBitMap);
6492
6493 NTSYSAPI
6494 VOID
6495 NTAPI
6496 RtlInitString(
6497 IN OUT PSTRING DestinationString,
6498 IN PCSZ SourceString);
6499
6500 NTSYSAPI
6501 VOID
6502 NTAPI
6503 RtlInitUnicodeString(
6504 IN OUT PUNICODE_STRING DestinationString,
6505 IN PCWSTR SourceString);
6506
6507 NTSYSAPI
6508 NTSTATUS
6509 NTAPI
6510 RtlInt64ToUnicodeString(
6511 IN ULONGLONG Value,
6512 IN ULONG Base OPTIONAL,
6513 IN OUT PUNICODE_STRING String);
6514
6515 NTSYSAPI
6516 NTSTATUS
6517 NTAPI
6518 RtlIntegerToUnicodeString(
6519 IN ULONG Value,
6520 IN ULONG Base OPTIONAL,
6521 IN OUT PUNICODE_STRING String);
6522
6523 NTSYSAPI
6524 NTSTATUS
6525 NTAPI
6526 RtlIntPtrToUnicodeString(
6527 PLONG Value,
6528 ULONG Base OPTIONAL,
6529 PUNICODE_STRING String);
6530
6531 /*
6532 * BOOLEAN
6533 * RtlIsZeroLuid(
6534 * IN PLUID L1)
6535 */
6536 #define RtlIsZeroLuid(_L1) \
6537 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
6538
6539 NTSYSAPI
6540 ULONG
6541 NTAPI
6542 RtlLengthSecurityDescriptor(
6543 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
6544
6545 NTSYSAPI
6546 VOID
6547 NTAPI
6548 RtlMapGenericMask(
6549 IN OUT PACCESS_MASK AccessMask,
6550 IN PGENERIC_MAPPING GenericMapping);
6551
6552 /*
6553 * VOID
6554 * RtlMoveMemory(
6555 * IN VOID UNALIGNED *Destination,
6556 * IN CONST VOID UNALIGNED *Source,
6557 * IN SIZE_T Length)
6558 */
6559 #define RtlMoveMemory memmove
6560
6561 NTSYSAPI
6562 ULONG
6563 NTAPI
6564 RtlNumberOfClearBits(
6565 IN PRTL_BITMAP BitMapHeader);
6566
6567 NTSYSAPI
6568 ULONG
6569 NTAPI
6570 RtlNumberOfSetBits(
6571 IN PRTL_BITMAP BitMapHeader);
6572
6573 NTSYSAPI
6574 VOID
6575 FASTCALL
6576 RtlPrefetchMemoryNonTemporal(
6577 IN PVOID Source,
6578 IN SIZE_T Length);
6579
6580 NTSYSAPI
6581 BOOLEAN
6582 NTAPI
6583 RtlPrefixUnicodeString(
6584 IN PCUNICODE_STRING String1,
6585 IN PCUNICODE_STRING String2,
6586 IN BOOLEAN CaseInSensitive);
6587
6588 NTSYSAPI
6589 NTSTATUS
6590 NTAPI
6591 RtlQueryRegistryValues(
6592 IN ULONG RelativeTo,
6593 IN PCWSTR Path,
6594 IN PRTL_QUERY_REGISTRY_TABLE QueryTable,
6595 IN PVOID Context,
6596 IN PVOID Environment OPTIONAL);
6597
6598
6599 #define LONG_SIZE (sizeof(LONG))
6600 #define LONG_MASK (LONG_SIZE - 1)
6601
6602 /*
6603 * VOID
6604 * RtlRetrieveUlong (
6605 * PULONG DestinationAddress,
6606 * PULONG SourceAddress
6607 * );
6608 */
6609 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
6610 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
6611 { \
6612 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
6613 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
6614 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
6615 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
6616 } \
6617 else \
6618 { \
6619 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
6620 }
6621
6622 NTSYSAPI
6623 VOID
6624 NTAPI
6625 RtlRetrieveUshort(
6626 IN OUT PUSHORT DestinationAddress,
6627 IN PUSHORT SourceAddress);
6628
6629 NTSYSAPI
6630 VOID
6631 NTAPI
6632 RtlSetAllBits(
6633 IN PRTL_BITMAP BitMapHeader);
6634
6635 NTSYSAPI
6636 VOID
6637 NTAPI
6638 RtlSetBit(
6639 PRTL_BITMAP BitMapHeader,
6640 ULONG BitNumber);
6641
6642 NTSYSAPI
6643 VOID
6644 NTAPI
6645 RtlSetBits(
6646 IN PRTL_BITMAP BitMapHeader,
6647 IN ULONG StartingIndex,
6648 IN ULONG NumberToSet);
6649
6650 NTSYSAPI
6651 NTSTATUS
6652 NTAPI
6653 RtlSetDaclSecurityDescriptor(
6654 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
6655 IN BOOLEAN DaclPresent,
6656 IN PACL Dacl OPTIONAL,
6657 IN BOOLEAN DaclDefaulted OPTIONAL);
6658
6659 NTSYSAPI
6660 VOID
6661 NTAPI
6662 RtlStoreUlong(
6663 IN PULONG Address,
6664 IN ULONG Value);
6665
6666 NTSYSAPI
6667 VOID
6668 NTAPI
6669 RtlStoreUlonglong(
6670 IN OUT PULONGLONG Address,
6671 ULONGLONG Value);
6672
6673 NTSYSAPI
6674 VOID
6675 NTAPI
6676 RtlStoreUlongPtr(
6677 IN OUT PULONG_PTR Address,
6678 IN ULONG_PTR Value);
6679
6680 NTSYSAPI
6681 VOID
6682 NTAPI
6683 RtlStoreUshort(
6684 IN PUSHORT Address,
6685 IN USHORT Value);
6686
6687 NTSYSAPI
6688 NTSTATUS
6689 NTAPI
6690 RtlStringFromGUID(
6691 IN REFGUID Guid,
6692 OUT PUNICODE_STRING GuidString);
6693
6694 NTSYSAPI
6695 BOOLEAN
6696 NTAPI
6697 RtlTestBit(
6698 IN PRTL_BITMAP BitMapHeader,
6699 IN ULONG BitNumber);
6700
6701 NTSYSAPI
6702 BOOLEAN
6703 NTAPI
6704 RtlTimeFieldsToTime(
6705 IN PTIME_FIELDS TimeFields,
6706 IN PLARGE_INTEGER Time);
6707
6708 NTSYSAPI
6709 VOID
6710 NTAPI
6711 RtlTimeToTimeFields(
6712 IN PLARGE_INTEGER Time,
6713 IN PTIME_FIELDS TimeFields);
6714
6715 ULONG
6716 FASTCALL
6717 RtlUlongByteSwap(
6718 IN ULONG Source);
6719
6720 ULONGLONG
6721 FASTCALL
6722 RtlUlonglongByteSwap(
6723 IN ULONGLONG Source);
6724
6725 #define RtlUnicodeStringToAnsiSize(STRING) ( \
6726 NLS_MB_CODE_PAGE_TAG ? \
6727 RtlxUnicodeStringToAnsiSize(STRING) : \
6728 ((STRING)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
6729 )
6730
6731 FORCEINLINE
6732 VOID
6733 RtlInitEmptyUnicodeString(OUT PUNICODE_STRING UnicodeString,
6734 IN PWSTR Buffer,
6735 IN USHORT BufferSize)
6736 {
6737 UnicodeString->Length = 0;
6738 UnicodeString->MaximumLength = BufferSize;
6739 UnicodeString->Buffer = Buffer;
6740 }
6741
6742 FORCEINLINE
6743 VOID
6744 RtlInitEmptyAnsiString(OUT PANSI_STRING AnsiString,
6745 IN PCHAR Buffer,
6746 IN USHORT BufferSize)
6747 {
6748 AnsiString->Length = 0;
6749 AnsiString->MaximumLength = BufferSize;
6750 AnsiString->Buffer = Buffer;
6751 }
6752
6753 NTSYSAPI
6754 NTSTATUS
6755 NTAPI
6756 RtlUnicodeStringToAnsiString(
6757 IN OUT PANSI_STRING DestinationString,
6758 IN PCUNICODE_STRING SourceString,
6759 IN BOOLEAN AllocateDestinationString);
6760
6761 NTSYSAPI
6762 NTSTATUS
6763 NTAPI
6764 RtlUnicodeStringToInteger(
6765 IN PCUNICODE_STRING String,
6766 IN ULONG Base OPTIONAL,
6767 OUT PULONG Value);
6768
6769 NTSYSAPI
6770 WCHAR
6771 NTAPI
6772 RtlUpcaseUnicodeChar(
6773 IN WCHAR SourceCharacter);
6774
6775 NTSYSAPI
6776 NTSTATUS
6777 NTAPI
6778 RtlUpcaseUnicodeString(
6779 IN OUT PUNICODE_STRING DestinationString OPTIONAL,
6780 IN PCUNICODE_STRING SourceString,
6781 IN BOOLEAN AllocateDestinationString);
6782
6783 NTSYSAPI
6784 CHAR
6785 NTAPI
6786 RtlUpperChar(
6787 IN CHAR Character);
6788
6789 NTSYSAPI
6790 VOID
6791 NTAPI
6792 RtlUpperString(
6793 IN OUT PSTRING DestinationString,
6794 IN PSTRING SourceString);
6795
6796 USHORT
6797 FASTCALL
6798 RtlUshortByteSwap(
6799 IN USHORT Source);
6800
6801 NTSYSAPI
6802 BOOLEAN
6803 NTAPI
6804 RtlValidRelativeSecurityDescriptor(
6805 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput,
6806 IN ULONG SecurityDescriptorLength,
6807 IN SECURITY_INFORMATION RequiredInformation);
6808
6809 NTSYSAPI
6810 BOOLEAN
6811 NTAPI
6812 RtlValidSecurityDescriptor(
6813 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
6814
6815 NTSYSAPI
6816 NTSTATUS
6817 NTAPI
6818 RtlVerifyVersionInfo(
6819 IN PRTL_OSVERSIONINFOEXW VersionInfo,
6820 IN ULONG TypeMask,
6821 IN ULONGLONG ConditionMask);
6822
6823 NTSYSAPI
6824 NTSTATUS
6825 NTAPI
6826 RtlVolumeDeviceToDosName(
6827 IN PVOID VolumeDeviceObject,
6828 OUT PUNICODE_STRING DosName);
6829
6830 NTSYSAPI
6831 ULONG
6832 NTAPI
6833 RtlWalkFrameChain(
6834 OUT PVOID *Callers,
6835 IN ULONG Count,
6836 IN ULONG Flags);
6837
6838 NTSYSAPI
6839 NTSTATUS
6840 NTAPI
6841 RtlWriteRegistryValue(
6842 IN ULONG RelativeTo,
6843 IN PCWSTR Path,
6844 IN PCWSTR ValueName,
6845 IN ULONG ValueType,
6846 IN PVOID ValueData,
6847 IN ULONG ValueLength);
6848
6849 NTSYSAPI
6850 ULONG
6851 NTAPI
6852 RtlxUnicodeStringToAnsiSize(
6853 IN PCUNICODE_STRING UnicodeString);
6854
6855 /*
6856 * VOID
6857 * RtlZeroMemory(
6858 * IN VOID UNALIGNED *Destination,
6859 * IN SIZE_T Length)
6860 */
6861 #ifndef RtlZeroMemory
6862 #define RtlZeroMemory(Destination, Length) \
6863 memset(Destination, 0, Length)
6864 #endif
6865
6866 #ifndef RtlZeroBytes
6867 #define RtlZeroBytes RtlZeroMemory
6868 #endif
6869
6870 NTKERNELAPI
6871 BOOLEAN
6872 NTAPI
6873 KeAreAllApcsDisabled(
6874 VOID
6875 );
6876
6877 /* Guarded Mutex routines */
6878
6879 NTKERNELAPI
6880 VOID
6881 FASTCALL
6882 KeAcquireGuardedMutex(
6883 IN OUT PKGUARDED_MUTEX GuardedMutex
6884 );
6885
6886 NTKERNELAPI
6887 VOID
6888 FASTCALL
6889 KeAcquireGuardedMutexUnsafe(
6890 IN OUT PKGUARDED_MUTEX GuardedMutex
6891 );
6892
6893 NTKERNELAPI
6894 VOID
6895 NTAPI
6896 KeEnterGuardedRegion(
6897 VOID
6898 );
6899
6900 NTKERNELAPI
6901 VOID
6902 NTAPI
6903 KeLeaveGuardedRegion(
6904 VOID
6905 );
6906
6907 NTKERNELAPI
6908 VOID
6909 FASTCALL
6910 KeInitializeGuardedMutex(
6911 OUT PKGUARDED_MUTEX GuardedMutex
6912 );
6913
6914 NTKERNELAPI
6915 VOID
6916 FASTCALL
6917 KeReleaseGuardedMutexUnsafe(
6918 IN OUT PKGUARDED_MUTEX GuardedMutex
6919 );
6920
6921 NTKERNELAPI
6922 VOID
6923 FASTCALL
6924 KeReleaseGuardedMutex(
6925 IN OUT PKGUARDED_MUTEX GuardedMutex
6926 );
6927
6928 NTKERNELAPI
6929 BOOLEAN
6930 FASTCALL
6931 KeTryToAcquireGuardedMutex(
6932 IN OUT PKGUARDED_MUTEX GuardedMutex
6933 );
6934
6935 NTKERNELAPI
6936 BOOLEAN
6937 FASTCALL
6938 ExAcquireRundownProtectionEx(
6939 IN OUT PEX_RUNDOWN_REF RunRef,
6940 IN ULONG Count
6941 );
6942
6943 NTKERNELAPI
6944 VOID
6945 FASTCALL
6946 ExReleaseRundownProtectionEx(
6947 IN OUT PEX_RUNDOWN_REF RunRef,
6948 IN ULONG Count
6949 );
6950
6951 /* Fast Mutex */
6952 #define ExInitializeFastMutex(_FastMutex) \
6953 { \
6954 (_FastMutex)->Count = FM_LOCK_BIT; \
6955 (_FastMutex)->Owner = NULL; \
6956 (_FastMutex)->Contention = 0; \
6957 KeInitializeEvent(&(_FastMutex)->Gate, SynchronizationEvent, FALSE); \
6958 }
6959
6960 NTKERNELAPI
6961 VOID
6962 FASTCALL
6963 ExAcquireFastMutexUnsafe(IN OUT PFAST_MUTEX FastMutex);
6964
6965 NTKERNELAPI
6966 VOID
6967 FASTCALL
6968 ExReleaseFastMutexUnsafe(IN OUT PFAST_MUTEX FastMutex);
6969
6970 #if defined(_NTHAL_) && defined(_X86_)
6971 NTKERNELAPI
6972 VOID
6973 FASTCALL
6974 ExiAcquireFastMutex(IN OUT PFAST_MUTEX FastMutex);
6975
6976 NTKERNELAPI
6977 VOID
6978 FASTCALL
6979 ExiReleaseFastMutex(IN OUT PFAST_MUTEX FastMutex);
6980
6981 NTKERNELAPI
6982 BOOLEAN
6983 FASTCALL
6984 ExiTryToAcquireFastMutex(IN OUT PFAST_MUTEX FastMutex);
6985
6986 #define ExAcquireFastMutex(FastMutex) ExiAcquireFastMutex(FastMutex)
6987 #define ExReleaseFastMutex(FastMutex) ExiReleaseFastMutex(FastMutex)
6988 #define ExTryToAcquireFastMutex(FastMutex) ExiTryToAcquireFastMutex(FastMutex)
6989
6990 #else
6991
6992 NTKERNELAPI
6993 VOID
6994 FASTCALL
6995 ExAcquireFastMutex(IN OUT PFAST_MUTEX FastMutex);
6996
6997 NTKERNELAPI
6998 VOID
6999 FASTCALL
7000 ExReleaseFastMutex(IN OUT PFAST_MUTEX FastMutex);
7001
7002 NTKERNELAPI
7003 BOOLEAN
7004 FASTCALL
7005 ExTryToAcquireFastMutex(IN OUT PFAST_MUTEX FastMutex);
7006 #endif
7007
7008 /** Executive support routines **/
7009
7010 NTKERNELAPI
7011 BOOLEAN
7012 NTAPI
7013 ExAcquireResourceExclusiveLite(
7014 IN PERESOURCE Resource,
7015 IN BOOLEAN Wait);
7016
7017 NTKERNELAPI
7018 BOOLEAN
7019 NTAPI
7020 ExAcquireResourceSharedLite(
7021 IN PERESOURCE Resource,
7022 IN BOOLEAN Wait);
7023
7024 NTKERNELAPI
7025 BOOLEAN
7026 NTAPI
7027 ExAcquireSharedStarveExclusive(
7028 IN PERESOURCE Resource,
7029 IN BOOLEAN Wait);
7030
7031 NTKERNELAPI
7032 BOOLEAN
7033 NTAPI
7034 ExAcquireSharedWaitForExclusive(
7035 IN PERESOURCE Resource,
7036 IN BOOLEAN Wait);
7037
7038 static __inline PVOID
7039 ExAllocateFromNPagedLookasideList(
7040 IN PNPAGED_LOOKASIDE_LIST Lookaside)
7041 {
7042 PVOID Entry;
7043
7044 Lookaside->L.TotalAllocates++;
7045 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
7046 if (Entry == NULL) {
7047 Lookaside->L.AllocateMisses++;
7048 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type, Lookaside->L.Size, Lookaside->L.Tag);
7049 }
7050 return Entry;
7051 }
7052
7053 static __inline PVOID
7054 ExAllocateFromPagedLookasideList(
7055 IN PPAGED_LOOKASIDE_LIST Lookaside)
7056 {
7057 PVOID Entry;
7058
7059 Lookaside->L.TotalAllocates++;
7060 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
7061 if (Entry == NULL) {
7062 Lookaside->L.AllocateMisses++;
7063 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type, Lookaside->L.Size, Lookaside->L.Tag);
7064 }
7065 return Entry;
7066 }
7067
7068 NTKERNELAPI
7069 PVOID
7070 NTAPI
7071 ExAllocatePoolWithQuotaTag(
7072 IN POOL_TYPE PoolType,
7073 IN SIZE_T NumberOfBytes,
7074 IN ULONG Tag);
7075
7076 NTKERNELAPI
7077 PVOID
7078 NTAPI
7079 ExAllocatePoolWithTag(
7080 IN POOL_TYPE PoolType,
7081 IN SIZE_T NumberOfBytes,
7082 IN ULONG Tag);
7083
7084 #ifdef POOL_TAGGING
7085
7086 #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
7087 #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
7088
7089 #else /* !POOL_TAGGING */
7090
7091 NTKERNELAPI
7092 PVOID
7093 NTAPI
7094 ExAllocatePool(
7095 IN POOL_TYPE PoolType,
7096 IN SIZE_T NumberOfBytes);
7097
7098 NTKERNELAPI
7099 PVOID
7100 NTAPI
7101 ExAllocatePoolWithQuota(
7102 IN POOL_TYPE PoolType,
7103 IN SIZE_T NumberOfBytes);
7104
7105 #endif /* POOL_TAGGING */
7106
7107 NTKERNELAPI
7108 PVOID
7109 NTAPI
7110 ExAllocatePoolWithTagPriority(
7111 IN POOL_TYPE PoolType,
7112 IN SIZE_T NumberOfBytes,
7113 IN ULONG Tag,
7114 IN EX_POOL_PRIORITY Priority);
7115
7116 NTKERNELAPI
7117 VOID
7118 NTAPI
7119 ExConvertExclusiveToSharedLite(
7120 IN PERESOURCE Resource);
7121
7122 NTKERNELAPI
7123 NTSTATUS
7124 NTAPI
7125 ExCreateCallback(
7126 OUT PCALLBACK_OBJECT *CallbackObject,
7127 IN POBJECT_ATTRIBUTES ObjectAttributes,
7128 IN BOOLEAN Create,
7129 IN BOOLEAN AllowMultipleCallbacks);
7130
7131 NTKERNELAPI
7132 VOID
7133 NTAPI
7134 ExDeleteNPagedLookasideList(
7135 IN PNPAGED_LOOKASIDE_LIST Lookaside);
7136
7137 NTKERNELAPI
7138 VOID
7139 NTAPI
7140 ExDeletePagedLookasideList(
7141 IN PPAGED_LOOKASIDE_LIST Lookaside);
7142
7143 NTKERNELAPI
7144 NTSTATUS
7145 NTAPI
7146 ExDeleteResourceLite(
7147 IN PERESOURCE Resource);
7148
7149 NTKERNELAPI
7150 VOID
7151 NTAPI
7152 ExFreePool(
7153 IN PVOID P);
7154
7155 #define PROTECTED_POOL 0x80000000
7156
7157 #ifdef POOL_TAGGING
7158 #define ExFreePool(P) ExFreePoolWithTag(P, 0)
7159 #endif
7160
7161 NTKERNELAPI
7162 VOID
7163 NTAPI
7164 ExFreePoolWithTag(
7165 IN PVOID P,
7166 IN ULONG Tag);
7167
7168 #define ExQueryDepthSList(ListHead) QueryDepthSList(ListHead)
7169
7170 static __inline VOID
7171 ExFreeToNPagedLookasideList(
7172 IN PNPAGED_LOOKASIDE_LIST Lookaside,
7173 IN PVOID Entry)
7174 {
7175 Lookaside->L.TotalFrees++;
7176 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
7177 Lookaside->L.FreeMisses++;
7178 (Lookaside->L.Free)(Entry);
7179 } else {
7180 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
7181 }
7182 }
7183
7184 static __inline VOID
7185 ExFreeToPagedLookasideList(
7186 IN PPAGED_LOOKASIDE_LIST Lookaside,
7187 IN PVOID Entry)
7188 {
7189 Lookaside->L.TotalFrees++;
7190 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
7191 Lookaside->L.FreeMisses++;
7192 (Lookaside->L.Free)(Entry);
7193 } else {
7194 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
7195 }
7196 }
7197
7198 /*
7199 * ERESOURCE_THREAD
7200 * ExGetCurrentResourceThread(
7201 * VOID);
7202 */
7203 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD) PsGetCurrentThread())
7204
7205 NTKERNELAPI
7206 ULONG
7207 NTAPI
7208 ExGetExclusiveWaiterCount(
7209 IN PERESOURCE Resource);
7210
7211 NTKERNELAPI
7212 KPROCESSOR_MODE
7213 NTAPI
7214 ExGetPreviousMode(
7215 VOID);
7216
7217 NTKERNELAPI
7218 ULONG
7219 NTAPI
7220 ExGetSharedWaiterCount(
7221 IN PERESOURCE Resource);
7222
7223 NTKERNELAPI
7224 VOID
7225 NTAPI
7226 KeInitializeEvent(
7227 IN PRKEVENT Event,
7228 IN EVENT_TYPE Type,
7229 IN BOOLEAN State);
7230
7231 NTKERNELAPI
7232 VOID
7233 NTAPI
7234 ExInitializeNPagedLookasideList(
7235 IN PNPAGED_LOOKASIDE_LIST Lookaside,
7236 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
7237 IN PFREE_FUNCTION Free OPTIONAL,
7238 IN ULONG Flags,
7239 IN SIZE_T Size,
7240 IN ULONG Tag,
7241 IN USHORT Depth);
7242
7243 NTKERNELAPI
7244 VOID
7245 NTAPI
7246 ExInitializePagedLookasideList(
7247 IN PPAGED_LOOKASIDE_LIST Lookaside,
7248 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
7249 IN PFREE_FUNCTION Free OPTIONAL,
7250 IN ULONG Flags,
7251 IN SIZE_T Size,
7252 IN ULONG Tag,
7253 IN USHORT Depth);
7254
7255 NTKERNELAPI
7256 NTSTATUS
7257 NTAPI
7258 ExInitializeResourceLite(
7259 IN PERESOURCE Resource);
7260
7261 /*
7262 * VOID
7263 * InitializeSListHead(
7264 * IN PSLIST_HEADER SListHead)
7265 */
7266 #define InitializeSListHead(_SListHead) \
7267 (_SListHead)->Alignment = 0
7268
7269 #define ExInitializeSListHead InitializeSListHead
7270
7271 NTKERNELAPI
7272 LARGE_INTEGER
7273 NTAPI
7274 ExInterlockedAddLargeInteger(
7275 IN PLARGE_INTEGER Addend,
7276 IN LARGE_INTEGER Increment,
7277 IN PKSPIN_LOCK Lock);
7278
7279 NTKERNELAPI
7280 VOID
7281 FASTCALL
7282 ExInterlockedAddLargeStatistic(
7283 IN PLARGE_INTEGER Addend,
7284 IN ULONG Increment);
7285
7286 NTKERNELAPI
7287 ULONG
7288 NTAPI
7289 ExInterlockedAddUlong(
7290 IN PULONG Addend,
7291 IN ULONG Increment,
7292 PKSPIN_LOCK Lock);
7293
7294 NTKERNELAPI
7295 LONGLONG
7296 FASTCALL
7297 ExInterlockedCompareExchange64(
7298 IN OUT PLONGLONG Destination,
7299 IN PLONGLONG Exchange,
7300 IN PLONGLONG Comparand,
7301 IN PKSPIN_LOCK Lock);
7302
7303 NTKERNELAPI
7304 LONGLONG
7305 FASTCALL
7306 ExfInterlockedCompareExchange64(
7307 IN OUT LONGLONG volatile *Destination,
7308 IN PLONGLONG Exchange,
7309 IN PLONGLONG Comperand);
7310
7311 NTKERNELAPI
7312 PSINGLE_LIST_ENTRY
7313 FASTCALL
7314 ExInterlockedFlushSList(
7315 IN PSLIST_HEADER ListHead);
7316
7317 NTKERNELAPI
7318 PLIST_ENTRY
7319 NTAPI
7320 ExInterlockedInsertHeadList(
7321 IN PLIST_ENTRY ListHead,
7322 IN PLIST_ENTRY ListEntry,
7323 IN PKSPIN_LOCK Lock);
7324
7325 NTKERNELAPI
7326 PLIST_ENTRY
7327 NTAPI
7328 ExInterlockedInsertTailList(
7329 IN PLIST_ENTRY ListHead,
7330 IN PLIST_ENTRY ListEntry,
7331 IN PKSPIN_LOCK Lock);
7332
7333 NTKERNELAPI
7334 PSINGLE_LIST_ENTRY
7335 NTAPI
7336 ExInterlockedPopEntryList(
7337 IN PSINGLE_LIST_ENTRY ListHead,
7338 IN PKSPIN_LOCK Lock);
7339
7340 /*
7341 * PSINGLE_LIST_ENTRY
7342 * ExInterlockedPopEntrySList(
7343 * IN PSLIST_HEADER ListHead,
7344 * IN PKSPIN_LOCK Lock)
7345 */
7346 #define ExInterlockedPopEntrySList(_ListHead, \
7347 _Lock) \
7348 InterlockedPopEntrySList(_ListHead)
7349
7350 NTKERNELAPI
7351 PSINGLE_LIST_ENTRY
7352 NTAPI
7353 ExInterlockedPushEntryList(
7354 IN PSINGLE_LIST_ENTRY ListHead,
7355 IN PSINGLE_LIST_ENTRY ListEntry,
7356 IN PKSPIN_LOCK Lock);
7357
7358 /*
7359 * PSINGLE_LIST_ENTRY FASTCALL
7360 * ExInterlockedPushEntrySList(
7361 * IN PSLIST_HEADER ListHead,
7362 * IN PSINGLE_LIST_ENTRY ListEntry,
7363 * IN PKSPIN_LOCK Lock)
7364 */
7365 #define ExInterlockedPushEntrySList(_ListHead, \
7366 _ListEntry, \
7367 _Lock) \
7368 InterlockedPushEntrySList(_ListHead, _ListEntry)
7369
7370 NTKERNELAPI
7371 PLIST_ENTRY
7372 NTAPI
7373 ExInterlockedRemoveHeadList(
7374 IN PLIST_ENTRY ListHead,
7375 IN PKSPIN_LOCK Lock);
7376
7377 NTKERNELAPI
7378 BOOLEAN
7379 NTAPI
7380 ExIsProcessorFeaturePresent(
7381 IN ULONG ProcessorFeature);
7382
7383 NTKERNELAPI
7384 BOOLEAN
7385 NTAPI
7386 ExIsResourceAcquiredExclusiveLite(
7387 IN PERESOURCE Resource);
7388
7389 NTKERNELAPI
7390 USHORT
7391 NTAPI
7392 ExIsResourceAcquiredLite(
7393 IN PERESOURCE Resource);
7394
7395 NTKERNELAPI
7396 ULONG
7397 NTAPI
7398 ExIsResourceAcquiredSharedLite(
7399 IN PERESOURCE Resource);
7400
7401 NTKERNELAPI
7402 VOID
7403 NTAPI
7404 ExLocalTimeToSystemTime(
7405 IN PLARGE_INTEGER LocalTime,
7406 OUT PLARGE_INTEGER SystemTime);
7407
7408 NTKERNELAPI
7409 VOID
7410 NTAPI
7411 ExNotifyCallback(
7412 IN PCALLBACK_OBJECT CallbackObject,
7413 IN PVOID Argument1,
7414 IN PVOID Argument2);
7415
7416 NTKERNELAPI
7417 VOID
7418 NTAPI
7419 ExRaiseAccessViolation(
7420 VOID);
7421
7422 NTKERNELAPI
7423 VOID
7424 NTAPI
7425 ExRaiseDatatypeMisalignment(
7426 VOID);
7427
7428 DECLSPEC_NORETURN
7429 NTKERNELAPI
7430 VOID
7431 NTAPI
7432 ExRaiseStatus(
7433 IN NTSTATUS Status);
7434
7435 NTKERNELAPI
7436 PVOID
7437 NTAPI
7438 ExRegisterCallback(
7439 IN PCALLBACK_OBJECT CallbackObject,
7440 IN PCALLBACK_FUNCTION CallbackFunction,
7441 IN PVOID CallbackContext);
7442
7443 NTKERNELAPI
7444 NTSTATUS
7445 NTAPI
7446 ExReinitializeResourceLite(
7447 IN PERESOURCE Resource);
7448
7449 NTKERNELAPI
7450 VOID
7451 NTAPI
7452 ExReleaseResourceForThreadLite(
7453 IN PERESOURCE Resource,
7454 IN ERESOURCE_THREAD ResourceThreadId);
7455
7456 NTKERNELAPI
7457 VOID
7458 FASTCALL
7459 ExReleaseResourceLite(
7460 IN PERESOURCE Resource);
7461
7462 NTKERNELAPI
7463 VOID
7464 NTAPI
7465 ExSetResourceOwnerPointer(
7466 IN PERESOURCE Resource,
7467 IN PVOID OwnerPointer);
7468
7469 NTKERNELAPI
7470 ULONG
7471 NTAPI
7472 ExSetTimerResolution(
7473 IN ULONG DesiredTime,
7474 IN BOOLEAN SetResolution);
7475
7476 NTKERNELAPI
7477 VOID
7478 NTAPI
7479 ExSystemTimeToLocalTime(
7480 IN PLARGE_INTEGER SystemTime,
7481 OUT PLARGE_INTEGER LocalTime);
7482
7483 NTKERNELAPI
7484 VOID
7485 NTAPI
7486 ExUnregisterCallback(
7487 IN PVOID CbRegistration);
7488
7489 NTKERNELAPI
7490 NTSTATUS
7491 NTAPI
7492 ExUuidCreate(
7493 OUT UUID *Uuid);
7494
7495 NTKERNELAPI
7496 BOOLEAN
7497 NTAPI
7498 ExVerifySuite(
7499 IN SUITE_TYPE SuiteType);
7500
7501 #ifdef DBG
7502
7503 #define PAGED_CODE() { \
7504 if (KeGetCurrentIrql() > APC_LEVEL) { \
7505 KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
7506 ASSERT(FALSE); \
7507 } \
7508 }
7509
7510 #else
7511
7512 #define PAGED_CODE()
7513
7514 #endif
7515
7516 NTKERNELAPI
7517 VOID
7518 NTAPI
7519 ProbeForRead(
7520 IN CONST VOID *Address,
7521 IN ULONG Length,
7522 IN ULONG Alignment);
7523
7524 NTKERNELAPI
7525 VOID
7526 NTAPI
7527 ProbeForWrite(
7528 IN PVOID Address,
7529 IN ULONG Length,
7530 IN ULONG Alignment);
7531
7532
7533
7534 /** Configuration manager routines **/
7535
7536 NTKERNELAPI
7537 NTSTATUS
7538 NTAPI
7539 CmRegisterCallback(
7540 IN PEX_CALLBACK_FUNCTION Function,
7541 IN PVOID Context,
7542 IN OUT PLARGE_INTEGER Cookie);
7543
7544 NTKERNELAPI
7545 NTSTATUS
7546 NTAPI
7547 CmUnRegisterCallback(
7548 IN LARGE_INTEGER Cookie);
7549
7550
7551
7552 /** Filesystem runtime library routines **/
7553
7554 NTKERNELAPI
7555 BOOLEAN
7556 NTAPI
7557 FsRtlIsTotalDeviceFailure(
7558 IN NTSTATUS Status);
7559
7560
7561
7562 /** Hardware abstraction layer routines **/
7563
7564 NTHALAPI
7565 BOOLEAN
7566 NTAPI
7567 HalMakeBeep(
7568 IN ULONG Frequency);
7569
7570 NTKERNELAPI
7571 VOID
7572 FASTCALL
7573 HalExamineMBR(
7574 IN PDEVICE_OBJECT DeviceObject,
7575 IN ULONG SectorSize,
7576 IN ULONG MBRTypeIdentifier,
7577 OUT PVOID *Buffer);
7578
7579 VOID
7580 NTAPI
7581 HalPutDmaAdapter(
7582 PADAPTER_OBJECT AdapterObject
7583 );
7584
7585 NTKERNELAPI
7586 NTSTATUS
7587 NTAPI
7588 IoAllocateAdapterChannel(
7589 IN PADAPTER_OBJECT AdapterObject,
7590 IN PDEVICE_OBJECT DeviceObject,
7591 IN ULONG NumberOfMapRegisters,
7592 IN PDRIVER_CONTROL ExecutionRoutine,
7593 IN PVOID Context
7594 );
7595
7596 /** Io access routines **/
7597
7598 #if !defined(_M_AMD64)
7599 NTHALAPI
7600 VOID
7601 NTAPI
7602 READ_PORT_BUFFER_UCHAR(
7603 IN PUCHAR Port,
7604 IN PUCHAR Buffer,
7605 IN ULONG Count);
7606
7607 NTHALAPI
7608 VOID
7609 NTAPI
7610 READ_PORT_BUFFER_ULONG(
7611 IN PULONG Port,
7612 IN PULONG Buffer,
7613 IN ULONG Count);
7614
7615 NTHALAPI
7616 VOID
7617 NTAPI
7618 READ_PORT_BUFFER_USHORT(
7619 IN PUSHORT Port,
7620 IN PUSHORT Buffer,
7621 IN ULONG Count);
7622
7623 NTHALAPI
7624 UCHAR
7625 NTAPI
7626 READ_PORT_UCHAR(
7627 IN PUCHAR Port);
7628
7629 NTHALAPI
7630 ULONG
7631 NTAPI
7632 READ_PORT_ULONG(
7633 IN PULONG Port);
7634
7635 NTHALAPI
7636 USHORT
7637 NTAPI
7638 READ_PORT_USHORT(
7639 IN PUSHORT Port);
7640
7641 NTKERNELAPI
7642 VOID
7643 NTAPI
7644 READ_REGISTER_BUFFER_UCHAR(
7645 IN PUCHAR Register,
7646 IN PUCHAR Buffer,
7647 IN ULONG Count);
7648
7649 NTKERNELAPI
7650 VOID
7651 NTAPI
7652 READ_REGISTER_BUFFER_ULONG(
7653 IN PULONG Register,
7654 IN PULONG Buffer,
7655 IN ULONG Count);
7656
7657 NTKERNELAPI
7658 VOID
7659 NTAPI
7660 READ_REGISTER_BUFFER_USHORT(
7661 IN PUSHORT Register,
7662 IN PUSHORT Buffer,
7663 IN ULONG Count);
7664
7665 NTKERNELAPI
7666 UCHAR
7667 NTAPI
7668 READ_REGISTER_UCHAR(
7669 IN PUCHAR Register);
7670
7671 NTKERNELAPI
7672 ULONG
7673 NTAPI
7674 READ_REGISTER_ULONG(
7675 IN PULONG Register);
7676
7677 NTKERNELAPI
7678 USHORT
7679 NTAPI
7680 READ_REGISTER_USHORT(
7681 IN PUSHORT Register);
7682
7683 NTHALAPI
7684 VOID
7685 NTAPI
7686 WRITE_PORT_BUFFER_UCHAR(
7687 IN PUCHAR Port,
7688 IN PUCHAR Buffer,
7689 IN ULONG Count);
7690
7691 NTHALAPI
7692 VOID
7693 NTAPI
7694 WRITE_PORT_BUFFER_ULONG(
7695 IN PULONG Port,
7696 IN PULONG Buffer,
7697 IN ULONG Count);
7698
7699 NTHALAPI
7700 VOID
7701 NTAPI
7702 WRITE_PORT_BUFFER_USHORT(
7703 IN PUSHORT Port,
7704 IN PUSHORT Buffer,
7705 IN ULONG Count);
7706
7707 NTHALAPI
7708 VOID
7709 NTAPI
7710 WRITE_PORT_UCHAR(
7711 IN PUCHAR Port,
7712 IN UCHAR Value);
7713
7714 NTHALAPI
7715 VOID
7716 NTAPI
7717 WRITE_PORT_ULONG(
7718 IN PULONG Port,
7719 IN ULONG Value);
7720
7721 NTHALAPI
7722 VOID
7723 NTAPI
7724 WRITE_PORT_USHORT(
7725 IN PUSHORT Port,
7726 IN USHORT Value);
7727
7728 NTKERNELAPI
7729 VOID
7730 NTAPI
7731 WRITE_REGISTER_BUFFER_UCHAR(
7732 IN PUCHAR Register,
7733 IN PUCHAR Buffer,
7734 IN ULONG Count);
7735
7736 NTKERNELAPI
7737 VOID
7738 NTAPI
7739 WRITE_REGISTER_BUFFER_ULONG(
7740 IN PULONG Register,
7741 IN PULONG Buffer,
7742 IN ULONG Count);
7743
7744 NTKERNELAPI
7745 VOID
7746 NTAPI
7747 WRITE_REGISTER_BUFFER_USHORT(
7748 IN PUSHORT Register,
7749 IN PUSHORT Buffer,
7750 IN ULONG Count);
7751
7752 NTKERNELAPI
7753 VOID
7754 NTAPI
7755 WRITE_REGISTER_UCHAR(
7756 IN PUCHAR Register,
7757 IN UCHAR Value);
7758
7759 NTKERNELAPI
7760 VOID
7761 NTAPI
7762 WRITE_REGISTER_ULONG(
7763 IN PULONG Register,
7764 IN ULONG Value);
7765
7766 NTKERNELAPI
7767 VOID
7768 NTAPI
7769 WRITE_REGISTER_USHORT(
7770 IN PUSHORT Register,
7771 IN USHORT Value);
7772
7773 #else
7774
7775 FORCEINLINE
7776 VOID
7777 READ_PORT_BUFFER_UCHAR(
7778 IN PUCHAR Port,
7779 IN PUCHAR Buffer,
7780 IN ULONG Count)
7781 {
7782 __inbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
7783 }
7784
7785 FORCEINLINE
7786 VOID
7787 READ_PORT_BUFFER_ULONG(
7788 IN PULONG Port,
7789 IN PULONG Buffer,
7790 IN ULONG Count)
7791 {
7792 __indwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
7793 }
7794
7795 FORCEINLINE
7796 VOID
7797 READ_PORT_BUFFER_USHORT(
7798 IN PUSHORT Port,
7799 IN PUSHORT Buffer,
7800 IN ULONG Count)
7801 {
7802 __inwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
7803 }
7804
7805 FORCEINLINE
7806 UCHAR
7807 READ_PORT_UCHAR(
7808 IN PUCHAR Port)
7809 {
7810 return __inbyte((USHORT)(ULONG_PTR)Port);
7811 }
7812
7813 FORCEINLINE
7814 ULONG
7815 READ_PORT_ULONG(
7816 IN PULONG Port)
7817 {
7818 return __indword((USHORT)(ULONG_PTR)Port);
7819 }
7820
7821 FORCEINLINE
7822 USHORT
7823 READ_PORT_USHORT(
7824 IN PUSHORT Port)
7825 {
7826 return __inword((USHORT)(ULONG_PTR)Port);
7827 }
7828
7829 FORCEINLINE
7830 VOID
7831 READ_REGISTER_BUFFER_UCHAR(
7832 IN PUCHAR Register,
7833 IN PUCHAR Buffer,
7834 IN ULONG Count)
7835 {
7836 __movsb(Register, Buffer, Count);
7837 }
7838
7839 FORCEINLINE
7840 VOID
7841 READ_REGISTER_BUFFER_ULONG(
7842 IN PULONG Register,
7843 IN PULONG Buffer,
7844 IN ULONG Count)
7845 {
7846 __movsd(Register, Buffer, Count);
7847 }
7848
7849 FORCEINLINE
7850 VOID
7851 READ_REGISTER_BUFFER_USHORT(
7852 IN PUSHORT Register,
7853 IN PUSHORT Buffer,
7854 IN ULONG Count)
7855 {
7856 __movsw(Register, Buffer, Count);
7857 }
7858
7859 FORCEINLINE
7860 UCHAR
7861 READ_REGISTER_UCHAR(
7862 IN PUCHAR Register)
7863 {
7864 return *Register;
7865 }
7866
7867 FORCEINLINE
7868 ULONG
7869 READ_REGISTER_ULONG(
7870 IN PULONG Register)
7871 {
7872 return *Register;
7873 }
7874
7875 FORCEINLINE
7876 USHORT
7877 READ_REGISTER_USHORT(
7878 IN PUSHORT Register)
7879 {
7880 return *Register;
7881 }
7882
7883 FORCEINLINE
7884 VOID
7885 WRITE_PORT_BUFFER_UCHAR(
7886 IN PUCHAR Port,
7887 IN PUCHAR Buffer,
7888 IN ULONG Count)
7889 {
7890 __outbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
7891 }
7892
7893 FORCEINLINE
7894 VOID
7895 WRITE_PORT_BUFFER_ULONG(
7896 IN PULONG Port,
7897 IN PULONG Buffer,
7898 IN ULONG Count)
7899 {
7900 __outdwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
7901 }
7902
7903 FORCEINLINE
7904 VOID
7905 WRITE_PORT_BUFFER_USHORT(
7906 IN PUSHORT Port,
7907 IN PUSHORT Buffer,
7908 IN ULONG Count)
7909 {
7910 __outwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
7911 }
7912
7913 FORCEINLINE
7914 VOID
7915 WRITE_PORT_UCHAR(
7916 IN PUCHAR Port,
7917 IN UCHAR Value)
7918 {
7919 __outbyte((USHORT)(ULONG_PTR)Port, Value);
7920 }
7921
7922 FORCEINLINE
7923 VOID
7924 WRITE_PORT_ULONG(
7925 IN PULONG Port,
7926 IN ULONG Value)
7927 {
7928 __outdword((USHORT)(ULONG_PTR)Port, Value);
7929 }
7930
7931 FORCEINLINE
7932 VOID
7933 WRITE_PORT_USHORT(
7934 IN PUSHORT Port,
7935 IN USHORT Value)
7936 {
7937 __outword((USHORT)(ULONG_PTR)Port, Value);
7938 }
7939
7940 FORCEINLINE
7941 VOID
7942 WRITE_REGISTER_BUFFER_UCHAR(
7943 IN PUCHAR Register,
7944 IN PUCHAR Buffer,
7945 IN ULONG Count)
7946 {
7947 LONG Synch;
7948 __movsb(Register, Buffer, Count);
7949 InterlockedOr(&Synch, 1);
7950 }
7951
7952 FORCEINLINE
7953 VOID
7954 WRITE_REGISTER_BUFFER_ULONG(
7955 IN PULONG Register,
7956 IN PULONG Buffer,
7957 IN ULONG Count)
7958 {
7959 LONG Synch;
7960 __movsd(Register, Buffer, Count);
7961 InterlockedOr(&Synch, 1);
7962 }
7963
7964 FORCEINLINE
7965 VOID
7966 WRITE_REGISTER_BUFFER_USHORT(
7967 IN PUSHORT Register,
7968 IN PUSHORT Buffer,
7969 IN ULONG Count)
7970 {
7971 LONG Synch;
7972 __movsw(Register, Buffer, Count);
7973 InterlockedOr(&Synch, 1);
7974 }
7975
7976 FORCEINLINE
7977 VOID
7978 WRITE_REGISTER_UCHAR(
7979 IN PUCHAR Register,
7980 IN UCHAR Value)
7981 {
7982 LONG Synch;
7983 *Register = Value;
7984 InterlockedOr(&Synch, 1);
7985 }
7986
7987 FORCEINLINE
7988 VOID
7989 WRITE_REGISTER_ULONG(
7990 IN PULONG Register,
7991 IN ULONG Value)
7992 {
7993 LONG Synch;
7994 *Register = Value;
7995 InterlockedOr(&Synch, 1);
7996 }
7997
7998 FORCEINLINE
7999 VOID
8000 WRITE_REGISTER_USHORT(
8001 IN PUSHORT Register,
8002 IN USHORT Value)
8003 {
8004 LONG Sync;
8005 *Register = Value;
8006 InterlockedOr(&Sync, 1);
8007 }
8008
8009 #endif
8010
8011 /** I/O manager routines **/
8012
8013 NTKERNELAPI
8014 VOID
8015 NTAPI
8016 IoAcquireCancelSpinLock(
8017 OUT PKIRQL Irql);
8018
8019 NTKERNELAPI
8020 NTSTATUS
8021 NTAPI
8022 IoAcquireRemoveLockEx(
8023 IN PIO_REMOVE_LOCK RemoveLock,
8024 IN OPTIONAL PVOID Tag OPTIONAL,
8025 IN PCSTR File,
8026 IN ULONG Line,
8027 IN ULONG RemlockSize);
8028
8029 /*
8030 * NTSTATUS
8031 * IoAcquireRemoveLock(
8032 * IN PIO_REMOVE_LOCK RemoveLock,
8033 * IN OPTIONAL PVOID Tag)
8034 */
8035 #define IoAcquireRemoveLock(_RemoveLock, \
8036 _Tag) \
8037 IoAcquireRemoveLockEx(_RemoveLock, _Tag, __FILE__, __LINE__, sizeof(IO_REMOVE_LOCK))
8038
8039 /*
8040 * VOID
8041 * IoAdjustPagingPathCount(
8042 * IN PLONG Count,
8043 * IN BOOLEAN Increment)
8044 */
8045 #define IoAdjustPagingPathCount(_Count, \
8046 _Increment) \
8047 { \
8048 if (_Increment) \
8049 { \
8050 InterlockedIncrement(_Count); \
8051 } \
8052 else \
8053 { \
8054 InterlockedDecrement(_Count); \
8055 } \
8056 }
8057
8058 NTKERNELAPI
8059 VOID
8060 NTAPI
8061 IoAllocateController(
8062 IN PCONTROLLER_OBJECT ControllerObject,
8063 IN PDEVICE_OBJECT DeviceObject,
8064 IN PDRIVER_CONTROL ExecutionRoutine,
8065 IN PVOID Context);
8066
8067 NTKERNELAPI
8068 NTSTATUS
8069 NTAPI
8070 IoAllocateDriverObjectExtension(
8071 IN PDRIVER_OBJECT DriverObject,
8072 IN PVOID ClientIdentificationAddress,
8073 IN ULONG DriverObjectExtensionSize,
8074 OUT PVOID *DriverObjectExtension);
8075
8076 NTKERNELAPI
8077 PVOID
8078 NTAPI
8079 IoAllocateErrorLogEntry(
8080 IN PVOID IoObject,
8081 IN UCHAR EntrySize);
8082
8083 NTKERNELAPI
8084 PIRP
8085 NTAPI
8086 IoAllocateIrp(
8087 IN CCHAR StackSize,
8088 IN BOOLEAN ChargeQuota);
8089
8090 NTKERNELAPI
8091 PMDL
8092 NTAPI
8093 IoAllocateMdl(
8094 IN PVOID VirtualAddress,
8095 IN ULONG Length,
8096 IN BOOLEAN SecondaryBuffer,
8097 IN BOOLEAN ChargeQuota,
8098 IN OUT PIRP Irp OPTIONAL);
8099
8100 NTKERNELAPI
8101 PIO_WORKITEM
8102 NTAPI
8103 IoAllocateWorkItem(
8104 IN PDEVICE_OBJECT DeviceObject);
8105
8106 /*
8107 * VOID IoAssignArcName(
8108 * IN PUNICODE_STRING ArcName,
8109 * IN PUNICODE_STRING DeviceName);
8110 */
8111 #define IoAssignArcName(_ArcName, _DeviceName) ( \
8112 IoCreateSymbolicLink((_ArcName), (_DeviceName)))
8113
8114 NTKERNELAPI
8115 NTSTATUS
8116 NTAPI
8117 IoAttachDevice(
8118 IN PDEVICE_OBJECT SourceDevice,
8119 IN PUNICODE_STRING TargetDevice,
8120 OUT PDEVICE_OBJECT *AttachedDevice);
8121
8122 NTKERNELAPI
8123 PDEVICE_OBJECT
8124 NTAPI
8125 IoAttachDeviceToDeviceStack(
8126 IN PDEVICE_OBJECT SourceDevice,
8127 IN PDEVICE_OBJECT TargetDevice);
8128
8129 NTKERNELAPI
8130 PIRP
8131 NTAPI
8132 IoBuildAsynchronousFsdRequest(
8133 IN ULONG MajorFunction,
8134 IN PDEVICE_OBJECT DeviceObject,
8135 IN OUT PVOID Buffer OPTIONAL,
8136 IN ULONG Length OPTIONAL,
8137 IN PLARGE_INTEGER StartingOffset OPTIONAL,
8138 IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL);
8139
8140 NTKERNELAPI
8141 PIRP
8142 NTAPI
8143 IoBuildDeviceIoControlRequest(
8144 IN ULONG IoControlCode,
8145 IN PDEVICE_OBJECT DeviceObject,
8146 IN PVOID InputBuffer OPTIONAL,
8147 IN ULONG InputBufferLength,
8148 OUT PVOID OutputBuffer OPTIONAL,
8149 IN ULONG OutputBufferLength,
8150 IN BOOLEAN InternalDeviceIoControl,
8151 IN PKEVENT Event,
8152 OUT PIO_STATUS_BLOCK IoStatusBlock);
8153
8154 NTKERNELAPI
8155 VOID
8156 NTAPI
8157 IoBuildPartialMdl(
8158 IN PMDL SourceMdl,
8159 IN OUT PMDL TargetMdl,
8160 IN PVOID VirtualAddress,
8161 IN ULONG Length);
8162
8163 NTKERNELAPI
8164 PIRP
8165 NTAPI
8166 IoBuildSynchronousFsdRequest(
8167 IN ULONG MajorFunction,
8168 IN PDEVICE_OBJECT DeviceObject,
8169 IN OUT PVOID Buffer OPTIONAL,
8170 IN ULONG Length OPTIONAL,
8171 IN PLARGE_INTEGER StartingOffset OPTIONAL,
8172 IN PKEVENT Event,
8173 OUT PIO_STATUS_BLOCK IoStatusBlock);
8174
8175 NTKERNELAPI
8176 NTSTATUS
8177 FASTCALL
8178 IofCallDriver(
8179 IN PDEVICE_OBJECT DeviceObject,
8180 IN OUT PIRP Irp);
8181
8182 /*
8183 * NTSTATUS
8184 * IoCallDriver(
8185 * IN PDEVICE_OBJECT DeviceObject,
8186 * IN OUT PIRP Irp)
8187 */
8188 #define IoCallDriver IofCallDriver
8189
8190 NTKERNELAPI
8191 VOID
8192 NTAPI
8193 IoCancelFileOpen(
8194 IN PDEVICE_OBJECT DeviceObject,
8195 IN PFILE_OBJECT FileObject);
8196
8197 NTKERNELAPI
8198 BOOLEAN
8199 NTAPI
8200 IoCancelIrp(
8201 IN PIRP Irp);
8202
8203 NTKERNELAPI
8204 NTSTATUS
8205 NTAPI
8206 IoCheckShareAccess(
8207 IN ACCESS_MASK DesiredAccess,
8208 IN ULONG DesiredShareAccess,
8209 IN OUT PFILE_OBJECT FileObject,
8210 IN OUT PSHARE_ACCESS ShareAccess,
8211 IN BOOLEAN Update);
8212
8213 NTKERNELAPI
8214 VOID
8215 FASTCALL
8216 IofCompleteRequest(
8217 IN PIRP Irp,
8218 IN CCHAR PriorityBoost);
8219
8220 /*
8221 * VOID
8222 * IoCompleteRequest(
8223 * IN PIRP Irp,
8224 * IN CCHAR PriorityBoost)
8225 */
8226 #define IoCompleteRequest IofCompleteRequest
8227
8228 NTKERNELAPI
8229 NTSTATUS
8230 NTAPI
8231 IoConnectInterrupt(
8232 OUT PKINTERRUPT *InterruptObject,
8233 IN PKSERVICE_ROUTINE ServiceRoutine,
8234 IN PVOID ServiceContext,
8235 IN PKSPIN_LOCK SpinLock OPTIONAL,
8236 IN ULONG Vector,
8237 IN KIRQL Irql,
8238 IN KIRQL SynchronizeIrql,
8239 IN KINTERRUPT_MODE InterruptMode,
8240 IN BOOLEAN ShareVector,
8241 IN KAFFINITY ProcessorEnableMask,
8242 IN BOOLEAN FloatingSave);
8243
8244 /*
8245 * PIO_STACK_LOCATION
8246 * IoGetCurrentIrpStackLocation(
8247 * IN PIRP Irp)
8248 */
8249 #define IoGetCurrentIrpStackLocation(_Irp) \
8250 ((_Irp)->Tail.Overlay.CurrentStackLocation)
8251
8252 /*
8253 * PIO_STACK_LOCATION
8254 * IoGetNextIrpStackLocation(
8255 * IN PIRP Irp)
8256 */
8257 #define IoGetNextIrpStackLocation(_Irp) \
8258 ((_Irp)->Tail.Overlay.CurrentStackLocation - 1)
8259
8260 /*
8261 * VOID
8262 * IoCopyCurrentIrpStackLocationToNext(
8263 * IN PIRP Irp)
8264 */
8265 #define IoCopyCurrentIrpStackLocationToNext(_Irp) \
8266 { \
8267 PIO_STACK_LOCATION _IrpSp; \
8268 PIO_STACK_LOCATION _NextIrpSp; \
8269 _IrpSp = IoGetCurrentIrpStackLocation(_Irp); \
8270 _NextIrpSp = IoGetNextIrpStackLocation(_Irp); \
8271 RtlCopyMemory(_NextIrpSp, _IrpSp, \
8272 FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine)); \
8273 _NextIrpSp->Control = 0; \
8274 }
8275
8276 NTKERNELAPI
8277 PCONTROLLER_OBJECT
8278 NTAPI
8279 IoCreateController(
8280 IN ULONG Size);
8281
8282 NTKERNELAPI
8283 NTSTATUS
8284 NTAPI
8285 IoCreateDevice(
8286 IN PDRIVER_OBJECT DriverObject,
8287 IN ULONG DeviceExtensionSize,
8288 IN PUNICODE_STRING DeviceName OPTIONAL,
8289 IN DEVICE_TYPE DeviceType,
8290 IN ULONG DeviceCharacteristics,
8291 IN BOOLEAN Exclusive,
8292 OUT PDEVICE_OBJECT *DeviceObject);
8293
8294 NTKERNELAPI
8295 NTSTATUS
8296 NTAPI
8297 IoCreateDisk(
8298 IN PDEVICE_OBJECT DeviceObject,
8299 IN PCREATE_DISK Disk);
8300
8301 NTKERNELAPI
8302 NTSTATUS
8303 NTAPI
8304 IoCreateFile(
8305 OUT PHANDLE FileHandle,
8306 IN ACCESS_MASK DesiredAccess,
8307 IN POBJECT_ATTRIBUTES ObjectAttributes,
8308 OUT PIO_STATUS_BLOCK IoStatusBlock,
8309 IN PLARGE_INTEGER AllocationSize OPTIONAL,
8310 IN ULONG FileAttributes,
8311 IN ULONG ShareAccess,
8312 IN ULONG Disposition,
8313 IN ULONG CreateOptions,
8314 IN PVOID EaBuffer OPTIONAL,
8315 IN ULONG EaLength,
8316 IN CREATE_FILE_TYPE CreateFileType,
8317 IN PVOID ExtraCreateParameters OPTIONAL,
8318 IN ULONG Options);
8319
8320 NTKERNELAPI
8321 PKEVENT
8322 NTAPI
8323 IoCreateNotificationEvent(
8324 IN PUNICODE_STRING EventName,
8325 OUT PHANDLE EventHandle);
8326
8327 NTKERNELAPI
8328 NTSTATUS
8329 NTAPI
8330 IoCreateSymbolicLink(
8331 IN PUNICODE_STRING SymbolicLinkName,
8332 IN PUNICODE_STRING DeviceName);
8333
8334 NTKERNELAPI
8335 PKEVENT
8336 NTAPI
8337 IoCreateSynchronizationEvent(
8338 IN PUNICODE_STRING EventName,
8339 OUT PHANDLE EventHandle);
8340
8341 NTKERNELAPI
8342 NTSTATUS
8343 NTAPI
8344 IoCreateUnprotectedSymbolicLink(
8345 IN PUNICODE_STRING SymbolicLinkName,
8346 IN PUNICODE_STRING DeviceName);
8347
8348 NTKERNELAPI
8349 NTSTATUS
8350 NTAPI
8351 IoCsqInitialize(
8352 PIO_CSQ Csq,
8353 IN PIO_CSQ_INSERT_IRP CsqInsertIrp,
8354 IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
8355 IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
8356 IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
8357 IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
8358 IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp);
8359
8360 NTKERNELAPI
8361 VOID
8362 NTAPI
8363 IoCsqInsertIrp(
8364 IN PIO_CSQ Csq,
8365 IN PIRP Irp,
8366 IN PIO_CSQ_IRP_CONTEXT Context);
8367
8368 NTKERNELAPI
8369 PIRP
8370 NTAPI
8371 IoCsqRemoveIrp(
8372 IN PIO_CSQ Csq,
8373 IN PIO_CSQ_IRP_CONTEXT Context);
8374
8375 NTKERNELAPI
8376 PIRP
8377 NTAPI
8378 IoCsqRemoveNextIrp(
8379 IN PIO_CSQ Csq,
8380 IN PVOID PeekContext);
8381
8382 NTKERNELAPI
8383 VOID
8384 NTAPI
8385 IoDeleteController(
8386 IN PCONTROLLER_OBJECT ControllerObject);
8387
8388 NTKERNELAPI
8389 VOID
8390 NTAPI
8391 IoDeleteDevice(
8392 IN PDEVICE_OBJECT DeviceObject);
8393
8394 NTKERNELAPI
8395 NTSTATUS
8396 NTAPI
8397 IoDeleteSymbolicLink(
8398 IN PUNICODE_STRING SymbolicLinkName);
8399
8400 /*
8401 * VOID
8402 * IoDeassignArcName(
8403 * IN PUNICODE_STRING ArcName)
8404 */
8405 #define IoDeassignArcName IoDeleteSymbolicLink
8406
8407 NTKERNELAPI
8408 VOID
8409 NTAPI
8410 IoDetachDevice(
8411 IN OUT PDEVICE_OBJECT TargetDevice);
8412
8413 NTKERNELAPI
8414 VOID
8415 NTAPI
8416 IoDisconnectInterrupt(
8417 IN PKINTERRUPT InterruptObject);
8418
8419 NTKERNELAPI
8420 BOOLEAN
8421 NTAPI
8422 IoForwardIrpSynchronously(
8423 IN PDEVICE_OBJECT DeviceObject,
8424 IN PIRP Irp);
8425
8426 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
8427
8428 NTKERNELAPI
8429 VOID
8430 NTAPI
8431 IoFreeController(
8432 IN PCONTROLLER_OBJECT ControllerObject);
8433
8434 NTKERNELAPI
8435 VOID
8436 NTAPI
8437 IoFreeErrorLogEntry(
8438 PVOID ElEntry);
8439
8440 NTKERNELAPI
8441 VOID
8442 NTAPI
8443 IoFreeIrp(
8444 IN PIRP Irp);
8445
8446 NTKERNELAPI
8447 VOID
8448 NTAPI
8449 IoFreeMdl(
8450 IN PMDL Mdl);
8451
8452 NTKERNELAPI
8453 VOID
8454 NTAPI
8455 IoFreeWorkItem(
8456 IN PIO_WORKITEM pIOWorkItem);
8457
8458 NTKERNELAPI
8459 PDEVICE_OBJECT
8460 NTAPI
8461 IoGetAttachedDevice(
8462 IN PDEVICE_OBJECT DeviceObject);
8463
8464 NTKERNELAPI
8465 PDEVICE_OBJECT
8466 NTAPI
8467 IoGetAttachedDeviceReference(
8468 IN PDEVICE_OBJECT DeviceObject);
8469
8470 NTKERNELAPI
8471 NTSTATUS
8472 NTAPI
8473 IoGetBootDiskInformation(
8474 IN OUT PBOOTDISK_INFORMATION BootDiskInformation,
8475 IN ULONG Size);
8476
8477 NTKERNELAPI
8478 PCONFIGURATION_INFORMATION
8479 NTAPI
8480 IoGetConfigurationInformation(
8481 VOID);
8482
8483 NTKERNELAPI
8484 PEPROCESS
8485 NTAPI
8486 IoGetCurrentProcess(
8487 VOID);
8488
8489 NTKERNELAPI
8490 NTSTATUS
8491 NTAPI
8492 IoGetDeviceInterfaceAlias(
8493 IN PUNICODE_STRING SymbolicLinkName,
8494 IN CONST GUID *AliasInterfaceClassGuid,
8495 OUT PUNICODE_STRING AliasSymbolicLinkName);
8496
8497 #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
8498
8499 NTKERNELAPI
8500 NTSTATUS
8501 NTAPI
8502 IoGetDeviceInterfaces(
8503 IN CONST GUID *InterfaceClassGuid,
8504 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
8505 IN ULONG Flags,
8506 OUT PWSTR *SymbolicLinkList);
8507
8508 NTKERNELAPI
8509 NTSTATUS
8510 NTAPI
8511 IoGetDeviceObjectPointer(
8512 IN PUNICODE_STRING ObjectName,
8513 IN ACCESS_MASK DesiredAccess,
8514 OUT PFILE_OBJECT *FileObject,
8515 OUT PDEVICE_OBJECT *DeviceObject);
8516
8517 NTKERNELAPI
8518 NTSTATUS
8519 NTAPI
8520 IoGetDeviceProperty(
8521 IN PDEVICE_OBJECT DeviceObject,
8522 IN DEVICE_REGISTRY_PROPERTY DeviceProperty,
8523 IN ULONG BufferLength,
8524 OUT PVOID PropertyBuffer,
8525 OUT PULONG ResultLength);
8526
8527 NTKERNELAPI
8528 PDEVICE_OBJECT
8529 NTAPI
8530 IoGetDeviceToVerify(
8531 IN PETHREAD Thread);
8532
8533 NTKERNELAPI
8534 PDMA_ADAPTER
8535 NTAPI
8536 IoGetDmaAdapter(
8537 IN PDEVICE_OBJECT PhysicalDeviceObject,
8538 IN PDEVICE_DESCRIPTION DeviceDescription,
8539 IN OUT PULONG NumberOfMapRegisters);
8540
8541 NTKERNELAPI
8542 PVOID
8543 NTAPI
8544 IoGetDriverObjectExtension(
8545 IN PDRIVER_OBJECT DriverObject,
8546 IN PVOID ClientIdentificationAddress);
8547
8548 NTKERNELAPI
8549 PGENERIC_MAPPING
8550 NTAPI
8551 IoGetFileObjectGenericMapping(
8552 VOID);
8553
8554 /*
8555 * ULONG
8556 * IoGetFunctionCodeFromCtlCode(
8557 * IN ULONG ControlCode)
8558 */
8559 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
8560 (((_ControlCode) >> 2) & 0x00000FFF)
8561
8562 NTKERNELAPI
8563 PVOID
8564 NTAPI
8565 IoGetInitialStack(
8566 VOID);
8567
8568 NTKERNELAPI
8569 PDEVICE_OBJECT
8570 NTAPI
8571 IoGetRelatedDeviceObject(
8572 IN PFILE_OBJECT FileObject);
8573
8574 NTKERNELAPI
8575 ULONG
8576 NTAPI
8577 IoGetRemainingStackSize(
8578 VOID);
8579
8580 NTKERNELAPI
8581 VOID
8582 NTAPI
8583 IoGetStackLimits(
8584 OUT PULONG_PTR LowLimit,
8585 OUT PULONG_PTR HighLimit);
8586
8587 NTKERNELAPI
8588 VOID
8589 NTAPI
8590 KeInitializeDpc(
8591 IN PRKDPC Dpc,
8592 IN PKDEFERRED_ROUTINE DeferredRoutine,
8593 IN PVOID DeferredContext);
8594
8595 /*
8596 * VOID
8597 * IoInitializeDpcRequest(
8598 * IN PDEVICE_OBJECT DeviceObject,
8599 * IN PIO_DPC_ROUTINE DpcRoutine)
8600 */
8601 #define IoInitializeDpcRequest(_DeviceObject, \
8602 _DpcRoutine) \
8603 KeInitializeDpc(&(_DeviceObject)->Dpc, \
8604 (PKDEFERRED_ROUTINE) (_DpcRoutine), \
8605 _DeviceObject)
8606
8607 NTKERNELAPI
8608 VOID
8609 NTAPI
8610 IoInitializeIrp(
8611 IN OUT PIRP Irp,
8612 IN USHORT PacketSize,
8613 IN CCHAR StackSize);
8614
8615 NTKERNELAPI
8616 VOID
8617 NTAPI
8618 IoInitializeRemoveLockEx(
8619 IN PIO_REMOVE_LOCK Lock,
8620 IN ULONG AllocateTag,
8621 IN ULONG MaxLockedMinutes,
8622 IN ULONG HighWatermark,
8623 IN ULONG RemlockSize);
8624
8625 /* VOID
8626 * IoInitializeRemoveLock(
8627 * IN PIO_REMOVE_LOCK Lock,
8628 * IN ULONG AllocateTag,
8629 * IN ULONG MaxLockedMinutes,
8630 * IN ULONG HighWatermark)
8631 */
8632 #define IoInitializeRemoveLock( \
8633 Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
8634 IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
8635 HighWatermark, sizeof(IO_REMOVE_LOCK))
8636
8637 NTKERNELAPI
8638 NTSTATUS
8639 NTAPI
8640 IoInitializeTimer(
8641 IN PDEVICE_OBJECT DeviceObject,
8642 IN PIO_TIMER_ROUTINE TimerRoutine,
8643 IN PVOID Context);
8644
8645 NTKERNELAPI
8646 VOID
8647 NTAPI
8648 IoInvalidateDeviceRelations(
8649 IN PDEVICE_OBJECT DeviceObject,
8650 IN DEVICE_RELATION_TYPE Type);
8651
8652 NTKERNELAPI
8653 VOID
8654 NTAPI
8655 IoInvalidateDeviceState(
8656 IN PDEVICE_OBJECT PhysicalDeviceObject);
8657
8658 NTKERNELAPI
8659 BOOLEAN
8660 NTAPI
8661 IoIs32bitProcess(
8662 IN PIRP Irp OPTIONAL);
8663
8664 /*
8665 * BOOLEAN
8666 * IoIsErrorUserInduced(
8667 * IN NTSTATUS Status);
8668 */
8669 #define IoIsErrorUserInduced(Status) \
8670 ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
8671 ((Status) == STATUS_IO_TIMEOUT) || \
8672 ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
8673 ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
8674 ((Status) == STATUS_VERIFY_REQUIRED) || \
8675 ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
8676 ((Status) == STATUS_WRONG_VOLUME)))
8677
8678 NTKERNELAPI
8679 BOOLEAN
8680 NTAPI
8681 IoIsWdmVersionAvailable(
8682 IN UCHAR MajorVersion,
8683 IN UCHAR MinorVersion);
8684
8685 NTKERNELAPI
8686 PIRP
8687 NTAPI
8688 IoMakeAssociatedIrp(
8689 IN PIRP Irp,
8690 IN CCHAR StackSize);
8691
8692 /*
8693 * VOID
8694 * IoMarkIrpPending(
8695 * IN OUT PIRP Irp)
8696 */
8697 #define IoMarkIrpPending(_Irp) \
8698 (IoGetCurrentIrpStackLocation(_Irp)->Control |= SL_PENDING_RETURNED)
8699
8700 NTKERNELAPI
8701 NTSTATUS
8702 NTAPI
8703 IoOpenDeviceInterfaceRegistryKey(
8704 IN PUNICODE_STRING SymbolicLinkName,
8705 IN ACCESS_MASK DesiredAccess,
8706 OUT PHANDLE DeviceInterfaceKey);
8707
8708 #define PLUGPLAY_REGKEY_DEVICE 1
8709 #define PLUGPLAY_REGKEY_DRIVER 2
8710 #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4
8711
8712 NTKERNELAPI
8713 NTSTATUS
8714 NTAPI
8715 IoOpenDeviceRegistryKey(
8716 IN PDEVICE_OBJECT DeviceObject,
8717 IN ULONG DevInstKeyType,
8718 IN ACCESS_MASK DesiredAccess,
8719 OUT PHANDLE DevInstRegKey);
8720
8721 NTKERNELAPI
8722 NTSTATUS
8723 NTAPI
8724 IoQueryDeviceDescription(
8725 IN PINTERFACE_TYPE BusType OPTIONAL,
8726 IN PULONG BusNumber OPTIONAL,
8727 IN PCONFIGURATION_TYPE ControllerType OPTIONAL,
8728 IN PULONG ControllerNumber OPTIONAL,
8729 IN PCONFIGURATION_TYPE PeripheralType OPTIONAL,
8730 IN PULONG PeripheralNumber OPTIONAL,
8731 IN PIO_QUERY_DEVICE_ROUTINE CalloutRoutine,
8732 IN PVOID Context);
8733
8734 NTKERNELAPI
8735 VOID
8736 NTAPI
8737 IoQueueWorkItem(
8738 IN PIO_WORKITEM pIOWorkItem,
8739 IN PIO_WORKITEM_ROUTINE Routine,
8740 IN WORK_QUEUE_TYPE QueueType,
8741 IN PVOID Context);
8742
8743 NTKERNELAPI
8744 VOID
8745 NTAPI
8746 IoRaiseHardError(
8747 IN PIRP Irp,
8748 IN PVPB Vpb OPTIONAL,
8749 IN PDEVICE_OBJECT RealDeviceObject);
8750
8751 NTKERNELAPI
8752 BOOLEAN
8753 NTAPI
8754 IoRaiseInformationalHardError(
8755 IN NTSTATUS ErrorStatus,
8756 IN PUNICODE_STRING String OPTIONAL,
8757 IN PKTHREAD Thread OPTIONAL);
8758
8759 NTKERNELAPI
8760 NTSTATUS
8761 NTAPI
8762 IoReadDiskSignature(
8763 IN PDEVICE_OBJECT DeviceObject,
8764 IN ULONG BytesPerSector,
8765 OUT PDISK_SIGNATURE Signature);
8766
8767 NTKERNELAPI
8768 NTSTATUS
8769 NTAPI
8770 IoReadPartitionTableEx(
8771 IN PDEVICE_OBJECT DeviceObject,
8772 IN struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer);
8773
8774 NTKERNELAPI
8775 VOID
8776 NTAPI
8777 IoRegisterBootDriverReinitialization(
8778 IN PDRIVER_OBJECT DriverObject,
8779 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
8780 IN PVOID Context);
8781
8782 NTKERNELAPI
8783 VOID
8784 NTAPI
8785 IoRegisterBootDriverReinitialization(
8786 IN PDRIVER_OBJECT DriverObject,
8787 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
8788 IN PVOID Context);
8789
8790 NTKERNELAPI
8791 NTSTATUS
8792 NTAPI
8793 IoRegisterDeviceInterface(
8794 IN PDEVICE_OBJECT PhysicalDeviceObject,
8795 IN CONST GUID *InterfaceClassGuid,
8796 IN PUNICODE_STRING ReferenceString OPTIONAL,
8797 OUT PUNICODE_STRING SymbolicLinkName);
8798
8799 NTKERNELAPI
8800 VOID
8801 NTAPI
8802 IoRegisterDriverReinitialization(
8803 IN PDRIVER_OBJECT DriverObject,
8804 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
8805 IN PVOID Context);
8806
8807 NTKERNELAPI
8808 NTSTATUS
8809 NTAPI
8810 IoRegisterPlugPlayNotification(
8811 IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
8812 IN ULONG EventCategoryFlags,
8813 IN PVOID EventCategoryData OPTIONAL,
8814 IN PDRIVER_OBJECT DriverObject,
8815 IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine,
8816 IN PVOID Context,
8817 OUT PVOID *NotificationEntry);
8818
8819 NTKERNELAPI
8820 NTSTATUS
8821 NTAPI
8822 IoRegisterShutdownNotification(
8823 IN PDEVICE_OBJECT DeviceObject);
8824
8825 NTKERNELAPI
8826 VOID
8827 NTAPI
8828 IoReleaseCancelSpinLock(
8829 IN KIRQL Irql);
8830
8831 NTKERNELAPI
8832 VOID
8833 NTAPI
8834 IoReleaseRemoveLockAndWaitEx(
8835 IN PIO_REMOVE_LOCK RemoveLock,
8836 IN PVOID Tag,
8837 IN ULONG RemlockSize);
8838
8839 NTKERNELAPI
8840 VOID
8841 NTAPI
8842 IoReleaseRemoveLockEx(
8843 IN PIO_REMOVE_LOCK RemoveLock,
8844 IN PVOID Tag,
8845 IN ULONG RemlockSize);
8846
8847 /*
8848 * VOID
8849 * IoReleaseRemoveLock(
8850 * IN PIO_REMOVE_LOCK RemoveLock,
8851 * IN PVOID Tag)
8852 */
8853 #define IoReleaseRemoveLock(_RemoveLock, \
8854 _Tag) \
8855 IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
8856
8857 /*
8858 * VOID
8859 * IoReleaseRemoveLockAndWait(
8860 * IN PIO_REMOVE_LOCK RemoveLock,
8861 * IN PVOID Tag)
8862 */
8863 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
8864 _Tag) \
8865 IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
8866
8867 NTKERNELAPI
8868 VOID
8869 NTAPI
8870 IoRemoveShareAccess(
8871 IN PFILE_OBJECT FileObject,
8872 IN OUT PSHARE_ACCESS ShareAccess);
8873
8874 NTKERNELAPI
8875 NTSTATUS
8876 NTAPI
8877 IoReportDetectedDevice(
8878 IN PDRIVER_OBJECT DriverObject,
8879 IN INTERFACE_TYPE LegacyBusType,
8880 IN ULONG BusNumber,
8881 IN ULONG SlotNumber,
8882 IN PCM_RESOURCE_LIST ResourceList,
8883 IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL,
8884 IN BOOLEAN ResourceAssigned,
8885 IN OUT PDEVICE_OBJECT *DeviceObject);
8886
8887 NTKERNELAPI
8888 NTSTATUS
8889 NTAPI
8890 IoReportResourceForDetection(
8891 IN PDRIVER_OBJECT DriverObject,
8892 IN PCM_RESOURCE_LIST DriverList OPTIONAL,
8893 IN ULONG DriverListSize OPTIONAL,
8894 IN PDEVICE_OBJECT DeviceObject OPTIONAL,
8895 IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
8896 IN ULONG DeviceListSize OPTIONAL,
8897 OUT PBOOLEAN ConflictDetected);
8898
8899 NTKERNELAPI
8900 NTSTATUS
8901 NTAPI
8902 IoReportResourceUsage(
8903 IN PUNICODE_STRING DriverClassName OPTIONAL,
8904 IN PDRIVER_OBJECT DriverObject,
8905 IN PCM_RESOURCE_LIST DriverList OPTIONAL,
8906 IN ULONG DriverListSize OPTIONAL,
8907 IN PDEVICE_OBJECT DeviceObject,
8908 IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
8909 IN ULONG DeviceListSize OPTIONAL,
8910 IN BOOLEAN OverrideConflict,
8911 OUT PBOOLEAN ConflictDetected);
8912
8913 NTKERNELAPI
8914 NTSTATUS
8915 NTAPI
8916 IoReportTargetDeviceChange(
8917 IN PDEVICE_OBJECT PhysicalDeviceObject,
8918 IN PVOID NotificationStructure);
8919
8920 NTKERNELAPI
8921 NTSTATUS
8922 NTAPI
8923 IoReportTargetDeviceChangeAsynchronous(
8924 IN PDEVICE_OBJECT PhysicalDeviceObject,
8925 IN PVOID NotificationStructure,
8926 IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL,
8927 IN PVOID Context OPTIONAL);
8928
8929 NTKERNELAPI
8930 VOID
8931 NTAPI
8932 IoRequestDeviceEject(
8933 IN PDEVICE_OBJECT PhysicalDeviceObject);
8934
8935 /*
8936 * VOID
8937 * IoRequestDpc(
8938 * IN PDEVICE_OBJECT DeviceObject,
8939 * IN PIRP Irp,
8940 * IN PVOID Context);
8941 */
8942 #define IoRequestDpc(DeviceObject, Irp, Context)( \
8943 KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
8944
8945 NTKERNELAPI
8946 VOID
8947 NTAPI
8948 IoReuseIrp(
8949 IN OUT PIRP Irp,
8950 IN NTSTATUS Status);
8951
8952 /*
8953 * PDRIVER_CANCEL
8954 * IoSetCancelRoutine(
8955 * IN PIRP Irp,
8956 * IN PDRIVER_CANCEL CancelRoutine)
8957 */
8958 #define IoSetCancelRoutine(_Irp, \
8959 _CancelRoutine) \
8960 ((PDRIVER_CANCEL) InterlockedExchangePointer( \
8961 (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (_CancelRoutine)))
8962
8963 /*
8964 * VOID
8965 * IoSetCompletionRoutine(
8966 * IN PIRP Irp,
8967 * IN PIO_COMPLETION_ROUTINE CompletionRoutine,
8968 * IN PVOID Context,
8969 * IN BOOLEAN InvokeOnSuccess,
8970 * IN BOOLEAN InvokeOnError,
8971 * IN BOOLEAN InvokeOnCancel)
8972 */
8973 #define IoSetCompletionRoutine(_Irp, \
8974 _CompletionRoutine, \
8975 _Context, \
8976 _InvokeOnSuccess, \
8977 _InvokeOnError, \
8978 _InvokeOnCancel) \
8979 { \
8980 PIO_STACK_LOCATION _IrpSp; \
8981 ASSERT((_InvokeOnSuccess) || (_InvokeOnError) || (_InvokeOnCancel) ? \
8982 (_CompletionRoutine) != NULL : TRUE); \
8983 _IrpSp = IoGetNextIrpStackLocation(_Irp); \
8984 _IrpSp->CompletionRoutine = (PIO_COMPLETION_ROUTINE)(_CompletionRoutine); \
8985 _IrpSp->Context = (_Context); \
8986 _IrpSp->Control = 0; \
8987 if (_InvokeOnSuccess) _IrpSp->Control = SL_INVOKE_ON_SUCCESS; \
8988 if (_InvokeOnError) _IrpSp->Control |= SL_INVOKE_ON_ERROR; \
8989 if (_InvokeOnCancel) _IrpSp->Control |= SL_INVOKE_ON_CANCEL; \
8990 }
8991
8992 NTKERNELAPI
8993 NTSTATUS
8994 NTAPI
8995 IoSetCompletionRoutineEx(
8996 IN PDEVICE_OBJECT DeviceObject,
8997 IN PIRP Irp,
8998 IN PIO_COMPLETION_ROUTINE CompletionRoutine,
8999 IN PVOID Context,
9000 IN BOOLEAN InvokeOnSuccess,
9001 IN BOOLEAN InvokeOnError,
9002 IN BOOLEAN InvokeOnCancel);
9003
9004 NTKERNELAPI
9005 NTSTATUS
9006 NTAPI
9007 IoSetDeviceInterfaceState(
9008 IN PUNICODE_STRING SymbolicLinkName,
9009 IN BOOLEAN Enable);
9010
9011 NTKERNELAPI
9012 VOID
9013 NTAPI
9014 IoSetHardErrorOrVerifyDevice(
9015 IN PIRP Irp,
9016 IN PDEVICE_OBJECT DeviceObject);
9017
9018 /*
9019 * VOID
9020 * IoSetNextIrpStackLocation(
9021 * IN OUT PIRP Irp)
9022 */
9023 #define IoSetNextIrpStackLocation(_Irp) \
9024 { \
9025 (_Irp)->CurrentLocation--; \
9026 (_Irp)->Tail.Overlay.CurrentStackLocation--; \
9027 }
9028
9029 NTKERNELAPI
9030 NTSTATUS
9031 NTAPI
9032 IoSetPartitionInformationEx(
9033 IN PDEVICE_OBJECT DeviceObject,
9034 IN ULONG PartitionNumber,
9035 IN struct _SET_PARTITION_INFORMATION_EX *PartitionInfo);
9036
9037 NTKERNELAPI
9038 VOID
9039 NTAPI
9040 IoSetShareAccess(
9041 IN ACCESS_MASK DesiredAccess,
9042 IN ULONG DesiredShareAccess,
9043 IN OUT PFILE_OBJECT FileObject,
9044 OUT PSHARE_ACCESS ShareAccess);
9045
9046 NTKERNELAPI
9047 VOID
9048 NTAPI
9049 IoSetStartIoAttributes(
9050 IN PDEVICE_OBJECT DeviceObject,
9051 IN BOOLEAN DeferredStartIo,
9052 IN BOOLEAN NonCancelable);
9053
9054 NTKERNELAPI
9055 NTSTATUS
9056 NTAPI
9057 IoSetSystemPartition(
9058 IN PUNICODE_STRING VolumeNameString);
9059
9060 NTKERNELAPI
9061 BOOLEAN
9062 NTAPI
9063 IoSetThreadHardErrorMode(
9064 IN BOOLEAN EnableHardErrors);
9065
9066 /*
9067 * USHORT
9068 * IoSizeOfIrp(
9069 * IN CCHAR StackSize)
9070 */
9071 #define IoSizeOfIrp(_StackSize) \
9072 ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
9073
9074 /*
9075 * VOID
9076 * IoSkipCurrentIrpStackLocation(
9077 * IN PIRP Irp)
9078 */
9079 #define IoSkipCurrentIrpStackLocation(_Irp) \
9080 { \
9081 (_Irp)->CurrentLocation++; \
9082 (_Irp)->Tail.Overlay.CurrentStackLocation++; \
9083 }
9084
9085 NTKERNELAPI
9086 VOID
9087 NTAPI
9088 IoStartNextPacket(
9089 IN PDEVICE_OBJECT DeviceObject,
9090 IN BOOLEAN Cancelable);
9091
9092 NTKERNELAPI
9093 VOID
9094 NTAPI
9095 IoStartNextPacketByKey(
9096 IN PDEVICE_OBJECT DeviceObject,
9097 IN BOOLEAN Cancelable,
9098 IN ULONG Key);
9099
9100 NTKERNELAPI
9101 VOID
9102 NTAPI
9103 IoStartPacket(
9104 IN PDEVICE_OBJECT DeviceObject,
9105 IN PIRP Irp,
9106 IN PULONG Key OPTIONAL,
9107 IN PDRIVER_CANCEL CancelFunction OPTIONAL);
9108
9109 NTKERNELAPI
9110 VOID
9111 NTAPI
9112 IoStartTimer(
9113 IN PDEVICE_OBJECT DeviceObject);
9114
9115 NTKERNELAPI
9116 VOID
9117 NTAPI
9118 IoStopTimer(
9119 IN PDEVICE_OBJECT DeviceObject);
9120
9121 NTKERNELAPI
9122 NTSTATUS
9123 NTAPI
9124 IoUnregisterPlugPlayNotification(
9125 IN PVOID NotificationEntry);
9126
9127 NTKERNELAPI
9128 VOID
9129 NTAPI
9130 IoUnregisterShutdownNotification(
9131 IN PDEVICE_OBJECT DeviceObject);
9132
9133 NTKERNELAPI
9134 VOID
9135 NTAPI
9136 IoUpdateShareAccess(
9137 IN PFILE_OBJECT FileObject,
9138 IN OUT PSHARE_ACCESS ShareAccess);
9139
9140 NTKERNELAPI
9141 NTSTATUS
9142 NTAPI
9143 IoVerifyPartitionTable(
9144 IN PDEVICE_OBJECT DeviceObject,
9145 IN BOOLEAN FixErrors);
9146
9147 NTKERNELAPI
9148 NTSTATUS
9149 NTAPI
9150 IoVolumeDeviceToDosName(
9151 IN PVOID VolumeDeviceObject,
9152 OUT PUNICODE_STRING DosName);
9153
9154 NTKERNELAPI
9155 NTSTATUS
9156 NTAPI
9157 IoWMIAllocateInstanceIds(
9158 IN GUID *Guid,
9159 IN ULONG InstanceCount,
9160 OUT ULONG *FirstInstanceId);
9161
9162 NTKERNELAPI
9163 ULONG
9164 NTAPI
9165 IoWMIDeviceObjectToProviderId(
9166 IN PDEVICE_OBJECT DeviceObject);
9167
9168 NTKERNELAPI
9169 NTSTATUS
9170 NTAPI
9171 IoWMIDeviceObjectToInstanceName(
9172 IN PVOID DataBlockObject,
9173 IN PDEVICE_OBJECT DeviceObject,
9174 OUT PUNICODE_STRING InstanceName);
9175
9176 NTKERNELAPI
9177 NTSTATUS
9178 NTAPI
9179 IoWMIExecuteMethod(
9180 IN PVOID DataBlockObject,
9181 IN PUNICODE_STRING InstanceName,
9182 IN ULONG MethodId,
9183 IN ULONG InBufferSize,
9184 IN OUT PULONG OutBufferSize,
9185 IN OUT PUCHAR InOutBuffer);
9186
9187 NTKERNELAPI
9188 NTSTATUS
9189 NTAPI
9190 IoWMIHandleToInstanceName(
9191 IN PVOID DataBlockObject,
9192 IN HANDLE FileHandle,
9193 OUT PUNICODE_STRING InstanceName);
9194
9195 NTKERNELAPI
9196 NTSTATUS
9197 NTAPI
9198 IoWMIOpenBlock(
9199 IN GUID *DataBlockGuid,
9200 IN ULONG DesiredAccess,
9201 OUT PVOID *DataBlockObject);
9202
9203 NTKERNELAPI
9204 NTSTATUS
9205 NTAPI
9206 IoWMIQueryAllData(
9207 IN PVOID DataBlockObject,
9208 IN OUT ULONG *InOutBufferSize,
9209 OUT PVOID OutBuffer);
9210
9211 NTKERNELAPI
9212 NTSTATUS
9213 NTAPI
9214 IoWMIQueryAllDataMultiple(
9215 IN PVOID *DataBlockObjectList,
9216 IN ULONG ObjectCount,
9217 IN OUT ULONG *InOutBufferSize,
9218 OUT PVOID OutBuffer);
9219
9220 NTKERNELAPI
9221 NTSTATUS
9222 NTAPI
9223 IoWMIQuerySingleInstance(
9224 IN PVOID DataBlockObject,
9225 IN PUNICODE_STRING InstanceName,
9226 IN OUT ULONG *InOutBufferSize,
9227 OUT PVOID OutBuffer);
9228
9229 NTKERNELAPI
9230 NTSTATUS
9231 NTAPI
9232 IoWMIQuerySingleInstanceMultiple(
9233 IN PVOID *DataBlockObjectList,
9234 IN PUNICODE_STRING InstanceNames,
9235 IN ULONG ObjectCount,
9236 IN OUT ULONG *InOutBufferSize,
9237 OUT PVOID OutBuffer);
9238
9239 NTKERNELAPI
9240 NTSTATUS
9241 NTAPI
9242 IoWMIRegistrationControl(
9243 IN PDEVICE_OBJECT DeviceObject,
9244 IN ULONG Action);
9245
9246 NTKERNELAPI
9247 NTSTATUS
9248 NTAPI
9249 IoWMISetNotificationCallback(
9250 IN PVOID Object,
9251 IN WMI_NOTIFICATION_CALLBACK Callback,
9252 IN PVOID Context);
9253
9254 NTKERNELAPI
9255 NTSTATUS
9256 NTAPI
9257 IoWMISetSingleInstance(
9258 IN PVOID DataBlockObject,
9259 IN PUNICODE_STRING InstanceName,
9260 IN ULONG Version,
9261 IN ULONG ValueBufferSize,
9262 IN PVOID ValueBuffer);
9263
9264 NTKERNELAPI
9265 NTSTATUS
9266 NTAPI
9267 IoWMISetSingleItem(
9268 IN PVOID DataBlockObject,
9269 IN PUNICODE_STRING InstanceName,
9270 IN ULONG DataItemId,
9271 IN ULONG Version,
9272 IN ULONG ValueBufferSize,
9273 IN PVOID ValueBuffer);
9274
9275 NTKERNELAPI
9276 NTSTATUS
9277 NTAPI
9278 IoWMISuggestInstanceName(
9279 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
9280 IN PUNICODE_STRING SymbolicLinkName OPTIONAL,
9281 IN BOOLEAN CombineNames,
9282 OUT PUNICODE_STRING SuggestedInstanceName);
9283
9284 NTKERNELAPI
9285 NTSTATUS
9286 NTAPI
9287 IoWMIWriteEvent(
9288 IN PVOID WnodeEventItem);
9289
9290 NTKERNELAPI
9291 VOID
9292 NTAPI
9293 IoWriteErrorLogEntry(
9294 IN PVOID ElEntry);
9295
9296 NTKERNELAPI
9297 NTSTATUS
9298 NTAPI
9299 IoWritePartitionTableEx(
9300 IN PDEVICE_OBJECT DeviceObject,
9301 IN struct _DRIVE_LAYOUT_INFORMATION_EX *PartitionBuffer);
9302
9303
9304
9305 /** Kernel routines **/
9306
9307 NTHALAPI
9308 VOID
9309 FASTCALL
9310 KeAcquireInStackQueuedSpinLock(
9311 IN PKSPIN_LOCK SpinLock,
9312 IN PKLOCK_QUEUE_HANDLE LockHandle);
9313
9314 NTKERNELAPI
9315 VOID
9316 FASTCALL
9317 KeAcquireInStackQueuedSpinLockAtDpcLevel(
9318 IN PKSPIN_LOCK SpinLock,
9319 IN PKLOCK_QUEUE_HANDLE LockHandle);
9320
9321 NTKERNELAPI
9322 KIRQL
9323 NTAPI
9324 KeAcquireInterruptSpinLock(
9325 IN PKINTERRUPT Interrupt);
9326
9327 NTKERNELAPI
9328 BOOLEAN
9329 NTAPI
9330 KeAreApcsDisabled(
9331 VOID);
9332
9333 NTKERNELAPI
9334 VOID
9335 NTAPI
9336 KeBugCheck(
9337 IN ULONG BugCheckCode);
9338
9339 NTKERNELAPI
9340 VOID
9341 NTAPI
9342 KeBugCheckEx(
9343 IN ULONG BugCheckCode,
9344 IN ULONG_PTR BugCheckParameter1,
9345 IN ULONG_PTR BugCheckParameter2,
9346 IN ULONG_PTR BugCheckParameter3,
9347 IN ULONG_PTR BugCheckParameter4);
9348
9349 NTKERNELAPI
9350 BOOLEAN
9351 NTAPI
9352 KeCancelTimer(
9353 IN PKTIMER Timer);
9354
9355 NTKERNELAPI
9356 VOID
9357 NTAPI
9358 KeClearEvent(
9359 IN PRKEVENT Event);
9360
9361 NTKERNELAPI
9362 NTSTATUS
9363 NTAPI
9364 KeDelayExecutionThread(
9365 IN KPROCESSOR_MODE WaitMode,
9366 IN BOOLEAN Alertable,
9367 IN PLARGE_INTEGER Interval);
9368
9369 NTKERNELAPI
9370 BOOLEAN
9371 NTAPI
9372 KeDeregisterBugCheckCallback(
9373 IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord);
9374
9375 NTKERNELAPI
9376 VOID
9377 NTAPI
9378 KeEnterCriticalRegion(
9379 VOID);
9380
9381 /*
9382 * VOID
9383 * KeFlushIoBuffers(
9384 * IN PMDL Mdl,
9385 * IN BOOLEAN ReadOperation,
9386 * IN BOOLEAN DmaOperation)
9387 */
9388 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
9389
9390 #define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql))
9391 #define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql))
9392 #define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock)
9393 #define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock)
9394
9395 NTHALAPI
9396 VOID
9397 NTAPI
9398 KeFlushWriteBuffer(VOID);
9399
9400 NTKERNELAPI
9401 ULONG
9402 NTAPI
9403 KeGetRecommendedSharedDataAlignment(
9404 VOID);
9405
9406 NTKERNELAPI
9407 VOID
9408 NTAPI
9409 KeInitializeDeviceQueue(
9410 IN PKDEVICE_QUEUE DeviceQueue);
9411
9412 NTKERNELAPI
9413 VOID
9414 NTAPI
9415 KeInitializeMutex(
9416 IN PRKMUTEX Mutex,
9417 IN ULONG Level);
9418
9419 NTKERNELAPI
9420 VOID
9421 NTAPI
9422 KeInitializeSemaphore(
9423 IN PRKSEMAPHORE Semaphore,
9424 IN LONG Count,
9425 IN LONG Limit);
9426
9427 NTKERNELAPI
9428 VOID
9429 NTAPI
9430 KeInitializeSpinLock(
9431 IN PKSPIN_LOCK SpinLock);
9432
9433 NTKERNELAPI
9434 VOID
9435 NTAPI
9436 KeInitializeTimer(
9437 IN PKTIMER Timer);
9438
9439 NTKERNELAPI
9440 VOID
9441 NTAPI
9442 KeInitializeTimerEx(
9443 IN PKTIMER Timer,
9444 IN TIMER_TYPE Type);
9445
9446 NTKERNELAPI
9447 BOOLEAN
9448 NTAPI
9449 KeInsertByKeyDeviceQueue(
9450 IN PKDEVICE_QUEUE DeviceQueue,
9451 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry,
9452 IN ULONG SortKey);
9453
9454 NTKERNELAPI
9455 BOOLEAN
9456 NTAPI
9457 KeInsertDeviceQueue(
9458 IN PKDEVICE_QUEUE DeviceQueue,
9459 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
9460
9461 NTKERNELAPI
9462 BOOLEAN
9463 NTAPI
9464 KeInsertQueueDpc(
9465 IN PRKDPC Dpc,
9466 IN PVOID SystemArgument1,
9467 IN PVOID SystemArgument2);
9468
9469 NTKERNELAPI
9470 VOID
9471 NTAPI
9472 KeLeaveCriticalRegion(
9473 VOID);
9474
9475 #ifdef _X86_
9476
9477 static __inline
9478 VOID
9479 KeMemoryBarrier(
9480 VOID)
9481 {
9482 volatile LONG Barrier;
9483 #if defined(__GNUC__)
9484 __asm__ __volatile__ ("xchg %%eax, %0" : : "m" (Barrier) : "%eax");
9485 #elif defined(_MSC_VER)
9486 __asm xchg [Barrier], eax
9487 #endif
9488 }
9489
9490 #endif
9491
9492 NTKERNELAPI
9493 LONG
9494 NTAPI
9495 KePulseEvent(
9496 IN PRKEVENT Event,
9497 IN KPRIORITY Increment,
9498 IN BOOLEAN Wait);
9499
9500 NTKERNELAPI
9501 ULONGLONG
9502 NTAPI
9503 KeQueryInterruptTime(
9504 VOID);
9505
9506 NTHALAPI
9507 LARGE_INTEGER
9508 NTAPI
9509 KeQueryPerformanceCounter(
9510 OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL);
9511
9512 NTKERNELAPI
9513 KPRIORITY
9514 NTAPI
9515 KeQueryPriorityThread(
9516 IN PRKTHREAD Thread);
9517
9518 NTKERNELAPI
9519 VOID
9520 NTAPI
9521 KeQuerySystemTime(
9522 OUT PLARGE_INTEGER CurrentTime);
9523
9524 NTKERNELAPI
9525 VOID
9526 NTAPI
9527 KeQueryTickCount(
9528 OUT PLARGE_INTEGER TickCount);
9529
9530 NTKERNELAPI
9531 ULONG
9532 NTAPI
9533 KeQueryTimeIncrement(
9534 VOID);
9535
9536 NTKERNELAPI
9537 LONG
9538 NTAPI
9539 KeReadStateEvent(
9540 IN PRKEVENT Event);
9541
9542 NTKERNELAPI
9543 LONG
9544 NTAPI
9545 KeReadStateMutex(
9546 IN PRKMUTEX Mutex);
9547
9548
9549 NTKERNELAPI
9550 LONG
9551 NTAPI
9552 KeReadStateSemaphore(
9553 IN PRKSEMAPHORE Semaphore);
9554
9555 NTKERNELAPI
9556 BOOLEAN
9557 NTAPI
9558 KeReadStateTimer(
9559 IN PKTIMER Timer);
9560
9561 NTKERNELAPI
9562 BOOLEAN
9563 NTAPI
9564 KeRegisterBugCheckCallback(
9565 IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord,
9566 IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine,
9567 IN PVOID Buffer,
9568 IN ULONG Length,
9569 IN PUCHAR Component);
9570
9571 NTHALAPI
9572 VOID
9573 FASTCALL
9574 KeReleaseInStackQueuedSpinLock(
9575 IN PKLOCK_QUEUE_HANDLE LockHandle);
9576
9577 NTKERNELAPI
9578 VOID
9579 FASTCALL
9580 KeReleaseInStackQueuedSpinLockFromDpcLevel(
9581 IN PKLOCK_QUEUE_HANDLE LockHandle);
9582
9583 NTKERNELAPI
9584 VOID
9585 NTAPI
9586 KeReleaseInterruptSpinLock(
9587 IN PKINTERRUPT Interrupt,
9588 IN KIRQL OldIrql);
9589
9590 NTKERNELAPI
9591 LONG
9592 NTAPI
9593 KeReleaseMutex(
9594 IN PRKMUTEX Mutex,
9595 IN BOOLEAN Wait);
9596
9597 NTKERNELAPI
9598 LONG
9599 NTAPI
9600 KeReleaseSemaphore(
9601 IN PRKSEMAPHORE Semaphore,
9602 IN KPRIORITY Increment,
9603 IN LONG Adjustment,
9604 IN BOOLEAN Wait);
9605
9606 NTKERNELAPI
9607 PKDEVICE_QUEUE_ENTRY
9608 NTAPI
9609 KeRemoveByKeyDeviceQueue(
9610 IN PKDEVICE_QUEUE DeviceQueue,
9611 IN ULONG SortKey);
9612
9613 NTKERNELAPI
9614 PKDEVICE_QUEUE_ENTRY
9615 NTAPI
9616 KeRemoveDeviceQueue(
9617 IN PKDEVICE_QUEUE DeviceQueue);
9618
9619 NTKERNELAPI
9620 BOOLEAN
9621 NTAPI
9622 KeRemoveEntryDeviceQueue(
9623 IN PKDEVICE_QUEUE DeviceQueue,
9624 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
9625
9626 NTKERNELAPI
9627 BOOLEAN
9628 NTAPI
9629 KeRemoveQueueDpc(
9630 IN PRKDPC Dpc);
9631
9632 NTKERNELAPI
9633 LONG
9634 NTAPI
9635 KeResetEvent(
9636 IN PRKEVENT Event);
9637
9638 NTKERNELAPI
9639 NTSTATUS
9640 NTAPI
9641 KeRestoreFloatingPointState(
9642 IN PKFLOATING_SAVE FloatSave);
9643
9644 NTKERNELAPI
9645 VOID
9646 NTAPI
9647 KeRevertToUserAffinityThread(VOID);
9648
9649 NTKERNELAPI
9650 NTSTATUS
9651 NTAPI
9652 KeSaveFloatingPointState(
9653 OUT PKFLOATING_SAVE FloatSave);
9654
9655 NTKERNELAPI
9656 LONG
9657 NTAPI
9658 KeSetBasePriorityThread(
9659 IN PRKTHREAD Thread,
9660 IN LONG Increment);
9661
9662 NTKERNELAPI
9663 LONG
9664 NTAPI
9665 KeSetEvent(
9666 IN PRKEVENT Event,
9667 IN KPRIORITY Increment,
9668 IN BOOLEAN Wait);
9669
9670 NTKERNELAPI
9671 VOID
9672 NTAPI
9673 KeSetImportanceDpc(
9674 IN PRKDPC Dpc,
9675 IN KDPC_IMPORTANCE Importance);
9676
9677 NTKERNELAPI
9678 KPRIORITY
9679 NTAPI
9680 KeSetPriorityThread(
9681 IN PKTHREAD Thread,
9682 IN KPRIORITY Priority);
9683
9684 NTKERNELAPI
9685 VOID
9686 NTAPI
9687 KeSetSystemAffinityThread(
9688 IN KAFFINITY Affinity);
9689
9690 NTKERNELAPI
9691 VOID
9692 NTAPI
9693 KeSetTargetProcessorDpc(
9694 IN PRKDPC Dpc,
9695 IN CCHAR Number);
9696
9697 NTKERNELAPI
9698 BOOLEAN
9699 NTAPI
9700 KeSetTimer(
9701 IN PKTIMER Timer,
9702 IN LARGE_INTEGER DueTime,
9703 IN PKDPC Dpc OPTIONAL);
9704
9705 NTKERNELAPI
9706 BOOLEAN
9707 NTAPI
9708 KeSetTimerEx(
9709 IN PKTIMER Timer,
9710 IN LARGE_INTEGER DueTime,
9711 IN LONG Period OPTIONAL,
9712 IN PKDPC Dpc OPTIONAL);
9713
9714 NTKERNELAPI
9715 VOID
9716 FASTCALL
9717 KeSetTimeUpdateNotifyRoutine(
9718 IN PTIME_UPDATE_NOTIFY_ROUTINE NotifyRoutine);
9719
9720 NTHALAPI
9721 VOID
9722 NTAPI
9723 KeStallExecutionProcessor(
9724 IN ULONG MicroSeconds);
9725
9726 NTKERNELAPI
9727 BOOLEAN
9728 NTAPI
9729 KeSynchronizeExecution(
9730 IN PKINTERRUPT Interrupt,
9731 IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine,
9732 IN PVOID SynchronizeContext);
9733
9734 NTKERNELAPI
9735 NTSTATUS
9736 NTAPI
9737 KeWaitForMultipleObjects(
9738 IN ULONG Count,
9739 IN PVOID Object[],
9740 IN WAIT_TYPE WaitType,
9741 IN KWAIT_REASON WaitReason,
9742 IN KPROCESSOR_MODE WaitMode,
9743 IN BOOLEAN Alertable,
9744 IN PLARGE_INTEGER Timeout OPTIONAL,
9745 IN PKWAIT_BLOCK WaitBlockArray OPTIONAL);
9746
9747 NTKERNELAPI
9748 NTSTATUS
9749 NTAPI
9750 KeWaitForMutexObject(
9751 IN PRKMUTEX Mutex,
9752 IN KWAIT_REASON WaitReason,
9753 IN KPROCESSOR_MODE WaitMode,
9754 IN BOOLEAN Alertable,
9755 IN PLARGE_INTEGER Timeout OPTIONAL);
9756
9757 NTKERNELAPI
9758 NTSTATUS
9759 NTAPI
9760 KeWaitForSingleObject(
9761 IN PVOID Object,
9762 IN KWAIT_REASON WaitReason,
9763 IN KPROCESSOR_MODE WaitMode,
9764 IN BOOLEAN Alertable,
9765 IN PLARGE_INTEGER Timeout OPTIONAL);
9766
9767 typedef
9768 ULONG_PTR
9769 (NTAPI *PKIPI_BROADCAST_WORKER)(
9770 IN ULONG_PTR Argument
9771 );
9772
9773 NTKERNELAPI
9774 ULONG_PTR
9775 NTAPI
9776 KeIpiGenericCall(
9777 IN PKIPI_BROADCAST_WORKER BroadcastFunction,
9778 IN ULONG_PTR Context
9779 );
9780
9781 #if defined(_X86_)
9782
9783 NTHALAPI
9784 VOID
9785 FASTCALL
9786 KfLowerIrql(
9787 IN KIRQL NewIrql);
9788
9789 NTHALAPI
9790 KIRQL
9791 FASTCALL
9792 KfRaiseIrql(
9793 IN KIRQL NewIrql);
9794
9795 NTHALAPI
9796 KIRQL
9797 DDKAPI
9798 KeRaiseIrqlToDpcLevel(
9799 VOID);
9800
9801 NTHALAPI
9802 KIRQL
9803 DDKAPI
9804 KeRaiseIrqlToSynchLevel(
9805 VOID);
9806
9807 #define KeLowerIrql(a) KfLowerIrql(a)
9808 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
9809
9810 #elif defined(__PowerPC__)
9811
9812 NTHALAPI
9813 VOID
9814 FASTCALL
9815 KfLowerIrql(
9816 IN KIRQL NewIrql);
9817
9818 NTHALAPI
9819 KIRQL
9820 FASTCALL
9821 KfRaiseIrql(
9822 IN KIRQL NewIrql);
9823
9824 NTHALAPI
9825 KIRQL
9826 DDKAPI
9827 KeRaiseIrqlToDpcLevel(
9828 VOID);
9829
9830 NTHALAPI
9831 KIRQL
9832 DDKAPI
9833 KeRaiseIrqlToSynchLevel(
9834 VOID);
9835
9836 #define KeLowerIrql(a) KfLowerIrql(a)
9837 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
9838
9839 #elif defined(_M_MIPS)
9840
9841 #define KeLowerIrql(a) KfLowerIrql(a)
9842 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
9843
9844 NTKERNELAPI
9845 VOID
9846 NTAPI
9847 KfLowerIrql(
9848 IN KIRQL NewIrql);
9849
9850 NTKERNELAPI
9851 KIRQL
9852 NTAPI
9853 KfRaiseIrql(
9854 IN KIRQL NewIrql);
9855
9856 NTKERNELAPI
9857 KIRQL
9858 NTAPI
9859 KeRaiseIrqlToDpcLevel(
9860 VOID);
9861
9862 NTKERNELAPI
9863 KIRQL
9864 DDKAPI
9865 KeRaiseIrqlToSynchLevel(
9866 VOID);
9867
9868 #elif defined(_M_ARM)
9869
9870 #include <armddk.h>
9871
9872 #else
9873
9874 NTKERNELAPI
9875 VOID
9876 NTAPI
9877 KeLowerIrql(
9878 IN KIRQL NewIrql);
9879
9880 NTKERNELAPI
9881 VOID
9882 NTAPI
9883 KeRaiseIrql(
9884 IN KIRQL NewIrql,
9885 OUT PKIRQL OldIrql);
9886
9887 NTKERNELAPI
9888 KIRQL
9889 NTAPI
9890 KeRaiseIrqlToDpcLevel(
9891 VOID);
9892
9893 NTKERNELAPI
9894 KIRQL
9895 DDKAPI
9896 KeRaiseIrqlToSynchLevel(
9897 VOID);
9898
9899 #endif
9900
9901 /** Memory manager routines **/
9902
9903 NTKERNELAPI
9904 NTSTATUS
9905 NTAPI
9906 MmAdvanceMdl(
9907 IN PMDL Mdl,
9908 IN ULONG NumberOfBytes);
9909
9910 NTKERNELAPI
9911 PVOID
9912 NTAPI
9913 MmAllocateContiguousMemory(
9914 IN ULONG NumberOfBytes,
9915 IN PHYSICAL_ADDRESS HighestAcceptableAddress);
9916
9917 NTKERNELAPI
9918 PVOID
9919 NTAPI
9920 MmAllocateContiguousMemorySpecifyCache(
9921 IN SIZE_T NumberOfBytes,
9922 IN PHYSICAL_ADDRESS LowestAcceptableAddress,
9923 IN PHYSICAL_ADDRESS HighestAcceptableAddress,
9924 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
9925 IN MEMORY_CACHING_TYPE CacheType);
9926
9927 NTKERNELAPI
9928 PVOID
9929 NTAPI
9930 MmAllocateMappingAddress(
9931 IN SIZE_T NumberOfBytes,
9932 IN ULONG PoolTag);
9933
9934 NTKERNELAPI
9935 PVOID
9936 NTAPI
9937 MmAllocateNonCachedMemory(
9938 IN ULONG NumberOfBytes);
9939
9940 NTKERNELAPI
9941 PMDL
9942 NTAPI
9943 MmAllocatePagesForMdl(
9944 IN PHYSICAL_ADDRESS LowAddress,
9945 IN PHYSICAL_ADDRESS HighAddress,
9946 IN PHYSICAL_ADDRESS SkipBytes,
9947 IN SIZE_T TotalBytes);
9948
9949 NTKERNELAPI
9950 VOID
9951 NTAPI
9952 MmBuildMdlForNonPagedPool(
9953 IN OUT PMDL MemoryDescriptorList);
9954
9955 typedef enum _MMFLUSH_TYPE {
9956 MmFlushForDelete,
9957 MmFlushForWrite
9958 } MMFLUSH_TYPE;
9959
9960 NTKERNELAPI
9961 BOOLEAN
9962 NTAPI
9963 MmFlushImageSection(
9964 IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
9965 IN MMFLUSH_TYPE FlushType);
9966
9967 NTKERNELAPI
9968 VOID
9969 NTAPI
9970 MmFreeContiguousMemory(
9971 IN PVOID BaseAddress);
9972
9973 NTKERNELAPI
9974 VOID
9975 NTAPI
9976 MmFreeContiguousMemorySpecifyCache(
9977 IN PVOID BaseAddress,
9978 IN SIZE_T NumberOfBytes,
9979 IN MEMORY_CACHING_TYPE CacheType);
9980
9981 NTKERNELAPI
9982 VOID
9983 NTAPI
9984 MmFreeMappingAddress(
9985 IN PVOID BaseAddress,
9986 IN ULONG PoolTag);
9987
9988 NTKERNELAPI
9989 VOID
9990 NTAPI
9991 MmFreeNonCachedMemory(
9992 IN PVOID BaseAddress,
9993 IN SIZE_T NumberOfBytes);
9994
9995 NTKERNELAPI
9996 VOID
9997 NTAPI
9998 MmFreePagesFromMdl(
9999 IN PMDL MemoryDescriptorList);
10000
10001 /*
10002 * ULONG
10003 * MmGetMdlByteCount(
10004 * IN PMDL Mdl)
10005 */
10006 #define MmGetMdlByteCount(_Mdl) \
10007 ((_Mdl)->ByteCount)
10008
10009 /*
10010 * ULONG
10011 * MmGetMdlByteOffset(
10012 * IN PMDL Mdl)
10013 */
10014 #define MmGetMdlByteOffset(_Mdl) \
10015 ((_Mdl)->ByteOffset)
10016
10017 /*
10018 * PPFN_NUMBER
10019 * MmGetMdlPfnArray(
10020 * IN PMDL Mdl)
10021 */
10022 #define MmGetMdlPfnArray(_Mdl) \
10023 ((PPFN_NUMBER) ((_Mdl) + 1))
10024
10025 /*
10026 * PVOID
10027 * MmGetMdlVirtualAddress(
10028 * IN PMDL Mdl)
10029 */
10030 #define MmGetMdlVirtualAddress(_Mdl) \
10031 ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
10032
10033 NTKERNELAPI
10034 PHYSICAL_ADDRESS
10035 NTAPI
10036 MmGetPhysicalAddress(
10037 IN PVOID BaseAddress);
10038
10039 NTKERNELAPI
10040 PPHYSICAL_MEMORY_RANGE
10041 NTAPI
10042 MmGetPhysicalMemoryRanges(
10043 VOID);
10044
10045 NTKERNELAPI
10046 PVOID
10047 NTAPI
10048 MmGetVirtualForPhysical(
10049 IN PHYSICAL_ADDRESS PhysicalAddress);
10050
10051 NTKERNELAPI
10052 PVOID
10053 NTAPI
10054 MmMapLockedPagesSpecifyCache(
10055 IN PMDL MemoryDescriptorList,
10056 IN KPROCESSOR_MODE AccessMode,
10057 IN MEMORY_CACHING_TYPE CacheType,
10058 IN PVOID BaseAddress,
10059 IN ULONG BugCheckOnFailure,
10060 IN MM_PAGE_PRIORITY Priority);
10061
10062 NTKERNELAPI
10063 PVOID
10064 NTAPI
10065 MmMapLockedPagesWithReservedMapping(
10066 IN PVOID MappingAddress,
10067 IN ULONG PoolTag,
10068 IN PMDL MemoryDescriptorList,
10069 IN MEMORY_CACHING_TYPE CacheType);
10070
10071 NTKERNELAPI
10072 NTSTATUS
10073 NTAPI
10074 MmMapUserAddressesToPage(
10075 IN PVOID BaseAddress,
10076 IN SIZE_T NumberOfBytes,
10077 IN PVOID PageAddress);
10078
10079 NTKERNELAPI
10080 PVOID
10081 NTAPI
10082 MmMapVideoDisplay(
10083 IN PHYSICAL_ADDRESS PhysicalAddress,
10084 IN SIZE_T NumberOfBytes,
10085 IN MEMORY_CACHING_TYPE CacheType);
10086
10087 NTKERNELAPI
10088 NTSTATUS
10089 NTAPI
10090 MmMapViewInSessionSpace(
10091 IN PVOID Section,
10092 OUT PVOID *MappedBase,
10093 IN OUT PSIZE_T ViewSize);
10094
10095 NTKERNELAPI
10096 NTSTATUS
10097 NTAPI
10098 MmMapViewInSystemSpace(
10099 IN PVOID Section,
10100 OUT PVOID *MappedBase,
10101 IN PSIZE_T ViewSize);
10102
10103 NTKERNELAPI
10104 NTSTATUS
10105 NTAPI
10106 MmMarkPhysicalMemoryAsBad(
10107 IN PPHYSICAL_ADDRESS StartAddress,
10108 IN OUT PLARGE_INTEGER NumberOfBytes);
10109
10110 NTKERNELAPI
10111 NTSTATUS
10112 NTAPI
10113 MmMarkPhysicalMemoryAsGood(
10114 IN PPHYSICAL_ADDRESS StartAddress,
10115 IN OUT PLARGE_INTEGER NumberOfBytes);
10116
10117 /*
10118 * PVOID
10119 * MmGetSystemAddressForMdlSafe(
10120 * IN PMDL Mdl,
10121 * IN MM_PAGE_PRIORITY Priority)
10122 */
10123 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
10124 ((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
10125 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
10126 (_Mdl)->MappedSystemVa : \
10127 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
10128 KernelMode, MmCached, NULL, FALSE, _Priority)
10129
10130 NTKERNELAPI
10131 PVOID
10132 NTAPI
10133 MmGetSystemRoutineAddress(
10134 IN PUNICODE_STRING SystemRoutineName);
10135
10136 /*
10137 * ULONG
10138 * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
10139 * IN PVOID Va,
10140 * IN ULONG Size)
10141 */
10142 #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, \
10143 _Size) \
10144 ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
10145 + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
10146
10147 /*
10148 * VOID
10149 * MmInitializeMdl(
10150 * IN PMDL MemoryDescriptorList,
10151 * IN PVOID BaseVa,
10152 * IN SIZE_T Length)
10153 */
10154 #define MmInitializeMdl(_MemoryDescriptorList, \
10155 _BaseVa, \
10156 _Length) \
10157 { \
10158 (_MemoryDescriptorList)->Next = (PMDL) NULL; \
10159 (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
10160 (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
10161 (_MemoryDescriptorList)->MdlFlags = 0; \
10162 (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
10163 (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
10164 (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
10165 }
10166
10167 NTKERNELAPI
10168 BOOLEAN
10169 NTAPI
10170 MmIsAddressValid(
10171 IN PVOID VirtualAddress);
10172
10173 NTKERNELAPI
10174 LOGICAL
10175 NTAPI
10176 MmIsDriverVerifying(
10177 IN PDRIVER_OBJECT DriverObject);
10178
10179 NTKERNELAPI
10180 BOOLEAN
10181 NTAPI
10182 MmIsThisAnNtAsSystem(
10183 VOID);
10184
10185 NTKERNELAPI
10186 NTSTATUS
10187 NTAPI
10188 MmIsVerifierEnabled(
10189 OUT PULONG VerifierFlags);
10190
10191 NTKERNELAPI
10192 PVOID
10193 NTAPI
10194 MmLockPagableDataSection(
10195 IN PVOID AddressWithinSection);
10196
10197 NTKERNELAPI
10198 PVOID
10199 NTAPI
10200 MmLockPagableImageSection(
10201 IN PVOID AddressWithinSection);
10202
10203 /*
10204 * PVOID
10205 * MmLockPagableCodeSection(
10206 * IN PVOID AddressWithinSection)
10207 */
10208 #define MmLockPagableCodeSection MmLockPagableDataSection
10209
10210 NTKERNELAPI
10211 VOID
10212 NTAPI
10213 MmLockPagableSectionByHandle(
10214 IN PVOID ImageSectionHandle);
10215
10216 NTKERNELAPI
10217 PVOID
10218 NTAPI
10219 MmMapIoSpace(
10220 IN PHYSICAL_ADDRESS PhysicalAddress,
10221 IN ULONG NumberOfBytes,
10222 IN MEMORY_CACHING_TYPE CacheEnable);
10223
10224 NTKERNELAPI
10225 PVOID
10226 NTAPI
10227 MmMapLockedPages(
10228 IN PMDL MemoryDescriptorList,
10229 IN KPROCESSOR_MODE AccessMode);
10230
10231 NTKERNELAPI
10232 PVOID
10233 NTAPI
10234 MmLockPageableDataSection (
10235 IN PVOID AddressWithinSection
10236 );
10237
10238 NTKERNELAPI
10239 VOID
10240 NTAPI
10241 MmUnlockPageableImageSection(
10242 IN PVOID ImageSectionHandle
10243 );
10244
10245 NTKERNELAPI
10246 PVOID
10247 NTAPI
10248 MmPageEntireDriver(
10249 IN PVOID AddressWithinSection);
10250
10251 NTKERNELAPI
10252 VOID
10253 NTAPI
10254 MmProbeAndLockProcessPages(
10255 IN OUT PMDL MemoryDescriptorList,
10256 IN PEPROCESS Process,
10257 IN KPROCESSOR_MODE AccessMode,
10258 IN LOCK_OPERATION Operation);
10259
10260 NTKERNELAPI
10261 NTSTATUS
10262 NTAPI
10263 MmProtectMdlSystemAddress(
10264 IN PMDL MemoryDescriptorList,
10265 IN ULONG NewProtect);
10266
10267 NTKERNELAPI
10268 VOID
10269 NTAPI
10270 MmUnmapLockedPages(
10271 IN PVOID BaseAddress,
10272 IN PMDL MemoryDescriptorList);
10273
10274 NTKERNELAPI
10275 NTSTATUS
10276 NTAPI
10277 MmUnmapViewInSessionSpace(
10278 IN PVOID MappedBase);
10279
10280 NTKERNELAPI
10281 NTSTATUS
10282 NTAPI
10283 MmUnmapViewInSystemSpace(
10284 IN PVOID MappedBase);
10285
10286 NTKERNELAPI
10287 VOID
10288 NTAPI
10289 MmUnsecureVirtualMemory(
10290 IN HANDLE SecureHandle);
10291
10292 /*
10293 * VOID
10294 * MmPrepareMdlForReuse(
10295 * IN PMDL Mdl)
10296 */
10297 #define MmPrepareMdlForReuse(_Mdl) \
10298 { \
10299 if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
10300 ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
10301 MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
10302 } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
10303 ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
10304 } \
10305 }
10306
10307 #define MmGetProcedureAddress(Address) (Address)
10308 #define MmLockPagableCodeSection(Address) MmLockPagableDataSection(Address)
10309
10310 NTKERNELAPI
10311 VOID
10312 NTAPI
10313 MmProbeAndLockPages(
10314 IN OUT PMDL MemoryDescriptorList,
10315 IN KPROCESSOR_MODE AccessMode,
10316 IN LOCK_OPERATION Operation);
10317
10318 NTKERNELAPI
10319 MM_SYSTEMSIZE
10320 NTAPI
10321 MmQuerySystemSize(
10322 VOID);
10323
10324 NTKERNELAPI
10325 NTSTATUS
10326 NTAPI
10327 MmRemovePhysicalMemory(
10328 IN PPHYSICAL_ADDRESS StartAddress,
10329 IN OUT PLARGE_INTEGER NumberOfBytes);
10330
10331 NTKERNELAPI
10332 VOID
10333 NTAPI
10334 MmResetDriverPaging(
10335 IN PVOID AddressWithinSection);
10336
10337 NTKERNELAPI
10338 HANDLE
10339 NTAPI
10340 MmSecureVirtualMemory(
10341 IN PVOID Address,
10342 IN SIZE_T Size,
10343 IN ULONG ProbeMode);
10344
10345 NTKERNELAPI
10346 ULONG
10347 NTAPI
10348 MmSizeOfMdl(
10349 IN PVOID Base,
10350 IN SIZE_T Length);
10351
10352 NTKERNELAPI
10353 VOID
10354 NTAPI
10355 MmUnlockPagableImageSection(
10356 IN PVOID ImageSectionHandle);
10357
10358 NTKERNELAPI
10359 VOID
10360 NTAPI
10361 MmUnlockPages(
10362 IN PMDL MemoryDescriptorList);
10363
10364 NTKERNELAPI
10365 VOID
10366 NTAPI
10367 MmUnmapIoSpace(
10368 IN PVOID BaseAddress,
10369 IN SIZE_T NumberOfBytes);
10370
10371 NTKERNELAPI
10372 VOID
10373 NTAPI
10374 MmUnmapReservedMapping(
10375 IN PVOID BaseAddress,
10376 IN ULONG PoolTag,
10377 IN PMDL MemoryDescriptorList);
10378
10379 NTKERNELAPI
10380 VOID
10381 NTAPI
10382 MmUnmapVideoDisplay(
10383 IN PVOID BaseAddress,
10384 IN SIZE_T NumberOfBytes);
10385
10386
10387
10388 /** Object manager routines **/
10389
10390 NTKERNELAPI
10391 NTSTATUS
10392 NTAPI
10393 ObAssignSecurity(
10394 IN PACCESS_STATE AccessState,
10395 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
10396 IN PVOID Object,
10397 IN POBJECT_TYPE Type);
10398
10399 NTKERNELAPI
10400 VOID
10401 NTAPI
10402 ObDereferenceSecurityDescriptor(
10403 PSECURITY_DESCRIPTOR SecurityDescriptor,
10404 ULONG Count);
10405
10406 NTKERNELAPI
10407 LONG_PTR
10408 FASTCALL
10409 ObfDereferenceObject(
10410 IN PVOID Object);
10411
10412 /*
10413 * VOID
10414 * ObDereferenceObject(
10415 * IN PVOID Object)
10416 */
10417 #define ObDereferenceObject ObfDereferenceObject
10418
10419 NTKERNELAPI
10420 NTSTATUS
10421 NTAPI
10422 ObGetObjectSecurity(
10423 IN PVOID Object,
10424 OUT PSECURITY_DESCRIPTOR *SecurityDescriptor,
10425 OUT PBOOLEAN MemoryAllocated);
10426
10427 NTKERNELAPI
10428 NTSTATUS
10429 NTAPI
10430 ObInsertObject(
10431 IN PVOID Object,
10432 IN PACCESS_STATE PassedAccessState OPTIONAL,
10433 IN ACCESS_MASK DesiredAccess,
10434 IN ULONG AdditionalReferences,
10435 OUT PVOID* ReferencedObject OPTIONAL,
10436 OUT PHANDLE Handle);
10437
10438 NTKERNELAPI
10439 LONG_PTR
10440 FASTCALL
10441 ObfReferenceObject(
10442 IN PVOID Object);
10443
10444 NTKERNELAPI
10445 NTSTATUS
10446 NTAPI
10447 ObLogSecurityDescriptor(
10448 IN PSECURITY_DESCRIPTOR InputSecurityDescriptor,
10449 OUT PSECURITY_DESCRIPTOR *OutputSecurityDescriptor,
10450 IN ULONG RefBias);
10451 /*
10452 * VOID
10453 * ObReferenceObject(
10454 * IN PVOID Object)
10455 */
10456 #define ObReferenceObject ObfReferenceObject
10457
10458 NTKERNELAPI
10459 VOID
10460 NTAPI
10461 ObMakeTemporaryObject(
10462 IN PVOID Object);
10463
10464 NTKERNELAPI
10465 NTSTATUS
10466 NTAPI
10467 ObOpenObjectByName(
10468 IN POBJECT_ATTRIBUTES ObjectAttributes,
10469 IN POBJECT_TYPE ObjectType,
10470 IN KPROCESSOR_MODE AccessMode,
10471 IN PACCESS_STATE PassedAccessState,
10472 IN ACCESS_MASK DesiredAccess,
10473 IN OUT PVOID ParseContext OPTIONAL,
10474 OUT PHANDLE Handle);
10475
10476 NTKERNELAPI
10477 NTSTATUS
10478 NTAPI
10479 ObOpenObjectByPointer(
10480 IN PVOID Object,
10481 IN ULONG HandleAttributes,
10482 IN PACCESS_STATE PassedAccessState OPTIONAL,
10483 IN ACCESS_MASK DesiredAccess OPTIONAL,
10484 IN POBJECT_TYPE ObjectType OPTIONAL,
10485 IN KPROCESSOR_MODE AccessMode,
10486 OUT PHANDLE Handle);
10487
10488 NTKERNELAPI
10489 NTSTATUS
10490 NTAPI
10491 ObQueryObjectAuditingByHandle(
10492 IN HANDLE Handle,
10493 OUT PBOOLEAN GenerateOnClose);
10494
10495 NTKERNELAPI
10496 NTSTATUS
10497 NTAPI
10498 ObReferenceObjectByHandle(
10499 IN HANDLE Handle,
10500 IN ACCESS_MASK DesiredAccess,
10501 IN POBJECT_TYPE ObjectType OPTIONAL,
10502 IN KPROCESSOR_MODE AccessMode,
10503 OUT PVOID *Object,
10504 OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL);
10505
10506 NTKERNELAPI
10507 NTSTATUS
10508 NTAPI
10509 ObReferenceObjectByName(
10510 IN PUNICODE_STRING ObjectPath,
10511 IN ULONG Attributes,
10512 IN PACCESS_STATE PassedAccessState OPTIONAL,
10513 IN ACCESS_MASK DesiredAccess OPTIONAL,
10514 IN POBJECT_TYPE ObjectType,
10515 IN KPROCESSOR_MODE AccessMode,
10516 IN OUT PVOID ParseContext OPTIONAL,
10517 OUT PVOID *Object);
10518
10519 NTKERNELAPI
10520 NTSTATUS
10521 NTAPI
10522 ObReferenceObjectByPointer(
10523 IN PVOID Object,
10524 IN ACCESS_MASK DesiredAccess,
10525 IN POBJECT_TYPE ObjectType,
10526 IN KPROCESSOR_MODE AccessMode);
10527
10528 NTKERNELAPI
10529 VOID
10530 NTAPI
10531 ObReferenceSecurityDescriptor(
10532 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
10533 IN ULONG Count);
10534
10535 NTKERNELAPI
10536 VOID
10537 NTAPI
10538 ObReleaseObjectSecurity(
10539 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
10540 IN BOOLEAN MemoryAllocated);
10541
10542
10543
10544 /** Process manager routines **/
10545
10546 NTKERNELAPI
10547 NTSTATUS
10548 NTAPI
10549 PsCreateSystemProcess(
10550 IN PHANDLE ProcessHandle,
10551 IN ACCESS_MASK DesiredAccess,
10552 IN POBJECT_ATTRIBUTES ObjectAttributes);
10553
10554 NTKERNELAPI
10555 NTSTATUS
10556 NTAPI
10557 PsCreateSystemThread(
10558 OUT PHANDLE ThreadHandle,
10559 IN ULONG DesiredAccess,
10560 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
10561 IN HANDLE ProcessHandle OPTIONAL,
10562 OUT PCLIENT_ID ClientId OPTIONAL,
10563 IN PKSTART_ROUTINE StartRoutine,
10564 IN PVOID StartContext);
10565
10566 /*
10567 * PEPROCESS
10568 * PsGetCurrentProcess(VOID)
10569 */
10570 #define PsGetCurrentProcess IoGetCurrentProcess
10571
10572 NTKERNELAPI
10573 HANDLE
10574 NTAPI
10575 PsGetCurrentProcessId(
10576 VOID);
10577
10578 /*
10579 * PETHREAD
10580 * PsGetCurrentThread(VOID)
10581 */
10582 #define PsGetCurrentThread() \
10583 ((PETHREAD) KeGetCurrentThread())
10584
10585 NTKERNELAPI
10586 HANDLE
10587 NTAPI
10588 PsGetCurrentThreadId(
10589 VOID);
10590
10591 NTKERNELAPI
10592 HANDLE
10593 NTAPI
10594 PsGetProcessId(PEPROCESS Process);
10595
10596 NTKERNELAPI
10597 BOOLEAN
10598 NTAPI
10599 PsGetVersion(
10600 PULONG MajorVersion OPTIONAL,
10601 PULONG MinorVersion OPTIONAL,
10602 PULONG BuildNumber OPTIONAL,
10603 PUNICODE_STRING CSDVersion OPTIONAL);
10604
10605 NTKERNELAPI
10606 NTSTATUS
10607 NTAPI
10608 PsRemoveCreateThreadNotifyRoutine(
10609 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
10610
10611 NTKERNELAPI
10612 NTSTATUS
10613 NTAPI
10614 PsRemoveLoadImageNotifyRoutine(
10615 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
10616
10617 NTKERNELAPI
10618 NTSTATUS
10619 NTAPI
10620 PsSetCreateProcessNotifyRoutine(
10621 IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
10622 IN BOOLEAN Remove);
10623
10624 NTKERNELAPI
10625 NTSTATUS
10626 NTAPI
10627 PsSetCreateThreadNotifyRoutine(
10628 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
10629
10630 NTKERNELAPI
10631 NTSTATUS
10632 NTAPI
10633 PsSetLoadImageNotifyRoutine(
10634 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
10635
10636 NTKERNELAPI
10637 NTSTATUS
10638 NTAPI
10639 PsTerminateSystemThread(
10640 IN NTSTATUS ExitStatus);
10641
10642 extern NTSYSAPI PEPROCESS PsInitialSystemProcess;
10643
10644
10645 /** Security reference monitor routines **/
10646
10647 NTKERNELAPI
10648 BOOLEAN
10649 NTAPI
10650 SeAccessCheck(
10651 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
10652 IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext,
10653 IN BOOLEAN SubjectContextLocked,
10654 IN ACCESS_MASK DesiredAccess,
10655 IN ACCESS_MASK PreviouslyGrantedAccess,
10656 OUT PPRIVILEGE_SET *Privileges OPTIONAL,
10657 IN PGENERIC_MAPPING GenericMapping,
10658 IN KPROCESSOR_MODE AccessMode,
10659 OUT PACCESS_MASK GrantedAccess,
10660 OUT PNTSTATUS AccessStatus);
10661
10662 NTKERNELAPI
10663 NTSTATUS
10664 NTAPI
10665 SeAssignSecurity(
10666 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
10667 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
10668 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
10669 IN BOOLEAN IsDirectoryObject,
10670 IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
10671 IN PGENERIC_MAPPING GenericMapping,
10672 IN POOL_TYPE PoolType);
10673
10674 NTKERNELAPI
10675 NTSTATUS
10676 NTAPI
10677 SeAssignSecurityEx(
10678 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
10679 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
10680 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
10681 IN GUID *ObjectType OPTIONAL,
10682 IN BOOLEAN IsDirectoryObject,
10683 IN ULONG AutoInheritFlags,
10684 IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
10685 IN PGENERIC_MAPPING GenericMapping,
10686 IN POOL_TYPE PoolType);
10687
10688 NTKERNELAPI
10689 NTSTATUS
10690 NTAPI
10691 SeDeassignSecurity(
10692 IN OUT PSECURITY_DESCRIPTOR *SecurityDescriptor);
10693
10694 NTKERNELAPI
10695 BOOLEAN
10696 NTAPI
10697 SeSinglePrivilegeCheck(
10698 LUID PrivilegeValue,
10699 KPROCESSOR_MODE PreviousMode);
10700
10701 NTKERNELAPI
10702 BOOLEAN
10703 NTAPI
10704 SeValidSecurityDescriptor(
10705 IN ULONG Length,
10706 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
10707
10708
10709
10710 /** NtXxx routines **/
10711
10712 NTSYSCALLAPI
10713 NTSTATUS
10714 NTAPI
10715 NtOpenProcess(
10716 OUT PHANDLE ProcessHandle,
10717 IN ACCESS_MASK DesiredAccess,
10718 IN POBJECT_ATTRIBUTES ObjectAttributes,
10719 IN PCLIENT_ID ClientId OPTIONAL);
10720
10721 NTSYSCALLAPI
10722 NTSTATUS
10723 NTAPI
10724 NtQueryInformationProcess(
10725 IN HANDLE ProcessHandle,
10726 IN PROCESSINFOCLASS ProcessInformationClass,
10727 OUT PVOID ProcessInformation,
10728 IN ULONG ProcessInformationLength,
10729 OUT PULONG ReturnLength OPTIONAL);
10730
10731
10732
10733 /** NtXxx and ZwXxx routines **/
10734
10735 NTSYSAPI
10736 NTSTATUS
10737 NTAPI
10738 ZwCancelTimer(
10739 IN HANDLE TimerHandle,
10740 OUT PBOOLEAN CurrentState OPTIONAL);
10741
10742 NTSYSCALLAPI
10743 NTSTATUS
10744 NTAPI
10745 NtClose(
10746 IN HANDLE Handle);
10747
10748 NTSYSAPI
10749 NTSTATUS
10750 NTAPI
10751 ZwClose(
10752 IN HANDLE Handle);
10753
10754 NTSYSAPI
10755 NTSTATUS
10756 NTAPI
10757 ZwCreateDirectoryObject(
10758 OUT PHANDLE DirectoryHandle,
10759 IN ACCESS_MASK DesiredAccess,
10760 IN POBJECT_ATTRIBUTES ObjectAttributes);
10761
10762 NTSYSCALLAPI
10763 NTSTATUS
10764 NTAPI
10765 NtCreateEvent(
10766 OUT PHANDLE EventHandle,
10767 IN ACCESS_MASK DesiredAccess,
10768 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
10769 IN EVENT_TYPE EventType,
10770 IN BOOLEAN InitialState);
10771
10772 NTSYSAPI
10773 NTSTATUS
10774 NTAPI
10775 ZwCreateEvent(
10776 OUT PHANDLE EventHandle,
10777 IN ACCESS_MASK DesiredAccess,
10778 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
10779 IN EVENT_TYPE EventType,
10780 IN BOOLEAN InitialState);
10781
10782 NTSYSAPI
10783 NTSTATUS
10784 NTAPI
10785 ZwCreateFile(
10786 OUT PHANDLE FileHandle,
10787 IN ACCESS_MASK DesiredAccess,
10788 IN POBJECT_ATTRIBUTES ObjectAttributes,
10789 OUT PIO_STATUS_BLOCK IoStatusBlock,
10790 IN PLARGE_INTEGER AllocationSize OPTIONAL,
10791 IN ULONG FileAttributes,
10792 IN ULONG ShareAccess,
10793 IN ULONG CreateDisposition,
10794 IN ULONG CreateOptions,
10795 IN PVOID EaBuffer OPTIONAL,
10796 IN ULONG EaLength);
10797
10798 NTSYSAPI
10799 NTSTATUS
10800 NTAPI
10801 ZwCreateKey(
10802 OUT PHANDLE KeyHandle,
10803 IN ACCESS_MASK DesiredAccess,
10804 IN POBJECT_ATTRIBUTES ObjectAttributes,
10805 IN ULONG TitleIndex,
10806 IN PUNICODE_STRING Class OPTIONAL,
10807 IN ULONG CreateOptions,
10808 OUT PULONG Disposition OPTIONAL);
10809
10810 NTSYSAPI
10811 NTSTATUS
10812 NTAPI
10813 ZwCreateTimer(
10814 OUT PHANDLE TimerHandle,
10815 IN ACCESS_MASK DesiredAccess,
10816 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
10817 IN TIMER_TYPE TimerType);
10818
10819 NTSYSAPI
10820 NTSTATUS
10821 NTAPI
10822 ZwDeleteKey(
10823 IN HANDLE KeyHandle);
10824
10825 NTSYSAPI
10826 NTSTATUS
10827 NTAPI
10828 ZwDeleteValueKey(
10829 IN HANDLE KeyHandle,
10830 IN PUNICODE_STRING ValueName);
10831
10832 NTSYSCALLAPI
10833 NTSTATUS
10834 NTAPI
10835 NtDeviceIoControlFile(
10836 IN HANDLE DeviceHandle,
10837 IN HANDLE Event OPTIONAL,
10838 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
10839 IN PVOID UserApcContext OPTIONAL,
10840 OUT PIO_STATUS_BLOCK IoStatusBlock,
10841 IN ULONG IoControlCode,
10842 IN PVOID InputBuffer,
10843 IN ULONG InputBufferSize,
10844 OUT PVOID OutputBuffer,
10845 IN ULONG OutputBufferSize);
10846
10847 NTSYSAPI
10848 NTSTATUS
10849 NTAPI
10850 ZwDeviceIoControlFile(
10851 IN HANDLE DeviceHandle,
10852 IN HANDLE Event OPTIONAL,
10853 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
10854 IN PVOID UserApcContext OPTIONAL,
10855 OUT PIO_STATUS_BLOCK IoStatusBlock,
10856 IN ULONG IoControlCode,
10857 IN PVOID InputBuffer,
10858 IN ULONG InputBufferSize,
10859 OUT PVOID OutputBuffer,
10860 IN ULONG OutputBufferSize);
10861
10862 NTSYSAPI
10863 NTSTATUS
10864 NTAPI
10865 ZwEnumerateKey(
10866 IN HANDLE KeyHandle,
10867 IN ULONG Index,
10868 IN KEY_INFORMATION_CLASS KeyInformationClass,
10869 OUT PVOID KeyInformation,
10870 IN ULONG Length,
10871 OUT PULONG ResultLength);
10872
10873 NTSYSAPI
10874 NTSTATUS
10875 NTAPI
10876 ZwEnumerateValueKey(
10877 IN HANDLE KeyHandle,
10878 IN ULONG Index,
10879 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
10880 OUT PVOID KeyValueInformation,
10881 IN ULONG Length,
10882 OUT PULONG ResultLength);
10883
10884 NTSYSAPI
10885 NTSTATUS
10886 NTAPI
10887 ZwFlushKey(
10888 IN HANDLE KeyHandle);
10889
10890 NTSYSAPI
10891 NTSTATUS
10892 NTAPI
10893 ZwMakeTemporaryObject(
10894 IN HANDLE Handle);
10895
10896 NTSYSCALLAPI
10897 NTSTATUS
10898 NTAPI
10899 NtMapViewOfSection(
10900 IN HANDLE SectionHandle,
10901 IN HANDLE ProcessHandle,
10902 IN OUT PVOID *BaseAddress,
10903 IN ULONG ZeroBits,
10904 IN ULONG CommitSize,
10905 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
10906 IN OUT PSIZE_T ViewSize,
10907 IN SECTION_INHERIT InheritDisposition,
10908 IN ULONG AllocationType,
10909 IN ULONG Protect);
10910
10911 NTSYSAPI
10912 NTSTATUS
10913 NTAPI
10914 ZwMapViewOfSection(
10915 IN HANDLE SectionHandle,
10916 IN HANDLE ProcessHandle,
10917 IN OUT PVOID *BaseAddress,
10918 IN ULONG ZeroBits,
10919 IN ULONG CommitSize,
10920 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
10921 IN OUT PSIZE_T ViewSize,
10922 IN SECTION_INHERIT InheritDisposition,
10923 IN ULONG AllocationType,
10924 IN ULONG Protect);
10925
10926 NTSYSCALLAPI
10927 NTSTATUS
10928 NTAPI
10929 NtOpenFile(
10930 OUT PHANDLE FileHandle,
10931 IN ACCESS_MASK DesiredAccess,
10932 IN POBJECT_ATTRIBUTES ObjectAttributes,
10933 OUT PIO_STATUS_BLOCK IoStatusBlock,
10934 IN ULONG ShareAccess,
10935 IN ULONG OpenOptions);
10936
10937 NTSYSAPI
10938 NTSTATUS
10939 NTAPI
10940 ZwOpenFile(
10941 OUT PHANDLE FileHandle,
10942 IN ACCESS_MASK DesiredAccess,
10943 IN POBJECT_ATTRIBUTES ObjectAttributes,
10944 OUT PIO_STATUS_BLOCK IoStatusBlock,
10945 IN ULONG ShareAccess,
10946 IN ULONG OpenOptions);
10947
10948 NTSYSAPI
10949 NTSTATUS
10950 NTAPI
10951 ZwOpenKey(
10952 OUT PHANDLE KeyHandle,
10953 IN ACCESS_MASK DesiredAccess,
10954 IN POBJECT_ATTRIBUTES ObjectAttributes);
10955
10956 NTSYSAPI
10957 NTSTATUS
10958 NTAPI
10959 ZwOpenSection(
10960 OUT PHANDLE SectionHandle,
10961 IN ACCESS_MASK DesiredAccess,
10962 IN POBJECT_ATTRIBUTES ObjectAttributes);
10963
10964 NTSYSAPI
10965 NTSTATUS
10966 NTAPI
10967 ZwOpenSymbolicLinkObject(
10968 OUT PHANDLE LinkHandle,
10969 IN ACCESS_MASK DesiredAccess,
10970 IN POBJECT_ATTRIBUTES ObjectAttributes);
10971
10972 NTSYSAPI
10973 NTSTATUS
10974 NTAPI
10975 ZwOpenTimer(
10976 OUT PHANDLE TimerHandle,
10977 IN ACCESS_MASK DesiredAccess,
10978 IN POBJECT_ATTRIBUTES ObjectAttributes);
10979
10980 NTSYSAPI
10981 NTSTATUS
10982 NTAPI
10983 ZwQueryInformationFile(
10984 IN HANDLE FileHandle,
10985 OUT PIO_STATUS_BLOCK IoStatusBlock,
10986 OUT PVOID FileInformation,
10987 IN ULONG Length,
10988 IN FILE_INFORMATION_CLASS FileInformationClass);
10989
10990 NTSYSAPI
10991 NTSTATUS
10992 NTAPI
10993 ZwQueryKey(
10994 IN HANDLE KeyHandle,
10995 IN KEY_INFORMATION_CLASS KeyInformationClass,
10996 OUT PVOID KeyInformation,
10997 IN ULONG Length,
10998 OUT PULONG ResultLength);
10999
11000 NTSYSAPI
11001 NTSTATUS
11002 NTAPI
11003 ZwQuerySymbolicLinkObject(
11004 IN HANDLE LinkHandle,
11005 IN OUT PUNICODE_STRING LinkTarget,
11006 OUT PULONG ReturnedLength OPTIONAL);
11007
11008 NTSYSAPI
11009 NTSTATUS
11010 NTAPI
11011 ZwQueryValueKey(
11012 IN HANDLE KeyHandle,
11013 IN PUNICODE_STRING ValueName,
11014 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
11015 OUT PVOID KeyValueInformation,
11016 IN ULONG Length,
11017 OUT PULONG ResultLength);
11018
11019 NTSYSCALLAPI
11020 NTSTATUS
11021 NTAPI
11022 NtReadFile(
11023 IN HANDLE FileHandle,
11024 IN HANDLE Event OPTIONAL,
11025 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
11026 IN PVOID ApcContext OPTIONAL,
11027 OUT PIO_STATUS_BLOCK IoStatusBlock,
11028 OUT PVOID Buffer,
11029 IN ULONG Length,
11030 IN PLARGE_INTEGER ByteOffset OPTIONAL,
11031 IN PULONG Key OPTIONAL);
11032
11033 NTSYSAPI
11034 NTSTATUS
11035 NTAPI
11036 ZwReadFile(
11037 IN HANDLE FileHandle,
11038 IN HANDLE Event OPTIONAL,
11039 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
11040 IN PVOID ApcContext OPTIONAL,
11041 OUT PIO_STATUS_BLOCK IoStatusBlock,
11042 OUT PVOID Buffer,
11043 IN ULONG Length,
11044 IN PLARGE_INTEGER ByteOffset OPTIONAL,
11045 IN PULONG Key OPTIONAL);
11046
11047 NTSYSCALLAPI
11048 NTSTATUS
11049 NTAPI
11050 NtSetEvent(
11051 IN HANDLE EventHandle,
11052 OUT PLONG PreviousState OPTIONAL);
11053
11054 NTSYSAPI
11055 NTSTATUS
11056 NTAPI
11057 ZwSetEvent(
11058 IN HANDLE EventHandle,
11059 OUT PLONG PreviousState OPTIONAL);
11060
11061 NTSYSAPI
11062 NTSTATUS
11063 NTAPI
11064 ZwSetInformationFile(
11065 IN HANDLE FileHandle,
11066 OUT PIO_STATUS_BLOCK IoStatusBlock,
11067 IN PVOID FileInformation,
11068 IN ULONG Length,
11069 IN FILE_INFORMATION_CLASS FileInformationClass);
11070
11071 NTSYSAPI
11072 NTSTATUS
11073 NTAPI
11074 ZwSetInformationThread(
11075 IN HANDLE ThreadHandle,
11076 IN THREADINFOCLASS ThreadInformationClass,
11077 IN PVOID ThreadInformation,
11078 IN ULONG ThreadInformationLength);
11079
11080 NTSYSAPI
11081 NTSTATUS
11082 NTAPI
11083 ZwSetTimer(
11084 IN HANDLE TimerHandle,
11085 IN PLARGE_INTEGER DueTime,
11086 IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL,
11087 IN PVOID TimerContext OPTIONAL,
11088 IN BOOLEAN WakeTimer,
11089 IN LONG Period OPTIONAL,
11090 OUT PBOOLEAN PreviousState OPTIONAL);
11091
11092 NTSYSAPI
11093 NTSTATUS
11094 NTAPI
11095 ZwSetValueKey(
11096 IN HANDLE KeyHandle,
11097 IN PUNICODE_STRING ValueName,
11098 IN ULONG TitleIndex OPTIONAL,
11099 IN ULONG Type,
11100 IN PVOID Data,
11101 IN ULONG DataSize);
11102
11103 /* [Nt|Zw]MapViewOfSection.InheritDisposition constants */
11104 #define AT_EXTENDABLE_FILE 0x00002000
11105 #define AT_RESERVED 0x20000000
11106 #define AT_ROUND_TO_PAGE 0x40000000
11107
11108 NTSYSCALLAPI
11109 NTSTATUS
11110 NTAPI
11111 NtUnmapViewOfSection(
11112 IN HANDLE ProcessHandle,
11113 IN PVOID BaseAddress);
11114
11115 NTSYSAPI
11116 NTSTATUS
11117 NTAPI
11118 ZwUnmapViewOfSection(
11119 IN HANDLE ProcessHandle,
11120 IN PVOID BaseAddress);
11121
11122 NTSYSCALLAPI
11123 NTSTATUS
11124 NTAPI
11125 NtWaitForSingleObject(
11126 IN HANDLE ObjectHandle,
11127 IN BOOLEAN Alertable,
11128 IN PLARGE_INTEGER TimeOut OPTIONAL);
11129
11130 NTSYSAPI
11131 NTSTATUS
11132 NTAPI
11133 ZwWaitForSingleObject(
11134 IN HANDLE ObjectHandle,
11135 IN BOOLEAN Alertable,
11136 IN PLARGE_INTEGER TimeOut OPTIONAL);
11137
11138 NTSYSCALLAPI
11139 NTSTATUS
11140 NTAPI
11141 NtWriteFile(
11142 IN HANDLE FileHandle,
11143 IN HANDLE Event OPTIONAL,
11144 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
11145 IN PVOID ApcContext OPTIONAL,
11146 OUT PIO_STATUS_BLOCK IoStatusBlock,
11147 IN PVOID Buffer,
11148 IN ULONG Length,
11149 IN PLARGE_INTEGER ByteOffset OPTIONAL,
11150 IN PULONG Key OPTIONAL);
11151
11152 NTSYSAPI
11153 NTSTATUS
11154 NTAPI
11155 ZwWriteFile(
11156 IN HANDLE FileHandle,
11157 IN HANDLE Event OPTIONAL,
11158 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
11159 IN PVOID ApcContext OPTIONAL,
11160 OUT PIO_STATUS_BLOCK IoStatusBlock,
11161 IN PVOID Buffer,
11162 IN ULONG Length,
11163 IN PLARGE_INTEGER ByteOffset OPTIONAL,
11164 IN PULONG Key OPTIONAL);
11165
11166
11167
11168 /** Power management support routines **/
11169
11170 NTKERNELAPI
11171 NTSTATUS
11172 NTAPI
11173 PoCallDriver(
11174 IN PDEVICE_OBJECT DeviceObject,
11175 IN OUT PIRP Irp);
11176
11177 NTKERNELAPI
11178 PULONG
11179 NTAPI
11180 PoRegisterDeviceForIdleDetection(
11181 IN PDEVICE_OBJECT DeviceObject,
11182 IN ULONG ConservationIdleTime,
11183 IN ULONG PerformanceIdleTime,
11184 IN DEVICE_POWER_STATE State);
11185
11186 NTKERNELAPI
11187 PVOID
11188 NTAPI
11189 PoRegisterSystemState(
11190 IN PVOID StateHandle,
11191 IN EXECUTION_STATE Flags);
11192
11193 NTKERNELAPI
11194 NTSTATUS
11195 NTAPI
11196 PoRequestPowerIrp(
11197 IN PDEVICE_OBJECT DeviceObject,
11198 IN UCHAR MinorFunction,
11199 IN POWER_STATE PowerState,
11200 IN PREQUEST_POWER_COMPLETE CompletionFunction,
11201 IN PVOID Context,
11202 OUT PIRP *Irp OPTIONAL);
11203
11204 NTKERNELAPI
11205 NTSTATUS
11206 NTAPI
11207 PoRequestShutdownEvent(
11208 OUT PVOID *Event);
11209
11210 NTKERNELAPI
11211 VOID
11212 NTAPI
11213 PoSetDeviceBusy(
11214 PULONG IdlePointer);
11215
11216 NTKERNELAPI
11217 POWER_STATE
11218 NTAPI
11219 PoSetPowerState(
11220 IN PDEVICE_OBJECT DeviceObject,
11221 IN POWER_STATE_TYPE Type,
11222 IN POWER_STATE State);
11223
11224 NTKERNELAPI
11225 VOID
11226 NTAPI
11227 PoSetSystemState(
11228 IN EXECUTION_STATE Flags);
11229
11230 NTKERNELAPI
11231 VOID
11232 NTAPI
11233 PoStartNextPowerIrp(
11234 IN PIRP Irp);
11235
11236 NTKERNELAPI
11237 VOID
11238 NTAPI
11239 PoUnregisterSystemState(
11240 IN PVOID StateHandle);
11241
11242
11243
11244 /** WMI library support routines **/
11245
11246 NTSTATUS
11247 NTAPI
11248 WmiCompleteRequest(
11249 IN PDEVICE_OBJECT DeviceObject,
11250 IN PIRP Irp,
11251 IN NTSTATUS Status,
11252 IN ULONG BufferUsed,
11253 IN CCHAR PriorityBoost);
11254
11255 NTSTATUS
11256 NTAPI
11257 WmiFireEvent(
11258 IN PDEVICE_OBJECT DeviceObject,
11259 IN LPGUID Guid,
11260 IN ULONG InstanceIndex,
11261 IN ULONG EventDataSize,
11262 IN PVOID EventData);
11263
11264 NTKERNELAPI
11265 NTSTATUS
11266 NTAPI
11267 WmiQueryTraceInformation(
11268 IN TRACE_INFORMATION_CLASS TraceInformationClass,
11269 OUT PVOID TraceInformation,
11270 IN ULONG TraceInformationLength,
11271 OUT PULONG RequiredLength OPTIONAL,
11272 IN PVOID Buffer OPTIONAL);
11273
11274 NTSTATUS
11275 NTAPI
11276 WmiSystemControl(
11277 IN PWMILIB_CONTEXT WmiLibInfo,
11278 IN PDEVICE_OBJECT DeviceObject,
11279 IN PIRP Irp,
11280 OUT PSYSCTL_IRP_DISPOSITION IrpDisposition);
11281
11282 NTKERNELAPI
11283 NTSTATUS
11284 DDKCDECLAPI
11285 WmiTraceMessage(
11286 IN TRACEHANDLE LoggerHandle,
11287 IN ULONG MessageFlags,
11288 IN LPGUID MessageGuid,
11289 IN USHORT MessageNumber,
11290 IN ...);
11291
11292 #if 0
11293 /* FIXME: Get va_list from where? */
11294 NTKERNELAPI
11295 NTSTATUS
11296 DDKCDECLAPI
11297 WmiTraceMessageVa(
11298 IN TRACEHANDLE LoggerHandle,
11299 IN ULONG MessageFlags,
11300 IN LPGUID MessageGuid,
11301 IN USHORT MessageNumber,
11302 IN va_list MessageArgList);
11303 #endif
11304
11305
11306 /** Kernel debugger routines **/
11307
11308 NTKERNELAPI
11309 NTSTATUS
11310 NTAPI
11311 KdDisableDebugger(
11312 VOID);
11313
11314 NTKERNELAPI
11315 NTSTATUS
11316 NTAPI
11317 KdEnableDebugger(
11318 VOID);
11319
11320 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
11321 NTKERNELAPI
11322 NTSTATUS
11323 NTAPI
11324 KdChangeOption(
11325 IN KD_OPTION Option,
11326 IN ULONG InBufferBytes OPTIONAL,
11327 IN PVOID InBuffer,
11328 IN ULONG OutBufferBytes OPTIONAL,
11329 OUT PVOID OutBuffer,
11330 OUT PULONG OutBufferNeeded OPTIONAL);
11331 #endif
11332
11333 VOID
11334 NTAPI
11335 DbgBreakPoint(
11336 VOID);
11337
11338 NTSYSAPI
11339 VOID
11340 NTAPI
11341 DbgBreakPointWithStatus(
11342 IN ULONG Status);
11343
11344 ULONG
11345 DDKCDECLAPI
11346 DbgPrint(
11347 IN PCCH Format,
11348 IN ...);
11349
11350 ULONG
11351 DDKCDECLAPI
11352 DbgPrintEx(
11353 IN ULONG ComponentId,
11354 IN ULONG Level,
11355 IN PCCH Format,
11356 IN ...);
11357
11358 ULONG
11359 DDKCDECLAPI
11360 vDbgPrintEx(
11361 IN ULONG ComponentId,
11362 IN ULONG Level,
11363 IN LPCSTR Format,
11364 IN va_list ap);
11365
11366 ULONG
11367 DDKCDECLAPI
11368 vDbgPrintExWithPrefix(
11369 IN LPCSTR Prefix,
11370 IN ULONG ComponentId,
11371 IN ULONG Level,
11372 IN LPCSTR Format,
11373 IN va_list ap);
11374
11375 NTKERNELAPI
11376 ULONG
11377 DDKCDECLAPI
11378 DbgPrintReturnControlC(
11379 IN PCH Format,
11380 IN ...);
11381
11382 NTKERNELAPI
11383 BOOLEAN
11384 NTAPI
11385 DbgQueryDebugFilterState(
11386 IN ULONG ComponentId,
11387 IN ULONG Level);
11388
11389 NTKERNELAPI
11390 NTSTATUS
11391 NTAPI
11392 DbgSetDebugFilterState(
11393 IN ULONG ComponentId,
11394 IN ULONG Level,
11395 IN BOOLEAN State);
11396
11397 #ifdef DBG
11398
11399 #define KdPrint(_x_) DbgPrint _x_
11400 #define KdPrintEx(_x_) DbgPrintEx _x_
11401 #define KdBreakPoint() DbgBreakPoint()
11402 #define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
11403
11404 #else /* !DBG */
11405
11406 #define KdPrint(_x_)
11407 #define KdPrintEx(_x_)
11408 #define KdBreakPoint()
11409 #define KdBreakPointWithStatus(s)
11410
11411 #endif /* !DBG */
11412
11413 #if defined(_NTDDK_) || defined(_NTHAL_) || defined(_WDMDDK_) || defined(_NTOSP_)
11414
11415 extern NTKERNELAPI PBOOLEAN KdDebuggerNotPresent;
11416 extern NTKERNELAPI PBOOLEAN KdDebuggerEnabled;
11417 #define KD_DEBUGGER_ENABLED *KdDebuggerEnabled
11418 #define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
11419
11420 #else
11421
11422 extern BOOLEAN KdDebuggerNotPresent;
11423 extern BOOLEAN KdDebuggerEnabled;
11424 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
11425 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
11426
11427 #endif
11428
11429 #ifdef __cplusplus
11430 }
11431 #endif
11432
11433 #endif /* __WINDDK_H */