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