3 * @copy 2012 MinGW.org project
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
12 * The above copyright notice and this permission notice (including the next
13 * paragraph) shall be included in all copies or substantial portions of the
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
26 #pragma GCC system_header
30 * Windows Device Driver Kit
38 ** Definitions specific to this Device Driver Kit
40 #define DDKAPI __stdcall
41 #define DDKFASTAPI __fastcall
42 #define DDKCDECLAPI __cdecl
44 #if defined(_NTOSKRNL_)
46 #define NTOSAPI DECL_EXPORT
49 #define DECLARE_INTERNAL_OBJECT(x) typedef struct _##x; typedef struct _##x *P##x;
50 #define DECLARE_INTERNAL_OBJECT2(x,y) typedef struct _##x; typedef struct _##x *P##y;
54 #define NTOSAPI DECL_IMPORT
57 #define DECLARE_INTERNAL_OBJECT(x) struct _##x; typedef struct _##x *P##x;
58 #define DECLARE_INTERNAL_OBJECT2(x,y) struct _##x; typedef struct _##x *P##y;
61 /* Pseudo modifiers for parameters
62 We don't use these unnecessary defines in the w32api headers. Define
63 them by default since that is what people expect, but allow users
64 to avoid the pollution. */
65 #ifndef _NO_W32_PSEUDO_MODIFIERS
73 #define VOLATILE volatile
75 #define RESTRICTED_POINTER
76 #define POINTER_ALIGNMENT
78 #ifdef NONAMELESSUNION
79 # define _DDK_DUMMYUNION_MEMBER(name) DUMMYUNIONNAME.name
80 # define _DDK_DUMMYUNION_N_MEMBER(n, name) DUMMYUNIONNAME##n.name
82 # define _DDK_DUMMYUNION_MEMBER(name) name
83 # define _DDK_DUMMYUNION_N_MEMBER(n, name) name
87 ** Forward declarations
99 struct _DEVICE_OBJECT;
100 struct _DRIVER_OBJECT;
101 struct _SECTION_OBJECT;
102 struct _IO_STATUS_BLOCK;
103 struct _DEVICE_DESCRIPTION;
104 struct _SCATTER_GATHER_LIST;
106 DECLARE_INTERNAL_OBJECT(ADAPTER_OBJECT)
107 DECLARE_INTERNAL_OBJECT(DMA_ADAPTER)
108 DECLARE_INTERNAL_OBJECT(IO_STATUS_BLOCK)
109 DECLARE_INTERNAL_OBJECT(SECTION_OBJECT)
112 /* FIXME: Unknown definitions */
113 struct _SET_PARTITION_INFORMATION_EX;
114 typedef ULONG WAIT_TYPE;
115 typedef HANDLE TRACEHANDLE;
116 typedef PVOID PWMILIB_CONTEXT;
117 typedef PVOID PSYSCTL_IRP_DISPOSITION;
118 typedef ULONG LOGICAL;
122 ** Routines specific to this DDK
125 #define TAG(_a, _b, _c, _d) (ULONG) \
126 (((_a) << 0) + ((_b) << 8) + ((_c) << 16) + ((_d) << 24))
128 static __inline struct _KPCR * KeGetCurrentKPCR(
133 __asm__ __volatile__ (
134 /* support -masm=intel */
135 "mov{l} {%%fs:0x18, %0|%0, %%fs:0x18}\n\t"
139 return (struct _KPCR *) Value;
146 typedef LONG KPRIORITY;
147 typedef UCHAR KIRQL, *PKIRQL;
148 typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK;
149 typedef ULONG_PTR KAFFINITY, *PKAFFINITY;
150 typedef CCHAR KPROCESSOR_MODE;
159 /* Structures not exposed to drivers */
160 typedef struct _IO_TIMER *PIO_TIMER;
161 typedef struct _EPROCESS *PEPROCESS;
162 typedef struct _ETHREAD *PETHREAD;
163 typedef struct _KINTERRUPT *PKINTERRUPT;
164 typedef struct _OBJECT_TYPE *POBJECT_TYPE;
165 typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD;
166 typedef struct _COMPRESSED_DATA_INFO *PCOMPRESSED_DATA_INFO;
167 typedef struct _HAL_DISPATCH_TABLE *PHAL_DISPATCH_TABLE;
168 typedef struct _HAL_PRIVATE_DISPATCH_TABLE *PHAL_PRIVATE_DISPATCH_TABLE;
169 typedef struct _DRIVE_LAYOUT_INFORMATION *PDRIVE_LAYOUT_INFORMATION;
170 typedef struct _DRIVE_LAYOUT_INFORMATION_EX *PDRIVE_LAYOUT_INFORMATION_EX;
173 #define MAXIMUM_PROCESSORS 32
175 #define MAXIMUM_WAIT_OBJECTS 64
177 #define METHOD_BUFFERED 0
178 #define METHOD_IN_DIRECT 1
179 #define METHOD_OUT_DIRECT 2
180 #define METHOD_NEITHER 3
182 #define LOW_PRIORITY 0
183 #define LOW_REALTIME_PRIORITY 16
184 #define HIGH_PRIORITY 31
185 #define MAXIMUM_PRIORITY 32
187 #define FILE_SUPERSEDED 0x00000000
188 #define FILE_OPENED 0x00000001
189 #define FILE_CREATED 0x00000002
190 #define FILE_OVERWRITTEN 0x00000003
191 #define FILE_EXISTS 0x00000004
192 #define FILE_DOES_NOT_EXIST 0x00000005
194 /* also in winnt.h */
195 #define FILE_LIST_DIRECTORY 0x00000001
196 #define FILE_READ_DATA 0x00000001
197 #define FILE_ADD_FILE 0x00000002
198 #define FILE_WRITE_DATA 0x00000002
199 #define FILE_ADD_SUBDIRECTORY 0x00000004
200 #define FILE_APPEND_DATA 0x00000004
201 #define FILE_CREATE_PIPE_INSTANCE 0x00000004
202 #define FILE_READ_EA 0x00000008
203 #define FILE_WRITE_EA 0x00000010
204 #define FILE_EXECUTE 0x00000020
205 #define FILE_TRAVERSE 0x00000020
206 #define FILE_DELETE_CHILD 0x00000040
207 #define FILE_READ_ATTRIBUTES 0x00000080
208 #define FILE_WRITE_ATTRIBUTES 0x00000100
210 #define FILE_SHARE_READ 0x00000001
211 #define FILE_SHARE_WRITE 0x00000002
212 #define FILE_SHARE_DELETE 0x00000004
213 #define FILE_SHARE_VALID_FLAGS 0x00000007
215 #define FILE_ATTRIBUTE_READONLY 0x00000001
216 #define FILE_ATTRIBUTE_HIDDEN 0x00000002
217 #define FILE_ATTRIBUTE_SYSTEM 0x00000004
218 #define FILE_ATTRIBUTE_DIRECTORY 0x00000010
219 #define FILE_ATTRIBUTE_ARCHIVE 0x00000020
220 #define FILE_ATTRIBUTE_DEVICE 0x00000040
221 #define FILE_ATTRIBUTE_NORMAL 0x00000080
222 #define FILE_ATTRIBUTE_TEMPORARY 0x00000100
223 #define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
224 #define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
225 #define FILE_ATTRIBUTE_COMPRESSED 0x00000800
226 #define FILE_ATTRIBUTE_OFFLINE 0x00001000
227 #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
228 #define FILE_ATTRIBUTE_ENCRYPTED 0x00004000
229 #define FILE_ATTRIBUTE_VIRTUAL 0x00010000
231 #define FILE_ATTRIBUTE_VALID_FLAGS 0x00017fb7
232 #define FILE_ATTRIBUTE_VALID_SET_FLAGS 0x000031a7
234 #define FILE_COPY_STRUCTURED_STORAGE 0x00000041
235 #define FILE_STRUCTURED_STORAGE 0x00000441
237 #define FILE_VALID_OPTION_FLAGS 0x00ffffff
238 #define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032
239 #define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032
240 #define FILE_VALID_SET_FLAGS 0x00000036
242 #define FILE_SUPERSEDE 0x00000000
243 #define FILE_OPEN 0x00000001
244 #define FILE_CREATE 0x00000002
245 #define FILE_OPEN_IF 0x00000003
246 #define FILE_OVERWRITE 0x00000004
247 #define FILE_OVERWRITE_IF 0x00000005
248 #define FILE_MAXIMUM_DISPOSITION 0x00000005
250 #define FILE_DIRECTORY_FILE 0x00000001
251 #define FILE_WRITE_THROUGH 0x00000002
252 #define FILE_SEQUENTIAL_ONLY 0x00000004
253 #define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008
254 #define FILE_SYNCHRONOUS_IO_ALERT 0x00000010
255 #define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020
256 #define FILE_NON_DIRECTORY_FILE 0x00000040
257 #define FILE_CREATE_TREE_CONNECTION 0x00000080
258 #define FILE_COMPLETE_IF_OPLOCKED 0x00000100
259 #define FILE_NO_EA_KNOWLEDGE 0x00000200
260 #define FILE_OPEN_FOR_RECOVERY 0x00000400
261 #define FILE_RANDOM_ACCESS 0x00000800
262 #define FILE_DELETE_ON_CLOSE 0x00001000
263 #define FILE_OPEN_BY_FILE_ID 0x00002000
264 #define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000
265 #define FILE_NO_COMPRESSION 0x00008000
266 #define FILE_RESERVE_OPFILTER 0x00100000
267 #define FILE_OPEN_REPARSE_POINT 0x00200000
268 #define FILE_OPEN_NO_RECALL 0x00400000
269 #define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000
271 #define FILE_ANY_ACCESS 0x00000000
272 #define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS
273 #define FILE_READ_ACCESS 0x00000001
274 #define FILE_WRITE_ACCESS 0x00000002
276 #define FILE_ALL_ACCESS \
277 (STANDARD_RIGHTS_REQUIRED | \
281 #define FILE_GENERIC_EXECUTE \
282 (STANDARD_RIGHTS_EXECUTE | \
283 FILE_READ_ATTRIBUTES | \
287 #define FILE_GENERIC_READ \
288 (STANDARD_RIGHTS_READ | \
290 FILE_READ_ATTRIBUTES | \
294 #define FILE_GENERIC_WRITE \
295 (STANDARD_RIGHTS_WRITE | \
297 FILE_WRITE_ATTRIBUTES | \
303 #define DIRECTORY_QUERY (0x0001)
304 #define DIRECTORY_TRAVERSE (0x0002)
305 #define DIRECTORY_CREATE_OBJECT (0x0004)
306 #define DIRECTORY_CREATE_SUBDIRECTORY (0x0008)
307 #define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
309 /* Exported object types */
310 extern NTOSAPI POBJECT_TYPE ExDesktopObjectType;
311 extern NTOSAPI POBJECT_TYPE ExEventObjectType;
312 extern NTOSAPI POBJECT_TYPE ExSemaphoreObjectType;
313 extern NTOSAPI POBJECT_TYPE ExWindowStationObjectType;
314 extern NTOSAPI POBJECT_TYPE IoAdapterObjectType;
315 extern NTOSAPI ULONG IoDeviceHandlerObjectSize;
316 extern NTOSAPI POBJECT_TYPE IoDeviceHandlerObjectType;
317 extern NTOSAPI POBJECT_TYPE IoDeviceObjectType;
318 extern NTOSAPI POBJECT_TYPE IoDriverObjectType;
319 extern NTOSAPI POBJECT_TYPE IoFileObjectType;
320 extern NTOSAPI POBJECT_TYPE LpcPortObjectType;
321 extern NTOSAPI POBJECT_TYPE MmSectionObjectType;
322 extern NTOSAPI POBJECT_TYPE SeTokenObjectType;
324 extern NTOSAPI CCHAR KeNumberProcessors;
325 extern NTOSAPI PHAL_DISPATCH_TABLE HalDispatchTable;
326 extern NTOSAPI PHAL_PRIVATE_DISPATCH_TABLE HalPrivateDispatchTable;
330 ** IRP function codes
333 #define IRP_MJ_CREATE 0x00
334 #define IRP_MJ_CREATE_NAMED_PIPE 0x01
335 #define IRP_MJ_CLOSE 0x02
336 #define IRP_MJ_READ 0x03
337 #define IRP_MJ_WRITE 0x04
338 #define IRP_MJ_QUERY_INFORMATION 0x05
339 #define IRP_MJ_SET_INFORMATION 0x06
340 #define IRP_MJ_QUERY_EA 0x07
341 #define IRP_MJ_SET_EA 0x08
342 #define IRP_MJ_FLUSH_BUFFERS 0x09
343 #define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0a
344 #define IRP_MJ_SET_VOLUME_INFORMATION 0x0b
345 #define IRP_MJ_DIRECTORY_CONTROL 0x0c
346 #define IRP_MJ_FILE_SYSTEM_CONTROL 0x0d
347 #define IRP_MJ_DEVICE_CONTROL 0x0e
348 #define IRP_MJ_INTERNAL_DEVICE_CONTROL 0x0f
349 #define IRP_MJ_SCSI 0x0f
350 #define IRP_MJ_SHUTDOWN 0x10
351 #define IRP_MJ_LOCK_CONTROL 0x11
352 #define IRP_MJ_CLEANUP 0x12
353 #define IRP_MJ_CREATE_MAILSLOT 0x13
354 #define IRP_MJ_QUERY_SECURITY 0x14
355 #define IRP_MJ_SET_SECURITY 0x15
356 #define IRP_MJ_POWER 0x16
357 #define IRP_MJ_SYSTEM_CONTROL 0x17
358 #define IRP_MJ_DEVICE_CHANGE 0x18
359 #define IRP_MJ_QUERY_QUOTA 0x19
360 #define IRP_MJ_SET_QUOTA 0x1a
361 #define IRP_MJ_PNP 0x1b
362 #define IRP_MJ_PNP_POWER 0x1b
363 #define IRP_MJ_MAXIMUM_FUNCTION 0x1b
365 #define IRP_MN_QUERY_DIRECTORY 0x01
366 #define IRP_MN_NOTIFY_CHANGE_DIRECTORY 0x02
368 #define IRP_MN_USER_FS_REQUEST 0x00
369 #define IRP_MN_MOUNT_VOLUME 0x01
370 #define IRP_MN_VERIFY_VOLUME 0x02
371 #define IRP_MN_LOAD_FILE_SYSTEM 0x03
372 #define IRP_MN_TRACK_LINK 0x04
373 #define IRP_MN_KERNEL_CALL 0x04
375 #define IRP_MN_LOCK 0x01
376 #define IRP_MN_UNLOCK_SINGLE 0x02
377 #define IRP_MN_UNLOCK_ALL 0x03
378 #define IRP_MN_UNLOCK_ALL_BY_KEY 0x04
380 #define IRP_MN_NORMAL 0x00
381 #define IRP_MN_DPC 0x01
382 #define IRP_MN_MDL 0x02
383 #define IRP_MN_COMPLETE 0x04
384 #define IRP_MN_COMPRESSED 0x08
386 #define IRP_MN_MDL_DPC (IRP_MN_MDL | IRP_MN_DPC)
387 #define IRP_MN_COMPLETE_MDL (IRP_MN_COMPLETE | IRP_MN_MDL)
388 #define IRP_MN_COMPLETE_MDL_DPC (IRP_MN_COMPLETE_MDL | IRP_MN_DPC)
390 #define IRP_MN_SCSI_CLASS 0x01
392 #define IRP_MN_START_DEVICE 0x00
393 #define IRP_MN_QUERY_REMOVE_DEVICE 0x01
394 #define IRP_MN_REMOVE_DEVICE 0x02
395 #define IRP_MN_CANCEL_REMOVE_DEVICE 0x03
396 #define IRP_MN_STOP_DEVICE 0x04
397 #define IRP_MN_QUERY_STOP_DEVICE 0x05
398 #define IRP_MN_CANCEL_STOP_DEVICE 0x06
400 #define IRP_MN_QUERY_DEVICE_RELATIONS 0x07
401 #define IRP_MN_QUERY_INTERFACE 0x08
402 #define IRP_MN_QUERY_CAPABILITIES 0x09
403 #define IRP_MN_QUERY_RESOURCES 0x0A
404 #define IRP_MN_QUERY_RESOURCE_REQUIREMENTS 0x0B
405 #define IRP_MN_QUERY_DEVICE_TEXT 0x0C
406 #define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
408 #define IRP_MN_READ_CONFIG 0x0F
409 #define IRP_MN_WRITE_CONFIG 0x10
410 #define IRP_MN_EJECT 0x11
411 #define IRP_MN_SET_LOCK 0x12
412 #define IRP_MN_QUERY_ID 0x13
413 #define IRP_MN_QUERY_PNP_DEVICE_STATE 0x14
414 #define IRP_MN_QUERY_BUS_INFORMATION 0x15
415 #define IRP_MN_DEVICE_USAGE_NOTIFICATION 0x16
416 #define IRP_MN_SURPRISE_REMOVAL 0x17
417 #define IRP_MN_QUERY_LEGACY_BUS_INFORMATION 0x18
419 #define IRP_MN_WAIT_WAKE 0x00
420 #define IRP_MN_POWER_SEQUENCE 0x01
421 #define IRP_MN_SET_POWER 0x02
422 #define IRP_MN_QUERY_POWER 0x03
424 #define IRP_MN_QUERY_ALL_DATA 0x00
425 #define IRP_MN_QUERY_SINGLE_INSTANCE 0x01
426 #define IRP_MN_CHANGE_SINGLE_INSTANCE 0x02
427 #define IRP_MN_CHANGE_SINGLE_ITEM 0x03
428 #define IRP_MN_ENABLE_EVENTS 0x04
429 #define IRP_MN_DISABLE_EVENTS 0x05
430 #define IRP_MN_ENABLE_COLLECTION 0x06
431 #define IRP_MN_DISABLE_COLLECTION 0x07
432 #define IRP_MN_REGINFO 0x08
433 #define IRP_MN_EXECUTE_METHOD 0x09
435 #define IRP_MN_REGINFO_EX 0x0b
437 typedef enum _IO_ALLOCATION_ACTION {
440 DeallocateObjectKeepRegisters
441 } IO_ALLOCATION_ACTION, *PIO_ALLOCATION_ACTION;
443 typedef IO_ALLOCATION_ACTION
444 (DDKAPI *PDRIVER_CONTROL)(
445 /*IN*/ struct _DEVICE_OBJECT *DeviceObject,
446 /*IN*/ struct _IRP *Irp,
447 /*IN*/ PVOID MapRegisterBase,
448 /*IN*/ PVOID Context);
451 (DDKAPI *PDRIVER_LIST_CONTROL)(
452 /*IN*/ struct _DEVICE_OBJECT *DeviceObject,
453 /*IN*/ struct _IRP *Irp,
454 /*IN*/ struct _SCATTER_GATHER_LIST *ScatterGather,
455 /*IN*/ PVOID Context);
458 (DDKAPI *PDRIVER_ADD_DEVICE)(
459 /*IN*/ struct _DRIVER_OBJECT *DriverObject,
460 /*IN*/ struct _DEVICE_OBJECT *PhysicalDeviceObject);
463 (DDKAPI *PIO_COMPLETION_ROUTINE)(
464 /*IN*/ struct _DEVICE_OBJECT *DeviceObject,
465 /*IN*/ struct _IRP *Irp,
466 /*IN*/ PVOID Context);
469 (DDKAPI *PDRIVER_CANCEL)(
470 /*IN*/ struct _DEVICE_OBJECT *DeviceObject,
471 /*IN*/ struct _IRP *Irp);
474 (DDKAPI *PKDEFERRED_ROUTINE)(
475 /*IN*/ struct _KDPC *Dpc,
476 /*IN*/ PVOID DeferredContext,
477 /*IN*/ PVOID SystemArgument1,
478 /*IN*/ PVOID SystemArgument2);
481 (DDKAPI *PDRIVER_DISPATCH)(
482 /*IN*/ struct _DEVICE_OBJECT *DeviceObject,
483 /*IN*/ struct _IRP *Irp);
486 (DDKAPI *PIO_DPC_ROUTINE)(
487 /*IN*/ struct _KDPC *Dpc,
488 /*IN*/ struct _DEVICE_OBJECT *DeviceObject,
489 /*IN*/ struct _IRP *Irp,
490 /*IN*/ PVOID Context);
493 (DDKAPI *PMM_DLL_INITIALIZE)(
494 /*IN*/ PUNICODE_STRING RegistryPath);
497 (DDKAPI *PMM_DLL_UNLOAD)(
501 (DDKAPI *PDRIVER_ENTRY)(
502 /*IN*/ struct _DRIVER_OBJECT *DriverObject,
503 /*IN*/ PUNICODE_STRING RegistryPath);
506 (DDKAPI *PDRIVER_INITIALIZE)(
507 /*IN*/ struct _DRIVER_OBJECT *DriverObject,
508 /*IN*/ PUNICODE_STRING RegistryPath);
511 (DDKAPI *PKSERVICE_ROUTINE)(
512 /*IN*/ struct _KINTERRUPT *Interrupt,
513 /*IN*/ PVOID ServiceContext);
516 (DDKAPI *PIO_TIMER_ROUTINE)(
517 /*IN*/ struct _DEVICE_OBJECT *DeviceObject,
518 /*IN*/ PVOID Context);
521 (DDKAPI *PDRIVER_REINITIALIZE)(
522 /*IN*/ struct _DRIVER_OBJECT *DriverObject,
523 /*IN*/ PVOID Context,
527 (DDKAPI *PDRIVER_STARTIO)(
528 /*IN*/ struct _DEVICE_OBJECT *DeviceObject,
529 /*IN*/ struct _IRP *Irp);
532 (DDKAPI *PKSYNCHRONIZE_ROUTINE)(
533 /*IN*/ PVOID SynchronizeContext);
536 (DDKAPI *PDRIVER_UNLOAD)(
537 /*IN*/ struct _DRIVER_OBJECT *DriverObject);
542 ** Plug and Play structures
546 (*PINTERFACE_REFERENCE)(
550 (*PINTERFACE_DEREFERENCE)(
553 typedef BOOLEAN DDKAPI
554 (*PTRANSLATE_BUS_ADDRESS)(
555 /*IN*/ PVOID Context,
556 /*IN*/ PHYSICAL_ADDRESS BusAddress,
558 /*IN OUT*/ PULONG AddressSpace,
559 /*OUT*/ PPHYSICAL_ADDRESS TranslatedAddress);
561 typedef struct _DMA_ADAPTER* DDKAPI
563 /*IN*/ PVOID Context,
564 /*IN*/ struct _DEVICE_DESCRIPTION *DeviceDescriptor,
565 /*OUT*/ PULONG NumberOfMapRegisters);
568 (*PGET_SET_DEVICE_DATA)(
569 /*IN*/ PVOID Context,
570 /*IN*/ ULONG DataType,
573 /*IN*/ ULONG Length);
575 typedef union _POWER_STATE {
576 SYSTEM_POWER_STATE SystemState;
577 DEVICE_POWER_STATE DeviceState;
578 } POWER_STATE, *PPOWER_STATE;
580 typedef enum _POWER_STATE_TYPE {
583 } POWER_STATE_TYPE, *PPOWER_STATE_TYPE;
585 typedef struct _BUS_INTERFACE_STANDARD {
589 PINTERFACE_REFERENCE InterfaceReference;
590 PINTERFACE_DEREFERENCE InterfaceDereference;
591 PTRANSLATE_BUS_ADDRESS TranslateBusAddress;
592 PGET_DMA_ADAPTER GetDmaAdapter;
593 PGET_SET_DEVICE_DATA SetBusData;
594 PGET_SET_DEVICE_DATA GetBusData;
595 } BUS_INTERFACE_STANDARD, *PBUS_INTERFACE_STANDARD;
597 typedef struct _DEVICE_CAPABILITIES {
602 ULONG LockSupported : 1;
603 ULONG EjectSupported : 1;
605 ULONG DockDevice : 1;
607 ULONG SilentInstall : 1;
608 ULONG RawDeviceOK : 1;
609 ULONG SurpriseRemovalOK : 1;
610 ULONG WakeFromD0 : 1;
611 ULONG WakeFromD1 : 1;
612 ULONG WakeFromD2 : 1;
613 ULONG WakeFromD3 : 1;
614 ULONG HardwareDisabled : 1;
615 ULONG NonDynamic : 1;
616 ULONG WarmEjectSupported : 1;
617 ULONG NoDisplayInUI : 1;
621 DEVICE_POWER_STATE DeviceState[PowerSystemMaximum];
622 SYSTEM_POWER_STATE SystemWake;
623 DEVICE_POWER_STATE DeviceWake;
627 } DEVICE_CAPABILITIES, *PDEVICE_CAPABILITIES;
629 typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION {
633 GUID InterfaceClassGuid;
634 PUNICODE_STRING SymbolicLinkName;
635 } DEVICE_INTERFACE_CHANGE_NOTIFICATION, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION;
637 typedef struct _HWPROFILE_CHANGE_NOTIFICATION {
641 } HWPROFILE_CHANGE_NOTIFICATION, *PHWPROFILE_CHANGE_NOTIFICATION;
645 typedef struct _INTERFACE {
649 PINTERFACE_REFERENCE InterfaceReference;
650 PINTERFACE_DEREFERENCE InterfaceDereference;
651 } INTERFACE, *PINTERFACE;
653 typedef struct _PLUGPLAY_NOTIFICATION_HEADER {
657 } PLUGPLAY_NOTIFICATION_HEADER, *PPLUGPLAY_NOTIFICATION_HEADER;
659 typedef ULONG PNP_DEVICE_STATE, *PPNP_DEVICE_STATE;
661 /* PNP_DEVICE_STATE */
663 #define PNP_DEVICE_DISABLED 0x00000001
664 #define PNP_DEVICE_DONT_DISPLAY_IN_UI 0x00000002
665 #define PNP_DEVICE_FAILED 0x00000004
666 #define PNP_DEVICE_REMOVED 0x00000008
667 #define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010
668 #define PNP_DEVICE_NOT_DISABLEABLE 0x00000020
670 typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION {
674 struct _FILE_OBJECT *FileObject;
675 LONG NameBufferOffset;
676 UCHAR CustomDataBuffer[1];
677 } TARGET_DEVICE_CUSTOM_NOTIFICATION, *PTARGET_DEVICE_CUSTOM_NOTIFICATION;
679 typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION {
683 struct _FILE_OBJECT *FileObject;
684 } TARGET_DEVICE_REMOVAL_NOTIFICATION, *PTARGET_DEVICE_REMOVAL_NOTIFICATION;
686 typedef enum _BUS_QUERY_ID_TYPE {
689 BusQueryCompatibleIDs,
691 BusQueryDeviceSerialNumber
692 } BUS_QUERY_ID_TYPE, *PBUS_QUERY_ID_TYPE;
694 typedef enum _DEVICE_TEXT_TYPE {
695 DeviceTextDescription,
696 DeviceTextLocationInformation
697 } DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE;
699 typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE {
700 DeviceUsageTypeUndefined,
701 DeviceUsageTypePaging,
702 DeviceUsageTypeHibernation,
703 DeviceUsageTypeDumpFile
704 } DEVICE_USAGE_NOTIFICATION_TYPE;
706 typedef struct _POWER_SEQUENCE {
710 } POWER_SEQUENCE, *PPOWER_SEQUENCE;
713 DevicePropertyDeviceDescription,
714 DevicePropertyHardwareID,
715 DevicePropertyCompatibleIDs,
716 DevicePropertyBootConfiguration,
717 DevicePropertyBootConfigurationTranslated,
718 DevicePropertyClassName,
719 DevicePropertyClassGuid,
720 DevicePropertyDriverKeyName,
721 DevicePropertyManufacturer,
722 DevicePropertyFriendlyName,
723 DevicePropertyLocationInformation,
724 DevicePropertyPhysicalDeviceObjectName,
725 DevicePropertyBusTypeGuid,
726 DevicePropertyLegacyBusType,
727 DevicePropertyBusNumber,
728 DevicePropertyEnumeratorName,
729 DevicePropertyAddress,
730 DevicePropertyUINumber,
731 DevicePropertyInstallState,
732 DevicePropertyRemovalPolicy
733 } DEVICE_REGISTRY_PROPERTY;
735 typedef enum _IO_NOTIFICATION_EVENT_CATEGORY {
736 EventCategoryReserved,
737 EventCategoryHardwareProfileChange,
738 EventCategoryDeviceInterfaceChange,
739 EventCategoryTargetDeviceChange
740 } IO_NOTIFICATION_EVENT_CATEGORY;
742 #define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES 0x00000001
744 typedef NTSTATUS DDKAPI
745 (*PDRIVER_NOTIFICATION_CALLBACK_ROUTINE)(
746 /*IN*/ PVOID NotificationStructure,
747 /*IN*/ PVOID Context);
750 (*PDEVICE_CHANGE_COMPLETE_CALLBACK)(
751 /*IN*/ PVOID Context);
759 #define SYMBOLIC_LINK_QUERY 0x0001
760 #define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
762 /* also in winnt,h */
763 #define DUPLICATE_CLOSE_SOURCE 0x00000001
764 #define DUPLICATE_SAME_ACCESS 0x00000002
765 #define DUPLICATE_SAME_ATTRIBUTES 0x00000004
768 typedef struct _OBJECT_NAME_INFORMATION {
770 } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
774 /*IN*/ PVOID ApcContext,
775 /*IN*/ PIO_STATUS_BLOCK IoStatusBlock,
776 /*IN*/ ULONG Reserved);
778 typedef struct _IO_STATUS_BLOCK {
779 _ANONYMOUS_UNION union {
783 ULONG_PTR Information;
788 /*IN*/ PVOID NormalContext,
789 /*IN*/ PVOID SystemArgument1,
790 /*IN*/ PVOID SystemArgument2);
794 /*IN*/ struct _KAPC *Apc,
795 /*IN OUT*/ PKNORMAL_ROUTINE *NormalRoutine,
796 /*IN OUT*/ PVOID *NormalContext,
797 /*IN OUT*/ PVOID *SystemArgument1,
798 /*IN OUT*/ PVOID *SystemArgument2);
801 (*PKRUNDOWN_ROUTINE)(
802 /*IN*/ struct _KAPC *Apc);
804 typedef BOOLEAN DDKAPI
805 (*PKTRANSFER_ROUTINE)(
808 typedef struct _KAPC {
812 struct _KTHREAD *Thread;
813 LIST_ENTRY ApcListEntry;
814 PKKERNEL_ROUTINE KernelRoutine;
815 PKRUNDOWN_ROUTINE RundownRoutine;
816 PKNORMAL_ROUTINE NormalRoutine;
818 PVOID SystemArgument1;
819 PVOID SystemArgument2;
821 KPROCESSOR_MODE ApcMode;
823 } KAPC, *PKAPC, *RESTRICTED_POINTER PRKAPC;
825 typedef struct _KDEVICE_QUEUE {
828 LIST_ENTRY DeviceListHead;
831 } KDEVICE_QUEUE, *PKDEVICE_QUEUE, *RESTRICTED_POINTER PRKDEVICE_QUEUE;
833 typedef struct _KDEVICE_QUEUE_ENTRY {
834 LIST_ENTRY DeviceListEntry;
837 } KDEVICE_QUEUE_ENTRY, *PKDEVICE_QUEUE_ENTRY,
838 *RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY;
840 #define LOCK_QUEUE_WAIT 1
841 #define LOCK_QUEUE_OWNER 2
843 typedef enum _KSPIN_LOCK_QUEUE_NUMBER {
844 LockQueueDispatcherLock,
845 LockQueueContextSwapLock,
847 LockQueueSystemSpaceLock,
850 LockQueueNonPagedPoolLock,
851 LockQueueIoCancelLock,
852 LockQueueWorkQueueLock,
854 LockQueueIoDatabaseLock,
855 LockQueueIoCompletionLock,
856 LockQueueNtfsStructLock,
857 LockQueueAfdWorkQueueLock,
860 } KSPIN_LOCK_QUEUE_NUMBER, *PKSPIN_LOCK_QUEUE_NUMBER;
862 typedef struct _KSPIN_LOCK_QUEUE {
863 struct _KSPIN_LOCK_QUEUE *VOLATILE Next;
864 PKSPIN_LOCK VOLATILE Lock;
865 } KSPIN_LOCK_QUEUE, *PKSPIN_LOCK_QUEUE;
867 typedef struct _KLOCK_QUEUE_HANDLE {
868 KSPIN_LOCK_QUEUE LockQueue;
870 } KLOCK_QUEUE_HANDLE, *PKLOCK_QUEUE_HANDLE;
872 typedef struct _KDPC {
876 LIST_ENTRY DpcListEntry;
877 PKDEFERRED_ROUTINE DeferredRoutine;
878 PVOID DeferredContext;
879 PVOID SystemArgument1;
880 PVOID SystemArgument2;
882 } KDPC, *PKDPC, *RESTRICTED_POINTER PRKDPC;
884 typedef struct _WAIT_CONTEXT_BLOCK {
885 KDEVICE_QUEUE_ENTRY WaitQueueEntry;
886 struct _DRIVER_CONTROL *DeviceRoutine;
888 ULONG NumberOfMapRegisters;
891 PKDPC BufferChainingDpc;
892 } WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK;
894 typedef struct _DISPATCHER_HEADER {
900 LIST_ENTRY WaitListHead;
901 } DISPATCHER_HEADER, *PDISPATCHER_HEADER;
903 typedef struct _KEVENT {
904 DISPATCHER_HEADER Header;
905 } KEVENT, *PKEVENT, *RESTRICTED_POINTER PRKEVENT;
907 typedef struct _KSEMAPHORE {
908 DISPATCHER_HEADER Header;
910 } KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE;
912 typedef struct _FAST_MUTEX {
914 struct _KTHREAD *Owner;
918 } FAST_MUTEX, *PFAST_MUTEX;
920 typedef struct _KTIMER {
921 DISPATCHER_HEADER Header;
922 ULARGE_INTEGER DueTime;
923 LIST_ENTRY TimerListEntry;
926 } KTIMER, *PKTIMER, *RESTRICTED_POINTER PRKTIMER;
928 typedef struct _KMUTANT {
929 DISPATCHER_HEADER Header;
930 LIST_ENTRY MutantListEntry;
931 struct _KTHREAD *RESTRICTED_POINTER OwnerThread;
934 } KMUTANT, *PKMUTANT, *RESTRICTED_POINTER PRKMUTANT, KMUTEX, *PKMUTEX, *RESTRICTED_POINTER PRKMUTEX;
936 typedef enum _TIMER_TYPE {
941 typedef enum _TIMER_INFORMATION_CLASS {
942 TimerBasicInformation
943 } TIMER_INFORMATION_CLASS;
945 typedef struct _TIMER_BASIC_INFORMATION {
946 LARGE_INTEGER TimeRemaining;
948 } TIMER_BASIC_INFORMATION, *PTIMER_BASIC_INFORMATION;
950 #define EVENT_INCREMENT 1
951 #define IO_NO_INCREMENT 0
952 #define IO_CD_ROM_INCREMENT 1
953 #define IO_DISK_INCREMENT 1
954 #define IO_KEYBOARD_INCREMENT 6
955 #define IO_MAILSLOT_INCREMENT 2
956 #define IO_MOUSE_INCREMENT 6
957 #define IO_NAMED_PIPE_INCREMENT 2
958 #define IO_NETWORK_INCREMENT 2
959 #define IO_PARALLEL_INCREMENT 1
960 #define IO_SERIAL_INCREMENT 2
961 #define IO_SOUND_INCREMENT 8
962 #define IO_VIDEO_INCREMENT 1
963 #define SEMAPHORE_INCREMENT 1
965 typedef struct _IRP {
968 struct _MDL *MdlAddress;
971 struct _IRP *MasterIrp;
975 LIST_ENTRY ThreadListEntry;
976 IO_STATUS_BLOCK IoStatus;
977 KPROCESSOR_MODE RequestorMode;
978 BOOLEAN PendingReturned;
980 CHAR CurrentLocation;
983 CCHAR ApcEnvironment;
984 UCHAR AllocationFlags;
985 PIO_STATUS_BLOCK UserIosb;
989 PIO_APC_ROUTINE UserApcRoutine;
990 PVOID UserApcContext;
991 } AsynchronousParameters;
992 LARGE_INTEGER AllocationSize;
994 PDRIVER_CANCEL CancelRoutine;
998 _ANONYMOUS_UNION union {
999 KDEVICE_QUEUE_ENTRY DeviceQueueEntry;
1000 _ANONYMOUS_STRUCT struct {
1001 PVOID DriverContext[4];
1005 PCHAR AuxiliaryBuffer;
1006 _ANONYMOUS_STRUCT struct {
1007 LIST_ENTRY ListEntry;
1008 _ANONYMOUS_UNION union {
1009 struct _IO_STACK_LOCATION *CurrentStackLocation;
1013 struct _FILE_OBJECT *OriginalFileObject;
1016 PVOID CompletionKey;
1019 typedef struct _IRP *PIRP;
1023 #define SL_FORCE_ACCESS_CHECK 0x01
1024 #define SL_OPEN_PAGING_FILE 0x02
1025 #define SL_OPEN_TARGET_DIRECTORY 0x04
1026 #define SL_CASE_SENSITIVE 0x80
1028 #define SL_KEY_SPECIFIED 0x01
1029 #define SL_OVERRIDE_VERIFY_VOLUME 0x02
1030 #define SL_WRITE_THROUGH 0x04
1031 #define SL_FT_SEQUENTIAL_WRITE 0x08
1033 #define SL_FAIL_IMMEDIATELY 0x01
1034 #define SL_EXCLUSIVE_LOCK 0x02
1036 #define SL_RESTART_SCAN 0x01
1037 #define SL_RETURN_SINGLE_ENTRY 0x02
1038 #define SL_INDEX_SPECIFIED 0x04
1040 #define SL_WATCH_TREE 0x01
1042 #define SL_ALLOW_RAW_MOUNT 0x01
1044 #define CTL_CODE(DeviceType, Function, Method, Access)( \
1045 ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
1047 #define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16)
1052 IRP_PAGING_IO = 0x2,
1053 IRP_MOUNT_COMPLETION = 0x2,
1054 IRP_SYNCHRONOUS_API = 0x4,
1055 IRP_ASSOCIATED_IRP = 0x8,
1056 IRP_BUFFERED_IO = 0x10,
1057 IRP_DEALLOCATE_BUFFER = 0x20,
1058 IRP_INPUT_OPERATION = 0x40,
1059 IRP_SYNCHRONOUS_PAGING_IO = 0x40,
1060 IRP_CREATE_OPERATION = 0x80,
1061 IRP_READ_OPERATION = 0x100,
1062 IRP_WRITE_OPERATION = 0x200,
1063 IRP_CLOSE_OPERATION = 0x400,
1064 IRP_DEFER_IO_COMPLETION = 0x800,
1065 IRP_OB_QUERY_NAME = 0x1000,
1066 IRP_HOLD_DEVICE_QUEUE = 0x2000,
1067 IRP_RETRY_IO_COMPLETION = 0x4000
1070 #ifndef _DRIVE_LAYOUT_INFORMATION_MBR_DEFINED
1071 #define _DRIVE_LAYOUT_INFORMATION_MBR_DEFINED
1072 typedef struct _DRIVE_LAYOUT_INFORMATION_MBR {
1074 } DRIVE_LAYOUT_INFORMATION_MBR, *PDRIVE_LAYOUT_INFORMATION_MBR;
1077 typedef struct _DRIVE_LAYOUT_INFORMATION_GPT {
1079 LARGE_INTEGER StartingUsableOffset;
1080 LARGE_INTEGER UsableLength;
1081 ULONG MaxPartitionCount;
1082 } DRIVE_LAYOUT_INFORMATION_GPT, *PDRIVE_LAYOUT_INFORMATION_GPT;
1084 typedef struct _PARTITION_INFORMATION_MBR {
1085 UCHAR PartitionType;
1086 BOOLEAN BootIndicator;
1087 BOOLEAN RecognizedPartition;
1088 ULONG HiddenSectors;
1089 } PARTITION_INFORMATION_MBR, *PPARTITION_INFORMATION_MBR;
1092 typedef struct _BOOTDISK_INFORMATION {
1093 LONGLONG BootPartitionOffset;
1094 LONGLONG SystemPartitionOffset;
1095 ULONG BootDeviceSignature;
1096 ULONG SystemDeviceSignature;
1097 } BOOTDISK_INFORMATION, *PBOOTDISK_INFORMATION;
1099 typedef struct _BOOTDISK_INFORMATION_EX {
1100 LONGLONG BootPartitionOffset;
1101 LONGLONG SystemPartitionOffset;
1102 ULONG BootDeviceSignature;
1103 ULONG SystemDeviceSignature;
1104 GUID BootDeviceGuid;
1105 GUID SystemDeviceGuid;
1106 BOOLEAN BootDeviceIsGpt;
1107 BOOLEAN SystemDeviceIsGpt;
1108 } BOOTDISK_INFORMATION_EX, *PBOOTDISK_INFORMATION_EX;
1110 typedef struct _EISA_MEMORY_TYPE {
1111 UCHAR ReadWrite : 1;
1113 UCHAR Reserved0 : 1;
1116 UCHAR Reserved1 : 1;
1117 UCHAR MoreEntries : 1;
1118 } EISA_MEMORY_TYPE, *PEISA_MEMORY_TYPE;
1120 #include <pshpack1.h>
1121 typedef struct _EISA_MEMORY_CONFIGURATION {
1122 EISA_MEMORY_TYPE ConfigurationByte;
1124 USHORT AddressLowWord;
1125 UCHAR AddressHighByte;
1127 } EISA_MEMORY_CONFIGURATION, *PEISA_MEMORY_CONFIGURATION;
1128 #include <poppack.h>
1130 typedef struct _EISA_IRQ_DESCRIPTOR {
1131 UCHAR Interrupt : 4;
1133 UCHAR LevelTriggered : 1;
1135 UCHAR MoreEntries : 1;
1136 } EISA_IRQ_DESCRIPTOR, *PEISA_IRQ_DESCRIPTOR;
1138 typedef struct _EISA_IRQ_CONFIGURATION {
1139 EISA_IRQ_DESCRIPTOR ConfigurationByte;
1141 } EISA_IRQ_CONFIGURATION, *PEISA_IRQ_CONFIGURATION;
1143 typedef struct _DMA_CONFIGURATION_BYTE0 {
1147 UCHAR MoreEntries : 1;
1148 } DMA_CONFIGURATION_BYTE0;
1150 typedef struct _DMA_CONFIGURATION_BYTE1 {
1151 UCHAR Reserved0 : 2;
1152 UCHAR TransferSize : 2;
1154 UCHAR Reserved1 : 2;
1155 } DMA_CONFIGURATION_BYTE1;
1157 typedef struct _EISA_DMA_CONFIGURATION {
1158 DMA_CONFIGURATION_BYTE0 ConfigurationByte0;
1159 DMA_CONFIGURATION_BYTE1 ConfigurationByte1;
1160 } EISA_DMA_CONFIGURATION, *PEISA_DMA_CONFIGURATION;
1162 #include <pshpack1.h>
1163 typedef struct _EISA_PORT_DESCRIPTOR {
1164 UCHAR NumberPorts : 5;
1167 UCHAR MoreEntries : 1;
1168 } EISA_PORT_DESCRIPTOR, *PEISA_PORT_DESCRIPTOR;
1170 typedef struct _EISA_PORT_CONFIGURATION {
1171 EISA_PORT_DESCRIPTOR Configuration;
1173 } EISA_PORT_CONFIGURATION, *PEISA_PORT_CONFIGURATION;
1174 #include <poppack.h>
1176 typedef struct _CM_EISA_FUNCTION_INFORMATION {
1180 UCHAR MinorRevision;
1181 UCHAR MajorRevision;
1182 UCHAR Selections[26];
1183 UCHAR FunctionFlags;
1184 UCHAR TypeString[80];
1185 EISA_MEMORY_CONFIGURATION EisaMemory[9];
1186 EISA_IRQ_CONFIGURATION EisaIrq[7];
1187 EISA_DMA_CONFIGURATION EisaDma[4];
1188 EISA_PORT_CONFIGURATION EisaPort[20];
1189 UCHAR InitializationData[60];
1190 } CM_EISA_FUNCTION_INFORMATION, *PCM_EISA_FUNCTION_INFORMATION;
1192 /* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */
1194 #define EISA_FUNCTION_ENABLED 0x80
1195 #define EISA_FREE_FORM_DATA 0x40
1196 #define EISA_HAS_PORT_INIT_ENTRY 0x20
1197 #define EISA_HAS_PORT_RANGE 0x10
1198 #define EISA_HAS_DMA_ENTRY 0x08
1199 #define EISA_HAS_IRQ_ENTRY 0x04
1200 #define EISA_HAS_MEMORY_ENTRY 0x02
1201 #define EISA_HAS_TYPE_ENTRY 0x01
1202 #define EISA_HAS_INFORMATION \
1203 (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \
1204 + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY)
1206 typedef struct _CM_EISA_SLOT_INFORMATION {
1209 UCHAR MajorRevision;
1210 UCHAR MinorRevision;
1212 UCHAR NumberFunctions;
1213 UCHAR FunctionInformation;
1215 } CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION;
1217 /* CM_EISA_SLOT_INFORMATION.ReturnCode */
1219 #define EISA_INVALID_SLOT 0x80
1220 #define EISA_INVALID_FUNCTION 0x81
1221 #define EISA_INVALID_CONFIGURATION 0x82
1222 #define EISA_EMPTY_SLOT 0x83
1223 #define EISA_INVALID_BIOS_CALL 0x86
1225 typedef struct _CM_FLOPPY_DEVICE_DATA {
1231 UCHAR StepRateHeadUnloadTime;
1234 UCHAR SectorLengthCode;
1235 UCHAR SectorPerTrack;
1236 UCHAR ReadWriteGapLength;
1237 UCHAR DataTransferLength;
1238 UCHAR FormatGapLength;
1239 UCHAR FormatFillCharacter;
1240 UCHAR HeadSettleTime;
1241 UCHAR MotorSettleTime;
1242 UCHAR MaximumTrackValue;
1243 UCHAR DataTransferRate;
1244 } CM_FLOPPY_DEVICE_DATA, *PCM_FLOPPY_DEVICE_DATA;
1246 typedef enum _INTERFACE_TYPE {
1247 InterfaceTypeUndefined = -1,
1264 MaximumInterfaceType
1265 } INTERFACE_TYPE, *PINTERFACE_TYPE;
1267 typedef struct _PNP_BUS_INFORMATION {
1269 INTERFACE_TYPE LegacyBusType;
1271 } PNP_BUS_INFORMATION, *PPNP_BUS_INFORMATION;
1273 #include <pshpack1.h>
1274 typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR {
1276 UCHAR ShareDisposition;
1280 PHYSICAL_ADDRESS Start;
1284 PHYSICAL_ADDRESS Start;
1293 PHYSICAL_ADDRESS Start;
1313 } DeviceSpecificData;
1315 } CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;
1317 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Type */
1319 #define CmResourceTypeNull 0
1320 #define CmResourceTypePort 1
1321 #define CmResourceTypeInterrupt 2
1322 #define CmResourceTypeMemory 3
1323 #define CmResourceTypeDma 4
1324 #define CmResourceTypeDeviceSpecific 5
1325 #define CmResourceTypeBusNumber 6
1326 #define CmResourceTypeMaximum 7
1327 #define CmResourceTypeNonArbitrated 128
1328 #define CmResourceTypeConfigData 128
1329 #define CmResourceTypeDevicePrivate 129
1330 #define CmResourceTypePcCardConfig 130
1331 #define CmResourceTypeMfCardConfig 131
1333 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.ShareDisposition */
1335 typedef enum _CM_SHARE_DISPOSITION {
1336 CmResourceShareUndetermined,
1337 CmResourceShareDeviceExclusive,
1338 CmResourceShareDriverExclusive,
1339 CmResourceShareShared
1340 } CM_SHARE_DISPOSITION;
1342 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypePort */
1344 #define CM_RESOURCE_PORT_MEMORY 0x0000
1345 #define CM_RESOURCE_PORT_IO 0x0001
1346 #define CM_RESOURCE_PORT_10_BIT_DECODE 0x0004
1347 #define CM_RESOURCE_PORT_12_BIT_DECODE 0x0008
1348 #define CM_RESOURCE_PORT_16_BIT_DECODE 0x0010
1349 #define CM_RESOURCE_PORT_POSITIVE_DECODE 0x0020
1350 #define CM_RESOURCE_PORT_PASSIVE_DECODE 0x0040
1351 #define CM_RESOURCE_PORT_WINDOW_DECODE 0x0080
1353 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeInterrupt */
1355 #define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0x0000
1356 #define CM_RESOURCE_INTERRUPT_LATCHED 0x0001
1358 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeMemory */
1360 #define CM_RESOURCE_MEMORY_READ_WRITE 0x0000
1361 #define CM_RESOURCE_MEMORY_READ_ONLY 0x0001
1362 #define CM_RESOURCE_MEMORY_WRITE_ONLY 0x0002
1363 #define CM_RESOURCE_MEMORY_PREFETCHABLE 0x0004
1364 #define CM_RESOURCE_MEMORY_COMBINEDWRITE 0x0008
1365 #define CM_RESOURCE_MEMORY_24 0x0010
1366 #define CM_RESOURCE_MEMORY_CACHEABLE 0x0020
1368 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeDma */
1370 #define CM_RESOURCE_DMA_8 0x0000
1371 #define CM_RESOURCE_DMA_16 0x0001
1372 #define CM_RESOURCE_DMA_32 0x0002
1373 #define CM_RESOURCE_DMA_8_AND_16 0x0004
1374 #define CM_RESOURCE_DMA_BUS_MASTER 0x0008
1375 #define CM_RESOURCE_DMA_TYPE_A 0x0010
1376 #define CM_RESOURCE_DMA_TYPE_B 0x0020
1377 #define CM_RESOURCE_DMA_TYPE_F 0x0040
1379 typedef struct _CM_PARTIAL_RESOURCE_LIST {
1383 CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1];
1384 } CM_PARTIAL_RESOURCE_LIST, *PCM_PARTIAL_RESOURCE_LIST;
1386 typedef struct _CM_FULL_RESOURCE_DESCRIPTOR {
1387 INTERFACE_TYPE InterfaceType;
1389 CM_PARTIAL_RESOURCE_LIST PartialResourceList;
1390 } CM_FULL_RESOURCE_DESCRIPTOR, *PCM_FULL_RESOURCE_DESCRIPTOR;
1392 typedef struct _CM_RESOURCE_LIST {
1394 CM_FULL_RESOURCE_DESCRIPTOR List[1];
1395 } CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;
1397 typedef struct _CM_INT13_DRIVE_PARAMETER {
1400 USHORT SectorsPerTrack;
1402 USHORT NumberDrives;
1403 } CM_INT13_DRIVE_PARAMETER, *PCM_INT13_DRIVE_PARAMETER;
1404 #include <poppack.h>
1406 typedef struct _CM_KEYBOARD_DEVICE_DATA {
1411 USHORT KeyboardFlags;
1412 } CM_KEYBOARD_DEVICE_DATA, *PCM_KEYBOARD_DEVICE_DATA;
1414 #define KEYBOARD_INSERT_ON 0x80
1415 #define KEYBOARD_CAPS_LOCK_ON 0x40
1416 #define KEYBOARD_NUM_LOCK_ON 0x20
1417 #define KEYBOARD_SCROLL_LOCK_ON 0x10
1418 #define KEYBOARD_ALT_KEY_DOWN 0x08
1419 #define KEYBOARD_CTRL_KEY_DOWN 0x04
1420 #define KEYBOARD_LEFT_SHIFT_DOWN 0x02
1421 #define KEYBOARD_RIGHT_SHIFT_DOWN 0x01
1423 typedef struct _CM_MCA_POS_DATA {
1429 } CM_MCA_POS_DATA, *PCM_MCA_POS_DATA;
1431 typedef struct CM_Power_Data_s {
1433 DEVICE_POWER_STATE PD_MostRecentPowerState;
1434 ULONG PD_Capabilities;
1438 DEVICE_POWER_STATE PD_PowerStateMapping[PowerSystemMaximum];
1439 } CM_POWER_DATA, *PCM_POWER_DATA;
1441 #define PDCAP_D0_SUPPORTED 0x00000001
1442 #define PDCAP_D1_SUPPORTED 0x00000002
1443 #define PDCAP_D2_SUPPORTED 0x00000004
1444 #define PDCAP_D3_SUPPORTED 0x00000008
1445 #define PDCAP_WAKE_FROM_D0_SUPPORTED 0x00000010
1446 #define PDCAP_WAKE_FROM_D1_SUPPORTED 0x00000020
1447 #define PDCAP_WAKE_FROM_D2_SUPPORTED 0x00000040
1448 #define PDCAP_WAKE_FROM_D3_SUPPORTED 0x00000080
1449 #define PDCAP_WARM_EJECT_SUPPORTED 0x00000100
1451 typedef struct _CM_SCSI_DEVICE_DATA {
1454 UCHAR HostIdentifier;
1455 } CM_SCSI_DEVICE_DATA, *PCM_SCSI_DEVICE_DATA;
1457 typedef struct _CM_SERIAL_DEVICE_DATA {
1461 } CM_SERIAL_DEVICE_DATA, *PCM_SERIAL_DEVICE_DATA;
1463 /* IO_RESOURCE_DESCRIPTOR.Option */
1465 #define IO_RESOURCE_PREFERRED 0x01
1466 #define IO_RESOURCE_DEFAULT 0x02
1467 #define IO_RESOURCE_ALTERNATIVE 0x08
1469 typedef struct _IO_RESOURCE_DESCRIPTOR {
1472 UCHAR ShareDisposition;
1480 PHYSICAL_ADDRESS MinimumAddress;
1481 PHYSICAL_ADDRESS MaximumAddress;
1486 PHYSICAL_ADDRESS MinimumAddress;
1487 PHYSICAL_ADDRESS MaximumAddress;
1490 ULONG MinimumVector;
1491 ULONG MaximumVector;
1494 ULONG MinimumChannel;
1495 ULONG MaximumChannel;
1500 PHYSICAL_ADDRESS MinimumAddress;
1501 PHYSICAL_ADDRESS MaximumAddress;
1518 } IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
1520 typedef struct _IO_RESOURCE_LIST {
1524 IO_RESOURCE_DESCRIPTOR Descriptors[1];
1525 } IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;
1527 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {
1529 INTERFACE_TYPE InterfaceType;
1533 ULONG AlternativeLists;
1534 IO_RESOURCE_LIST List[1];
1535 } IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
1537 typedef struct _CONTROLLER_OBJECT {
1540 PVOID ControllerExtension;
1541 KDEVICE_QUEUE DeviceWaitQueue;
1543 LARGE_INTEGER Spare2;
1544 } CONTROLLER_OBJECT, *PCONTROLLER_OBJECT;
1546 typedef enum _DMA_WIDTH {
1551 } DMA_WIDTH, *PDMA_WIDTH;
1553 typedef enum _DMA_SPEED {
1560 } DMA_SPEED, *PDMA_SPEED;
1562 /* DEVICE_DESCRIPTION.Version */
1564 #define DEVICE_DESCRIPTION_VERSION 0x0000
1565 #define DEVICE_DESCRIPTION_VERSION1 0x0001
1566 #define DEVICE_DESCRIPTION_VERSION2 0x0002
1568 typedef struct _DEVICE_DESCRIPTION {
1571 BOOLEAN ScatterGather;
1573 BOOLEAN AutoInitialize;
1574 BOOLEAN Dma32BitAddresses;
1575 BOOLEAN IgnoreCount;
1577 BOOLEAN Dma64BitAddresses;
1580 INTERFACE_TYPE InterfaceType;
1583 ULONG MaximumLength;
1585 } DEVICE_DESCRIPTION, *PDEVICE_DESCRIPTION;
1588 #define VPB_MOUNTED 0x0001
1589 #define VPB_LOCKED 0x0002
1590 #define VPB_PERSISTENT 0x0004
1591 #define VPB_REMOVE_PENDING 0x0008
1592 #define VPB_RAW_MOUNT 0x0010
1594 #define MAXIMUM_VOLUME_LABEL_LENGTH (32 * sizeof(WCHAR))
1596 typedef struct _VPB {
1600 USHORT VolumeLabelLength;
1601 struct _DEVICE_OBJECT *DeviceObject;
1602 struct _DEVICE_OBJECT *RealDevice;
1604 ULONG ReferenceCount;
1605 WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)];
1608 /* DEVICE_OBJECT.Flags */
1610 #define DO_VERIFY_VOLUME 0x00000002
1611 #define DO_BUFFERED_IO 0x00000004
1612 #define DO_EXCLUSIVE 0x00000008
1613 #define DO_DIRECT_IO 0x00000010
1614 #define DO_MAP_IO_BUFFER 0x00000020
1615 #define DO_DEVICE_HAS_NAME 0x00000040
1616 #define DO_DEVICE_INITIALIZING 0x00000080
1617 #define DO_SYSTEM_BOOT_PARTITION 0x00000100
1618 #define DO_LONG_TERM_REQUESTS 0x00000200
1619 #define DO_NEVER_LAST_DEVICE 0x00000400
1620 #define DO_SHUTDOWN_REGISTERED 0x00000800
1621 #define DO_BUS_ENUMERATED_DEVICE 0x00001000
1622 #define DO_POWER_PAGABLE 0x00002000
1623 #define DO_POWER_INRUSH 0x00004000
1624 #define DO_LOW_PRIORITY_FILESYSTEM 0x00010000
1626 /* DEVICE_OBJECT.Characteristics */
1628 #define FILE_REMOVABLE_MEDIA 0x00000001
1629 #define FILE_READ_ONLY_DEVICE 0x00000002
1630 #define FILE_FLOPPY_DISKETTE 0x00000004
1631 #define FILE_WRITE_ONCE_MEDIA 0x00000008
1632 #define FILE_REMOTE_DEVICE 0x00000010
1633 #define FILE_DEVICE_IS_MOUNTED 0x00000020
1634 #define FILE_VIRTUAL_VOLUME 0x00000040
1635 #define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080
1636 #define FILE_DEVICE_SECURE_OPEN 0x00000100
1638 /* DEVICE_OBJECT.AlignmentRequirement */
1640 #define FILE_BYTE_ALIGNMENT 0x00000000
1641 #define FILE_WORD_ALIGNMENT 0x00000001
1642 #define FILE_LONG_ALIGNMENT 0x00000003
1643 #define FILE_QUAD_ALIGNMENT 0x00000007
1644 #define FILE_OCTA_ALIGNMENT 0x0000000f
1645 #define FILE_32_BYTE_ALIGNMENT 0x0000001f
1646 #define FILE_64_BYTE_ALIGNMENT 0x0000003f
1647 #define FILE_128_BYTE_ALIGNMENT 0x0000007f
1648 #define FILE_256_BYTE_ALIGNMENT 0x000000ff
1649 #define FILE_512_BYTE_ALIGNMENT 0x000001ff
1651 /* DEVICE_OBJECT.DeviceType */
1653 #define DEVICE_TYPE ULONG
1655 #define FILE_DEVICE_BEEP 0x00000001
1656 #define FILE_DEVICE_CD_ROM 0x00000002
1657 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
1658 #define FILE_DEVICE_CONTROLLER 0x00000004
1659 #define FILE_DEVICE_DATALINK 0x00000005
1660 #define FILE_DEVICE_DFS 0x00000006
1661 #define FILE_DEVICE_DISK 0x00000007
1662 #define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
1663 #define FILE_DEVICE_FILE_SYSTEM 0x00000009
1664 #define FILE_DEVICE_INPORT_PORT 0x0000000a
1665 #define FILE_DEVICE_KEYBOARD 0x0000000b
1666 #define FILE_DEVICE_MAILSLOT 0x0000000c
1667 #define FILE_DEVICE_MIDI_IN 0x0000000d
1668 #define FILE_DEVICE_MIDI_OUT 0x0000000e
1669 #define FILE_DEVICE_MOUSE 0x0000000f
1670 #define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010
1671 #define FILE_DEVICE_NAMED_PIPE 0x00000011
1672 #define FILE_DEVICE_NETWORK 0x00000012
1673 #define FILE_DEVICE_NETWORK_BROWSER 0x00000013
1674 #define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
1675 #define FILE_DEVICE_NULL 0x00000015
1676 #define FILE_DEVICE_PARALLEL_PORT 0x00000016
1677 #define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017
1678 #define FILE_DEVICE_PRINTER 0x00000018
1679 #define FILE_DEVICE_SCANNER 0x00000019
1680 #define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a
1681 #define FILE_DEVICE_SERIAL_PORT 0x0000001b
1682 #define FILE_DEVICE_SCREEN 0x0000001c
1683 #define FILE_DEVICE_SOUND 0x0000001d
1684 #define FILE_DEVICE_STREAMS 0x0000001e
1685 #define FILE_DEVICE_TAPE 0x0000001f
1686 #define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
1687 #define FILE_DEVICE_TRANSPORT 0x00000021
1688 #define FILE_DEVICE_UNKNOWN 0x00000022
1689 #define FILE_DEVICE_VIDEO 0x00000023
1690 #define FILE_DEVICE_VIRTUAL_DISK 0x00000024
1691 #define FILE_DEVICE_WAVE_IN 0x00000025
1692 #define FILE_DEVICE_WAVE_OUT 0x00000026
1693 #define FILE_DEVICE_8042_PORT 0x00000027
1694 #define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
1695 #define FILE_DEVICE_BATTERY 0x00000029
1696 #define FILE_DEVICE_BUS_EXTENDER 0x0000002a
1697 #define FILE_DEVICE_MODEM 0x0000002b
1698 #define FILE_DEVICE_VDM 0x0000002c
1699 #define FILE_DEVICE_MASS_STORAGE 0x0000002d
1700 #define FILE_DEVICE_SMB 0x0000002e
1701 #define FILE_DEVICE_KS 0x0000002f
1702 #define FILE_DEVICE_CHANGER 0x00000030
1703 #define FILE_DEVICE_SMARTCARD 0x00000031
1704 #define FILE_DEVICE_ACPI 0x00000032
1705 #define FILE_DEVICE_DVD 0x00000033
1706 #define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034
1707 #define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035
1708 #define FILE_DEVICE_DFS_VOLUME 0x00000036
1709 #define FILE_DEVICE_SERENUM 0x00000037
1710 #define FILE_DEVICE_TERMSRV 0x00000038
1711 #define FILE_DEVICE_KSEC 0x00000039
1712 #define FILE_DEVICE_FIPS 0x0000003a
1714 typedef struct _DEVICE_OBJECT {
1717 LONG ReferenceCount;
1718 struct _DRIVER_OBJECT *DriverObject;
1719 struct _DEVICE_OBJECT *NextDevice;
1720 struct _DEVICE_OBJECT *AttachedDevice;
1721 struct _IRP *CurrentIrp;
1724 ULONG Characteristics;
1726 PVOID DeviceExtension;
1727 DEVICE_TYPE DeviceType;
1730 LIST_ENTRY ListEntry;
1731 WAIT_CONTEXT_BLOCK Wcb;
1733 ULONG AlignmentRequirement;
1734 KDEVICE_QUEUE DeviceQueue;
1736 ULONG ActiveThreadCount;
1737 PSECURITY_DESCRIPTOR SecurityDescriptor;
1741 struct _DEVOBJ_EXTENSION *DeviceObjectExtension;
1744 typedef struct _DEVICE_OBJECT *PDEVICE_OBJECT;
1746 typedef enum _DEVICE_RELATION_TYPE {
1751 TargetDeviceRelation,
1753 } DEVICE_RELATION_TYPE, *PDEVICE_RELATION_TYPE;
1755 typedef struct _DEVICE_RELATIONS {
1757 PDEVICE_OBJECT Objects[1];
1758 } DEVICE_RELATIONS, *PDEVICE_RELATIONS;
1760 typedef struct _SCATTER_GATHER_ELEMENT {
1761 PHYSICAL_ADDRESS Address;
1764 } SCATTER_GATHER_ELEMENT, *PSCATTER_GATHER_ELEMENT;
1766 typedef struct _SCATTER_GATHER_LIST {
1767 ULONG NumberOfElements;
1769 SCATTER_GATHER_ELEMENT Elements[0];
1770 } SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
1772 typedef struct _MDL {
1776 struct _EPROCESS *Process;
1777 PVOID MappedSystemVa;
1783 #define MDL_MAPPED_TO_SYSTEM_VA 0x0001
1784 #define MDL_PAGES_LOCKED 0x0002
1785 #define MDL_SOURCE_IS_NONPAGED_POOL 0x0004
1786 #define MDL_ALLOCATED_FIXED_SIZE 0x0008
1787 #define MDL_PARTIAL 0x0010
1788 #define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020
1789 #define MDL_IO_PAGE_READ 0x0040
1790 #define MDL_WRITE_OPERATION 0x0080
1791 #define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100
1792 #define MDL_FREE_EXTRA_PTES 0x0200
1793 #define MDL_IO_SPACE 0x0800
1794 #define MDL_NETWORK_HEADER 0x1000
1795 #define MDL_MAPPING_CAN_FAIL 0x2000
1796 #define MDL_ALLOCATED_MUST_SUCCEED 0x4000
1798 #define MDL_MAPPING_FLAGS ( \
1799 MDL_MAPPED_TO_SYSTEM_VA | \
1800 MDL_PAGES_LOCKED | \
1801 MDL_SOURCE_IS_NONPAGED_POOL | \
1802 MDL_PARTIAL_HAS_BEEN_MAPPED | \
1803 MDL_PARENT_MAPPED_SYSTEM_VA | \
1808 (*PPUT_DMA_ADAPTER)(
1809 /*IN*/ PDMA_ADAPTER DmaAdapter);
1811 typedef PVOID DDKAPI
1812 (*PALLOCATE_COMMON_BUFFER)(
1813 /*IN*/ PDMA_ADAPTER DmaAdapter,
1814 /*IN*/ ULONG Length,
1815 /*OUT*/ PPHYSICAL_ADDRESS LogicalAddress,
1816 /*IN*/ BOOLEAN CacheEnabled);
1819 (*PFREE_COMMON_BUFFER)(
1820 /*IN*/ PDMA_ADAPTER DmaAdapter,
1821 /*IN*/ ULONG Length,
1822 /*IN*/ PHYSICAL_ADDRESS LogicalAddress,
1823 /*IN*/ PVOID VirtualAddress,
1824 /*IN*/ BOOLEAN CacheEnabled);
1826 typedef NTSTATUS DDKAPI
1827 (*PALLOCATE_ADAPTER_CHANNEL)(
1828 /*IN*/ PDMA_ADAPTER DmaAdapter,
1829 /*IN*/ PDEVICE_OBJECT DeviceObject,
1830 /*IN*/ ULONG NumberOfMapRegisters,
1831 /*IN*/ PDRIVER_CONTROL ExecutionRoutine,
1832 /*IN*/ PVOID Context);
1834 typedef BOOLEAN DDKAPI
1835 (*PFLUSH_ADAPTER_BUFFERS)(
1836 /*IN*/ PDMA_ADAPTER DmaAdapter,
1838 /*IN*/ PVOID MapRegisterBase,
1839 /*IN*/ PVOID CurrentVa,
1840 /*IN*/ ULONG Length,
1841 /*IN*/ BOOLEAN WriteToDevice);
1844 (*PFREE_ADAPTER_CHANNEL)(
1845 /*IN*/ PDMA_ADAPTER DmaAdapter);
1848 (*PFREE_MAP_REGISTERS)(
1849 /*IN*/ PDMA_ADAPTER DmaAdapter,
1850 PVOID MapRegisterBase,
1851 ULONG NumberOfMapRegisters);
1853 typedef PHYSICAL_ADDRESS DDKAPI
1855 /*IN*/ PDMA_ADAPTER DmaAdapter,
1857 /*IN*/ PVOID MapRegisterBase,
1858 /*IN*/ PVOID CurrentVa,
1859 /*IN OUT*/ PULONG Length,
1860 /*IN*/ BOOLEAN WriteToDevice);
1862 typedef ULONG DDKAPI
1863 (*PGET_DMA_ALIGNMENT)(
1864 /*IN*/ PDMA_ADAPTER DmaAdapter);
1866 typedef ULONG DDKAPI
1867 (*PREAD_DMA_COUNTER)(
1868 /*IN*/ PDMA_ADAPTER DmaAdapter);
1870 typedef NTSTATUS DDKAPI
1871 (*PGET_SCATTER_GATHER_LIST)(
1872 /*IN*/ PDMA_ADAPTER DmaAdapter,
1873 /*IN*/ PDEVICE_OBJECT DeviceObject,
1875 /*IN*/ PVOID CurrentVa,
1876 /*IN*/ ULONG Length,
1877 /*IN*/ PDRIVER_LIST_CONTROL ExecutionRoutine,
1878 /*IN*/ PVOID Context,
1879 /*IN*/ BOOLEAN WriteToDevice);
1882 (*PPUT_SCATTER_GATHER_LIST)(
1883 /*IN*/ PDMA_ADAPTER DmaAdapter,
1884 /*IN*/ PSCATTER_GATHER_LIST ScatterGather,
1885 /*IN*/ BOOLEAN WriteToDevice);
1887 typedef NTSTATUS DDKAPI
1888 (*PCALCULATE_SCATTER_GATHER_LIST_SIZE)(
1889 /*IN*/ PDMA_ADAPTER DmaAdapter,
1890 /*IN*/ PMDL Mdl /*OPTIONAL*/,
1891 /*IN*/ PVOID CurrentVa,
1892 /*IN*/ ULONG Length,
1893 /*OUT*/ PULONG ScatterGatherListSize,
1894 /*OUT*/ PULONG pNumberOfMapRegisters /*OPTIONAL*/);
1896 typedef NTSTATUS DDKAPI
1897 (*PBUILD_SCATTER_GATHER_LIST)(
1898 /*IN*/ PDMA_ADAPTER DmaAdapter,
1899 /*IN*/ PDEVICE_OBJECT DeviceObject,
1901 /*IN*/ PVOID CurrentVa,
1902 /*IN*/ ULONG Length,
1903 /*IN*/ PDRIVER_LIST_CONTROL ExecutionRoutine,
1904 /*IN*/ PVOID Context,
1905 /*IN*/ BOOLEAN WriteToDevice,
1906 /*IN*/ PVOID ScatterGatherBuffer,
1907 /*IN*/ ULONG ScatterGatherLength);
1909 typedef NTSTATUS DDKAPI
1910 (*PBUILD_MDL_FROM_SCATTER_GATHER_LIST)(
1911 /*IN*/ PDMA_ADAPTER DmaAdapter,
1912 /*IN*/ PSCATTER_GATHER_LIST ScatterGather,
1913 /*IN*/ PMDL OriginalMdl,
1914 /*OUT*/ PMDL *TargetMdl);
1916 typedef struct _DMA_OPERATIONS {
1918 PPUT_DMA_ADAPTER PutDmaAdapter;
1919 PALLOCATE_COMMON_BUFFER AllocateCommonBuffer;
1920 PFREE_COMMON_BUFFER FreeCommonBuffer;
1921 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
1922 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
1923 PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
1924 PFREE_MAP_REGISTERS FreeMapRegisters;
1925 PMAP_TRANSFER MapTransfer;
1926 PGET_DMA_ALIGNMENT GetDmaAlignment;
1927 PREAD_DMA_COUNTER ReadDmaCounter;
1928 PGET_SCATTER_GATHER_LIST GetScatterGatherList;
1929 PPUT_SCATTER_GATHER_LIST PutScatterGatherList;
1930 PCALCULATE_SCATTER_GATHER_LIST_SIZE CalculateScatterGatherList;
1931 PBUILD_SCATTER_GATHER_LIST BuildScatterGatherList;
1932 PBUILD_MDL_FROM_SCATTER_GATHER_LIST BuildMdlFromScatterGatherList;
1933 } DMA_OPERATIONS, *PDMA_OPERATIONS;
1935 typedef struct _DMA_ADAPTER {
1938 PDMA_OPERATIONS DmaOperations;
1941 typedef enum _FILE_INFORMATION_CLASS {
1942 FileDirectoryInformation = 1,
1943 FileFullDirectoryInformation,
1944 FileBothDirectoryInformation,
1945 FileBasicInformation,
1946 FileStandardInformation,
1947 FileInternalInformation,
1949 FileAccessInformation,
1950 FileNameInformation,
1951 FileRenameInformation,
1952 FileLinkInformation,
1953 FileNamesInformation,
1954 FileDispositionInformation,
1955 FilePositionInformation,
1956 FileFullEaInformation,
1957 FileModeInformation,
1958 FileAlignmentInformation,
1960 FileAllocationInformation,
1961 FileEndOfFileInformation,
1962 FileAlternateNameInformation,
1963 FileStreamInformation,
1964 FilePipeInformation,
1965 FilePipeLocalInformation,
1966 FilePipeRemoteInformation,
1967 FileMailslotQueryInformation,
1968 FileMailslotSetInformation,
1969 FileCompressionInformation,
1970 FileObjectIdInformation,
1971 FileCompletionInformation,
1972 FileMoveClusterInformation,
1973 FileQuotaInformation,
1974 FileReparsePointInformation,
1975 FileNetworkOpenInformation,
1976 FileAttributeTagInformation,
1977 FileTrackingInformation,
1978 FileIdBothDirectoryInformation,
1979 FileIdFullDirectoryInformation,
1980 FileValidDataLengthInformation,
1981 FileShortNameInformation,
1982 FileMaximumInformation
1983 } FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
1985 typedef struct _FILE_POSITION_INFORMATION {
1986 LARGE_INTEGER CurrentByteOffset;
1987 } FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;
1989 typedef struct _FILE_ALIGNMENT_INFORMATION {
1990 ULONG AlignmentRequirement;
1991 } FILE_ALIGNMENT_INFORMATION;
1993 typedef struct _FILE_NAME_INFORMATION {
1994 ULONG FileNameLength;
1996 } FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;
1998 typedef struct _FILE_BASIC_INFORMATION {
1999 LARGE_INTEGER CreationTime;
2000 LARGE_INTEGER LastAccessTime;
2001 LARGE_INTEGER LastWriteTime;
2002 LARGE_INTEGER ChangeTime;
2003 ULONG FileAttributes;
2004 } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
2006 typedef struct _FILE_STANDARD_INFORMATION {
2007 LARGE_INTEGER AllocationSize;
2008 LARGE_INTEGER EndOfFile;
2009 ULONG NumberOfLinks;
2010 BOOLEAN DeletePending;
2012 } FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
2014 typedef struct _FILE_NETWORK_OPEN_INFORMATION {
2015 LARGE_INTEGER CreationTime;
2016 LARGE_INTEGER LastAccessTime;
2017 LARGE_INTEGER LastWriteTime;
2018 LARGE_INTEGER ChangeTime;
2019 LARGE_INTEGER AllocationSize;
2020 LARGE_INTEGER EndOfFile;
2021 ULONG FileAttributes;
2022 } FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;
2024 typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION {
2025 ULONG FileAttributes;
2027 } FILE_ATTRIBUTE_TAG_INFORMATION, *PFILE_ATTRIBUTE_TAG_INFORMATION;
2029 typedef struct _FILE_DISPOSITION_INFORMATION {
2030 BOOLEAN DoDeleteFile;
2031 } FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION;
2033 typedef struct _FILE_END_OF_FILE_INFORMATION {
2034 LARGE_INTEGER EndOfFile;
2035 } FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION;
2037 typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION {
2038 LARGE_INTEGER ValidDataLength;
2039 } FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION;
2041 typedef enum _FSINFOCLASS {
2042 FileFsVolumeInformation = 1,
2043 FileFsLabelInformation,
2044 FileFsSizeInformation,
2045 FileFsDeviceInformation,
2046 FileFsAttributeInformation,
2047 FileFsControlInformation,
2048 FileFsFullSizeInformation,
2049 FileFsObjectIdInformation,
2050 FileFsDriverPathInformation,
2051 FileFsMaximumInformation
2052 } FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
2054 typedef struct _FILE_FS_DEVICE_INFORMATION {
2055 DEVICE_TYPE DeviceType;
2056 ULONG Characteristics;
2057 } FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;
2059 typedef struct _FILE_FULL_EA_INFORMATION {
2060 ULONG NextEntryOffset;
2063 USHORT EaValueLength;
2065 } FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
2067 typedef ULONG_PTR ERESOURCE_THREAD;
2068 typedef ERESOURCE_THREAD *PERESOURCE_THREAD;
2070 typedef struct _OWNER_ENTRY {
2071 ERESOURCE_THREAD OwnerThread;
2072 _ANONYMOUS_UNION union {
2076 } OWNER_ENTRY, *POWNER_ENTRY;
2078 /* ERESOURCE.Flag */
2080 #define ResourceNeverExclusive 0x0010
2081 #define ResourceReleaseByOtherThread 0x0020
2082 #define ResourceOwnedExclusive 0x0080
2084 #define RESOURCE_HASH_TABLE_SIZE 64
2086 typedef struct _ERESOURCE {
2087 LIST_ENTRY SystemResourcesList;
2088 POWNER_ENTRY OwnerTable;
2091 PKSEMAPHORE SharedWaiters;
2092 PKEVENT ExclusiveWaiters;
2093 OWNER_ENTRY OwnerThreads[2];
2094 ULONG ContentionCount;
2095 USHORT NumberOfSharedWaiters;
2096 USHORT NumberOfExclusiveWaiters;
2097 _ANONYMOUS_UNION union {
2099 ULONG_PTR CreatorBackTraceIndex;
2101 KSPIN_LOCK SpinLock;
2102 } ERESOURCE, *PERESOURCE;
2104 /* NOTE: PVOID for methods to avoid 'assignment from incompatible pointer type' warning */
2105 typedef struct _DRIVER_EXTENSION {
2106 struct _DRIVER_OBJECT *DriverObject;
2109 UNICODE_STRING ServiceKeyName;
2110 } DRIVER_EXTENSION, *PDRIVER_EXTENSION;
2112 typedef BOOLEAN DDKAPI
2113 (*PFAST_IO_CHECK_IF_POSSIBLE)(
2114 /*IN*/ struct _FILE_OBJECT *FileObject,
2115 /*IN*/ PLARGE_INTEGER FileOffset,
2116 /*IN*/ ULONG Length,
2117 /*IN*/ BOOLEAN Wait,
2118 /*IN*/ ULONG LockKey,
2119 /*IN*/ BOOLEAN CheckForReadOperation,
2120 /*OUT*/ PIO_STATUS_BLOCK IoStatus,
2121 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2123 typedef BOOLEAN DDKAPI
2125 /*IN*/ struct _FILE_OBJECT *FileObject,
2126 /*IN*/ PLARGE_INTEGER FileOffset,
2127 /*IN*/ ULONG Length,
2128 /*IN*/ BOOLEAN Wait,
2129 /*IN*/ ULONG LockKey,
2130 /*OUT*/ PVOID Buffer,
2131 /*OUT*/ PIO_STATUS_BLOCK IoStatus,
2132 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2134 typedef BOOLEAN DDKAPI
2136 /*IN*/ struct _FILE_OBJECT *FileObject,
2137 /*IN*/ PLARGE_INTEGER FileOffset,
2138 /*IN*/ ULONG Length,
2139 /*IN*/ BOOLEAN Wait,
2140 /*IN*/ ULONG LockKey,
2141 /*IN*/ PVOID Buffer,
2142 /*OUT*/ PIO_STATUS_BLOCK IoStatus,
2143 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2145 typedef BOOLEAN DDKAPI
2146 (*PFAST_IO_QUERY_BASIC_INFO)(
2147 /*IN*/ struct _FILE_OBJECT *FileObject,
2148 /*IN*/ BOOLEAN Wait,
2149 /*OUT*/ PFILE_BASIC_INFORMATION Buffer,
2150 /*OUT*/ PIO_STATUS_BLOCK IoStatus,
2151 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2153 typedef BOOLEAN DDKAPI
2154 (*PFAST_IO_QUERY_STANDARD_INFO)(
2155 /*IN*/ struct _FILE_OBJECT *FileObject,
2156 /*IN*/ BOOLEAN Wait,
2157 /*OUT*/ PFILE_STANDARD_INFORMATION Buffer,
2158 /*OUT*/ PIO_STATUS_BLOCK IoStatus,
2159 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2161 typedef BOOLEAN DDKAPI
2163 /*IN*/ struct _FILE_OBJECT *FileObject,
2164 /*IN*/ PLARGE_INTEGER FileOffset,
2165 /*IN*/ PLARGE_INTEGER Length,
2166 PEPROCESS ProcessId,
2168 BOOLEAN FailImmediately,
2169 BOOLEAN ExclusiveLock,
2170 /*OUT*/ PIO_STATUS_BLOCK IoStatus,
2171 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2173 typedef BOOLEAN DDKAPI
2174 (*PFAST_IO_UNLOCK_SINGLE)(
2175 /*IN*/ struct _FILE_OBJECT *FileObject,
2176 /*IN*/ PLARGE_INTEGER FileOffset,
2177 /*IN*/ PLARGE_INTEGER Length,
2178 PEPROCESS ProcessId,
2180 /*OUT*/ PIO_STATUS_BLOCK IoStatus,
2181 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2183 typedef BOOLEAN DDKAPI
2184 (*PFAST_IO_UNLOCK_ALL)(
2185 /*IN*/ struct _FILE_OBJECT *FileObject,
2186 PEPROCESS ProcessId,
2187 /*OUT*/ PIO_STATUS_BLOCK IoStatus,
2188 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2190 typedef BOOLEAN DDKAPI
2191 (*PFAST_IO_UNLOCK_ALL_BY_KEY)(
2192 /*IN*/ struct _FILE_OBJECT *FileObject,
2195 /*OUT*/ PIO_STATUS_BLOCK IoStatus,
2196 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2198 typedef BOOLEAN DDKAPI
2199 (*PFAST_IO_DEVICE_CONTROL)(
2200 /*IN*/ struct _FILE_OBJECT *FileObject,
2201 /*IN*/ BOOLEAN Wait,
2202 /*IN*/ PVOID InputBuffer /*OPTIONAL*/,
2203 /*IN*/ ULONG InputBufferLength,
2204 /*OUT*/ PVOID OutputBuffer /*OPTIONAL*/,
2205 /*IN*/ ULONG OutputBufferLength,
2206 /*IN*/ ULONG IoControlCode,
2207 /*OUT*/ PIO_STATUS_BLOCK IoStatus,
2208 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2211 (*PFAST_IO_ACQUIRE_FILE)(
2212 /*IN*/ struct _FILE_OBJECT *FileObject);
2215 (*PFAST_IO_RELEASE_FILE)(
2216 /*IN*/ struct _FILE_OBJECT *FileObject);
2219 (*PFAST_IO_DETACH_DEVICE)(
2220 /*IN*/ struct _DEVICE_OBJECT *SourceDevice,
2221 /*IN*/ struct _DEVICE_OBJECT *TargetDevice);
2223 typedef BOOLEAN DDKAPI
2224 (*PFAST_IO_QUERY_NETWORK_OPEN_INFO)(
2225 /*IN*/ struct _FILE_OBJECT *FileObject,
2226 /*IN*/ BOOLEAN Wait,
2227 /*OUT*/ struct _FILE_NETWORK_OPEN_INFORMATION *Buffer,
2228 /*OUT*/ struct _IO_STATUS_BLOCK *IoStatus,
2229 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2231 typedef NTSTATUS DDKAPI
2232 (*PFAST_IO_ACQUIRE_FOR_MOD_WRITE)(
2233 /*IN*/ struct _FILE_OBJECT *FileObject,
2234 /*IN*/ PLARGE_INTEGER EndingOffset,
2235 /*OUT*/ struct _ERESOURCE **ResourceToRelease,
2236 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2238 typedef BOOLEAN DDKAPI
2239 (*PFAST_IO_MDL_READ)(
2240 /*IN*/ struct _FILE_OBJECT *FileObject,
2241 /*IN*/ PLARGE_INTEGER FileOffset,
2242 /*IN*/ ULONG Length,
2243 /*IN*/ ULONG LockKey,
2244 /*OUT*/ PMDL *MdlChain,
2245 /*OUT*/ PIO_STATUS_BLOCK IoStatus,
2246 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2248 typedef BOOLEAN DDKAPI
2249 (*PFAST_IO_MDL_READ_COMPLETE)(
2250 /*IN*/ struct _FILE_OBJECT *FileObject,
2251 /*IN*/ PMDL MdlChain,
2252 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2254 typedef BOOLEAN DDKAPI
2255 (*PFAST_IO_PREPARE_MDL_WRITE)(
2256 /*IN*/ struct _FILE_OBJECT *FileObject,
2257 /*IN*/ PLARGE_INTEGER FileOffset,
2258 /*IN*/ ULONG Length,
2259 /*IN*/ ULONG LockKey,
2260 /*OUT*/ PMDL *MdlChain,
2261 /*OUT*/ PIO_STATUS_BLOCK IoStatus,
2262 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2264 typedef BOOLEAN DDKAPI
2265 (*PFAST_IO_MDL_WRITE_COMPLETE)(
2266 /*IN*/ struct _FILE_OBJECT *FileObject,
2267 /*IN*/ PLARGE_INTEGER FileOffset,
2268 /*IN*/ PMDL MdlChain,
2269 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2271 typedef BOOLEAN DDKAPI
2272 (*PFAST_IO_READ_COMPRESSED)(
2273 /*IN*/ struct _FILE_OBJECT *FileObject,
2274 /*IN*/ PLARGE_INTEGER FileOffset,
2275 /*IN*/ ULONG Length,
2276 /*IN*/ ULONG LockKey,
2277 /*OUT*/ PVOID Buffer,
2278 /*OUT*/ PMDL *MdlChain,
2279 /*OUT*/ PIO_STATUS_BLOCK IoStatus,
2280 /*OUT*/ struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
2281 /*IN*/ ULONG CompressedDataInfoLength,
2282 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2284 typedef BOOLEAN DDKAPI
2285 (*PFAST_IO_WRITE_COMPRESSED)(
2286 /*IN*/ struct _FILE_OBJECT *FileObject,
2287 /*IN*/ PLARGE_INTEGER FileOffset,
2288 /*IN*/ ULONG Length,
2289 /*IN*/ ULONG LockKey,
2290 /*IN*/ PVOID Buffer,
2291 /*OUT*/ PMDL *MdlChain,
2292 /*OUT*/ PIO_STATUS_BLOCK IoStatus,
2293 /*IN*/ struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
2294 /*IN*/ ULONG CompressedDataInfoLength,
2295 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2297 typedef BOOLEAN DDKAPI
2298 (*PFAST_IO_MDL_READ_COMPLETE_COMPRESSED)(
2299 /*IN*/ struct _FILE_OBJECT *FileObject,
2300 /*IN*/ PMDL MdlChain,
2301 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2303 typedef BOOLEAN DDKAPI
2304 (*PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED)(
2305 /*IN*/ struct _FILE_OBJECT *FileObject,
2306 /*IN*/ PLARGE_INTEGER FileOffset,
2307 /*IN*/ PMDL MdlChain,
2308 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2310 typedef BOOLEAN DDKAPI
2311 (*PFAST_IO_QUERY_OPEN)(
2312 /*IN*/ struct _IRP *Irp,
2313 /*OUT*/ PFILE_NETWORK_OPEN_INFORMATION NetworkInformation,
2314 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2316 typedef NTSTATUS DDKAPI
2317 (*PFAST_IO_RELEASE_FOR_MOD_WRITE)(
2318 /*IN*/ struct _FILE_OBJECT *FileObject,
2319 /*IN*/ struct _ERESOURCE *ResourceToRelease,
2320 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2322 typedef NTSTATUS DDKAPI
2323 (*PFAST_IO_ACQUIRE_FOR_CCFLUSH)(
2324 /*IN*/ struct _FILE_OBJECT *FileObject,
2325 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2327 typedef NTSTATUS DDKAPI
2328 (*PFAST_IO_RELEASE_FOR_CCFLUSH) (
2329 /*IN*/ struct _FILE_OBJECT *FileObject,
2330 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2332 typedef struct _FAST_IO_DISPATCH {
2333 ULONG SizeOfFastIoDispatch;
2334 PFAST_IO_CHECK_IF_POSSIBLE FastIoCheckIfPossible;
2335 PFAST_IO_READ FastIoRead;
2336 PFAST_IO_WRITE FastIoWrite;
2337 PFAST_IO_QUERY_BASIC_INFO FastIoQueryBasicInfo;
2338 PFAST_IO_QUERY_STANDARD_INFO FastIoQueryStandardInfo;
2339 PFAST_IO_LOCK FastIoLock;
2340 PFAST_IO_UNLOCK_SINGLE FastIoUnlockSingle;
2341 PFAST_IO_UNLOCK_ALL FastIoUnlockAll;
2342 PFAST_IO_UNLOCK_ALL_BY_KEY FastIoUnlockAllByKey;
2343 PFAST_IO_DEVICE_CONTROL FastIoDeviceControl;
2344 PFAST_IO_ACQUIRE_FILE AcquireFileForNtCreateSection;
2345 PFAST_IO_RELEASE_FILE ReleaseFileForNtCreateSection;
2346 PFAST_IO_DETACH_DEVICE FastIoDetachDevice;
2347 PFAST_IO_QUERY_NETWORK_OPEN_INFO FastIoQueryNetworkOpenInfo;
2348 PFAST_IO_ACQUIRE_FOR_MOD_WRITE AcquireForModWrite;
2349 PFAST_IO_MDL_READ MdlRead;
2350 PFAST_IO_MDL_READ_COMPLETE MdlReadComplete;
2351 PFAST_IO_PREPARE_MDL_WRITE PrepareMdlWrite;
2352 PFAST_IO_MDL_WRITE_COMPLETE MdlWriteComplete;
2353 PFAST_IO_READ_COMPRESSED FastIoReadCompressed;
2354 PFAST_IO_WRITE_COMPRESSED FastIoWriteCompressed;
2355 PFAST_IO_MDL_READ_COMPLETE_COMPRESSED MdlReadCompleteCompressed;
2356 PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED MdlWriteCompleteCompressed;
2357 PFAST_IO_QUERY_OPEN FastIoQueryOpen;
2358 PFAST_IO_RELEASE_FOR_MOD_WRITE ReleaseForModWrite;
2359 PFAST_IO_ACQUIRE_FOR_CCFLUSH AcquireForCcFlush;
2360 PFAST_IO_RELEASE_FOR_CCFLUSH ReleaseForCcFlush;
2361 } FAST_IO_DISPATCH, *PFAST_IO_DISPATCH;
2363 typedef struct _DRIVER_OBJECT {
2366 PDEVICE_OBJECT DeviceObject;
2370 PVOID DriverSection;
2371 PDRIVER_EXTENSION DriverExtension;
2372 UNICODE_STRING DriverName;
2373 PUNICODE_STRING HardwareDatabase;
2374 PFAST_IO_DISPATCH FastIoDispatch;
2375 PDRIVER_INITIALIZE DriverInit;
2376 PDRIVER_STARTIO DriverStartIo;
2377 PDRIVER_UNLOAD DriverUnload;
2378 PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
2380 typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT;
2382 typedef struct _SECTION_OBJECT_POINTERS {
2383 PVOID DataSectionObject;
2384 PVOID SharedCacheMap;
2385 PVOID ImageSectionObject;
2386 } SECTION_OBJECT_POINTERS, *PSECTION_OBJECT_POINTERS;
2388 typedef struct _IO_COMPLETION_CONTEXT {
2391 } IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT;
2393 /* FILE_OBJECT.Flags */
2395 #define FO_FILE_OPEN 0x00000001
2396 #define FO_SYNCHRONOUS_IO 0x00000002
2397 #define FO_ALERTABLE_IO 0x00000004
2398 #define FO_NO_INTERMEDIATE_BUFFERING 0x00000008
2399 #define FO_WRITE_THROUGH 0x00000010
2400 #define FO_SEQUENTIAL_ONLY 0x00000020
2401 #define FO_CACHE_SUPPORTED 0x00000040
2402 #define FO_NAMED_PIPE 0x00000080
2403 #define FO_STREAM_FILE 0x00000100
2404 #define FO_MAILSLOT 0x00000200
2405 #define FO_GENERATE_AUDIT_ON_CLOSE 0x00000400
2406 #define FO_DIRECT_DEVICE_OPEN 0x00000800
2407 #define FO_FILE_MODIFIED 0x00001000
2408 #define FO_FILE_SIZE_CHANGED 0x00002000
2409 #define FO_CLEANUP_COMPLETE 0x00004000
2410 #define FO_TEMPORARY_FILE 0x00008000
2411 #define FO_DELETE_ON_CLOSE 0x00010000
2412 #define FO_OPENED_CASE_SENSITIVE 0x00020000
2413 #define FO_HANDLE_CREATED 0x00040000
2414 #define FO_FILE_FAST_IO_READ 0x00080000
2415 #define FO_RANDOM_ACCESS 0x00100000
2416 #define FO_FILE_OPEN_CANCELLED 0x00200000
2417 #define FO_VOLUME_OPEN 0x00400000
2418 #define FO_FILE_OBJECT_HAS_EXTENSION 0x00800000
2419 #define FO_REMOTE_ORIGIN 0x01000000
2421 typedef struct _FILE_OBJECT {
2424 PDEVICE_OBJECT DeviceObject;
2428 PSECTION_OBJECT_POINTERS SectionObjectPointer;
2429 PVOID PrivateCacheMap;
2430 NTSTATUS FinalStatus;
2431 struct _FILE_OBJECT *RelatedFileObject;
2432 BOOLEAN LockOperation;
2433 BOOLEAN DeletePending;
2435 BOOLEAN WriteAccess;
2436 BOOLEAN DeleteAccess;
2438 BOOLEAN SharedWrite;
2439 BOOLEAN SharedDelete;
2441 UNICODE_STRING FileName;
2442 LARGE_INTEGER CurrentByteOffset;
2448 PIO_COMPLETION_CONTEXT CompletionContext;
2450 typedef struct _FILE_OBJECT *PFILE_OBJECT;
2452 typedef enum _SECURITY_OPERATION_CODE {
2453 SetSecurityDescriptor,
2454 QuerySecurityDescriptor,
2455 DeleteSecurityDescriptor,
2456 AssignSecurityDescriptor
2457 } SECURITY_OPERATION_CODE, *PSECURITY_OPERATION_CODE;
2459 #define INITIAL_PRIVILEGE_COUNT 3
2461 typedef struct _INITIAL_PRIVILEGE_SET {
2462 ULONG PrivilegeCount;
2464 LUID_AND_ATTRIBUTES Privilege[INITIAL_PRIVILEGE_COUNT];
2465 } INITIAL_PRIVILEGE_SET, * PINITIAL_PRIVILEGE_SET;
2467 typedef struct _SECURITY_SUBJECT_CONTEXT {
2468 PACCESS_TOKEN ClientToken;
2469 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
2470 PACCESS_TOKEN PrimaryToken;
2471 PVOID ProcessAuditId;
2472 } SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT;
2474 #include <pshpack4.h>
2475 typedef struct _ACCESS_STATE {
2477 BOOLEAN SecurityEvaluated;
2478 BOOLEAN GenerateAudit;
2479 BOOLEAN GenerateOnClose;
2480 BOOLEAN PrivilegesAllocated;
2482 ACCESS_MASK RemainingDesiredAccess;
2483 ACCESS_MASK PreviouslyGrantedAccess;
2484 ACCESS_MASK OriginalDesiredAccess;
2485 SECURITY_SUBJECT_CONTEXT SubjectSecurityContext;
2486 PSECURITY_DESCRIPTOR SecurityDescriptor;
2489 INITIAL_PRIVILEGE_SET InitialPrivilegeSet;
2490 PRIVILEGE_SET PrivilegeSet;
2493 BOOLEAN AuditPrivileges;
2494 UNICODE_STRING ObjectName;
2495 UNICODE_STRING ObjectTypeName;
2496 } ACCESS_STATE, *PACCESS_STATE;
2497 #include <poppack.h>
2499 typedef struct _IO_SECURITY_CONTEXT {
2500 PSECURITY_QUALITY_OF_SERVICE SecurityQos;
2501 PACCESS_STATE AccessState;
2502 ACCESS_MASK DesiredAccess;
2503 ULONG FullCreateOptions;
2504 } IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT;
2508 typedef struct _IO_CSQ_IRP_CONTEXT {
2511 struct _IO_CSQ *Csq;
2512 } IO_CSQ_IRP_CONTEXT, *PIO_CSQ_IRP_CONTEXT;
2515 (*PIO_CSQ_INSERT_IRP)(
2516 /*IN*/ struct _IO_CSQ *Csq,
2520 (*PIO_CSQ_REMOVE_IRP)(
2521 /*IN*/ struct _IO_CSQ *Csq,
2525 (*PIO_CSQ_PEEK_NEXT_IRP)(
2526 /*IN*/ struct _IO_CSQ *Csq,
2528 /*IN*/ PVOID PeekContext);
2531 (*PIO_CSQ_ACQUIRE_LOCK)(
2532 /*IN*/ struct _IO_CSQ *Csq,
2533 /*OUT*/ PKIRQL Irql);
2536 (*PIO_CSQ_RELEASE_LOCK)(
2537 /*IN*/ struct _IO_CSQ *Csq,
2541 (*PIO_CSQ_COMPLETE_CANCELED_IRP)(
2542 /*IN*/ struct _IO_CSQ *Csq,
2545 typedef struct _IO_CSQ {
2547 PIO_CSQ_INSERT_IRP CsqInsertIrp;
2548 PIO_CSQ_REMOVE_IRP CsqRemoveIrp;
2549 PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp;
2550 PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock;
2551 PIO_CSQ_RELEASE_LOCK CsqReleaseLock;
2552 PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp;
2553 PVOID ReservePointer;
2556 #include <pshpack4.h>
2557 typedef struct _IO_STACK_LOCATION {
2558 UCHAR MajorFunction;
2559 UCHAR MinorFunction;
2564 PIO_SECURITY_CONTEXT SecurityContext;
2566 USHORT POINTER_ALIGNMENT FileAttributes;
2568 ULONG POINTER_ALIGNMENT EaLength;
2572 ULONG POINTER_ALIGNMENT Key;
2573 LARGE_INTEGER ByteOffset;
2577 ULONG POINTER_ALIGNMENT Key;
2578 LARGE_INTEGER ByteOffset;
2582 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
2586 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
2587 PFILE_OBJECT FileObject;
2588 _ANONYMOUS_UNION union {
2589 _ANONYMOUS_STRUCT struct {
2590 BOOLEAN ReplaceIfExists;
2591 BOOLEAN AdvanceOnly;
2594 HANDLE DeleteHandle;
2599 FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass;
2602 ULONG OutputBufferLength;
2603 ULONG POINTER_ALIGNMENT InputBufferLength;
2604 ULONG POINTER_ALIGNMENT IoControlCode;
2605 PVOID Type3InputBuffer;
2608 SECURITY_INFORMATION SecurityInformation;
2609 ULONG POINTER_ALIGNMENT Length;
2612 SECURITY_INFORMATION SecurityInformation;
2613 PSECURITY_DESCRIPTOR SecurityDescriptor;
2617 PDEVICE_OBJECT DeviceObject;
2621 PDEVICE_OBJECT DeviceObject;
2624 struct _SCSI_REQUEST_BLOCK *Srb;
2627 DEVICE_RELATION_TYPE Type;
2628 } QueryDeviceRelations;
2630 CONST GUID *InterfaceType;
2633 PINTERFACE Interface;
2634 PVOID InterfaceSpecificData;
2637 PDEVICE_CAPABILITIES Capabilities;
2638 } DeviceCapabilities;
2640 PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList;
2641 } FilterResourceRequirements;
2646 ULONG POINTER_ALIGNMENT Length;
2652 BUS_QUERY_ID_TYPE IdType;
2655 DEVICE_TEXT_TYPE DeviceTextType;
2656 LCID POINTER_ALIGNMENT LocaleId;
2660 BOOLEAN Reserved[3];
2661 DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type;
2662 } UsageNotification;
2664 SYSTEM_POWER_STATE PowerState;
2667 PPOWER_SEQUENCE PowerSequence;
2670 ULONG SystemContext;
2671 POWER_STATE_TYPE POINTER_ALIGNMENT Type;
2672 POWER_STATE POINTER_ALIGNMENT State;
2673 POWER_ACTION POINTER_ALIGNMENT ShutdownType;
2676 PCM_RESOURCE_LIST AllocatedResources;
2677 PCM_RESOURCE_LIST AllocatedResourcesTranslated;
2680 ULONG_PTR ProviderId;
2692 PDEVICE_OBJECT DeviceObject;
2693 PFILE_OBJECT FileObject;
2694 PIO_COMPLETION_ROUTINE CompletionRoutine;
2696 } IO_STACK_LOCATION, *PIO_STACK_LOCATION;
2697 #include <poppack.h>
2699 /* IO_STACK_LOCATION.Control */
2701 #define SL_PENDING_RETURNED 0x01
2702 #define SL_INVOKE_ON_CANCEL 0x20
2703 #define SL_INVOKE_ON_SUCCESS 0x40
2704 #define SL_INVOKE_ON_ERROR 0x80
2706 typedef enum _KEY_INFORMATION_CLASS {
2707 KeyBasicInformation,
2711 KeyCachedInformation,
2713 } KEY_INFORMATION_CLASS;
2715 typedef struct _KEY_BASIC_INFORMATION {
2716 LARGE_INTEGER LastWriteTime;
2720 } KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION;
2722 typedef struct _KEY_FULL_INFORMATION {
2723 LARGE_INTEGER LastWriteTime;
2731 ULONG MaxValueNameLen;
2732 ULONG MaxValueDataLen;
2734 } KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION;
2736 typedef struct _KEY_NODE_INFORMATION {
2737 LARGE_INTEGER LastWriteTime;
2743 } KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION;
2745 typedef struct _KEY_VALUE_BASIC_INFORMATION {
2750 } KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION;
2752 typedef struct _KEY_VALUE_FULL_INFORMATION {
2759 } KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION;
2761 typedef struct _KEY_VALUE_PARTIAL_INFORMATION {
2766 } KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION;
2768 typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 {
2772 } KEY_VALUE_PARTIAL_INFORMATION_ALIGN64, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64;
2774 typedef struct _KEY_VALUE_ENTRY {
2775 PUNICODE_STRING ValueName;
2779 } KEY_VALUE_ENTRY, *PKEY_VALUE_ENTRY;
2781 typedef enum _KEY_VALUE_INFORMATION_CLASS {
2782 KeyValueBasicInformation,
2783 KeyValueFullInformation,
2784 KeyValuePartialInformation,
2785 KeyValueFullInformationAlign64,
2786 KeyValuePartialInformationAlign64
2787 } KEY_VALUE_INFORMATION_CLASS;
2789 /* KEY_VALUE_Xxx.Type */
2793 #define REG_EXPAND_SZ 2
2794 #define REG_BINARY 3
2796 #define REG_DWORD_LITTLE_ENDIAN 4
2797 #define REG_DWORD_BIG_ENDIAN 5
2799 #define REG_MULTI_SZ 7
2800 #define REG_RESOURCE_LIST 8
2801 #define REG_FULL_RESOURCE_DESCRIPTOR 9
2802 #define REG_RESOURCE_REQUIREMENTS_LIST 10
2803 #define REG_QWORD 11
2804 #define REG_QWORD_LITTLE_ENDIAN 11
2806 #define PCI_TYPE0_ADDRESSES 6
2807 #define PCI_TYPE1_ADDRESSES 2
2808 #define PCI_TYPE2_ADDRESSES 5
2810 typedef struct _PCI_COMMON_CONFIG {
2819 UCHAR CacheLineSize;
2824 struct _PCI_HEADER_TYPE_0 {
2825 ULONG BaseAddresses[PCI_TYPE0_ADDRESSES];
2829 ULONG ROMBaseAddress;
2830 UCHAR CapabilitiesPtr;
2833 UCHAR InterruptLine;
2836 UCHAR MaximumLatency;
2838 struct _PCI_HEADER_TYPE_1 {
2839 ULONG BaseAddresses[PCI_TYPE1_ADDRESSES];
2842 UCHAR SubordinateBus;
2843 UCHAR SecondaryLatency;
2846 USHORT SecondaryStatus;
2849 USHORT PrefetchBase;
2850 USHORT PrefetchLimit;
2851 ULONG PrefetchBaseUpper32;
2852 ULONG PrefetchLimitUpper32;
2853 USHORT IOBaseUpper16;
2854 USHORT IOLimitUpper16;
2855 UCHAR CapabilitiesPtr;
2857 ULONG ROMBaseAddress;
2858 UCHAR InterruptLine;
2860 USHORT BridgeControl;
2862 struct _PCI_HEADER_TYPE_2 {
2863 ULONG SocketRegistersBaseAddress;
2864 UCHAR CapabilitiesPtr;
2866 USHORT SecondaryStatus;
2869 UCHAR SubordinateBus;
2870 UCHAR SecondaryLatency;
2874 } Range[PCI_TYPE2_ADDRESSES - 1];
2875 UCHAR InterruptLine;
2877 USHORT BridgeControl;
2880 UCHAR DeviceSpecific[192];
2881 } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
2883 /* PCI_COMMON_CONFIG.Command */
2885 #define PCI_ENABLE_IO_SPACE 0x0001
2886 #define PCI_ENABLE_MEMORY_SPACE 0x0002
2887 #define PCI_ENABLE_BUS_MASTER 0x0004
2888 #define PCI_ENABLE_SPECIAL_CYCLES 0x0008
2889 #define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010
2890 #define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
2891 #define PCI_ENABLE_PARITY 0x0040
2892 #define PCI_ENABLE_WAIT_CYCLE 0x0080
2893 #define PCI_ENABLE_SERR 0x0100
2894 #define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200
2896 /* PCI_COMMON_CONFIG.Status */
2898 #define PCI_STATUS_CAPABILITIES_LIST 0x0010
2899 #define PCI_STATUS_66MHZ_CAPABLE 0x0020
2900 #define PCI_STATUS_UDF_SUPPORTED 0x0040
2901 #define PCI_STATUS_FAST_BACK_TO_BACK 0x0080
2902 #define PCI_STATUS_DATA_PARITY_DETECTED 0x0100
2903 #define PCI_STATUS_DEVSEL 0x0600
2904 #define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800
2905 #define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000
2906 #define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000
2907 #define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000
2908 #define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000
2910 /* PCI_COMMON_CONFIG.HeaderType */
2912 #define PCI_MULTIFUNCTION 0x80
2913 #define PCI_DEVICE_TYPE 0x00
2914 #define PCI_BRIDGE_TYPE 0x01
2915 #define PCI_CARDBUS_BRIDGE_TYPE 0x02
2917 #define PCI_CONFIGURATION_TYPE(PciData) \
2918 (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
2920 #define PCI_MULTIFUNCTION_DEVICE(PciData) \
2921 ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
2923 typedef struct _PCI_SLOT_NUMBER {
2926 ULONG DeviceNumber : 5;
2927 ULONG FunctionNumber : 3;
2928 ULONG Reserved : 24;
2932 } PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER;
2934 typedef enum _POOL_TYPE {
2937 NonPagedPoolMustSucceed,
2939 NonPagedPoolCacheAligned,
2940 PagedPoolCacheAligned,
2941 NonPagedPoolCacheAlignedMustS,
2943 NonPagedPoolSession = 32,
2945 NonPagedPoolMustSucceedSession,
2946 DontUseThisTypeSession,
2947 NonPagedPoolCacheAlignedSession,
2948 PagedPoolCacheAlignedSession,
2949 NonPagedPoolCacheAlignedMustSSession
2952 typedef enum _EX_POOL_PRIORITY {
2954 LowPoolPrioritySpecialPoolOverrun = 8,
2955 LowPoolPrioritySpecialPoolUnderrun = 9,
2956 NormalPoolPriority = 16,
2957 NormalPoolPrioritySpecialPoolOverrun = 24,
2958 NormalPoolPrioritySpecialPoolUnderrun = 25,
2959 HighPoolPriority = 32,
2960 HighPoolPrioritySpecialPoolOverrun = 40,
2961 HighPoolPrioritySpecialPoolUnderrun = 41
2964 /* PRIVILEGE_SET.Control */
2966 #define PRIVILEGE_SET_ALL_NECESSARY 1
2968 typedef struct _RTL_OSVERSIONINFOW {
2969 ULONG dwOSVersionInfoSize;
2970 ULONG dwMajorVersion;
2971 ULONG dwMinorVersion;
2972 ULONG dwBuildNumber;
2974 WCHAR szCSDVersion[128];
2975 } RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW;
2977 typedef struct _RTL_OSVERSIONINFOEXW {
2978 ULONG dwOSVersionInfoSize;
2979 ULONG dwMajorVersion;
2980 ULONG dwMinorVersion;
2981 ULONG dwBuildNumber;
2983 WCHAR szCSDVersion[128];
2984 USHORT wServicePackMajor;
2985 USHORT wServicePackMinor;
2989 } RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW;
2994 VerSetConditionMask(
2995 /*IN*/ ULONGLONG ConditionMask,
2996 /*IN*/ ULONG TypeMask,
2997 /*IN*/ UCHAR Condition);
2999 #define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType) \
3000 ((ConditionMask) = VerSetConditionMask((ConditionMask), \
3001 (TypeBitMask), (ComparisonType)))
3003 /* RtlVerifyVersionInfo() TypeMask */
3005 #define VER_MINORVERSION 0x0000001
3006 #define VER_MAJORVERSION 0x0000002
3007 #define VER_BUILDNUMBER 0x0000004
3008 #define VER_PLATFORMID 0x0000008
3009 #define VER_SERVICEPACKMINOR 0x0000010
3010 #define VER_SERVICEPACKMAJOR 0x0000020
3011 #define VER_SUITENAME 0x0000040
3012 #define VER_PRODUCT_TYPE 0x0000080
3014 /* RtlVerifyVersionInfo() ComparisonType */
3017 #define VER_GREATER 2
3018 #define VER_GREATER_EQUAL 3
3020 #define VER_LESS_EQUAL 5
3024 #define VER_CONDITION_MASK 7
3025 #define VER_NUM_BITS_PER_CONDITION_MASK 3
3027 typedef struct _RTL_BITMAP {
3030 } RTL_BITMAP, *PRTL_BITMAP;
3032 typedef struct _RTL_BITMAP_RUN {
3033 ULONG StartingIndex;
3035 } RTL_BITMAP_RUN, *PRTL_BITMAP_RUN;
3037 typedef NTSTATUS DDKAPI
3038 (*PRTL_QUERY_REGISTRY_ROUTINE)(
3039 /*IN*/ PWSTR ValueName,
3040 /*IN*/ ULONG ValueType,
3041 /*IN*/ PVOID ValueData,
3042 /*IN*/ ULONG ValueLength,
3043 /*IN*/ PVOID Context,
3044 /*IN*/ PVOID EntryContext);
3046 #define RTL_REGISTRY_ABSOLUTE 0
3047 #define RTL_REGISTRY_SERVICES 1
3048 #define RTL_REGISTRY_CONTROL 2
3049 #define RTL_REGISTRY_WINDOWS_NT 3
3050 #define RTL_REGISTRY_DEVICEMAP 4
3051 #define RTL_REGISTRY_USER 5
3053 /* RTL_QUERY_REGISTRY_TABLE.Flags */
3054 #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001
3055 #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002
3056 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004
3057 #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008
3058 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010
3059 #define RTL_QUERY_REGISTRY_DIRECT 0x00000020
3060 #define RTL_QUERY_REGISTRY_DELETE 0x00000040
3062 typedef struct _RTL_QUERY_REGISTRY_TABLE {
3063 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine;
3069 ULONG DefaultLength;
3070 } RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE;
3072 typedef struct _TIME_FIELDS {
3079 CSHORT Milliseconds;
3081 } TIME_FIELDS, *PTIME_FIELDS;
3083 typedef PVOID DDKAPI
3084 (*PALLOCATE_FUNCTION)(
3085 /*IN*/ POOL_TYPE PoolType,
3086 /*IN*/ SIZE_T NumberOfBytes,
3091 /*IN*/ PVOID Buffer);
3093 #define GENERAL_LOOKASIDE_S \
3094 SLIST_HEADER ListHead; \
3096 USHORT MaximumDepth; \
3097 ULONG TotalAllocates; \
3098 _ANONYMOUS_UNION union { \
3099 ULONG AllocateMisses; \
3100 ULONG AllocateHits; \
3103 _ANONYMOUS_UNION union { \
3106 } DUMMYUNIONNAME2; \
3110 PALLOCATE_FUNCTION Allocate; \
3111 PFREE_FUNCTION Free; \
3112 LIST_ENTRY ListEntry; \
3113 ULONG LastTotalAllocates; \
3114 _ANONYMOUS_UNION union { \
3115 ULONG LastAllocateMisses; \
3116 ULONG LastAllocateHits; \
3117 } DUMMYUNIONNAME3; \
3120 typedef struct _GENERAL_LOOKASIDE {
3122 } GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE;
3124 typedef struct _NPAGED_LOOKASIDE_LIST {
3126 KSPIN_LOCK Obsoleted;
3127 } NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST;
3129 typedef struct _PAGED_LOOKASIDE_LIST {
3131 FAST_MUTEX Obsoleted;
3132 } PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST;
3134 typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT;
3136 typedef VOID DDKAPI (*PCALLBACK_FUNCTION)(
3137 /*IN*/ PVOID CallbackContext,
3138 /*IN*/ PVOID Argument1,
3139 /*IN*/ PVOID Argument2);
3141 typedef enum _EVENT_TYPE {
3143 SynchronizationEvent
3146 typedef enum _KWAIT_REASON {
3177 typedef struct _KWAIT_BLOCK {
3178 LIST_ENTRY WaitListEntry;
3179 struct _KTHREAD * RESTRICTED_POINTER Thread;
3181 struct _KWAIT_BLOCK * RESTRICTED_POINTER NextWaitBlock;
3184 } KWAIT_BLOCK, *PKWAIT_BLOCK, *RESTRICTED_POINTER PRKWAIT_BLOCK;
3186 typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK;
3188 typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK {
3190 BOOLEAN Reserved[3];
3193 } IO_REMOVE_LOCK_COMMON_BLOCK;
3195 typedef struct _IO_REMOVE_LOCK_DBG_BLOCK {
3198 LONGLONG MaxLockedTicks;
3200 LIST_ENTRY LockList;
3202 LONG LowMemoryCount;
3205 PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks;
3206 } IO_REMOVE_LOCK_DBG_BLOCK;
3208 typedef struct _IO_REMOVE_LOCK {
3209 IO_REMOVE_LOCK_COMMON_BLOCK Common;
3211 IO_REMOVE_LOCK_DBG_BLOCK Dbg;
3213 } IO_REMOVE_LOCK, *PIO_REMOVE_LOCK;
3215 typedef struct _IO_WORKITEM *PIO_WORKITEM;
3218 (*PIO_WORKITEM_ROUTINE)(
3219 /*IN*/ PDEVICE_OBJECT DeviceObject,
3220 /*IN*/ PVOID Context);
3222 typedef struct _SHARE_ACCESS {
3230 } SHARE_ACCESS, *PSHARE_ACCESS;
3232 typedef enum _KINTERRUPT_MODE {
3238 (*PKINTERRUPT_ROUTINE)(
3241 typedef enum _KPROFILE_SOURCE {
3243 ProfileAlignmentFixup,
3246 ProfileLoadInstructions,
3247 ProfilePipelineFrozen,
3248 ProfileBranchInstructions,
3249 ProfileTotalNonissues,
3250 ProfileDcacheMisses,
3251 ProfileIcacheMisses,
3253 ProfileBranchMispredictions,
3254 ProfileStoreInstructions,
3255 ProfileFpInstructions,
3256 ProfileIntegerInstructions,
3260 ProfileSpecialInstructions,
3262 ProfileIcacheIssues,
3263 ProfileDcacheAccesses,
3264 ProfileMemoryBarrierCycles,
3265 ProfileLoadLinkedIssues,
3269 typedef enum _CREATE_FILE_TYPE {
3271 CreateFileTypeNamedPipe,
3272 CreateFileTypeMailslot
3275 typedef struct _CONFIGURATION_INFORMATION {
3280 ULONG ScsiPortCount;
3282 ULONG ParallelCount;
3283 BOOLEAN AtDiskPrimaryAddressClaimed;
3284 BOOLEAN AtDiskSecondaryAddressClaimed;
3286 ULONG MediumChangerCount;
3287 } CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION;
3289 typedef enum _CONFIGURATION_TYPE {
3292 FloatingPointProcessor,
3302 MultiFunctionAdapter,
3316 FloppyDiskPeripheral,
3329 RealModeIrqRoutingTable,
3331 } CONFIGURATION_TYPE, *PCONFIGURATION_TYPE;
3333 typedef NTSTATUS (*PIO_QUERY_DEVICE_ROUTINE)(
3334 /*IN*/ PVOID Context,
3335 /*IN*/ PUNICODE_STRING PathName,
3336 /*IN*/ INTERFACE_TYPE BusType,
3337 /*IN*/ ULONG BusNumber,
3338 /*IN*/ PKEY_VALUE_FULL_INFORMATION *BusInformation,
3339 /*IN*/ CONFIGURATION_TYPE ControllerType,
3340 /*IN*/ ULONG ControllerNumber,
3341 /*IN*/ PKEY_VALUE_FULL_INFORMATION *ControllerInformation,
3342 /*IN*/ CONFIGURATION_TYPE PeripheralType,
3343 /*IN*/ ULONG PeripheralNumber,
3344 /*IN*/ PKEY_VALUE_FULL_INFORMATION *PeripheralInformation);
3346 typedef enum _WORK_QUEUE_TYPE {
3349 HyperCriticalWorkQueue,
3354 (*PWORKER_THREAD_ROUTINE)(
3355 /*IN*/ PVOID Parameter);
3357 typedef struct _WORK_QUEUE_ITEM {
3359 PWORKER_THREAD_ROUTINE WorkerRoutine;
3361 } WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;
3363 typedef enum _KBUGCHECK_BUFFER_DUMP_STATE {
3369 } KBUGCHECK_BUFFER_DUMP_STATE;
3372 (*PKBUGCHECK_CALLBACK_ROUTINE)(
3373 /*IN*/ PVOID Buffer,
3374 /*IN*/ ULONG Length);
3376 typedef struct _KBUGCHECK_CALLBACK_RECORD {
3378 PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine;
3384 } KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD;
3388 * KeInitializeCallbackRecord(
3389 * IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord)
3391 #define KeInitializeCallbackRecord(CallbackRecord) \
3392 CallbackRecord->State = BufferEmpty;
3394 typedef enum _KDPC_IMPORTANCE {
3400 typedef enum _MEMORY_CACHING_TYPE_ORIG {
3401 MmFrameBufferCached = 2
3402 } MEMORY_CACHING_TYPE_ORIG;
3404 typedef enum _MEMORY_CACHING_TYPE {
3405 MmNonCached = FALSE,
3407 MmWriteCombined = MmFrameBufferCached,
3408 MmHardwareCoherentCached,
3409 MmNonCachedUnordered,
3412 } MEMORY_CACHING_TYPE;
3414 typedef enum _MM_PAGE_PRIORITY {
3416 NormalPagePriority = 16,
3417 HighPagePriority = 32
3420 typedef enum _LOCK_OPERATION {
3426 typedef enum _MM_SYSTEM_SIZE {
3432 typedef struct _OBJECT_HANDLE_INFORMATION {
3433 ULONG HandleAttributes;
3434 ACCESS_MASK GrantedAccess;
3435 } OBJECT_HANDLE_INFORMATION, *POBJECT_HANDLE_INFORMATION;
3437 typedef struct _CLIENT_ID {
3438 HANDLE UniqueProcess;
3439 HANDLE UniqueThread;
3440 } CLIENT_ID, *PCLIENT_ID;
3444 /*IN*/ PVOID StartContext);
3447 (*PCREATE_PROCESS_NOTIFY_ROUTINE)(
3448 /*IN*/ HANDLE ParentId,
3449 /*IN*/ HANDLE ProcessId,
3450 /*IN*/ BOOLEAN Create);
3453 (*PCREATE_THREAD_NOTIFY_ROUTINE)(
3454 /*IN*/ HANDLE ProcessId,
3455 /*IN*/ HANDLE ThreadId,
3456 /*IN*/ BOOLEAN Create);
3458 typedef struct _IMAGE_INFO {
3459 _ANONYMOUS_UNION union {
3461 _ANONYMOUS_STRUCT struct {
3462 ULONG ImageAddressingMode : 8;
3463 ULONG SystemModeImage : 1;
3464 ULONG ImageMappedToAllPids : 1;
3465 ULONG Reserved : 22;
3469 ULONG ImageSelector;
3471 ULONG ImageSectionNumber;
3472 } IMAGE_INFO, *PIMAGE_INFO;
3474 #define IMAGE_ADDRESSING_MODE_32BIT 3
3477 (*PLOAD_IMAGE_NOTIFY_ROUTINE)(
3478 /*IN*/ PUNICODE_STRING FullImageName,
3479 /*IN*/ HANDLE ProcessId,
3480 /*IN*/ PIMAGE_INFO ImageInfo);
3482 typedef enum _PROCESSINFOCLASS {
3483 ProcessBasicInformation,
3488 ProcessBasePriority,
3489 ProcessRaisePriority,
3491 ProcessExceptionPort,
3493 ProcessLdtInformation,
3495 ProcessDefaultHardErrorMode,
3496 ProcessIoPortHandlers,
3497 ProcessPooledUsageAndLimits,
3498 ProcessWorkingSetWatch,
3499 ProcessUserModeIOPL,
3500 ProcessEnableAlignmentFaultFixup,
3501 ProcessPriorityClass,
3502 ProcessWx86Information,
3504 ProcessAffinityMask,
3505 ProcessPriorityBoost,
3507 ProcessSessionInformation,
3508 ProcessForegroundInformation,
3509 ProcessWow64Information,
3510 ProcessImageFileName,
3511 ProcessLUIDDeviceMapsEnabled,
3512 ProcessBreakOnTermination,
3513 ProcessDebugObjectHandle,
3515 ProcessHandleTracing,
3519 typedef enum _THREADINFOCLASS {
3520 ThreadBasicInformation,
3525 ThreadImpersonationToken,
3526 ThreadDescriptorTableEntry,
3527 ThreadEnableAlignmentFaultFixup,
3528 ThreadEventPair_Reusable,
3529 ThreadQuerySetWin32StartAddress,
3531 ThreadPerformanceCount,
3532 ThreadAmILastThread,
3533 ThreadIdealProcessor,
3534 ThreadPriorityBoost,
3535 ThreadSetTlsArrayAddress,
3537 ThreadHideFromDebugger,
3538 ThreadBreakOnTermination,
3542 #define ES_SYSTEM_REQUIRED 0x00000001
3543 #define ES_DISPLAY_REQUIRED 0x00000002
3544 #define ES_USER_PRESENT 0x00000004
3545 #define ES_CONTINUOUS 0x80000000
3547 typedef ULONG EXECUTION_STATE;
3550 (*PREQUEST_POWER_COMPLETE)(
3551 /*IN*/ PDEVICE_OBJECT DeviceObject,
3552 /*IN*/ UCHAR MinorFunction,
3553 /*IN*/ POWER_STATE PowerState,
3554 /*IN*/ PVOID Context,
3555 /*IN*/ PIO_STATUS_BLOCK IoStatus);
3557 typedef enum _TRACE_INFORMATION_CLASS {
3560 TraceEnableFlagsClass,
3561 TraceEnableLevelClass,
3562 GlobalLoggerHandleClass,
3563 EventLoggerHandleClass,
3564 AllLoggerHandlesClass,
3565 TraceHandleByNameClass
3566 } TRACE_INFORMATION_CLASS;
3568 typedef NTSTATUS DDKAPI
3569 (*PEX_CALLBACK_FUNCTION)(
3570 /*IN*/ PVOID CallbackContext,
3571 /*IN*/ PVOID Argument1,
3572 /*IN*/ PVOID Argument2);
3577 ** Storage structures
3579 typedef enum _PARTITION_STYLE {
3580 PARTITION_STYLE_MBR,
3584 typedef struct _CREATE_DISK_MBR {
3586 } CREATE_DISK_MBR, *PCREATE_DISK_MBR;
3588 typedef struct _CREATE_DISK_GPT {
3590 ULONG MaxPartitionCount;
3591 } CREATE_DISK_GPT, *PCREATE_DISK_GPT;
3593 typedef struct _CREATE_DISK {
3594 PARTITION_STYLE PartitionStyle;
3595 _ANONYMOUS_UNION union {
3596 CREATE_DISK_MBR Mbr;
3597 CREATE_DISK_GPT Gpt;
3599 } CREATE_DISK, *PCREATE_DISK;
3601 typedef struct _DISK_SIGNATURE {
3602 ULONG PartitionStyle;
3603 _ANONYMOUS_UNION union {
3612 } DISK_SIGNATURE, *PDISK_SIGNATURE;
3614 typedef VOID DDKFASTAPI
3615 (*PTIME_UPDATE_NOTIFY_ROUTINE)(
3616 /*IN*/ HANDLE ThreadId,
3617 /*IN*/ KPROCESSOR_MODE Mode);
3619 #define DBG_STATUS_CONTROL_C 1
3620 #define DBG_STATUS_SYSRQ 2
3621 #define DBG_STATUS_BUGCHECK_FIRST 3
3622 #define DBG_STATUS_BUGCHECK_SECOND 4
3623 #define DBG_STATUS_FATAL 5
3624 #define DBG_STATUS_DEBUG_CONTROL 6
3625 #define DBG_STATUS_WORKER 7
3627 typedef struct _PHYSICAL_MEMORY_RANGE {
3628 PHYSICAL_ADDRESS BaseAddress;
3629 LARGE_INTEGER NumberOfBytes;
3630 } PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE;
3633 (*PDRIVER_VERIFIER_THUNK_ROUTINE)(
3634 /*IN*/ PVOID Context);
3636 typedef struct _DRIVER_VERIFIER_THUNK_PAIRS {
3637 PDRIVER_VERIFIER_THUNK_ROUTINE PristineRoutine;
3638 PDRIVER_VERIFIER_THUNK_ROUTINE NewRoutine;
3639 } DRIVER_VERIFIER_THUNK_PAIRS, *PDRIVER_VERIFIER_THUNK_PAIRS;
3641 #define DRIVER_VERIFIER_SPECIAL_POOLING 0x0001
3642 #define DRIVER_VERIFIER_FORCE_IRQL_CHECKING 0x0002
3643 #define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES 0x0004
3644 #define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS 0x0008
3645 #define DRIVER_VERIFIER_IO_CHECKING 0x0010
3647 #define RTL_RANGE_LIST_ADD_IF_CONFLICT 0x00000001
3648 #define RTL_RANGE_LIST_ADD_SHARED 0x00000002
3650 #define RTL_RANGE_LIST_SHARED_OK 0x00000001
3651 #define RTL_RANGE_LIST_NULL_CONFLICT_OK 0x00000002
3653 #define RTL_RANGE_LIST_SHARED_OK 0x00000001
3654 #define RTL_RANGE_LIST_NULL_CONFLICT_OK 0x00000002
3656 #define RTL_RANGE_LIST_MERGE_IF_CONFLICT RTL_RANGE_LIST_ADD_IF_CONFLICT
3658 typedef struct _RTL_RANGE {
3665 } RTL_RANGE, *PRTL_RANGE;
3667 #define RTL_RANGE_SHARED 0x01
3668 #define RTL_RANGE_CONFLICT 0x02
3670 typedef struct _RTL_RANGE_LIST {
3671 LIST_ENTRY ListHead;
3675 } RTL_RANGE_LIST, *PRTL_RANGE_LIST;
3677 typedef struct _RANGE_LIST_ITERATOR {
3678 PLIST_ENTRY RangeListHead;
3679 PLIST_ENTRY MergedHead;
3682 } RTL_RANGE_LIST_ITERATOR, *PRTL_RANGE_LIST_ITERATOR;
3685 (*PRTL_CONFLICT_RANGE_CALLBACK)(
3686 /*IN*/ PVOID Context,
3687 /*IN*/ PRTL_RANGE Range);
3689 #define HASH_STRING_ALGORITHM_DEFAULT 0
3690 #define HASH_STRING_ALGORITHM_X65599 1
3691 #define HASH_STRING_ALGORITHM_INVALID 0xffffffff
3693 typedef enum _SUITE_TYPE {
3697 CommunicationServer,
3699 SmallBusinessRestricted,
3709 (*PTIMER_APC_ROUTINE)(
3710 /*IN*/ PVOID TimerContext,
3711 /*IN*/ ULONG TimerLowValue,
3712 /*IN*/ LONG TimerHighValue);
3721 (*WMI_NOTIFICATION_CALLBACK)(
3727 ** Architecture specific structures
3732 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
3734 #define PASSIVE_LEVEL 0
3737 #define DISPATCH_LEVEL 2
3738 #define SYNCH_LEVEL 27
3739 #define PROFILE_LEVEL 27
3740 #define CLOCK1_LEVEL 28
3741 #define CLOCK2_LEVEL 28
3742 #define IPI_LEVEL 29
3743 #define POWER_LEVEL 30
3744 #define HIGH_LEVEL 31
3746 typedef struct _KPCR_TIB {
3747 PVOID ExceptionList; /* 00 */
3748 PVOID StackBase; /* 04 */
3749 PVOID StackLimit; /* 08 */
3750 PVOID SubSystemTib; /* 0C */
3751 _ANONYMOUS_UNION union {
3752 PVOID FiberData; /* 10 */
3753 DWORD Version; /* 10 */
3755 PVOID ArbitraryUserPointer; /* 14 */
3756 struct _NT_TIB *Self; /* 18 */
3757 } KPCR_TIB, *PKPCR_TIB; /* 1C */
3759 #define PCR_MINOR_VERSION 1
3760 #define PCR_MAJOR_VERSION 1
3762 typedef struct _KPCR {
3763 KPCR_TIB Tib; /* 00 */
3764 struct _KPCR *Self; /* 1C */
3765 struct _KPRCB *PCRCB; /* 20 */
3766 KIRQL Irql; /* 24 */
3768 ULONG IrrActive; /* 2C */
3770 PVOID KdVersionBlock; /* 34 */
3771 PUSHORT IDT; /* 38 */
3772 PUSHORT GDT; /* 3C */
3773 struct _KTSS *TSS; /* 40 */
3774 USHORT MajorVersion; /* 44 */
3775 USHORT MinorVersion; /* 46 */
3776 KAFFINITY SetMember; /* 48 */
3777 ULONG StallScaleFactor; /* 4C */
3778 UCHAR SpareUnused; /* 50 */
3779 UCHAR Number; /* 51 */
3780 } KPCR, *PKPCR; /* 54 */
3782 typedef struct _KFLOATING_SAVE {
3786 ULONG ErrorSelector;
3791 } KFLOATING_SAVE, *PKFLOATING_SAVE;
3793 #define PAGE_SIZE 0x1000
3794 #define PAGE_SHIFT 12L
3796 extern NTOSAPI PVOID *MmHighestUserAddress;
3797 extern NTOSAPI PVOID *MmSystemRangeStart;
3798 extern NTOSAPI ULONG *MmUserProbeAddress;
3800 #define MM_HIGHEST_USER_ADDRESS *MmHighestUserAddress
3801 #define MM_SYSTEM_RANGE_START *MmSystemRangeStart
3802 #define MM_USER_PROBE_ADDRESS *MmUserProbeAddress
3803 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
3804 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000
3806 #define KI_USER_SHARED_DATA 0xffdf0000
3807 #define SharedUserData ((KUSER_SHARED_DATA * CONST) KI_USER_SHARED_DATA)
3809 #define EFLAG_SIGN 0x8000
3810 #define EFLAG_ZERO 0x4000
3811 #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
3813 #define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
3814 #define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
3815 #define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
3817 typedef enum _INTERLOCKED_RESULT {
3818 ResultNegative = RESULT_NEGATIVE,
3819 ResultZero = RESULT_ZERO,
3820 ResultPositive = RESULT_POSITIVE
3821 } INTERLOCKED_RESULT;
3831 * KeGetCurrentProcessorNumber(
3834 #define KeGetCurrentProcessorNumber() \
3835 ((ULONG)KeGetCurrentKPCR()->Number)
3838 #if __USE_NTOSKRNL__
3839 /* CAREFUL: These are exported from ntoskrnl.exe as __fastcall functions,
3840 but are also exported from kernel32.dll and declared in winbase.h as
3842 #if !defined(__INTERLOCKED_DECLARED)
3843 #define __INTERLOCKED_DECLARED
3848 InterlockedIncrement(
3849 /*IN*/ LONG VOLATILE *Addend);
3854 InterlockedDecrement(
3855 /*IN*/ LONG VOLATILE *Addend);
3860 InterlockedCompareExchange(
3861 /*IN OUT*/ PLONG VOLATILE Destination,
3862 /*IN*/ LONG Exchange,
3863 /*IN*/ LONG Comparand);
3868 InterlockedExchange(
3869 /*IN OUT*/ PLONG VOLATILE Target,
3875 InterlockedExchangeAdd(
3876 /*IN OUT*/ PLONG VOLATILE Addend,
3881 * InterlockedExchangePointer(
3882 * IN OUT PVOID VOLATILE *Target,
3885 #define InterlockedExchangePointer(Target, Value) \
3886 ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
3890 * InterlockedCompareExchangePointer(
3891 * IN OUT PVOID *Destination,
3892 * IN PVOID Exchange,
3893 * IN PVOID Comparand)
3895 #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
3896 ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
3898 #if (_WIN32_WINNT >= 0x0501)
3901 InterlockedPopEntrySList(
3902 /*IN*/ PSLIST_HEADER ListHead);
3907 InterlockedPushEntrySList(
3908 /*IN*/ PSLIST_HEADER ListHead,
3909 /*IN*/ PSLIST_ENTRY ListEntry);
3910 #endif /* _WIN32_WINNT >= 0x0501 */
3912 #endif /* !__INTERLOCKED_DECLARED */
3913 #endif /* __USE_NTOSKRNL__ */
3918 KefAcquireSpinLockAtDpcLevel(
3919 /*IN*/ PKSPIN_LOCK SpinLock);
3924 KefReleaseSpinLockFromDpcLevel(
3925 /*IN*/ PKSPIN_LOCK SpinLock);
3927 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
3928 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
3930 #define RtlCopyMemoryNonTemporal RtlCopyMemory
3932 #define KeGetDcacheFillSize() 1L
3939 ** Utillity functions
3942 #define ARGUMENT_PRESENT(ArgumentPointer) \
3943 ((BOOLEAN) ((PVOID)ArgumentPointer != (PVOID)NULL))
3950 #define BYTE_OFFSET(Va) \
3951 ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
3958 #define BYTES_TO_PAGES(Size) \
3959 ((ULONG) ((ULONG_PTR) (Size) >> PAGE_SHIFT) + (((ULONG) (Size) & (PAGE_SIZE - 1)) != 0))
3963 * CONTAINING_RECORD(
3968 #ifndef CONTAINING_RECORD
3969 #define CONTAINING_RECORD(Address, Type, Field) \
3970 ((Type *) (((ULONG_PTR) Address) - FIELD_OFFSET(Type, Field)))
3978 #ifndef FIELD_OFFSET
3979 #define FIELD_OFFSET(Type, Field) \
3980 ((LONG) (&(((Type *) 0)->Field)))
3988 #define PAGE_ALIGN(Va) \
3989 ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
3994 * IN ULONG_PTR Size)
3996 #define ROUND_TO_PAGES(Size) \
3997 ((ULONG_PTR) (((ULONG_PTR) Size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1)))
4003 /*IN*/ PVOID FailedAssertion,
4004 /*IN*/ PVOID FileName,
4005 /*IN*/ ULONG LineNumber,
4006 /*IN*/ PCHAR Message);
4010 #define ASSERT(exp) \
4012 (RtlAssert( #exp, __FILE__, __LINE__, NULL ), FALSE) : TRUE)
4014 #define ASSERTMSG(msg, exp) \
4016 (RtlAssert( #exp, __FILE__, __LINE__, msg ), FALSE) : TRUE)
4018 #define RTL_SOFT_ASSERT(exp) \
4020 (DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE) : TRUE)
4022 #define RTL_SOFT_ASSERTMSG(msg, exp) \
4024 (DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE) : TRUE)
4026 #define RTL_VERIFY(exp) ASSERT(exp)
4027 #define RTL_VERIFYMSG(msg, exp) ASSERT(msg, exp)
4029 #define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
4030 #define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
4034 #define ASSERT(exp) ((VOID) 0)
4035 #define ASSERTMSG(msg, exp) ((VOID) 0)
4037 #define RTL_SOFT_ASSERT(exp) ((VOID) 0)
4038 #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
4040 #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
4041 #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
4043 #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
4044 #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
4050 ** Driver support routines
4053 /** Runtime library routines **/
4057 * InitializeListHead(
4058 * IN PLIST_ENTRY ListHead)
4060 #define InitializeListHead(_ListHead) \
4062 (_ListHead)->Flink = (_ListHead); \
4063 (_ListHead)->Blink = (_ListHead); \
4069 * IN PLIST_ENTRY ListHead,
4070 * IN PLIST_ENTRY Entry)
4072 #define InsertHeadList(_ListHead, \
4075 PLIST_ENTRY _OldFlink; \
4076 _OldFlink = (_ListHead)->Flink; \
4077 (_Entry)->Flink = _OldFlink; \
4078 (_Entry)->Blink = (_ListHead); \
4079 _OldFlink->Blink = (_Entry); \
4080 (_ListHead)->Flink = (_Entry); \
4086 * IN PLIST_ENTRY ListHead,
4087 * IN PLIST_ENTRY Entry)
4089 #define InsertTailList(_ListHead, \
4092 PLIST_ENTRY _OldBlink; \
4093 _OldBlink = (_ListHead)->Blink; \
4094 (_Entry)->Flink = (_ListHead); \
4095 (_Entry)->Blink = _OldBlink; \
4096 _OldBlink->Flink = (_Entry); \
4097 (_ListHead)->Blink = (_Entry); \
4103 * IN PLIST_ENTRY ListHead)
4105 #define IsListEmpty(_ListHead) \
4106 ((_ListHead)->Flink == (_ListHead))
4108 static __inline PSINGLE_LIST_ENTRY
4110 /*IN*/ PSINGLE_LIST_ENTRY ListHead)
4112 PSINGLE_LIST_ENTRY Entry;
4114 Entry = ListHead->Next;
4117 ListHead->Next = Entry->Next;
4125 * IN PSINGLE_LIST_ENTRY ListHead,
4126 * IN PSINGLE_LIST_ENTRY Entry)
4128 #define PushEntryList(_ListHead, \
4131 (_Entry)->Next = (_ListHead)->Next; \
4132 (_ListHead)->Next = (_Entry); \
4138 * IN PLIST_ENTRY Entry)
4140 #define RemoveEntryList(_Entry) \
4142 PLIST_ENTRY _OldFlink; \
4143 PLIST_ENTRY _OldBlink; \
4144 _OldFlink = (_Entry)->Flink; \
4145 _OldBlink = (_Entry)->Blink; \
4146 _OldFlink->Blink = _OldBlink; \
4147 _OldBlink->Flink = _OldFlink; \
4148 (_Entry)->Flink = NULL; \
4149 (_Entry)->Blink = NULL; \
4152 static __inline PLIST_ENTRY
4154 /*IN*/ PLIST_ENTRY ListHead)
4156 PLIST_ENTRY OldFlink;
4157 PLIST_ENTRY OldBlink;
4160 Entry = ListHead->Flink;
4161 OldFlink = ListHead->Flink->Flink;
4162 OldBlink = ListHead->Flink->Blink;
4163 OldFlink->Blink = OldBlink;
4164 OldBlink->Flink = OldFlink;
4166 if (Entry != ListHead)
4168 Entry->Flink = NULL;
4169 Entry->Blink = NULL;
4175 static __inline PLIST_ENTRY
4177 /*IN*/ PLIST_ENTRY ListHead)
4179 PLIST_ENTRY OldFlink;
4180 PLIST_ENTRY OldBlink;
4183 Entry = ListHead->Blink;
4184 OldFlink = ListHead->Blink->Flink;
4185 OldBlink = ListHead->Blink->Blink;
4186 OldFlink->Blink = OldBlink;
4187 OldBlink->Flink = OldFlink;
4189 if (Entry != ListHead)
4191 Entry->Flink = NULL;
4192 Entry->Blink = NULL;
4201 * IN PSLIST_HEADER SListHead)
4203 #define QueryDepthSList(_SListHead) \
4204 ((USHORT) ((_SListHead)->Alignment & 0xffff))
4206 #define InterlockedFlushSList(ListHead) ExInterlockedFlushSList(ListHead)
4211 RtlAnsiStringToUnicodeSize(
4212 /*IN*/ PANSI_STRING AnsiString);
4218 /*IN OUT*/ PRTL_RANGE_LIST RangeList,
4219 /*IN*/ ULONGLONG Start,
4220 /*IN*/ ULONGLONG End,
4221 /*IN*/ UCHAR Attributes,
4223 /*IN*/ PVOID UserData /*OPTIONAL*/,
4224 /*IN*/ PVOID Owner /*OPTIONAL*/);
4229 RtlAnsiStringToUnicodeString(
4230 /*IN OUT*/ PUNICODE_STRING DestinationString,
4231 /*IN*/ PANSI_STRING SourceString,
4232 /*IN*/ BOOLEAN AllocateDestinationString);
4237 RtlAppendUnicodeStringToString(
4238 /*IN OUT*/ PUNICODE_STRING Destination,
4239 /*IN*/ PUNICODE_STRING Source);
4244 RtlAppendUnicodeToString(
4245 /*IN OUT*/ PUNICODE_STRING Destination,
4246 /*IN*/ PCWSTR Source);
4252 /*IN*/ PRTL_BITMAP BitMapHeader,
4253 /*IN*/ ULONG StartingIndex,
4254 /*IN*/ ULONG Length);
4260 /*IN*/ PRTL_BITMAP BitMapHeader,
4261 /*IN*/ ULONG StartingIndex,
4262 /*IN*/ ULONG Length);
4269 /*IN*/ ULONG Base /*OPTIONAL*/,
4270 /*IN OUT*/ PULONG Value);
4276 /*IN*/ PRTL_BITMAP BitMapHeader,
4277 /*IN*/ ULONG BitPosition);
4282 RtlCheckRegistryKey(
4283 /*IN*/ ULONG RelativeTo,
4290 /*IN*/ PRTL_BITMAP BitMapHeader);
4296 PRTL_BITMAP BitMapHeader,
4303 /*IN*/ PRTL_BITMAP BitMapHeader,
4304 /*IN*/ ULONG StartingIndex,
4305 /*IN*/ ULONG NumberToClear);
4311 /*IN*/ CONST VOID *Source1,
4312 /*IN*/ CONST VOID *Source2,
4313 /*IN*/ SIZE_T Length);
4319 /*IN*/ PSTRING String1,
4320 /*IN*/ PSTRING String2,
4321 BOOLEAN CaseInSensitive);
4326 RtlCompareUnicodeString(
4327 /*IN*/ PUNICODE_STRING String1,
4328 /*IN*/ PUNICODE_STRING String2,
4329 /*IN*/ BOOLEAN CaseInSensitive);
4334 RtlConvertLongToLargeInteger(
4335 /*IN*/ LONG SignedInteger);
4340 RtlConvertLongToLuid(
4346 RtlConvertUlongToLargeInteger(
4347 /*IN*/ ULONG UnsignedInteger);
4352 RtlConvertUlongToLuid(
4358 * IN VOID UNALIGNED *Destination,
4359 * IN CONST VOID UNALIGNED *Source,
4362 #ifndef RtlCopyMemory
4363 #define RtlCopyMemory(Destination, Source, Length) \
4364 memcpy(Destination, Source, Length);
4367 #ifndef RtlCopyBytes
4368 #define RtlCopyBytes RtlCopyMemory
4375 /*IN*/ VOID UNALIGNED *Destination,
4376 /*IN*/ CONST VOID UNALIGNED *Source,
4377 /*IN*/ ULONG Length);
4383 /*OUT*/ PRTL_RANGE_LIST CopyRangeList,
4384 /*IN*/ PRTL_RANGE_LIST RangeList);
4390 /*IN OUT*/ PSTRING DestinationString,
4391 /*IN*/ PSTRING SourceString /*OPTIONAL*/);
4396 RtlCopyUnicodeString(
4397 /*IN OUT*/ PUNICODE_STRING DestinationString,
4398 /*IN*/ PUNICODE_STRING SourceString);
4403 RtlCreateRegistryKey(
4404 /*IN*/ ULONG RelativeTo,
4410 RtlCreateSecurityDescriptor(
4411 /*IN OUT*/ PSECURITY_DESCRIPTOR SecurityDescriptor,
4412 /*IN*/ ULONG Revision);
4417 RtlDeleteOwnersRanges(
4418 /*IN OUT*/ PRTL_RANGE_LIST RangeList,
4419 /*IN*/ PVOID Owner);
4425 /*IN OUT*/ PRTL_RANGE_LIST RangeList,
4426 /*IN*/ ULONGLONG Start,
4427 /*IN*/ ULONGLONG End,
4428 /*IN*/ PVOID Owner);
4433 RtlDeleteRegistryValue(
4434 /*IN*/ ULONG RelativeTo,
4436 /*IN*/ PCWSTR ValueName);
4441 RtlDosPathNameToNtPathName_U(
4442 /*IN*/ PCWSTR DosPathName,
4443 /*OUT*/ PUNICODE_STRING NtPathName,
4444 /*OUT*/ PCWSTR *NtFileNamePart,
4445 /*OUT*/ VOID *DirectoryInfo);
4453 #define RtlEqualLuid(_Luid1, \
4455 ((Luid1.LowPart == Luid2.LowPart) && (Luid1.HighPart == Luid2.HighPart))
4460 * IN VOID UNALIGNED *Destination,
4461 * IN CONST VOID UNALIGNED *Source,
4464 #define RtlEqualMemory(Destination, Source, Length) (!memcmp(Destination, Source, Length))
4470 /*IN*/ PSTRING String1,
4471 /*IN*/ PSTRING String2,
4472 /*IN*/ BOOLEAN CaseInSensitive);
4477 RtlEqualUnicodeString(
4478 /*IN*/ CONST UNICODE_STRING *String1,
4479 /*IN*/ CONST UNICODE_STRING *String2,
4480 /*IN*/ BOOLEAN CaseInSensitive);
4485 * IN VOID UNALIGNED *Destination,
4489 #ifndef RtlFillMemory
4490 #define RtlFillMemory(Destination, Length, Fill) \
4491 memset(Destination, Fill, Length)
4494 #ifndef RtlFillBytes
4495 #define RtlFillBytes RtlFillMemory
4502 /*IN*/ PRTL_BITMAP BitMapHeader,
4503 /*IN*/ ULONG NumberToFind,
4504 /*IN*/ ULONG HintIndex);
4509 RtlFindClearBitsAndSet(
4510 /*IN*/ PRTL_BITMAP BitMapHeader,
4511 /*IN*/ ULONG NumberToFind,
4512 /*IN*/ ULONG HintIndex);
4518 /*IN*/ PRTL_BITMAP BitMapHeader,
4519 /*OUT*/ PRTL_BITMAP_RUN RunArray,
4520 /*IN*/ ULONG SizeOfRunArray,
4521 /*IN*/ BOOLEAN LocateLongestRuns);
4526 RtlFindFirstRunClear(
4527 /*IN*/ PRTL_BITMAP BitMapHeader,
4528 /*OUT*/ PULONG StartingIndex);
4533 RtlFindLastBackwardRunClear(
4534 /*IN*/ PRTL_BITMAP BitMapHeader,
4535 /*IN*/ ULONG FromIndex,
4536 /*OUT*/ PULONG StartingRunIndex);
4541 RtlFindLeastSignificantBit(
4542 /*IN*/ ULONGLONG Set);
4547 RtlFindLongestRunClear(
4548 /*IN*/ PRTL_BITMAP BitMapHeader,
4549 /*OUT*/ PULONG StartingIndex);
4554 RtlFindMostSignificantBit(
4555 /*IN*/ ULONGLONG Set);
4560 RtlFindNextForwardRunClear(
4561 /*IN*/ PRTL_BITMAP BitMapHeader,
4562 /*IN*/ ULONG FromIndex,
4563 /*OUT*/ PULONG StartingRunIndex);
4569 /*IN*/ PRTL_RANGE_LIST RangeList,
4570 /*IN*/ ULONGLONG Minimum,
4571 /*IN*/ ULONGLONG Maximum,
4572 /*IN*/ ULONG Length,
4573 /*IN*/ ULONG Alignment,
4575 /*IN*/ UCHAR AttributeAvailableMask,
4576 /*IN*/ PVOID Context /*OPTIONAL*/,
4577 /*IN*/ PRTL_CONFLICT_RANGE_CALLBACK Callback /*OPTIONAL*/,
4578 /*OUT*/ PULONGLONG Start);
4584 /*IN*/ PRTL_BITMAP BitMapHeader,
4585 /*IN*/ ULONG NumberToFind,
4586 /*IN*/ ULONG HintIndex);
4591 RtlFindSetBitsAndClear(
4592 /*IN*/ PRTL_BITMAP BitMapHeader,
4593 /*IN*/ ULONG NumberToFind,
4594 /*IN*/ ULONG HintIndex);
4600 /*IN*/ PANSI_STRING AnsiString);
4606 /*IN*/ PRTL_RANGE_LIST RangeList);
4611 RtlFreeUnicodeString(
4612 /*IN*/ PUNICODE_STRING UnicodeString);
4617 RtlGetCallersAddress(
4618 /*OUT*/ PVOID *CallersAddress,
4619 /*OUT*/ PVOID *CallersCaller);
4625 /*IN OUT*/ PRTL_OSVERSIONINFOW lpVersionInformation);
4631 /*IN*/ PRTL_RANGE_LIST RangeList,
4632 /*OUT*/ PRTL_RANGE_LIST_ITERATOR Iterator,
4633 /*OUT*/ PRTL_RANGE *Range);
4639 /*IN OUT*/ PRTL_RANGE_LIST_ITERATOR Iterator,
4640 /*OUT*/ PRTL_RANGE *Range,
4641 /*IN*/ BOOLEAN MoveForwards);
4643 #define FOR_ALL_RANGES(RangeList, Iterator, Current) \
4644 for (RtlGetFirstRange((RangeList), (Iterator), &(Current)); \
4645 (Current) != NULL; \
4646 RtlGetNextRange((Iterator), &(Current), TRUE))
4648 #define FOR_ALL_RANGES_BACKWARDS(RangeList, Iterator, Current) \
4649 for (RtlGetLastRange((RangeList), (Iterator), &(Current)); \
4650 (Current) != NULL; \
4651 RtlGetNextRange((Iterator), &(Current), FALSE))
4657 /*IN*/ PUNICODE_STRING GuidString,
4658 /*OUT*/ GUID *Guid);
4663 RtlHashUnicodeString(
4664 /*IN*/ CONST UNICODE_STRING *String,
4665 /*IN*/ BOOLEAN CaseInSensitive,
4666 /*IN*/ ULONG HashAlgorithm,
4667 /*OUT*/ PULONG HashValue);
4673 /*IN OUT*/ PANSI_STRING DestinationString,
4674 /*IN*/ PCSZ SourceString);
4679 RtlInitializeBitMap(
4680 /*IN*/ PRTL_BITMAP BitMapHeader,
4681 /*IN*/ PULONG BitMapBuffer,
4682 /*IN*/ ULONG SizeOfBitMap);
4687 RtlInitializeRangeList(
4688 /*IN OUT*/ PRTL_RANGE_LIST RangeList);
4694 /*IN OUT*/ PSTRING DestinationString,
4695 /*IN*/ PCSZ SourceString);
4700 RtlInitUnicodeString(
4701 /*IN OUT*/ PUNICODE_STRING DestinationString,
4702 /*IN*/ PCWSTR SourceString);
4707 RtlInt64ToUnicodeString(
4708 /*IN*/ ULONGLONG Value,
4709 /*IN*/ ULONG Base /*OPTIONAL*/,
4710 /*IN OUT*/ PUNICODE_STRING String);
4715 RtlIntegerToUnicodeString(
4717 /*IN*/ ULONG Base /*OPTIONAL*/,
4718 /*IN OUT*/ PUNICODE_STRING String);
4723 RtlIntPtrToUnicodeString(
4725 ULONG Base /*OPTIONAL*/,
4726 PUNICODE_STRING String);
4732 /*OUT*/ PRTL_RANGE_LIST InvertedRangeList,
4733 /*IN*/ PRTL_RANGE_LIST RangeList);
4738 RtlIsRangeAvailable(
4739 /*IN*/ PRTL_RANGE_LIST RangeList,
4740 /*IN*/ ULONGLONG Start,
4741 /*IN*/ ULONGLONG End,
4743 /*IN*/ UCHAR AttributeAvailableMask,
4744 /*IN*/ PVOID Context /*OPTIONAL*/,
4745 /*IN*/ PRTL_CONFLICT_RANGE_CALLBACK Callback /*OPTIONAL*/,
4746 /*OUT*/ PBOOLEAN Available);
4753 #define RtlIsZeroLuid(_L1) \
4754 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
4759 RtlLengthSecurityDescriptor(
4760 /*IN*/ PSECURITY_DESCRIPTOR SecurityDescriptor);
4766 /*IN OUT*/ PACCESS_MASK AccessMask,
4767 /*IN*/ PGENERIC_MAPPING GenericMapping);
4773 /*OUT*/ PRTL_RANGE_LIST MergedRangeList,
4774 /*IN*/ PRTL_RANGE_LIST RangeList1,
4775 /*IN*/ PRTL_RANGE_LIST RangeList2,
4776 /*IN*/ ULONG Flags);
4781 * IN VOID UNALIGNED *Destination,
4782 * IN CONST VOID UNALIGNED *Source,
4785 #define RtlMoveMemory memmove
4790 RtlNumberOfClearBits(
4791 /*IN*/ PRTL_BITMAP BitMapHeader);
4797 /*IN*/ PRTL_BITMAP BitMapHeader);
4802 RtlPrefetchMemoryNonTemporal(
4803 /*IN*/ PVOID Source,
4804 /*IN*/ SIZE_T Length);
4809 RtlPrefixUnicodeString(
4810 /*IN*/ PUNICODE_STRING String1,
4811 /*IN*/ PUNICODE_STRING String2,
4812 /*IN*/ BOOLEAN CaseInSensitive);
4817 RtlQueryRegistryValues(
4818 /*IN*/ ULONG RelativeTo,
4820 /*IN*/ PRTL_QUERY_REGISTRY_TABLE QueryTable,
4821 /*IN*/ PVOID Context,
4822 /*IN*/ PVOID Environment /*OPTIONAL*/);
4828 /*IN OUT*/ PULONG DestinationAddress,
4829 /*IN*/ PULONG SourceAddress);
4835 /*IN OUT*/ PUSHORT DestinationAddress,
4836 /*IN*/ PUSHORT SourceAddress);
4842 /*IN*/ PRTL_BITMAP BitMapHeader);
4848 PRTL_BITMAP BitMapHeader,
4855 /*IN*/ PRTL_BITMAP BitMapHeader,
4856 /*IN*/ ULONG StartingIndex,
4857 /*IN*/ ULONG NumberToSet);
4862 RtlSetDaclSecurityDescriptor(
4863 /*IN OUT*/ PSECURITY_DESCRIPTOR SecurityDescriptor,
4864 /*IN*/ BOOLEAN DaclPresent,
4865 /*IN*/ PACL Dacl /*OPTIONAL*/,
4866 /*IN*/ BOOLEAN DaclDefaulted /*OPTIONAL*/);
4872 /*IN*/ PULONG Address,
4873 /*IN*/ ULONG Value);
4879 /*IN OUT*/ PULONGLONG Address,
4886 /*IN OUT*/ PULONG_PTR Address,
4887 /*IN*/ ULONG_PTR Value);
4893 /*IN*/ PUSHORT Address,
4894 /*IN*/ USHORT Value);
4900 /*IN*/ REFGUID Guid,
4901 /*OUT*/ PUNICODE_STRING GuidString);
4903 #define RtlStringCbCopyA(dst, dst_len, src) strncpy(dst, src, dst_len)
4904 #define RtlStringCbPrintfA(args...) snprintf(args)
4905 #define RtlStringCbVPrintfA(args...) vsnprintf(args)
4911 /*IN*/ PRTL_BITMAP BitMapHeader,
4912 /*IN*/ ULONG BitNumber);
4917 RtlTimeFieldsToTime(
4918 /*IN*/ PTIME_FIELDS TimeFields,
4919 /*IN*/ PLARGE_INTEGER Time);
4924 RtlTimeToTimeFields(
4925 /*IN*/ PLARGE_INTEGER Time,
4926 /*IN*/ PTIME_FIELDS TimeFields);
4932 /*IN*/ ULONG Source);
4937 RtlUlonglongByteSwap(
4938 /*IN*/ ULONGLONG Source);
4943 RtlUnicodeStringToAnsiSize(
4944 /*IN*/ PUNICODE_STRING UnicodeString);
4949 RtlUnicodeStringToAnsiString(
4950 /*IN OUT*/ PANSI_STRING DestinationString,
4951 /*IN*/ PUNICODE_STRING SourceString,
4952 /*IN*/ BOOLEAN AllocateDestinationString);
4957 RtlUnicodeStringToInteger(
4958 /*IN*/ PUNICODE_STRING String,
4959 /*IN*/ ULONG Base /*OPTIONAL*/,
4960 /*OUT*/ PULONG Value);
4965 RtlUpcaseUnicodeChar(
4966 /*IN*/ WCHAR SourceCharacter);
4971 RtlUpcaseUnicodeString(
4972 /*IN OUT*/ PUNICODE_STRING DestinationString /*OPTIONAL*/,
4973 /*IN*/ PCUNICODE_STRING SourceString,
4974 /*IN*/ BOOLEAN AllocateDestinationString);
4980 /*IN*/ CHAR Character);
4986 /*IN OUT*/ PSTRING DestinationString,
4987 /*IN*/ PSTRING SourceString);
4993 /*IN*/ USHORT Source);
4998 RtlValidRelativeSecurityDescriptor(
4999 /*IN*/ PSECURITY_DESCRIPTOR SecurityDescriptorInput,
5000 /*IN*/ ULONG SecurityDescriptorLength,
5001 /*IN*/ SECURITY_INFORMATION RequiredInformation);
5006 RtlValidSecurityDescriptor(
5007 /*IN*/ PSECURITY_DESCRIPTOR SecurityDescriptor);
5012 RtlVerifyVersionInfo(
5013 /*IN*/ PRTL_OSVERSIONINFOEXW VersionInfo,
5014 /*IN*/ ULONG TypeMask,
5015 /*IN*/ ULONGLONG ConditionMask);
5020 RtlVolumeDeviceToDosName(
5021 /*IN*/ PVOID VolumeDeviceObject,
5022 /*OUT*/ PUNICODE_STRING DosName);
5028 /*OUT*/ PVOID *Callers,
5030 /*IN*/ ULONG Flags);
5035 RtlWriteRegistryValue(
5036 /*IN*/ ULONG RelativeTo,
5038 /*IN*/ PCWSTR ValueName,
5039 /*IN*/ ULONG ValueType,
5040 /*IN*/ PVOID ValueData,
5041 /*IN*/ ULONG ValueLength);
5046 RtlxUnicodeStringToAnsiSize(
5047 /*IN*/ PUNICODE_STRING UnicodeString);
5052 * IN VOID UNALIGNED *Destination,
5055 #ifndef RtlZeroMemory
5056 #define RtlZeroMemory(Destination, Length) \
5057 memset(Destination, 0, Length)
5060 #ifndef RtlZeroBytes
5061 #define RtlZeroBytes RtlZeroMemory
5065 /** Executive support routines **/
5071 /*IN*/ PFAST_MUTEX FastMutex);
5076 ExAcquireFastMutexUnsafe(
5077 /*IN*/ PFAST_MUTEX FastMutex);
5082 ExAcquireResourceExclusiveLite(
5083 /*IN*/ PERESOURCE Resource,
5084 /*IN*/ BOOLEAN Wait);
5089 ExAcquireResourceSharedLite(
5090 /*IN*/ PERESOURCE Resource,
5091 /*IN*/ BOOLEAN Wait);
5096 ExAcquireSharedStarveExclusive(
5097 /*IN*/ PERESOURCE Resource,
5098 /*IN*/ BOOLEAN Wait);
5103 ExAcquireSharedWaitForExclusive(
5104 /*IN*/ PERESOURCE Resource,
5105 /*IN*/ BOOLEAN Wait);
5111 ExInterlockedPopEntrySList(
5112 /*IN*/ PSLIST_HEADER ListHead,
5113 /*IN*/ PKSPIN_LOCK Lock);
5119 ExInterlockedPushEntrySList(
5120 /*IN*/ PSLIST_HEADER ListHead,
5121 /*IN*/ PSINGLE_LIST_ENTRY ListEntry,
5122 /*IN*/ PKSPIN_LOCK Lock);
5125 #if (__USE_NTOSKRNL__) && (_WIN32_WINNT >= 0x0501)
5126 #define ExInterlockedPopEntrySList(_ListHead, \
5128 InterlockedPopEntrySList(_ListHead)
5130 #define ExInterlockedPushEntrySList(_ListHead, \
5133 InterlockedPushEntrySList(_ListHead, _ListEntry)
5134 #endif /* __USE_NTOSKRNL__ */
5136 #define ExQueryDepthSList(ListHead) QueryDepthSList(ListHead)
5138 static __inline PVOID
5139 ExAllocateFromNPagedLookasideList(
5140 /*IN*/ PNPAGED_LOOKASIDE_LIST Lookaside)
5144 Lookaside->TotalAllocates++;
5145 Entry = ExInterlockedPopEntrySList(&Lookaside->ListHead,
5146 &Lookaside->Obsoleted);
5147 if (Entry == NULL) {
5148 Lookaside->_DDK_DUMMYUNION_MEMBER(AllocateMisses)++;
5149 Entry = (Lookaside->Allocate)(Lookaside->Type,
5156 static __inline VOID
5157 ExFreeToNPagedLookasideList(
5158 /*IN*/ PNPAGED_LOOKASIDE_LIST Lookaside,
5161 Lookaside->TotalFrees++;
5162 if (ExQueryDepthSList(&Lookaside->ListHead) >= Lookaside->Depth) {
5163 Lookaside->_DDK_DUMMYUNION_N_MEMBER(2,FreeMisses)++;
5164 (Lookaside->Free)(Entry);
5166 ExInterlockedPushEntrySList(&Lookaside->ListHead,
5167 (PSLIST_ENTRY)Entry,
5168 &Lookaside->Obsoleted);
5172 #if (__USE_NTOSKRNL__) && (_WIN32_WINNT >= 0x0501)
5174 static __inline PVOID
5175 ExAllocateFromPagedLookasideList(
5176 /*IN*/ PPAGED_LOOKASIDE_LIST Lookaside)
5180 Lookaside->TotalAllocates++;
5181 Entry = InterlockedPopEntrySList(&Lookaside->ListHead);
5182 if (Entry == NULL) {
5183 Lookaside->_DDK_DUMMYUNION_MEMBER(AllocateMisses)++;
5184 Entry = (Lookaside->Allocate)(Lookaside->Type,
5191 static __inline VOID
5192 ExFreeToPagedLookasideList(
5193 /*IN*/ PPAGED_LOOKASIDE_LIST Lookaside,
5196 Lookaside->TotalFrees++;
5197 if (ExQueryDepthSList(&Lookaside->ListHead) >= Lookaside->Depth) {
5198 Lookaside->_DDK_DUMMYUNION_N_MEMBER(2,FreeMisses)++;
5199 (Lookaside->Free)(Entry);
5201 InterlockedPushEntrySList(&Lookaside->ListHead,
5202 (PSLIST_ENTRY)Entry);
5206 #else /* (__USE_NTOSKRNL__) && (_WIN32_WINNT >= 0x0501) */
5211 ExAllocateFromPagedLookasideList(
5212 /*IN*/ PPAGED_LOOKASIDE_LIST Lookaside);
5217 ExFreeToPagedLookasideList(
5218 /*IN*/ PPAGED_LOOKASIDE_LIST Lookaside,
5219 /*IN*/ PVOID Entry);
5221 #endif /* (__USE_NTOSKRNL__) && (_WIN32_WINNT >= 0x0501) */
5226 ExAllocatePoolWithQuotaTag(
5227 /*IN*/ POOL_TYPE PoolType,
5228 /*IN*/ SIZE_T NumberOfBytes,
5234 ExAllocatePoolWithTag(
5235 /*IN*/ POOL_TYPE PoolType,
5236 /*IN*/ SIZE_T NumberOfBytes,
5241 #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
5242 #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
5244 #else /* !POOL_TAGGING */
5250 /*IN*/ POOL_TYPE PoolType,
5251 /*IN*/ SIZE_T NumberOfBytes);
5256 ExAllocatePoolWithQuota(
5257 /*IN*/ POOL_TYPE PoolType,
5258 /*IN*/ SIZE_T NumberOfBytes);
5260 #endif /* POOL_TAGGING */
5265 ExAllocatePoolWithTagPriority(
5266 /*IN*/ POOL_TYPE PoolType,
5267 /*IN*/ SIZE_T NumberOfBytes,
5269 /*IN*/ EX_POOL_PRIORITY Priority);
5274 ExConvertExclusiveToSharedLite(
5275 /*IN*/ PERESOURCE Resource);
5281 /*OUT*/ PCALLBACK_OBJECT *CallbackObject,
5282 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes,
5283 /*IN*/ BOOLEAN Create,
5284 /*IN*/ BOOLEAN AllowMultipleCallbacks);
5289 ExDeleteNPagedLookasideList(
5290 /*IN*/ PNPAGED_LOOKASIDE_LIST Lookaside);
5295 ExDeletePagedLookasideList(
5296 /*IN*/ PPAGED_LOOKASIDE_LIST Lookaside);
5301 ExDeleteResourceLite(
5302 /*IN*/ PERESOURCE Resource);
5310 #define PROTECTED_POOL 0x80000000
5313 #define ExFreePool(P) ExFreePoolWithTag(P, 0)
5325 * ExGetCurrentResourceThread(
5328 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD) PsGetCurrentThread())
5333 ExGetExclusiveWaiterCount(
5334 /*IN*/ PERESOURCE Resource);
5345 ExGetSharedWaiterCount(
5346 /*IN*/ PERESOURCE Resource);
5352 /*IN*/ PRKEVENT Event,
5353 /*IN*/ EVENT_TYPE Type,
5354 /*IN*/ BOOLEAN State);
5358 * ExInitializeFastMutex(
5359 * IN PFAST_MUTEX FastMutex)
5361 #define ExInitializeFastMutex(_FastMutex) \
5363 (_FastMutex)->Count = 1; \
5364 (_FastMutex)->Owner = NULL; \
5365 (_FastMutex)->Contention = 0; \
5366 KeInitializeEvent(&(_FastMutex)->Event, SynchronizationEvent, FALSE); \
5372 ExInitializeNPagedLookasideList(
5373 /*IN*/ PNPAGED_LOOKASIDE_LIST Lookaside,
5374 /*IN*/ PALLOCATE_FUNCTION Allocate /*OPTIONAL*/,
5375 /*IN*/ PFREE_FUNCTION Free /*OPTIONAL*/,
5379 /*IN*/ USHORT Depth);
5384 ExInitializePagedLookasideList(
5385 /*IN*/ PPAGED_LOOKASIDE_LIST Lookaside,
5386 /*IN*/ PALLOCATE_FUNCTION Allocate /*OPTIONAL*/,
5387 /*IN*/ PFREE_FUNCTION Free /*OPTIONAL*/,
5391 /*IN*/ USHORT Depth);
5396 ExInitializeResourceLite(
5397 /*IN*/ PERESOURCE Resource);
5401 * InitializeSListHead(
5402 * IN PSLIST_HEADER SListHead)
5404 #define InitializeSListHead(_SListHead) \
5405 (_SListHead)->Alignment = 0
5407 #define ExInitializeSListHead InitializeSListHead
5412 ExInterlockedAddLargeInteger(
5413 /*IN*/ PLARGE_INTEGER Addend,
5414 /*IN*/ LARGE_INTEGER Increment,
5415 /*IN*/ PKSPIN_LOCK Lock);
5420 ExInterlockedAddLargeStatistic(
5421 /*IN*/ PLARGE_INTEGER Addend,
5422 /*IN*/ ULONG Increment);
5427 ExInterlockedAddUlong(
5428 /*IN*/ PULONG Addend,
5429 /*IN*/ ULONG Increment,
5435 ExfInterlockedAddUlong(
5436 /*IN*/ PULONG Addend,
5437 /*IN*/ ULONG Increment,
5444 ExInterlockedCompareExchange64(
5445 /*IN OUT*/ PLONGLONG Destination,
5446 /*IN*/ PLONGLONG Exchange,
5447 /*IN*/ PLONGLONG Comparand,
5448 /*IN*/ PKSPIN_LOCK Lock);
5453 ExInterlockedFlushSList(
5454 /*IN*/ PSLIST_HEADER ListHead);
5459 ExInterlockedInsertHeadList(
5460 /*IN*/ PLIST_ENTRY ListHead,
5461 /*IN*/ PLIST_ENTRY ListEntry,
5462 /*IN*/ PKSPIN_LOCK Lock);
5467 ExfInterlockedInsertHeadList(
5468 /*IN*/ PLIST_ENTRY ListHead,
5469 /*IN*/ PLIST_ENTRY ListEntry,
5470 /*IN*/ PKSPIN_LOCK Lock);
5475 ExInterlockedInsertTailList(
5476 /*IN*/ PLIST_ENTRY ListHead,
5477 /*IN*/ PLIST_ENTRY ListEntry,
5478 /*IN*/ PKSPIN_LOCK Lock);
5483 ExfInterlockedInsertTailList(
5484 /*IN*/ PLIST_ENTRY ListHead,
5485 /*IN*/ PLIST_ENTRY ListEntry,
5486 /*IN*/ PKSPIN_LOCK Lock);
5491 ExInterlockedPopEntryList(
5492 /*IN*/ PSINGLE_LIST_ENTRY ListHead,
5493 /*IN*/ PKSPIN_LOCK Lock);
5498 ExfInterlockedPopEntryList(
5499 /*IN*/ PSINGLE_LIST_ENTRY ListHead,
5500 /*IN*/ PKSPIN_LOCK Lock);
5506 ExInterlockedPushEntryList(
5507 /*IN*/ PSINGLE_LIST_ENTRY ListHead,
5508 /*IN*/ PSINGLE_LIST_ENTRY ListEntry,
5509 /*IN*/ PKSPIN_LOCK Lock);
5514 ExfInterlockedPushEntryList(
5515 /*IN*/ PSINGLE_LIST_ENTRY ListHead,
5516 /*IN*/ PSINGLE_LIST_ENTRY ListEntry,
5517 /*IN*/ PKSPIN_LOCK Lock);
5523 ExInterlockedRemoveHeadList(
5524 /*IN*/ PLIST_ENTRY ListHead,
5525 /*IN*/ PKSPIN_LOCK Lock);
5530 ExfInterlockedRemoveHeadList(
5531 /*IN*/ PLIST_ENTRY ListHead,
5532 /*IN*/ PKSPIN_LOCK Lock);
5538 ExIsProcessorFeaturePresent(
5539 /*IN*/ ULONG ProcessorFeature);
5544 ExIsResourceAcquiredExclusiveLite(
5545 /*IN*/ PERESOURCE Resource);
5550 ExIsResourceAcquiredLite(
5551 /*IN*/ PERESOURCE Resource);
5556 ExIsResourceAcquiredSharedLite(
5557 /*IN*/ PERESOURCE Resource);
5562 ExLocalTimeToSystemTime(
5563 /*IN*/ PLARGE_INTEGER LocalTime,
5564 /*OUT*/ PLARGE_INTEGER SystemTime);
5570 /*IN*/ PCALLBACK_OBJECT CallbackObject,
5571 /*IN*/ PVOID Argument1,
5572 /*IN*/ PVOID Argument2);
5577 ExRaiseAccessViolation(
5583 ExRaiseDatatypeMisalignment(
5590 /*IN*/ NTSTATUS Status);
5596 /*IN*/ PCALLBACK_OBJECT CallbackObject,
5597 /*IN*/ PCALLBACK_FUNCTION CallbackFunction,
5598 /*IN*/ PVOID CallbackContext);
5603 ExReinitializeResourceLite(
5604 /*IN*/ PERESOURCE Resource);
5610 /*IN*/ PFAST_MUTEX FastMutex);
5615 ExReleaseFastMutexUnsafe(
5616 /*IN*/ PFAST_MUTEX FastMutex);
5621 ExReleaseResourceForThreadLite(
5622 /*IN*/ PERESOURCE Resource,
5623 /*IN*/ ERESOURCE_THREAD ResourceThreadId);
5628 ExReleaseResourceLite(
5629 /*IN*/ PERESOURCE Resource);
5634 ExSetResourceOwnerPointer(
5635 /*IN*/ PERESOURCE Resource,
5636 /*IN*/ PVOID OwnerPointer);
5641 ExSetTimerResolution(
5642 /*IN*/ ULONG DesiredTime,
5643 /*IN*/ BOOLEAN SetResolution);
5648 ExSystemTimeToLocalTime(
5649 /*IN*/ PLARGE_INTEGER SystemTime,
5650 /*OUT*/ PLARGE_INTEGER LocalTime);
5655 ExTryToAcquireFastMutex(
5656 /*IN*/ PFAST_MUTEX FastMutex);
5661 ExTryToAcquireResourceExclusiveLite(
5662 /*IN*/ PERESOURCE Resource);
5667 ExUnregisterCallback(
5668 /*IN*/ PVOID CbRegistration);
5674 /*OUT*/ UUID *Uuid);
5680 /*IN*/ SUITE_TYPE SuiteType);
5684 #define PAGED_CODE() { \
5685 if (KeGetCurrentIrql() > APC_LEVEL) { \
5686 KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
5693 #define PAGED_CODE()
5701 /*IN*/ CONST VOID *Address,
5702 /*IN*/ ULONG Length,
5703 /*IN*/ ULONG Alignment);
5709 /*IN*/ CONST VOID *Address,
5710 /*IN*/ ULONG Length,
5711 /*IN*/ ULONG Alignment);
5715 /** Configuration manager routines **/
5721 /*IN*/ PEX_CALLBACK_FUNCTION Function,
5722 /*IN*/ PVOID Context,
5723 /*IN OUT*/ PLARGE_INTEGER Cookie);
5728 CmUnRegisterCallback(
5729 /*IN*/ LARGE_INTEGER Cookie);
5733 /** Filesystem runtime library routines **/
5738 FsRtlIsTotalDeviceFailure(
5739 /*IN*/ NTSTATUS Status);
5743 /** Hardware abstraction layer routines **/
5749 /*IN*/ PDEVICE_OBJECT DeviceObject,
5750 /*IN*/ ULONG SectorSize,
5751 /*IN*/ ULONG MBRTypeIdentifier,
5752 /*OUT*/ PVOID Buffer);
5757 READ_PORT_BUFFER_UCHAR(
5759 /*IN*/ PUCHAR Buffer,
5760 /*IN*/ ULONG Count);
5765 READ_PORT_BUFFER_ULONG(
5767 /*IN*/ PULONG Buffer,
5768 /*IN*/ ULONG Count);
5773 READ_PORT_BUFFER_USHORT(
5774 /*IN*/ PUSHORT Port,
5775 /*IN*/ PUSHORT Buffer,
5776 /*IN*/ ULONG Count);
5782 /*IN*/ PUCHAR Port);
5788 /*IN*/ PULONG Port);
5794 /*IN*/ PUSHORT Port);
5799 READ_REGISTER_BUFFER_UCHAR(
5800 /*IN*/ PUCHAR Register,
5801 /*IN*/ PUCHAR Buffer,
5802 /*IN*/ ULONG Count);
5807 READ_REGISTER_BUFFER_ULONG(
5808 /*IN*/ PULONG Register,
5809 /*IN*/ PULONG Buffer,
5810 /*IN*/ ULONG Count);
5815 READ_REGISTER_BUFFER_USHORT(
5816 /*IN*/ PUSHORT Register,
5817 /*IN*/ PUSHORT Buffer,
5818 /*IN*/ ULONG Count);
5823 READ_REGISTER_UCHAR(
5824 /*IN*/ PUCHAR Register);
5829 READ_REGISTER_ULONG(
5830 /*IN*/ PULONG Register);
5835 READ_REGISTER_USHORT(
5836 /*IN*/ PUSHORT Register);
5841 WRITE_PORT_BUFFER_UCHAR(
5843 /*IN*/ PUCHAR Buffer,
5844 /*IN*/ ULONG Count);
5849 WRITE_PORT_BUFFER_ULONG(
5851 /*IN*/ PULONG Buffer,
5852 /*IN*/ ULONG Count);
5857 WRITE_PORT_BUFFER_USHORT(
5858 /*IN*/ PUSHORT Port,
5859 /*IN*/ PUSHORT Buffer,
5860 /*IN*/ ULONG Count);
5867 /*IN*/ UCHAR Value);
5874 /*IN*/ ULONG Value);
5880 /*IN*/ PUSHORT Port,
5881 /*IN*/ USHORT Value);
5886 WRITE_REGISTER_BUFFER_UCHAR(
5887 /*IN*/ PUCHAR Register,
5888 /*IN*/ PUCHAR Buffer,
5889 /*IN*/ ULONG Count);
5894 WRITE_REGISTER_BUFFER_ULONG(
5895 /*IN*/ PULONG Register,
5896 /*IN*/ PULONG Buffer,
5897 /*IN*/ ULONG Count);
5902 WRITE_REGISTER_BUFFER_USHORT(
5903 /*IN*/ PUSHORT Register,
5904 /*IN*/ PUSHORT Buffer,
5905 /*IN*/ ULONG Count);
5910 WRITE_REGISTER_UCHAR(
5911 /*IN*/ PUCHAR Register,
5912 /*IN*/ UCHAR Value);
5917 WRITE_REGISTER_ULONG(
5918 /*IN*/ PULONG Register,
5919 /*IN*/ ULONG Value);
5924 WRITE_REGISTER_USHORT(
5925 /*IN*/ PUSHORT Register,
5926 /*IN*/ USHORT Value);
5928 /** I/O manager routines **/
5933 IoAcquireCancelSpinLock(
5934 /*OUT*/ PKIRQL Irql);
5939 IoAcquireRemoveLockEx(
5940 /*IN*/ PIO_REMOVE_LOCK RemoveLock,
5941 /*IN*/ PVOID Tag /*OPTIONAL*/,
5944 /*IN*/ ULONG RemlockSize);
5948 * IoAcquireRemoveLock(
5949 * IN PIO_REMOVE_LOCK RemoveLock,
5950 * IN PVOID Tag OPTIONAL)
5952 #define IoAcquireRemoveLock(_RemoveLock, \
5954 IoAcquireRemoveLockEx(_RemoveLock, _Tag, __FILE__, __LINE__, sizeof(IO_REMOVE_LOCK))
5958 * IoAdjustPagingPathCount(
5960 * IN BOOLEAN Increment)
5962 #define IoAdjustPagingPathCount(_Count, \
5967 InterlockedIncrement(_Count); \
5971 InterlockedDecrement(_Count); \
5978 IoAllocateController(
5979 /*IN*/ PCONTROLLER_OBJECT ControllerObject,
5980 /*IN*/ PDEVICE_OBJECT DeviceObject,
5981 /*IN*/ PDRIVER_CONTROL ExecutionRoutine,
5982 /*IN*/ PVOID Context);
5987 IoAllocateDriverObjectExtension(
5988 /*IN*/ PDRIVER_OBJECT DriverObject,
5989 /*IN*/ PVOID ClientIdentificationAddress,
5990 /*IN*/ ULONG DriverObjectExtensionSize,
5991 /*OUT*/ PVOID *DriverObjectExtension);
5993 typedef struct _IO_ERROR_LOG_PACKET {
5994 UCHAR MajorFunctionCode;
5996 USHORT DumpDataSize;
5997 USHORT NumberOfStrings;
5998 USHORT StringOffset;
5999 USHORT EventCategory;
6001 ULONG UniqueErrorValue;
6002 NTSTATUS FinalStatus;
6003 ULONG SequenceNumber;
6004 ULONG IoControlCode;
6005 LARGE_INTEGER DeviceOffset;
6007 } IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET;
6012 IoAllocateErrorLogEntry(
6013 /*IN*/ PVOID IoObject,
6014 /*IN*/ UCHAR EntrySize);
6020 /*IN*/ CCHAR StackSize,
6021 /*IN*/ BOOLEAN ChargeQuota);
6027 /*IN*/ PVOID VirtualAddress,
6028 /*IN*/ ULONG Length,
6029 /*IN*/ BOOLEAN SecondaryBuffer,
6030 /*IN*/ BOOLEAN ChargeQuota,
6031 /*IN OUT*/ PIRP Irp /*OPTIONAL*/);
6037 /*IN*/ PDEVICE_OBJECT DeviceObject);
6040 * VOID IoAssignArcName(
6041 * IN PUNICODE_STRING ArcName,
6042 * IN PUNICODE_STRING DeviceName);
6044 #define IoAssignArcName(_ArcName, _DeviceName) ( \
6045 IoCreateSymbolicLink((_ArcName), (_DeviceName)))
6051 /*IN*/ PDEVICE_OBJECT SourceDevice,
6052 /*IN*/ PUNICODE_STRING TargetDevice,
6053 /*OUT*/ PDEVICE_OBJECT *AttachedDevice);
6058 IoAttachDeviceToDeviceStack(
6059 /*IN*/ PDEVICE_OBJECT SourceDevice,
6060 /*IN*/ PDEVICE_OBJECT TargetDevice);
6065 IoBuildAsynchronousFsdRequest(
6066 /*IN*/ ULONG MajorFunction,
6067 /*IN*/ PDEVICE_OBJECT DeviceObject,
6068 /*IN OUT*/ PVOID Buffer /*OPTIONAL*/,
6069 /*IN*/ ULONG Length /*OPTIONAL*/,
6070 /*IN*/ PLARGE_INTEGER StartingOffset /*OPTIONAL*/,
6071 /*IN*/ PIO_STATUS_BLOCK IoStatusBlock /*OPTIONAL*/);
6076 IoBuildDeviceIoControlRequest(
6077 /*IN*/ ULONG IoControlCode,
6078 /*IN*/ PDEVICE_OBJECT DeviceObject,
6079 /*IN*/ PVOID InputBuffer /*OPTIONAL*/,
6080 /*IN*/ ULONG InputBufferLength,
6081 /*OUT*/ PVOID OutputBuffer /*OPTIONAL*/,
6082 /*IN*/ ULONG OutputBufferLength,
6083 /*IN*/ BOOLEAN InternalDeviceIoControl,
6084 /*IN*/ PKEVENT Event,
6085 /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock);
6091 /*IN*/ PMDL SourceMdl,
6092 /*IN OUT*/ PMDL TargetMdl,
6093 /*IN*/ PVOID VirtualAddress,
6094 /*IN*/ ULONG Length);
6099 IoBuildSynchronousFsdRequest(
6100 /*IN*/ ULONG MajorFunction,
6101 /*IN*/ PDEVICE_OBJECT DeviceObject,
6102 /*IN OUT*/ PVOID Buffer /*OPTIONAL*/,
6103 /*IN*/ ULONG Length /*OPTIONAL*/,
6104 /*IN*/ PLARGE_INTEGER StartingOffset /*OPTIONAL*/,
6105 /*IN*/ PKEVENT Event,
6106 /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock);
6112 /*IN*/ PDEVICE_OBJECT DeviceObject,
6113 /*IN OUT*/ PIRP Irp);
6118 * IN PDEVICE_OBJECT DeviceObject,
6121 #define IoCallDriver IofCallDriver
6127 /*IN*/ PDEVICE_OBJECT DeviceObject,
6128 /*IN*/ PFILE_OBJECT FileObject);
6140 /*IN*/ ACCESS_MASK DesiredAccess,
6141 /*IN*/ ULONG DesiredShareAccess,
6142 /*IN OUT*/ PFILE_OBJECT FileObject,
6143 /*IN OUT*/ PSHARE_ACCESS ShareAccess,
6144 /*IN*/ BOOLEAN Update);
6151 /*IN*/ CCHAR PriorityBoost);
6155 * IoCompleteRequest(
6157 * IN CCHAR PriorityBoost)
6159 #define IoCompleteRequest IofCompleteRequest
6165 /*OUT*/ PKINTERRUPT *InterruptObject,
6166 /*IN*/ PKSERVICE_ROUTINE ServiceRoutine,
6167 /*IN*/ PVOID ServiceContext,
6168 /*IN*/ PKSPIN_LOCK SpinLock /*OPTIONAL*/,
6169 /*IN*/ ULONG Vector,
6171 /*IN*/ KIRQL SynchronizeIrql,
6172 /*IN*/ KINTERRUPT_MODE InterruptMode,
6173 /*IN*/ BOOLEAN ShareVector,
6174 /*IN*/ KAFFINITY ProcessorEnableMask,
6175 /*IN*/ BOOLEAN FloatingSave);
6178 * PIO_STACK_LOCATION
6179 * IoGetCurrentIrpStackLocation(
6182 #define IoGetCurrentIrpStackLocation(_Irp) \
6183 ((_Irp)->Tail.Overlay.CurrentStackLocation)
6186 * PIO_STACK_LOCATION
6187 * IoGetNextIrpStackLocation(
6190 #define IoGetNextIrpStackLocation(_Irp) \
6191 ((_Irp)->Tail.Overlay.CurrentStackLocation - 1)
6195 * IoCopyCurrentIrpStackLocationToNext(
6198 #define IoCopyCurrentIrpStackLocationToNext(_Irp) \
6200 PIO_STACK_LOCATION _IrpSp; \
6201 PIO_STACK_LOCATION _NextIrpSp; \
6202 _IrpSp = IoGetCurrentIrpStackLocation(_Irp); \
6203 _NextIrpSp = IoGetNextIrpStackLocation(_Irp); \
6204 RtlCopyMemory(_NextIrpSp, _IrpSp, \
6205 FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine)); \
6206 _NextIrpSp->Control = 0; \
6219 /*IN*/ PDRIVER_OBJECT DriverObject,
6220 /*IN*/ ULONG DeviceExtensionSize,
6221 /*IN*/ PUNICODE_STRING DeviceName /*OPTIONAL*/,
6222 /*IN*/ DEVICE_TYPE DeviceType,
6223 /*IN*/ ULONG DeviceCharacteristics,
6224 /*IN*/ BOOLEAN Exclusive,
6225 /*OUT*/ PDEVICE_OBJECT *DeviceObject);
6231 /*IN*/ PDEVICE_OBJECT DeviceObject,
6232 /*IN*/ PCREATE_DISK Disk);
6238 /*OUT*/ PHANDLE FileHandle,
6239 /*IN*/ ACCESS_MASK DesiredAccess,
6240 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes,
6241 /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock,
6242 /*IN*/ PLARGE_INTEGER AllocationSize /*OPTIONAL*/,
6243 /*IN*/ ULONG FileAttributes,
6244 /*IN*/ ULONG ShareAccess,
6245 /*IN*/ ULONG Disposition,
6246 /*IN*/ ULONG CreateOptions,
6247 /*IN*/ PVOID EaBuffer /*OPTIONAL*/,
6248 /*IN*/ ULONG EaLength,
6249 /*IN*/ CREATE_FILE_TYPE CreateFileType,
6250 /*IN*/ PVOID ExtraCreateParameters /*OPTIONAL*/,
6251 /*IN*/ ULONG Options);
6256 IoCreateNotificationEvent(
6257 /*IN*/ PUNICODE_STRING EventName,
6258 /*OUT*/ PHANDLE EventHandle);
6263 IoCreateSymbolicLink(
6264 /*IN*/ PUNICODE_STRING SymbolicLinkName,
6265 /*IN*/ PUNICODE_STRING DeviceName);
6270 IoCreateSynchronizationEvent(
6271 /*IN*/ PUNICODE_STRING EventName,
6272 /*OUT*/ PHANDLE EventHandle);
6277 IoCreateUnprotectedSymbolicLink(
6278 /*IN*/ PUNICODE_STRING SymbolicLinkName,
6279 /*IN*/ PUNICODE_STRING DeviceName);
6286 /*IN*/ PIO_CSQ_INSERT_IRP CsqInsertIrp,
6287 /*IN*/ PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
6288 /*IN*/ PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
6289 /*IN*/ PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
6290 /*IN*/ PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
6291 /*IN*/ PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp);
6299 /*IN*/ PIO_CSQ_IRP_CONTEXT Context);
6306 /*IN*/ PIO_CSQ_IRP_CONTEXT Context);
6313 /*IN*/ PVOID PeekContext);
6319 /*IN*/ PCONTROLLER_OBJECT ControllerObject);
6325 /*IN*/ PDEVICE_OBJECT DeviceObject);
6330 IoDeleteSymbolicLink(
6331 /*IN*/ PUNICODE_STRING SymbolicLinkName);
6335 * IoDeassignArcName(
6336 * IN PUNICODE_STRING ArcName)
6338 #define IoDeassignArcName IoDeleteSymbolicLink
6344 /*IN OUT*/ PDEVICE_OBJECT TargetDevice);
6349 IoDisconnectInterrupt(
6350 /*IN*/ PKINTERRUPT InterruptObject);
6355 IoForwardIrpSynchronously(
6356 /*IN*/ PDEVICE_OBJECT DeviceObject,
6359 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
6365 /*IN*/ PCONTROLLER_OBJECT ControllerObject);
6370 IoFreeErrorLogEntry(
6389 /*IN*/ PIO_WORKITEM pIOWorkItem);
6394 IoGetAttachedDevice(
6395 /*IN*/ PDEVICE_OBJECT DeviceObject);
6400 IoGetAttachedDeviceReference(
6401 /*IN*/ PDEVICE_OBJECT DeviceObject);
6406 IoGetBootDiskInformation(
6407 /*IN OUT*/ PBOOTDISK_INFORMATION BootDiskInformation,
6411 PCONFIGURATION_INFORMATION
6413 IoGetConfigurationInformation(
6419 IoGetCurrentProcess(
6425 IoGetDeviceInterfaceAlias(
6426 /*IN*/ PUNICODE_STRING SymbolicLinkName,
6427 /*IN*/ CONST GUID *AliasInterfaceClassGuid,
6428 /*OUT*/ PUNICODE_STRING AliasSymbolicLinkName);
6433 IoGetDeviceInterfaces(
6434 /*IN*/ CONST GUID *InterfaceClassGuid,
6435 /*IN*/ PDEVICE_OBJECT PhysicalDeviceObject /*OPTIONAL*/,
6437 /*OUT*/ PWSTR *SymbolicLinkList);
6442 IoGetDeviceObjectPointer(
6443 /*IN*/ PUNICODE_STRING ObjectName,
6444 /*IN*/ ACCESS_MASK DesiredAccess,
6445 /*OUT*/ PFILE_OBJECT *FileObject,
6446 /*OUT*/ PDEVICE_OBJECT *DeviceObject);
6451 IoGetDeviceProperty(
6452 /*IN*/ PDEVICE_OBJECT DeviceObject,
6453 /*IN*/ DEVICE_REGISTRY_PROPERTY DeviceProperty,
6454 /*IN*/ ULONG BufferLength,
6455 /*OUT*/ PVOID PropertyBuffer,
6456 /*OUT*/ PULONG ResultLength);
6461 IoGetDeviceToVerify(
6462 /*IN*/ PETHREAD Thread);
6468 /*IN*/ PDEVICE_OBJECT PhysicalDeviceObject,
6469 /*IN*/ PDEVICE_DESCRIPTION DeviceDescription,
6470 /*IN OUT*/ PULONG NumberOfMapRegisters);
6475 IoGetDriverObjectExtension(
6476 /*IN*/ PDRIVER_OBJECT DriverObject,
6477 /*IN*/ PVOID ClientIdentificationAddress);
6482 IoGetFileObjectGenericMapping(
6487 * IoGetFunctionCodeFromCtlCode(
6488 * IN ULONG ControlCode)
6490 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
6491 (((_ControlCode) >> 2) & 0x00000FFF)
6502 IoGetRelatedDeviceObject(
6503 /*IN*/ PFILE_OBJECT FileObject);
6508 IoGetRemainingStackSize(
6515 /*OUT*/ PULONG_PTR LowLimit,
6516 /*OUT*/ PULONG_PTR HighLimit);
6523 /*IN*/ PKDEFERRED_ROUTINE DeferredRoutine,
6524 /*IN*/ PVOID DeferredContext);
6528 * IoInitializeDpcRequest(
6529 * IN PDEVICE_OBJECT DeviceObject,
6530 * IN PIO_DPC_ROUTINE DpcRoutine)
6532 #define IoInitializeDpcRequest(_DeviceObject, \
6534 KeInitializeDpc(&(_DeviceObject)->Dpc, \
6535 (PKDEFERRED_ROUTINE) (_DpcRoutine), \
6542 /*IN OUT*/ PIRP Irp,
6543 /*IN*/ USHORT PacketSize,
6544 /*IN*/ CCHAR StackSize);
6549 IoInitializeRemoveLockEx(
6550 /*IN*/ PIO_REMOVE_LOCK Lock,
6551 /*IN*/ ULONG AllocateTag,
6552 /*IN*/ ULONG MaxLockedMinutes,
6553 /*IN*/ ULONG HighWatermark,
6554 /*IN*/ ULONG RemlockSize);
6557 * IoInitializeRemoveLock(
6558 * IN PIO_REMOVE_LOCK Lock,
6559 * IN ULONG AllocateTag,
6560 * IN ULONG MaxLockedMinutes,
6561 * IN ULONG HighWatermark)
6563 #define IoInitializeRemoveLock( \
6564 Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
6565 IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
6566 HighWatermark, sizeof(IO_REMOVE_LOCK))
6572 /*IN*/ PDEVICE_OBJECT DeviceObject,
6573 /*IN*/ PIO_TIMER_ROUTINE TimerRoutine,
6574 /*IN*/ PVOID Context);
6579 IoInvalidateDeviceRelations(
6580 /*IN*/ PDEVICE_OBJECT DeviceObject,
6581 /*IN*/ DEVICE_RELATION_TYPE Type);
6586 IoInvalidateDeviceState(
6587 /*IN*/ PDEVICE_OBJECT PhysicalDeviceObject);
6593 /*IN*/ PIRP Irp /*OPTIONAL*/);
6597 * IoIsErrorUserInduced(
6598 * IN NTSTATUS Status);
6600 #define IoIsErrorUserInduced(Status) \
6601 ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
6602 ((Status) == STATUS_IO_TIMEOUT) || \
6603 ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
6604 ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
6605 ((Status) == STATUS_VERIFY_REQUIRED) || \
6606 ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
6607 ((Status) == STATUS_WRONG_VOLUME)))
6612 IoIsWdmVersionAvailable(
6613 /*IN*/ UCHAR MajorVersion,
6614 /*IN*/ UCHAR MinorVersion);
6619 IoMakeAssociatedIrp(
6621 /*IN*/ CCHAR StackSize);
6628 #define IoMarkIrpPending(_Irp) \
6629 (IoGetCurrentIrpStackLocation(_Irp)->Control |= SL_PENDING_RETURNED)
6634 IoOpenDeviceInterfaceRegistryKey(
6635 /*IN*/ PUNICODE_STRING SymbolicLinkName,
6636 /*IN*/ ACCESS_MASK DesiredAccess,
6637 /*OUT*/ PHANDLE DeviceInterfaceKey);
6642 IoOpenDeviceRegistryKey(
6643 /*IN*/ PDEVICE_OBJECT DeviceObject,
6644 /*IN*/ ULONG DevInstKeyType,
6645 /*IN*/ ACCESS_MASK DesiredAccess,
6646 /*OUT*/ PHANDLE DevInstRegKey);
6651 IoQueryDeviceDescription(
6652 /*IN*/ PINTERFACE_TYPE BusType /*OPTIONAL*/,
6653 /*IN*/ PULONG BusNumber /*OPTIONAL*/,
6654 /*IN*/ PCONFIGURATION_TYPE ControllerType /*OPTIONAL*/,
6655 /*IN*/ PULONG ControllerNumber /*OPTIONAL*/,
6656 /*IN*/ PCONFIGURATION_TYPE PeripheralType /*OPTIONAL*/,
6657 /*IN*/ PULONG PeripheralNumber /*OPTIONAL*/,
6658 /*IN*/ PIO_QUERY_DEVICE_ROUTINE CalloutRoutine,
6659 /*IN*/ PVOID Context);
6665 /*IN*/ PIO_WORKITEM pIOWorkItem,
6666 /*IN*/ PIO_WORKITEM_ROUTINE Routine,
6667 /*IN*/ WORK_QUEUE_TYPE QueueType,
6668 /*IN*/ PVOID Context);
6675 /*IN*/ PVPB Vpb /*OPTIONAL*/,
6676 /*IN*/ PDEVICE_OBJECT RealDeviceObject);
6681 IoRaiseInformationalHardError(
6682 /*IN*/ NTSTATUS ErrorStatus,
6683 /*IN*/ PUNICODE_STRING String /*OPTIONAL*/,
6684 /*IN*/ PKTHREAD Thread /*OPTIONAL*/);
6689 IoReadDiskSignature(
6690 /*IN*/ PDEVICE_OBJECT DeviceObject,
6691 /*IN*/ ULONG BytesPerSector,
6692 /*OUT*/ PDISK_SIGNATURE Signature);
6697 IoReadPartitionTableEx(
6698 /*IN*/ PDEVICE_OBJECT DeviceObject,
6699 /*IN*/ struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer);
6704 IoRegisterBootDriverReinitialization(
6705 /*IN*/ PDRIVER_OBJECT DriverObject,
6706 /*IN*/ PDRIVER_REINITIALIZE DriverReinitializationRoutine,
6707 /*IN*/ PVOID Context);
6712 IoRegisterBootDriverReinitialization(
6713 /*IN*/ PDRIVER_OBJECT DriverObject,
6714 /*IN*/ PDRIVER_REINITIALIZE DriverReinitializationRoutine,
6715 /*IN*/ PVOID Context);
6720 IoRegisterDeviceInterface(
6721 /*IN*/ PDEVICE_OBJECT PhysicalDeviceObject,
6722 /*IN*/ CONST GUID *InterfaceClassGuid,
6723 /*IN*/ PUNICODE_STRING ReferenceString /*OPTIONAL*/,
6724 /*OUT*/ PUNICODE_STRING SymbolicLinkName);
6729 IoRegisterDriverReinitialization(
6730 /*IN*/ PDRIVER_OBJECT DriverObject,
6731 /*IN*/ PDRIVER_REINITIALIZE DriverReinitializationRoutine,
6732 /*IN*/ PVOID Context);
6737 IoRegisterPlugPlayNotification(
6738 /*IN*/ IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
6739 /*IN*/ ULONG EventCategoryFlags,
6740 /*IN*/ PVOID EventCategoryData /*OPTIONAL*/,
6741 /*IN*/ PDRIVER_OBJECT DriverObject,
6742 /*IN*/ PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine,
6743 /*IN*/ PVOID Context,
6744 /*OUT*/ PVOID *NotificationEntry);
6749 IoRegisterShutdownNotification(
6750 /*IN*/ PDEVICE_OBJECT DeviceObject);
6755 IoReleaseCancelSpinLock(
6761 IoReleaseRemoveLockAndWaitEx(
6762 /*IN*/ PIO_REMOVE_LOCK RemoveLock,
6764 /*IN*/ ULONG RemlockSize);
6768 * IoReleaseRemoveLockAndWait(
6769 * IN PIO_REMOVE_LOCK RemoveLock,
6772 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
6774 IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
6779 IoReleaseRemoveLockEx(
6780 /*IN*/ PIO_REMOVE_LOCK RemoveLock,
6782 /*IN*/ ULONG RemlockSize);
6786 * IoReleaseRemoveLock(
6787 * IN PIO_REMOVE_LOCK RemoveLock,
6790 #define IoReleaseRemoveLock(_RemoveLock, \
6792 IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
6797 IoRemoveShareAccess(
6798 /*IN*/ PFILE_OBJECT FileObject,
6799 /*IN OUT*/ PSHARE_ACCESS ShareAccess);
6804 IoReportDetectedDevice(
6805 /*IN*/ PDRIVER_OBJECT DriverObject,
6806 /*IN*/ INTERFACE_TYPE LegacyBusType,
6807 /*IN*/ ULONG BusNumber,
6808 /*IN*/ ULONG SlotNumber,
6809 /*IN*/ PCM_RESOURCE_LIST ResourceList,
6810 /*IN*/ PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements /*OPTIONAL*/,
6811 /*IN*/ BOOLEAN ResourceAssigned,
6812 /*IN OUT*/ PDEVICE_OBJECT *DeviceObject);
6817 IoReportResourceForDetection(
6818 /*IN*/ PDRIVER_OBJECT DriverObject,
6819 /*IN*/ PCM_RESOURCE_LIST DriverList /*OPTIONAL*/,
6820 /*IN*/ ULONG DriverListSize /*OPTIONAL*/,
6821 /*IN*/ PDEVICE_OBJECT DeviceObject /*OPTIONAL*/,
6822 /*IN*/ PCM_RESOURCE_LIST DeviceList /*OPTIONAL*/,
6823 /*IN*/ ULONG DeviceListSize /*OPTIONAL*/,
6824 /*OUT*/ PBOOLEAN ConflictDetected);
6829 IoReportResourceUsage(
6830 /*IN*/ PUNICODE_STRING DriverClassName /*OPTIONAL*/,
6831 /*IN*/ PDRIVER_OBJECT DriverObject,
6832 /*IN*/ PCM_RESOURCE_LIST DriverList /*OPTIONAL*/,
6833 /*IN*/ ULONG DriverListSize /*OPTIONAL*/,
6834 /*IN*/ PDEVICE_OBJECT DeviceObject,
6835 /*IN*/ PCM_RESOURCE_LIST DeviceList /*OPTIONAL*/,
6836 /*IN*/ ULONG DeviceListSize /*OPTIONAL*/,
6837 /*IN*/ BOOLEAN OverrideConflict,
6838 /*OUT*/ PBOOLEAN ConflictDetected);
6843 IoReportTargetDeviceChange(
6844 /*IN*/ PDEVICE_OBJECT PhysicalDeviceObject,
6845 /*IN*/ PVOID NotificationStructure);
6850 IoReportTargetDeviceChangeAsynchronous(
6851 /*IN*/ PDEVICE_OBJECT PhysicalDeviceObject,
6852 /*IN*/ PVOID NotificationStructure,
6853 /*IN*/ PDEVICE_CHANGE_COMPLETE_CALLBACK Callback /*OPTIONAL*/,
6854 /*IN*/ PVOID Context /*OPTIONAL*/);
6859 IoRequestDeviceEject(
6860 /*IN*/ PDEVICE_OBJECT PhysicalDeviceObject);
6865 * IN PDEVICE_OBJECT DeviceObject,
6867 * IN PVOID Context);
6869 #define IoRequestDpc(DeviceObject, Irp, Context)( \
6870 KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
6876 /*IN OUT*/ PIRP Irp,
6877 /*IN*/ NTSTATUS Status);
6881 * IoSetCancelRoutine(
6883 * IN PDRIVER_CANCEL CancelRoutine)
6885 #define IoSetCancelRoutine(_Irp, \
6887 ((PDRIVER_CANCEL) InterlockedExchangePointer( \
6888 (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (_CancelRoutine)))
6892 * IoSetCompletionRoutine(
6894 * IN PIO_COMPLETION_ROUTINE CompletionRoutine,
6896 * IN BOOLEAN InvokeOnSuccess,
6897 * IN BOOLEAN InvokeOnError,
6898 * IN BOOLEAN InvokeOnCancel)
6900 #define IoSetCompletionRoutine(_Irp, \
6901 _CompletionRoutine, \
6907 PIO_STACK_LOCATION _IrpSp; \
6908 ASSERT(_InvokeOnSuccess || _InvokeOnError || _InvokeOnCancel ? \
6909 _CompletionRoutine != NULL : TRUE); \
6910 _IrpSp = IoGetNextIrpStackLocation(_Irp); \
6911 _IrpSp->CompletionRoutine = (PIO_COMPLETION_ROUTINE)(_CompletionRoutine); \
6912 _IrpSp->Context = (_Context); \
6913 _IrpSp->Control = 0; \
6914 if (_InvokeOnSuccess) _IrpSp->Control = SL_INVOKE_ON_SUCCESS; \
6915 if (_InvokeOnError) _IrpSp->Control |= SL_INVOKE_ON_ERROR; \
6916 if (_InvokeOnCancel) _IrpSp->Control |= SL_INVOKE_ON_CANCEL; \
6922 IoSetCompletionRoutineEx(
6923 /*IN*/ PDEVICE_OBJECT DeviceObject,
6925 /*IN*/ PIO_COMPLETION_ROUTINE CompletionRoutine,
6926 /*IN*/ PVOID Context,
6927 /*IN*/ BOOLEAN InvokeOnSuccess,
6928 /*IN*/ BOOLEAN InvokeOnError,
6929 /*IN*/ BOOLEAN InvokeOnCancel);
6934 IoSetDeviceInterfaceState(
6935 /*IN*/ PUNICODE_STRING SymbolicLinkName,
6936 /*IN*/ BOOLEAN Enable);
6941 IoSetHardErrorOrVerifyDevice(
6943 /*IN*/ PDEVICE_OBJECT DeviceObject);
6947 * IoSetNextIrpStackLocation(
6950 #define IoSetNextIrpStackLocation(_Irp) \
6952 (_Irp)->CurrentLocation--; \
6953 (_Irp)->Tail.Overlay.CurrentStackLocation--; \
6959 IoSetPartitionInformationEx(
6960 /*IN*/ PDEVICE_OBJECT DeviceObject,
6961 /*IN*/ ULONG PartitionNumber,
6962 /*IN*/ struct _SET_PARTITION_INFORMATION_EX *PartitionInfo);
6968 /*IN*/ ACCESS_MASK DesiredAccess,
6969 /*IN*/ ULONG DesiredShareAccess,
6970 /*IN OUT*/ PFILE_OBJECT FileObject,
6971 /*OUT*/ PSHARE_ACCESS ShareAccess);
6976 IoSetStartIoAttributes(
6977 /*IN*/ PDEVICE_OBJECT DeviceObject,
6978 /*IN*/ BOOLEAN DeferredStartIo,
6979 /*IN*/ BOOLEAN NonCancelable);
6984 IoSetSystemPartition(
6985 /*IN*/ PUNICODE_STRING VolumeNameString);
6990 IoSetThreadHardErrorMode(
6991 /*IN*/ BOOLEAN EnableHardErrors);
6996 * IN CCHAR StackSize)
6998 #define IoSizeOfIrp(_StackSize) \
6999 ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
7003 * IoSkipCurrentIrpStackLocation(
7006 #define IoSkipCurrentIrpStackLocation(_Irp) \
7008 (_Irp)->CurrentLocation++; \
7009 (_Irp)->Tail.Overlay.CurrentStackLocation++; \
7016 /*IN*/ PDEVICE_OBJECT DeviceObject,
7017 /*IN*/ BOOLEAN Cancelable);
7022 IoStartNextPacketByKey(
7023 /*IN*/ PDEVICE_OBJECT DeviceObject,
7024 /*IN*/ BOOLEAN Cancelable,
7031 /*IN*/ PDEVICE_OBJECT DeviceObject,
7033 /*IN*/ PULONG Key /*OPTIONAL*/,
7034 /*IN*/ PDRIVER_CANCEL CancelFunction /*OPTIONAL*/);
7040 /*IN*/ PDEVICE_OBJECT DeviceObject);
7046 /*IN*/ PDEVICE_OBJECT DeviceObject);
7051 IoUnregisterPlugPlayNotification(
7052 /*IN*/ PVOID NotificationEntry);
7057 IoUnregisterShutdownNotification(
7058 /*IN*/ PDEVICE_OBJECT DeviceObject);
7063 IoUpdateShareAccess(
7064 /*IN*/ PFILE_OBJECT FileObject,
7065 /*IN OUT*/ PSHARE_ACCESS ShareAccess);
7070 IoVerifyPartitionTable(
7071 /*IN*/ PDEVICE_OBJECT DeviceObject,
7072 /*IN*/ BOOLEAN FixErrors);
7077 IoVolumeDeviceToDosName(
7078 /*IN*/ PVOID VolumeDeviceObject,
7079 /*OUT*/ PUNICODE_STRING DosName);
7084 IoWMIAllocateInstanceIds(
7086 /*IN*/ ULONG InstanceCount,
7087 /*OUT*/ ULONG *FirstInstanceId);
7092 IoWMIDeviceObjectToProviderId(
7093 /*IN*/ PDEVICE_OBJECT DeviceObject);
7098 IoWMIDeviceObjectToInstanceName(
7099 /*IN*/ PVOID DataBlockObject,
7100 /*IN*/ PDEVICE_OBJECT DeviceObject,
7101 /*OUT*/ PUNICODE_STRING InstanceName);
7107 /*IN*/ PVOID DataBlockObject,
7108 /*IN*/ PUNICODE_STRING InstanceName,
7109 /*IN*/ ULONG MethodId,
7110 /*IN*/ ULONG InBufferSize,
7111 /*IN OUT*/ PULONG OutBufferSize,
7112 /*IN OUT*/ PUCHAR InOutBuffer);
7117 IoWMIHandleToInstanceName(
7118 /*IN*/ PVOID DataBlockObject,
7119 /*IN*/ HANDLE FileHandle,
7120 /*OUT*/ PUNICODE_STRING InstanceName);
7126 /*IN*/ GUID *DataBlockGuid,
7127 /*IN*/ ULONG DesiredAccess,
7128 /*OUT*/ PVOID *DataBlockObject);
7134 /*IN*/ PVOID DataBlockObject,
7135 /*IN OUT*/ ULONG *InOutBufferSize,
7136 /*OUT*/ PVOID OutBuffer);
7141 IoWMIQueryAllDataMultiple(
7142 /*IN*/ PVOID *DataBlockObjectList,
7143 /*IN*/ ULONG ObjectCount,
7144 /*IN OUT*/ ULONG *InOutBufferSize,
7145 /*OUT*/ PVOID OutBuffer);
7150 IoWMIQuerySingleInstance(
7151 /*IN*/ PVOID DataBlockObject,
7152 /*IN*/ PUNICODE_STRING InstanceName,
7153 /*IN OUT*/ ULONG *InOutBufferSize,
7154 /*OUT*/ PVOID OutBuffer);
7159 IoWMIQuerySingleInstanceMultiple(
7160 /*IN*/ PVOID *DataBlockObjectList,
7161 /*IN*/ PUNICODE_STRING InstanceNames,
7162 /*IN*/ ULONG ObjectCount,
7163 /*IN OUT*/ ULONG *InOutBufferSize,
7164 /*OUT*/ PVOID OutBuffer);
7169 IoWMIRegistrationControl(
7170 /*IN*/ PDEVICE_OBJECT DeviceObject,
7171 /*IN*/ ULONG Action);
7176 IoWMISetNotificationCallback(
7177 /*IN*/ PVOID Object,
7178 /*IN*/ WMI_NOTIFICATION_CALLBACK Callback,
7179 /*IN*/ PVOID Context);
7184 IoWMISetSingleInstance(
7185 /*IN*/ PVOID DataBlockObject,
7186 /*IN*/ PUNICODE_STRING InstanceName,
7187 /*IN*/ ULONG Version,
7188 /*IN*/ ULONG ValueBufferSize,
7189 /*IN*/ PVOID ValueBuffer);
7195 /*IN*/ PVOID DataBlockObject,
7196 /*IN*/ PUNICODE_STRING InstanceName,
7197 /*IN*/ ULONG DataItemId,
7198 /*IN*/ ULONG Version,
7199 /*IN*/ ULONG ValueBufferSize,
7200 /*IN*/ PVOID ValueBuffer);
7205 IoWMISuggestInstanceName(
7206 /*IN*/ PDEVICE_OBJECT PhysicalDeviceObject /*OPTIONAL*/,
7207 /*IN*/ PUNICODE_STRING SymbolicLinkName /*OPTIONAL*/,
7208 /*IN*/ BOOLEAN CombineNames,
7209 /*OUT*/ PUNICODE_STRING SuggestedInstanceName);
7215 /*IN*/ PVOID WnodeEventItem);
7220 IoWriteErrorLogEntry(
7221 /*IN*/ PVOID ElEntry);
7226 IoWritePartitionTableEx(
7227 /*IN*/ PDEVICE_OBJECT DeviceObject,
7228 /*IN*/ struct _DRIVE_LAYOUT_INFORMATION_EX *PartitionBuffer);
7232 /** Kernel routines **/
7237 KeAcquireInStackQueuedSpinLock(
7238 /*IN*/ PKSPIN_LOCK SpinLock,
7239 /*IN*/ PKLOCK_QUEUE_HANDLE LockHandle);
7244 KeAcquireInStackQueuedSpinLockAtDpcLevel(
7245 /*IN*/ PKSPIN_LOCK SpinLock,
7246 /*IN*/ PKLOCK_QUEUE_HANDLE LockHandle);
7251 KeAcquireInterruptSpinLock(
7252 /*IN*/ PKINTERRUPT Interrupt);
7258 /*IN*/ PKSPIN_LOCK SpinLock,
7259 /*OUT*/ PKIRQL OldIrql);
7261 /* System Service Dispatch Table */
7262 typedef PVOID (NTAPI * SSDT)(VOID);
7263 typedef SSDT * PSSDT;
7265 /* System Service Parameters Table */
7266 typedef UCHAR SSPT, * PSSPT;
7268 typedef struct _SSDT_ENTRY {
7270 PULONG ServiceCounterTable;
7271 ULONG NumberOfServices;
7273 } SSDT_ENTRY, *PSSDT_ENTRY;
7278 KeAddSystemServiceTable(
7280 /*IN*/ PULONG ServiceCounterTable,
7281 /*IN*/ ULONG NumberOfServices,
7283 /*IN*/ ULONG TableIndex);
7295 /*IN*/ PEPROCESS Process);
7301 /*IN*/ ULONG BugCheckCode);
7307 /*IN*/ ULONG BugCheckCode,
7308 /*IN*/ ULONG_PTR BugCheckParameter1,
7309 /*IN*/ ULONG_PTR BugCheckParameter2,
7310 /*IN*/ ULONG_PTR BugCheckParameter3,
7311 /*IN*/ ULONG_PTR BugCheckParameter4);
7317 /*IN*/ PKTIMER Timer);
7323 /*IN*/ PRKEVENT Event);
7328 KeDelayExecutionThread(
7329 /*IN*/ KPROCESSOR_MODE WaitMode,
7330 /*IN*/ BOOLEAN Alertable,
7331 /*IN*/ PLARGE_INTEGER Interval);
7336 KeDeregisterBugCheckCallback(
7337 /*IN*/ PKBUGCHECK_CALLBACK_RECORD CallbackRecord);
7348 KeEnterCriticalRegion(
7355 * IN BOOLEAN ReadOperation,
7356 * IN BOOLEAN DmaOperation)
7358 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
7363 KeFlushQueuedDpcs(VOID);
7380 KeGetRecommendedSharedDataAlignment(
7388 /*IN*/ PKTHREAD Thread,
7389 /*IN*/ UCHAR StateIndex,
7390 /*IN*/ PKKERNEL_ROUTINE KernelRoutine,
7391 /*IN*/ PKRUNDOWN_ROUTINE RundownRoutine,
7392 /*IN*/ PKNORMAL_ROUTINE NormalRoutine,
7394 /*IN*/ PVOID Context);
7399 KeInitializeDeviceQueue(
7400 /*IN*/ PKDEVICE_QUEUE DeviceQueue);
7406 /*IN*/ PRKMUTEX Mutex,
7407 /*IN*/ ULONG Level);
7412 KeInitializeSemaphore(
7413 /*IN*/ PRKSEMAPHORE Semaphore,
7420 KeInitializeSpinLock(
7421 /*IN*/ PKSPIN_LOCK SpinLock);
7427 /*IN*/ PKTIMER Timer);
7432 KeInitializeTimerEx(
7433 /*IN*/ PKTIMER Timer,
7434 /*IN*/ TIMER_TYPE Type);
7439 KeInsertByKeyDeviceQueue(
7440 /*IN*/ PKDEVICE_QUEUE DeviceQueue,
7441 /*IN*/ PKDEVICE_QUEUE_ENTRY DeviceQueueEntry,
7442 /*IN*/ ULONG SortKey);
7447 KeInsertDeviceQueue(
7448 /*IN*/ PKDEVICE_QUEUE DeviceQueue,
7449 /*IN*/ PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
7456 /*IN*/ PVOID SystemArgument1,
7457 /*IN*/ PVOID SystemArgument2);
7462 KeLeaveCriticalRegion(
7465 #define KeMemoryBarrier() asm("mfence;")
7471 /*IN*/ PRKEVENT Event,
7472 /*IN*/ KPRIORITY Increment,
7473 /*IN*/ BOOLEAN Wait);
7478 KeQueryInterruptTime(
7484 KeQueryPerformanceCounter(
7485 /*OUT*/ PLARGE_INTEGER PerformanceFrequency /*OPTIONAL*/);
7490 KeQueryPriorityThread(
7491 /*IN*/ PRKTHREAD Thread);
7497 /*OUT*/ PLARGE_INTEGER CurrentTime);
7503 /*OUT*/ PLARGE_INTEGER TickCount);
7508 KeQueryTimeIncrement(
7515 /*IN*/ PRKEVENT Event);
7521 /*IN*/ PRKMUTEX Mutex);
7526 KeReadStateSemaphore(
7527 /*IN*/ PRKSEMAPHORE Semaphore);
7533 /*IN*/ PKTIMER Timer);
7538 KeRegisterBugCheckCallback(
7539 /*IN*/ PKBUGCHECK_CALLBACK_RECORD CallbackRecord,
7540 /*IN*/ PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine,
7541 /*IN*/ PVOID Buffer,
7542 /*IN*/ ULONG Length,
7543 /*IN*/ PUCHAR Component);
7548 KeReleaseInStackQueuedSpinLock(
7549 /*IN*/ PKLOCK_QUEUE_HANDLE LockHandle);
7554 KeReleaseInStackQueuedSpinLockFromDpcLevel(
7555 /*IN*/ PKLOCK_QUEUE_HANDLE LockHandle);
7560 KeReleaseInterruptSpinLock(
7561 /*IN*/ PKINTERRUPT Interrupt,
7562 /*IN*/ KIRQL OldIrql);
7568 /*IN*/ PRKMUTEX Mutex,
7569 /*IN*/ BOOLEAN Wait);
7575 /*IN*/ PRKSEMAPHORE Semaphore,
7576 /*IN*/ KPRIORITY Increment,
7577 /*IN*/ LONG Adjustment,
7578 /*IN*/ BOOLEAN Wait);
7584 /*IN*/ PKSPIN_LOCK SpinLock,
7585 /*IN*/ KIRQL NewIrql);
7588 PKDEVICE_QUEUE_ENTRY
7590 KeRemoveByKeyDeviceQueue(
7591 /*IN*/ PKDEVICE_QUEUE DeviceQueue,
7592 /*IN*/ ULONG SortKey);
7595 PKDEVICE_QUEUE_ENTRY
7597 KeRemoveDeviceQueue(
7598 /*IN*/ PKDEVICE_QUEUE DeviceQueue);
7603 KeRemoveEntryDeviceQueue(
7604 /*IN*/ PKDEVICE_QUEUE DeviceQueue,
7605 /*IN*/ PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
7617 /*IN*/ PRKEVENT Event);
7622 KeRestoreFloatingPointState(
7623 /*IN*/ PKFLOATING_SAVE FloatSave);
7628 KeSaveFloatingPointState(
7629 /*OUT*/ PKFLOATING_SAVE FloatSave);
7634 KeSetBasePriorityThread(
7635 /*IN*/ PRKTHREAD Thread,
7636 /*IN*/ LONG Increment);
7642 /*IN*/ PRKEVENT Event,
7643 /*IN*/ KPRIORITY Increment,
7644 /*IN*/ BOOLEAN Wait);
7651 /*IN*/ KDPC_IMPORTANCE Importance);
7656 KeSetPriorityThread(
7657 /*IN*/ PKTHREAD Thread,
7658 /*IN*/ KPRIORITY Priority);
7663 KeSetTargetProcessorDpc(
7665 /*IN*/ CCHAR Number);
7671 /*IN*/ PKTIMER Timer,
7672 /*IN*/ LARGE_INTEGER DueTime,
7673 /*IN*/ PKDPC Dpc /*OPTIONAL*/);
7679 /*IN*/ PKTIMER Timer,
7680 /*IN*/ LARGE_INTEGER DueTime,
7681 /*IN*/ LONG Period /*OPTIONAL*/,
7682 /*IN*/ PKDPC Dpc /*OPTIONAL*/);
7687 KeSetTimeUpdateNotifyRoutine(
7688 /*IN*/ PTIME_UPDATE_NOTIFY_ROUTINE NotifyRoutine);
7693 KeStallExecutionProcessor(
7694 /*IN*/ ULONG MicroSeconds);
7699 KeSynchronizeExecution(
7700 /*IN*/ PKINTERRUPT Interrupt,
7701 /*IN*/ PKSYNCHRONIZE_ROUTINE SynchronizeRoutine,
7702 /*IN*/ PVOID SynchronizeContext);
7707 KeWaitForMultipleObjects(
7709 /*IN*/ PVOID Object[],
7710 /*IN*/ WAIT_TYPE WaitType,
7711 /*IN*/ KWAIT_REASON WaitReason,
7712 /*IN*/ KPROCESSOR_MODE WaitMode,
7713 /*IN*/ BOOLEAN Alertable,
7714 /*IN*/ PLARGE_INTEGER Timeout /*OPTIONAL */,
7715 /*IN*/ PKWAIT_BLOCK WaitBlockArray /*OPTIONAL*/);
7720 KeWaitForMutexObject(
7721 /*IN*/ PRKMUTEX Mutex,
7722 /*IN*/ KWAIT_REASON WaitReason,
7723 /*IN*/ KPROCESSOR_MODE WaitMode,
7724 /*IN*/ BOOLEAN Alertable,
7725 /*IN*/ PLARGE_INTEGER Timeout /*OPTIONAL*/);
7730 KeWaitForSingleObject(
7731 /*IN*/ PVOID Object,
7732 /*IN*/ KWAIT_REASON WaitReason,
7733 /*IN*/ KPROCESSOR_MODE WaitMode,
7734 /*IN*/ BOOLEAN Alertable,
7735 /*IN*/ PLARGE_INTEGER Timeout /*OPTIONAL*/);
7741 /*IN*/ KIRQL new_irql,
7742 /*OUT*/ PKIRQL old_irql);
7753 KeRaiseIrqlToDpcLevel(
7756 /** Memory manager routines **/
7763 /*IN*/ ULONG NumberOfBytes);
7768 MmAllocateContiguousMemory(
7769 /*IN*/ ULONG NumberOfBytes,
7770 /*IN*/ PHYSICAL_ADDRESS HighestAcceptableAddress);
7775 MmAllocateContiguousMemorySpecifyCache(
7776 /*IN*/ SIZE_T NumberOfBytes,
7777 /*IN*/ PHYSICAL_ADDRESS LowestAcceptableAddress,
7778 /*IN*/ PHYSICAL_ADDRESS HighestAcceptableAddress,
7779 /*IN*/ PHYSICAL_ADDRESS BoundaryAddressMultiple /*OPTIONAL*/,
7780 /*IN*/ MEMORY_CACHING_TYPE CacheType);
7785 MmAllocateMappingAddress(
7786 /*IN*/ SIZE_T NumberOfBytes,
7787 /*IN*/ ULONG PoolTag);
7792 MmAllocateNonCachedMemory(
7793 /*IN*/ ULONG NumberOfBytes);
7798 MmAllocatePagesForMdl(
7799 /*IN*/ PHYSICAL_ADDRESS LowAddress,
7800 /*IN*/ PHYSICAL_ADDRESS HighAddress,
7801 /*IN*/ PHYSICAL_ADDRESS SkipBytes,
7802 /*IN*/ SIZE_T TotalBytes);
7807 MmBuildMdlForNonPagedPool(
7808 /*IN OUT*/ PMDL MemoryDescriptorList);
7814 /*OUT*/ PSECTION_OBJECT *SectionObject,
7815 /*IN*/ ACCESS_MASK DesiredAccess,
7816 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes /*OPTIONAL*/,
7817 /*IN*/ PLARGE_INTEGER MaximumSize,
7818 /*IN*/ ULONG SectionPageProtection,
7819 /*IN*/ ULONG AllocationAttributes,
7820 /*IN*/ HANDLE FileHandle /*OPTIONAL*/,
7821 /*IN*/ PFILE_OBJECT File /*OPTIONAL*/);
7823 typedef enum _MMFLUSH_TYPE {
7831 MmFlushImageSection(
7832 /*IN*/ PSECTION_OBJECT_POINTERS SectionObjectPointer,
7833 /*IN*/ MMFLUSH_TYPE FlushType);
7838 MmFreeContiguousMemory(
7839 /*IN*/ PVOID BaseAddress);
7844 MmFreeContiguousMemorySpecifyCache(
7845 /*IN*/ PVOID BaseAddress,
7846 /*IN*/ SIZE_T NumberOfBytes,
7847 /*IN*/ MEMORY_CACHING_TYPE CacheType);
7852 MmFreeMappingAddress(
7853 /*IN*/ PVOID BaseAddress,
7854 /*IN*/ ULONG PoolTag);
7859 MmFreeNonCachedMemory(
7860 /*IN*/ PVOID BaseAddress,
7861 /*IN*/ SIZE_T NumberOfBytes);
7867 /*IN*/ PMDL MemoryDescriptorList);
7871 * MmGetMdlByteCount(
7874 #define MmGetMdlByteCount(_Mdl) \
7879 * MmGetMdlByteOffset(
7882 #define MmGetMdlByteOffset(_Mdl) \
7883 ((_Mdl)->ByteOffset)
7890 #define MmGetMdlPfnArray(_Mdl) \
7891 ((PPFN_NUMBER) ((_Mdl) + 1))
7895 * MmGetMdlVirtualAddress(
7898 #define MmGetMdlVirtualAddress(_Mdl) \
7899 ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
7904 MmGetPhysicalAddress(
7905 /*IN*/ PVOID BaseAddress);
7908 PPHYSICAL_MEMORY_RANGE
7910 MmGetPhysicalMemoryRanges(
7916 MmGetVirtualForPhysical(
7917 /*IN*/ PHYSICAL_ADDRESS PhysicalAddress);
7922 MmMapLockedPagesSpecifyCache(
7923 /*IN*/ PMDL MemoryDescriptorList,
7924 /*IN*/ KPROCESSOR_MODE AccessMode,
7925 /*IN*/ MEMORY_CACHING_TYPE CacheType,
7926 /*IN*/ PVOID BaseAddress,
7927 /*IN*/ ULONG BugCheckOnFailure,
7928 /*IN*/ MM_PAGE_PRIORITY Priority);
7933 MmMapLockedPagesWithReservedMapping(
7934 /*IN*/ PVOID MappingAddress,
7935 /*IN*/ ULONG PoolTag,
7936 /*IN*/ PMDL MemoryDescriptorList,
7937 /*IN*/ MEMORY_CACHING_TYPE CacheType);
7942 MmMapUserAddressesToPage(
7943 /*IN*/ PVOID BaseAddress,
7944 /*IN*/ SIZE_T NumberOfBytes,
7945 /*IN*/ PVOID PageAddress);
7951 /*IN*/ PHYSICAL_ADDRESS PhysicalAddress,
7952 /*IN*/ SIZE_T NumberOfBytes,
7953 /*IN*/ MEMORY_CACHING_TYPE CacheType);
7958 MmMapViewInSessionSpace(
7959 /*IN*/ PVOID Section,
7960 /*OUT*/ PVOID *MappedBase,
7961 /*IN OUT*/ PSIZE_T ViewSize);
7966 MmMapViewInSystemSpace(
7967 /*IN*/ PVOID Section,
7968 /*OUT*/ PVOID *MappedBase,
7969 /*IN*/ PSIZE_T ViewSize);
7974 MmMarkPhysicalMemoryAsBad(
7975 /*IN*/ PPHYSICAL_ADDRESS StartAddress,
7976 /*IN OUT*/ PLARGE_INTEGER NumberOfBytes);
7981 MmMarkPhysicalMemoryAsGood(
7982 /*IN*/ PPHYSICAL_ADDRESS StartAddress,
7983 /*IN OUT*/ PLARGE_INTEGER NumberOfBytes);
7987 * MmGetSystemAddressForMdlSafe(
7989 * IN MM_PAGE_PRIORITY Priority)
7991 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
7992 ((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
7993 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
7994 (_Mdl)->MappedSystemVa : \
7995 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
7996 KernelMode, MmCached, NULL, FALSE, _Priority)
8001 MmGetSystemRoutineAddress(
8002 /*IN*/ PUNICODE_STRING SystemRoutineName);
8006 * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
8010 #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, \
8012 ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
8013 + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
8018 * IN PMDL MemoryDescriptorList,
8022 #define MmInitializeMdl(_MemoryDescriptorList, \
8026 (_MemoryDescriptorList)->Next = (PMDL) NULL; \
8027 (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
8028 (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
8029 (_MemoryDescriptorList)->MdlFlags = 0; \
8030 (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
8031 (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
8032 (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
8039 /*IN*/ PVOID VirtualAddress);
8044 MmIsDriverVerifying(
8045 /*IN*/ PDRIVER_OBJECT DriverObject);
8050 MmIsThisAnNtAsSystem(
8056 MmIsVerifierEnabled(
8057 /*OUT*/ PULONG VerifierFlags);
8062 MmLockPagableDataSection(
8063 /*IN*/ PVOID AddressWithinSection);
8068 MmLockPagableImageSection(
8069 /*IN*/ PVOID AddressWithinSection);
8073 * MmLockPagableCodeSection(
8074 * IN PVOID AddressWithinSection)
8076 #define MmLockPagableCodeSection MmLockPagableDataSection
8081 MmLockPagableSectionByHandle(
8082 /*IN*/ PVOID ImageSectionHandle);
8088 /*IN*/ PHYSICAL_ADDRESS PhysicalAddress,
8089 /*IN*/ ULONG NumberOfBytes,
8090 /*IN*/ MEMORY_CACHING_TYPE CacheEnable);
8096 /*IN*/ PMDL MemoryDescriptorList,
8097 /*IN*/ KPROCESSOR_MODE AccessMode);
8103 /*IN*/ PVOID AddressWithinSection);
8108 MmProbeAndLockProcessPages(
8109 /*IN OUT*/ PMDL MemoryDescriptorList,
8110 /*IN*/ PEPROCESS Process,
8111 /*IN*/ KPROCESSOR_MODE AccessMode,
8112 /*IN*/ LOCK_OPERATION Operation);
8117 MmProtectMdlSystemAddress(
8118 /*IN*/ PMDL MemoryDescriptorList,
8119 /*IN*/ ULONG NewProtect);
8125 /*IN*/ PVOID BaseAddress,
8126 /*IN*/ PMDL MemoryDescriptorList);
8131 MmUnmapViewInSessionSpace(
8132 /*IN*/ PVOID MappedBase);
8137 MmUnmapViewInSystemSpace(
8138 /*IN*/ PVOID MappedBase);
8143 MmUnsecureVirtualMemory(
8144 /*IN*/ HANDLE SecureHandle);
8148 * MmPrepareMdlForReuse(
8151 #define MmPrepareMdlForReuse(_Mdl) \
8153 if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
8154 ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
8155 MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
8156 } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
8157 ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
8164 MmProbeAndLockPages(
8165 /*IN OUT*/ PMDL MemoryDescriptorList,
8166 /*IN*/ KPROCESSOR_MODE AccessMode,
8167 /*IN*/ LOCK_OPERATION Operation);
8178 MmRemovePhysicalMemory(
8179 /*IN*/ PPHYSICAL_ADDRESS StartAddress,
8180 /*IN OUT*/ PLARGE_INTEGER NumberOfBytes);
8185 MmResetDriverPaging(
8186 /*IN*/ PVOID AddressWithinSection);
8191 MmSecureVirtualMemory(
8192 /*IN*/ PVOID Address,
8194 /*IN*/ ULONG ProbeMode);
8201 /*IN*/ SIZE_T Length);
8206 MmUnlockPagableImageSection(
8207 /*IN*/ PVOID ImageSectionHandle);
8213 /*IN*/ PMDL MemoryDescriptorList);
8219 /*IN*/ PVOID BaseAddress,
8220 /*IN*/ SIZE_T NumberOfBytes);
8225 MmUnmapReservedMapping(
8226 /*IN*/ PVOID BaseAddress,
8227 /*IN*/ ULONG PoolTag,
8228 /*IN*/ PMDL MemoryDescriptorList);
8233 MmUnmapVideoDisplay(
8234 /*IN*/ PVOID BaseAddress,
8235 /*IN*/ SIZE_T NumberOfBytes);
8239 /** Object manager routines **/
8245 /*IN*/ PACCESS_STATE AccessState,
8246 /*IN*/ PSECURITY_DESCRIPTOR SecurityDescriptor,
8247 /*IN*/ PVOID Object,
8248 /*IN*/ POBJECT_TYPE Type);
8253 ObDereferenceSecurityDescriptor(
8254 PSECURITY_DESCRIPTOR SecurityDescriptor,
8260 ObfDereferenceObject(
8261 /*IN*/ PVOID Object);
8265 * ObDereferenceObject(
8268 #define ObDereferenceObject ObfDereferenceObject
8273 ObGetObjectSecurity(
8274 /*IN*/ PVOID Object,
8275 /*OUT*/ PSECURITY_DESCRIPTOR *SecurityDescriptor,
8276 /*OUT*/ PBOOLEAN MemoryAllocated);
8282 /*IN*/ PVOID Object,
8283 /*IN*/ PACCESS_STATE PassedAccessState /*OPTIONAL*/,
8284 /*IN*/ ACCESS_MASK DesiredAccess,
8285 /*IN*/ ULONG AdditionalReferences,
8286 /*OUT*/ PVOID* ReferencedObject /*OPTIONAL*/,
8287 /*OUT*/ PHANDLE Handle);
8293 /*IN*/ PVOID Object);
8298 ObLogSecurityDescriptor(
8299 /*IN*/ PSECURITY_DESCRIPTOR InputSecurityDescriptor,
8300 /*OUT*/ PSECURITY_DESCRIPTOR *OutputSecurityDescriptor,
8301 /*IN*/ ULONG RefBias);
8304 * ObReferenceObject(
8307 #define ObReferenceObject ObfReferenceObject
8312 ObMakeTemporaryObject(
8313 /*IN*/ PVOID Object);
8319 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes,
8320 /*IN*/ POBJECT_TYPE ObjectType,
8321 /*IN OUT*/ PVOID ParseContext /*OPTIONAL*/,
8322 /*IN*/ KPROCESSOR_MODE AccessMode,
8323 /*IN*/ ACCESS_MASK DesiredAccess,
8324 /*IN*/ PACCESS_STATE PassedAccessState,
8325 /*OUT*/ PHANDLE Handle);
8330 ObOpenObjectByPointer(
8331 /*IN*/ PVOID Object,
8332 /*IN*/ ULONG HandleAttributes,
8333 /*IN*/ PACCESS_STATE PassedAccessState /*OPTIONAL*/,
8334 /*IN*/ ACCESS_MASK DesiredAccess /*OPTIONAL*/,
8335 /*IN*/ POBJECT_TYPE ObjectType /*OPTIONAL*/,
8336 /*IN*/ KPROCESSOR_MODE AccessMode,
8337 /*OUT*/ PHANDLE Handle);
8342 ObQueryObjectAuditingByHandle(
8343 /*IN*/ HANDLE Handle,
8344 /*OUT*/ PBOOLEAN GenerateOnClose);
8349 ObReferenceObjectByHandle(
8350 /*IN*/ HANDLE Handle,
8351 /*IN*/ ACCESS_MASK DesiredAccess,
8352 /*IN*/ POBJECT_TYPE ObjectType /*OPTIONAL*/,
8353 /*IN*/ KPROCESSOR_MODE AccessMode,
8354 /*OUT*/ PVOID *Object,
8355 /*OUT*/ POBJECT_HANDLE_INFORMATION HandleInformation /*OPTIONAL*/);
8360 ObReferenceObjectByName(
8361 /*IN*/ PUNICODE_STRING ObjectPath,
8362 /*IN*/ ULONG Attributes,
8363 /*IN*/ PACCESS_STATE PassedAccessState /*OPTIONAL*/,
8364 /*IN*/ ACCESS_MASK DesiredAccess /*OPTIONAL*/,
8365 /*IN*/ POBJECT_TYPE ObjectType,
8366 /*IN*/ KPROCESSOR_MODE AccessMode,
8367 /*IN OUT*/ PVOID ParseContext /*OPTIONAL*/,
8368 /*OUT*/ PVOID *Object);
8373 ObReferenceObjectByPointer(
8374 /*IN*/ PVOID Object,
8375 /*IN*/ ACCESS_MASK DesiredAccess,
8376 /*IN*/ POBJECT_TYPE ObjectType,
8377 /*IN*/ KPROCESSOR_MODE AccessMode);
8382 ObReferenceSecurityDescriptor(
8383 /*IN*/ PSECURITY_DESCRIPTOR SecurityDescriptor,
8384 /*IN*/ ULONG Count);
8389 ObReleaseObjectSecurity(
8390 /*IN*/ PSECURITY_DESCRIPTOR SecurityDescriptor,
8391 /*IN*/ BOOLEAN MemoryAllocated);
8395 /** Process manager routines **/
8400 PsCreateSystemProcess(
8401 /*IN*/ PHANDLE ProcessHandle,
8402 /*IN*/ ACCESS_MASK DesiredAccess,
8403 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes);
8408 PsCreateSystemThread(
8409 /*OUT*/ PHANDLE ThreadHandle,
8410 /*IN*/ ULONG DesiredAccess,
8411 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes /*OPTIONAL*/,
8412 /*IN*/ HANDLE ProcessHandle /*OPTIONAL*/,
8413 /*OUT*/ PCLIENT_ID ClientId /*OPTIONAL*/,
8414 /*IN*/ PKSTART_ROUTINE StartRoutine,
8415 /*IN*/ PVOID StartContext);
8419 * PsGetCurrentProcess(VOID)
8421 #define PsGetCurrentProcess IoGetCurrentProcess
8426 PsGetCurrentProcessId(
8431 * PsGetCurrentThread(VOID)
8433 #define PsGetCurrentThread() \
8434 ((PETHREAD) KeGetCurrentThread())
8439 PsGetCurrentThreadId(
8446 PULONG MajorVersion /*OPTIONAL*/,
8447 PULONG MinorVersion /*OPTIONAL*/,
8448 PULONG BuildNumber /*OPTIONAL*/,
8449 PUNICODE_STRING CSDVersion /*OPTIONAL*/);
8454 PsRemoveCreateThreadNotifyRoutine(
8455 /*IN*/ PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
8460 PsRemoveLoadImageNotifyRoutine(
8461 /*IN*/ PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
8466 PsSetCreateProcessNotifyRoutine(
8467 /*IN*/ PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
8468 /*IN*/ BOOLEAN Remove);
8473 PsSetCreateThreadNotifyRoutine(
8474 /*IN*/ PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
8479 PsSetLoadImageNotifyRoutine(
8480 /*IN*/ PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
8485 PsTerminateSystemThread(
8486 /*IN*/ NTSTATUS ExitStatus);
8490 /** Security reference monitor routines **/
8496 /*IN*/ PSECURITY_DESCRIPTOR SecurityDescriptor,
8497 /*IN*/ PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext,
8498 /*IN*/ BOOLEAN SubjectContextLocked,
8499 /*IN*/ ACCESS_MASK DesiredAccess,
8500 /*IN*/ ACCESS_MASK PreviouslyGrantedAccess,
8501 /*OUT*/ PPRIVILEGE_SET *Privileges /*OPTIONAL*/,
8502 /*IN*/ PGENERIC_MAPPING GenericMapping,
8503 /*IN*/ KPROCESSOR_MODE AccessMode,
8504 /*OUT*/ PACCESS_MASK GrantedAccess,
8505 /*OUT*/ PNTSTATUS AccessStatus);
8511 /*IN*/ PSECURITY_DESCRIPTOR ParentDescriptor /*OPTIONAL*/,
8512 /*IN*/ PSECURITY_DESCRIPTOR ExplicitDescriptor /*OPTIONAL*/,
8513 /*OUT*/ PSECURITY_DESCRIPTOR *NewDescriptor,
8514 /*IN*/ BOOLEAN IsDirectoryObject,
8515 /*IN*/ PSECURITY_SUBJECT_CONTEXT SubjectContext,
8516 /*IN*/ PGENERIC_MAPPING GenericMapping,
8517 /*IN*/ POOL_TYPE PoolType);
8523 /*IN*/ PSECURITY_DESCRIPTOR ParentDescriptor /*OPTIONAL*/,
8524 /*IN*/ PSECURITY_DESCRIPTOR ExplicitDescriptor /*OPTIONAL*/,
8525 /*OUT*/ PSECURITY_DESCRIPTOR *NewDescriptor,
8526 /*IN*/ GUID *ObjectType /*OPTIONAL*/,
8527 /*IN*/ BOOLEAN IsDirectoryObject,
8528 /*IN*/ ULONG AutoInheritFlags,
8529 /*IN*/ PSECURITY_SUBJECT_CONTEXT SubjectContext,
8530 /*IN*/ PGENERIC_MAPPING GenericMapping,
8531 /*IN*/ POOL_TYPE PoolType);
8537 /*IN OUT*/ PSECURITY_DESCRIPTOR *SecurityDescriptor);
8542 SeSinglePrivilegeCheck(
8543 LUID PrivilegeValue,
8544 KPROCESSOR_MODE PreviousMode);
8549 SeValidSecurityDescriptor(
8550 /*IN*/ ULONG Length,
8551 /*IN*/ PSECURITY_DESCRIPTOR SecurityDescriptor);
8555 /** NtXxx routines **/
8561 /*OUT*/ PHANDLE ProcessHandle,
8562 /*IN*/ ACCESS_MASK DesiredAccess,
8563 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes,
8564 /*IN*/ PCLIENT_ID ClientId /*OPTIONAL*/);
8569 NtQueryInformationProcess(
8570 /*IN*/ HANDLE ProcessHandle,
8571 /*IN*/ PROCESSINFOCLASS ProcessInformationClass,
8572 /*OUT*/ PVOID ProcessInformation,
8573 /*IN*/ ULONG ProcessInformationLength,
8574 /*OUT*/ PULONG ReturnLength /*OPTIONAL*/);
8578 /** NtXxx and ZwXxx routines **/
8584 /*IN*/ HANDLE TimerHandle,
8585 /*OUT*/ PBOOLEAN CurrentState /*OPTIONAL*/);
8591 /*IN*/ HANDLE TimerHandle,
8592 /*OUT*/ PBOOLEAN CurrentState /*OPTIONAL*/);
8598 /*IN*/ HANDLE Handle);
8604 /*IN*/ HANDLE Handle);
8609 NtCreateDirectoryObject(
8610 /*OUT*/ PHANDLE DirectoryHandle,
8611 /*IN*/ ACCESS_MASK DesiredAccess,
8612 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes);
8617 ZwCreateDirectoryObject(
8618 /*OUT*/ PHANDLE DirectoryHandle,
8619 /*IN*/ ACCESS_MASK DesiredAccess,
8620 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes);
8626 /*OUT*/ PHANDLE EventHandle,
8627 /*IN*/ ACCESS_MASK DesiredAccess,
8628 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes,
8629 /*IN*/ BOOLEAN ManualReset,
8630 /*IN*/ BOOLEAN InitialState);
8636 /*OUT*/ PHANDLE EventHandle,
8637 /*IN*/ ACCESS_MASK DesiredAccess,
8638 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes,
8639 /*IN*/ BOOLEAN ManualReset,
8640 /*IN*/ BOOLEAN InitialState);
8646 /*OUT*/ PHANDLE FileHandle,
8647 /*IN*/ ACCESS_MASK DesiredAccess,
8648 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes,
8649 /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock,
8650 /*IN*/ PLARGE_INTEGER AllocationSize /*OPTIONAL*/,
8651 /*IN*/ ULONG FileAttributes,
8652 /*IN*/ ULONG ShareAccess,
8653 /*IN*/ ULONG CreateDisposition,
8654 /*IN*/ ULONG CreateOptions,
8655 /*IN*/ PVOID EaBuffer /*OPTIONAL*/,
8656 /*IN*/ ULONG EaLength);
8662 /*OUT*/ PHANDLE FileHandle,
8663 /*IN*/ ACCESS_MASK DesiredAccess,
8664 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes,
8665 /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock,
8666 /*IN*/ PLARGE_INTEGER AllocationSize /*OPTIONAL*/,
8667 /*IN*/ ULONG FileAttributes,
8668 /*IN*/ ULONG ShareAccess,
8669 /*IN*/ ULONG CreateDisposition,
8670 /*IN*/ ULONG CreateOptions,
8671 /*IN*/ PVOID EaBuffer /*OPTIONAL*/,
8672 /*IN*/ ULONG EaLength);
8678 /*OUT*/ PHANDLE KeyHandle,
8679 /*IN*/ ACCESS_MASK DesiredAccess,
8680 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes,
8681 /*IN*/ ULONG TitleIndex,
8682 /*IN*/ PUNICODE_STRING Class /*OPTIONAL*/,
8683 /*IN*/ ULONG CreateOptions,
8684 /*OUT*/ PULONG Disposition /*OPTIONAL*/);
8690 /*OUT*/ PHANDLE KeyHandle,
8691 /*IN*/ ACCESS_MASK DesiredAccess,
8692 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes,
8693 /*IN*/ ULONG TitleIndex,
8694 /*IN*/ PUNICODE_STRING Class /*OPTIONAL*/,
8695 /*IN*/ ULONG CreateOptions,
8696 /*OUT*/ PULONG Disposition /*OPTIONAL*/);
8702 /*OUT*/ PHANDLE TimerHandle,
8703 /*IN*/ ACCESS_MASK DesiredAccess,
8704 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes /*OPTIONAL*/,
8705 /*IN*/ TIMER_TYPE TimerType);
8711 /*OUT*/ PHANDLE TimerHandle,
8712 /*IN*/ ACCESS_MASK DesiredAccess,
8713 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes /*OPTIONAL*/,
8714 /*IN*/ TIMER_TYPE TimerType);
8720 /*IN*/ HANDLE KeyHandle);
8726 /*IN*/ HANDLE KeyHandle);
8732 /*IN*/ HANDLE KeyHandle,
8733 /*IN*/ PUNICODE_STRING ValueName);
8739 /*IN*/ HANDLE KeyHandle,
8740 /*IN*/ PUNICODE_STRING ValueName);
8745 NtDeviceIoControlFile(
8746 /*IN*/ HANDLE DeviceHandle,
8747 /*IN*/ HANDLE Event /*OPTIONAL*/,
8748 /*IN*/ PIO_APC_ROUTINE UserApcRoutine /*OPTIONAL*/,
8749 /*IN*/ PVOID UserApcContext /*OPTIONAL*/,
8750 /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock,
8751 /*IN*/ ULONG IoControlCode,
8752 /*IN*/ PVOID InputBuffer,
8753 /*IN*/ ULONG InputBufferSize,
8754 /*OUT*/ PVOID OutputBuffer,
8755 /*IN*/ ULONG OutputBufferSize);
8760 ZwDeviceIoControlFile(
8761 /*IN*/ HANDLE DeviceHandle,
8762 /*IN*/ HANDLE Event /*OPTIONAL*/,
8763 /*IN*/ PIO_APC_ROUTINE UserApcRoutine /*OPTIONAL*/,
8764 /*IN*/ PVOID UserApcContext /*OPTIONAL*/,
8765 /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock,
8766 /*IN*/ ULONG IoControlCode,
8767 /*IN*/ PVOID InputBuffer,
8768 /*IN*/ ULONG InputBufferSize,
8769 /*OUT*/ PVOID OutputBuffer,
8770 /*IN*/ ULONG OutputBufferSize);
8776 /*IN*/ HANDLE KeyHandle,
8778 /*IN*/ KEY_INFORMATION_CLASS KeyInformationClass,
8779 /*OUT*/ PVOID KeyInformation,
8780 /*IN*/ ULONG Length,
8781 /*OUT*/ PULONG ResultLength);
8787 /*IN*/ HANDLE KeyHandle,
8789 /*IN*/ KEY_INFORMATION_CLASS KeyInformationClass,
8790 /*OUT*/ PVOID KeyInformation,
8791 /*IN*/ ULONG Length,
8792 /*OUT*/ PULONG ResultLength);
8797 NtEnumerateValueKey(
8798 /*IN*/ HANDLE KeyHandle,
8800 /*IN*/ KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
8801 /*OUT*/ PVOID KeyValueInformation,
8802 /*IN*/ ULONG Length,
8803 /*OUT*/ PULONG ResultLength);
8808 ZwEnumerateValueKey(
8809 /*IN*/ HANDLE KeyHandle,
8811 /*IN*/ KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
8812 /*OUT*/ PVOID KeyValueInformation,
8813 /*IN*/ ULONG Length,
8814 /*OUT*/ PULONG ResultLength);
8820 /*IN*/ HANDLE KeyHandle);
8826 /*IN*/ HANDLE KeyHandle);
8831 NtMakeTemporaryObject(
8832 /*IN*/ HANDLE Handle);
8837 ZwMakeTemporaryObject(
8838 /*IN*/ HANDLE Handle);
8844 /*IN*/ HANDLE SectionHandle,
8845 /*IN*/ HANDLE ProcessHandle,
8846 /*IN OUT*/ PVOID *BaseAddress,
8847 /*IN*/ ULONG ZeroBits,
8848 /*IN*/ ULONG CommitSize,
8849 /*IN OUT*/ PLARGE_INTEGER SectionOffset /*OPTIONAL*/,
8850 /*IN OUT*/ PSIZE_T ViewSize,
8851 /*IN*/ SECTION_INHERIT InheritDisposition,
8852 /*IN*/ ULONG AllocationType,
8853 /*IN*/ ULONG Protect);
8859 /*IN*/ HANDLE SectionHandle,
8860 /*IN*/ HANDLE ProcessHandle,
8861 /*IN OUT*/ PVOID *BaseAddress,
8862 /*IN*/ ULONG ZeroBits,
8863 /*IN*/ ULONG CommitSize,
8864 /*IN OUT*/ PLARGE_INTEGER SectionOffset /*OPTIONAL*/,
8865 /*IN OUT*/ PSIZE_T ViewSize,
8866 /*IN*/ SECTION_INHERIT InheritDisposition,
8867 /*IN*/ ULONG AllocationType,
8868 /*IN*/ ULONG Protect);
8874 /*OUT*/ PHANDLE FileHandle,
8875 /*IN*/ ACCESS_MASK DesiredAccess,
8876 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes,
8877 /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock,
8878 /*IN*/ ULONG ShareAccess,
8879 /*IN*/ ULONG OpenOptions);
8885 /*OUT*/ PHANDLE FileHandle,
8886 /*IN*/ ACCESS_MASK DesiredAccess,
8887 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes,
8888 /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock,
8889 /*IN*/ ULONG ShareAccess,
8890 /*IN*/ ULONG OpenOptions);
8896 /*OUT*/ PHANDLE KeyHandle,
8897 /*IN*/ ACCESS_MASK DesiredAccess,
8898 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes);
8904 /*OUT*/ PHANDLE KeyHandle,
8905 /*IN*/ ACCESS_MASK DesiredAccess,
8906 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes);
8912 /*OUT*/ PHANDLE SectionHandle,
8913 /*IN*/ ACCESS_MASK DesiredAccess,
8914 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes);
8920 /*OUT*/ PHANDLE SectionHandle,
8921 /*IN*/ ACCESS_MASK DesiredAccess,
8922 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes);
8927 NtOpenSymbolicLinkObject(
8928 /*OUT*/ PHANDLE LinkHandle,
8929 /*IN*/ ACCESS_MASK DesiredAccess,
8930 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes);
8935 ZwOpenSymbolicLinkObject(
8936 /*OUT*/ PHANDLE LinkHandle,
8937 /*IN*/ ACCESS_MASK DesiredAccess,
8938 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes);
8944 /*OUT*/ PHANDLE TimerHandle,
8945 /*IN*/ ACCESS_MASK DesiredAccess,
8946 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes);
8952 /*OUT*/ PHANDLE TimerHandle,
8953 /*IN*/ ACCESS_MASK DesiredAccess,
8954 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes);
8959 NtQueryInformationFile(
8960 /*IN*/ HANDLE FileHandle,
8961 /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock,
8962 /*OUT*/ PVOID FileInformation,
8963 /*IN*/ ULONG Length,
8964 /*IN*/ FILE_INFORMATION_CLASS FileInformationClass);
8969 ZwQueryInformationFile(
8970 /*IN*/ HANDLE FileHandle,
8971 /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock,
8972 /*OUT*/ PVOID FileInformation,
8973 /*IN*/ ULONG Length,
8974 /*IN*/ FILE_INFORMATION_CLASS FileInformationClass);
8980 /*IN*/ HANDLE KeyHandle,
8981 /*IN*/ KEY_INFORMATION_CLASS KeyInformationClass,
8982 /*OUT*/ PVOID KeyInformation,
8983 /*IN*/ ULONG Length,
8984 /*OUT*/ PULONG ResultLength);
8990 /*IN*/ HANDLE KeyHandle,
8991 /*IN*/ KEY_INFORMATION_CLASS KeyInformationClass,
8992 /*OUT*/ PVOID KeyInformation,
8993 /*IN*/ ULONG Length,
8994 /*OUT*/ PULONG ResultLength);
8999 NtQuerySymbolicLinkObject(
9000 /*IN*/ HANDLE LinkHandle,
9001 /*IN OUT*/ PUNICODE_STRING LinkTarget,
9002 /*OUT*/ PULONG ReturnedLength /*OPTIONAL*/);
9007 ZwQuerySymbolicLinkObject(
9008 /*IN*/ HANDLE LinkHandle,
9009 /*IN OUT*/ PUNICODE_STRING LinkTarget,
9010 /*OUT*/ PULONG ReturnedLength /*OPTIONAL*/);
9016 /*IN*/ HANDLE TimerHandle,
9017 /*IN*/ TIMER_INFORMATION_CLASS TimerInformationClass,
9018 /*OUT*/ PVOID TimerInformation,
9019 /*IN*/ ULONG TimerInformationLength,
9020 /*OUT*/ PULONG ReturnedLength /*OPTIONAL*/);
9026 /*IN*/ HANDLE TimerHandle,
9027 /*IN*/ TIMER_INFORMATION_CLASS TimerInformationClass,
9028 /*OUT*/ PVOID TimerInformation,
9029 /*IN*/ ULONG TimerInformationLength,
9030 /*OUT*/ PULONG ReturnedLength /*OPTIONAL*/);
9036 /*IN*/ HANDLE KeyHandle,
9037 /*IN*/ PUNICODE_STRING ValueName,
9038 /*IN*/ KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
9039 /*OUT*/ PVOID KeyValueInformation,
9040 /*IN*/ ULONG Length,
9041 /*OUT*/ PULONG ResultLength);
9047 /*IN*/ HANDLE KeyHandle,
9048 /*IN*/ PUNICODE_STRING ValueName,
9049 /*IN*/ KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
9050 /*OUT*/ PVOID KeyValueInformation,
9051 /*IN*/ ULONG Length,
9052 /*OUT*/ PULONG ResultLength);
9058 /*IN*/ HANDLE FileHandle,
9059 /*IN*/ HANDLE Event /*OPTIONAL*/,
9060 /*IN*/ PIO_APC_ROUTINE ApcRoutine /*OPTIONAL*/,
9061 /*IN*/ PVOID ApcContext /*OPTIONAL*/,
9062 /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock,
9063 /*OUT*/ PVOID Buffer,
9064 /*IN*/ ULONG Length,
9065 /*IN*/ PLARGE_INTEGER ByteOffset /*OPTIONAL*/,
9066 /*IN*/ PULONG Key /*OPTIONAL*/);
9072 /*IN*/ HANDLE FileHandle,
9073 /*IN*/ HANDLE Event /*OPTIONAL*/,
9074 /*IN*/ PIO_APC_ROUTINE ApcRoutine /*OPTIONAL*/,
9075 /*IN*/ PVOID ApcContext /*OPTIONAL*/,
9076 /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock,
9077 /*OUT*/ PVOID Buffer,
9078 /*IN*/ ULONG Length,
9079 /*IN*/ PLARGE_INTEGER ByteOffset /*OPTIONAL*/,
9080 /*IN*/ PULONG Key /*OPTIONAL*/);
9086 /*IN*/ HANDLE EventHandle,
9087 /*IN*/ PULONG NumberOfThreadsReleased);
9093 /*IN*/ HANDLE EventHandle,
9094 /*IN*/ PULONG NumberOfThreadsReleased);
9099 NtSetInformationFile(
9100 /*IN*/ HANDLE FileHandle,
9101 /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock,
9102 /*IN*/ PVOID FileInformation,
9103 /*IN*/ ULONG Length,
9104 /*IN*/ FILE_INFORMATION_CLASS FileInformationClass);
9109 ZwSetInformationFile(
9110 /*IN*/ HANDLE FileHandle,
9111 /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock,
9112 /*IN*/ PVOID FileInformation,
9113 /*IN*/ ULONG Length,
9114 /*IN*/ FILE_INFORMATION_CLASS FileInformationClass);
9119 NtSetInformationThread(
9120 /*IN*/ HANDLE ThreadHandle,
9121 /*IN*/ THREADINFOCLASS ThreadInformationClass,
9122 /*IN*/ PVOID ThreadInformation,
9123 /*IN*/ ULONG ThreadInformationLength);
9128 ZwSetInformationThread(
9129 /*IN*/ HANDLE ThreadHandle,
9130 /*IN*/ THREADINFOCLASS ThreadInformationClass,
9131 /*IN*/ PVOID ThreadInformation,
9132 /*IN*/ ULONG ThreadInformationLength);
9138 /*IN*/ HANDLE TimerHandle,
9139 /*IN*/ PLARGE_INTEGER DueTime,
9140 /*IN*/ PTIMER_APC_ROUTINE TimerApcRoutine /*OPTIONAL*/,
9141 /*IN*/ PVOID TimerContext /*OPTIONAL*/,
9142 /*IN*/ BOOLEAN WakeTimer,
9143 /*IN*/ LONG Period /*OPTIONAL*/,
9144 /*OUT*/ PBOOLEAN PreviousState /*OPTIONAL*/);
9150 /*IN*/ HANDLE TimerHandle,
9151 /*IN*/ PLARGE_INTEGER DueTime,
9152 /*IN*/ PTIMER_APC_ROUTINE TimerApcRoutine /*OPTIONAL*/,
9153 /*IN*/ PVOID TimerContext /*OPTIONAL*/,
9154 /*IN*/ BOOLEAN WakeTimer,
9155 /*IN*/ LONG Period /*OPTIONAL*/,
9156 /*OUT*/ PBOOLEAN PreviousState /*OPTIONAL*/);
9162 /*IN*/ HANDLE KeyHandle,
9163 /*IN*/ PUNICODE_STRING ValueName,
9164 /*IN*/ ULONG TitleIndex /*OPTIONAL*/,
9167 /*IN*/ ULONG DataSize);
9173 /*IN*/ HANDLE KeyHandle,
9174 /*IN*/ PUNICODE_STRING ValueName,
9175 /*IN*/ ULONG TitleIndex /*OPTIONAL*/,
9178 /*IN*/ ULONG DataSize);
9180 /* [Nt|Zw]MapViewOfSection.InheritDisposition constants */
9181 #define AT_EXTENDABLE_FILE 0x00002000
9182 #define SEC_NO_CHANGE 0x00400000
9183 #define AT_RESERVED 0x20000000
9184 #define AT_ROUND_TO_PAGE 0x40000000
9189 NtUnmapViewOfSection(
9190 /*IN*/ HANDLE ProcessHandle,
9191 /*IN*/ PVOID BaseAddress);
9196 ZwUnmapViewOfSection(
9197 /*IN*/ HANDLE ProcessHandle,
9198 /*IN*/ PVOID BaseAddress);
9203 NtWaitForSingleObject(
9204 /*IN*/ HANDLE Object,
9205 /*IN*/ BOOLEAN Alertable,
9206 /*IN*/ PLARGE_INTEGER Time);
9211 ZwWaitForSingleObject(
9212 /*IN*/ HANDLE Object,
9213 /*IN*/ BOOLEAN Alertable,
9214 /*IN*/ PLARGE_INTEGER Time);
9220 /*IN*/ HANDLE FileHandle,
9221 /*IN*/ HANDLE Event /*OPTIONAL*/,
9222 /*IN*/ PIO_APC_ROUTINE ApcRoutine /*OPTIONAL*/,
9223 /*IN*/ PVOID ApcContext /*OPTIONAL*/,
9224 /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock,
9225 /*IN*/ PVOID Buffer,
9226 /*IN*/ ULONG Length,
9227 /*IN*/ PLARGE_INTEGER ByteOffset /*OPTIONAL*/,
9228 /*IN*/ PULONG Key /*OPTIONAL*/);
9234 /*IN*/ HANDLE FileHandle,
9235 /*IN*/ HANDLE Event /*OPTIONAL*/,
9236 /*IN*/ PIO_APC_ROUTINE ApcRoutine /*OPTIONAL*/,
9237 /*IN*/ PVOID ApcContext /*OPTIONAL*/,
9238 /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock,
9239 /*IN*/ PVOID Buffer,
9240 /*IN*/ ULONG Length,
9241 /*IN*/ PLARGE_INTEGER ByteOffset /*OPTIONAL*/,
9242 /*IN*/ PULONG Key /*OPTIONAL*/);
9246 /** Power management support routines **/
9252 /*IN*/ PDEVICE_OBJECT DeviceObject,
9253 /*IN OUT*/ PIRP Irp);
9258 PoRegisterDeviceForIdleDetection(
9259 /*IN*/ PDEVICE_OBJECT DeviceObject,
9260 /*IN*/ ULONG ConservationIdleTime,
9261 /*IN*/ ULONG PerformanceIdleTime,
9262 /*IN*/ DEVICE_POWER_STATE State);
9267 PoRegisterSystemState(
9268 /*IN*/ PVOID StateHandle,
9269 /*IN*/ EXECUTION_STATE Flags);
9275 /*IN*/ PDEVICE_OBJECT DeviceObject,
9276 /*IN*/ UCHAR MinorFunction,
9277 /*IN*/ POWER_STATE PowerState,
9278 /*IN*/ PREQUEST_POWER_COMPLETE CompletionFunction,
9279 /*IN*/ PVOID Context,
9280 /*OUT*/ PIRP *Irp /*OPTIONAL*/);
9285 PoRequestShutdownEvent(
9286 /*OUT*/ PVOID *Event);
9292 PULONG IdlePointer);
9298 /*IN*/ PDEVICE_OBJECT DeviceObject,
9299 /*IN*/ POWER_STATE_TYPE Type,
9300 /*IN*/ POWER_STATE State);
9306 /*IN*/ EXECUTION_STATE Flags);
9311 PoStartNextPowerIrp(
9317 PoUnregisterSystemState(
9318 /*IN*/ PVOID StateHandle);
9322 /** WMI library support routines **/
9328 /*IN*/ PDEVICE_OBJECT DeviceObject,
9330 /*IN*/ NTSTATUS Status,
9331 /*IN*/ ULONG BufferUsed,
9332 /*IN*/ CCHAR PriorityBoost);
9338 /*IN*/ PDEVICE_OBJECT DeviceObject,
9340 /*IN*/ ULONG InstanceIndex,
9341 /*IN*/ ULONG EventDataSize,
9342 /*IN*/ PVOID EventData);
9347 WmiQueryTraceInformation(
9348 /*IN*/ TRACE_INFORMATION_CLASS TraceInformationClass,
9349 /*OUT*/ PVOID TraceInformation,
9350 /*IN*/ ULONG TraceInformationLength,
9351 /*OUT*/ PULONG RequiredLength /*OPTIONAL*/,
9352 /*IN*/ PVOID Buffer /*OPTIONAL*/);
9358 /*IN*/ PWMILIB_CONTEXT WmiLibInfo,
9359 /*IN*/ PDEVICE_OBJECT DeviceObject,
9361 /*OUT*/ PSYSCTL_IRP_DISPOSITION IrpDisposition);
9367 /*IN*/ TRACEHANDLE LoggerHandle,
9368 /*IN*/ ULONG MessageFlags,
9369 /*IN*/ LPGUID MessageGuid,
9370 /*IN*/ USHORT MessageNumber,
9374 /* FIXME: Get va_list from where? */
9379 /*IN*/ TRACEHANDLE LoggerHandle,
9380 /*IN*/ ULONG MessageFlags,
9381 /*IN*/ LPGUID MessageGuid,
9382 /*IN*/ USHORT MessageNumber,
9383 /*IN*/ va_list MessageArgList);
9387 /** Kernel debugger routines **/
9410 DbgBreakPointWithStatus(
9411 /*IN*/ ULONG Status);
9424 /*IN*/ ULONG ComponentId,
9432 DbgPrintReturnControlC(
9439 DbgQueryDebugFilterState(
9440 /*IN*/ ULONG ComponentId,
9441 /*IN*/ ULONG Level);
9446 DbgSetDebugFilterState(
9447 /*IN*/ ULONG ComponentId,
9449 /*IN*/ BOOLEAN State);
9453 #define KdPrint(_x_) DbgPrint _x_
9454 #define KdPrintEx(_x_) DbgPrintEx _x_
9455 #define KdBreakPoint() DbgBreakPoint()
9456 #define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
9460 #define KdPrint(_x_)
9461 #define KdPrintEx(_x_)
9462 #define KdBreakPoint()
9463 #define KdBreakPointWithStatus(s)
9467 extern NTOSAPI PBOOLEAN KdDebuggerNotPresent;
9468 extern NTOSAPI PBOOLEAN KdDebuggerEnabled;
9469 #define KD_DEBUGGER_ENABLED *KdDebuggerEnabled
9470 #define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
9476 #endif /* __WINDDK_H */