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