- Fix SleepEx.
[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 #define PAGE_SIZE 0x1000
5223 #define PAGE_SHIFT 12L
5224
5225 extern NTKERNELAPI PVOID MmHighestUserAddress;
5226 extern NTKERNELAPI PVOID MmSystemRangeStart;
5227 extern NTKERNELAPI ULONG_PTR MmUserProbeAddress;
5228
5229 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
5230 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
5231 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
5232 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
5233 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000
5234
5235 #define KI_USER_SHARED_DATA 0xffdf0000
5236 #define SharedUserData ((KUSER_SHARED_DATA * CONST) KI_USER_SHARED_DATA)
5237
5238 #define EFLAG_SIGN 0x8000
5239 #define EFLAG_ZERO 0x4000
5240 #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
5241
5242 #define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
5243 #define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
5244 #define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
5245
5246 typedef enum _INTERLOCKED_RESULT {
5247 ResultNegative = RESULT_NEGATIVE,
5248 ResultZero = RESULT_ZERO,
5249 ResultPositive = RESULT_POSITIVE
5250 } INTERLOCKED_RESULT;
5251
5252 typedef VOID
5253 (NTAPI *PciPin2Line)(
5254 IN struct _BUS_HANDLER *BusHandler,
5255 IN struct _BUS_HANDLER *RootHandler,
5256 IN PCI_SLOT_NUMBER SlotNumber,
5257 IN PPCI_COMMON_CONFIG PciData
5258 );
5259
5260 typedef VOID
5261 (NTAPI *PciLine2Pin)(
5262 IN struct _BUS_HANDLER *BusHandler,
5263 IN struct _BUS_HANDLER *RootHandler,
5264 IN PCI_SLOT_NUMBER SlotNumber,
5265 IN PPCI_COMMON_CONFIG PciNewData,
5266 IN PPCI_COMMON_CONFIG PciOldData
5267 );
5268
5269 typedef VOID
5270 (NTAPI *PciReadWriteConfig)(
5271 IN struct _BUS_HANDLER *BusHandler,
5272 IN PCI_SLOT_NUMBER Slot,
5273 IN PVOID Buffer,
5274 IN ULONG Offset,
5275 IN ULONG Length
5276 );
5277
5278 #define PCI_DATA_TAG TAG('P', 'C', 'I', ' ')
5279 #define PCI_DATA_VERSION 1
5280
5281 typedef struct _PCIBUSDATA
5282 {
5283 ULONG Tag;
5284 ULONG Version;
5285 PciReadWriteConfig ReadConfig;
5286 PciReadWriteConfig WriteConfig;
5287 PciPin2Line Pin2Line;
5288 PciLine2Pin Line2Pin;
5289 PCI_SLOT_NUMBER ParentSlot;
5290 PVOID Reserved[4];
5291 } PCIBUSDATA, *PPCIBUSDATA;
5292
5293 NTHALAPI
5294 KIRQL
5295 DDKAPI
5296 KeGetCurrentIrql(
5297 VOID);
5298
5299 static __inline
5300 ULONG
5301 DDKAPI
5302 KeGetCurrentProcessorNumber(VOID)
5303 {
5304 #if defined(__GNUC__)
5305 ULONG ret;
5306 __asm__ __volatile__ (
5307 "movl %%fs:%c1, %0\n"
5308 : "=r" (ret)
5309 : "i" (FIELD_OFFSET(KPCR, Number))
5310 );
5311 return ret;
5312 #elif defined(_MSC_VER)
5313 #if _MSC_FULL_VER >= 13012035
5314 return (ULONG)__readfsbyte(FIELD_OFFSET(KPCR, Number));
5315 #else
5316 __asm { movzx eax, _PCR KPCR.Number }
5317 #endif
5318 #else
5319 #error Unknown compiler
5320 #endif
5321 }
5322
5323 #if !defined(__INTERLOCKED_DECLARED)
5324 #define __INTERLOCKED_DECLARED
5325
5326 NTKERNELAPI
5327 LONG
5328 FASTCALL
5329 InterlockedIncrement(
5330 IN OUT LONG volatile *Addend);
5331
5332 NTKERNELAPI
5333 LONG
5334 FASTCALL
5335 InterlockedDecrement(
5336 IN OUT LONG volatile *Addend);
5337
5338 NTKERNELAPI
5339 LONG
5340 FASTCALL
5341 InterlockedCompareExchange(
5342 IN OUT LONG volatile *Destination,
5343 IN LONG Exchange,
5344 IN LONG Comparand);
5345
5346 NTKERNELAPI
5347 LONG
5348 FASTCALL
5349 InterlockedExchange(
5350 IN OUT LONG volatile *Destination,
5351 IN LONG Value);
5352
5353 NTKERNELAPI
5354 LONG
5355 FASTCALL
5356 InterlockedExchangeAdd(
5357 IN OUT LONG volatile *Addend,
5358 IN LONG Value);
5359
5360 /*
5361 * PVOID
5362 * InterlockedExchangePointer(
5363 * IN OUT PVOID VOLATILE *Target,
5364 * IN PVOID Value)
5365 */
5366 #define InterlockedExchangePointer(Target, Value) \
5367 ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
5368
5369 /*
5370 * PVOID
5371 * InterlockedCompareExchangePointer(
5372 * IN OUT PVOID *Destination,
5373 * IN PVOID Exchange,
5374 * IN PVOID Comparand)
5375 */
5376 #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
5377 ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
5378
5379 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
5380 #define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
5381 #define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
5382
5383 #endif /* !__INTERLOCKED_DECLARED */
5384
5385 NTKERNELAPI
5386 VOID
5387 FASTCALL
5388 KefAcquireSpinLockAtDpcLevel(
5389 IN PKSPIN_LOCK SpinLock);
5390
5391 NTKERNELAPI
5392 VOID
5393 FASTCALL
5394 KefReleaseSpinLockFromDpcLevel(
5395 IN PKSPIN_LOCK SpinLock);
5396
5397 NTHALAPI
5398 KIRQL
5399 FASTCALL
5400 KfAcquireSpinLock(
5401 IN PKSPIN_LOCK SpinLock);
5402
5403 NTHALAPI
5404 VOID
5405 FASTCALL
5406 KfReleaseSpinLock(
5407 IN PKSPIN_LOCK SpinLock,
5408 IN KIRQL NewIrql);
5409
5410 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
5411 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
5412 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
5413 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
5414
5415 #define RtlCopyMemoryNonTemporal RtlCopyMemory
5416
5417 #define KeGetDcacheFillSize() 1L
5418
5419 #endif /* _X86_ */
5420
5421
5422
5423 /*
5424 ** Utillity functions
5425 */
5426
5427 #define ARGUMENT_PRESENT(ArgumentPointer) \
5428 ((BOOLEAN) ((PVOID)ArgumentPointer != (PVOID)NULL))
5429
5430 /*
5431 * ULONG
5432 * BYTE_OFFSET(
5433 * IN PVOID Va)
5434 */
5435 #define BYTE_OFFSET(Va) \
5436 ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
5437
5438 /*
5439 * ULONG
5440 * BYTES_TO_PAGES(
5441 * IN ULONG Size)
5442 */
5443 #define BYTES_TO_PAGES(Size) \
5444 ((ULONG) ((ULONG_PTR) (Size) >> PAGE_SHIFT) + (((ULONG) (Size) & (PAGE_SIZE - 1)) != 0))
5445
5446 /*
5447 * PCHAR
5448 * CONTAINING_RECORD(
5449 * IN PCHAR Address,
5450 * IN TYPE Type,
5451 * IN PCHAR Field);
5452 */
5453 #ifndef CONTAINING_RECORD
5454 #define CONTAINING_RECORD(address, type, field) \
5455 ((type *)(((ULONG_PTR)address) - (ULONG_PTR)(&(((type *)0)->field))))
5456 #endif
5457
5458 /* LONG
5459 * FIELD_OFFSET(
5460 * IN TYPE Type,
5461 * IN PCHAR Field);
5462 */
5463 #ifndef FIELD_OFFSET
5464 #define FIELD_OFFSET(Type, Field) \
5465 ((LONG) (&(((Type *) 0)->Field)))
5466 #endif
5467
5468 /*
5469 * PVOID
5470 * PAGE_ALIGN(
5471 * IN PVOID Va)
5472 */
5473 #define PAGE_ALIGN(Va) \
5474 ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
5475
5476 /*
5477 * ULONG_PTR
5478 * ROUND_TO_PAGES(
5479 * IN ULONG_PTR Size)
5480 */
5481 #define ROUND_TO_PAGES(Size) \
5482 ((ULONG_PTR) (((ULONG_PTR) Size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1)))
5483
5484 NTSYSAPI
5485 VOID
5486 NTAPI
5487 RtlAssert(
5488 IN PVOID FailedAssertion,
5489 IN PVOID FileName,
5490 IN ULONG LineNumber,
5491 IN PCHAR Message);
5492
5493 #ifdef DBG
5494
5495 #define ASSERT(exp) \
5496 (VOID)((!(exp)) ? \
5497 RtlAssert( #exp, __FILE__, __LINE__, NULL ), FALSE : TRUE)
5498
5499 #define ASSERTMSG(msg, exp) \
5500 (VOID)((!(exp)) ? \
5501 RtlAssert( #exp, __FILE__, __LINE__, msg ), FALSE : TRUE)
5502
5503 #define RTL_SOFT_ASSERT(exp) \
5504 (VOID)((!(_exp)) ? \
5505 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE)
5506
5507 #define RTL_SOFT_ASSERTMSG(msg, exp) \
5508 (VOID)((!(exp)) ? \
5509 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE)
5510
5511 #define RTL_VERIFY(exp) ASSERT(exp)
5512 #define RTL_VERIFYMSG(msg, exp) ASSERT(msg, exp)
5513
5514 #define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
5515 #define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
5516
5517 #else /* !DBG */
5518
5519 #define ASSERT(exp) ((VOID) 0)
5520 #define ASSERTMSG(msg, exp) ((VOID) 0)
5521
5522 #define RTL_SOFT_ASSERT(exp) ((VOID) 0)
5523 #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
5524
5525 #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
5526 #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
5527
5528 #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
5529 #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
5530
5531 #endif /* DBG */
5532
5533 /* HACK HACK HACK - GCC (or perhaps LD) is messing this up */
5534 #if defined(_NTSYSTEM_) || defined(__GNUC__)
5535 #define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag
5536 #define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag
5537 #else
5538 #define NLS_MB_CODE_PAGE_TAG (*NlsMbCodePageTag)
5539 #define NLS_MB_OEM_CODE_PAGE_TAG (*NlsMbOemCodePageTag)
5540 #endif /* _NT_SYSTEM */
5541
5542 extern BOOLEAN NTSYSAPI NLS_MB_CODE_PAGE_TAG;
5543 extern BOOLEAN NTSYSAPI NLS_MB_OEM_CODE_PAGE_TAG;
5544
5545 /*
5546 ** Driver support routines
5547 */
5548
5549 /** Runtime library routines **/
5550
5551 static __inline VOID
5552 InitializeListHead(
5553 IN PLIST_ENTRY ListHead)
5554 {
5555 ListHead->Flink = ListHead->Blink = ListHead;
5556 }
5557
5558 static __inline VOID
5559 InsertHeadList(
5560 IN PLIST_ENTRY ListHead,
5561 IN PLIST_ENTRY Entry)
5562 {
5563 PLIST_ENTRY OldFlink;
5564 OldFlink = ListHead->Flink;
5565 Entry->Flink = OldFlink;
5566 Entry->Blink = ListHead;
5567 OldFlink->Blink = Entry;
5568 ListHead->Flink = Entry;
5569 }
5570
5571 static __inline VOID
5572 InsertTailList(
5573 IN PLIST_ENTRY ListHead,
5574 IN PLIST_ENTRY Entry)
5575 {
5576 PLIST_ENTRY OldBlink;
5577 OldBlink = ListHead->Blink;
5578 Entry->Flink = ListHead;
5579 Entry->Blink = OldBlink;
5580 OldBlink->Flink = Entry;
5581 ListHead->Blink = Entry;
5582 }
5583
5584 /*
5585 * BOOLEAN
5586 * IsListEmpty(
5587 * IN PLIST_ENTRY ListHead)
5588 */
5589 #define IsListEmpty(_ListHead) \
5590 ((_ListHead)->Flink == (_ListHead))
5591
5592 /*
5593 * PSINGLE_LIST_ENTRY
5594 * PopEntryList(
5595 * IN PSINGLE_LIST_ENTRY ListHead)
5596 */
5597 #define PopEntryList(ListHead) \
5598 (ListHead)->Next; \
5599 { \
5600 PSINGLE_LIST_ENTRY _FirstEntry; \
5601 _FirstEntry = (ListHead)->Next; \
5602 if (_FirstEntry != NULL) \
5603 (ListHead)->Next = _FirstEntry->Next; \
5604 }
5605
5606 /*
5607 * VOID
5608 * PushEntryList(
5609 * IN PSINGLE_LIST_ENTRY ListHead,
5610 * IN PSINGLE_LIST_ENTRY Entry)
5611 */
5612 #define PushEntryList(_ListHead, _Entry) \
5613 (_Entry)->Next = (_ListHead)->Next; \
5614 (_ListHead)->Next = (_Entry); \
5615
5616 static __inline BOOLEAN
5617 RemoveEntryList(
5618 IN PLIST_ENTRY Entry)
5619 {
5620 PLIST_ENTRY OldFlink;
5621 PLIST_ENTRY OldBlink;
5622
5623 OldFlink = Entry->Flink;
5624 OldBlink = Entry->Blink;
5625 OldFlink->Blink = OldBlink;
5626 OldBlink->Flink = OldFlink;
5627 return (OldFlink == OldBlink);
5628 }
5629
5630 static __inline PLIST_ENTRY
5631 RemoveHeadList(
5632 IN PLIST_ENTRY ListHead)
5633 {
5634 PLIST_ENTRY Flink;
5635 PLIST_ENTRY Entry;
5636
5637 Entry = ListHead->Flink;
5638 Flink = Entry->Flink;
5639 ListHead->Flink = Flink;
5640 Flink->Blink = ListHead;
5641 return Entry;
5642 }
5643
5644 static __inline PLIST_ENTRY
5645 RemoveTailList(
5646 IN PLIST_ENTRY ListHead)
5647 {
5648 PLIST_ENTRY Blink;
5649 PLIST_ENTRY Entry;
5650
5651 Entry = ListHead->Blink;
5652 Blink = Entry->Blink;
5653 ListHead->Blink = Blink;
5654 Blink->Flink = ListHead;
5655 return Entry;
5656 }
5657
5658 #if !defined(_WINBASE_H) || _WIN32_WINNT < 0x0501
5659
5660 NTKERNELAPI
5661 PSLIST_ENTRY
5662 FASTCALL
5663 InterlockedPopEntrySList(
5664 IN PSLIST_HEADER ListHead);
5665
5666 NTKERNELAPI
5667 PSLIST_ENTRY
5668 FASTCALL
5669 InterlockedPushEntrySList(
5670 IN PSLIST_HEADER ListHead,
5671 IN PSLIST_ENTRY ListEntry);
5672
5673 #endif
5674
5675 /*
5676 * USHORT
5677 * QueryDepthSList(
5678 * IN PSLIST_HEADER SListHead)
5679 */
5680 #define QueryDepthSList(_SListHead) \
5681 ((USHORT) ((_SListHead)->Alignment & 0xffff))
5682
5683 #define InterlockedFlushSList(ListHead) ExInterlockedFlushSList(ListHead)
5684
5685 NTSYSAPI
5686 ULONG
5687 NTAPI
5688 RtlxAnsiStringToUnicodeSize(
5689 IN PCANSI_STRING AnsiString);
5690
5691 #define RtlAnsiStringToUnicodeSize(STRING) ( \
5692 NLS_MB_CODE_PAGE_TAG ? \
5693 RtlxAnsiStringToUnicodeSize(STRING) : \
5694 ((STRING)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
5695 )
5696
5697 NTSYSAPI
5698 NTSTATUS
5699 NTAPI
5700 RtlAnsiStringToUnicodeString(
5701 IN OUT PUNICODE_STRING DestinationString,
5702 IN PANSI_STRING SourceString,
5703 IN BOOLEAN AllocateDestinationString);
5704
5705 NTSYSAPI
5706 NTSTATUS
5707 NTAPI
5708 RtlAppendUnicodeStringToString(
5709 IN OUT PUNICODE_STRING Destination,
5710 IN PCUNICODE_STRING Source);
5711
5712 NTSYSAPI
5713 NTSTATUS
5714 NTAPI
5715 RtlAppendUnicodeToString(
5716 IN OUT PUNICODE_STRING Destination,
5717 IN PCWSTR Source);
5718
5719 NTSYSAPI
5720 BOOLEAN
5721 NTAPI
5722 RtlAreBitsClear(
5723 IN PRTL_BITMAP BitMapHeader,
5724 IN ULONG StartingIndex,
5725 IN ULONG Length);
5726
5727 NTSYSAPI
5728 BOOLEAN
5729 NTAPI
5730 RtlAreBitsSet(
5731 IN PRTL_BITMAP BitMapHeader,
5732 IN ULONG StartingIndex,
5733 IN ULONG Length);
5734
5735 NTSYSAPI
5736 NTSTATUS
5737 NTAPI
5738 RtlCharToInteger(
5739 IN PCSZ String,
5740 IN ULONG Base OPTIONAL,
5741 IN OUT PULONG Value);
5742
5743 NTSYSAPI
5744 ULONG
5745 NTAPI
5746 RtlCheckBit(
5747 IN PRTL_BITMAP BitMapHeader,
5748 IN ULONG BitPosition);
5749
5750 NTSYSAPI
5751 NTSTATUS
5752 NTAPI
5753 RtlCheckRegistryKey(
5754 IN ULONG RelativeTo,
5755 IN PWSTR Path);
5756
5757 NTSYSAPI
5758 VOID
5759 NTAPI
5760 RtlClearAllBits(
5761 IN PRTL_BITMAP BitMapHeader);
5762
5763 NTSYSAPI
5764 VOID
5765 NTAPI
5766 RtlClearBit(
5767 PRTL_BITMAP BitMapHeader,
5768 ULONG BitNumber);
5769
5770 NTSYSAPI
5771 VOID
5772 NTAPI
5773 RtlClearBits(
5774 IN PRTL_BITMAP BitMapHeader,
5775 IN ULONG StartingIndex,
5776 IN ULONG NumberToClear);
5777
5778 NTSYSAPI
5779 SIZE_T
5780 NTAPI
5781 RtlCompareMemory(
5782 IN CONST VOID *Source1,
5783 IN CONST VOID *Source2,
5784 IN SIZE_T Length);
5785
5786 NTSYSAPI
5787 LONG
5788 NTAPI
5789 RtlCompareString(
5790 IN PSTRING String1,
5791 IN PSTRING String2,
5792 BOOLEAN CaseInSensitive);
5793
5794 NTSYSAPI
5795 LONG
5796 NTAPI
5797 RtlCompareUnicodeString(
5798 IN PCUNICODE_STRING String1,
5799 IN PCUNICODE_STRING String2,
5800 IN BOOLEAN CaseInSensitive);
5801
5802 static __inline
5803 LARGE_INTEGER
5804 NTAPI_INLINE
5805 RtlConvertLongToLargeInteger(LONG SignedInteger)
5806 {
5807 LARGE_INTEGER Result;
5808
5809 Result.QuadPart = SignedInteger;
5810 return Result;
5811 }
5812
5813 NTSYSAPI
5814 LUID
5815 NTAPI
5816 RtlConvertLongToLuid(
5817 IN LONG Long);
5818
5819 NTSYSAPI
5820 LARGE_INTEGER
5821 NTAPI
5822 RtlConvertUlongToLargeInteger(
5823 IN ULONG UnsignedInteger);
5824
5825 NTSYSAPI
5826 LUID
5827 NTAPI
5828 RtlConvertUlongToLuid(
5829 ULONG Ulong);
5830
5831 /*
5832 * VOID
5833 * RtlCopyMemory(
5834 * IN VOID UNALIGNED *Destination,
5835 * IN CONST VOID UNALIGNED *Source,
5836 * IN SIZE_T Length)
5837 */
5838 #ifndef RtlCopyMemory
5839 #define RtlCopyMemory(Destination, Source, Length) \
5840 memcpy(Destination, Source, Length)
5841 #endif
5842
5843 #ifndef RtlCopyBytes
5844 #define RtlCopyBytes RtlCopyMemory
5845 #endif
5846
5847 NTSYSAPI
5848 VOID
5849 NTAPI
5850 RtlCopyMemory32(
5851 IN VOID UNALIGNED *Destination,
5852 IN CONST VOID UNALIGNED *Source,
5853 IN ULONG Length);
5854
5855 NTSYSAPI
5856 VOID
5857 NTAPI
5858 RtlCopyString(
5859 IN OUT PSTRING DestinationString,
5860 IN PSTRING SourceString OPTIONAL);
5861
5862 NTSYSAPI
5863 VOID
5864 NTAPI
5865 RtlCopyUnicodeString(
5866 IN OUT PUNICODE_STRING DestinationString,
5867 IN PCUNICODE_STRING SourceString);
5868
5869 NTSYSAPI
5870 NTSTATUS
5871 NTAPI
5872 RtlCreateRegistryKey(
5873 IN ULONG RelativeTo,
5874 IN PWSTR Path);
5875
5876 NTSYSAPI
5877 NTSTATUS
5878 NTAPI
5879 RtlCreateSecurityDescriptor(
5880 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
5881 IN ULONG Revision);
5882
5883 NTSYSAPI
5884 NTSTATUS
5885 NTAPI
5886 RtlDeleteRegistryValue(
5887 IN ULONG RelativeTo,
5888 IN PCWSTR Path,
5889 IN PCWSTR ValueName);
5890
5891 /*
5892 * BOOLEAN
5893 * RtlEqualLuid(
5894 * IN PLUID Luid1,
5895 * IN PLUID Luid2)
5896 */
5897 #define RtlEqualLuid(Luid1, \
5898 Luid2) \
5899 (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
5900
5901 /*
5902 * ULONG
5903 * RtlEqualMemory(
5904 * IN VOID UNALIGNED *Destination,
5905 * IN CONST VOID UNALIGNED *Source,
5906 * IN SIZE_T Length)
5907 */
5908 #define RtlEqualMemory(Destination, Source, Length) (!memcmp(Destination, Source, Length))
5909
5910 NTSYSAPI
5911 BOOLEAN
5912 NTAPI
5913 RtlEqualString(
5914 IN PSTRING String1,
5915 IN PSTRING String2,
5916 IN BOOLEAN CaseInSensitive);
5917
5918 NTSYSAPI
5919 BOOLEAN
5920 NTAPI
5921 RtlEqualUnicodeString(
5922 IN CONST UNICODE_STRING *String1,
5923 IN CONST UNICODE_STRING *String2,
5924 IN BOOLEAN CaseInSensitive);
5925
5926 /*
5927 * VOID
5928 * RtlFillMemory(
5929 * IN VOID UNALIGNED *Destination,
5930 * IN SIZE_T Length,
5931 * IN UCHAR Fill)
5932 */
5933 #ifndef RtlFillMemory
5934 #define RtlFillMemory(Destination, Length, Fill) \
5935 memset(Destination, Fill, Length)
5936 #endif
5937
5938 #ifndef RtlFillBytes
5939 #define RtlFillBytes RtlFillMemory
5940 #endif
5941
5942 NTSYSAPI
5943 ULONG
5944 NTAPI
5945 RtlFindClearBits(
5946 IN PRTL_BITMAP BitMapHeader,
5947 IN ULONG NumberToFind,
5948 IN ULONG HintIndex);
5949
5950 NTSYSAPI
5951 ULONG
5952 NTAPI
5953 RtlFindClearBitsAndSet(
5954 IN PRTL_BITMAP BitMapHeader,
5955 IN ULONG NumberToFind,
5956 IN ULONG HintIndex);
5957
5958 NTSYSAPI
5959 ULONG
5960 NTAPI
5961 RtlFindClearRuns(
5962 IN PRTL_BITMAP BitMapHeader,
5963 OUT PRTL_BITMAP_RUN RunArray,
5964 IN ULONG SizeOfRunArray,
5965 IN BOOLEAN LocateLongestRuns);
5966
5967 NTSYSAPI
5968 ULONG
5969 NTAPI
5970 RtlFindFirstRunClear(
5971 IN PRTL_BITMAP BitMapHeader,
5972 OUT PULONG StartingIndex);
5973
5974 NTSYSAPI
5975 ULONG
5976 NTAPI
5977 RtlFindLastBackwardRunClear(
5978 IN PRTL_BITMAP BitMapHeader,
5979 IN ULONG FromIndex,
5980 OUT PULONG StartingRunIndex);
5981
5982 NTSYSAPI
5983 CCHAR
5984 NTAPI
5985 RtlFindLeastSignificantBit(
5986 IN ULONGLONG Set);
5987
5988 NTSYSAPI
5989 ULONG
5990 NTAPI
5991 RtlFindLongestRunClear(
5992 IN PRTL_BITMAP BitMapHeader,
5993 OUT PULONG StartingIndex);
5994
5995 NTSYSAPI
5996 CCHAR
5997 NTAPI
5998 RtlFindMostSignificantBit(
5999 IN ULONGLONG Set);
6000
6001 NTSYSAPI
6002 ULONG
6003 NTAPI
6004 RtlFindNextForwardRunClear(
6005 IN PRTL_BITMAP BitMapHeader,
6006 IN ULONG FromIndex,
6007 OUT PULONG StartingRunIndex);
6008
6009 NTSYSAPI
6010 ULONG
6011 NTAPI
6012 RtlFindSetBits(
6013 IN PRTL_BITMAP BitMapHeader,
6014 IN ULONG NumberToFind,
6015 IN ULONG HintIndex);
6016
6017 NTSYSAPI
6018 ULONG
6019 NTAPI
6020 RtlFindSetBitsAndClear(
6021 IN PRTL_BITMAP BitMapHeader,
6022 IN ULONG NumberToFind,
6023 IN ULONG HintIndex);
6024
6025 NTSYSAPI
6026 VOID
6027 NTAPI
6028 RtlFreeAnsiString(
6029 IN PANSI_STRING AnsiString);
6030
6031 NTSYSAPI
6032 VOID
6033 NTAPI
6034 RtlFreeUnicodeString(
6035 IN PUNICODE_STRING UnicodeString);
6036
6037 NTSYSAPI
6038 VOID
6039 NTAPI
6040 RtlGetCallersAddress(
6041 OUT PVOID *CallersAddress,
6042 OUT PVOID *CallersCaller);
6043
6044 NTSYSAPI
6045 NTSTATUS
6046 NTAPI
6047 RtlGetVersion(
6048 IN OUT PRTL_OSVERSIONINFOW lpVersionInformation);
6049
6050 NTSYSAPI
6051 NTSTATUS
6052 NTAPI
6053 RtlGUIDFromString(
6054 IN PUNICODE_STRING GuidString,
6055 OUT GUID *Guid);
6056
6057 NTSYSAPI
6058 NTSTATUS
6059 NTAPI
6060 RtlHashUnicodeString(
6061 IN CONST UNICODE_STRING *String,
6062 IN BOOLEAN CaseInSensitive,
6063 IN ULONG HashAlgorithm,
6064 OUT PULONG HashValue);
6065
6066 NTSYSAPI
6067 VOID
6068 NTAPI
6069 RtlInitAnsiString(
6070 IN OUT PANSI_STRING DestinationString,
6071 IN PCSZ SourceString);
6072
6073 NTSYSAPI
6074 VOID
6075 NTAPI
6076 RtlInitializeBitMap(
6077 IN PRTL_BITMAP BitMapHeader,
6078 IN PULONG BitMapBuffer,
6079 IN ULONG SizeOfBitMap);
6080
6081 NTSYSAPI
6082 VOID
6083 NTAPI
6084 RtlInitString(
6085 IN OUT PSTRING DestinationString,
6086 IN PCSZ SourceString);
6087
6088 NTSYSAPI
6089 VOID
6090 NTAPI
6091 RtlInitUnicodeString(
6092 IN OUT PUNICODE_STRING DestinationString,
6093 IN PCWSTR SourceString);
6094
6095 NTSYSAPI
6096 NTSTATUS
6097 NTAPI
6098 RtlInt64ToUnicodeString(
6099 IN ULONGLONG Value,
6100 IN ULONG Base OPTIONAL,
6101 IN OUT PUNICODE_STRING String);
6102
6103 NTSYSAPI
6104 NTSTATUS
6105 NTAPI
6106 RtlIntegerToUnicodeString(
6107 IN ULONG Value,
6108 IN ULONG Base OPTIONAL,
6109 IN OUT PUNICODE_STRING String);
6110
6111 NTSYSAPI
6112 NTSTATUS
6113 NTAPI
6114 RtlIntPtrToUnicodeString(
6115 PLONG Value,
6116 ULONG Base OPTIONAL,
6117 PUNICODE_STRING String);
6118
6119 /*
6120 * BOOLEAN
6121 * RtlIsZeroLuid(
6122 * IN PLUID L1)
6123 */
6124 #define RtlIsZeroLuid(_L1) \
6125 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
6126
6127 NTSYSAPI
6128 ULONG
6129 NTAPI
6130 RtlLengthSecurityDescriptor(
6131 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
6132
6133 NTSYSAPI
6134 VOID
6135 NTAPI
6136 RtlMapGenericMask(
6137 IN OUT PACCESS_MASK AccessMask,
6138 IN PGENERIC_MAPPING GenericMapping);
6139
6140 /*
6141 * VOID
6142 * RtlMoveMemory(
6143 * IN VOID UNALIGNED *Destination,
6144 * IN CONST VOID UNALIGNED *Source,
6145 * IN SIZE_T Length)
6146 */
6147 #define RtlMoveMemory memmove
6148
6149 NTSYSAPI
6150 ULONG
6151 NTAPI
6152 RtlNumberOfClearBits(
6153 IN PRTL_BITMAP BitMapHeader);
6154
6155 NTSYSAPI
6156 ULONG
6157 NTAPI
6158 RtlNumberOfSetBits(
6159 IN PRTL_BITMAP BitMapHeader);
6160
6161 NTSYSAPI
6162 VOID
6163 FASTCALL
6164 RtlPrefetchMemoryNonTemporal(
6165 IN PVOID Source,
6166 IN SIZE_T Length);
6167
6168 NTSYSAPI
6169 BOOLEAN
6170 NTAPI
6171 RtlPrefixUnicodeString(
6172 IN PCUNICODE_STRING String1,
6173 IN PCUNICODE_STRING String2,
6174 IN BOOLEAN CaseInSensitive);
6175
6176 NTSYSAPI
6177 NTSTATUS
6178 NTAPI
6179 RtlQueryRegistryValues(
6180 IN ULONG RelativeTo,
6181 IN PCWSTR Path,
6182 IN PRTL_QUERY_REGISTRY_TABLE QueryTable,
6183 IN PVOID Context,
6184 IN PVOID Environment OPTIONAL);
6185
6186
6187 #define LONG_SIZE (sizeof(LONG))
6188 #define LONG_MASK (LONG_SIZE - 1)
6189
6190 /*
6191 * VOID
6192 * RtlRetrieveUlong (
6193 * PULONG DestinationAddress,
6194 * PULONG SourceAddress
6195 * );
6196 */
6197 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
6198 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
6199 { \
6200 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
6201 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
6202 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
6203 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
6204 } \
6205 else \
6206 { \
6207 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
6208 }
6209
6210 NTSYSAPI
6211 VOID
6212 NTAPI
6213 RtlRetrieveUshort(
6214 IN OUT PUSHORT DestinationAddress,
6215 IN PUSHORT SourceAddress);
6216
6217 NTSYSAPI
6218 VOID
6219 NTAPI
6220 RtlSetAllBits(
6221 IN PRTL_BITMAP BitMapHeader);
6222
6223 NTSYSAPI
6224 VOID
6225 NTAPI
6226 RtlSetBit(
6227 PRTL_BITMAP BitMapHeader,
6228 ULONG BitNumber);
6229
6230 NTSYSAPI
6231 VOID
6232 NTAPI
6233 RtlSetBits(
6234 IN PRTL_BITMAP BitMapHeader,
6235 IN ULONG StartingIndex,
6236 IN ULONG NumberToSet);
6237
6238 NTSYSAPI
6239 NTSTATUS
6240 NTAPI
6241 RtlSetDaclSecurityDescriptor(
6242 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
6243 IN BOOLEAN DaclPresent,
6244 IN PACL Dacl OPTIONAL,
6245 IN BOOLEAN DaclDefaulted OPTIONAL);
6246
6247 NTSYSAPI
6248 VOID
6249 NTAPI
6250 RtlStoreUlong(
6251 IN PULONG Address,
6252 IN ULONG Value);
6253
6254 NTSYSAPI
6255 VOID
6256 NTAPI
6257 RtlStoreUlonglong(
6258 IN OUT PULONGLONG Address,
6259 ULONGLONG Value);
6260
6261 NTSYSAPI
6262 VOID
6263 NTAPI
6264 RtlStoreUlongPtr(
6265 IN OUT PULONG_PTR Address,
6266 IN ULONG_PTR Value);
6267
6268 NTSYSAPI
6269 VOID
6270 NTAPI
6271 RtlStoreUshort(
6272 IN PUSHORT Address,
6273 IN USHORT Value);
6274
6275 NTSYSAPI
6276 NTSTATUS
6277 NTAPI
6278 RtlStringFromGUID(
6279 IN REFGUID Guid,
6280 OUT PUNICODE_STRING GuidString);
6281
6282 NTSYSAPI
6283 BOOLEAN
6284 NTAPI
6285 RtlTestBit(
6286 IN PRTL_BITMAP BitMapHeader,
6287 IN ULONG BitNumber);
6288
6289 NTSYSAPI
6290 BOOLEAN
6291 NTAPI
6292 RtlTimeFieldsToTime(
6293 IN PTIME_FIELDS TimeFields,
6294 IN PLARGE_INTEGER Time);
6295
6296 NTSYSAPI
6297 VOID
6298 NTAPI
6299 RtlTimeToTimeFields(
6300 IN PLARGE_INTEGER Time,
6301 IN PTIME_FIELDS TimeFields);
6302
6303 ULONG
6304 FASTCALL
6305 RtlUlongByteSwap(
6306 IN ULONG Source);
6307
6308 ULONGLONG
6309 FASTCALL
6310 RtlUlonglongByteSwap(
6311 IN ULONGLONG Source);
6312
6313 #define RtlUnicodeStringToAnsiSize(STRING) ( \
6314 NLS_MB_CODE_PAGE_TAG ? \
6315 RtlxUnicodeStringToAnsiSize(STRING) : \
6316 ((STRING)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
6317 )
6318
6319 FORCEINLINE
6320 VOID
6321 RtlInitEmptyUnicodeString(OUT PUNICODE_STRING UnicodeString,
6322 IN PWSTR Buffer,
6323 IN USHORT BufferSize)
6324 {
6325 UnicodeString->Length = 0;
6326 UnicodeString->MaximumLength = BufferSize;
6327 UnicodeString->Buffer = Buffer;
6328 }
6329
6330 FORCEINLINE
6331 VOID
6332 RtlInitEmptyAnsiString(OUT PANSI_STRING AnsiString,
6333 IN PCHAR Buffer,
6334 IN USHORT BufferSize)
6335 {
6336 AnsiString->Length = 0;
6337 AnsiString->MaximumLength = BufferSize;
6338 AnsiString->Buffer = Buffer;
6339 }
6340
6341 NTSYSAPI
6342 NTSTATUS
6343 NTAPI
6344 RtlUnicodeStringToAnsiString(
6345 IN OUT PANSI_STRING DestinationString,
6346 IN PCUNICODE_STRING SourceString,
6347 IN BOOLEAN AllocateDestinationString);
6348
6349 NTSYSAPI
6350 NTSTATUS
6351 NTAPI
6352 RtlUnicodeStringToInteger(
6353 IN PCUNICODE_STRING String,
6354 IN ULONG Base OPTIONAL,
6355 OUT PULONG Value);
6356
6357 NTSYSAPI
6358 WCHAR
6359 NTAPI
6360 RtlUpcaseUnicodeChar(
6361 IN WCHAR SourceCharacter);
6362
6363 NTSYSAPI
6364 NTSTATUS
6365 NTAPI
6366 RtlUpcaseUnicodeString(
6367 IN OUT PUNICODE_STRING DestinationString OPTIONAL,
6368 IN PCUNICODE_STRING SourceString,
6369 IN BOOLEAN AllocateDestinationString);
6370
6371 NTSYSAPI
6372 CHAR
6373 NTAPI
6374 RtlUpperChar(
6375 IN CHAR Character);
6376
6377 NTSYSAPI
6378 VOID
6379 NTAPI
6380 RtlUpperString(
6381 IN OUT PSTRING DestinationString,
6382 IN PSTRING SourceString);
6383
6384 USHORT
6385 FASTCALL
6386 RtlUshortByteSwap(
6387 IN USHORT Source);
6388
6389 NTSYSAPI
6390 BOOLEAN
6391 NTAPI
6392 RtlValidRelativeSecurityDescriptor(
6393 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput,
6394 IN ULONG SecurityDescriptorLength,
6395 IN SECURITY_INFORMATION RequiredInformation);
6396
6397 NTSYSAPI
6398 BOOLEAN
6399 NTAPI
6400 RtlValidSecurityDescriptor(
6401 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
6402
6403 NTSYSAPI
6404 NTSTATUS
6405 NTAPI
6406 RtlVerifyVersionInfo(
6407 IN PRTL_OSVERSIONINFOEXW VersionInfo,
6408 IN ULONG TypeMask,
6409 IN ULONGLONG ConditionMask);
6410
6411 NTSYSAPI
6412 NTSTATUS
6413 NTAPI
6414 RtlVolumeDeviceToDosName(
6415 IN PVOID VolumeDeviceObject,
6416 OUT PUNICODE_STRING DosName);
6417
6418 NTSYSAPI
6419 ULONG
6420 NTAPI
6421 RtlWalkFrameChain(
6422 OUT PVOID *Callers,
6423 IN ULONG Count,
6424 IN ULONG Flags);
6425
6426 NTSYSAPI
6427 NTSTATUS
6428 NTAPI
6429 RtlWriteRegistryValue(
6430 IN ULONG RelativeTo,
6431 IN PCWSTR Path,
6432 IN PCWSTR ValueName,
6433 IN ULONG ValueType,
6434 IN PVOID ValueData,
6435 IN ULONG ValueLength);
6436
6437 NTSYSAPI
6438 ULONG
6439 NTAPI
6440 RtlxUnicodeStringToAnsiSize(
6441 IN PCUNICODE_STRING UnicodeString);
6442
6443 /*
6444 * VOID
6445 * RtlZeroMemory(
6446 * IN VOID UNALIGNED *Destination,
6447 * IN SIZE_T Length)
6448 */
6449 #ifndef RtlZeroMemory
6450 #define RtlZeroMemory(Destination, Length) \
6451 memset(Destination, 0, Length)
6452 #endif
6453
6454 #ifndef RtlZeroBytes
6455 #define RtlZeroBytes RtlZeroMemory
6456 #endif
6457
6458
6459 /* Guarded Mutex routines */
6460
6461 NTKERNELAPI
6462 VOID
6463 FASTCALL
6464 KeAcquireGuardedMutex(
6465 IN OUT PKGUARDED_MUTEX GuardedMutex
6466 );
6467
6468 NTKERNELAPI
6469 VOID
6470 FASTCALL
6471 KeAcquireGuardedMutexUnsafe(
6472 IN OUT PKGUARDED_MUTEX GuardedMutex
6473 );
6474
6475 NTKERNELAPI
6476 VOID
6477 NTAPI
6478 KeEnterGuardedRegion(
6479 VOID
6480 );
6481
6482 NTKERNELAPI
6483 VOID
6484 NTAPI
6485 KeLeaveGuardedRegion(
6486 VOID
6487 );
6488
6489 NTKERNELAPI
6490 VOID
6491 FASTCALL
6492 KeInitializeGuardedMutex(
6493 OUT PKGUARDED_MUTEX GuardedMutex
6494 );
6495
6496 NTKERNELAPI
6497 VOID
6498 FASTCALL
6499 KeReleaseGuardedMutexUnsafe(
6500 IN OUT PKGUARDED_MUTEX GuardedMutex
6501 );
6502
6503 NTKERNELAPI
6504 VOID
6505 FASTCALL
6506 KeReleaseGuardedMutex(
6507 IN OUT PKGUARDED_MUTEX GuardedMutex
6508 );
6509
6510 NTKERNELAPI
6511 BOOLEAN
6512 FASTCALL
6513 KeTryToAcquireGuardedMutex(
6514 IN OUT PKGUARDED_MUTEX GuardedMutex
6515 );
6516
6517 /* Fast Mutex */
6518 #define ExInitializeFastMutex(_FastMutex) \
6519 { \
6520 (_FastMutex)->Count = FM_LOCK_BIT; \
6521 (_FastMutex)->Owner = NULL; \
6522 (_FastMutex)->Contention = 0; \
6523 KeInitializeEvent(&(_FastMutex)->Gate, SynchronizationEvent, FALSE); \
6524 }
6525
6526 NTKERNELAPI
6527 VOID
6528 FASTCALL
6529 ExAcquireFastMutexUnsafe(IN OUT PFAST_MUTEX FastMutex);
6530
6531 NTKERNELAPI
6532 VOID
6533 FASTCALL
6534 ExReleaseFastMutexUnsafe(IN OUT PFAST_MUTEX FastMutex);
6535
6536 #if defined(_NTHAL_) && defined(_X86_)
6537 NTKERNELAPI
6538 VOID
6539 FASTCALL
6540 ExiAcquireFastMutex(IN OUT PFAST_MUTEX FastMutex);
6541
6542 NTKERNELAPI
6543 VOID
6544 FASTCALL
6545 ExiReleaseFastMutex(IN OUT PFAST_MUTEX FastMutex);
6546
6547 NTKERNELAPI
6548 BOOLEAN
6549 FASTCALL
6550 ExiTryToAcquireFastMutex(IN OUT PFAST_MUTEX FastMutex);
6551
6552 #define ExAcquireFastMutex(FastMutex) ExiAcquireFastMutex(FastMutex)
6553 #define ExReleaseFastMutex(FastMutex) ExiReleaseFastMutex(FastMutex)
6554 #define ExTryToAcquireFastMutex(FastMutex) ExiTryToAcquireFastMutex(FastMutex)
6555
6556 #else
6557
6558 NTKERNELAPI
6559 VOID
6560 FASTCALL
6561 ExAcquireFastMutex(IN OUT PFAST_MUTEX FastMutex);
6562
6563 NTKERNELAPI
6564 VOID
6565 FASTCALL
6566 ExReleaseFastMutex(IN OUT PFAST_MUTEX FastMutex);
6567
6568 NTKERNELAPI
6569 BOOLEAN
6570 FASTCALL
6571 ExTryToAcquireFastMutex(IN OUT PFAST_MUTEX FastMutex);
6572 #endif
6573
6574 /** Executive support routines **/
6575
6576 NTKERNELAPI
6577 BOOLEAN
6578 NTAPI
6579 ExAcquireResourceExclusiveLite(
6580 IN PERESOURCE Resource,
6581 IN BOOLEAN Wait);
6582
6583 NTKERNELAPI
6584 BOOLEAN
6585 NTAPI
6586 ExAcquireResourceSharedLite(
6587 IN PERESOURCE Resource,
6588 IN BOOLEAN Wait);
6589
6590 NTKERNELAPI
6591 BOOLEAN
6592 NTAPI
6593 ExAcquireSharedStarveExclusive(
6594 IN PERESOURCE Resource,
6595 IN BOOLEAN Wait);
6596
6597 NTKERNELAPI
6598 BOOLEAN
6599 NTAPI
6600 ExAcquireSharedWaitForExclusive(
6601 IN PERESOURCE Resource,
6602 IN BOOLEAN Wait);
6603
6604 static __inline PVOID
6605 ExAllocateFromNPagedLookasideList(
6606 IN PNPAGED_LOOKASIDE_LIST Lookaside)
6607 {
6608 PVOID Entry;
6609
6610 Lookaside->L.TotalAllocates++;
6611 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
6612 if (Entry == NULL) {
6613 Lookaside->L.AllocateMisses++;
6614 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type, Lookaside->L.Size, Lookaside->L.Tag);
6615 }
6616 return Entry;
6617 }
6618
6619 static __inline PVOID
6620 ExAllocateFromPagedLookasideList(
6621 IN PPAGED_LOOKASIDE_LIST Lookaside)
6622 {
6623 PVOID Entry;
6624
6625 Lookaside->L.TotalAllocates++;
6626 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
6627 if (Entry == NULL) {
6628 Lookaside->L.AllocateMisses++;
6629 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type, Lookaside->L.Size, Lookaside->L.Tag);
6630 }
6631 return Entry;
6632 }
6633
6634 NTKERNELAPI
6635 PVOID
6636 NTAPI
6637 ExAllocatePoolWithQuotaTag(
6638 IN POOL_TYPE PoolType,
6639 IN SIZE_T NumberOfBytes,
6640 IN ULONG Tag);
6641
6642 NTKERNELAPI
6643 PVOID
6644 NTAPI
6645 ExAllocatePoolWithTag(
6646 IN POOL_TYPE PoolType,
6647 IN SIZE_T NumberOfBytes,
6648 IN ULONG Tag);
6649
6650 #ifdef POOL_TAGGING
6651
6652 #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
6653 #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
6654
6655 #else /* !POOL_TAGGING */
6656
6657 NTKERNELAPI
6658 PVOID
6659 NTAPI
6660 ExAllocatePool(
6661 IN POOL_TYPE PoolType,
6662 IN SIZE_T NumberOfBytes);
6663
6664 NTKERNELAPI
6665 PVOID
6666 NTAPI
6667 ExAllocatePoolWithQuota(
6668 IN POOL_TYPE PoolType,
6669 IN SIZE_T NumberOfBytes);
6670
6671 #endif /* POOL_TAGGING */
6672
6673 NTKERNELAPI
6674 PVOID
6675 NTAPI
6676 ExAllocatePoolWithTagPriority(
6677 IN POOL_TYPE PoolType,
6678 IN SIZE_T NumberOfBytes,
6679 IN ULONG Tag,
6680 IN EX_POOL_PRIORITY Priority);
6681
6682 NTKERNELAPI
6683 VOID
6684 NTAPI
6685 ExConvertExclusiveToSharedLite(
6686 IN PERESOURCE Resource);
6687
6688 NTKERNELAPI
6689 NTSTATUS
6690 NTAPI
6691 ExCreateCallback(
6692 OUT PCALLBACK_OBJECT *CallbackObject,
6693 IN POBJECT_ATTRIBUTES ObjectAttributes,
6694 IN BOOLEAN Create,
6695 IN BOOLEAN AllowMultipleCallbacks);
6696
6697 NTKERNELAPI
6698 VOID
6699 NTAPI
6700 ExDeleteNPagedLookasideList(
6701 IN PNPAGED_LOOKASIDE_LIST Lookaside);
6702
6703 NTKERNELAPI
6704 VOID
6705 NTAPI
6706 ExDeletePagedLookasideList(
6707 IN PPAGED_LOOKASIDE_LIST Lookaside);
6708
6709 NTKERNELAPI
6710 NTSTATUS
6711 NTAPI
6712 ExDeleteResourceLite(
6713 IN PERESOURCE Resource);
6714
6715 NTKERNELAPI
6716 VOID
6717 NTAPI
6718 ExFreePool(
6719 IN PVOID P);
6720
6721 #define PROTECTED_POOL 0x80000000
6722
6723 #ifdef POOL_TAGGING
6724 #define ExFreePool(P) ExFreePoolWithTag(P, 0)
6725 #endif
6726
6727 NTKERNELAPI
6728 VOID
6729 NTAPI
6730 ExFreePoolWithTag(
6731 IN PVOID P,
6732 IN ULONG Tag);
6733
6734 #define ExQueryDepthSList(ListHead) QueryDepthSList(ListHead)
6735
6736 static __inline VOID
6737 ExFreeToNPagedLookasideList(
6738 IN PNPAGED_LOOKASIDE_LIST Lookaside,
6739 IN PVOID Entry)
6740 {
6741 Lookaside->L.TotalFrees++;
6742 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
6743 Lookaside->L.FreeMisses++;
6744 (Lookaside->L.Free)(Entry);
6745 } else {
6746 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
6747 }
6748 }
6749
6750 static __inline VOID
6751 ExFreeToPagedLookasideList(
6752 IN PPAGED_LOOKASIDE_LIST Lookaside,
6753 IN PVOID Entry)
6754 {
6755 Lookaside->L.TotalFrees++;
6756 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
6757 Lookaside->L.FreeMisses++;
6758 (Lookaside->L.Free)(Entry);
6759 } else {
6760 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
6761 }
6762 }
6763
6764 /*
6765 * ERESOURCE_THREAD
6766 * ExGetCurrentResourceThread(
6767 * VOID);
6768 */
6769 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD) PsGetCurrentThread())
6770
6771 NTKERNELAPI
6772 ULONG
6773 NTAPI
6774 ExGetExclusiveWaiterCount(
6775 IN PERESOURCE Resource);
6776
6777 NTKERNELAPI
6778 KPROCESSOR_MODE
6779 NTAPI
6780 ExGetPreviousMode(
6781 VOID);
6782
6783 NTKERNELAPI
6784 ULONG
6785 NTAPI
6786 ExGetSharedWaiterCount(
6787 IN PERESOURCE Resource);
6788
6789 NTKERNELAPI
6790 VOID
6791 NTAPI
6792 KeInitializeEvent(
6793 IN PRKEVENT Event,
6794 IN EVENT_TYPE Type,
6795 IN BOOLEAN State);
6796
6797 NTKERNELAPI
6798 VOID
6799 NTAPI
6800 ExInitializeNPagedLookasideList(
6801 IN PNPAGED_LOOKASIDE_LIST Lookaside,
6802 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
6803 IN PFREE_FUNCTION Free OPTIONAL,
6804 IN ULONG Flags,
6805 IN SIZE_T Size,
6806 IN ULONG Tag,
6807 IN USHORT Depth);
6808
6809 NTKERNELAPI
6810 VOID
6811 NTAPI
6812 ExInitializePagedLookasideList(
6813 IN PPAGED_LOOKASIDE_LIST Lookaside,
6814 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
6815 IN PFREE_FUNCTION Free OPTIONAL,
6816 IN ULONG Flags,
6817 IN SIZE_T Size,
6818 IN ULONG Tag,
6819 IN USHORT Depth);
6820
6821 NTKERNELAPI
6822 NTSTATUS
6823 NTAPI
6824 ExInitializeResourceLite(
6825 IN PERESOURCE Resource);
6826
6827 /*
6828 * VOID
6829 * InitializeSListHead(
6830 * IN PSLIST_HEADER SListHead)
6831 */
6832 #define InitializeSListHead(_SListHead) \
6833 (_SListHead)->Alignment = 0
6834
6835 #define ExInitializeSListHead InitializeSListHead
6836
6837 NTKERNELAPI
6838 LARGE_INTEGER
6839 NTAPI
6840 ExInterlockedAddLargeInteger(
6841 IN PLARGE_INTEGER Addend,
6842 IN LARGE_INTEGER Increment,
6843 IN PKSPIN_LOCK Lock);
6844
6845 NTKERNELAPI
6846 VOID
6847 FASTCALL
6848 ExInterlockedAddLargeStatistic(
6849 IN PLARGE_INTEGER Addend,
6850 IN ULONG Increment);
6851
6852 NTKERNELAPI
6853 ULONG
6854 NTAPI
6855 ExInterlockedAddUlong(
6856 IN PULONG Addend,
6857 IN ULONG Increment,
6858 PKSPIN_LOCK Lock);
6859
6860 NTKERNELAPI
6861 LONGLONG
6862 FASTCALL
6863 ExInterlockedCompareExchange64(
6864 IN OUT PLONGLONG Destination,
6865 IN PLONGLONG Exchange,
6866 IN PLONGLONG Comparand,
6867 IN PKSPIN_LOCK Lock);
6868
6869 NTKERNELAPI
6870 LONGLONG
6871 FASTCALL
6872 ExfInterlockedCompareExchange64(
6873 IN OUT LONGLONG volatile *Destination,
6874 IN PLONGLONG Exchange,
6875 IN PLONGLONG Comperand);
6876
6877 NTKERNELAPI
6878 PSINGLE_LIST_ENTRY
6879 FASTCALL
6880 ExInterlockedFlushSList(
6881 IN PSLIST_HEADER ListHead);
6882
6883 NTKERNELAPI
6884 PLIST_ENTRY
6885 NTAPI
6886 ExInterlockedInsertHeadList(
6887 IN PLIST_ENTRY ListHead,
6888 IN PLIST_ENTRY ListEntry,
6889 IN PKSPIN_LOCK Lock);
6890
6891 NTKERNELAPI
6892 PLIST_ENTRY
6893 NTAPI
6894 ExInterlockedInsertTailList(
6895 IN PLIST_ENTRY ListHead,
6896 IN PLIST_ENTRY ListEntry,
6897 IN PKSPIN_LOCK Lock);
6898
6899 NTKERNELAPI
6900 PSINGLE_LIST_ENTRY
6901 NTAPI
6902 ExInterlockedPopEntryList(
6903 IN PSINGLE_LIST_ENTRY ListHead,
6904 IN PKSPIN_LOCK Lock);
6905
6906 /*
6907 * PSINGLE_LIST_ENTRY
6908 * ExInterlockedPopEntrySList(
6909 * IN PSLIST_HEADER ListHead,
6910 * IN PKSPIN_LOCK Lock)
6911 */
6912 #define ExInterlockedPopEntrySList(_ListHead, \
6913 _Lock) \
6914 InterlockedPopEntrySList(_ListHead)
6915
6916 NTKERNELAPI
6917 PSINGLE_LIST_ENTRY
6918 NTAPI
6919 ExInterlockedPushEntryList(
6920 IN PSINGLE_LIST_ENTRY ListHead,
6921 IN PSINGLE_LIST_ENTRY ListEntry,
6922 IN PKSPIN_LOCK Lock);
6923
6924 /*
6925 * PSINGLE_LIST_ENTRY FASTCALL
6926 * ExInterlockedPushEntrySList(
6927 * IN PSLIST_HEADER ListHead,
6928 * IN PSINGLE_LIST_ENTRY ListEntry,
6929 * IN PKSPIN_LOCK Lock)
6930 */
6931 #define ExInterlockedPushEntrySList(_ListHead, \
6932 _ListEntry, \
6933 _Lock) \
6934 InterlockedPushEntrySList(_ListHead, _ListEntry)
6935
6936 NTKERNELAPI
6937 PLIST_ENTRY
6938 NTAPI
6939 ExInterlockedRemoveHeadList(
6940 IN PLIST_ENTRY ListHead,
6941 IN PKSPIN_LOCK Lock);
6942
6943 NTKERNELAPI
6944 BOOLEAN
6945 NTAPI
6946 ExIsProcessorFeaturePresent(
6947 IN ULONG ProcessorFeature);
6948
6949 NTKERNELAPI
6950 BOOLEAN
6951 NTAPI
6952 ExIsResourceAcquiredExclusiveLite(
6953 IN PERESOURCE Resource);
6954
6955 NTKERNELAPI
6956 USHORT
6957 NTAPI
6958 ExIsResourceAcquiredLite(
6959 IN PERESOURCE Resource);
6960
6961 NTKERNELAPI
6962 ULONG
6963 NTAPI
6964 ExIsResourceAcquiredSharedLite(
6965 IN PERESOURCE Resource);
6966
6967 NTKERNELAPI
6968 VOID
6969 NTAPI
6970 ExLocalTimeToSystemTime(
6971 IN PLARGE_INTEGER LocalTime,
6972 OUT PLARGE_INTEGER SystemTime);
6973
6974 NTKERNELAPI
6975 VOID
6976 NTAPI
6977 ExNotifyCallback(
6978 IN PCALLBACK_OBJECT CallbackObject,
6979 IN PVOID Argument1,
6980 IN PVOID Argument2);
6981
6982 NTKERNELAPI
6983 VOID
6984 NTAPI
6985 ExRaiseAccessViolation(
6986 VOID);
6987
6988 NTKERNELAPI
6989 VOID
6990 NTAPI
6991 ExRaiseDatatypeMisalignment(
6992 VOID);
6993
6994 NTKERNELAPI
6995 VOID
6996 NTAPI
6997 ExRaiseStatus(
6998 IN NTSTATUS Status);
6999
7000 NTKERNELAPI
7001 PVOID
7002 NTAPI
7003 ExRegisterCallback(
7004 IN PCALLBACK_OBJECT CallbackObject,
7005 IN PCALLBACK_FUNCTION CallbackFunction,
7006 IN PVOID CallbackContext);
7007
7008 NTKERNELAPI
7009 NTSTATUS
7010 NTAPI
7011 ExReinitializeResourceLite(
7012 IN PERESOURCE Resource);
7013
7014 NTKERNELAPI
7015 VOID
7016 NTAPI
7017 ExReleaseResourceForThreadLite(
7018 IN PERESOURCE Resource,
7019 IN ERESOURCE_THREAD ResourceThreadId);
7020
7021 NTKERNELAPI
7022 VOID
7023 FASTCALL
7024 ExReleaseResourceLite(
7025 IN PERESOURCE Resource);
7026
7027 NTKERNELAPI
7028 VOID
7029 NTAPI
7030 ExSetResourceOwnerPointer(
7031 IN PERESOURCE Resource,
7032 IN PVOID OwnerPointer);
7033
7034 NTKERNELAPI
7035 ULONG
7036 NTAPI
7037 ExSetTimerResolution(
7038 IN ULONG DesiredTime,
7039 IN BOOLEAN SetResolution);
7040
7041 NTKERNELAPI
7042 VOID
7043 NTAPI
7044 ExSystemTimeToLocalTime(
7045 IN PLARGE_INTEGER SystemTime,
7046 OUT PLARGE_INTEGER LocalTime);
7047
7048 NTKERNELAPI
7049 VOID
7050 NTAPI
7051 ExUnregisterCallback(
7052 IN PVOID CbRegistration);
7053
7054 NTKERNELAPI
7055 NTSTATUS
7056 NTAPI
7057 ExUuidCreate(
7058 OUT UUID *Uuid);
7059
7060 NTKERNELAPI
7061 BOOLEAN
7062 NTAPI
7063 ExVerifySuite(
7064 IN SUITE_TYPE SuiteType);
7065
7066 #ifdef DBG
7067
7068 #define PAGED_CODE() { \
7069 if (KeGetCurrentIrql() > APC_LEVEL) { \
7070 KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
7071 ASSERT(FALSE); \
7072 } \
7073 }
7074
7075 #else
7076
7077 #define PAGED_CODE()
7078
7079 #endif
7080
7081 NTKERNELAPI
7082 VOID
7083 NTAPI
7084 ProbeForRead(
7085 IN CONST VOID *Address,
7086 IN ULONG Length,
7087 IN ULONG Alignment);
7088
7089 NTKERNELAPI
7090 VOID
7091 NTAPI
7092 ProbeForWrite(
7093 IN PVOID Address,
7094 IN ULONG Length,
7095 IN ULONG Alignment);
7096
7097
7098
7099 /** Configuration manager routines **/
7100
7101 NTKERNELAPI
7102 NTSTATUS
7103 NTAPI
7104 CmRegisterCallback(
7105 IN PEX_CALLBACK_FUNCTION Function,
7106 IN PVOID Context,
7107 IN OUT PLARGE_INTEGER Cookie);
7108
7109 NTKERNELAPI
7110 NTSTATUS
7111 NTAPI
7112 CmUnRegisterCallback(
7113 IN LARGE_INTEGER Cookie);
7114
7115
7116
7117 /** Filesystem runtime library routines **/
7118
7119 NTKERNELAPI
7120 BOOLEAN
7121 NTAPI
7122 FsRtlIsTotalDeviceFailure(
7123 IN NTSTATUS Status);
7124
7125
7126
7127 /** Hardware abstraction layer routines **/
7128
7129 NTHALAPI
7130 BOOLEAN
7131 NTAPI
7132 HalMakeBeep(
7133 IN ULONG Frequency);
7134
7135 NTKERNELAPI
7136 VOID
7137 FASTCALL
7138 HalExamineMBR(
7139 IN PDEVICE_OBJECT DeviceObject,
7140 IN ULONG SectorSize,
7141 IN ULONG MBRTypeIdentifier,
7142 OUT PVOID *Buffer);
7143
7144 VOID
7145 NTAPI
7146 HalPutDmaAdapter(
7147 PADAPTER_OBJECT AdapterObject
7148 );
7149
7150 NTKERNELAPI
7151 NTSTATUS
7152 NTAPI
7153 IoAllocateAdapterChannel(
7154 IN PADAPTER_OBJECT AdapterObject,
7155 IN PDEVICE_OBJECT DeviceObject,
7156 IN ULONG NumberOfMapRegisters,
7157 IN PDRIVER_CONTROL ExecutionRoutine,
7158 IN PVOID Context
7159 );
7160
7161 NTHALAPI
7162 VOID
7163 NTAPI
7164 READ_PORT_BUFFER_UCHAR(
7165 IN PUCHAR Port,
7166 IN PUCHAR Buffer,
7167 IN ULONG Count);
7168
7169 NTHALAPI
7170 VOID
7171 NTAPI
7172 READ_PORT_BUFFER_ULONG(
7173 IN PULONG Port,
7174 IN PULONG Buffer,
7175 IN ULONG Count);
7176
7177 NTHALAPI
7178 VOID
7179 NTAPI
7180 READ_PORT_BUFFER_USHORT(
7181 IN PUSHORT Port,
7182 IN PUSHORT Buffer,
7183 IN ULONG Count);
7184
7185 NTHALAPI
7186 UCHAR
7187 NTAPI
7188 READ_PORT_UCHAR(
7189 IN PUCHAR Port);
7190
7191 NTHALAPI
7192 ULONG
7193 NTAPI
7194 READ_PORT_ULONG(
7195 IN PULONG Port);
7196
7197 NTHALAPI
7198 USHORT
7199 NTAPI
7200 READ_PORT_USHORT(
7201 IN PUSHORT Port);
7202
7203 NTKERNELAPI
7204 VOID
7205 NTAPI
7206 READ_REGISTER_BUFFER_UCHAR(
7207 IN PUCHAR Register,
7208 IN PUCHAR Buffer,
7209 IN ULONG Count);
7210
7211 NTKERNELAPI
7212 VOID
7213 NTAPI
7214 READ_REGISTER_BUFFER_ULONG(
7215 IN PULONG Register,
7216 IN PULONG Buffer,
7217 IN ULONG Count);
7218
7219 NTKERNELAPI
7220 VOID
7221 NTAPI
7222 READ_REGISTER_BUFFER_USHORT(
7223 IN PUSHORT Register,
7224 IN PUSHORT Buffer,
7225 IN ULONG Count);
7226
7227 NTKERNELAPI
7228 UCHAR
7229 NTAPI
7230 READ_REGISTER_UCHAR(
7231 IN PUCHAR Register);
7232
7233 NTKERNELAPI
7234 ULONG
7235 NTAPI
7236 READ_REGISTER_ULONG(
7237 IN PULONG Register);
7238
7239 NTKERNELAPI
7240 USHORT
7241 NTAPI
7242 READ_REGISTER_USHORT(
7243 IN PUSHORT Register);
7244
7245 NTHALAPI
7246 VOID
7247 NTAPI
7248 WRITE_PORT_BUFFER_UCHAR(
7249 IN PUCHAR Port,
7250 IN PUCHAR Buffer,
7251 IN ULONG Count);
7252
7253 NTHALAPI
7254 VOID
7255 NTAPI
7256 WRITE_PORT_BUFFER_ULONG(
7257 IN PULONG Port,
7258 IN PULONG Buffer,
7259 IN ULONG Count);
7260
7261 NTHALAPI
7262 VOID
7263 NTAPI
7264 WRITE_PORT_BUFFER_USHORT(
7265 IN PUSHORT Port,
7266 IN PUSHORT Buffer,
7267 IN ULONG Count);
7268
7269 NTHALAPI
7270 VOID
7271 NTAPI
7272 WRITE_PORT_UCHAR(
7273 IN PUCHAR Port,
7274 IN UCHAR Value);
7275
7276 NTHALAPI
7277 VOID
7278 NTAPI
7279 WRITE_PORT_ULONG(
7280 IN PULONG Port,
7281 IN ULONG Value);
7282
7283 NTHALAPI
7284 VOID
7285 NTAPI
7286 WRITE_PORT_USHORT(
7287 IN PUSHORT Port,
7288 IN USHORT Value);
7289
7290 NTKERNELAPI
7291 VOID
7292 NTAPI
7293 WRITE_REGISTER_BUFFER_UCHAR(
7294 IN PUCHAR Register,
7295 IN PUCHAR Buffer,
7296 IN ULONG Count);
7297
7298 NTKERNELAPI
7299 VOID
7300 NTAPI
7301 WRITE_REGISTER_BUFFER_ULONG(
7302 IN PULONG Register,
7303 IN PULONG Buffer,
7304 IN ULONG Count);
7305
7306 NTKERNELAPI
7307 VOID
7308 NTAPI
7309 WRITE_REGISTER_BUFFER_USHORT(
7310 IN PUSHORT Register,
7311 IN PUSHORT Buffer,
7312 IN ULONG Count);
7313
7314 NTKERNELAPI
7315 VOID
7316 NTAPI
7317 WRITE_REGISTER_UCHAR(
7318 IN PUCHAR Register,
7319 IN UCHAR Value);
7320
7321 NTKERNELAPI
7322 VOID
7323 NTAPI
7324 WRITE_REGISTER_ULONG(
7325 IN PULONG Register,
7326 IN ULONG Value);
7327
7328 NTKERNELAPI
7329 VOID
7330 NTAPI
7331 WRITE_REGISTER_USHORT(
7332 IN PUSHORT Register,
7333 IN USHORT Value);
7334
7335 /** I/O manager routines **/
7336
7337 NTKERNELAPI
7338 VOID
7339 NTAPI
7340 IoAcquireCancelSpinLock(
7341 OUT PKIRQL Irql);
7342
7343 NTKERNELAPI
7344 NTSTATUS
7345 NTAPI
7346 IoAcquireRemoveLockEx(
7347 IN PIO_REMOVE_LOCK RemoveLock,
7348 IN OPTIONAL PVOID Tag OPTIONAL,
7349 IN PCSTR File,
7350 IN ULONG Line,
7351 IN ULONG RemlockSize);
7352
7353 /*
7354 * NTSTATUS
7355 * IoAcquireRemoveLock(
7356 * IN PIO_REMOVE_LOCK RemoveLock,
7357 * IN OPTIONAL PVOID Tag)
7358 */
7359 #define IoAcquireRemoveLock(_RemoveLock, \
7360 _Tag) \
7361 IoAcquireRemoveLockEx(_RemoveLock, _Tag, __FILE__, __LINE__, sizeof(IO_REMOVE_LOCK))
7362
7363 /*
7364 * VOID
7365 * IoAdjustPagingPathCount(
7366 * IN PLONG Count,
7367 * IN BOOLEAN Increment)
7368 */
7369 #define IoAdjustPagingPathCount(_Count, \
7370 _Increment) \
7371 { \
7372 if (_Increment) \
7373 { \
7374 InterlockedIncrement(_Count); \
7375 } \
7376 else \
7377 { \
7378 InterlockedDecrement(_Count); \
7379 } \
7380 }
7381
7382 NTKERNELAPI
7383 VOID
7384 NTAPI
7385 IoAllocateController(
7386 IN PCONTROLLER_OBJECT ControllerObject,
7387 IN PDEVICE_OBJECT DeviceObject,
7388 IN PDRIVER_CONTROL ExecutionRoutine,
7389 IN PVOID Context);
7390
7391 NTKERNELAPI
7392 NTSTATUS
7393 NTAPI
7394 IoAllocateDriverObjectExtension(
7395 IN PDRIVER_OBJECT DriverObject,
7396 IN PVOID ClientIdentificationAddress,
7397 IN ULONG DriverObjectExtensionSize,
7398 OUT PVOID *DriverObjectExtension);
7399
7400 NTKERNELAPI
7401 PVOID
7402 NTAPI
7403 IoAllocateErrorLogEntry(
7404 IN PVOID IoObject,
7405 IN UCHAR EntrySize);
7406
7407 NTKERNELAPI
7408 PIRP
7409 NTAPI
7410 IoAllocateIrp(
7411 IN CCHAR StackSize,
7412 IN BOOLEAN ChargeQuota);
7413
7414 NTKERNELAPI
7415 PMDL
7416 NTAPI
7417 IoAllocateMdl(
7418 IN PVOID VirtualAddress,
7419 IN ULONG Length,
7420 IN BOOLEAN SecondaryBuffer,
7421 IN BOOLEAN ChargeQuota,
7422 IN OUT PIRP Irp OPTIONAL);
7423
7424 NTKERNELAPI
7425 PIO_WORKITEM
7426 NTAPI
7427 IoAllocateWorkItem(
7428 IN PDEVICE_OBJECT DeviceObject);
7429
7430 /*
7431 * VOID IoAssignArcName(
7432 * IN PUNICODE_STRING ArcName,
7433 * IN PUNICODE_STRING DeviceName);
7434 */
7435 #define IoAssignArcName(_ArcName, _DeviceName) ( \
7436 IoCreateSymbolicLink((_ArcName), (_DeviceName)))
7437
7438 NTKERNELAPI
7439 NTSTATUS
7440 NTAPI
7441 IoAttachDevice(
7442 IN PDEVICE_OBJECT SourceDevice,
7443 IN PUNICODE_STRING TargetDevice,
7444 OUT PDEVICE_OBJECT *AttachedDevice);
7445
7446 NTKERNELAPI
7447 PDEVICE_OBJECT
7448 NTAPI
7449 IoAttachDeviceToDeviceStack(
7450 IN PDEVICE_OBJECT SourceDevice,
7451 IN PDEVICE_OBJECT TargetDevice);
7452
7453 NTKERNELAPI
7454 PIRP
7455 NTAPI
7456 IoBuildAsynchronousFsdRequest(
7457 IN ULONG MajorFunction,
7458 IN PDEVICE_OBJECT DeviceObject,
7459 IN OUT PVOID Buffer OPTIONAL,
7460 IN ULONG Length OPTIONAL,
7461 IN PLARGE_INTEGER StartingOffset OPTIONAL,
7462 IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL);
7463
7464 NTKERNELAPI
7465 PIRP
7466 NTAPI
7467 IoBuildDeviceIoControlRequest(
7468 IN ULONG IoControlCode,
7469 IN PDEVICE_OBJECT DeviceObject,
7470 IN PVOID InputBuffer OPTIONAL,
7471 IN ULONG InputBufferLength,
7472 OUT PVOID OutputBuffer OPTIONAL,
7473 IN ULONG OutputBufferLength,
7474 IN BOOLEAN InternalDeviceIoControl,
7475 IN PKEVENT Event,
7476 OUT PIO_STATUS_BLOCK IoStatusBlock);
7477
7478 NTKERNELAPI
7479 VOID
7480 NTAPI
7481 IoBuildPartialMdl(
7482 IN PMDL SourceMdl,
7483 IN OUT PMDL TargetMdl,
7484 IN PVOID VirtualAddress,
7485 IN ULONG Length);
7486
7487 NTKERNELAPI
7488 PIRP
7489 NTAPI
7490 IoBuildSynchronousFsdRequest(
7491 IN ULONG MajorFunction,
7492 IN PDEVICE_OBJECT DeviceObject,
7493 IN OUT PVOID Buffer OPTIONAL,
7494 IN ULONG Length OPTIONAL,
7495 IN PLARGE_INTEGER StartingOffset OPTIONAL,
7496 IN PKEVENT Event,
7497 OUT PIO_STATUS_BLOCK IoStatusBlock);
7498
7499 NTKERNELAPI
7500 NTSTATUS
7501 FASTCALL
7502 IofCallDriver(
7503 IN PDEVICE_OBJECT DeviceObject,
7504 IN OUT PIRP Irp);
7505
7506 /*
7507 * NTSTATUS
7508 * IoCallDriver(
7509 * IN PDEVICE_OBJECT DeviceObject,
7510 * IN OUT PIRP Irp)
7511 */
7512 #define IoCallDriver IofCallDriver
7513
7514 NTKERNELAPI
7515 VOID
7516 NTAPI
7517 IoCancelFileOpen(
7518 IN PDEVICE_OBJECT DeviceObject,
7519 IN PFILE_OBJECT FileObject);
7520
7521 NTKERNELAPI
7522 BOOLEAN
7523 NTAPI
7524 IoCancelIrp(
7525 IN PIRP Irp);
7526
7527 NTKERNELAPI
7528 NTSTATUS
7529 NTAPI
7530 IoCheckShareAccess(
7531 IN ACCESS_MASK DesiredAccess,
7532 IN ULONG DesiredShareAccess,
7533 IN OUT PFILE_OBJECT FileObject,
7534 IN OUT PSHARE_ACCESS ShareAccess,
7535 IN BOOLEAN Update);
7536
7537 NTKERNELAPI
7538 VOID
7539 FASTCALL
7540 IofCompleteRequest(
7541 IN PIRP Irp,
7542 IN CCHAR PriorityBoost);
7543
7544 /*
7545 * VOID
7546 * IoCompleteRequest(
7547 * IN PIRP Irp,
7548 * IN CCHAR PriorityBoost)
7549 */
7550 #define IoCompleteRequest IofCompleteRequest
7551
7552 NTKERNELAPI
7553 NTSTATUS
7554 NTAPI
7555 IoConnectInterrupt(
7556 OUT PKINTERRUPT *InterruptObject,
7557 IN PKSERVICE_ROUTINE ServiceRoutine,
7558 IN PVOID ServiceContext,
7559 IN PKSPIN_LOCK SpinLock OPTIONAL,
7560 IN ULONG Vector,
7561 IN KIRQL Irql,
7562 IN KIRQL SynchronizeIrql,
7563 IN KINTERRUPT_MODE InterruptMode,
7564 IN BOOLEAN ShareVector,
7565 IN KAFFINITY ProcessorEnableMask,
7566 IN BOOLEAN FloatingSave);
7567
7568 /*
7569 * PIO_STACK_LOCATION
7570 * IoGetCurrentIrpStackLocation(
7571 * IN PIRP Irp)
7572 */
7573 #define IoGetCurrentIrpStackLocation(_Irp) \
7574 ((_Irp)->Tail.Overlay.CurrentStackLocation)
7575
7576 /*
7577 * PIO_STACK_LOCATION
7578 * IoGetNextIrpStackLocation(
7579 * IN PIRP Irp)
7580 */
7581 #define IoGetNextIrpStackLocation(_Irp) \
7582 ((_Irp)->Tail.Overlay.CurrentStackLocation - 1)
7583
7584 /*
7585 * VOID
7586 * IoCopyCurrentIrpStackLocationToNext(
7587 * IN PIRP Irp)
7588 */
7589 #define IoCopyCurrentIrpStackLocationToNext(_Irp) \
7590 { \
7591 PIO_STACK_LOCATION _IrpSp; \
7592 PIO_STACK_LOCATION _NextIrpSp; \
7593 _IrpSp = IoGetCurrentIrpStackLocation(_Irp); \
7594 _NextIrpSp = IoGetNextIrpStackLocation(_Irp); \
7595 RtlCopyMemory(_NextIrpSp, _IrpSp, \
7596 FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine)); \
7597 _NextIrpSp->Control = 0; \
7598 }
7599
7600 NTKERNELAPI
7601 PCONTROLLER_OBJECT
7602 NTAPI
7603 IoCreateController(
7604 IN ULONG Size);
7605
7606 NTKERNELAPI
7607 NTSTATUS
7608 NTAPI
7609 IoCreateDevice(
7610 IN PDRIVER_OBJECT DriverObject,
7611 IN ULONG DeviceExtensionSize,
7612 IN PUNICODE_STRING DeviceName OPTIONAL,
7613 IN DEVICE_TYPE DeviceType,
7614 IN ULONG DeviceCharacteristics,
7615 IN BOOLEAN Exclusive,
7616 OUT PDEVICE_OBJECT *DeviceObject);
7617
7618 NTKERNELAPI
7619 NTSTATUS
7620 NTAPI
7621 IoCreateDisk(
7622 IN PDEVICE_OBJECT DeviceObject,
7623 IN PCREATE_DISK Disk);
7624
7625 NTKERNELAPI
7626 NTSTATUS
7627 NTAPI
7628 IoCreateFile(
7629 OUT PHANDLE FileHandle,
7630 IN ACCESS_MASK DesiredAccess,
7631 IN POBJECT_ATTRIBUTES ObjectAttributes,
7632 OUT PIO_STATUS_BLOCK IoStatusBlock,
7633 IN PLARGE_INTEGER AllocationSize OPTIONAL,
7634 IN ULONG FileAttributes,
7635 IN ULONG ShareAccess,
7636 IN ULONG Disposition,
7637 IN ULONG CreateOptions,
7638 IN PVOID EaBuffer OPTIONAL,
7639 IN ULONG EaLength,
7640 IN CREATE_FILE_TYPE CreateFileType,
7641 IN PVOID ExtraCreateParameters OPTIONAL,
7642 IN ULONG Options);
7643
7644 NTKERNELAPI
7645 PKEVENT
7646 NTAPI
7647 IoCreateNotificationEvent(
7648 IN PUNICODE_STRING EventName,
7649 OUT PHANDLE EventHandle);
7650
7651 NTKERNELAPI
7652 NTSTATUS
7653 NTAPI
7654 IoCreateSymbolicLink(
7655 IN PUNICODE_STRING SymbolicLinkName,
7656 IN PUNICODE_STRING DeviceName);
7657
7658 NTKERNELAPI
7659 PKEVENT
7660 NTAPI
7661 IoCreateSynchronizationEvent(
7662 IN PUNICODE_STRING EventName,
7663 OUT PHANDLE EventHandle);
7664
7665 NTKERNELAPI
7666 NTSTATUS
7667 NTAPI
7668 IoCreateUnprotectedSymbolicLink(
7669 IN PUNICODE_STRING SymbolicLinkName,
7670 IN PUNICODE_STRING DeviceName);
7671
7672 NTKERNELAPI
7673 NTSTATUS
7674 NTAPI
7675 IoCsqInitialize(
7676 PIO_CSQ Csq,
7677 IN PIO_CSQ_INSERT_IRP CsqInsertIrp,
7678 IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
7679 IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
7680 IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
7681 IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
7682 IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp);
7683
7684 NTKERNELAPI
7685 VOID
7686 NTAPI
7687 IoCsqInsertIrp(
7688 IN PIO_CSQ Csq,
7689 IN PIRP Irp,
7690 IN PIO_CSQ_IRP_CONTEXT Context);
7691
7692 NTKERNELAPI
7693 PIRP
7694 NTAPI
7695 IoCsqRemoveIrp(
7696 IN PIO_CSQ Csq,
7697 IN PIO_CSQ_IRP_CONTEXT Context);
7698
7699 NTKERNELAPI
7700 PIRP
7701 NTAPI
7702 IoCsqRemoveNextIrp(
7703 IN PIO_CSQ Csq,
7704 IN PVOID PeekContext);
7705
7706 NTKERNELAPI
7707 VOID
7708 NTAPI
7709 IoDeleteController(
7710 IN PCONTROLLER_OBJECT ControllerObject);
7711
7712 NTKERNELAPI
7713 VOID
7714 NTAPI
7715 IoDeleteDevice(
7716 IN PDEVICE_OBJECT DeviceObject);
7717
7718 NTKERNELAPI
7719 NTSTATUS
7720 NTAPI
7721 IoDeleteSymbolicLink(
7722 IN PUNICODE_STRING SymbolicLinkName);
7723
7724 /*
7725 * VOID
7726 * IoDeassignArcName(
7727 * IN PUNICODE_STRING ArcName)
7728 */
7729 #define IoDeassignArcName IoDeleteSymbolicLink
7730
7731 NTKERNELAPI
7732 VOID
7733 NTAPI
7734 IoDetachDevice(
7735 IN OUT PDEVICE_OBJECT TargetDevice);
7736
7737 NTKERNELAPI
7738 VOID
7739 NTAPI
7740 IoDisconnectInterrupt(
7741 IN PKINTERRUPT InterruptObject);
7742
7743 NTKERNELAPI
7744 BOOLEAN
7745 NTAPI
7746 IoForwardIrpSynchronously(
7747 IN PDEVICE_OBJECT DeviceObject,
7748 IN PIRP Irp);
7749
7750 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
7751
7752 NTKERNELAPI
7753 VOID
7754 NTAPI
7755 IoFreeController(
7756 IN PCONTROLLER_OBJECT ControllerObject);
7757
7758 NTKERNELAPI
7759 VOID
7760 NTAPI
7761 IoFreeErrorLogEntry(
7762 PVOID ElEntry);
7763
7764 NTKERNELAPI
7765 VOID
7766 NTAPI
7767 IoFreeIrp(
7768 IN PIRP Irp);
7769
7770 NTKERNELAPI
7771 VOID
7772 NTAPI
7773 IoFreeMdl(
7774 IN PMDL Mdl);
7775
7776 NTKERNELAPI
7777 VOID
7778 NTAPI
7779 IoFreeWorkItem(
7780 IN PIO_WORKITEM pIOWorkItem);
7781
7782 NTKERNELAPI
7783 PDEVICE_OBJECT
7784 NTAPI
7785 IoGetAttachedDevice(
7786 IN PDEVICE_OBJECT DeviceObject);
7787
7788 NTKERNELAPI
7789 PDEVICE_OBJECT
7790 NTAPI
7791 IoGetAttachedDeviceReference(
7792 IN PDEVICE_OBJECT DeviceObject);
7793
7794 NTKERNELAPI
7795 NTSTATUS
7796 NTAPI
7797 IoGetBootDiskInformation(
7798 IN OUT PBOOTDISK_INFORMATION BootDiskInformation,
7799 IN ULONG Size);
7800
7801 NTKERNELAPI
7802 PCONFIGURATION_INFORMATION
7803 NTAPI
7804 IoGetConfigurationInformation(
7805 VOID);
7806
7807 NTKERNELAPI
7808 PEPROCESS
7809 NTAPI
7810 IoGetCurrentProcess(
7811 VOID);
7812
7813 NTKERNELAPI
7814 NTSTATUS
7815 NTAPI
7816 IoGetDeviceInterfaceAlias(
7817 IN PUNICODE_STRING SymbolicLinkName,
7818 IN CONST GUID *AliasInterfaceClassGuid,
7819 OUT PUNICODE_STRING AliasSymbolicLinkName);
7820
7821 #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
7822
7823 NTKERNELAPI
7824 NTSTATUS
7825 NTAPI
7826 IoGetDeviceInterfaces(
7827 IN CONST GUID *InterfaceClassGuid,
7828 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
7829 IN ULONG Flags,
7830 OUT PWSTR *SymbolicLinkList);
7831
7832 NTKERNELAPI
7833 NTSTATUS
7834 NTAPI
7835 IoGetDeviceObjectPointer(
7836 IN PUNICODE_STRING ObjectName,
7837 IN ACCESS_MASK DesiredAccess,
7838 OUT PFILE_OBJECT *FileObject,
7839 OUT PDEVICE_OBJECT *DeviceObject);
7840
7841 NTKERNELAPI
7842 NTSTATUS
7843 NTAPI
7844 IoGetDeviceProperty(
7845 IN PDEVICE_OBJECT DeviceObject,
7846 IN DEVICE_REGISTRY_PROPERTY DeviceProperty,
7847 IN ULONG BufferLength,
7848 OUT PVOID PropertyBuffer,
7849 OUT PULONG ResultLength);
7850
7851 NTKERNELAPI
7852 PDEVICE_OBJECT
7853 NTAPI
7854 IoGetDeviceToVerify(
7855 IN PETHREAD Thread);
7856
7857 NTKERNELAPI
7858 PDMA_ADAPTER
7859 NTAPI
7860 IoGetDmaAdapter(
7861 IN PDEVICE_OBJECT PhysicalDeviceObject,
7862 IN PDEVICE_DESCRIPTION DeviceDescription,
7863 IN OUT PULONG NumberOfMapRegisters);
7864
7865 NTKERNELAPI
7866 PVOID
7867 NTAPI
7868 IoGetDriverObjectExtension(
7869 IN PDRIVER_OBJECT DriverObject,
7870 IN PVOID ClientIdentificationAddress);
7871
7872 NTKERNELAPI
7873 PGENERIC_MAPPING
7874 NTAPI
7875 IoGetFileObjectGenericMapping(
7876 VOID);
7877
7878 /*
7879 * ULONG
7880 * IoGetFunctionCodeFromCtlCode(
7881 * IN ULONG ControlCode)
7882 */
7883 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
7884 (((_ControlCode) >> 2) & 0x00000FFF)
7885
7886 NTKERNELAPI
7887 PVOID
7888 NTAPI
7889 IoGetInitialStack(
7890 VOID);
7891
7892 NTKERNELAPI
7893 PDEVICE_OBJECT
7894 NTAPI
7895 IoGetRelatedDeviceObject(
7896 IN PFILE_OBJECT FileObject);
7897
7898 NTKERNELAPI
7899 ULONG
7900 NTAPI
7901 IoGetRemainingStackSize(
7902 VOID);
7903
7904 NTKERNELAPI
7905 VOID
7906 NTAPI
7907 IoGetStackLimits(
7908 OUT PULONG_PTR LowLimit,
7909 OUT PULONG_PTR HighLimit);
7910
7911 NTKERNELAPI
7912 VOID
7913 NTAPI
7914 KeInitializeDpc(
7915 IN PRKDPC Dpc,
7916 IN PKDEFERRED_ROUTINE DeferredRoutine,
7917 IN PVOID DeferredContext);
7918
7919 /*
7920 * VOID
7921 * IoInitializeDpcRequest(
7922 * IN PDEVICE_OBJECT DeviceObject,
7923 * IN PIO_DPC_ROUTINE DpcRoutine)
7924 */
7925 #define IoInitializeDpcRequest(_DeviceObject, \
7926 _DpcRoutine) \
7927 KeInitializeDpc(&(_DeviceObject)->Dpc, \
7928 (PKDEFERRED_ROUTINE) (_DpcRoutine), \
7929 _DeviceObject)
7930
7931 NTKERNELAPI
7932 VOID
7933 NTAPI
7934 IoInitializeIrp(
7935 IN OUT PIRP Irp,
7936 IN USHORT PacketSize,
7937 IN CCHAR StackSize);
7938
7939 NTKERNELAPI
7940 VOID
7941 NTAPI
7942 IoInitializeRemoveLockEx(
7943 IN PIO_REMOVE_LOCK Lock,
7944 IN ULONG AllocateTag,
7945 IN ULONG MaxLockedMinutes,
7946 IN ULONG HighWatermark,
7947 IN ULONG RemlockSize);
7948
7949 /* VOID
7950 * IoInitializeRemoveLock(
7951 * IN PIO_REMOVE_LOCK Lock,
7952 * IN ULONG AllocateTag,
7953 * IN ULONG MaxLockedMinutes,
7954 * IN ULONG HighWatermark)
7955 */
7956 #define IoInitializeRemoveLock( \
7957 Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
7958 IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
7959 HighWatermark, sizeof(IO_REMOVE_LOCK))
7960
7961 NTKERNELAPI
7962 NTSTATUS
7963 NTAPI
7964 IoInitializeTimer(
7965 IN PDEVICE_OBJECT DeviceObject,
7966 IN PIO_TIMER_ROUTINE TimerRoutine,
7967 IN PVOID Context);
7968
7969 NTKERNELAPI
7970 VOID
7971 NTAPI
7972 IoInvalidateDeviceRelations(
7973 IN PDEVICE_OBJECT DeviceObject,
7974 IN DEVICE_RELATION_TYPE Type);
7975
7976 NTKERNELAPI
7977 VOID
7978 NTAPI
7979 IoInvalidateDeviceState(
7980 IN PDEVICE_OBJECT PhysicalDeviceObject);
7981
7982 NTKERNELAPI
7983 BOOLEAN
7984 NTAPI
7985 IoIs32bitProcess(
7986 IN PIRP Irp OPTIONAL);
7987
7988 /*
7989 * BOOLEAN
7990 * IoIsErrorUserInduced(
7991 * IN NTSTATUS Status);
7992 */
7993 #define IoIsErrorUserInduced(Status) \
7994 ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
7995 ((Status) == STATUS_IO_TIMEOUT) || \
7996 ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
7997 ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
7998 ((Status) == STATUS_VERIFY_REQUIRED) || \
7999 ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
8000 ((Status) == STATUS_WRONG_VOLUME)))
8001
8002 NTKERNELAPI
8003 BOOLEAN
8004 NTAPI
8005 IoIsWdmVersionAvailable(
8006 IN UCHAR MajorVersion,
8007 IN UCHAR MinorVersion);
8008
8009 NTKERNELAPI
8010 PIRP
8011 NTAPI
8012 IoMakeAssociatedIrp(
8013 IN PIRP Irp,
8014 IN CCHAR StackSize);
8015
8016 /*
8017 * VOID
8018 * IoMarkIrpPending(
8019 * IN OUT PIRP Irp)
8020 */
8021 #define IoMarkIrpPending(_Irp) \
8022 (IoGetCurrentIrpStackLocation(_Irp)->Control |= SL_PENDING_RETURNED)
8023
8024 NTKERNELAPI
8025 NTSTATUS
8026 NTAPI
8027 IoOpenDeviceInterfaceRegistryKey(
8028 IN PUNICODE_STRING SymbolicLinkName,
8029 IN ACCESS_MASK DesiredAccess,
8030 OUT PHANDLE DeviceInterfaceKey);
8031
8032 #define PLUGPLAY_REGKEY_DEVICE 1
8033 #define PLUGPLAY_REGKEY_DRIVER 2
8034 #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4
8035
8036 NTKERNELAPI
8037 NTSTATUS
8038 NTAPI
8039 IoOpenDeviceRegistryKey(
8040 IN PDEVICE_OBJECT DeviceObject,
8041 IN ULONG DevInstKeyType,
8042 IN ACCESS_MASK DesiredAccess,
8043 OUT PHANDLE DevInstRegKey);
8044
8045 NTKERNELAPI
8046 NTSTATUS
8047 NTAPI
8048 IoQueryDeviceDescription(
8049 IN PINTERFACE_TYPE BusType OPTIONAL,
8050 IN PULONG BusNumber OPTIONAL,
8051 IN PCONFIGURATION_TYPE ControllerType OPTIONAL,
8052 IN PULONG ControllerNumber OPTIONAL,
8053 IN PCONFIGURATION_TYPE PeripheralType OPTIONAL,
8054 IN PULONG PeripheralNumber OPTIONAL,
8055 IN PIO_QUERY_DEVICE_ROUTINE CalloutRoutine,
8056 IN PVOID Context);
8057
8058 NTKERNELAPI
8059 VOID
8060 NTAPI
8061 IoQueueWorkItem(
8062 IN PIO_WORKITEM pIOWorkItem,
8063 IN PIO_WORKITEM_ROUTINE Routine,
8064 IN WORK_QUEUE_TYPE QueueType,
8065 IN PVOID Context);
8066
8067 NTKERNELAPI
8068 VOID
8069 NTAPI
8070 IoRaiseHardError(
8071 IN PIRP Irp,
8072 IN PVPB Vpb OPTIONAL,
8073 IN PDEVICE_OBJECT RealDeviceObject);
8074
8075 NTKERNELAPI
8076 BOOLEAN
8077 NTAPI
8078 IoRaiseInformationalHardError(
8079 IN NTSTATUS ErrorStatus,
8080 IN PUNICODE_STRING String OPTIONAL,
8081 IN PKTHREAD Thread OPTIONAL);
8082
8083 NTKERNELAPI
8084 NTSTATUS
8085 NTAPI
8086 IoReadDiskSignature(
8087 IN PDEVICE_OBJECT DeviceObject,
8088 IN ULONG BytesPerSector,
8089 OUT PDISK_SIGNATURE Signature);
8090
8091 NTKERNELAPI
8092 NTSTATUS
8093 NTAPI
8094 IoReadPartitionTableEx(
8095 IN PDEVICE_OBJECT DeviceObject,
8096 IN struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer);
8097
8098 NTKERNELAPI
8099 VOID
8100 NTAPI
8101 IoRegisterBootDriverReinitialization(
8102 IN PDRIVER_OBJECT DriverObject,
8103 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
8104 IN PVOID Context);
8105
8106 NTKERNELAPI
8107 VOID
8108 NTAPI
8109 IoRegisterBootDriverReinitialization(
8110 IN PDRIVER_OBJECT DriverObject,
8111 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
8112 IN PVOID Context);
8113
8114 NTKERNELAPI
8115 NTSTATUS
8116 NTAPI
8117 IoRegisterDeviceInterface(
8118 IN PDEVICE_OBJECT PhysicalDeviceObject,
8119 IN CONST GUID *InterfaceClassGuid,
8120 IN PUNICODE_STRING ReferenceString OPTIONAL,
8121 OUT PUNICODE_STRING SymbolicLinkName);
8122
8123 NTKERNELAPI
8124 VOID
8125 NTAPI
8126 IoRegisterDriverReinitialization(
8127 IN PDRIVER_OBJECT DriverObject,
8128 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
8129 IN PVOID Context);
8130
8131 NTKERNELAPI
8132 NTSTATUS
8133 NTAPI
8134 IoRegisterPlugPlayNotification(
8135 IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
8136 IN ULONG EventCategoryFlags,
8137 IN PVOID EventCategoryData OPTIONAL,
8138 IN PDRIVER_OBJECT DriverObject,
8139 IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine,
8140 IN PVOID Context,
8141 OUT PVOID *NotificationEntry);
8142
8143 NTKERNELAPI
8144 NTSTATUS
8145 NTAPI
8146 IoRegisterShutdownNotification(
8147 IN PDEVICE_OBJECT DeviceObject);
8148
8149 NTKERNELAPI
8150 VOID
8151 NTAPI
8152 IoReleaseCancelSpinLock(
8153 IN KIRQL Irql);
8154
8155 NTKERNELAPI
8156 VOID
8157 NTAPI
8158 IoReleaseRemoveLockAndWaitEx(
8159 IN PIO_REMOVE_LOCK RemoveLock,
8160 IN PVOID Tag,
8161 IN ULONG RemlockSize);
8162
8163 NTKERNELAPI
8164 VOID
8165 NTAPI
8166 IoReleaseRemoveLockEx(
8167 IN PIO_REMOVE_LOCK RemoveLock,
8168 IN PVOID Tag,
8169 IN ULONG RemlockSize);
8170
8171 /*
8172 * VOID
8173 * IoReleaseRemoveLock(
8174 * IN PIO_REMOVE_LOCK RemoveLock,
8175 * IN PVOID Tag)
8176 */
8177 #define IoReleaseRemoveLock(_RemoveLock, \
8178 _Tag) \
8179 IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
8180
8181 /*
8182 * VOID
8183 * IoReleaseRemoveLockAndWait(
8184 * IN PIO_REMOVE_LOCK RemoveLock,
8185 * IN PVOID Tag)
8186 */
8187 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
8188 _Tag) \
8189 IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
8190
8191 NTKERNELAPI
8192 VOID
8193 NTAPI
8194 IoRemoveShareAccess(
8195 IN PFILE_OBJECT FileObject,
8196 IN OUT PSHARE_ACCESS ShareAccess);
8197
8198 NTKERNELAPI
8199 NTSTATUS
8200 NTAPI
8201 IoReportDetectedDevice(
8202 IN PDRIVER_OBJECT DriverObject,
8203 IN INTERFACE_TYPE LegacyBusType,
8204 IN ULONG BusNumber,
8205 IN ULONG SlotNumber,
8206 IN PCM_RESOURCE_LIST ResourceList,
8207 IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL,
8208 IN BOOLEAN ResourceAssigned,
8209 IN OUT PDEVICE_OBJECT *DeviceObject);
8210
8211 NTKERNELAPI
8212 NTSTATUS
8213 NTAPI
8214 IoReportResourceForDetection(
8215 IN PDRIVER_OBJECT DriverObject,
8216 IN PCM_RESOURCE_LIST DriverList OPTIONAL,
8217 IN ULONG DriverListSize OPTIONAL,
8218 IN PDEVICE_OBJECT DeviceObject OPTIONAL,
8219 IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
8220 IN ULONG DeviceListSize OPTIONAL,
8221 OUT PBOOLEAN ConflictDetected);
8222
8223 NTKERNELAPI
8224 NTSTATUS
8225 NTAPI
8226 IoReportResourceUsage(
8227 IN PUNICODE_STRING DriverClassName OPTIONAL,
8228 IN PDRIVER_OBJECT DriverObject,
8229 IN PCM_RESOURCE_LIST DriverList OPTIONAL,
8230 IN ULONG DriverListSize OPTIONAL,
8231 IN PDEVICE_OBJECT DeviceObject,
8232 IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
8233 IN ULONG DeviceListSize OPTIONAL,
8234 IN BOOLEAN OverrideConflict,
8235 OUT PBOOLEAN ConflictDetected);
8236
8237 NTKERNELAPI
8238 NTSTATUS
8239 NTAPI
8240 IoReportTargetDeviceChange(
8241 IN PDEVICE_OBJECT PhysicalDeviceObject,
8242 IN PVOID NotificationStructure);
8243
8244 NTKERNELAPI
8245 NTSTATUS
8246 NTAPI
8247 IoReportTargetDeviceChangeAsynchronous(
8248 IN PDEVICE_OBJECT PhysicalDeviceObject,
8249 IN PVOID NotificationStructure,
8250 IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL,
8251 IN PVOID Context OPTIONAL);
8252
8253 NTKERNELAPI
8254 VOID
8255 NTAPI
8256 IoRequestDeviceEject(
8257 IN PDEVICE_OBJECT PhysicalDeviceObject);
8258
8259 /*
8260 * VOID
8261 * IoRequestDpc(
8262 * IN PDEVICE_OBJECT DeviceObject,
8263 * IN PIRP Irp,
8264 * IN PVOID Context);
8265 */
8266 #define IoRequestDpc(DeviceObject, Irp, Context)( \
8267 KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
8268
8269 NTKERNELAPI
8270 VOID
8271 NTAPI
8272 IoReuseIrp(
8273 IN OUT PIRP Irp,
8274 IN NTSTATUS Status);
8275
8276 /*
8277 * PDRIVER_CANCEL
8278 * IoSetCancelRoutine(
8279 * IN PIRP Irp,
8280 * IN PDRIVER_CANCEL CancelRoutine)
8281 */
8282 #define IoSetCancelRoutine(_Irp, \
8283 _CancelRoutine) \
8284 ((PDRIVER_CANCEL) InterlockedExchangePointer( \
8285 (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (_CancelRoutine)))
8286
8287 /*
8288 * VOID
8289 * IoSetCompletionRoutine(
8290 * IN PIRP Irp,
8291 * IN PIO_COMPLETION_ROUTINE CompletionRoutine,
8292 * IN PVOID Context,
8293 * IN BOOLEAN InvokeOnSuccess,
8294 * IN BOOLEAN InvokeOnError,
8295 * IN BOOLEAN InvokeOnCancel)
8296 */
8297 #define IoSetCompletionRoutine(_Irp, \
8298 _CompletionRoutine, \
8299 _Context, \
8300 _InvokeOnSuccess, \
8301 _InvokeOnError, \
8302 _InvokeOnCancel) \
8303 { \
8304 PIO_STACK_LOCATION _IrpSp; \
8305 ASSERT(_InvokeOnSuccess || _InvokeOnError || _InvokeOnCancel ? \
8306 _CompletionRoutine != NULL : TRUE); \
8307 _IrpSp = IoGetNextIrpStackLocation(_Irp); \
8308 _IrpSp->CompletionRoutine = (PIO_COMPLETION_ROUTINE)(_CompletionRoutine); \
8309 _IrpSp->Context = (_Context); \
8310 _IrpSp->Control = 0; \
8311 if (_InvokeOnSuccess) _IrpSp->Control = SL_INVOKE_ON_SUCCESS; \
8312 if (_InvokeOnError) _IrpSp->Control |= SL_INVOKE_ON_ERROR; \
8313 if (_InvokeOnCancel) _IrpSp->Control |= SL_INVOKE_ON_CANCEL; \
8314 }
8315
8316 NTKERNELAPI
8317 NTSTATUS
8318 NTAPI
8319 IoSetCompletionRoutineEx(
8320 IN PDEVICE_OBJECT DeviceObject,
8321 IN PIRP Irp,
8322 IN PIO_COMPLETION_ROUTINE CompletionRoutine,
8323 IN PVOID Context,
8324 IN BOOLEAN InvokeOnSuccess,
8325 IN BOOLEAN InvokeOnError,
8326 IN BOOLEAN InvokeOnCancel);
8327
8328 NTKERNELAPI
8329 NTSTATUS
8330 NTAPI
8331 IoSetDeviceInterfaceState(
8332 IN PUNICODE_STRING SymbolicLinkName,
8333 IN BOOLEAN Enable);
8334
8335 NTKERNELAPI
8336 VOID
8337 NTAPI
8338 IoSetHardErrorOrVerifyDevice(
8339 IN PIRP Irp,
8340 IN PDEVICE_OBJECT DeviceObject);
8341
8342 /*
8343 * VOID
8344 * IoSetNextIrpStackLocation(
8345 * IN OUT PIRP Irp)
8346 */
8347 #define IoSetNextIrpStackLocation(_Irp) \
8348 { \
8349 (_Irp)->CurrentLocation--; \
8350 (_Irp)->Tail.Overlay.CurrentStackLocation--; \
8351 }
8352
8353 NTKERNELAPI
8354 NTSTATUS
8355 NTAPI
8356 IoSetPartitionInformationEx(
8357 IN PDEVICE_OBJECT DeviceObject,
8358 IN ULONG PartitionNumber,
8359 IN struct _SET_PARTITION_INFORMATION_EX *PartitionInfo);
8360
8361 NTKERNELAPI
8362 VOID
8363 NTAPI
8364 IoSetShareAccess(
8365 IN ACCESS_MASK DesiredAccess,
8366 IN ULONG DesiredShareAccess,
8367 IN OUT PFILE_OBJECT FileObject,
8368 OUT PSHARE_ACCESS ShareAccess);
8369
8370 NTKERNELAPI
8371 VOID
8372 NTAPI
8373 IoSetStartIoAttributes(
8374 IN PDEVICE_OBJECT DeviceObject,
8375 IN BOOLEAN DeferredStartIo,
8376 IN BOOLEAN NonCancelable);
8377
8378 NTKERNELAPI
8379 NTSTATUS
8380 NTAPI
8381 IoSetSystemPartition(
8382 IN PUNICODE_STRING VolumeNameString);
8383
8384 NTKERNELAPI
8385 BOOLEAN
8386 NTAPI
8387 IoSetThreadHardErrorMode(
8388 IN BOOLEAN EnableHardErrors);
8389
8390 /*
8391 * USHORT
8392 * IoSizeOfIrp(
8393 * IN CCHAR StackSize)
8394 */
8395 #define IoSizeOfIrp(_StackSize) \
8396 ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
8397
8398 /*
8399 * VOID
8400 * IoSkipCurrentIrpStackLocation(
8401 * IN PIRP Irp)
8402 */
8403 #define IoSkipCurrentIrpStackLocation(_Irp) \
8404 { \
8405 (_Irp)->CurrentLocation++; \
8406 (_Irp)->Tail.Overlay.CurrentStackLocation++; \
8407 }
8408
8409 NTKERNELAPI
8410 VOID
8411 NTAPI
8412 IoStartNextPacket(
8413 IN PDEVICE_OBJECT DeviceObject,
8414 IN BOOLEAN Cancelable);
8415
8416 NTKERNELAPI
8417 VOID
8418 NTAPI
8419 IoStartNextPacketByKey(
8420 IN PDEVICE_OBJECT DeviceObject,
8421 IN BOOLEAN Cancelable,
8422 IN ULONG Key);
8423
8424 NTKERNELAPI
8425 VOID
8426 NTAPI
8427 IoStartPacket(
8428 IN PDEVICE_OBJECT DeviceObject,
8429 IN PIRP Irp,
8430 IN PULONG Key OPTIONAL,
8431 IN PDRIVER_CANCEL CancelFunction OPTIONAL);
8432
8433 NTKERNELAPI
8434 VOID
8435 NTAPI
8436 IoStartTimer(
8437 IN PDEVICE_OBJECT DeviceObject);
8438
8439 NTKERNELAPI
8440 VOID
8441 NTAPI
8442 IoStopTimer(
8443 IN PDEVICE_OBJECT DeviceObject);
8444
8445 NTKERNELAPI
8446 NTSTATUS
8447 NTAPI
8448 IoUnregisterPlugPlayNotification(
8449 IN PVOID NotificationEntry);
8450
8451 NTKERNELAPI
8452 VOID
8453 NTAPI
8454 IoUnregisterShutdownNotification(
8455 IN PDEVICE_OBJECT DeviceObject);
8456
8457 NTKERNELAPI
8458 VOID
8459 NTAPI
8460 IoUpdateShareAccess(
8461 IN PFILE_OBJECT FileObject,
8462 IN OUT PSHARE_ACCESS ShareAccess);
8463
8464 NTKERNELAPI
8465 NTSTATUS
8466 NTAPI
8467 IoVerifyPartitionTable(
8468 IN PDEVICE_OBJECT DeviceObject,
8469 IN BOOLEAN FixErrors);
8470
8471 NTKERNELAPI
8472 NTSTATUS
8473 NTAPI
8474 IoVolumeDeviceToDosName(
8475 IN PVOID VolumeDeviceObject,
8476 OUT PUNICODE_STRING DosName);
8477
8478 NTKERNELAPI
8479 NTSTATUS
8480 NTAPI
8481 IoWMIAllocateInstanceIds(
8482 IN GUID *Guid,
8483 IN ULONG InstanceCount,
8484 OUT ULONG *FirstInstanceId);
8485
8486 NTKERNELAPI
8487 ULONG
8488 NTAPI
8489 IoWMIDeviceObjectToProviderId(
8490 IN PDEVICE_OBJECT DeviceObject);
8491
8492 NTKERNELAPI
8493 NTSTATUS
8494 NTAPI
8495 IoWMIDeviceObjectToInstanceName(
8496 IN PVOID DataBlockObject,
8497 IN PDEVICE_OBJECT DeviceObject,
8498 OUT PUNICODE_STRING InstanceName);
8499
8500 NTKERNELAPI
8501 NTSTATUS
8502 NTAPI
8503 IoWMIExecuteMethod(
8504 IN PVOID DataBlockObject,
8505 IN PUNICODE_STRING InstanceName,
8506 IN ULONG MethodId,
8507 IN ULONG InBufferSize,
8508 IN OUT PULONG OutBufferSize,
8509 IN OUT PUCHAR InOutBuffer);
8510
8511 NTKERNELAPI
8512 NTSTATUS
8513 NTAPI
8514 IoWMIHandleToInstanceName(
8515 IN PVOID DataBlockObject,
8516 IN HANDLE FileHandle,
8517 OUT PUNICODE_STRING InstanceName);
8518
8519 NTKERNELAPI
8520 NTSTATUS
8521 NTAPI
8522 IoWMIOpenBlock(
8523 IN GUID *DataBlockGuid,
8524 IN ULONG DesiredAccess,
8525 OUT PVOID *DataBlockObject);
8526
8527 NTKERNELAPI
8528 NTSTATUS
8529 NTAPI
8530 IoWMIQueryAllData(
8531 IN PVOID DataBlockObject,
8532 IN OUT ULONG *InOutBufferSize,
8533 OUT PVOID OutBuffer);
8534
8535 NTKERNELAPI
8536 NTSTATUS
8537 NTAPI
8538 IoWMIQueryAllDataMultiple(
8539 IN PVOID *DataBlockObjectList,
8540 IN ULONG ObjectCount,
8541 IN OUT ULONG *InOutBufferSize,
8542 OUT PVOID OutBuffer);
8543
8544 NTKERNELAPI
8545 NTSTATUS
8546 NTAPI
8547 IoWMIQuerySingleInstance(
8548 IN PVOID DataBlockObject,
8549 IN PUNICODE_STRING InstanceName,
8550 IN OUT ULONG *InOutBufferSize,
8551 OUT PVOID OutBuffer);
8552
8553 NTKERNELAPI
8554 NTSTATUS
8555 NTAPI
8556 IoWMIQuerySingleInstanceMultiple(
8557 IN PVOID *DataBlockObjectList,
8558 IN PUNICODE_STRING InstanceNames,
8559 IN ULONG ObjectCount,
8560 IN OUT ULONG *InOutBufferSize,
8561 OUT PVOID OutBuffer);
8562
8563 NTKERNELAPI
8564 NTSTATUS
8565 NTAPI
8566 IoWMIRegistrationControl(
8567 IN PDEVICE_OBJECT DeviceObject,
8568 IN ULONG Action);
8569
8570 NTKERNELAPI
8571 NTSTATUS
8572 NTAPI
8573 IoWMISetNotificationCallback(
8574 IN PVOID Object,
8575 IN WMI_NOTIFICATION_CALLBACK Callback,
8576 IN PVOID Context);
8577
8578 NTKERNELAPI
8579 NTSTATUS
8580 NTAPI
8581 IoWMISetSingleInstance(
8582 IN PVOID DataBlockObject,
8583 IN PUNICODE_STRING InstanceName,
8584 IN ULONG Version,
8585 IN ULONG ValueBufferSize,
8586 IN PVOID ValueBuffer);
8587
8588 NTKERNELAPI
8589 NTSTATUS
8590 NTAPI
8591 IoWMISetSingleItem(
8592 IN PVOID DataBlockObject,
8593 IN PUNICODE_STRING InstanceName,
8594 IN ULONG DataItemId,
8595 IN ULONG Version,
8596 IN ULONG ValueBufferSize,
8597 IN PVOID ValueBuffer);
8598
8599 NTKERNELAPI
8600 NTSTATUS
8601 NTAPI
8602 IoWMISuggestInstanceName(
8603 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
8604 IN PUNICODE_STRING SymbolicLinkName OPTIONAL,
8605 IN BOOLEAN CombineNames,
8606 OUT PUNICODE_STRING SuggestedInstanceName);
8607
8608 NTKERNELAPI
8609 NTSTATUS
8610 NTAPI
8611 IoWMIWriteEvent(
8612 IN PVOID WnodeEventItem);
8613
8614 NTKERNELAPI
8615 VOID
8616 NTAPI
8617 IoWriteErrorLogEntry(
8618 IN PVOID ElEntry);
8619
8620 NTKERNELAPI
8621 NTSTATUS
8622 NTAPI
8623 IoWritePartitionTableEx(
8624 IN PDEVICE_OBJECT DeviceObject,
8625 IN struct _DRIVE_LAYOUT_INFORMATION_EX *PartitionBuffer);
8626
8627
8628
8629 /** Kernel routines **/
8630
8631 NTHALAPI
8632 VOID
8633 FASTCALL
8634 KeAcquireInStackQueuedSpinLock(
8635 IN PKSPIN_LOCK SpinLock,
8636 IN PKLOCK_QUEUE_HANDLE LockHandle);
8637
8638 NTKERNELAPI
8639 VOID
8640 FASTCALL
8641 KeAcquireInStackQueuedSpinLockAtDpcLevel(
8642 IN PKSPIN_LOCK SpinLock,
8643 IN PKLOCK_QUEUE_HANDLE LockHandle);
8644
8645 NTKERNELAPI
8646 KIRQL
8647 NTAPI
8648 KeAcquireInterruptSpinLock(
8649 IN PKINTERRUPT Interrupt);
8650
8651 NTKERNELAPI
8652 BOOLEAN
8653 NTAPI
8654 KeAreApcsDisabled(
8655 VOID);
8656
8657 NTKERNELAPI
8658 VOID
8659 NTAPI
8660 KeBugCheck(
8661 IN ULONG BugCheckCode);
8662
8663 NTKERNELAPI
8664 VOID
8665 NTAPI
8666 KeBugCheckEx(
8667 IN ULONG BugCheckCode,
8668 IN ULONG_PTR BugCheckParameter1,
8669 IN ULONG_PTR BugCheckParameter2,
8670 IN ULONG_PTR BugCheckParameter3,
8671 IN ULONG_PTR BugCheckParameter4);
8672
8673 NTKERNELAPI
8674 BOOLEAN
8675 NTAPI
8676 KeCancelTimer(
8677 IN PKTIMER Timer);
8678
8679 NTKERNELAPI
8680 VOID
8681 NTAPI
8682 KeClearEvent(
8683 IN PRKEVENT Event);
8684
8685 NTKERNELAPI
8686 NTSTATUS
8687 NTAPI
8688 KeDelayExecutionThread(
8689 IN KPROCESSOR_MODE WaitMode,
8690 IN BOOLEAN Alertable,
8691 IN PLARGE_INTEGER Interval);
8692
8693 NTKERNELAPI
8694 BOOLEAN
8695 NTAPI
8696 KeDeregisterBugCheckCallback(
8697 IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord);
8698
8699 NTKERNELAPI
8700 VOID
8701 NTAPI
8702 KeEnterCriticalRegion(
8703 VOID);
8704
8705 /*
8706 * VOID
8707 * KeFlushIoBuffers(
8708 * IN PMDL Mdl,
8709 * IN BOOLEAN ReadOperation,
8710 * IN BOOLEAN DmaOperation)
8711 */
8712 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
8713
8714 NTHALAPI
8715 VOID
8716 NTAPI
8717 KeFlushWriteBuffer(VOID);
8718
8719 NTKERNELAPI
8720 PRKTHREAD
8721 NTAPI
8722 KeGetCurrentThread(
8723 VOID);
8724
8725 NTKERNELAPI
8726 ULONG
8727 NTAPI
8728 KeGetRecommendedSharedDataAlignment(
8729 VOID);
8730
8731 NTKERNELAPI
8732 VOID
8733 NTAPI
8734 KeInitializeDeviceQueue(
8735 IN PKDEVICE_QUEUE DeviceQueue);
8736
8737 NTKERNELAPI
8738 VOID
8739 NTAPI
8740 KeInitializeMutex(
8741 IN PRKMUTEX Mutex,
8742 IN ULONG Level);
8743
8744 NTKERNELAPI
8745 VOID
8746 NTAPI
8747 KeInitializeSemaphore(
8748 IN PRKSEMAPHORE Semaphore,
8749 IN LONG Count,
8750 IN LONG Limit);
8751
8752 NTKERNELAPI
8753 VOID
8754 NTAPI
8755 KeInitializeSpinLock(
8756 IN PKSPIN_LOCK SpinLock);
8757
8758 NTKERNELAPI
8759 VOID
8760 NTAPI
8761 KeInitializeTimer(
8762 IN PKTIMER Timer);
8763
8764 NTKERNELAPI
8765 VOID
8766 NTAPI
8767 KeInitializeTimerEx(
8768 IN PKTIMER Timer,
8769 IN TIMER_TYPE Type);
8770
8771 NTKERNELAPI
8772 BOOLEAN
8773 NTAPI
8774 KeInsertByKeyDeviceQueue(
8775 IN PKDEVICE_QUEUE DeviceQueue,
8776 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry,
8777 IN ULONG SortKey);
8778
8779 NTKERNELAPI
8780 BOOLEAN
8781 NTAPI
8782 KeInsertDeviceQueue(
8783 IN PKDEVICE_QUEUE DeviceQueue,
8784 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
8785
8786 NTKERNELAPI
8787 BOOLEAN
8788 NTAPI
8789 KeInsertQueueDpc(
8790 IN PRKDPC Dpc,
8791 IN PVOID SystemArgument1,
8792 IN PVOID SystemArgument2);
8793
8794 NTKERNELAPI
8795 VOID
8796 NTAPI
8797 KeLeaveCriticalRegion(
8798 VOID);
8799
8800 #ifdef _X86_
8801
8802 static __inline
8803 VOID
8804 KeMemoryBarrier(
8805 VOID)
8806 {
8807 volatile LONG Barrier;
8808 #if defined(__GNUC__)
8809 __asm__ __volatile__ ("xchg %%eax, %0" : : "m" (Barrier) : "%eax");
8810 #elif defined(_MSC_VER)
8811 __asm xchg [Barrier], eax
8812 #endif
8813 }
8814
8815 #endif
8816
8817 NTKERNELAPI
8818 LONG
8819 NTAPI
8820 KePulseEvent(
8821 IN PRKEVENT Event,
8822 IN KPRIORITY Increment,
8823 IN BOOLEAN Wait);
8824
8825 NTKERNELAPI
8826 ULONGLONG
8827 NTAPI
8828 KeQueryInterruptTime(
8829 VOID);
8830
8831 NTHALAPI
8832 LARGE_INTEGER
8833 NTAPI
8834 KeQueryPerformanceCounter(
8835 OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL);
8836
8837 NTKERNELAPI
8838 KPRIORITY
8839 NTAPI
8840 KeQueryPriorityThread(
8841 IN PRKTHREAD Thread);
8842
8843 NTKERNELAPI
8844 VOID
8845 NTAPI
8846 KeQuerySystemTime(
8847 OUT PLARGE_INTEGER CurrentTime);
8848
8849 NTKERNELAPI
8850 VOID
8851 NTAPI
8852 KeQueryTickCount(
8853 OUT PLARGE_INTEGER TickCount);
8854
8855 NTKERNELAPI
8856 ULONG
8857 NTAPI
8858 KeQueryTimeIncrement(
8859 VOID);
8860
8861 NTKERNELAPI
8862 LONG
8863 NTAPI
8864 KeReadStateEvent(
8865 IN PRKEVENT Event);
8866
8867 NTKERNELAPI
8868 LONG
8869 NTAPI
8870 KeReadStateMutex(
8871 IN PRKMUTEX Mutex);
8872
8873
8874 NTKERNELAPI
8875 LONG
8876 NTAPI
8877 KeReadStateSemaphore(
8878 IN PRKSEMAPHORE Semaphore);
8879
8880 NTKERNELAPI
8881 BOOLEAN
8882 NTAPI
8883 KeReadStateTimer(
8884 IN PKTIMER Timer);
8885
8886 NTKERNELAPI
8887 BOOLEAN
8888 NTAPI
8889 KeRegisterBugCheckCallback(
8890 IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord,
8891 IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine,
8892 IN PVOID Buffer,
8893 IN ULONG Length,
8894 IN PUCHAR Component);
8895
8896 NTHALAPI
8897 VOID
8898 FASTCALL
8899 KeReleaseInStackQueuedSpinLock(
8900 IN PKLOCK_QUEUE_HANDLE LockHandle);
8901
8902 NTKERNELAPI
8903 VOID
8904 FASTCALL
8905 KeReleaseInStackQueuedSpinLockFromDpcLevel(
8906 IN PKLOCK_QUEUE_HANDLE LockHandle);
8907
8908 NTKERNELAPI
8909 VOID
8910 NTAPI
8911 KeReleaseInterruptSpinLock(
8912 IN PKINTERRUPT Interrupt,
8913 IN KIRQL OldIrql);
8914
8915 NTKERNELAPI
8916 LONG
8917 NTAPI
8918 KeReleaseMutex(
8919 IN PRKMUTEX Mutex,
8920 IN BOOLEAN Wait);
8921
8922 NTKERNELAPI
8923 LONG
8924 NTAPI
8925 KeReleaseSemaphore(
8926 IN PRKSEMAPHORE Semaphore,
8927 IN KPRIORITY Increment,
8928 IN LONG Adjustment,
8929 IN BOOLEAN Wait);
8930
8931 NTKERNELAPI
8932 PKDEVICE_QUEUE_ENTRY
8933 NTAPI
8934 KeRemoveByKeyDeviceQueue(
8935 IN PKDEVICE_QUEUE DeviceQueue,
8936 IN ULONG SortKey);
8937
8938 NTKERNELAPI
8939 PKDEVICE_QUEUE_ENTRY
8940 NTAPI
8941 KeRemoveDeviceQueue(
8942 IN PKDEVICE_QUEUE DeviceQueue);
8943
8944 NTKERNELAPI
8945 BOOLEAN
8946 NTAPI
8947 KeRemoveEntryDeviceQueue(
8948 IN PKDEVICE_QUEUE DeviceQueue,
8949 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
8950
8951 NTKERNELAPI
8952 BOOLEAN
8953 NTAPI
8954 KeRemoveQueueDpc(
8955 IN PRKDPC Dpc);
8956
8957 NTKERNELAPI
8958 LONG
8959 NTAPI
8960 KeResetEvent(
8961 IN PRKEVENT Event);
8962
8963 NTKERNELAPI
8964 NTSTATUS
8965 NTAPI
8966 KeRestoreFloatingPointState(
8967 IN PKFLOATING_SAVE FloatSave);
8968
8969 NTKERNELAPI
8970 VOID
8971 NTAPI
8972 KeRevertToUserAffinityThread(VOID);
8973
8974 NTKERNELAPI
8975 NTSTATUS
8976 NTAPI
8977 KeSaveFloatingPointState(
8978 OUT PKFLOATING_SAVE FloatSave);
8979
8980 NTKERNELAPI
8981 LONG
8982 NTAPI
8983 KeSetBasePriorityThread(
8984 IN PRKTHREAD Thread,
8985 IN LONG Increment);
8986
8987 NTKERNELAPI
8988 LONG
8989 NTAPI
8990 KeSetEvent(
8991 IN PRKEVENT Event,
8992 IN KPRIORITY Increment,
8993 IN BOOLEAN Wait);
8994
8995 NTKERNELAPI
8996 VOID
8997 NTAPI
8998 KeSetImportanceDpc(
8999 IN PRKDPC Dpc,
9000 IN KDPC_IMPORTANCE Importance);
9001
9002 NTKERNELAPI
9003 KPRIORITY
9004 NTAPI
9005 KeSetPriorityThread(
9006 IN PKTHREAD Thread,
9007 IN KPRIORITY Priority);
9008
9009 NTKERNELAPI
9010 VOID
9011 NTAPI
9012 KeSetSystemAffinityThread(
9013 IN KAFFINITY Affinity);
9014
9015 NTKERNELAPI
9016 VOID
9017 NTAPI
9018 KeSetTargetProcessorDpc(
9019 IN PRKDPC Dpc,
9020 IN CCHAR Number);
9021
9022 NTKERNELAPI
9023 BOOLEAN
9024 NTAPI
9025 KeSetTimer(
9026 IN PKTIMER Timer,
9027 IN LARGE_INTEGER DueTime,
9028 IN PKDPC Dpc OPTIONAL);
9029
9030 NTKERNELAPI
9031 BOOLEAN
9032 NTAPI
9033 KeSetTimerEx(
9034 IN PKTIMER Timer,
9035 IN LARGE_INTEGER DueTime,
9036 IN LONG Period OPTIONAL,
9037 IN PKDPC Dpc OPTIONAL);
9038
9039 NTKERNELAPI
9040 VOID
9041 FASTCALL
9042 KeSetTimeUpdateNotifyRoutine(
9043 IN PTIME_UPDATE_NOTIFY_ROUTINE NotifyRoutine);
9044
9045 NTHALAPI
9046 VOID
9047 NTAPI
9048 KeStallExecutionProcessor(
9049 IN ULONG MicroSeconds);
9050
9051 NTKERNELAPI
9052 BOOLEAN
9053 NTAPI
9054 KeSynchronizeExecution(
9055 IN PKINTERRUPT Interrupt,
9056 IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine,
9057 IN PVOID SynchronizeContext);
9058
9059 NTKERNELAPI
9060 NTSTATUS
9061 NTAPI
9062 KeWaitForMultipleObjects(
9063 IN ULONG Count,
9064 IN PVOID Object[],
9065 IN WAIT_TYPE WaitType,
9066 IN KWAIT_REASON WaitReason,
9067 IN KPROCESSOR_MODE WaitMode,
9068 IN BOOLEAN Alertable,
9069 IN PLARGE_INTEGER Timeout OPTIONAL,
9070 IN PKWAIT_BLOCK WaitBlockArray OPTIONAL);
9071
9072 NTKERNELAPI
9073 NTSTATUS
9074 NTAPI
9075 KeWaitForMutexObject(
9076 IN PRKMUTEX Mutex,
9077 IN KWAIT_REASON WaitReason,
9078 IN KPROCESSOR_MODE WaitMode,
9079 IN BOOLEAN Alertable,
9080 IN PLARGE_INTEGER Timeout OPTIONAL);
9081
9082 NTKERNELAPI
9083 NTSTATUS
9084 NTAPI
9085 KeWaitForSingleObject(
9086 IN PVOID Object,
9087 IN KWAIT_REASON WaitReason,
9088 IN KPROCESSOR_MODE WaitMode,
9089 IN BOOLEAN Alertable,
9090 IN PLARGE_INTEGER Timeout OPTIONAL);
9091
9092 typedef
9093 ULONG_PTR
9094 (NTAPI *PKIPI_BROADCAST_WORKER)(
9095 IN ULONG_PTR Argument
9096 );
9097
9098 NTKERNELAPI
9099 ULONG_PTR
9100 NTAPI
9101 KeIpiGenericCall(
9102 IN PKIPI_BROADCAST_WORKER BroadcastFunction,
9103 IN ULONG_PTR Context
9104 );
9105
9106 #if defined(_X86_)
9107
9108 NTHALAPI
9109 VOID
9110 FASTCALL
9111 KfLowerIrql(
9112 IN KIRQL NewIrql);
9113
9114 NTHALAPI
9115 KIRQL
9116 FASTCALL
9117 KfRaiseIrql(
9118 IN KIRQL NewIrql);
9119
9120 NTHALAPI
9121 KIRQL
9122 DDKAPI
9123 KeRaiseIrqlToDpcLevel(
9124 VOID);
9125
9126 NTHALAPI
9127 KIRQL
9128 DDKAPI
9129 KeRaiseIrqlToSynchLevel(
9130 VOID);
9131
9132 #define KeLowerIrql(a) KfLowerIrql(a)
9133 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
9134
9135 #else
9136
9137 NTKERNELAPI
9138 VOID
9139 NTAPI
9140 KeLowerIrql(
9141 IN KIRQL NewIrql);
9142
9143 NTKERNELAPI
9144 KIRQL
9145 NTAPI
9146 KeRaiseIrql(
9147 IN KIRQL NewIrql);
9148
9149 NTKERNELAPI
9150 KIRQL
9151 NTAPI
9152 KeRaiseIrqlToDpcLevel(
9153 VOID);
9154
9155 #endif
9156
9157 /** Memory manager routines **/
9158
9159 NTKERNELAPI
9160 NTSTATUS
9161 NTAPI
9162 MmAdvanceMdl(
9163 IN PMDL Mdl,
9164 IN ULONG NumberOfBytes);
9165
9166 NTKERNELAPI
9167 PVOID
9168 NTAPI
9169 MmAllocateContiguousMemory(
9170 IN ULONG NumberOfBytes,
9171 IN PHYSICAL_ADDRESS HighestAcceptableAddress);
9172
9173 NTKERNELAPI
9174 PVOID
9175 NTAPI
9176 MmAllocateContiguousMemorySpecifyCache(
9177 IN SIZE_T NumberOfBytes,
9178 IN PHYSICAL_ADDRESS LowestAcceptableAddress,
9179 IN PHYSICAL_ADDRESS HighestAcceptableAddress,
9180 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
9181 IN MEMORY_CACHING_TYPE CacheType);
9182
9183 NTKERNELAPI
9184 PVOID
9185 NTAPI
9186 MmAllocateMappingAddress(
9187 IN SIZE_T NumberOfBytes,
9188 IN ULONG PoolTag);
9189
9190 NTKERNELAPI
9191 PVOID
9192 NTAPI
9193 MmAllocateNonCachedMemory(
9194 IN ULONG NumberOfBytes);
9195
9196 NTKERNELAPI
9197 PMDL
9198 NTAPI
9199 MmAllocatePagesForMdl(
9200 IN PHYSICAL_ADDRESS LowAddress,
9201 IN PHYSICAL_ADDRESS HighAddress,
9202 IN PHYSICAL_ADDRESS SkipBytes,
9203 IN SIZE_T TotalBytes);
9204
9205 NTKERNELAPI
9206 VOID
9207 NTAPI
9208 MmBuildMdlForNonPagedPool(
9209 IN OUT PMDL MemoryDescriptorList);
9210
9211 NTKERNELAPI
9212 NTSTATUS
9213 NTAPI
9214 MmCreateSection(
9215 OUT PVOID *SectionObject,
9216 IN ACCESS_MASK DesiredAccess,
9217 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
9218 IN PLARGE_INTEGER MaximumSize,
9219 IN ULONG SectionPageProtection,
9220 IN ULONG AllocationAttributes,
9221 IN HANDLE FileHandle OPTIONAL,
9222 IN PFILE_OBJECT File OPTIONAL);
9223
9224 typedef enum _MMFLUSH_TYPE {
9225 MmFlushForDelete,
9226 MmFlushForWrite
9227 } MMFLUSH_TYPE;
9228
9229 NTKERNELAPI
9230 BOOLEAN
9231 NTAPI
9232 MmFlushImageSection(
9233 IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
9234 IN MMFLUSH_TYPE FlushType);
9235
9236 NTKERNELAPI
9237 VOID
9238 NTAPI
9239 MmFreeContiguousMemory(
9240 IN PVOID BaseAddress);
9241
9242 NTKERNELAPI
9243 VOID
9244 NTAPI
9245 MmFreeContiguousMemorySpecifyCache(
9246 IN PVOID BaseAddress,
9247 IN SIZE_T NumberOfBytes,
9248 IN MEMORY_CACHING_TYPE CacheType);
9249
9250 NTKERNELAPI
9251 VOID
9252 NTAPI
9253 MmFreeMappingAddress(
9254 IN PVOID BaseAddress,
9255 IN ULONG PoolTag);
9256
9257 NTKERNELAPI
9258 VOID
9259 NTAPI
9260 MmFreeNonCachedMemory(
9261 IN PVOID BaseAddress,
9262 IN SIZE_T NumberOfBytes);
9263
9264 NTKERNELAPI
9265 VOID
9266 NTAPI
9267 MmFreePagesFromMdl(
9268 IN PMDL MemoryDescriptorList);
9269
9270 /*
9271 * ULONG
9272 * MmGetMdlByteCount(
9273 * IN PMDL Mdl)
9274 */
9275 #define MmGetMdlByteCount(_Mdl) \
9276 ((_Mdl)->ByteCount)
9277
9278 /*
9279 * ULONG
9280 * MmGetMdlByteOffset(
9281 * IN PMDL Mdl)
9282 */
9283 #define MmGetMdlByteOffset(_Mdl) \
9284 ((_Mdl)->ByteOffset)
9285
9286 /*
9287 * PPFN_NUMBER
9288 * MmGetMdlPfnArray(
9289 * IN PMDL Mdl)
9290 */
9291 #define MmGetMdlPfnArray(_Mdl) \
9292 ((PPFN_NUMBER) ((_Mdl) + 1))
9293
9294 /*
9295 * PVOID
9296 * MmGetMdlVirtualAddress(
9297 * IN PMDL Mdl)
9298 */
9299 #define MmGetMdlVirtualAddress(_Mdl) \
9300 ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
9301
9302 NTKERNELAPI
9303 PHYSICAL_ADDRESS
9304 NTAPI
9305 MmGetPhysicalAddress(
9306 IN PVOID BaseAddress);
9307
9308 NTKERNELAPI
9309 PPHYSICAL_MEMORY_RANGE
9310 NTAPI
9311 MmGetPhysicalMemoryRanges(
9312 VOID);
9313
9314 NTKERNELAPI
9315 PVOID
9316 NTAPI
9317 MmGetVirtualForPhysical(
9318 IN PHYSICAL_ADDRESS PhysicalAddress);
9319
9320 NTKERNELAPI
9321 PVOID
9322 NTAPI
9323 MmMapLockedPagesSpecifyCache(
9324 IN PMDL MemoryDescriptorList,
9325 IN KPROCESSOR_MODE AccessMode,
9326 IN MEMORY_CACHING_TYPE CacheType,
9327 IN PVOID BaseAddress,
9328 IN ULONG BugCheckOnFailure,
9329 IN MM_PAGE_PRIORITY Priority);
9330
9331 NTKERNELAPI
9332 PVOID
9333 NTAPI
9334 MmMapLockedPagesWithReservedMapping(
9335 IN PVOID MappingAddress,
9336 IN ULONG PoolTag,
9337 IN PMDL MemoryDescriptorList,
9338 IN MEMORY_CACHING_TYPE CacheType);
9339
9340 NTKERNELAPI
9341 NTSTATUS
9342 NTAPI
9343 MmMapUserAddressesToPage(
9344 IN PVOID BaseAddress,
9345 IN SIZE_T NumberOfBytes,
9346 IN PVOID PageAddress);
9347
9348 NTKERNELAPI
9349 PVOID
9350 NTAPI
9351 MmMapVideoDisplay(
9352 IN PHYSICAL_ADDRESS PhysicalAddress,
9353 IN SIZE_T NumberOfBytes,
9354 IN MEMORY_CACHING_TYPE CacheType);
9355
9356 NTKERNELAPI
9357 NTSTATUS
9358 NTAPI
9359 MmMapViewInSessionSpace(
9360 IN PVOID Section,
9361 OUT PVOID *MappedBase,
9362 IN OUT PSIZE_T ViewSize);
9363
9364 NTKERNELAPI
9365 NTSTATUS
9366 NTAPI
9367 MmMapViewInSystemSpace(
9368 IN PVOID Section,
9369 OUT PVOID *MappedBase,
9370 IN PSIZE_T ViewSize);
9371
9372 NTKERNELAPI
9373 NTSTATUS
9374 NTAPI
9375 MmMarkPhysicalMemoryAsBad(
9376 IN PPHYSICAL_ADDRESS StartAddress,
9377 IN OUT PLARGE_INTEGER NumberOfBytes);
9378
9379 NTKERNELAPI
9380 NTSTATUS
9381 NTAPI
9382 MmMarkPhysicalMemoryAsGood(
9383 IN PPHYSICAL_ADDRESS StartAddress,
9384 IN OUT PLARGE_INTEGER NumberOfBytes);
9385
9386 /*
9387 * PVOID
9388 * MmGetSystemAddressForMdlSafe(
9389 * IN PMDL Mdl,
9390 * IN MM_PAGE_PRIORITY Priority)
9391 */
9392 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
9393 ((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
9394 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
9395 (_Mdl)->MappedSystemVa : \
9396 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
9397 KernelMode, MmCached, NULL, FALSE, _Priority)
9398
9399 NTKERNELAPI
9400 PVOID
9401 NTAPI
9402 MmGetSystemRoutineAddress(
9403 IN PUNICODE_STRING SystemRoutineName);
9404
9405 /*
9406 * ULONG
9407 * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
9408 * IN PVOID Va,
9409 * IN ULONG Size)
9410 */
9411 #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, \
9412 _Size) \
9413 ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
9414 + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
9415
9416 /*
9417 * VOID
9418 * MmInitializeMdl(
9419 * IN PMDL MemoryDescriptorList,
9420 * IN PVOID BaseVa,
9421 * IN SIZE_T Length)
9422 */
9423 #define MmInitializeMdl(_MemoryDescriptorList, \
9424 _BaseVa, \
9425 _Length) \
9426 { \
9427 (_MemoryDescriptorList)->Next = (PMDL) NULL; \
9428 (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
9429 (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
9430 (_MemoryDescriptorList)->MdlFlags = 0; \
9431 (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
9432 (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
9433 (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
9434 }
9435
9436 NTKERNELAPI
9437 BOOLEAN
9438 NTAPI
9439 MmIsAddressValid(
9440 IN PVOID VirtualAddress);
9441
9442 NTKERNELAPI
9443 LOGICAL
9444 NTAPI
9445 MmIsDriverVerifying(
9446 IN PDRIVER_OBJECT DriverObject);
9447
9448 NTKERNELAPI
9449 BOOLEAN
9450 NTAPI
9451 MmIsThisAnNtAsSystem(
9452 VOID);
9453
9454 NTKERNELAPI
9455 NTSTATUS
9456 NTAPI
9457 MmIsVerifierEnabled(
9458 OUT PULONG VerifierFlags);
9459
9460 NTKERNELAPI
9461 PVOID
9462 NTAPI
9463 MmLockPagableDataSection(
9464 IN PVOID AddressWithinSection);
9465
9466 NTKERNELAPI
9467 PVOID
9468 NTAPI
9469 MmLockPagableImageSection(
9470 IN PVOID AddressWithinSection);
9471
9472 /*
9473 * PVOID
9474 * MmLockPagableCodeSection(
9475 * IN PVOID AddressWithinSection)
9476 */
9477 #define MmLockPagableCodeSection MmLockPagableDataSection
9478
9479 NTKERNELAPI
9480 VOID
9481 NTAPI
9482 MmLockPagableSectionByHandle(
9483 IN PVOID ImageSectionHandle);
9484
9485 NTKERNELAPI
9486 PVOID
9487 NTAPI
9488 MmMapIoSpace(
9489 IN PHYSICAL_ADDRESS PhysicalAddress,
9490 IN ULONG NumberOfBytes,
9491 IN MEMORY_CACHING_TYPE CacheEnable);
9492
9493 NTKERNELAPI
9494 PVOID
9495 NTAPI
9496 MmMapLockedPages(
9497 IN PMDL MemoryDescriptorList,
9498 IN KPROCESSOR_MODE AccessMode);
9499
9500 NTKERNELAPI
9501 PVOID
9502 NTAPI
9503 MmPageEntireDriver(
9504 IN PVOID AddressWithinSection);
9505
9506 NTKERNELAPI
9507 VOID
9508 NTAPI
9509 MmProbeAndLockProcessPages(
9510 IN OUT PMDL MemoryDescriptorList,
9511 IN PEPROCESS Process,
9512 IN KPROCESSOR_MODE AccessMode,
9513 IN LOCK_OPERATION Operation);
9514
9515 NTKERNELAPI
9516 NTSTATUS
9517 NTAPI
9518 MmProtectMdlSystemAddress(
9519 IN PMDL MemoryDescriptorList,
9520 IN ULONG NewProtect);
9521
9522 NTKERNELAPI
9523 VOID
9524 NTAPI
9525 MmUnmapLockedPages(
9526 IN PVOID BaseAddress,
9527 IN PMDL MemoryDescriptorList);
9528
9529 NTKERNELAPI
9530 NTSTATUS
9531 NTAPI
9532 MmUnmapViewInSessionSpace(
9533 IN PVOID MappedBase);
9534
9535 NTKERNELAPI
9536 NTSTATUS
9537 NTAPI
9538 MmUnmapViewInSystemSpace(
9539 IN PVOID MappedBase);
9540
9541 NTKERNELAPI
9542 VOID
9543 NTAPI
9544 MmUnsecureVirtualMemory(
9545 IN HANDLE SecureHandle);
9546
9547 /*
9548 * VOID
9549 * MmPrepareMdlForReuse(
9550 * IN PMDL Mdl)
9551 */
9552 #define MmPrepareMdlForReuse(_Mdl) \
9553 { \
9554 if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
9555 ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
9556 MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
9557 } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
9558 ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
9559 } \
9560 }
9561
9562 NTKERNELAPI
9563 VOID
9564 NTAPI
9565 MmProbeAndLockPages(
9566 IN OUT PMDL MemoryDescriptorList,
9567 IN KPROCESSOR_MODE AccessMode,
9568 IN LOCK_OPERATION Operation);
9569
9570 NTKERNELAPI
9571 MM_SYSTEMSIZE
9572 NTAPI
9573 MmQuerySystemSize(
9574 VOID);
9575
9576 NTKERNELAPI
9577 NTSTATUS
9578 NTAPI
9579 MmRemovePhysicalMemory(
9580 IN PPHYSICAL_ADDRESS StartAddress,
9581 IN OUT PLARGE_INTEGER NumberOfBytes);
9582
9583 NTKERNELAPI
9584 VOID
9585 NTAPI
9586 MmResetDriverPaging(
9587 IN PVOID AddressWithinSection);
9588
9589 NTKERNELAPI
9590 HANDLE
9591 NTAPI
9592 MmSecureVirtualMemory(
9593 IN PVOID Address,
9594 IN SIZE_T Size,
9595 IN ULONG ProbeMode);
9596
9597 NTKERNELAPI
9598 ULONG
9599 NTAPI
9600 MmSizeOfMdl(
9601 IN PVOID Base,
9602 IN SIZE_T Length);
9603
9604 NTKERNELAPI
9605 VOID
9606 NTAPI
9607 MmUnlockPagableImageSection(
9608 IN PVOID ImageSectionHandle);
9609
9610 NTKERNELAPI
9611 VOID
9612 NTAPI
9613 MmUnlockPages(
9614 IN PMDL MemoryDescriptorList);
9615
9616 NTKERNELAPI
9617 VOID
9618 NTAPI
9619 MmUnmapIoSpace(
9620 IN PVOID BaseAddress,
9621 IN SIZE_T NumberOfBytes);
9622
9623 NTKERNELAPI
9624 VOID
9625 NTAPI
9626 MmUnmapReservedMapping(
9627 IN PVOID BaseAddress,
9628 IN ULONG PoolTag,
9629 IN PMDL MemoryDescriptorList);
9630
9631 NTKERNELAPI
9632 VOID
9633 NTAPI
9634 MmUnmapVideoDisplay(
9635 IN PVOID BaseAddress,
9636 IN SIZE_T NumberOfBytes);
9637
9638
9639
9640 /** Object manager routines **/
9641
9642 NTKERNELAPI
9643 NTSTATUS
9644 NTAPI
9645 ObAssignSecurity(
9646 IN PACCESS_STATE AccessState,
9647 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
9648 IN PVOID Object,
9649 IN POBJECT_TYPE Type);
9650
9651 NTKERNELAPI
9652 VOID
9653 NTAPI
9654 ObDereferenceSecurityDescriptor(
9655 PSECURITY_DESCRIPTOR SecurityDescriptor,
9656 ULONG Count);
9657
9658 NTKERNELAPI
9659 LONG_PTR
9660 FASTCALL
9661 ObfDereferenceObject(
9662 IN PVOID Object);
9663
9664 /*
9665 * VOID
9666 * ObDereferenceObject(
9667 * IN PVOID Object)
9668 */
9669 #define ObDereferenceObject ObfDereferenceObject
9670
9671 NTKERNELAPI
9672 NTSTATUS
9673 NTAPI
9674 ObGetObjectSecurity(
9675 IN PVOID Object,
9676 OUT PSECURITY_DESCRIPTOR *SecurityDescriptor,
9677 OUT PBOOLEAN MemoryAllocated);
9678
9679 NTKERNELAPI
9680 NTSTATUS
9681 NTAPI
9682 ObInsertObject(
9683 IN PVOID Object,
9684 IN PACCESS_STATE PassedAccessState OPTIONAL,
9685 IN ACCESS_MASK DesiredAccess,
9686 IN ULONG AdditionalReferences,
9687 OUT PVOID* ReferencedObject OPTIONAL,
9688 OUT PHANDLE Handle);
9689
9690 NTKERNELAPI
9691 LONG_PTR
9692 FASTCALL
9693 ObfReferenceObject(
9694 IN PVOID Object);
9695
9696 NTKERNELAPI
9697 NTSTATUS
9698 NTAPI
9699 ObLogSecurityDescriptor(
9700 IN PSECURITY_DESCRIPTOR InputSecurityDescriptor,
9701 OUT PSECURITY_DESCRIPTOR *OutputSecurityDescriptor,
9702 IN ULONG RefBias);
9703 /*
9704 * VOID
9705 * ObReferenceObject(
9706 * IN PVOID Object)
9707 */
9708 #define ObReferenceObject ObfReferenceObject
9709
9710 NTKERNELAPI
9711 VOID
9712 NTAPI
9713 ObMakeTemporaryObject(
9714 IN PVOID Object);
9715
9716 NTKERNELAPI
9717 NTSTATUS
9718 NTAPI
9719 ObOpenObjectByName(
9720 IN POBJECT_ATTRIBUTES ObjectAttributes,
9721 IN POBJECT_TYPE ObjectType,
9722 IN KPROCESSOR_MODE AccessMode,
9723 IN PACCESS_STATE PassedAccessState,
9724 IN ACCESS_MASK DesiredAccess,
9725 IN OUT PVOID ParseContext OPTIONAL,
9726 OUT PHANDLE Handle);
9727
9728 NTKERNELAPI
9729 NTSTATUS
9730 NTAPI
9731 ObOpenObjectByPointer(
9732 IN PVOID Object,
9733 IN ULONG HandleAttributes,
9734 IN PACCESS_STATE PassedAccessState OPTIONAL,
9735 IN ACCESS_MASK DesiredAccess OPTIONAL,
9736 IN POBJECT_TYPE ObjectType OPTIONAL,
9737 IN KPROCESSOR_MODE AccessMode,
9738 OUT PHANDLE Handle);
9739
9740 NTKERNELAPI
9741 NTSTATUS
9742 NTAPI
9743 ObQueryObjectAuditingByHandle(
9744 IN HANDLE Handle,
9745 OUT PBOOLEAN GenerateOnClose);
9746
9747 NTKERNELAPI
9748 NTSTATUS
9749 NTAPI
9750 ObReferenceObjectByHandle(
9751 IN HANDLE Handle,
9752 IN ACCESS_MASK DesiredAccess,
9753 IN POBJECT_TYPE ObjectType OPTIONAL,
9754 IN KPROCESSOR_MODE AccessMode,
9755 OUT PVOID *Object,
9756 OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL);
9757
9758 NTKERNELAPI
9759 NTSTATUS
9760 NTAPI
9761 ObReferenceObjectByName(
9762 IN PUNICODE_STRING ObjectPath,
9763 IN ULONG Attributes,
9764 IN PACCESS_STATE PassedAccessState OPTIONAL,
9765 IN ACCESS_MASK DesiredAccess OPTIONAL,
9766 IN POBJECT_TYPE ObjectType,
9767 IN KPROCESSOR_MODE AccessMode,
9768 IN OUT PVOID ParseContext OPTIONAL,
9769 OUT PVOID *Object);
9770
9771 NTKERNELAPI
9772 NTSTATUS
9773 NTAPI
9774 ObReferenceObjectByPointer(
9775 IN PVOID Object,
9776 IN ACCESS_MASK DesiredAccess,
9777 IN POBJECT_TYPE ObjectType,
9778 IN KPROCESSOR_MODE AccessMode);
9779
9780 NTKERNELAPI
9781 VOID
9782 NTAPI
9783 ObReferenceSecurityDescriptor(
9784 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
9785 IN ULONG Count);
9786
9787 NTKERNELAPI
9788 VOID
9789 NTAPI
9790 ObReleaseObjectSecurity(
9791 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
9792 IN BOOLEAN MemoryAllocated);
9793
9794
9795
9796 /** Process manager routines **/
9797
9798 NTKERNELAPI
9799 NTSTATUS
9800 NTAPI
9801 PsCreateSystemProcess(
9802 IN PHANDLE ProcessHandle,
9803 IN ACCESS_MASK DesiredAccess,
9804 IN POBJECT_ATTRIBUTES ObjectAttributes);
9805
9806 NTKERNELAPI
9807 NTSTATUS
9808 NTAPI
9809 PsCreateSystemThread(
9810 OUT PHANDLE ThreadHandle,
9811 IN ULONG DesiredAccess,
9812 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
9813 IN HANDLE ProcessHandle OPTIONAL,
9814 OUT PCLIENT_ID ClientId OPTIONAL,
9815 IN PKSTART_ROUTINE StartRoutine,
9816 IN PVOID StartContext);
9817
9818 /*
9819 * PEPROCESS
9820 * PsGetCurrentProcess(VOID)
9821 */
9822 #define PsGetCurrentProcess IoGetCurrentProcess
9823
9824 NTKERNELAPI
9825 HANDLE
9826 NTAPI
9827 PsGetCurrentProcessId(
9828 VOID);
9829
9830 /*
9831 * PETHREAD
9832 * PsGetCurrentThread(VOID)
9833 */
9834 #define PsGetCurrentThread() \
9835 ((PETHREAD) KeGetCurrentThread())
9836
9837 NTKERNELAPI
9838 HANDLE
9839 NTAPI
9840 PsGetCurrentThreadId(
9841 VOID);
9842
9843 NTKERNELAPI
9844 BOOLEAN
9845 NTAPI
9846 PsGetVersion(
9847 PULONG MajorVersion OPTIONAL,
9848 PULONG MinorVersion OPTIONAL,
9849 PULONG BuildNumber OPTIONAL,
9850 PUNICODE_STRING CSDVersion OPTIONAL);
9851
9852 NTKERNELAPI
9853 NTSTATUS
9854 NTAPI
9855 PsRemoveCreateThreadNotifyRoutine(
9856 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
9857
9858 NTKERNELAPI
9859 NTSTATUS
9860 NTAPI
9861 PsRemoveLoadImageNotifyRoutine(
9862 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
9863
9864 NTKERNELAPI
9865 NTSTATUS
9866 NTAPI
9867 PsSetCreateProcessNotifyRoutine(
9868 IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
9869 IN BOOLEAN Remove);
9870
9871 NTKERNELAPI
9872 NTSTATUS
9873 NTAPI
9874 PsSetCreateThreadNotifyRoutine(
9875 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
9876
9877 NTKERNELAPI
9878 NTSTATUS
9879 NTAPI
9880 PsSetLoadImageNotifyRoutine(
9881 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
9882
9883 NTKERNELAPI
9884 NTSTATUS
9885 NTAPI
9886 PsTerminateSystemThread(
9887 IN NTSTATUS ExitStatus);
9888
9889 extern NTSYSAPI PEPROCESS PsInitialSystemProcess;
9890
9891
9892 /** Security reference monitor routines **/
9893
9894 NTKERNELAPI
9895 BOOLEAN
9896 NTAPI
9897 SeAccessCheck(
9898 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
9899 IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext,
9900 IN BOOLEAN SubjectContextLocked,
9901 IN ACCESS_MASK DesiredAccess,
9902 IN ACCESS_MASK PreviouslyGrantedAccess,
9903 OUT PPRIVILEGE_SET *Privileges OPTIONAL,
9904 IN PGENERIC_MAPPING GenericMapping,
9905 IN KPROCESSOR_MODE AccessMode,
9906 OUT PACCESS_MASK GrantedAccess,
9907 OUT PNTSTATUS AccessStatus);
9908
9909 NTKERNELAPI
9910 NTSTATUS
9911 NTAPI
9912 SeAssignSecurity(
9913 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
9914 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
9915 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
9916 IN BOOLEAN IsDirectoryObject,
9917 IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
9918 IN PGENERIC_MAPPING GenericMapping,
9919 IN POOL_TYPE PoolType);
9920
9921 NTKERNELAPI
9922 NTSTATUS
9923 NTAPI
9924 SeAssignSecurityEx(
9925 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
9926 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
9927 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
9928 IN GUID *ObjectType OPTIONAL,
9929 IN BOOLEAN IsDirectoryObject,
9930 IN ULONG AutoInheritFlags,
9931 IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
9932 IN PGENERIC_MAPPING GenericMapping,
9933 IN POOL_TYPE PoolType);
9934
9935 NTKERNELAPI
9936 NTSTATUS
9937 NTAPI
9938 SeDeassignSecurity(
9939 IN OUT PSECURITY_DESCRIPTOR *SecurityDescriptor);
9940
9941 NTKERNELAPI
9942 BOOLEAN
9943 NTAPI
9944 SeSinglePrivilegeCheck(
9945 LUID PrivilegeValue,
9946 KPROCESSOR_MODE PreviousMode);
9947
9948 NTKERNELAPI
9949 BOOLEAN
9950 NTAPI
9951 SeValidSecurityDescriptor(
9952 IN ULONG Length,
9953 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
9954
9955
9956
9957 /** NtXxx routines **/
9958
9959 NTSYSCALLAPI
9960 NTSTATUS
9961 NTAPI
9962 NtOpenProcess(
9963 OUT PHANDLE ProcessHandle,
9964 IN ACCESS_MASK DesiredAccess,
9965 IN POBJECT_ATTRIBUTES ObjectAttributes,
9966 IN PCLIENT_ID ClientId OPTIONAL);
9967
9968 NTSYSCALLAPI
9969 NTSTATUS
9970 NTAPI
9971 NtQueryInformationProcess(
9972 IN HANDLE ProcessHandle,
9973 IN PROCESSINFOCLASS ProcessInformationClass,
9974 OUT PVOID ProcessInformation,
9975 IN ULONG ProcessInformationLength,
9976 OUT PULONG ReturnLength OPTIONAL);
9977
9978
9979
9980 /** NtXxx and ZwXxx routines **/
9981
9982 NTSYSAPI
9983 NTSTATUS
9984 NTAPI
9985 ZwCancelTimer(
9986 IN HANDLE TimerHandle,
9987 OUT PBOOLEAN CurrentState OPTIONAL);
9988
9989 NTSYSCALLAPI
9990 NTSTATUS
9991 NTAPI
9992 NtClose(
9993 IN HANDLE Handle);
9994
9995 NTSYSAPI
9996 NTSTATUS
9997 NTAPI
9998 ZwClose(
9999 IN HANDLE Handle);
10000
10001 NTSYSAPI
10002 NTSTATUS
10003 NTAPI
10004 ZwCreateDirectoryObject(
10005 OUT PHANDLE DirectoryHandle,
10006 IN ACCESS_MASK DesiredAccess,
10007 IN POBJECT_ATTRIBUTES ObjectAttributes);
10008
10009 NTSYSCALLAPI
10010 NTSTATUS
10011 NTAPI
10012 NtCreateEvent(
10013 OUT PHANDLE EventHandle,
10014 IN ACCESS_MASK DesiredAccess,
10015 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
10016 IN EVENT_TYPE EventType,
10017 IN BOOLEAN InitialState);
10018
10019 NTSYSAPI
10020 NTSTATUS
10021 NTAPI
10022 ZwCreateEvent(
10023 OUT PHANDLE EventHandle,
10024 IN ACCESS_MASK DesiredAccess,
10025 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
10026 IN EVENT_TYPE EventType,
10027 IN BOOLEAN InitialState);
10028
10029 NTSYSAPI
10030 NTSTATUS
10031 NTAPI
10032 ZwCreateFile(
10033 OUT PHANDLE FileHandle,
10034 IN ACCESS_MASK DesiredAccess,
10035 IN POBJECT_ATTRIBUTES ObjectAttributes,
10036 OUT PIO_STATUS_BLOCK IoStatusBlock,
10037 IN PLARGE_INTEGER AllocationSize OPTIONAL,
10038 IN ULONG FileAttributes,
10039 IN ULONG ShareAccess,
10040 IN ULONG CreateDisposition,
10041 IN ULONG CreateOptions,
10042 IN PVOID EaBuffer OPTIONAL,
10043 IN ULONG EaLength);
10044
10045 NTSYSAPI
10046 NTSTATUS
10047 NTAPI
10048 ZwCreateKey(
10049 OUT PHANDLE KeyHandle,
10050 IN ACCESS_MASK DesiredAccess,
10051 IN POBJECT_ATTRIBUTES ObjectAttributes,
10052 IN ULONG TitleIndex,
10053 IN PUNICODE_STRING Class OPTIONAL,
10054 IN ULONG CreateOptions,
10055 OUT PULONG Disposition OPTIONAL);
10056
10057 NTSYSAPI
10058 NTSTATUS
10059 NTAPI
10060 ZwCreateTimer(
10061 OUT PHANDLE TimerHandle,
10062 IN ACCESS_MASK DesiredAccess,
10063 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
10064 IN TIMER_TYPE TimerType);
10065
10066 NTSYSAPI
10067 NTSTATUS
10068 NTAPI
10069 ZwDeleteKey(
10070 IN HANDLE KeyHandle);
10071
10072 NTSYSAPI
10073 NTSTATUS
10074 NTAPI
10075 ZwDeleteValueKey(
10076 IN HANDLE KeyHandle,
10077 IN PUNICODE_STRING ValueName);
10078
10079 NTSYSCALLAPI
10080 NTSTATUS
10081 NTAPI
10082 NtDeviceIoControlFile(
10083 IN HANDLE DeviceHandle,
10084 IN HANDLE Event OPTIONAL,
10085 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
10086 IN PVOID UserApcContext OPTIONAL,
10087 OUT PIO_STATUS_BLOCK IoStatusBlock,
10088 IN ULONG IoControlCode,
10089 IN PVOID InputBuffer,
10090 IN ULONG InputBufferSize,
10091 OUT PVOID OutputBuffer,
10092 IN ULONG OutputBufferSize);
10093
10094 NTSYSAPI
10095 NTSTATUS
10096 NTAPI
10097 ZwDeviceIoControlFile(
10098 IN HANDLE DeviceHandle,
10099 IN HANDLE Event OPTIONAL,
10100 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
10101 IN PVOID UserApcContext OPTIONAL,
10102 OUT PIO_STATUS_BLOCK IoStatusBlock,
10103 IN ULONG IoControlCode,
10104 IN PVOID InputBuffer,
10105 IN ULONG InputBufferSize,
10106 OUT PVOID OutputBuffer,
10107 IN ULONG OutputBufferSize);
10108
10109 NTSYSAPI
10110 NTSTATUS
10111 NTAPI
10112 ZwEnumerateKey(
10113 IN HANDLE KeyHandle,
10114 IN ULONG Index,
10115 IN KEY_INFORMATION_CLASS KeyInformationClass,
10116 OUT PVOID KeyInformation,
10117 IN ULONG Length,
10118 OUT PULONG ResultLength);
10119
10120 NTSYSAPI
10121 NTSTATUS
10122 NTAPI
10123 ZwEnumerateValueKey(
10124 IN HANDLE KeyHandle,
10125 IN ULONG Index,
10126 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
10127 OUT PVOID KeyValueInformation,
10128 IN ULONG Length,
10129 OUT PULONG ResultLength);
10130
10131 NTSYSAPI
10132 NTSTATUS
10133 NTAPI
10134 ZwFlushKey(
10135 IN HANDLE KeyHandle);
10136
10137 NTSYSAPI
10138 NTSTATUS
10139 NTAPI
10140 ZwMakeTemporaryObject(
10141 IN HANDLE Handle);
10142
10143 NTSYSCALLAPI
10144 NTSTATUS
10145 NTAPI
10146 NtMapViewOfSection(
10147 IN HANDLE SectionHandle,
10148 IN HANDLE ProcessHandle,
10149 IN OUT PVOID *BaseAddress,
10150 IN ULONG ZeroBits,
10151 IN ULONG CommitSize,
10152 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
10153 IN OUT PSIZE_T ViewSize,
10154 IN SECTION_INHERIT InheritDisposition,
10155 IN ULONG AllocationType,
10156 IN ULONG Protect);
10157
10158 NTSYSAPI
10159 NTSTATUS
10160 NTAPI
10161 ZwMapViewOfSection(
10162 IN HANDLE SectionHandle,
10163 IN HANDLE ProcessHandle,
10164 IN OUT PVOID *BaseAddress,
10165 IN ULONG ZeroBits,
10166 IN ULONG CommitSize,
10167 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
10168 IN OUT PSIZE_T ViewSize,
10169 IN SECTION_INHERIT InheritDisposition,
10170 IN ULONG AllocationType,
10171 IN ULONG Protect);
10172
10173 NTSYSCALLAPI
10174 NTSTATUS
10175 NTAPI
10176 NtOpenFile(
10177 OUT PHANDLE FileHandle,
10178 IN ACCESS_MASK DesiredAccess,
10179 IN POBJECT_ATTRIBUTES ObjectAttributes,
10180 OUT PIO_STATUS_BLOCK IoStatusBlock,
10181 IN ULONG ShareAccess,
10182 IN ULONG OpenOptions);
10183
10184 NTSYSAPI
10185 NTSTATUS
10186 NTAPI
10187 ZwOpenFile(
10188 OUT PHANDLE FileHandle,
10189 IN ACCESS_MASK DesiredAccess,
10190 IN POBJECT_ATTRIBUTES ObjectAttributes,
10191 OUT PIO_STATUS_BLOCK IoStatusBlock,
10192 IN ULONG ShareAccess,
10193 IN ULONG OpenOptions);
10194
10195 NTSYSAPI
10196 NTSTATUS
10197 NTAPI
10198 ZwOpenKey(
10199 OUT PHANDLE KeyHandle,
10200 IN ACCESS_MASK DesiredAccess,
10201 IN POBJECT_ATTRIBUTES ObjectAttributes);
10202
10203 NTSYSAPI
10204 NTSTATUS
10205 NTAPI
10206 ZwOpenSection(
10207 OUT PHANDLE SectionHandle,
10208 IN ACCESS_MASK DesiredAccess,
10209 IN POBJECT_ATTRIBUTES ObjectAttributes);
10210
10211 NTSYSAPI
10212 NTSTATUS
10213 NTAPI
10214 ZwOpenSymbolicLinkObject(
10215 OUT PHANDLE LinkHandle,
10216 IN ACCESS_MASK DesiredAccess,
10217 IN POBJECT_ATTRIBUTES ObjectAttributes);
10218
10219 NTSYSAPI
10220 NTSTATUS
10221 NTAPI
10222 ZwOpenTimer(
10223 OUT PHANDLE TimerHandle,
10224 IN ACCESS_MASK DesiredAccess,
10225 IN POBJECT_ATTRIBUTES ObjectAttributes);
10226
10227 NTSYSAPI
10228 NTSTATUS
10229 NTAPI
10230 ZwQueryInformationFile(
10231 IN HANDLE FileHandle,
10232 OUT PIO_STATUS_BLOCK IoStatusBlock,
10233 OUT PVOID FileInformation,
10234 IN ULONG Length,
10235 IN FILE_INFORMATION_CLASS FileInformationClass);
10236
10237 NTSYSAPI
10238 NTSTATUS
10239 NTAPI
10240 ZwQueryKey(
10241 IN HANDLE KeyHandle,
10242 IN KEY_INFORMATION_CLASS KeyInformationClass,
10243 OUT PVOID KeyInformation,
10244 IN ULONG Length,
10245 OUT PULONG ResultLength);
10246
10247 NTSYSAPI
10248 NTSTATUS
10249 NTAPI
10250 ZwQuerySymbolicLinkObject(
10251 IN HANDLE LinkHandle,
10252 IN OUT PUNICODE_STRING LinkTarget,
10253 OUT PULONG ReturnedLength OPTIONAL);
10254
10255 NTSYSAPI
10256 NTSTATUS
10257 NTAPI
10258 ZwQueryValueKey(
10259 IN HANDLE KeyHandle,
10260 IN PUNICODE_STRING ValueName,
10261 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
10262 OUT PVOID KeyValueInformation,
10263 IN ULONG Length,
10264 OUT PULONG ResultLength);
10265
10266 NTSYSCALLAPI
10267 NTSTATUS
10268 NTAPI
10269 NtReadFile(
10270 IN HANDLE FileHandle,
10271 IN HANDLE Event OPTIONAL,
10272 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
10273 IN PVOID ApcContext OPTIONAL,
10274 OUT PIO_STATUS_BLOCK IoStatusBlock,
10275 OUT PVOID Buffer,
10276 IN ULONG Length,
10277 IN PLARGE_INTEGER ByteOffset OPTIONAL,
10278 IN PULONG Key OPTIONAL);
10279
10280 NTSYSAPI
10281 NTSTATUS
10282 NTAPI
10283 ZwReadFile(
10284 IN HANDLE FileHandle,
10285 IN HANDLE Event OPTIONAL,
10286 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
10287 IN PVOID ApcContext OPTIONAL,
10288 OUT PIO_STATUS_BLOCK IoStatusBlock,
10289 OUT PVOID Buffer,
10290 IN ULONG Length,
10291 IN PLARGE_INTEGER ByteOffset OPTIONAL,
10292 IN PULONG Key OPTIONAL);
10293
10294 NTSYSCALLAPI
10295 NTSTATUS
10296 NTAPI
10297 NtSetEvent(
10298 IN HANDLE EventHandle,
10299 OUT PLONG PreviousState OPTIONAL);
10300
10301 NTSYSAPI
10302 NTSTATUS
10303 NTAPI
10304 ZwSetEvent(
10305 IN HANDLE EventHandle,
10306 OUT PLONG PreviousState OPTIONAL);
10307
10308 NTSYSAPI
10309 NTSTATUS
10310 NTAPI
10311 ZwSetInformationFile(
10312 IN HANDLE FileHandle,
10313 OUT PIO_STATUS_BLOCK IoStatusBlock,
10314 IN PVOID FileInformation,
10315 IN ULONG Length,
10316 IN FILE_INFORMATION_CLASS FileInformationClass);
10317
10318 NTSYSAPI
10319 NTSTATUS
10320 NTAPI
10321 ZwSetInformationThread(
10322 IN HANDLE ThreadHandle,
10323 IN THREADINFOCLASS ThreadInformationClass,
10324 IN PVOID ThreadInformation,
10325 IN ULONG ThreadInformationLength);
10326
10327 NTSYSAPI
10328 NTSTATUS
10329 NTAPI
10330 ZwSetTimer(
10331 IN HANDLE TimerHandle,
10332 IN PLARGE_INTEGER DueTime,
10333 IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL,
10334 IN PVOID TimerContext OPTIONAL,
10335 IN BOOLEAN WakeTimer,
10336 IN LONG Period OPTIONAL,
10337 OUT PBOOLEAN PreviousState OPTIONAL);
10338
10339 NTSYSAPI
10340 NTSTATUS
10341 NTAPI
10342 ZwSetValueKey(
10343 IN HANDLE KeyHandle,
10344 IN PUNICODE_STRING ValueName,
10345 IN ULONG TitleIndex OPTIONAL,
10346 IN ULONG Type,
10347 IN PVOID Data,
10348 IN ULONG DataSize);
10349
10350 /* [Nt|Zw]MapViewOfSection.InheritDisposition constants */
10351 #define AT_EXTENDABLE_FILE 0x00002000
10352 #define AT_RESERVED 0x20000000
10353 #define AT_ROUND_TO_PAGE 0x40000000
10354
10355 NTSYSCALLAPI
10356 NTSTATUS
10357 NTAPI
10358 NtUnmapViewOfSection(
10359 IN HANDLE ProcessHandle,
10360 IN PVOID BaseAddress);
10361
10362 NTSYSAPI
10363 NTSTATUS
10364 NTAPI
10365 ZwUnmapViewOfSection(
10366 IN HANDLE ProcessHandle,
10367 IN PVOID BaseAddress);
10368
10369 NTSYSCALLAPI
10370 NTSTATUS
10371 NTAPI
10372 NtWaitForSingleObject(
10373 IN HANDLE ObjectHandle,
10374 IN BOOLEAN Alertable,
10375 IN PLARGE_INTEGER TimeOut OPTIONAL);
10376
10377 NTSYSAPI
10378 NTSTATUS
10379 NTAPI
10380 ZwWaitForSingleObject(
10381 IN HANDLE ObjectHandle,
10382 IN BOOLEAN Alertable,
10383 IN PLARGE_INTEGER TimeOut OPTIONAL);
10384
10385 NTSYSCALLAPI
10386 NTSTATUS
10387 NTAPI
10388 NtWriteFile(
10389 IN HANDLE FileHandle,
10390 IN HANDLE Event OPTIONAL,
10391 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
10392 IN PVOID ApcContext OPTIONAL,
10393 OUT PIO_STATUS_BLOCK IoStatusBlock,
10394 IN PVOID Buffer,
10395 IN ULONG Length,
10396 IN PLARGE_INTEGER ByteOffset OPTIONAL,
10397 IN PULONG Key OPTIONAL);
10398
10399 NTSYSAPI
10400 NTSTATUS
10401 NTAPI
10402 ZwWriteFile(
10403 IN HANDLE FileHandle,
10404 IN HANDLE Event OPTIONAL,
10405 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
10406 IN PVOID ApcContext OPTIONAL,
10407 OUT PIO_STATUS_BLOCK IoStatusBlock,
10408 IN PVOID Buffer,
10409 IN ULONG Length,
10410 IN PLARGE_INTEGER ByteOffset OPTIONAL,
10411 IN PULONG Key OPTIONAL);
10412
10413
10414
10415 /** Power management support routines **/
10416
10417 NTKERNELAPI
10418 NTSTATUS
10419 NTAPI
10420 PoCallDriver(
10421 IN PDEVICE_OBJECT DeviceObject,
10422 IN OUT PIRP Irp);
10423
10424 NTKERNELAPI
10425 PULONG
10426 NTAPI
10427 PoRegisterDeviceForIdleDetection(
10428 IN PDEVICE_OBJECT DeviceObject,
10429 IN ULONG ConservationIdleTime,
10430 IN ULONG PerformanceIdleTime,
10431 IN DEVICE_POWER_STATE State);
10432
10433 NTKERNELAPI
10434 PVOID
10435 NTAPI
10436 PoRegisterSystemState(
10437 IN PVOID StateHandle,
10438 IN EXECUTION_STATE Flags);
10439
10440 NTKERNELAPI
10441 NTSTATUS
10442 NTAPI
10443 PoRequestPowerIrp(
10444 IN PDEVICE_OBJECT DeviceObject,
10445 IN UCHAR MinorFunction,
10446 IN POWER_STATE PowerState,
10447 IN PREQUEST_POWER_COMPLETE CompletionFunction,
10448 IN PVOID Context,
10449 OUT PIRP *Irp OPTIONAL);
10450
10451 NTKERNELAPI
10452 NTSTATUS
10453 NTAPI
10454 PoRequestShutdownEvent(
10455 OUT PVOID *Event);
10456
10457 NTKERNELAPI
10458 VOID
10459 NTAPI
10460 PoSetDeviceBusy(
10461 PULONG IdlePointer);
10462
10463 NTKERNELAPI
10464 POWER_STATE
10465 NTAPI
10466 PoSetPowerState(
10467 IN PDEVICE_OBJECT DeviceObject,
10468 IN POWER_STATE_TYPE Type,
10469 IN POWER_STATE State);
10470
10471 NTKERNELAPI
10472 VOID
10473 NTAPI
10474 PoSetSystemState(
10475 IN EXECUTION_STATE Flags);
10476
10477 NTKERNELAPI
10478 VOID
10479 NTAPI
10480 PoStartNextPowerIrp(
10481 IN PIRP Irp);
10482
10483 NTKERNELAPI
10484 VOID
10485 NTAPI
10486 PoUnregisterSystemState(
10487 IN PVOID StateHandle);
10488
10489
10490
10491 /** WMI library support routines **/
10492
10493 NTKERNELAPI
10494 NTSTATUS
10495 NTAPI
10496 WmiCompleteRequest(
10497 IN PDEVICE_OBJECT DeviceObject,
10498 IN PIRP Irp,
10499 IN NTSTATUS Status,
10500 IN ULONG BufferUsed,
10501 IN CCHAR PriorityBoost);
10502
10503 NTKERNELAPI
10504 NTSTATUS
10505 NTAPI
10506 WmiFireEvent(
10507 IN PDEVICE_OBJECT DeviceObject,
10508 IN LPGUID Guid,
10509 IN ULONG InstanceIndex,
10510 IN ULONG EventDataSize,
10511 IN PVOID EventData);
10512
10513 NTKERNELAPI
10514 NTSTATUS
10515 NTAPI
10516 WmiQueryTraceInformation(
10517 IN TRACE_INFORMATION_CLASS TraceInformationClass,
10518 OUT PVOID TraceInformation,
10519 IN ULONG TraceInformationLength,
10520 OUT PULONG RequiredLength OPTIONAL,
10521 IN PVOID Buffer OPTIONAL);
10522
10523 NTKERNELAPI
10524 NTSTATUS
10525 NTAPI
10526 WmiSystemControl(
10527 IN PWMILIB_CONTEXT WmiLibInfo,
10528 IN PDEVICE_OBJECT DeviceObject,
10529 IN PIRP Irp,
10530 OUT PSYSCTL_IRP_DISPOSITION IrpDisposition);
10531
10532 NTKERNELAPI
10533 NTSTATUS
10534 DDKCDECLAPI
10535 WmiTraceMessage(
10536 IN TRACEHANDLE LoggerHandle,
10537 IN ULONG MessageFlags,
10538 IN LPGUID MessageGuid,
10539 IN USHORT MessageNumber,
10540 IN ...);
10541
10542 #if 0
10543 /* FIXME: Get va_list from where? */
10544 NTKERNELAPI
10545 NTSTATUS
10546 DDKCDECLAPI
10547 WmiTraceMessageVa(
10548 IN TRACEHANDLE LoggerHandle,
10549 IN ULONG MessageFlags,
10550 IN LPGUID MessageGuid,
10551 IN USHORT MessageNumber,
10552 IN va_list MessageArgList);
10553 #endif
10554
10555
10556 /** Kernel debugger routines **/
10557
10558 NTKERNELAPI
10559 NTSTATUS
10560 NTAPI
10561 KdDisableDebugger(
10562 VOID);
10563
10564 NTKERNELAPI
10565 NTSTATUS
10566 NTAPI
10567 KdEnableDebugger(
10568 VOID);
10569
10570 VOID
10571 NTAPI
10572 DbgBreakPoint(
10573 VOID);
10574
10575 NTSYSAPI
10576 VOID
10577 NTAPI
10578 DbgBreakPointWithStatus(
10579 IN ULONG Status);
10580
10581 ULONG
10582 __cdecl
10583 DbgPrint(
10584 IN PCCH Format,
10585 IN ...);
10586
10587 ULONG
10588 __cdecl
10589 DbgPrintEx(
10590 IN ULONG ComponentId,
10591 IN ULONG Level,
10592 IN PCCH Format,
10593 IN ...);
10594
10595 NTKERNELAPI
10596 ULONG
10597 DDKCDECLAPI
10598 DbgPrintReturnControlC(
10599 IN PCH Format,
10600 IN ...);
10601
10602 NTKERNELAPI
10603 BOOLEAN
10604 NTAPI
10605 DbgQueryDebugFilterState(
10606 IN ULONG ComponentId,
10607 IN ULONG Level);
10608
10609 NTKERNELAPI
10610 NTSTATUS
10611 NTAPI
10612 DbgSetDebugFilterState(
10613 IN ULONG ComponentId,
10614 IN ULONG Level,
10615 IN BOOLEAN State);
10616
10617 #ifdef DBG
10618
10619 #define KdPrint(_x_) DbgPrint _x_
10620 #define KdPrintEx(_x_) DbgPrintEx _x_
10621 #define KdBreakPoint() DbgBreakPoint()
10622 #define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
10623
10624 #else /* !DBG */
10625
10626 #define KdPrint(_x_)
10627 #define KdPrintEx(_x_)
10628 #define KdBreakPoint()
10629 #define KdBreakPointWithStatus(s)
10630
10631 #endif /* !DBG */
10632
10633 #if defined(_NTDDK_) || defined(_NTHAL_) || defined(_WDMDDK_) || defined(_NTOSP_)
10634
10635 extern NTKERNELAPI PBOOLEAN KdDebuggerNotPresent;
10636 extern NTKERNELAPI PBOOLEAN KdDebuggerEnabled;
10637 #define KD_DEBUGGER_ENABLED *KdDebuggerEnabled
10638 #define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
10639
10640 #else
10641
10642 extern BOOLEAN KdDebuggerNotPresent;
10643 extern BOOLEAN KdDebuggerEnabled;
10644 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
10645 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
10646
10647 #endif
10648
10649 #ifdef __cplusplus
10650 }
10651 #endif
10652
10653 #endif /* __WINDDK_H */