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