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