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