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