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