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