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