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