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