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