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