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