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.
24 /* Created by Casper S. Hornstrup <chorns@users.sourceforge.net> */
27 #pragma GCC system_header
31 * Windows Device Driver Kit
39 ** Definitions specific to this Device Driver Kit
41 #define DDKAPI __stdcall
42 #define DDKFASTAPI __fastcall
43 #define DDKCDECLAPI __cdecl
45 #if defined(_NTOSKRNL_)
47 #define NTOSAPI DECL_EXPORT
50 #define DECLARE_INTERNAL_OBJECT(x) typedef struct _##x; typedef struct _##x *P##x;
51 #define DECLARE_INTERNAL_OBJECT2(x,y) typedef struct _##x; typedef struct _##x *P##y;
55 #define NTOSAPI DECL_IMPORT
58 #define DECLARE_INTERNAL_OBJECT(x) struct _##x; typedef struct _##x *P##x;
59 #define DECLARE_INTERNAL_OBJECT2(x,y) struct _##x; typedef struct _##x *P##y;
62 /* Pseudo modifiers for parameters
63 We don't use these unnecessary defines in the w32api headers. Define
64 them by default since that is what people expect, but allow users
65 to avoid the pollution. */
66 #ifndef _NO_W32_PSEUDO_MODIFIERS
74 #define VOLATILE volatile
76 #define RESTRICTED_POINTER
77 #define POINTER_ALIGNMENT
79 #ifdef NONAMELESSUNION
80 # define _DDK_DUMMYUNION_MEMBER(name) DUMMYUNIONNAME.name
81 # define _DDK_DUMMYUNION_N_MEMBER(n, name) DUMMYUNIONNAME##n.name
83 # define _DDK_DUMMYUNION_MEMBER(name) name
84 # define _DDK_DUMMYUNION_N_MEMBER(n, name) name
88 ** Forward declarations
100 struct _DEVICE_OBJECT;
101 struct _DRIVER_OBJECT;
102 struct _SECTION_OBJECT;
103 struct _IO_STATUS_BLOCK;
104 struct _DEVICE_DESCRIPTION;
105 struct _SCATTER_GATHER_LIST;
107 DECLARE_INTERNAL_OBJECT(ADAPTER_OBJECT)
108 DECLARE_INTERNAL_OBJECT(DMA_ADAPTER)
109 DECLARE_INTERNAL_OBJECT(IO_STATUS_BLOCK)
110 DECLARE_INTERNAL_OBJECT(SECTION_OBJECT)
113 /* FIXME: Unknown definitions */
114 struct _SET_PARTITION_INFORMATION_EX;
115 typedef ULONG WAIT_TYPE;
116 typedef HANDLE TRACEHANDLE;
117 typedef PVOID PWMILIB_CONTEXT;
118 typedef PVOID PSYSCTL_IRP_DISPOSITION;
119 typedef ULONG LOGICAL;
123 ** Routines specific to this DDK
126 #define TAG(_a, _b, _c, _d) (ULONG) \
127 (((_a) << 0) + ((_b) << 8) + ((_c) << 16) + ((_d) << 24))
129 static __inline struct _KPCR * KeGetCurrentKPCR(
134 __asm__ __volatile__ (
135 /* support -masm=intel */
136 "mov{l} {%%fs:0x18, %0|%0, %%fs:0x18}\n\t"
140 return (struct _KPCR *) Value;
147 typedef LONG KPRIORITY;
148 typedef UCHAR KIRQL, *PKIRQL;
149 typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK;
150 typedef ULONG_PTR KAFFINITY, *PKAFFINITY;
151 typedef CCHAR KPROCESSOR_MODE;
160 /* Structures not exposed to drivers */
161 typedef struct _IO_TIMER *PIO_TIMER;
162 typedef struct _EPROCESS *PEPROCESS;
163 typedef struct _ETHREAD *PETHREAD;
164 typedef struct _KINTERRUPT *PKINTERRUPT;
165 typedef struct _OBJECT_TYPE *POBJECT_TYPE;
166 typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD;
167 typedef struct _COMPRESSED_DATA_INFO *PCOMPRESSED_DATA_INFO;
168 typedef struct _HAL_DISPATCH_TABLE *PHAL_DISPATCH_TABLE;
169 typedef struct _HAL_PRIVATE_DISPATCH_TABLE *PHAL_PRIVATE_DISPATCH_TABLE;
170 typedef struct _DRIVE_LAYOUT_INFORMATION *PDRIVE_LAYOUT_INFORMATION;
171 typedef struct _DRIVE_LAYOUT_INFORMATION_EX *PDRIVE_LAYOUT_INFORMATION_EX;
174 #define MAXIMUM_PROCESSORS 32
176 #define MAXIMUM_WAIT_OBJECTS 64
178 #define METHOD_BUFFERED 0
179 #define METHOD_IN_DIRECT 1
180 #define METHOD_OUT_DIRECT 2
181 #define METHOD_NEITHER 3
183 #define LOW_PRIORITY 0
184 #define LOW_REALTIME_PRIORITY 16
185 #define HIGH_PRIORITY 31
186 #define MAXIMUM_PRIORITY 32
188 #define FILE_SUPERSEDED 0x00000000
189 #define FILE_OPENED 0x00000001
190 #define FILE_CREATED 0x00000002
191 #define FILE_OVERWRITTEN 0x00000003
192 #define FILE_EXISTS 0x00000004
193 #define FILE_DOES_NOT_EXIST 0x00000005
195 /* also in winnt.h */
196 #define FILE_LIST_DIRECTORY 0x00000001
197 #define FILE_READ_DATA 0x00000001
198 #define FILE_ADD_FILE 0x00000002
199 #define FILE_WRITE_DATA 0x00000002
200 #define FILE_ADD_SUBDIRECTORY 0x00000004
201 #define FILE_APPEND_DATA 0x00000004
202 #define FILE_CREATE_PIPE_INSTANCE 0x00000004
203 #define FILE_READ_EA 0x00000008
204 #define FILE_WRITE_EA 0x00000010
205 #define FILE_EXECUTE 0x00000020
206 #define FILE_TRAVERSE 0x00000020
207 #define FILE_DELETE_CHILD 0x00000040
208 #define FILE_READ_ATTRIBUTES 0x00000080
209 #define FILE_WRITE_ATTRIBUTES 0x00000100
211 #define FILE_SHARE_READ 0x00000001
212 #define FILE_SHARE_WRITE 0x00000002
213 #define FILE_SHARE_DELETE 0x00000004
214 #define FILE_SHARE_VALID_FLAGS 0x00000007
216 #define FILE_ATTRIBUTE_READONLY 0x00000001
217 #define FILE_ATTRIBUTE_HIDDEN 0x00000002
218 #define FILE_ATTRIBUTE_SYSTEM 0x00000004
219 #define FILE_ATTRIBUTE_DIRECTORY 0x00000010
220 #define FILE_ATTRIBUTE_ARCHIVE 0x00000020
221 #define FILE_ATTRIBUTE_DEVICE 0x00000040
222 #define FILE_ATTRIBUTE_NORMAL 0x00000080
223 #define FILE_ATTRIBUTE_TEMPORARY 0x00000100
224 #define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
225 #define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
226 #define FILE_ATTRIBUTE_COMPRESSED 0x00000800
227 #define FILE_ATTRIBUTE_OFFLINE 0x00001000
228 #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
229 #define FILE_ATTRIBUTE_ENCRYPTED 0x00004000
230 #define FILE_ATTRIBUTE_VIRTUAL 0x00010000
232 #define FILE_ATTRIBUTE_VALID_FLAGS 0x00017fb7
233 #define FILE_ATTRIBUTE_VALID_SET_FLAGS 0x000031a7
235 #define FILE_COPY_STRUCTURED_STORAGE 0x00000041
236 #define FILE_STRUCTURED_STORAGE 0x00000441
238 #define FILE_VALID_OPTION_FLAGS 0x00ffffff
239 #define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032
240 #define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032
241 #define FILE_VALID_SET_FLAGS 0x00000036
243 #define FILE_SUPERSEDE 0x00000000
244 #define FILE_OPEN 0x00000001
245 #define FILE_CREATE 0x00000002
246 #define FILE_OPEN_IF 0x00000003
247 #define FILE_OVERWRITE 0x00000004
248 #define FILE_OVERWRITE_IF 0x00000005
249 #define FILE_MAXIMUM_DISPOSITION 0x00000005
251 #define FILE_DIRECTORY_FILE 0x00000001
252 #define FILE_WRITE_THROUGH 0x00000002
253 #define FILE_SEQUENTIAL_ONLY 0x00000004
254 #define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008
255 #define FILE_SYNCHRONOUS_IO_ALERT 0x00000010
256 #define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020
257 #define FILE_NON_DIRECTORY_FILE 0x00000040
258 #define FILE_CREATE_TREE_CONNECTION 0x00000080
259 #define FILE_COMPLETE_IF_OPLOCKED 0x00000100
260 #define FILE_NO_EA_KNOWLEDGE 0x00000200
261 #define FILE_OPEN_FOR_RECOVERY 0x00000400
262 #define FILE_RANDOM_ACCESS 0x00000800
263 #define FILE_DELETE_ON_CLOSE 0x00001000
264 #define FILE_OPEN_BY_FILE_ID 0x00002000
265 #define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000
266 #define FILE_NO_COMPRESSION 0x00008000
267 #define FILE_RESERVE_OPFILTER 0x00100000
268 #define FILE_OPEN_REPARSE_POINT 0x00200000
269 #define FILE_OPEN_NO_RECALL 0x00400000
270 #define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000
272 #define FILE_ANY_ACCESS 0x00000000
273 #define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS
274 #define FILE_READ_ACCESS 0x00000001
275 #define FILE_WRITE_ACCESS 0x00000002
277 #define FILE_ALL_ACCESS \
278 (STANDARD_RIGHTS_REQUIRED | \
282 #define FILE_GENERIC_EXECUTE \
283 (STANDARD_RIGHTS_EXECUTE | \
284 FILE_READ_ATTRIBUTES | \
288 #define FILE_GENERIC_READ \
289 (STANDARD_RIGHTS_READ | \
291 FILE_READ_ATTRIBUTES | \
295 #define FILE_GENERIC_WRITE \
296 (STANDARD_RIGHTS_WRITE | \
298 FILE_WRITE_ATTRIBUTES | \
304 #define DIRECTORY_QUERY (0x0001)
305 #define DIRECTORY_TRAVERSE (0x0002)
306 #define DIRECTORY_CREATE_OBJECT (0x0004)
307 #define DIRECTORY_CREATE_SUBDIRECTORY (0x0008)
308 #define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
310 /* Exported object types */
311 extern NTOSAPI POBJECT_TYPE ExDesktopObjectType;
312 extern NTOSAPI POBJECT_TYPE ExEventObjectType;
313 extern NTOSAPI POBJECT_TYPE ExSemaphoreObjectType;
314 extern NTOSAPI POBJECT_TYPE ExWindowStationObjectType;
315 extern NTOSAPI POBJECT_TYPE IoAdapterObjectType;
316 extern NTOSAPI ULONG IoDeviceHandlerObjectSize;
317 extern NTOSAPI POBJECT_TYPE IoDeviceHandlerObjectType;
318 extern NTOSAPI POBJECT_TYPE IoDeviceObjectType;
319 extern NTOSAPI POBJECT_TYPE IoDriverObjectType;
320 extern NTOSAPI POBJECT_TYPE IoFileObjectType;
321 extern NTOSAPI POBJECT_TYPE LpcPortObjectType;
322 extern NTOSAPI POBJECT_TYPE MmSectionObjectType;
323 extern NTOSAPI POBJECT_TYPE SeTokenObjectType;
325 extern NTOSAPI CCHAR KeNumberProcessors;
326 extern NTOSAPI PHAL_DISPATCH_TABLE HalDispatchTable;
327 extern NTOSAPI PHAL_PRIVATE_DISPATCH_TABLE HalPrivateDispatchTable;
331 ** IRP function codes
334 #define IRP_MJ_CREATE 0x00
335 #define IRP_MJ_CREATE_NAMED_PIPE 0x01
336 #define IRP_MJ_CLOSE 0x02
337 #define IRP_MJ_READ 0x03
338 #define IRP_MJ_WRITE 0x04
339 #define IRP_MJ_QUERY_INFORMATION 0x05
340 #define IRP_MJ_SET_INFORMATION 0x06
341 #define IRP_MJ_QUERY_EA 0x07
342 #define IRP_MJ_SET_EA 0x08
343 #define IRP_MJ_FLUSH_BUFFERS 0x09
344 #define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0a
345 #define IRP_MJ_SET_VOLUME_INFORMATION 0x0b
346 #define IRP_MJ_DIRECTORY_CONTROL 0x0c
347 #define IRP_MJ_FILE_SYSTEM_CONTROL 0x0d
348 #define IRP_MJ_DEVICE_CONTROL 0x0e
349 #define IRP_MJ_INTERNAL_DEVICE_CONTROL 0x0f
350 #define IRP_MJ_SCSI 0x0f
351 #define IRP_MJ_SHUTDOWN 0x10
352 #define IRP_MJ_LOCK_CONTROL 0x11
353 #define IRP_MJ_CLEANUP 0x12
354 #define IRP_MJ_CREATE_MAILSLOT 0x13
355 #define IRP_MJ_QUERY_SECURITY 0x14
356 #define IRP_MJ_SET_SECURITY 0x15
357 #define IRP_MJ_POWER 0x16
358 #define IRP_MJ_SYSTEM_CONTROL 0x17
359 #define IRP_MJ_DEVICE_CHANGE 0x18
360 #define IRP_MJ_QUERY_QUOTA 0x19
361 #define IRP_MJ_SET_QUOTA 0x1a
362 #define IRP_MJ_PNP 0x1b
363 #define IRP_MJ_PNP_POWER 0x1b
364 #define IRP_MJ_MAXIMUM_FUNCTION 0x1b
366 #define IRP_MN_QUERY_DIRECTORY 0x01
367 #define IRP_MN_NOTIFY_CHANGE_DIRECTORY 0x02
369 #define IRP_MN_USER_FS_REQUEST 0x00
370 #define IRP_MN_MOUNT_VOLUME 0x01
371 #define IRP_MN_VERIFY_VOLUME 0x02
372 #define IRP_MN_LOAD_FILE_SYSTEM 0x03
373 #define IRP_MN_TRACK_LINK 0x04
374 #define IRP_MN_KERNEL_CALL 0x04
376 #define IRP_MN_LOCK 0x01
377 #define IRP_MN_UNLOCK_SINGLE 0x02
378 #define IRP_MN_UNLOCK_ALL 0x03
379 #define IRP_MN_UNLOCK_ALL_BY_KEY 0x04
381 #define IRP_MN_NORMAL 0x00
382 #define IRP_MN_DPC 0x01
383 #define IRP_MN_MDL 0x02
384 #define IRP_MN_COMPLETE 0x04
385 #define IRP_MN_COMPRESSED 0x08
387 #define IRP_MN_MDL_DPC (IRP_MN_MDL | IRP_MN_DPC)
388 #define IRP_MN_COMPLETE_MDL (IRP_MN_COMPLETE | IRP_MN_MDL)
389 #define IRP_MN_COMPLETE_MDL_DPC (IRP_MN_COMPLETE_MDL | IRP_MN_DPC)
391 #define IRP_MN_SCSI_CLASS 0x01
393 #define IRP_MN_START_DEVICE 0x00
394 #define IRP_MN_QUERY_REMOVE_DEVICE 0x01
395 #define IRP_MN_REMOVE_DEVICE 0x02
396 #define IRP_MN_CANCEL_REMOVE_DEVICE 0x03
397 #define IRP_MN_STOP_DEVICE 0x04
398 #define IRP_MN_QUERY_STOP_DEVICE 0x05
399 #define IRP_MN_CANCEL_STOP_DEVICE 0x06
401 #define IRP_MN_QUERY_DEVICE_RELATIONS 0x07
402 #define IRP_MN_QUERY_INTERFACE 0x08
403 #define IRP_MN_QUERY_CAPABILITIES 0x09
404 #define IRP_MN_QUERY_RESOURCES 0x0A
405 #define IRP_MN_QUERY_RESOURCE_REQUIREMENTS 0x0B
406 #define IRP_MN_QUERY_DEVICE_TEXT 0x0C
407 #define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
409 #define IRP_MN_READ_CONFIG 0x0F
410 #define IRP_MN_WRITE_CONFIG 0x10
411 #define IRP_MN_EJECT 0x11
412 #define IRP_MN_SET_LOCK 0x12
413 #define IRP_MN_QUERY_ID 0x13
414 #define IRP_MN_QUERY_PNP_DEVICE_STATE 0x14
415 #define IRP_MN_QUERY_BUS_INFORMATION 0x15
416 #define IRP_MN_DEVICE_USAGE_NOTIFICATION 0x16
417 #define IRP_MN_SURPRISE_REMOVAL 0x17
418 #define IRP_MN_QUERY_LEGACY_BUS_INFORMATION 0x18
420 #define IRP_MN_WAIT_WAKE 0x00
421 #define IRP_MN_POWER_SEQUENCE 0x01
422 #define IRP_MN_SET_POWER 0x02
423 #define IRP_MN_QUERY_POWER 0x03
425 #define IRP_MN_QUERY_ALL_DATA 0x00
426 #define IRP_MN_QUERY_SINGLE_INSTANCE 0x01
427 #define IRP_MN_CHANGE_SINGLE_INSTANCE 0x02
428 #define IRP_MN_CHANGE_SINGLE_ITEM 0x03
429 #define IRP_MN_ENABLE_EVENTS 0x04
430 #define IRP_MN_DISABLE_EVENTS 0x05
431 #define IRP_MN_ENABLE_COLLECTION 0x06
432 #define IRP_MN_DISABLE_COLLECTION 0x07
433 #define IRP_MN_REGINFO 0x08
434 #define IRP_MN_EXECUTE_METHOD 0x09
436 #define IRP_MN_REGINFO_EX 0x0b
438 typedef enum _IO_ALLOCATION_ACTION {
441 DeallocateObjectKeepRegisters
442 } IO_ALLOCATION_ACTION, *PIO_ALLOCATION_ACTION;
444 typedef IO_ALLOCATION_ACTION
445 (DDKAPI *PDRIVER_CONTROL)(
446 /*IN*/ struct _DEVICE_OBJECT *DeviceObject,
447 /*IN*/ struct _IRP *Irp,
448 /*IN*/ PVOID MapRegisterBase,
449 /*IN*/ PVOID Context);
452 (DDKAPI *PDRIVER_LIST_CONTROL)(
453 /*IN*/ struct _DEVICE_OBJECT *DeviceObject,
454 /*IN*/ struct _IRP *Irp,
455 /*IN*/ struct _SCATTER_GATHER_LIST *ScatterGather,
456 /*IN*/ PVOID Context);
459 (DDKAPI *PDRIVER_ADD_DEVICE)(
460 /*IN*/ struct _DRIVER_OBJECT *DriverObject,
461 /*IN*/ struct _DEVICE_OBJECT *PhysicalDeviceObject);
464 (DDKAPI *PIO_COMPLETION_ROUTINE)(
465 /*IN*/ struct _DEVICE_OBJECT *DeviceObject,
466 /*IN*/ struct _IRP *Irp,
467 /*IN*/ PVOID Context);
470 (DDKAPI *PDRIVER_CANCEL)(
471 /*IN*/ struct _DEVICE_OBJECT *DeviceObject,
472 /*IN*/ struct _IRP *Irp);
475 (DDKAPI *PKDEFERRED_ROUTINE)(
476 /*IN*/ struct _KDPC *Dpc,
477 /*IN*/ PVOID DeferredContext,
478 /*IN*/ PVOID SystemArgument1,
479 /*IN*/ PVOID SystemArgument2);
482 (DDKAPI *PDRIVER_DISPATCH)(
483 /*IN*/ struct _DEVICE_OBJECT *DeviceObject,
484 /*IN*/ struct _IRP *Irp);
487 (DDKAPI *PIO_DPC_ROUTINE)(
488 /*IN*/ struct _KDPC *Dpc,
489 /*IN*/ struct _DEVICE_OBJECT *DeviceObject,
490 /*IN*/ struct _IRP *Irp,
491 /*IN*/ PVOID Context);
494 (DDKAPI *PMM_DLL_INITIALIZE)(
495 /*IN*/ PUNICODE_STRING RegistryPath);
498 (DDKAPI *PMM_DLL_UNLOAD)(
502 (DDKAPI *PDRIVER_ENTRY)(
503 /*IN*/ struct _DRIVER_OBJECT *DriverObject,
504 /*IN*/ PUNICODE_STRING RegistryPath);
507 (DDKAPI *PDRIVER_INITIALIZE)(
508 /*IN*/ struct _DRIVER_OBJECT *DriverObject,
509 /*IN*/ PUNICODE_STRING RegistryPath);
512 (DDKAPI *PKSERVICE_ROUTINE)(
513 /*IN*/ struct _KINTERRUPT *Interrupt,
514 /*IN*/ PVOID ServiceContext);
517 (DDKAPI *PIO_TIMER_ROUTINE)(
518 /*IN*/ struct _DEVICE_OBJECT *DeviceObject,
519 /*IN*/ PVOID Context);
522 (DDKAPI *PDRIVER_REINITIALIZE)(
523 /*IN*/ struct _DRIVER_OBJECT *DriverObject,
524 /*IN*/ PVOID Context,
528 (DDKAPI *PDRIVER_STARTIO)(
529 /*IN*/ struct _DEVICE_OBJECT *DeviceObject,
530 /*IN*/ struct _IRP *Irp);
533 (DDKAPI *PKSYNCHRONIZE_ROUTINE)(
534 /*IN*/ PVOID SynchronizeContext);
537 (DDKAPI *PDRIVER_UNLOAD)(
538 /*IN*/ struct _DRIVER_OBJECT *DriverObject);
543 ** Plug and Play structures
547 (*PINTERFACE_REFERENCE)(
551 (*PINTERFACE_DEREFERENCE)(
554 typedef BOOLEAN DDKAPI
555 (*PTRANSLATE_BUS_ADDRESS)(
556 /*IN*/ PVOID Context,
557 /*IN*/ PHYSICAL_ADDRESS BusAddress,
559 /*IN OUT*/ PULONG AddressSpace,
560 /*OUT*/ PPHYSICAL_ADDRESS TranslatedAddress);
562 typedef struct _DMA_ADAPTER* DDKAPI
564 /*IN*/ PVOID Context,
565 /*IN*/ struct _DEVICE_DESCRIPTION *DeviceDescriptor,
566 /*OUT*/ PULONG NumberOfMapRegisters);
569 (*PGET_SET_DEVICE_DATA)(
570 /*IN*/ PVOID Context,
571 /*IN*/ ULONG DataType,
574 /*IN*/ ULONG Length);
576 typedef union _POWER_STATE {
577 SYSTEM_POWER_STATE SystemState;
578 DEVICE_POWER_STATE DeviceState;
579 } POWER_STATE, *PPOWER_STATE;
581 typedef enum _POWER_STATE_TYPE {
584 } POWER_STATE_TYPE, *PPOWER_STATE_TYPE;
586 typedef struct _BUS_INTERFACE_STANDARD {
590 PINTERFACE_REFERENCE InterfaceReference;
591 PINTERFACE_DEREFERENCE InterfaceDereference;
592 PTRANSLATE_BUS_ADDRESS TranslateBusAddress;
593 PGET_DMA_ADAPTER GetDmaAdapter;
594 PGET_SET_DEVICE_DATA SetBusData;
595 PGET_SET_DEVICE_DATA GetBusData;
596 } BUS_INTERFACE_STANDARD, *PBUS_INTERFACE_STANDARD;
598 typedef struct _DEVICE_CAPABILITIES {
603 ULONG LockSupported : 1;
604 ULONG EjectSupported : 1;
606 ULONG DockDevice : 1;
608 ULONG SilentInstall : 1;
609 ULONG RawDeviceOK : 1;
610 ULONG SurpriseRemovalOK : 1;
611 ULONG WakeFromD0 : 1;
612 ULONG WakeFromD1 : 1;
613 ULONG WakeFromD2 : 1;
614 ULONG WakeFromD3 : 1;
615 ULONG HardwareDisabled : 1;
616 ULONG NonDynamic : 1;
617 ULONG WarmEjectSupported : 1;
618 ULONG NoDisplayInUI : 1;
622 DEVICE_POWER_STATE DeviceState[PowerSystemMaximum];
623 SYSTEM_POWER_STATE SystemWake;
624 DEVICE_POWER_STATE DeviceWake;
628 } DEVICE_CAPABILITIES, *PDEVICE_CAPABILITIES;
630 typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION {
634 GUID InterfaceClassGuid;
635 PUNICODE_STRING SymbolicLinkName;
636 } DEVICE_INTERFACE_CHANGE_NOTIFICATION, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION;
638 typedef struct _HWPROFILE_CHANGE_NOTIFICATION {
642 } HWPROFILE_CHANGE_NOTIFICATION, *PHWPROFILE_CHANGE_NOTIFICATION;
646 typedef struct _INTERFACE {
650 PINTERFACE_REFERENCE InterfaceReference;
651 PINTERFACE_DEREFERENCE InterfaceDereference;
652 } INTERFACE, *PINTERFACE;
654 typedef struct _PLUGPLAY_NOTIFICATION_HEADER {
658 } PLUGPLAY_NOTIFICATION_HEADER, *PPLUGPLAY_NOTIFICATION_HEADER;
660 typedef ULONG PNP_DEVICE_STATE, *PPNP_DEVICE_STATE;
662 /* PNP_DEVICE_STATE */
664 #define PNP_DEVICE_DISABLED 0x00000001
665 #define PNP_DEVICE_DONT_DISPLAY_IN_UI 0x00000002
666 #define PNP_DEVICE_FAILED 0x00000004
667 #define PNP_DEVICE_REMOVED 0x00000008
668 #define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010
669 #define PNP_DEVICE_NOT_DISABLEABLE 0x00000020
671 typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION {
675 struct _FILE_OBJECT *FileObject;
676 LONG NameBufferOffset;
677 UCHAR CustomDataBuffer[1];
678 } TARGET_DEVICE_CUSTOM_NOTIFICATION, *PTARGET_DEVICE_CUSTOM_NOTIFICATION;
680 typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION {
684 struct _FILE_OBJECT *FileObject;
685 } TARGET_DEVICE_REMOVAL_NOTIFICATION, *PTARGET_DEVICE_REMOVAL_NOTIFICATION;
687 typedef enum _BUS_QUERY_ID_TYPE {
690 BusQueryCompatibleIDs,
692 BusQueryDeviceSerialNumber
693 } BUS_QUERY_ID_TYPE, *PBUS_QUERY_ID_TYPE;
695 typedef enum _DEVICE_TEXT_TYPE {
696 DeviceTextDescription,
697 DeviceTextLocationInformation
698 } DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE;
700 typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE {
701 DeviceUsageTypeUndefined,
702 DeviceUsageTypePaging,
703 DeviceUsageTypeHibernation,
704 DeviceUsageTypeDumpFile
705 } DEVICE_USAGE_NOTIFICATION_TYPE;
707 typedef struct _POWER_SEQUENCE {
711 } POWER_SEQUENCE, *PPOWER_SEQUENCE;
714 DevicePropertyDeviceDescription,
715 DevicePropertyHardwareID,
716 DevicePropertyCompatibleIDs,
717 DevicePropertyBootConfiguration,
718 DevicePropertyBootConfigurationTranslated,
719 DevicePropertyClassName,
720 DevicePropertyClassGuid,
721 DevicePropertyDriverKeyName,
722 DevicePropertyManufacturer,
723 DevicePropertyFriendlyName,
724 DevicePropertyLocationInformation,
725 DevicePropertyPhysicalDeviceObjectName,
726 DevicePropertyBusTypeGuid,
727 DevicePropertyLegacyBusType,
728 DevicePropertyBusNumber,
729 DevicePropertyEnumeratorName,
730 DevicePropertyAddress,
731 DevicePropertyUINumber,
732 DevicePropertyInstallState,
733 DevicePropertyRemovalPolicy
734 } DEVICE_REGISTRY_PROPERTY;
736 typedef enum _IO_NOTIFICATION_EVENT_CATEGORY {
737 EventCategoryReserved,
738 EventCategoryHardwareProfileChange,
739 EventCategoryDeviceInterfaceChange,
740 EventCategoryTargetDeviceChange
741 } IO_NOTIFICATION_EVENT_CATEGORY;
743 #define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES 0x00000001
745 typedef NTSTATUS DDKAPI
746 (*PDRIVER_NOTIFICATION_CALLBACK_ROUTINE)(
747 /*IN*/ PVOID NotificationStructure,
748 /*IN*/ PVOID Context);
751 (*PDEVICE_CHANGE_COMPLETE_CALLBACK)(
752 /*IN*/ PVOID Context);
760 #define SYMBOLIC_LINK_QUERY 0x0001
761 #define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
763 /* also in winnt,h */
764 #define DUPLICATE_CLOSE_SOURCE 0x00000001
765 #define DUPLICATE_SAME_ACCESS 0x00000002
766 #define DUPLICATE_SAME_ATTRIBUTES 0x00000004
769 typedef struct _OBJECT_NAME_INFORMATION {
771 } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
775 /*IN*/ PVOID ApcContext,
776 /*IN*/ PIO_STATUS_BLOCK IoStatusBlock,
777 /*IN*/ ULONG Reserved);
779 typedef struct _IO_STATUS_BLOCK {
780 _ANONYMOUS_UNION union {
784 ULONG_PTR Information;
789 /*IN*/ PVOID NormalContext,
790 /*IN*/ PVOID SystemArgument1,
791 /*IN*/ PVOID SystemArgument2);
795 /*IN*/ struct _KAPC *Apc,
796 /*IN OUT*/ PKNORMAL_ROUTINE *NormalRoutine,
797 /*IN OUT*/ PVOID *NormalContext,
798 /*IN OUT*/ PVOID *SystemArgument1,
799 /*IN OUT*/ PVOID *SystemArgument2);
802 (*PKRUNDOWN_ROUTINE)(
803 /*IN*/ struct _KAPC *Apc);
805 typedef BOOLEAN DDKAPI
806 (*PKTRANSFER_ROUTINE)(
809 typedef struct _KAPC {
813 struct _KTHREAD *Thread;
814 LIST_ENTRY ApcListEntry;
815 PKKERNEL_ROUTINE KernelRoutine;
816 PKRUNDOWN_ROUTINE RundownRoutine;
817 PKNORMAL_ROUTINE NormalRoutine;
819 PVOID SystemArgument1;
820 PVOID SystemArgument2;
822 KPROCESSOR_MODE ApcMode;
824 } KAPC, *PKAPC, *RESTRICTED_POINTER PRKAPC;
826 typedef struct _KDEVICE_QUEUE {
829 LIST_ENTRY DeviceListHead;
832 } KDEVICE_QUEUE, *PKDEVICE_QUEUE, *RESTRICTED_POINTER PRKDEVICE_QUEUE;
834 typedef struct _KDEVICE_QUEUE_ENTRY {
835 LIST_ENTRY DeviceListEntry;
838 } KDEVICE_QUEUE_ENTRY, *PKDEVICE_QUEUE_ENTRY,
839 *RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY;
841 #define LOCK_QUEUE_WAIT 1
842 #define LOCK_QUEUE_OWNER 2
844 typedef enum _KSPIN_LOCK_QUEUE_NUMBER {
845 LockQueueDispatcherLock,
846 LockQueueContextSwapLock,
848 LockQueueSystemSpaceLock,
851 LockQueueNonPagedPoolLock,
852 LockQueueIoCancelLock,
853 LockQueueWorkQueueLock,
855 LockQueueIoDatabaseLock,
856 LockQueueIoCompletionLock,
857 LockQueueNtfsStructLock,
858 LockQueueAfdWorkQueueLock,
861 } KSPIN_LOCK_QUEUE_NUMBER, *PKSPIN_LOCK_QUEUE_NUMBER;
863 typedef struct _KSPIN_LOCK_QUEUE {
864 struct _KSPIN_LOCK_QUEUE *VOLATILE Next;
865 PKSPIN_LOCK VOLATILE Lock;
866 } KSPIN_LOCK_QUEUE, *PKSPIN_LOCK_QUEUE;
868 typedef struct _KLOCK_QUEUE_HANDLE {
869 KSPIN_LOCK_QUEUE LockQueue;
871 } KLOCK_QUEUE_HANDLE, *PKLOCK_QUEUE_HANDLE;
873 typedef struct _KDPC {
877 LIST_ENTRY DpcListEntry;
878 PKDEFERRED_ROUTINE DeferredRoutine;
879 PVOID DeferredContext;
880 PVOID SystemArgument1;
881 PVOID SystemArgument2;
883 } KDPC, *PKDPC, *RESTRICTED_POINTER PRKDPC;
885 typedef struct _WAIT_CONTEXT_BLOCK {
886 KDEVICE_QUEUE_ENTRY WaitQueueEntry;
887 struct _DRIVER_CONTROL *DeviceRoutine;
889 ULONG NumberOfMapRegisters;
892 PKDPC BufferChainingDpc;
893 } WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK;
895 typedef struct _DISPATCHER_HEADER {
901 LIST_ENTRY WaitListHead;
902 } DISPATCHER_HEADER, *PDISPATCHER_HEADER;
904 typedef struct _KEVENT {
905 DISPATCHER_HEADER Header;
906 } KEVENT, *PKEVENT, *RESTRICTED_POINTER PRKEVENT;
908 typedef struct _KSEMAPHORE {
909 DISPATCHER_HEADER Header;
911 } KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE;
913 typedef struct _FAST_MUTEX {
915 struct _KTHREAD *Owner;
919 } FAST_MUTEX, *PFAST_MUTEX;
921 typedef struct _KTIMER {
922 DISPATCHER_HEADER Header;
923 ULARGE_INTEGER DueTime;
924 LIST_ENTRY TimerListEntry;
927 } KTIMER, *PKTIMER, *RESTRICTED_POINTER PRKTIMER;
929 typedef struct _KMUTANT {
930 DISPATCHER_HEADER Header;
931 LIST_ENTRY MutantListEntry;
932 struct _KTHREAD *RESTRICTED_POINTER OwnerThread;
935 } KMUTANT, *PKMUTANT, *RESTRICTED_POINTER PRKMUTANT, KMUTEX, *PKMUTEX, *RESTRICTED_POINTER PRKMUTEX;
937 typedef enum _TIMER_TYPE {
942 typedef enum _TIMER_INFORMATION_CLASS {
943 TimerBasicInformation
944 } TIMER_INFORMATION_CLASS;
946 typedef struct _TIMER_BASIC_INFORMATION {
947 LARGE_INTEGER TimeRemaining;
949 } TIMER_BASIC_INFORMATION, *PTIMER_BASIC_INFORMATION;
951 #define EVENT_INCREMENT 1
952 #define IO_NO_INCREMENT 0
953 #define IO_CD_ROM_INCREMENT 1
954 #define IO_DISK_INCREMENT 1
955 #define IO_KEYBOARD_INCREMENT 6
956 #define IO_MAILSLOT_INCREMENT 2
957 #define IO_MOUSE_INCREMENT 6
958 #define IO_NAMED_PIPE_INCREMENT 2
959 #define IO_NETWORK_INCREMENT 2
960 #define IO_PARALLEL_INCREMENT 1
961 #define IO_SERIAL_INCREMENT 2
962 #define IO_SOUND_INCREMENT 8
963 #define IO_VIDEO_INCREMENT 1
964 #define SEMAPHORE_INCREMENT 1
966 typedef struct _IRP {
969 struct _MDL *MdlAddress;
972 struct _IRP *MasterIrp;
976 LIST_ENTRY ThreadListEntry;
977 IO_STATUS_BLOCK IoStatus;
978 KPROCESSOR_MODE RequestorMode;
979 BOOLEAN PendingReturned;
981 CHAR CurrentLocation;
984 CCHAR ApcEnvironment;
985 UCHAR AllocationFlags;
986 PIO_STATUS_BLOCK UserIosb;
990 PIO_APC_ROUTINE UserApcRoutine;
991 PVOID UserApcContext;
992 } AsynchronousParameters;
993 LARGE_INTEGER AllocationSize;
995 PDRIVER_CANCEL CancelRoutine;
999 _ANONYMOUS_UNION union {
1000 KDEVICE_QUEUE_ENTRY DeviceQueueEntry;
1001 _ANONYMOUS_STRUCT struct {
1002 PVOID DriverContext[4];
1006 PCHAR AuxiliaryBuffer;
1007 _ANONYMOUS_STRUCT struct {
1008 LIST_ENTRY ListEntry;
1009 _ANONYMOUS_UNION union {
1010 struct _IO_STACK_LOCATION *CurrentStackLocation;
1014 struct _FILE_OBJECT *OriginalFileObject;
1017 PVOID CompletionKey;
1020 typedef struct _IRP *PIRP;
1024 #define SL_FORCE_ACCESS_CHECK 0x01
1025 #define SL_OPEN_PAGING_FILE 0x02
1026 #define SL_OPEN_TARGET_DIRECTORY 0x04
1027 #define SL_CASE_SENSITIVE 0x80
1029 #define SL_KEY_SPECIFIED 0x01
1030 #define SL_OVERRIDE_VERIFY_VOLUME 0x02
1031 #define SL_WRITE_THROUGH 0x04
1032 #define SL_FT_SEQUENTIAL_WRITE 0x08
1034 #define SL_FAIL_IMMEDIATELY 0x01
1035 #define SL_EXCLUSIVE_LOCK 0x02
1037 #define SL_RESTART_SCAN 0x01
1038 #define SL_RETURN_SINGLE_ENTRY 0x02
1039 #define SL_INDEX_SPECIFIED 0x04
1041 #define SL_WATCH_TREE 0x01
1043 #define SL_ALLOW_RAW_MOUNT 0x01
1045 #define CTL_CODE(DeviceType, Function, Method, Access)( \
1046 ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
1048 #define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16)
1053 IRP_PAGING_IO = 0x2,
1054 IRP_MOUNT_COMPLETION = 0x2,
1055 IRP_SYNCHRONOUS_API = 0x4,
1056 IRP_ASSOCIATED_IRP = 0x8,
1057 IRP_BUFFERED_IO = 0x10,
1058 IRP_DEALLOCATE_BUFFER = 0x20,
1059 IRP_INPUT_OPERATION = 0x40,
1060 IRP_SYNCHRONOUS_PAGING_IO = 0x40,
1061 IRP_CREATE_OPERATION = 0x80,
1062 IRP_READ_OPERATION = 0x100,
1063 IRP_WRITE_OPERATION = 0x200,
1064 IRP_CLOSE_OPERATION = 0x400,
1065 IRP_DEFER_IO_COMPLETION = 0x800,
1066 IRP_OB_QUERY_NAME = 0x1000,
1067 IRP_HOLD_DEVICE_QUEUE = 0x2000,
1068 IRP_RETRY_IO_COMPLETION = 0x4000
1071 #ifndef _DRIVE_LAYOUT_INFORMATION_MBR_DEFINED
1072 #define _DRIVE_LAYOUT_INFORMATION_MBR_DEFINED
1073 typedef struct _DRIVE_LAYOUT_INFORMATION_MBR {
1075 } DRIVE_LAYOUT_INFORMATION_MBR, *PDRIVE_LAYOUT_INFORMATION_MBR;
1078 typedef struct _DRIVE_LAYOUT_INFORMATION_GPT {
1080 LARGE_INTEGER StartingUsableOffset;
1081 LARGE_INTEGER UsableLength;
1082 ULONG MaxPartitionCount;
1083 } DRIVE_LAYOUT_INFORMATION_GPT, *PDRIVE_LAYOUT_INFORMATION_GPT;
1085 typedef struct _PARTITION_INFORMATION_MBR {
1086 UCHAR PartitionType;
1087 BOOLEAN BootIndicator;
1088 BOOLEAN RecognizedPartition;
1089 ULONG HiddenSectors;
1090 } PARTITION_INFORMATION_MBR, *PPARTITION_INFORMATION_MBR;
1093 typedef struct _BOOTDISK_INFORMATION {
1094 LONGLONG BootPartitionOffset;
1095 LONGLONG SystemPartitionOffset;
1096 ULONG BootDeviceSignature;
1097 ULONG SystemDeviceSignature;
1098 } BOOTDISK_INFORMATION, *PBOOTDISK_INFORMATION;
1100 typedef struct _BOOTDISK_INFORMATION_EX {
1101 LONGLONG BootPartitionOffset;
1102 LONGLONG SystemPartitionOffset;
1103 ULONG BootDeviceSignature;
1104 ULONG SystemDeviceSignature;
1105 GUID BootDeviceGuid;
1106 GUID SystemDeviceGuid;
1107 BOOLEAN BootDeviceIsGpt;
1108 BOOLEAN SystemDeviceIsGpt;
1109 } BOOTDISK_INFORMATION_EX, *PBOOTDISK_INFORMATION_EX;
1111 typedef struct _EISA_MEMORY_TYPE {
1112 UCHAR ReadWrite : 1;
1114 UCHAR Reserved0 : 1;
1117 UCHAR Reserved1 : 1;
1118 UCHAR MoreEntries : 1;
1119 } EISA_MEMORY_TYPE, *PEISA_MEMORY_TYPE;
1121 #include <pshpack1.h>
1122 typedef struct _EISA_MEMORY_CONFIGURATION {
1123 EISA_MEMORY_TYPE ConfigurationByte;
1125 USHORT AddressLowWord;
1126 UCHAR AddressHighByte;
1128 } EISA_MEMORY_CONFIGURATION, *PEISA_MEMORY_CONFIGURATION;
1129 #include <poppack.h>
1131 typedef struct _EISA_IRQ_DESCRIPTOR {
1132 UCHAR Interrupt : 4;
1134 UCHAR LevelTriggered : 1;
1136 UCHAR MoreEntries : 1;
1137 } EISA_IRQ_DESCRIPTOR, *PEISA_IRQ_DESCRIPTOR;
1139 typedef struct _EISA_IRQ_CONFIGURATION {
1140 EISA_IRQ_DESCRIPTOR ConfigurationByte;
1142 } EISA_IRQ_CONFIGURATION, *PEISA_IRQ_CONFIGURATION;
1144 typedef struct _DMA_CONFIGURATION_BYTE0 {
1148 UCHAR MoreEntries : 1;
1149 } DMA_CONFIGURATION_BYTE0;
1151 typedef struct _DMA_CONFIGURATION_BYTE1 {
1152 UCHAR Reserved0 : 2;
1153 UCHAR TransferSize : 2;
1155 UCHAR Reserved1 : 2;
1156 } DMA_CONFIGURATION_BYTE1;
1158 typedef struct _EISA_DMA_CONFIGURATION {
1159 DMA_CONFIGURATION_BYTE0 ConfigurationByte0;
1160 DMA_CONFIGURATION_BYTE1 ConfigurationByte1;
1161 } EISA_DMA_CONFIGURATION, *PEISA_DMA_CONFIGURATION;
1163 #include <pshpack1.h>
1164 typedef struct _EISA_PORT_DESCRIPTOR {
1165 UCHAR NumberPorts : 5;
1168 UCHAR MoreEntries : 1;
1169 } EISA_PORT_DESCRIPTOR, *PEISA_PORT_DESCRIPTOR;
1171 typedef struct _EISA_PORT_CONFIGURATION {
1172 EISA_PORT_DESCRIPTOR Configuration;
1174 } EISA_PORT_CONFIGURATION, *PEISA_PORT_CONFIGURATION;
1175 #include <poppack.h>
1177 typedef struct _CM_EISA_FUNCTION_INFORMATION {
1181 UCHAR MinorRevision;
1182 UCHAR MajorRevision;
1183 UCHAR Selections[26];
1184 UCHAR FunctionFlags;
1185 UCHAR TypeString[80];
1186 EISA_MEMORY_CONFIGURATION EisaMemory[9];
1187 EISA_IRQ_CONFIGURATION EisaIrq[7];
1188 EISA_DMA_CONFIGURATION EisaDma[4];
1189 EISA_PORT_CONFIGURATION EisaPort[20];
1190 UCHAR InitializationData[60];
1191 } CM_EISA_FUNCTION_INFORMATION, *PCM_EISA_FUNCTION_INFORMATION;
1193 /* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */
1195 #define EISA_FUNCTION_ENABLED 0x80
1196 #define EISA_FREE_FORM_DATA 0x40
1197 #define EISA_HAS_PORT_INIT_ENTRY 0x20
1198 #define EISA_HAS_PORT_RANGE 0x10
1199 #define EISA_HAS_DMA_ENTRY 0x08
1200 #define EISA_HAS_IRQ_ENTRY 0x04
1201 #define EISA_HAS_MEMORY_ENTRY 0x02
1202 #define EISA_HAS_TYPE_ENTRY 0x01
1203 #define EISA_HAS_INFORMATION \
1204 (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \
1205 + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY)
1207 typedef struct _CM_EISA_SLOT_INFORMATION {
1210 UCHAR MajorRevision;
1211 UCHAR MinorRevision;
1213 UCHAR NumberFunctions;
1214 UCHAR FunctionInformation;
1216 } CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION;
1218 /* CM_EISA_SLOT_INFORMATION.ReturnCode */
1220 #define EISA_INVALID_SLOT 0x80
1221 #define EISA_INVALID_FUNCTION 0x81
1222 #define EISA_INVALID_CONFIGURATION 0x82
1223 #define EISA_EMPTY_SLOT 0x83
1224 #define EISA_INVALID_BIOS_CALL 0x86
1226 typedef struct _CM_FLOPPY_DEVICE_DATA {
1232 UCHAR StepRateHeadUnloadTime;
1235 UCHAR SectorLengthCode;
1236 UCHAR SectorPerTrack;
1237 UCHAR ReadWriteGapLength;
1238 UCHAR DataTransferLength;
1239 UCHAR FormatGapLength;
1240 UCHAR FormatFillCharacter;
1241 UCHAR HeadSettleTime;
1242 UCHAR MotorSettleTime;
1243 UCHAR MaximumTrackValue;
1244 UCHAR DataTransferRate;
1245 } CM_FLOPPY_DEVICE_DATA, *PCM_FLOPPY_DEVICE_DATA;
1247 typedef enum _INTERFACE_TYPE {
1248 InterfaceTypeUndefined = -1,
1265 MaximumInterfaceType
1266 } INTERFACE_TYPE, *PINTERFACE_TYPE;
1268 typedef struct _PNP_BUS_INFORMATION {
1270 INTERFACE_TYPE LegacyBusType;
1272 } PNP_BUS_INFORMATION, *PPNP_BUS_INFORMATION;
1274 #include <pshpack1.h>
1275 typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR {
1277 UCHAR ShareDisposition;
1281 PHYSICAL_ADDRESS Start;
1285 PHYSICAL_ADDRESS Start;
1294 PHYSICAL_ADDRESS Start;
1314 } DeviceSpecificData;
1316 } CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;
1318 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Type */
1320 #define CmResourceTypeNull 0
1321 #define CmResourceTypePort 1
1322 #define CmResourceTypeInterrupt 2
1323 #define CmResourceTypeMemory 3
1324 #define CmResourceTypeDma 4
1325 #define CmResourceTypeDeviceSpecific 5
1326 #define CmResourceTypeBusNumber 6
1327 #define CmResourceTypeMaximum 7
1328 #define CmResourceTypeNonArbitrated 128
1329 #define CmResourceTypeConfigData 128
1330 #define CmResourceTypeDevicePrivate 129
1331 #define CmResourceTypePcCardConfig 130
1332 #define CmResourceTypeMfCardConfig 131
1334 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.ShareDisposition */
1336 typedef enum _CM_SHARE_DISPOSITION {
1337 CmResourceShareUndetermined,
1338 CmResourceShareDeviceExclusive,
1339 CmResourceShareDriverExclusive,
1340 CmResourceShareShared
1341 } CM_SHARE_DISPOSITION;
1343 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypePort */
1345 #define CM_RESOURCE_PORT_MEMORY 0x0000
1346 #define CM_RESOURCE_PORT_IO 0x0001
1347 #define CM_RESOURCE_PORT_10_BIT_DECODE 0x0004
1348 #define CM_RESOURCE_PORT_12_BIT_DECODE 0x0008
1349 #define CM_RESOURCE_PORT_16_BIT_DECODE 0x0010
1350 #define CM_RESOURCE_PORT_POSITIVE_DECODE 0x0020
1351 #define CM_RESOURCE_PORT_PASSIVE_DECODE 0x0040
1352 #define CM_RESOURCE_PORT_WINDOW_DECODE 0x0080
1354 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeInterrupt */
1356 #define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0x0000
1357 #define CM_RESOURCE_INTERRUPT_LATCHED 0x0001
1359 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeMemory */
1361 #define CM_RESOURCE_MEMORY_READ_WRITE 0x0000
1362 #define CM_RESOURCE_MEMORY_READ_ONLY 0x0001
1363 #define CM_RESOURCE_MEMORY_WRITE_ONLY 0x0002
1364 #define CM_RESOURCE_MEMORY_PREFETCHABLE 0x0004
1365 #define CM_RESOURCE_MEMORY_COMBINEDWRITE 0x0008
1366 #define CM_RESOURCE_MEMORY_24 0x0010
1367 #define CM_RESOURCE_MEMORY_CACHEABLE 0x0020
1369 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeDma */
1371 #define CM_RESOURCE_DMA_8 0x0000
1372 #define CM_RESOURCE_DMA_16 0x0001
1373 #define CM_RESOURCE_DMA_32 0x0002
1374 #define CM_RESOURCE_DMA_8_AND_16 0x0004
1375 #define CM_RESOURCE_DMA_BUS_MASTER 0x0008
1376 #define CM_RESOURCE_DMA_TYPE_A 0x0010
1377 #define CM_RESOURCE_DMA_TYPE_B 0x0020
1378 #define CM_RESOURCE_DMA_TYPE_F 0x0040
1380 typedef struct _CM_PARTIAL_RESOURCE_LIST {
1384 CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1];
1385 } CM_PARTIAL_RESOURCE_LIST, *PCM_PARTIAL_RESOURCE_LIST;
1387 typedef struct _CM_FULL_RESOURCE_DESCRIPTOR {
1388 INTERFACE_TYPE InterfaceType;
1390 CM_PARTIAL_RESOURCE_LIST PartialResourceList;
1391 } CM_FULL_RESOURCE_DESCRIPTOR, *PCM_FULL_RESOURCE_DESCRIPTOR;
1393 typedef struct _CM_RESOURCE_LIST {
1395 CM_FULL_RESOURCE_DESCRIPTOR List[1];
1396 } CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;
1398 typedef struct _CM_INT13_DRIVE_PARAMETER {
1401 USHORT SectorsPerTrack;
1403 USHORT NumberDrives;
1404 } CM_INT13_DRIVE_PARAMETER, *PCM_INT13_DRIVE_PARAMETER;
1405 #include <poppack.h>
1407 typedef struct _CM_KEYBOARD_DEVICE_DATA {
1412 USHORT KeyboardFlags;
1413 } CM_KEYBOARD_DEVICE_DATA, *PCM_KEYBOARD_DEVICE_DATA;
1415 #define KEYBOARD_INSERT_ON 0x80
1416 #define KEYBOARD_CAPS_LOCK_ON 0x40
1417 #define KEYBOARD_NUM_LOCK_ON 0x20
1418 #define KEYBOARD_SCROLL_LOCK_ON 0x10
1419 #define KEYBOARD_ALT_KEY_DOWN 0x08
1420 #define KEYBOARD_CTRL_KEY_DOWN 0x04
1421 #define KEYBOARD_LEFT_SHIFT_DOWN 0x02
1422 #define KEYBOARD_RIGHT_SHIFT_DOWN 0x01
1424 typedef struct _CM_MCA_POS_DATA {
1430 } CM_MCA_POS_DATA, *PCM_MCA_POS_DATA;
1432 typedef struct CM_Power_Data_s {
1434 DEVICE_POWER_STATE PD_MostRecentPowerState;
1435 ULONG PD_Capabilities;
1439 DEVICE_POWER_STATE PD_PowerStateMapping[PowerSystemMaximum];
1440 } CM_POWER_DATA, *PCM_POWER_DATA;
1442 #define PDCAP_D0_SUPPORTED 0x00000001
1443 #define PDCAP_D1_SUPPORTED 0x00000002
1444 #define PDCAP_D2_SUPPORTED 0x00000004
1445 #define PDCAP_D3_SUPPORTED 0x00000008
1446 #define PDCAP_WAKE_FROM_D0_SUPPORTED 0x00000010
1447 #define PDCAP_WAKE_FROM_D1_SUPPORTED 0x00000020
1448 #define PDCAP_WAKE_FROM_D2_SUPPORTED 0x00000040
1449 #define PDCAP_WAKE_FROM_D3_SUPPORTED 0x00000080
1450 #define PDCAP_WARM_EJECT_SUPPORTED 0x00000100
1452 typedef struct _CM_SCSI_DEVICE_DATA {
1455 UCHAR HostIdentifier;
1456 } CM_SCSI_DEVICE_DATA, *PCM_SCSI_DEVICE_DATA;
1458 typedef struct _CM_SERIAL_DEVICE_DATA {
1462 } CM_SERIAL_DEVICE_DATA, *PCM_SERIAL_DEVICE_DATA;
1464 /* IO_RESOURCE_DESCRIPTOR.Option */
1466 #define IO_RESOURCE_PREFERRED 0x01
1467 #define IO_RESOURCE_DEFAULT 0x02
1468 #define IO_RESOURCE_ALTERNATIVE 0x08
1470 typedef struct _IO_RESOURCE_DESCRIPTOR {
1473 UCHAR ShareDisposition;
1481 PHYSICAL_ADDRESS MinimumAddress;
1482 PHYSICAL_ADDRESS MaximumAddress;
1487 PHYSICAL_ADDRESS MinimumAddress;
1488 PHYSICAL_ADDRESS MaximumAddress;
1491 ULONG MinimumVector;
1492 ULONG MaximumVector;
1495 ULONG MinimumChannel;
1496 ULONG MaximumChannel;
1501 PHYSICAL_ADDRESS MinimumAddress;
1502 PHYSICAL_ADDRESS MaximumAddress;
1519 } IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
1521 typedef struct _IO_RESOURCE_LIST {
1525 IO_RESOURCE_DESCRIPTOR Descriptors[1];
1526 } IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;
1528 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {
1530 INTERFACE_TYPE InterfaceType;
1534 ULONG AlternativeLists;
1535 IO_RESOURCE_LIST List[1];
1536 } IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
1538 typedef struct _CONTROLLER_OBJECT {
1541 PVOID ControllerExtension;
1542 KDEVICE_QUEUE DeviceWaitQueue;
1544 LARGE_INTEGER Spare2;
1545 } CONTROLLER_OBJECT, *PCONTROLLER_OBJECT;
1547 typedef enum _DMA_WIDTH {
1552 } DMA_WIDTH, *PDMA_WIDTH;
1554 typedef enum _DMA_SPEED {
1561 } DMA_SPEED, *PDMA_SPEED;
1563 /* DEVICE_DESCRIPTION.Version */
1565 #define DEVICE_DESCRIPTION_VERSION 0x0000
1566 #define DEVICE_DESCRIPTION_VERSION1 0x0001
1567 #define DEVICE_DESCRIPTION_VERSION2 0x0002
1569 typedef struct _DEVICE_DESCRIPTION {
1572 BOOLEAN ScatterGather;
1574 BOOLEAN AutoInitialize;
1575 BOOLEAN Dma32BitAddresses;
1576 BOOLEAN IgnoreCount;
1578 BOOLEAN Dma64BitAddresses;
1581 INTERFACE_TYPE InterfaceType;
1584 ULONG MaximumLength;
1586 } DEVICE_DESCRIPTION, *PDEVICE_DESCRIPTION;
1589 #define VPB_MOUNTED 0x0001
1590 #define VPB_LOCKED 0x0002
1591 #define VPB_PERSISTENT 0x0004
1592 #define VPB_REMOVE_PENDING 0x0008
1593 #define VPB_RAW_MOUNT 0x0010
1595 #define MAXIMUM_VOLUME_LABEL_LENGTH (32 * sizeof(WCHAR))
1597 typedef struct _VPB {
1601 USHORT VolumeLabelLength;
1602 struct _DEVICE_OBJECT *DeviceObject;
1603 struct _DEVICE_OBJECT *RealDevice;
1605 ULONG ReferenceCount;
1606 WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)];
1609 /* DEVICE_OBJECT.Flags */
1611 #define DO_VERIFY_VOLUME 0x00000002
1612 #define DO_BUFFERED_IO 0x00000004
1613 #define DO_EXCLUSIVE 0x00000008
1614 #define DO_DIRECT_IO 0x00000010
1615 #define DO_MAP_IO_BUFFER 0x00000020
1616 #define DO_DEVICE_HAS_NAME 0x00000040
1617 #define DO_DEVICE_INITIALIZING 0x00000080
1618 #define DO_SYSTEM_BOOT_PARTITION 0x00000100
1619 #define DO_LONG_TERM_REQUESTS 0x00000200
1620 #define DO_NEVER_LAST_DEVICE 0x00000400
1621 #define DO_SHUTDOWN_REGISTERED 0x00000800
1622 #define DO_BUS_ENUMERATED_DEVICE 0x00001000
1623 #define DO_POWER_PAGABLE 0x00002000
1624 #define DO_POWER_INRUSH 0x00004000
1625 #define DO_LOW_PRIORITY_FILESYSTEM 0x00010000
1627 /* DEVICE_OBJECT.Characteristics */
1629 #define FILE_REMOVABLE_MEDIA 0x00000001
1630 #define FILE_READ_ONLY_DEVICE 0x00000002
1631 #define FILE_FLOPPY_DISKETTE 0x00000004
1632 #define FILE_WRITE_ONCE_MEDIA 0x00000008
1633 #define FILE_REMOTE_DEVICE 0x00000010
1634 #define FILE_DEVICE_IS_MOUNTED 0x00000020
1635 #define FILE_VIRTUAL_VOLUME 0x00000040
1636 #define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080
1637 #define FILE_DEVICE_SECURE_OPEN 0x00000100
1639 /* DEVICE_OBJECT.AlignmentRequirement */
1641 #define FILE_BYTE_ALIGNMENT 0x00000000
1642 #define FILE_WORD_ALIGNMENT 0x00000001
1643 #define FILE_LONG_ALIGNMENT 0x00000003
1644 #define FILE_QUAD_ALIGNMENT 0x00000007
1645 #define FILE_OCTA_ALIGNMENT 0x0000000f
1646 #define FILE_32_BYTE_ALIGNMENT 0x0000001f
1647 #define FILE_64_BYTE_ALIGNMENT 0x0000003f
1648 #define FILE_128_BYTE_ALIGNMENT 0x0000007f
1649 #define FILE_256_BYTE_ALIGNMENT 0x000000ff
1650 #define FILE_512_BYTE_ALIGNMENT 0x000001ff
1652 /* DEVICE_OBJECT.DeviceType */
1654 #define DEVICE_TYPE ULONG
1656 #define FILE_DEVICE_BEEP 0x00000001
1657 #define FILE_DEVICE_CD_ROM 0x00000002
1658 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
1659 #define FILE_DEVICE_CONTROLLER 0x00000004
1660 #define FILE_DEVICE_DATALINK 0x00000005
1661 #define FILE_DEVICE_DFS 0x00000006
1662 #define FILE_DEVICE_DISK 0x00000007
1663 #define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
1664 #define FILE_DEVICE_FILE_SYSTEM 0x00000009
1665 #define FILE_DEVICE_INPORT_PORT 0x0000000a
1666 #define FILE_DEVICE_KEYBOARD 0x0000000b
1667 #define FILE_DEVICE_MAILSLOT 0x0000000c
1668 #define FILE_DEVICE_MIDI_IN 0x0000000d
1669 #define FILE_DEVICE_MIDI_OUT 0x0000000e
1670 #define FILE_DEVICE_MOUSE 0x0000000f
1671 #define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010
1672 #define FILE_DEVICE_NAMED_PIPE 0x00000011
1673 #define FILE_DEVICE_NETWORK 0x00000012
1674 #define FILE_DEVICE_NETWORK_BROWSER 0x00000013
1675 #define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
1676 #define FILE_DEVICE_NULL 0x00000015
1677 #define FILE_DEVICE_PARALLEL_PORT 0x00000016
1678 #define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017
1679 #define FILE_DEVICE_PRINTER 0x00000018
1680 #define FILE_DEVICE_SCANNER 0x00000019
1681 #define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a
1682 #define FILE_DEVICE_SERIAL_PORT 0x0000001b
1683 #define FILE_DEVICE_SCREEN 0x0000001c
1684 #define FILE_DEVICE_SOUND 0x0000001d
1685 #define FILE_DEVICE_STREAMS 0x0000001e
1686 #define FILE_DEVICE_TAPE 0x0000001f
1687 #define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
1688 #define FILE_DEVICE_TRANSPORT 0x00000021
1689 #define FILE_DEVICE_UNKNOWN 0x00000022
1690 #define FILE_DEVICE_VIDEO 0x00000023
1691 #define FILE_DEVICE_VIRTUAL_DISK 0x00000024
1692 #define FILE_DEVICE_WAVE_IN 0x00000025
1693 #define FILE_DEVICE_WAVE_OUT 0x00000026
1694 #define FILE_DEVICE_8042_PORT 0x00000027
1695 #define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
1696 #define FILE_DEVICE_BATTERY 0x00000029
1697 #define FILE_DEVICE_BUS_EXTENDER 0x0000002a
1698 #define FILE_DEVICE_MODEM 0x0000002b
1699 #define FILE_DEVICE_VDM 0x0000002c
1700 #define FILE_DEVICE_MASS_STORAGE 0x0000002d
1701 #define FILE_DEVICE_SMB 0x0000002e
1702 #define FILE_DEVICE_KS 0x0000002f
1703 #define FILE_DEVICE_CHANGER 0x00000030
1704 #define FILE_DEVICE_SMARTCARD 0x00000031
1705 #define FILE_DEVICE_ACPI 0x00000032
1706 #define FILE_DEVICE_DVD 0x00000033
1707 #define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034
1708 #define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035
1709 #define FILE_DEVICE_DFS_VOLUME 0x00000036
1710 #define FILE_DEVICE_SERENUM 0x00000037
1711 #define FILE_DEVICE_TERMSRV 0x00000038
1712 #define FILE_DEVICE_KSEC 0x00000039
1713 #define FILE_DEVICE_FIPS 0x0000003a
1715 typedef struct _DEVICE_OBJECT {
1718 LONG ReferenceCount;
1719 struct _DRIVER_OBJECT *DriverObject;
1720 struct _DEVICE_OBJECT *NextDevice;
1721 struct _DEVICE_OBJECT *AttachedDevice;
1722 struct _IRP *CurrentIrp;
1725 ULONG Characteristics;
1727 PVOID DeviceExtension;
1728 DEVICE_TYPE DeviceType;
1731 LIST_ENTRY ListEntry;
1732 WAIT_CONTEXT_BLOCK Wcb;
1734 ULONG AlignmentRequirement;
1735 KDEVICE_QUEUE DeviceQueue;
1737 ULONG ActiveThreadCount;
1738 PSECURITY_DESCRIPTOR SecurityDescriptor;
1742 struct _DEVOBJ_EXTENSION *DeviceObjectExtension;
1745 typedef struct _DEVICE_OBJECT *PDEVICE_OBJECT;
1747 typedef enum _DEVICE_RELATION_TYPE {
1752 TargetDeviceRelation,
1754 } DEVICE_RELATION_TYPE, *PDEVICE_RELATION_TYPE;
1756 typedef struct _DEVICE_RELATIONS {
1758 PDEVICE_OBJECT Objects[1];
1759 } DEVICE_RELATIONS, *PDEVICE_RELATIONS;
1761 typedef struct _SCATTER_GATHER_ELEMENT {
1762 PHYSICAL_ADDRESS Address;
1765 } SCATTER_GATHER_ELEMENT, *PSCATTER_GATHER_ELEMENT;
1767 typedef struct _SCATTER_GATHER_LIST {
1768 ULONG NumberOfElements;
1770 SCATTER_GATHER_ELEMENT Elements[0];
1771 } SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
1773 typedef struct _MDL {
1777 struct _EPROCESS *Process;
1778 PVOID MappedSystemVa;
1784 #define MDL_MAPPED_TO_SYSTEM_VA 0x0001
1785 #define MDL_PAGES_LOCKED 0x0002
1786 #define MDL_SOURCE_IS_NONPAGED_POOL 0x0004
1787 #define MDL_ALLOCATED_FIXED_SIZE 0x0008
1788 #define MDL_PARTIAL 0x0010
1789 #define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020
1790 #define MDL_IO_PAGE_READ 0x0040
1791 #define MDL_WRITE_OPERATION 0x0080
1792 #define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100
1793 #define MDL_FREE_EXTRA_PTES 0x0200
1794 #define MDL_IO_SPACE 0x0800
1795 #define MDL_NETWORK_HEADER 0x1000
1796 #define MDL_MAPPING_CAN_FAIL 0x2000
1797 #define MDL_ALLOCATED_MUST_SUCCEED 0x4000
1799 #define MDL_MAPPING_FLAGS ( \
1800 MDL_MAPPED_TO_SYSTEM_VA | \
1801 MDL_PAGES_LOCKED | \
1802 MDL_SOURCE_IS_NONPAGED_POOL | \
1803 MDL_PARTIAL_HAS_BEEN_MAPPED | \
1804 MDL_PARENT_MAPPED_SYSTEM_VA | \
1809 (*PPUT_DMA_ADAPTER)(
1810 /*IN*/ PDMA_ADAPTER DmaAdapter);
1812 typedef PVOID DDKAPI
1813 (*PALLOCATE_COMMON_BUFFER)(
1814 /*IN*/ PDMA_ADAPTER DmaAdapter,
1815 /*IN*/ ULONG Length,
1816 /*OUT*/ PPHYSICAL_ADDRESS LogicalAddress,
1817 /*IN*/ BOOLEAN CacheEnabled);
1820 (*PFREE_COMMON_BUFFER)(
1821 /*IN*/ PDMA_ADAPTER DmaAdapter,
1822 /*IN*/ ULONG Length,
1823 /*IN*/ PHYSICAL_ADDRESS LogicalAddress,
1824 /*IN*/ PVOID VirtualAddress,
1825 /*IN*/ BOOLEAN CacheEnabled);
1827 typedef NTSTATUS DDKAPI
1828 (*PALLOCATE_ADAPTER_CHANNEL)(
1829 /*IN*/ PDMA_ADAPTER DmaAdapter,
1830 /*IN*/ PDEVICE_OBJECT DeviceObject,
1831 /*IN*/ ULONG NumberOfMapRegisters,
1832 /*IN*/ PDRIVER_CONTROL ExecutionRoutine,
1833 /*IN*/ PVOID Context);
1835 typedef BOOLEAN DDKAPI
1836 (*PFLUSH_ADAPTER_BUFFERS)(
1837 /*IN*/ PDMA_ADAPTER DmaAdapter,
1839 /*IN*/ PVOID MapRegisterBase,
1840 /*IN*/ PVOID CurrentVa,
1841 /*IN*/ ULONG Length,
1842 /*IN*/ BOOLEAN WriteToDevice);
1845 (*PFREE_ADAPTER_CHANNEL)(
1846 /*IN*/ PDMA_ADAPTER DmaAdapter);
1849 (*PFREE_MAP_REGISTERS)(
1850 /*IN*/ PDMA_ADAPTER DmaAdapter,
1851 PVOID MapRegisterBase,
1852 ULONG NumberOfMapRegisters);
1854 typedef PHYSICAL_ADDRESS DDKAPI
1856 /*IN*/ PDMA_ADAPTER DmaAdapter,
1858 /*IN*/ PVOID MapRegisterBase,
1859 /*IN*/ PVOID CurrentVa,
1860 /*IN OUT*/ PULONG Length,
1861 /*IN*/ BOOLEAN WriteToDevice);
1863 typedef ULONG DDKAPI
1864 (*PGET_DMA_ALIGNMENT)(
1865 /*IN*/ PDMA_ADAPTER DmaAdapter);
1867 typedef ULONG DDKAPI
1868 (*PREAD_DMA_COUNTER)(
1869 /*IN*/ PDMA_ADAPTER DmaAdapter);
1871 typedef NTSTATUS DDKAPI
1872 (*PGET_SCATTER_GATHER_LIST)(
1873 /*IN*/ PDMA_ADAPTER DmaAdapter,
1874 /*IN*/ PDEVICE_OBJECT DeviceObject,
1876 /*IN*/ PVOID CurrentVa,
1877 /*IN*/ ULONG Length,
1878 /*IN*/ PDRIVER_LIST_CONTROL ExecutionRoutine,
1879 /*IN*/ PVOID Context,
1880 /*IN*/ BOOLEAN WriteToDevice);
1883 (*PPUT_SCATTER_GATHER_LIST)(
1884 /*IN*/ PDMA_ADAPTER DmaAdapter,
1885 /*IN*/ PSCATTER_GATHER_LIST ScatterGather,
1886 /*IN*/ BOOLEAN WriteToDevice);
1888 typedef NTSTATUS DDKAPI
1889 (*PCALCULATE_SCATTER_GATHER_LIST_SIZE)(
1890 /*IN*/ PDMA_ADAPTER DmaAdapter,
1891 /*IN*/ PMDL Mdl /*OPTIONAL*/,
1892 /*IN*/ PVOID CurrentVa,
1893 /*IN*/ ULONG Length,
1894 /*OUT*/ PULONG ScatterGatherListSize,
1895 /*OUT*/ PULONG pNumberOfMapRegisters /*OPTIONAL*/);
1897 typedef NTSTATUS DDKAPI
1898 (*PBUILD_SCATTER_GATHER_LIST)(
1899 /*IN*/ PDMA_ADAPTER DmaAdapter,
1900 /*IN*/ PDEVICE_OBJECT DeviceObject,
1902 /*IN*/ PVOID CurrentVa,
1903 /*IN*/ ULONG Length,
1904 /*IN*/ PDRIVER_LIST_CONTROL ExecutionRoutine,
1905 /*IN*/ PVOID Context,
1906 /*IN*/ BOOLEAN WriteToDevice,
1907 /*IN*/ PVOID ScatterGatherBuffer,
1908 /*IN*/ ULONG ScatterGatherLength);
1910 typedef NTSTATUS DDKAPI
1911 (*PBUILD_MDL_FROM_SCATTER_GATHER_LIST)(
1912 /*IN*/ PDMA_ADAPTER DmaAdapter,
1913 /*IN*/ PSCATTER_GATHER_LIST ScatterGather,
1914 /*IN*/ PMDL OriginalMdl,
1915 /*OUT*/ PMDL *TargetMdl);
1917 typedef struct _DMA_OPERATIONS {
1919 PPUT_DMA_ADAPTER PutDmaAdapter;
1920 PALLOCATE_COMMON_BUFFER AllocateCommonBuffer;
1921 PFREE_COMMON_BUFFER FreeCommonBuffer;
1922 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
1923 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
1924 PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
1925 PFREE_MAP_REGISTERS FreeMapRegisters;
1926 PMAP_TRANSFER MapTransfer;
1927 PGET_DMA_ALIGNMENT GetDmaAlignment;
1928 PREAD_DMA_COUNTER ReadDmaCounter;
1929 PGET_SCATTER_GATHER_LIST GetScatterGatherList;
1930 PPUT_SCATTER_GATHER_LIST PutScatterGatherList;
1931 PCALCULATE_SCATTER_GATHER_LIST_SIZE CalculateScatterGatherList;
1932 PBUILD_SCATTER_GATHER_LIST BuildScatterGatherList;
1933 PBUILD_MDL_FROM_SCATTER_GATHER_LIST BuildMdlFromScatterGatherList;
1934 } DMA_OPERATIONS, *PDMA_OPERATIONS;
1936 typedef struct _DMA_ADAPTER {
1939 PDMA_OPERATIONS DmaOperations;
1942 typedef enum _FILE_INFORMATION_CLASS {
1943 FileDirectoryInformation = 1,
1944 FileFullDirectoryInformation,
1945 FileBothDirectoryInformation,
1946 FileBasicInformation,
1947 FileStandardInformation,
1948 FileInternalInformation,
1950 FileAccessInformation,
1951 FileNameInformation,
1952 FileRenameInformation,
1953 FileLinkInformation,
1954 FileNamesInformation,
1955 FileDispositionInformation,
1956 FilePositionInformation,
1957 FileFullEaInformation,
1958 FileModeInformation,
1959 FileAlignmentInformation,
1961 FileAllocationInformation,
1962 FileEndOfFileInformation,
1963 FileAlternateNameInformation,
1964 FileStreamInformation,
1965 FilePipeInformation,
1966 FilePipeLocalInformation,
1967 FilePipeRemoteInformation,
1968 FileMailslotQueryInformation,
1969 FileMailslotSetInformation,
1970 FileCompressionInformation,
1971 FileObjectIdInformation,
1972 FileCompletionInformation,
1973 FileMoveClusterInformation,
1974 FileQuotaInformation,
1975 FileReparsePointInformation,
1976 FileNetworkOpenInformation,
1977 FileAttributeTagInformation,
1978 FileTrackingInformation,
1979 FileIdBothDirectoryInformation,
1980 FileIdFullDirectoryInformation,
1981 FileValidDataLengthInformation,
1982 FileShortNameInformation,
1983 FileMaximumInformation
1984 } FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
1986 typedef struct _FILE_POSITION_INFORMATION {
1987 LARGE_INTEGER CurrentByteOffset;
1988 } FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;
1990 typedef struct _FILE_ALIGNMENT_INFORMATION {
1991 ULONG AlignmentRequirement;
1992 } FILE_ALIGNMENT_INFORMATION;
1994 typedef struct _FILE_NAME_INFORMATION {
1995 ULONG FileNameLength;
1997 } FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;
1999 typedef struct _FILE_BASIC_INFORMATION {
2000 LARGE_INTEGER CreationTime;
2001 LARGE_INTEGER LastAccessTime;
2002 LARGE_INTEGER LastWriteTime;
2003 LARGE_INTEGER ChangeTime;
2004 ULONG FileAttributes;
2005 } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
2007 typedef struct _FILE_STANDARD_INFORMATION {
2008 LARGE_INTEGER AllocationSize;
2009 LARGE_INTEGER EndOfFile;
2010 ULONG NumberOfLinks;
2011 BOOLEAN DeletePending;
2013 } FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
2015 typedef struct _FILE_NETWORK_OPEN_INFORMATION {
2016 LARGE_INTEGER CreationTime;
2017 LARGE_INTEGER LastAccessTime;
2018 LARGE_INTEGER LastWriteTime;
2019 LARGE_INTEGER ChangeTime;
2020 LARGE_INTEGER AllocationSize;
2021 LARGE_INTEGER EndOfFile;
2022 ULONG FileAttributes;
2023 } FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;
2025 typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION {
2026 ULONG FileAttributes;
2028 } FILE_ATTRIBUTE_TAG_INFORMATION, *PFILE_ATTRIBUTE_TAG_INFORMATION;
2030 typedef struct _FILE_DISPOSITION_INFORMATION {
2031 BOOLEAN DoDeleteFile;
2032 } FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION;
2034 typedef struct _FILE_END_OF_FILE_INFORMATION {
2035 LARGE_INTEGER EndOfFile;
2036 } FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION;
2038 typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION {
2039 LARGE_INTEGER ValidDataLength;
2040 } FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION;
2042 typedef enum _FSINFOCLASS {
2043 FileFsVolumeInformation = 1,
2044 FileFsLabelInformation,
2045 FileFsSizeInformation,
2046 FileFsDeviceInformation,
2047 FileFsAttributeInformation,
2048 FileFsControlInformation,
2049 FileFsFullSizeInformation,
2050 FileFsObjectIdInformation,
2051 FileFsDriverPathInformation,
2052 FileFsMaximumInformation
2053 } FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
2055 typedef struct _FILE_FS_DEVICE_INFORMATION {
2056 DEVICE_TYPE DeviceType;
2057 ULONG Characteristics;
2058 } FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;
2060 typedef struct _FILE_FULL_EA_INFORMATION {
2061 ULONG NextEntryOffset;
2064 USHORT EaValueLength;
2066 } FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
2068 typedef ULONG_PTR ERESOURCE_THREAD;
2069 typedef ERESOURCE_THREAD *PERESOURCE_THREAD;
2071 typedef struct _OWNER_ENTRY {
2072 ERESOURCE_THREAD OwnerThread;
2073 _ANONYMOUS_UNION union {
2077 } OWNER_ENTRY, *POWNER_ENTRY;
2079 /* ERESOURCE.Flag */
2081 #define ResourceNeverExclusive 0x0010
2082 #define ResourceReleaseByOtherThread 0x0020
2083 #define ResourceOwnedExclusive 0x0080
2085 #define RESOURCE_HASH_TABLE_SIZE 64
2087 typedef struct _ERESOURCE {
2088 LIST_ENTRY SystemResourcesList;
2089 POWNER_ENTRY OwnerTable;
2092 PKSEMAPHORE SharedWaiters;
2093 PKEVENT ExclusiveWaiters;
2094 OWNER_ENTRY OwnerThreads[2];
2095 ULONG ContentionCount;
2096 USHORT NumberOfSharedWaiters;
2097 USHORT NumberOfExclusiveWaiters;
2098 _ANONYMOUS_UNION union {
2100 ULONG_PTR CreatorBackTraceIndex;
2102 KSPIN_LOCK SpinLock;
2103 } ERESOURCE, *PERESOURCE;
2105 /* NOTE: PVOID for methods to avoid 'assignment from incompatible pointer type' warning */
2106 typedef struct _DRIVER_EXTENSION {
2107 struct _DRIVER_OBJECT *DriverObject;
2110 UNICODE_STRING ServiceKeyName;
2111 } DRIVER_EXTENSION, *PDRIVER_EXTENSION;
2113 typedef BOOLEAN DDKAPI
2114 (*PFAST_IO_CHECK_IF_POSSIBLE)(
2115 /*IN*/ struct _FILE_OBJECT *FileObject,
2116 /*IN*/ PLARGE_INTEGER FileOffset,
2117 /*IN*/ ULONG Length,
2118 /*IN*/ BOOLEAN Wait,
2119 /*IN*/ ULONG LockKey,
2120 /*IN*/ BOOLEAN CheckForReadOperation,
2121 /*OUT*/ PIO_STATUS_BLOCK IoStatus,
2122 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2124 typedef BOOLEAN DDKAPI
2126 /*IN*/ struct _FILE_OBJECT *FileObject,
2127 /*IN*/ PLARGE_INTEGER FileOffset,
2128 /*IN*/ ULONG Length,
2129 /*IN*/ BOOLEAN Wait,
2130 /*IN*/ ULONG LockKey,
2131 /*OUT*/ PVOID Buffer,
2132 /*OUT*/ PIO_STATUS_BLOCK IoStatus,
2133 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2135 typedef BOOLEAN DDKAPI
2137 /*IN*/ struct _FILE_OBJECT *FileObject,
2138 /*IN*/ PLARGE_INTEGER FileOffset,
2139 /*IN*/ ULONG Length,
2140 /*IN*/ BOOLEAN Wait,
2141 /*IN*/ ULONG LockKey,
2142 /*IN*/ PVOID Buffer,
2143 /*OUT*/ PIO_STATUS_BLOCK IoStatus,
2144 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2146 typedef BOOLEAN DDKAPI
2147 (*PFAST_IO_QUERY_BASIC_INFO)(
2148 /*IN*/ struct _FILE_OBJECT *FileObject,
2149 /*IN*/ BOOLEAN Wait,
2150 /*OUT*/ PFILE_BASIC_INFORMATION Buffer,
2151 /*OUT*/ PIO_STATUS_BLOCK IoStatus,
2152 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2154 typedef BOOLEAN DDKAPI
2155 (*PFAST_IO_QUERY_STANDARD_INFO)(
2156 /*IN*/ struct _FILE_OBJECT *FileObject,
2157 /*IN*/ BOOLEAN Wait,
2158 /*OUT*/ PFILE_STANDARD_INFORMATION Buffer,
2159 /*OUT*/ PIO_STATUS_BLOCK IoStatus,
2160 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2162 typedef BOOLEAN DDKAPI
2164 /*IN*/ struct _FILE_OBJECT *FileObject,
2165 /*IN*/ PLARGE_INTEGER FileOffset,
2166 /*IN*/ PLARGE_INTEGER Length,
2167 PEPROCESS ProcessId,
2169 BOOLEAN FailImmediately,
2170 BOOLEAN ExclusiveLock,
2171 /*OUT*/ PIO_STATUS_BLOCK IoStatus,
2172 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2174 typedef BOOLEAN DDKAPI
2175 (*PFAST_IO_UNLOCK_SINGLE)(
2176 /*IN*/ struct _FILE_OBJECT *FileObject,
2177 /*IN*/ PLARGE_INTEGER FileOffset,
2178 /*IN*/ PLARGE_INTEGER Length,
2179 PEPROCESS ProcessId,
2181 /*OUT*/ PIO_STATUS_BLOCK IoStatus,
2182 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2184 typedef BOOLEAN DDKAPI
2185 (*PFAST_IO_UNLOCK_ALL)(
2186 /*IN*/ struct _FILE_OBJECT *FileObject,
2187 PEPROCESS ProcessId,
2188 /*OUT*/ PIO_STATUS_BLOCK IoStatus,
2189 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2191 typedef BOOLEAN DDKAPI
2192 (*PFAST_IO_UNLOCK_ALL_BY_KEY)(
2193 /*IN*/ struct _FILE_OBJECT *FileObject,
2196 /*OUT*/ PIO_STATUS_BLOCK IoStatus,
2197 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2199 typedef BOOLEAN DDKAPI
2200 (*PFAST_IO_DEVICE_CONTROL)(
2201 /*IN*/ struct _FILE_OBJECT *FileObject,
2202 /*IN*/ BOOLEAN Wait,
2203 /*IN*/ PVOID InputBuffer /*OPTIONAL*/,
2204 /*IN*/ ULONG InputBufferLength,
2205 /*OUT*/ PVOID OutputBuffer /*OPTIONAL*/,
2206 /*IN*/ ULONG OutputBufferLength,
2207 /*IN*/ ULONG IoControlCode,
2208 /*OUT*/ PIO_STATUS_BLOCK IoStatus,
2209 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2212 (*PFAST_IO_ACQUIRE_FILE)(
2213 /*IN*/ struct _FILE_OBJECT *FileObject);
2216 (*PFAST_IO_RELEASE_FILE)(
2217 /*IN*/ struct _FILE_OBJECT *FileObject);
2220 (*PFAST_IO_DETACH_DEVICE)(
2221 /*IN*/ struct _DEVICE_OBJECT *SourceDevice,
2222 /*IN*/ struct _DEVICE_OBJECT *TargetDevice);
2224 typedef BOOLEAN DDKAPI
2225 (*PFAST_IO_QUERY_NETWORK_OPEN_INFO)(
2226 /*IN*/ struct _FILE_OBJECT *FileObject,
2227 /*IN*/ BOOLEAN Wait,
2228 /*OUT*/ struct _FILE_NETWORK_OPEN_INFORMATION *Buffer,
2229 /*OUT*/ struct _IO_STATUS_BLOCK *IoStatus,
2230 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2232 typedef NTSTATUS DDKAPI
2233 (*PFAST_IO_ACQUIRE_FOR_MOD_WRITE)(
2234 /*IN*/ struct _FILE_OBJECT *FileObject,
2235 /*IN*/ PLARGE_INTEGER EndingOffset,
2236 /*OUT*/ struct _ERESOURCE **ResourceToRelease,
2237 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2239 typedef BOOLEAN DDKAPI
2240 (*PFAST_IO_MDL_READ)(
2241 /*IN*/ struct _FILE_OBJECT *FileObject,
2242 /*IN*/ PLARGE_INTEGER FileOffset,
2243 /*IN*/ ULONG Length,
2244 /*IN*/ ULONG LockKey,
2245 /*OUT*/ PMDL *MdlChain,
2246 /*OUT*/ PIO_STATUS_BLOCK IoStatus,
2247 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2249 typedef BOOLEAN DDKAPI
2250 (*PFAST_IO_MDL_READ_COMPLETE)(
2251 /*IN*/ struct _FILE_OBJECT *FileObject,
2252 /*IN*/ PMDL MdlChain,
2253 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2255 typedef BOOLEAN DDKAPI
2256 (*PFAST_IO_PREPARE_MDL_WRITE)(
2257 /*IN*/ struct _FILE_OBJECT *FileObject,
2258 /*IN*/ PLARGE_INTEGER FileOffset,
2259 /*IN*/ ULONG Length,
2260 /*IN*/ ULONG LockKey,
2261 /*OUT*/ PMDL *MdlChain,
2262 /*OUT*/ PIO_STATUS_BLOCK IoStatus,
2263 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2265 typedef BOOLEAN DDKAPI
2266 (*PFAST_IO_MDL_WRITE_COMPLETE)(
2267 /*IN*/ struct _FILE_OBJECT *FileObject,
2268 /*IN*/ PLARGE_INTEGER FileOffset,
2269 /*IN*/ PMDL MdlChain,
2270 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2272 typedef BOOLEAN DDKAPI
2273 (*PFAST_IO_READ_COMPRESSED)(
2274 /*IN*/ struct _FILE_OBJECT *FileObject,
2275 /*IN*/ PLARGE_INTEGER FileOffset,
2276 /*IN*/ ULONG Length,
2277 /*IN*/ ULONG LockKey,
2278 /*OUT*/ PVOID Buffer,
2279 /*OUT*/ PMDL *MdlChain,
2280 /*OUT*/ PIO_STATUS_BLOCK IoStatus,
2281 /*OUT*/ struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
2282 /*IN*/ ULONG CompressedDataInfoLength,
2283 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2285 typedef BOOLEAN DDKAPI
2286 (*PFAST_IO_WRITE_COMPRESSED)(
2287 /*IN*/ struct _FILE_OBJECT *FileObject,
2288 /*IN*/ PLARGE_INTEGER FileOffset,
2289 /*IN*/ ULONG Length,
2290 /*IN*/ ULONG LockKey,
2291 /*IN*/ PVOID Buffer,
2292 /*OUT*/ PMDL *MdlChain,
2293 /*OUT*/ PIO_STATUS_BLOCK IoStatus,
2294 /*IN*/ struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
2295 /*IN*/ ULONG CompressedDataInfoLength,
2296 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2298 typedef BOOLEAN DDKAPI
2299 (*PFAST_IO_MDL_READ_COMPLETE_COMPRESSED)(
2300 /*IN*/ struct _FILE_OBJECT *FileObject,
2301 /*IN*/ PMDL MdlChain,
2302 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2304 typedef BOOLEAN DDKAPI
2305 (*PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED)(
2306 /*IN*/ struct _FILE_OBJECT *FileObject,
2307 /*IN*/ PLARGE_INTEGER FileOffset,
2308 /*IN*/ PMDL MdlChain,
2309 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2311 typedef BOOLEAN DDKAPI
2312 (*PFAST_IO_QUERY_OPEN)(
2313 /*IN*/ struct _IRP *Irp,
2314 /*OUT*/ PFILE_NETWORK_OPEN_INFORMATION NetworkInformation,
2315 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2317 typedef NTSTATUS DDKAPI
2318 (*PFAST_IO_RELEASE_FOR_MOD_WRITE)(
2319 /*IN*/ struct _FILE_OBJECT *FileObject,
2320 /*IN*/ struct _ERESOURCE *ResourceToRelease,
2321 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2323 typedef NTSTATUS DDKAPI
2324 (*PFAST_IO_ACQUIRE_FOR_CCFLUSH)(
2325 /*IN*/ struct _FILE_OBJECT *FileObject,
2326 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2328 typedef NTSTATUS DDKAPI
2329 (*PFAST_IO_RELEASE_FOR_CCFLUSH) (
2330 /*IN*/ struct _FILE_OBJECT *FileObject,
2331 /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
2333 typedef struct _FAST_IO_DISPATCH {
2334 ULONG SizeOfFastIoDispatch;
2335 PFAST_IO_CHECK_IF_POSSIBLE FastIoCheckIfPossible;
2336 PFAST_IO_READ FastIoRead;
2337 PFAST_IO_WRITE FastIoWrite;
2338 PFAST_IO_QUERY_BASIC_INFO FastIoQueryBasicInfo;
2339 PFAST_IO_QUERY_STANDARD_INFO FastIoQueryStandardInfo;
2340 PFAST_IO_LOCK FastIoLock;
2341 PFAST_IO_UNLOCK_SINGLE FastIoUnlockSingle;
2342 PFAST_IO_UNLOCK_ALL FastIoUnlockAll;
2343 PFAST_IO_UNLOCK_ALL_BY_KEY FastIoUnlockAllByKey;
2344 PFAST_IO_DEVICE_CONTROL FastIoDeviceControl;
2345 PFAST_IO_ACQUIRE_FILE AcquireFileForNtCreateSection;
2346 PFAST_IO_RELEASE_FILE ReleaseFileForNtCreateSection;
2347 PFAST_IO_DETACH_DEVICE FastIoDetachDevice;
2348 PFAST_IO_QUERY_NETWORK_OPEN_INFO FastIoQueryNetworkOpenInfo;
2349 PFAST_IO_ACQUIRE_FOR_MOD_WRITE AcquireForModWrite;
2350 PFAST_IO_MDL_READ MdlRead;
2351 PFAST_IO_MDL_READ_COMPLETE MdlReadComplete;
2352 PFAST_IO_PREPARE_MDL_WRITE PrepareMdlWrite;
2353 PFAST_IO_MDL_WRITE_COMPLETE MdlWriteComplete;
2354 PFAST_IO_READ_COMPRESSED FastIoReadCompressed;
2355 PFAST_IO_WRITE_COMPRESSED FastIoWriteCompressed;
2356 PFAST_IO_MDL_READ_COMPLETE_COMPRESSED MdlReadCompleteCompressed;
2357 PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED MdlWriteCompleteCompressed;
2358 PFAST_IO_QUERY_OPEN FastIoQueryOpen;
2359 PFAST_IO_RELEASE_FOR_MOD_WRITE ReleaseForModWrite;
2360 PFAST_IO_ACQUIRE_FOR_CCFLUSH AcquireForCcFlush;
2361 PFAST_IO_RELEASE_FOR_CCFLUSH ReleaseForCcFlush;
2362 } FAST_IO_DISPATCH, *PFAST_IO_DISPATCH;
2364 typedef struct _DRIVER_OBJECT {
2367 PDEVICE_OBJECT DeviceObject;
2371 PVOID DriverSection;
2372 PDRIVER_EXTENSION DriverExtension;
2373 UNICODE_STRING DriverName;
2374 PUNICODE_STRING HardwareDatabase;
2375 PFAST_IO_DISPATCH FastIoDispatch;
2376 PDRIVER_INITIALIZE DriverInit;
2377 PDRIVER_STARTIO DriverStartIo;
2378 PDRIVER_UNLOAD DriverUnload;
2379 PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
2381 typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT;
2383 typedef struct _SECTION_OBJECT_POINTERS {
2384 PVOID DataSectionObject;
2385 PVOID SharedCacheMap;
2386 PVOID ImageSectionObject;
2387 } SECTION_OBJECT_POINTERS, *PSECTION_OBJECT_POINTERS;
2389 typedef struct _IO_COMPLETION_CONTEXT {
2392 } IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT;
2394 /* FILE_OBJECT.Flags */
2396 #define FO_FILE_OPEN 0x00000001
2397 #define FO_SYNCHRONOUS_IO 0x00000002
2398 #define FO_ALERTABLE_IO 0x00000004
2399 #define FO_NO_INTERMEDIATE_BUFFERING 0x00000008
2400 #define FO_WRITE_THROUGH 0x00000010
2401 #define FO_SEQUENTIAL_ONLY 0x00000020
2402 #define FO_CACHE_SUPPORTED 0x00000040
2403 #define FO_NAMED_PIPE 0x00000080
2404 #define FO_STREAM_FILE 0x00000100
2405 #define FO_MAILSLOT 0x00000200
2406 #define FO_GENERATE_AUDIT_ON_CLOSE 0x00000400
2407 #define FO_DIRECT_DEVICE_OPEN 0x00000800
2408 #define FO_FILE_MODIFIED 0x00001000
2409 #define FO_FILE_SIZE_CHANGED 0x00002000
2410 #define FO_CLEANUP_COMPLETE 0x00004000
2411 #define FO_TEMPORARY_FILE 0x00008000
2412 #define FO_DELETE_ON_CLOSE 0x00010000
2413 #define FO_OPENED_CASE_SENSITIVE 0x00020000
2414 #define FO_HANDLE_CREATED 0x00040000
2415 #define FO_FILE_FAST_IO_READ 0x00080000
2416 #define FO_RANDOM_ACCESS 0x00100000
2417 #define FO_FILE_OPEN_CANCELLED 0x00200000
2418 #define FO_VOLUME_OPEN 0x00400000
2419 #define FO_FILE_OBJECT_HAS_EXTENSION 0x00800000
2420 #define FO_REMOTE_ORIGIN 0x01000000
2422 typedef struct _FILE_OBJECT {
2425 PDEVICE_OBJECT DeviceObject;
2429 PSECTION_OBJECT_POINTERS SectionObjectPointer;
2430 PVOID PrivateCacheMap;
2431 NTSTATUS FinalStatus;
2432 struct _FILE_OBJECT *RelatedFileObject;
2433 BOOLEAN LockOperation;
2434 BOOLEAN DeletePending;
2436 BOOLEAN WriteAccess;
2437 BOOLEAN DeleteAccess;
2439 BOOLEAN SharedWrite;
2440 BOOLEAN SharedDelete;
2442 UNICODE_STRING FileName;
2443 LARGE_INTEGER CurrentByteOffset;
2449 PIO_COMPLETION_CONTEXT CompletionContext;
2451 typedef struct _FILE_OBJECT *PFILE_OBJECT;
2453 typedef enum _SECURITY_OPERATION_CODE {
2454 SetSecurityDescriptor,
2455 QuerySecurityDescriptor,
2456 DeleteSecurityDescriptor,
2457 AssignSecurityDescriptor
2458 } SECURITY_OPERATION_CODE, *PSECURITY_OPERATION_CODE;
2460 #define INITIAL_PRIVILEGE_COUNT 3
2462 typedef struct _INITIAL_PRIVILEGE_SET {
2463 ULONG PrivilegeCount;
2465 LUID_AND_ATTRIBUTES Privilege[INITIAL_PRIVILEGE_COUNT];
2466 } INITIAL_PRIVILEGE_SET, * PINITIAL_PRIVILEGE_SET;
2468 typedef struct _SECURITY_SUBJECT_CONTEXT {
2469 PACCESS_TOKEN ClientToken;
2470 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
2471 PACCESS_TOKEN PrimaryToken;
2472 PVOID ProcessAuditId;
2473 } SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT;
2475 #include <pshpack4.h>
2476 typedef struct _ACCESS_STATE {
2478 BOOLEAN SecurityEvaluated;
2479 BOOLEAN GenerateAudit;
2480 BOOLEAN GenerateOnClose;
2481 BOOLEAN PrivilegesAllocated;
2483 ACCESS_MASK RemainingDesiredAccess;
2484 ACCESS_MASK PreviouslyGrantedAccess;
2485 ACCESS_MASK OriginalDesiredAccess;
2486 SECURITY_SUBJECT_CONTEXT SubjectSecurityContext;
2487 PSECURITY_DESCRIPTOR SecurityDescriptor;
2490 INITIAL_PRIVILEGE_SET InitialPrivilegeSet;
2491 PRIVILEGE_SET PrivilegeSet;
2494 BOOLEAN AuditPrivileges;
2495 UNICODE_STRING ObjectName;
2496 UNICODE_STRING ObjectTypeName;
2497 } ACCESS_STATE, *PACCESS_STATE;
2498 #include <poppack.h>
2500 typedef struct _IO_SECURITY_CONTEXT {
2501 PSECURITY_QUALITY_OF_SERVICE SecurityQos;
2502 PACCESS_STATE AccessState;
2503 ACCESS_MASK DesiredAccess;
2504 ULONG FullCreateOptions;
2505 } IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT;
2509 typedef struct _IO_CSQ_IRP_CONTEXT {
2512 struct _IO_CSQ *Csq;
2513 } IO_CSQ_IRP_CONTEXT, *PIO_CSQ_IRP_CONTEXT;
2516 (*PIO_CSQ_INSERT_IRP)(
2517 /*IN*/ struct _IO_CSQ *Csq,
2521 (*PIO_CSQ_REMOVE_IRP)(
2522 /*IN*/ struct _IO_CSQ *Csq,
2526 (*PIO_CSQ_PEEK_NEXT_IRP)(
2527 /*IN*/ struct _IO_CSQ *Csq,
2529 /*IN*/ PVOID PeekContext);
2532 (*PIO_CSQ_ACQUIRE_LOCK)(
2533 /*IN*/ struct _IO_CSQ *Csq,
2534 /*OUT*/ PKIRQL Irql);
2537 (*PIO_CSQ_RELEASE_LOCK)(
2538 /*IN*/ struct _IO_CSQ *Csq,
2542 (*PIO_CSQ_COMPLETE_CANCELED_IRP)(
2543 /*IN*/ struct _IO_CSQ *Csq,
2546 typedef struct _IO_CSQ {
2548 PIO_CSQ_INSERT_IRP CsqInsertIrp;
2549 PIO_CSQ_REMOVE_IRP CsqRemoveIrp;
2550 PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp;
2551 PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock;
2552 PIO_CSQ_RELEASE_LOCK CsqReleaseLock;
2553 PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp;
2554 PVOID ReservePointer;
2557 #include <pshpack4.h>
2558 typedef struct _IO_STACK_LOCATION {
2559 UCHAR MajorFunction;
2560 UCHAR MinorFunction;
2565 PIO_SECURITY_CONTEXT SecurityContext;
2567 USHORT POINTER_ALIGNMENT FileAttributes;
2569 ULONG POINTER_ALIGNMENT EaLength;
2573 ULONG POINTER_ALIGNMENT Key;
2574 LARGE_INTEGER ByteOffset;
2578 ULONG POINTER_ALIGNMENT Key;
2579 LARGE_INTEGER ByteOffset;
2583 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
2587 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
2588 PFILE_OBJECT FileObject;
2589 _ANONYMOUS_UNION union {
2590 _ANONYMOUS_STRUCT struct {
2591 BOOLEAN ReplaceIfExists;
2592 BOOLEAN AdvanceOnly;
2595 HANDLE DeleteHandle;
2600 FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass;
2603 ULONG OutputBufferLength;
2604 ULONG POINTER_ALIGNMENT InputBufferLength;
2605 ULONG POINTER_ALIGNMENT IoControlCode;
2606 PVOID Type3InputBuffer;
2609 SECURITY_INFORMATION SecurityInformation;
2610 ULONG POINTER_ALIGNMENT Length;
2613 SECURITY_INFORMATION SecurityInformation;
2614 PSECURITY_DESCRIPTOR SecurityDescriptor;
2618 PDEVICE_OBJECT DeviceObject;
2622 PDEVICE_OBJECT DeviceObject;
2625 struct _SCSI_REQUEST_BLOCK *Srb;
2628 DEVICE_RELATION_TYPE Type;
2629 } QueryDeviceRelations;
2631 CONST GUID *InterfaceType;
2634 PINTERFACE Interface;
2635 PVOID InterfaceSpecificData;
2638 PDEVICE_CAPABILITIES Capabilities;
2639 } DeviceCapabilities;
2641 PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList;
2642 } FilterResourceRequirements;
2647 ULONG POINTER_ALIGNMENT Length;
2653 BUS_QUERY_ID_TYPE IdType;
2656 DEVICE_TEXT_TYPE DeviceTextType;
2657 LCID POINTER_ALIGNMENT LocaleId;
2661 BOOLEAN Reserved[3];
2662 DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type;
2663 } UsageNotification;
2665 SYSTEM_POWER_STATE PowerState;
2668 PPOWER_SEQUENCE PowerSequence;
2671 ULONG SystemContext;
2672 POWER_STATE_TYPE POINTER_ALIGNMENT Type;
2673 POWER_STATE POINTER_ALIGNMENT State;
2674 POWER_ACTION POINTER_ALIGNMENT ShutdownType;
2677 PCM_RESOURCE_LIST AllocatedResources;
2678 PCM_RESOURCE_LIST AllocatedResourcesTranslated;
2681 ULONG_PTR ProviderId;
2693 PDEVICE_OBJECT DeviceObject;
2694 PFILE_OBJECT FileObject;
2695 PIO_COMPLETION_ROUTINE CompletionRoutine;
2697 } IO_STACK_LOCATION, *PIO_STACK_LOCATION;
2698 #include <poppack.h>
2700 /* IO_STACK_LOCATION.Control */
2702 #define SL_PENDING_RETURNED 0x01
2703 #define SL_INVOKE_ON_CANCEL 0x20
2704 #define SL_INVOKE_ON_SUCCESS 0x40
2705 #define SL_INVOKE_ON_ERROR 0x80
2707 typedef enum _KEY_INFORMATION_CLASS {
2708 KeyBasicInformation,
2712 KeyCachedInformation,
2714 } KEY_INFORMATION_CLASS;
2716 typedef struct _KEY_BASIC_INFORMATION {
2717 LARGE_INTEGER LastWriteTime;
2721 } KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION;
2723 typedef struct _KEY_FULL_INFORMATION {
2724 LARGE_INTEGER LastWriteTime;
2732 ULONG MaxValueNameLen;
2733 ULONG MaxValueDataLen;
2735 } KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION;
2737 typedef struct _KEY_NODE_INFORMATION {
2738 LARGE_INTEGER LastWriteTime;
2744 } KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION;
2746 typedef struct _KEY_VALUE_BASIC_INFORMATION {
2751 } KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION;
2753 typedef struct _KEY_VALUE_FULL_INFORMATION {
2760 } KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION;
2762 typedef struct _KEY_VALUE_PARTIAL_INFORMATION {
2767 } KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION;
2769 typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 {
2773 } KEY_VALUE_PARTIAL_INFORMATION_ALIGN64, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64;
2775 typedef struct _KEY_VALUE_ENTRY {
2776 PUNICODE_STRING ValueName;
2780 } KEY_VALUE_ENTRY, *PKEY_VALUE_ENTRY;
2782 typedef enum _KEY_VALUE_INFORMATION_CLASS {
2783 KeyValueBasicInformation,
2784 KeyValueFullInformation,
2785 KeyValuePartialInformation,
2786 KeyValueFullInformationAlign64,
2787 KeyValuePartialInformationAlign64
2788 } KEY_VALUE_INFORMATION_CLASS;
2790 /* KEY_VALUE_Xxx.Type */
2794 #define REG_EXPAND_SZ 2
2795 #define REG_BINARY 3
2797 #define REG_DWORD_LITTLE_ENDIAN 4
2798 #define REG_DWORD_BIG_ENDIAN 5
2800 #define REG_MULTI_SZ 7
2801 #define REG_RESOURCE_LIST 8
2802 #define REG_FULL_RESOURCE_DESCRIPTOR 9
2803 #define REG_RESOURCE_REQUIREMENTS_LIST 10
2804 #define REG_QWORD 11
2805 #define REG_QWORD_LITTLE_ENDIAN 11
2807 #define PCI_TYPE0_ADDRESSES 6
2808 #define PCI_TYPE1_ADDRESSES 2
2809 #define PCI_TYPE2_ADDRESSES 5
2811 typedef struct _PCI_COMMON_CONFIG {
2820 UCHAR CacheLineSize;
2825 struct _PCI_HEADER_TYPE_0 {
2826 ULONG BaseAddresses[PCI_TYPE0_ADDRESSES];
2830 ULONG ROMBaseAddress;
2831 UCHAR CapabilitiesPtr;
2834 UCHAR InterruptLine;
2837 UCHAR MaximumLatency;
2839 struct _PCI_HEADER_TYPE_1 {
2840 ULONG BaseAddresses[PCI_TYPE1_ADDRESSES];
2843 UCHAR SubordinateBus;
2844 UCHAR SecondaryLatency;
2847 USHORT SecondaryStatus;
2850 USHORT PrefetchBase;
2851 USHORT PrefetchLimit;
2852 ULONG PrefetchBaseUpper32;
2853 ULONG PrefetchLimitUpper32;
2854 USHORT IOBaseUpper16;
2855 USHORT IOLimitUpper16;
2856 UCHAR CapabilitiesPtr;
2858 ULONG ROMBaseAddress;
2859 UCHAR InterruptLine;
2861 USHORT BridgeControl;
2863 struct _PCI_HEADER_TYPE_2 {
2864 ULONG SocketRegistersBaseAddress;
2865 UCHAR CapabilitiesPtr;
2867 USHORT SecondaryStatus;
2870 UCHAR SubordinateBus;
2871 UCHAR SecondaryLatency;
2875 } Range[PCI_TYPE2_ADDRESSES - 1];
2876 UCHAR InterruptLine;
2878 USHORT BridgeControl;
2881 UCHAR DeviceSpecific[192];
2882 } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
2884 /* PCI_COMMON_CONFIG.Command */
2886 #define PCI_ENABLE_IO_SPACE 0x0001
2887 #define PCI_ENABLE_MEMORY_SPACE 0x0002
2888 #define PCI_ENABLE_BUS_MASTER 0x0004
2889 #define PCI_ENABLE_SPECIAL_CYCLES 0x0008
2890 #define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010
2891 #define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
2892 #define PCI_ENABLE_PARITY 0x0040
2893 #define PCI_ENABLE_WAIT_CYCLE 0x0080
2894 #define PCI_ENABLE_SERR 0x0100
2895 #define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200
2897 /* PCI_COMMON_CONFIG.Status */
2899 #define PCI_STATUS_CAPABILITIES_LIST 0x0010
2900 #define PCI_STATUS_66MHZ_CAPABLE 0x0020
2901 #define PCI_STATUS_UDF_SUPPORTED 0x0040
2902 #define PCI_STATUS_FAST_BACK_TO_BACK 0x0080
2903 #define PCI_STATUS_DATA_PARITY_DETECTED 0x0100
2904 #define PCI_STATUS_DEVSEL 0x0600
2905 #define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800
2906 #define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000
2907 #define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000
2908 #define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000
2909 #define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000
2911 /* PCI_COMMON_CONFIG.HeaderType */
2913 #define PCI_MULTIFUNCTION 0x80
2914 #define PCI_DEVICE_TYPE 0x00
2915 #define PCI_BRIDGE_TYPE 0x01
2916 #define PCI_CARDBUS_BRIDGE_TYPE 0x02
2918 #define PCI_CONFIGURATION_TYPE(PciData) \
2919 (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
2921 #define PCI_MULTIFUNCTION_DEVICE(PciData) \
2922 ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
2924 typedef struct _PCI_SLOT_NUMBER {
2927 ULONG DeviceNumber : 5;
2928 ULONG FunctionNumber : 3;
2929 ULONG Reserved : 24;
2933 } PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER;
2935 typedef enum _POOL_TYPE {
2938 NonPagedPoolMustSucceed,
2940 NonPagedPoolCacheAligned,
2941 PagedPoolCacheAligned,
2942 NonPagedPoolCacheAlignedMustS,
2944 NonPagedPoolSession = 32,
2946 NonPagedPoolMustSucceedSession,
2947 DontUseThisTypeSession,
2948 NonPagedPoolCacheAlignedSession,
2949 PagedPoolCacheAlignedSession,
2950 NonPagedPoolCacheAlignedMustSSession
2953 typedef enum _EX_POOL_PRIORITY {
2955 LowPoolPrioritySpecialPoolOverrun = 8,
2956 LowPoolPrioritySpecialPoolUnderrun = 9,
2957 NormalPoolPriority = 16,
2958 NormalPoolPrioritySpecialPoolOverrun = 24,
2959 NormalPoolPrioritySpecialPoolUnderrun = 25,
2960 HighPoolPriority = 32,
2961 HighPoolPrioritySpecialPoolOverrun = 40,
2962 HighPoolPrioritySpecialPoolUnderrun = 41
2965 /* PRIVILEGE_SET.Control */
2967 #define PRIVILEGE_SET_ALL_NECESSARY 1
2969 typedef struct _RTL_OSVERSIONINFOW {
2970 ULONG dwOSVersionInfoSize;
2971 ULONG dwMajorVersion;
2972 ULONG dwMinorVersion;
2973 ULONG dwBuildNumber;
2975 WCHAR szCSDVersion[128];
2976 } RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW;
2978 typedef struct _RTL_OSVERSIONINFOEXW {
2979 ULONG dwOSVersionInfoSize;
2980 ULONG dwMajorVersion;
2981 ULONG dwMinorVersion;
2982 ULONG dwBuildNumber;
2984 WCHAR szCSDVersion[128];
2985 USHORT wServicePackMajor;
2986 USHORT wServicePackMinor;
2990 } RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW;
2995 VerSetConditionMask(
2996 /*IN*/ ULONGLONG ConditionMask,
2997 /*IN*/ ULONG TypeMask,
2998 /*IN*/ UCHAR Condition);
3000 #define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType) \
3001 ((ConditionMask) = VerSetConditionMask((ConditionMask), \
3002 (TypeBitMask), (ComparisonType)))
3004 /* RtlVerifyVersionInfo() TypeMask */
3006 #define VER_MINORVERSION 0x0000001
3007 #define VER_MAJORVERSION 0x0000002
3008 #define VER_BUILDNUMBER 0x0000004
3009 #define VER_PLATFORMID 0x0000008
3010 #define VER_SERVICEPACKMINOR 0x0000010
3011 #define VER_SERVICEPACKMAJOR 0x0000020
3012 #define VER_SUITENAME 0x0000040
3013 #define VER_PRODUCT_TYPE 0x0000080
3015 /* RtlVerifyVersionInfo() ComparisonType */
3018 #define VER_GREATER 2
3019 #define VER_GREATER_EQUAL 3
3021 #define VER_LESS_EQUAL 5
3025 #define VER_CONDITION_MASK 7
3026 #define VER_NUM_BITS_PER_CONDITION_MASK 3
3028 typedef struct _RTL_BITMAP {
3031 } RTL_BITMAP, *PRTL_BITMAP;
3033 typedef struct _RTL_BITMAP_RUN {
3034 ULONG StartingIndex;
3036 } RTL_BITMAP_RUN, *PRTL_BITMAP_RUN;
3038 typedef NTSTATUS DDKAPI
3039 (*PRTL_QUERY_REGISTRY_ROUTINE)(
3040 /*IN*/ PWSTR ValueName,
3041 /*IN*/ ULONG ValueType,
3042 /*IN*/ PVOID ValueData,
3043 /*IN*/ ULONG ValueLength,
3044 /*IN*/ PVOID Context,
3045 /*IN*/ PVOID EntryContext);
3047 #define RTL_REGISTRY_ABSOLUTE 0
3048 #define RTL_REGISTRY_SERVICES 1
3049 #define RTL_REGISTRY_CONTROL 2
3050 #define RTL_REGISTRY_WINDOWS_NT 3
3051 #define RTL_REGISTRY_DEVICEMAP 4
3052 #define RTL_REGISTRY_USER 5
3054 /* RTL_QUERY_REGISTRY_TABLE.Flags */
3055 #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001
3056 #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002
3057 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004
3058 #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008
3059 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010
3060 #define RTL_QUERY_REGISTRY_DIRECT 0x00000020
3061 #define RTL_QUERY_REGISTRY_DELETE 0x00000040
3063 typedef struct _RTL_QUERY_REGISTRY_TABLE {
3064 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine;
3070 ULONG DefaultLength;
3071 } RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE;
3073 typedef struct _TIME_FIELDS {
3080 CSHORT Milliseconds;
3082 } TIME_FIELDS, *PTIME_FIELDS;
3084 typedef PVOID DDKAPI
3085 (*PALLOCATE_FUNCTION)(
3086 /*IN*/ POOL_TYPE PoolType,
3087 /*IN*/ SIZE_T NumberOfBytes,
3092 /*IN*/ PVOID Buffer);
3094 #define GENERAL_LOOKASIDE_S \
3095 SLIST_HEADER ListHead; \
3097 USHORT MaximumDepth; \
3098 ULONG TotalAllocates; \
3099 _ANONYMOUS_UNION union { \
3100 ULONG AllocateMisses; \
3101 ULONG AllocateHits; \
3104 _ANONYMOUS_UNION union { \
3107 } DUMMYUNIONNAME2; \
3111 PALLOCATE_FUNCTION Allocate; \
3112 PFREE_FUNCTION Free; \
3113 LIST_ENTRY ListEntry; \
3114 ULONG LastTotalAllocates; \
3115 _ANONYMOUS_UNION union { \
3116 ULONG LastAllocateMisses; \
3117 ULONG LastAllocateHits; \
3118 } DUMMYUNIONNAME3; \
3121 typedef struct _GENERAL_LOOKASIDE {
3123 } GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE;
3125 typedef struct _NPAGED_LOOKASIDE_LIST {
3127 KSPIN_LOCK Obsoleted;
3128 } NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST;
3130 typedef struct _PAGED_LOOKASIDE_LIST {
3132 FAST_MUTEX Obsoleted;
3133 } PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST;
3135 typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT;
3137 typedef VOID DDKAPI (*PCALLBACK_FUNCTION)(
3138 /*IN*/ PVOID CallbackContext,
3139 /*IN*/ PVOID Argument1,
3140 /*IN*/ PVOID Argument2);
3142 typedef enum _EVENT_TYPE {
3144 SynchronizationEvent
3147 typedef enum _KWAIT_REASON {
3178 typedef struct _KWAIT_BLOCK {
3179 LIST_ENTRY WaitListEntry;
3180 struct _KTHREAD * RESTRICTED_POINTER Thread;
3182 struct _KWAIT_BLOCK * RESTRICTED_POINTER NextWaitBlock;
3185 } KWAIT_BLOCK, *PKWAIT_BLOCK, *RESTRICTED_POINTER PRKWAIT_BLOCK;
3187 typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK;
3189 typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK {
3191 BOOLEAN Reserved[3];
3194 } IO_REMOVE_LOCK_COMMON_BLOCK;
3196 typedef struct _IO_REMOVE_LOCK_DBG_BLOCK {
3199 LONGLONG MaxLockedTicks;
3201 LIST_ENTRY LockList;
3203 LONG LowMemoryCount;
3206 PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks;
3207 } IO_REMOVE_LOCK_DBG_BLOCK;
3209 typedef struct _IO_REMOVE_LOCK {
3210 IO_REMOVE_LOCK_COMMON_BLOCK Common;
3212 IO_REMOVE_LOCK_DBG_BLOCK Dbg;
3214 } IO_REMOVE_LOCK, *PIO_REMOVE_LOCK;
3216 typedef struct _IO_WORKITEM *PIO_WORKITEM;
3219 (*PIO_WORKITEM_ROUTINE)(
3220 /*IN*/ PDEVICE_OBJECT DeviceObject,
3221 /*IN*/ PVOID Context);
3223 typedef struct _SHARE_ACCESS {
3231 } SHARE_ACCESS, *PSHARE_ACCESS;
3233 typedef enum _KINTERRUPT_MODE {
3239 (*PKINTERRUPT_ROUTINE)(
3242 typedef enum _KPROFILE_SOURCE {
3244 ProfileAlignmentFixup,
3247 ProfileLoadInstructions,
3248 ProfilePipelineFrozen,
3249 ProfileBranchInstructions,
3250 ProfileTotalNonissues,
3251 ProfileDcacheMisses,
3252 ProfileIcacheMisses,
3254 ProfileBranchMispredictions,
3255 ProfileStoreInstructions,
3256 ProfileFpInstructions,
3257 ProfileIntegerInstructions,
3261 ProfileSpecialInstructions,
3263 ProfileIcacheIssues,
3264 ProfileDcacheAccesses,
3265 ProfileMemoryBarrierCycles,
3266 ProfileLoadLinkedIssues,
3270 typedef enum _CREATE_FILE_TYPE {
3272 CreateFileTypeNamedPipe,
3273 CreateFileTypeMailslot
3276 typedef struct _CONFIGURATION_INFORMATION {
3281 ULONG ScsiPortCount;
3283 ULONG ParallelCount;
3284 BOOLEAN AtDiskPrimaryAddressClaimed;
3285 BOOLEAN AtDiskSecondaryAddressClaimed;
3287 ULONG MediumChangerCount;
3288 } CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION;
3290 typedef enum _CONFIGURATION_TYPE {
3293 FloatingPointProcessor,
3303 MultiFunctionAdapter,
3317 FloppyDiskPeripheral,
3330 RealModeIrqRoutingTable,
3332 } CONFIGURATION_TYPE, *PCONFIGURATION_TYPE;
3334 typedef NTSTATUS (*PIO_QUERY_DEVICE_ROUTINE)(
3335 /*IN*/ PVOID Context,
3336 /*IN*/ PUNICODE_STRING PathName,
3337 /*IN*/ INTERFACE_TYPE BusType,
3338 /*IN*/ ULONG BusNumber,
3339 /*IN*/ PKEY_VALUE_FULL_INFORMATION *BusInformation,
3340 /*IN*/ CONFIGURATION_TYPE ControllerType,
3341 /*IN*/ ULONG ControllerNumber,
3342 /*IN*/ PKEY_VALUE_FULL_INFORMATION *ControllerInformation,
3343 /*IN*/ CONFIGURATION_TYPE PeripheralType,
3344 /*IN*/ ULONG PeripheralNumber,
3345 /*IN*/ PKEY_VALUE_FULL_INFORMATION *PeripheralInformation);
3347 typedef enum _WORK_QUEUE_TYPE {
3350 HyperCriticalWorkQueue,
3355 (*PWORKER_THREAD_ROUTINE)(
3356 /*IN*/ PVOID Parameter);
3358 typedef struct _WORK_QUEUE_ITEM {
3360 PWORKER_THREAD_ROUTINE WorkerRoutine;
3362 } WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;
3364 typedef enum _KBUGCHECK_BUFFER_DUMP_STATE {
3370 } KBUGCHECK_BUFFER_DUMP_STATE;
3373 (*PKBUGCHECK_CALLBACK_ROUTINE)(
3374 /*IN*/ PVOID Buffer,
3375 /*IN*/ ULONG Length);
3377 typedef struct _KBUGCHECK_CALLBACK_RECORD {
3379 PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine;
3385 } KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD;
3389 * KeInitializeCallbackRecord(
3390 * IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord)
3392 #define KeInitializeCallbackRecord(CallbackRecord) \
3393 CallbackRecord->State = BufferEmpty;
3395 typedef enum _KDPC_IMPORTANCE {
3401 typedef enum _MEMORY_CACHING_TYPE_ORIG {
3402 MmFrameBufferCached = 2
3403 } MEMORY_CACHING_TYPE_ORIG;
3405 typedef enum _MEMORY_CACHING_TYPE {
3406 MmNonCached = FALSE,
3408 MmWriteCombined = MmFrameBufferCached,
3409 MmHardwareCoherentCached,
3410 MmNonCachedUnordered,
3413 } MEMORY_CACHING_TYPE;
3415 typedef enum _MM_PAGE_PRIORITY {
3417 NormalPagePriority = 16,
3418 HighPagePriority = 32
3421 typedef enum _LOCK_OPERATION {
3427 typedef enum _MM_SYSTEM_SIZE {
3433 typedef struct _OBJECT_HANDLE_INFORMATION {
3434 ULONG HandleAttributes;
3435 ACCESS_MASK GrantedAccess;
3436 } OBJECT_HANDLE_INFORMATION, *POBJECT_HANDLE_INFORMATION;
3438 typedef struct _CLIENT_ID {
3439 HANDLE UniqueProcess;
3440 HANDLE UniqueThread;
3441 } CLIENT_ID, *PCLIENT_ID;
3445 /*IN*/ PVOID StartContext);
3448 (*PCREATE_PROCESS_NOTIFY_ROUTINE)(
3449 /*IN*/ HANDLE ParentId,
3450 /*IN*/ HANDLE ProcessId,
3451 /*IN*/ BOOLEAN Create);
3454 (*PCREATE_THREAD_NOTIFY_ROUTINE)(
3455 /*IN*/ HANDLE ProcessId,
3456 /*IN*/ HANDLE ThreadId,
3457 /*IN*/ BOOLEAN Create);
3459 typedef struct _IMAGE_INFO {
3460 _ANONYMOUS_UNION union {
3462 _ANONYMOUS_STRUCT struct {
3463 ULONG ImageAddressingMode : 8;
3464 ULONG SystemModeImage : 1;
3465 ULONG ImageMappedToAllPids : 1;
3466 ULONG Reserved : 22;
3470 ULONG ImageSelector;
3472 ULONG ImageSectionNumber;
3473 } IMAGE_INFO, *PIMAGE_INFO;
3475 #define IMAGE_ADDRESSING_MODE_32BIT 3
3478 (*PLOAD_IMAGE_NOTIFY_ROUTINE)(
3479 /*IN*/ PUNICODE_STRING FullImageName,
3480 /*IN*/ HANDLE ProcessId,
3481 /*IN*/ PIMAGE_INFO ImageInfo);
3483 typedef enum _PROCESSINFOCLASS {
3484 ProcessBasicInformation,
3489 ProcessBasePriority,
3490 ProcessRaisePriority,
3492 ProcessExceptionPort,
3494 ProcessLdtInformation,
3496 ProcessDefaultHardErrorMode,
3497 ProcessIoPortHandlers,
3498 ProcessPooledUsageAndLimits,
3499 ProcessWorkingSetWatch,
3500 ProcessUserModeIOPL,
3501 ProcessEnableAlignmentFaultFixup,
3502 ProcessPriorityClass,
3503 ProcessWx86Information,
3505 ProcessAffinityMask,
3506 ProcessPriorityBoost,
3508 ProcessSessionInformation,
3509 ProcessForegroundInformation,
3510 ProcessWow64Information,
3511 ProcessImageFileName,
3512 ProcessLUIDDeviceMapsEnabled,
3513 ProcessBreakOnTermination,
3514 ProcessDebugObjectHandle,
3516 ProcessHandleTracing,
3520 typedef enum _THREADINFOCLASS {
3521 ThreadBasicInformation,
3526 ThreadImpersonationToken,
3527 ThreadDescriptorTableEntry,
3528 ThreadEnableAlignmentFaultFixup,
3529 ThreadEventPair_Reusable,
3530 ThreadQuerySetWin32StartAddress,
3532 ThreadPerformanceCount,
3533 ThreadAmILastThread,
3534 ThreadIdealProcessor,
3535 ThreadPriorityBoost,
3536 ThreadSetTlsArrayAddress,
3538 ThreadHideFromDebugger,
3539 ThreadBreakOnTermination,
3543 #define ES_SYSTEM_REQUIRED 0x00000001
3544 #define ES_DISPLAY_REQUIRED 0x00000002
3545 #define ES_USER_PRESENT 0x00000004
3546 #define ES_CONTINUOUS 0x80000000
3548 typedef ULONG EXECUTION_STATE;
3551 (*PREQUEST_POWER_COMPLETE)(
3552 /*IN*/ PDEVICE_OBJECT DeviceObject,
3553 /*IN*/ UCHAR MinorFunction,
3554 /*IN*/ POWER_STATE PowerState,
3555 /*IN*/ PVOID Context,
3556 /*IN*/ PIO_STATUS_BLOCK IoStatus);
3558 typedef enum _TRACE_INFORMATION_CLASS {
3561 TraceEnableFlagsClass,
3562 TraceEnableLevelClass,
3563 GlobalLoggerHandleClass,
3564 EventLoggerHandleClass,
3565 AllLoggerHandlesClass,
3566 TraceHandleByNameClass
3567 } TRACE_INFORMATION_CLASS;
3569 typedef NTSTATUS DDKAPI
3570 (*PEX_CALLBACK_FUNCTION)(
3571 /*IN*/ PVOID CallbackContext,
3572 /*IN*/ PVOID Argument1,
3573 /*IN*/ PVOID Argument2);
3578 ** Storage structures
3580 typedef enum _PARTITION_STYLE {
3581 PARTITION_STYLE_MBR,
3585 typedef struct _CREATE_DISK_MBR {
3587 } CREATE_DISK_MBR, *PCREATE_DISK_MBR;
3589 typedef struct _CREATE_DISK_GPT {
3591 ULONG MaxPartitionCount;
3592 } CREATE_DISK_GPT, *PCREATE_DISK_GPT;
3594 typedef struct _CREATE_DISK {
3595 PARTITION_STYLE PartitionStyle;
3596 _ANONYMOUS_UNION union {
3597 CREATE_DISK_MBR Mbr;
3598 CREATE_DISK_GPT Gpt;
3600 } CREATE_DISK, *PCREATE_DISK;
3602 typedef struct _DISK_SIGNATURE {
3603 ULONG PartitionStyle;
3604 _ANONYMOUS_UNION union {
3613 } DISK_SIGNATURE, *PDISK_SIGNATURE;
3615 typedef VOID DDKFASTAPI
3616 (*PTIME_UPDATE_NOTIFY_ROUTINE)(
3617 /*IN*/ HANDLE ThreadId,
3618 /*IN*/ KPROCESSOR_MODE Mode);
3620 #define DBG_STATUS_CONTROL_C 1
3621 #define DBG_STATUS_SYSRQ 2
3622 #define DBG_STATUS_BUGCHECK_FIRST 3
3623 #define DBG_STATUS_BUGCHECK_SECOND 4
3624 #define DBG_STATUS_FATAL 5
3625 #define DBG_STATUS_DEBUG_CONTROL 6
3626 #define DBG_STATUS_WORKER 7
3628 typedef struct _PHYSICAL_MEMORY_RANGE {
3629 PHYSICAL_ADDRESS BaseAddress;
3630 LARGE_INTEGER NumberOfBytes;
3631 } PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE;
3634 (*PDRIVER_VERIFIER_THUNK_ROUTINE)(
3635 /*IN*/ PVOID Context);
3637 typedef struct _DRIVER_VERIFIER_THUNK_PAIRS {
3638 PDRIVER_VERIFIER_THUNK_ROUTINE PristineRoutine;
3639 PDRIVER_VERIFIER_THUNK_ROUTINE NewRoutine;
3640 } DRIVER_VERIFIER_THUNK_PAIRS, *PDRIVER_VERIFIER_THUNK_PAIRS;
3642 #define DRIVER_VERIFIER_SPECIAL_POOLING 0x0001
3643 #define DRIVER_VERIFIER_FORCE_IRQL_CHECKING 0x0002
3644 #define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES 0x0004
3645 #define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS 0x0008
3646 #define DRIVER_VERIFIER_IO_CHECKING 0x0010
3648 #define RTL_RANGE_LIST_ADD_IF_CONFLICT 0x00000001
3649 #define RTL_RANGE_LIST_ADD_SHARED 0x00000002
3651 #define RTL_RANGE_LIST_SHARED_OK 0x00000001
3652 #define RTL_RANGE_LIST_NULL_CONFLICT_OK 0x00000002
3654 #define RTL_RANGE_LIST_SHARED_OK 0x00000001
3655 #define RTL_RANGE_LIST_NULL_CONFLICT_OK 0x00000002
3657 #define RTL_RANGE_LIST_MERGE_IF_CONFLICT RTL_RANGE_LIST_ADD_IF_CONFLICT
3659 typedef struct _RTL_RANGE {
3666 } RTL_RANGE, *PRTL_RANGE;
3668 #define RTL_RANGE_SHARED 0x01
3669 #define RTL_RANGE_CONFLICT 0x02
3671 typedef struct _RTL_RANGE_LIST {
3672 LIST_ENTRY ListHead;
3676 } RTL_RANGE_LIST, *PRTL_RANGE_LIST;
3678 typedef struct _RANGE_LIST_ITERATOR {
3679 PLIST_ENTRY RangeListHead;
3680 PLIST_ENTRY MergedHead;
3683 } RTL_RANGE_LIST_ITERATOR, *PRTL_RANGE_LIST_ITERATOR;
3686 (*PRTL_CONFLICT_RANGE_CALLBACK)(
3687 /*IN*/ PVOID Context,
3688 /*IN*/ PRTL_RANGE Range);
3690 #define HASH_STRING_ALGORITHM_DEFAULT 0
3691 #define HASH_STRING_ALGORITHM_X65599 1
3692 #define HASH_STRING_ALGORITHM_INVALID 0xffffffff
3694 typedef enum _SUITE_TYPE {
3698 CommunicationServer,
3700 SmallBusinessRestricted,
3710 (*PTIMER_APC_ROUTINE)(
3711 /*IN*/ PVOID TimerContext,
3712 /*IN*/ ULONG TimerLowValue,
3713 /*IN*/ LONG TimerHighValue);
3722 (*WMI_NOTIFICATION_CALLBACK)(
3728 ** Architecture specific structures
3733 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
3735 #define PASSIVE_LEVEL 0
3738 #define DISPATCH_LEVEL 2
3739 #define SYNCH_LEVEL 27
3740 #define PROFILE_LEVEL 27
3741 #define CLOCK1_LEVEL 28
3742 #define CLOCK2_LEVEL 28
3743 #define IPI_LEVEL 29
3744 #define POWER_LEVEL 30
3745 #define HIGH_LEVEL 31
3747 typedef struct _KPCR_TIB {
3748 PVOID ExceptionList; /* 00 */
3749 PVOID StackBase; /* 04 */
3750 PVOID StackLimit; /* 08 */
3751 PVOID SubSystemTib; /* 0C */
3752 _ANONYMOUS_UNION union {
3753 PVOID FiberData; /* 10 */
3754 DWORD Version; /* 10 */
3756 PVOID ArbitraryUserPointer; /* 14 */
3757 struct _NT_TIB *Self; /* 18 */
3758 } KPCR_TIB, *PKPCR_TIB; /* 1C */
3760 #define PCR_MINOR_VERSION 1
3761 #define PCR_MAJOR_VERSION 1
3763 typedef struct _KPCR {
3764 KPCR_TIB Tib; /* 00 */
3765 struct _KPCR *Self; /* 1C */
3766 struct _KPRCB *PCRCB; /* 20 */
3767 KIRQL Irql; /* 24 */
3769 ULONG IrrActive; /* 2C */
3771 PVOID KdVersionBlock; /* 34 */
3772 PUSHORT IDT; /* 38 */
3773 PUSHORT GDT; /* 3C */
3774 struct _KTSS *TSS; /* 40 */
3775 USHORT MajorVersion; /* 44 */
3776 USHORT MinorVersion; /* 46 */
3777 KAFFINITY SetMember; /* 48 */
3778 ULONG StallScaleFactor; /* 4C */
3779 UCHAR SpareUnused; /* 50 */
3780 UCHAR Number; /* 51 */
3781 } KPCR, *PKPCR; /* 54 */
3783 typedef struct _KFLOATING_SAVE {
3787 ULONG ErrorSelector;
3792 } KFLOATING_SAVE, *PKFLOATING_SAVE;
3794 #define PAGE_SIZE 0x1000
3795 #define PAGE_SHIFT 12L
3797 extern NTOSAPI PVOID *MmHighestUserAddress;
3798 extern NTOSAPI PVOID *MmSystemRangeStart;
3799 extern NTOSAPI ULONG *MmUserProbeAddress;
3801 #define MM_HIGHEST_USER_ADDRESS *MmHighestUserAddress
3802 #define MM_SYSTEM_RANGE_START *MmSystemRangeStart
3803 #define MM_USER_PROBE_ADDRESS *MmUserProbeAddress
3804 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
3805 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000
3807 #define KI_USER_SHARED_DATA 0xffdf0000
3808 #define SharedUserData ((KUSER_SHARED_DATA * CONST) KI_USER_SHARED_DATA)
3810 #define EFLAG_SIGN 0x8000
3811 #define EFLAG_ZERO 0x4000
3812 #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
3814 #define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
3815 #define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
3816 #define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
3818 typedef enum _INTERLOCKED_RESULT {
3819 ResultNegative = RESULT_NEGATIVE,
3820 ResultZero = RESULT_ZERO,
3821 ResultPositive = RESULT_POSITIVE
3822 } INTERLOCKED_RESULT;
3832 * KeGetCurrentProcessorNumber(
3835 #define KeGetCurrentProcessorNumber() \
3836 ((ULONG)KeGetCurrentKPCR()->Number)
3839 #if __USE_NTOSKRNL__
3840 /* CAREFUL: These are exported from ntoskrnl.exe as __fastcall functions,
3841 but are also exported from kernel32.dll and declared in winbase.h as
3843 #if !defined(__INTERLOCKED_DECLARED)
3844 #define __INTERLOCKED_DECLARED
3849 InterlockedIncrement(
3850 /*IN*/ LONG VOLATILE *Addend);
3855 InterlockedDecrement(
3856 /*IN*/ LONG VOLATILE *Addend);
3861 InterlockedCompareExchange(
3862 /*IN OUT*/ PLONG VOLATILE Destination,
3863 /*IN*/ LONG Exchange,
3864 /*IN*/ LONG Comparand);
3869 InterlockedExchange(
3870 /*IN OUT*/ PLONG VOLATILE Target,
3876 InterlockedExchangeAdd(
3877 /*IN OUT*/ PLONG VOLATILE Addend,
3882 * InterlockedExchangePointer(
3883 * IN OUT PVOID VOLATILE *Target,
3886 #define InterlockedExchangePointer(Target, Value) \
3887 ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
3891 * InterlockedCompareExchangePointer(
3892 * IN OUT PVOID *Destination,
3893 * IN PVOID Exchange,
3894 * IN PVOID Comparand)
3896 #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
3897 ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
3899 #if (_WIN32_WINNT >= 0x0501)
3902 InterlockedPopEntrySList(
3903 /*IN*/ PSLIST_HEADER ListHead);
3908 InterlockedPushEntrySList(
3909 /*IN*/ PSLIST_HEADER ListHead,
3910 /*IN*/ PSLIST_ENTRY ListEntry);
3911 #endif /* _WIN32_WINNT >= 0x0501 */
3913 #endif /* !__INTERLOCKED_DECLARED */
3914 #endif /* __USE_NTOSKRNL__ */
3919 KefAcquireSpinLockAtDpcLevel(
3920 /*IN*/ PKSPIN_LOCK SpinLock);
3925 KefReleaseSpinLockFromDpcLevel(
3926 /*IN*/ PKSPIN_LOCK SpinLock);
3928 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
3929 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
3931 #define RtlCopyMemoryNonTemporal RtlCopyMemory
3933 #define KeGetDcacheFillSize() 1L
3940 ** Utillity functions
3943 #define ARGUMENT_PRESENT(ArgumentPointer) \
3944 ((BOOLEAN) ((PVOID)ArgumentPointer != (PVOID)NULL))
3951 #define BYTE_OFFSET(Va) \
3952 ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
3959 #define BYTES_TO_PAGES(Size) \
3960 ((ULONG) ((ULONG_PTR) (Size) >> PAGE_SHIFT) + (((ULONG) (Size) & (PAGE_SIZE - 1)) != 0))
3964 * CONTAINING_RECORD(
3969 #ifndef CONTAINING_RECORD
3970 #define CONTAINING_RECORD(Address, Type, Field) \
3971 ((Type *) (((ULONG_PTR) Address) - FIELD_OFFSET(Type, Field)))
3979 #ifndef FIELD_OFFSET
3980 #define FIELD_OFFSET(Type, Field) \
3981 ((LONG) (&(((Type *) 0)->Field)))
3989 #define PAGE_ALIGN(Va) \
3990 ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
3995 * IN ULONG_PTR Size)
3997 #define ROUND_TO_PAGES(Size) \
3998 ((ULONG_PTR) (((ULONG_PTR) Size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1)))
4004 /*IN*/ PVOID FailedAssertion,
4005 /*IN*/ PVOID FileName,
4006 /*IN*/ ULONG LineNumber,
4007 /*IN*/ PCHAR Message);
4011 #define ASSERT(exp) \
4013 (RtlAssert( #exp, __FILE__, __LINE__, NULL ), FALSE) : TRUE)
4015 #define ASSERTMSG(msg, exp) \
4017 (RtlAssert( #exp, __FILE__, __LINE__, msg ), FALSE) : TRUE)
4019 #define RTL_SOFT_ASSERT(exp) \
4021 (DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE) : TRUE)
4023 #define RTL_SOFT_ASSERTMSG(msg, exp) \
4025 (DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE) : TRUE)
4027 #define RTL_VERIFY(exp) ASSERT(exp)
4028 #define RTL_VERIFYMSG(msg, exp) ASSERT(msg, exp)
4030 #define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
4031 #define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
4035 #define ASSERT(exp) ((VOID) 0)
4036 #define ASSERTMSG(msg, exp) ((VOID) 0)
4038 #define RTL_SOFT_ASSERT(exp) ((VOID) 0)
4039 #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
4041 #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
4042 #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
4044 #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
4045 #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
4051 ** Driver support routines
4054 /** Runtime library routines **/
4058 * InitializeListHead(
4059 * IN PLIST_ENTRY ListHead)
4061 #define InitializeListHead(_ListHead) \
4063 (_ListHead)->Flink = (_ListHead); \
4064 (_ListHead)->Blink = (_ListHead); \
4070 * IN PLIST_ENTRY ListHead,
4071 * IN PLIST_ENTRY Entry)
4073 #define InsertHeadList(_ListHead, \
4076 PLIST_ENTRY _OldFlink; \
4077 _OldFlink = (_ListHead)->Flink; \
4078 (_Entry)->Flink = _OldFlink; \
4079 (_Entry)->Blink = (_ListHead); \
4080 _OldFlink->Blink = (_Entry); \
4081 (_ListHead)->Flink = (_Entry); \
4087 * IN PLIST_ENTRY ListHead,
4088 * IN PLIST_ENTRY Entry)
4090 #define InsertTailList(_ListHead, \
4093 PLIST_ENTRY _OldBlink; \
4094 _OldBlink = (_ListHead)->Blink; \
4095 (_Entry)->Flink = (_ListHead); \
4096 (_Entry)->Blink = _OldBlink; \
4097 _OldBlink->Flink = (_Entry); \
4098 (_ListHead)->Blink = (_Entry); \
4104 * IN PLIST_ENTRY ListHead)
4106 #define IsListEmpty(_ListHead) \
4107 ((_ListHead)->Flink == (_ListHead))
4109 static __inline PSINGLE_LIST_ENTRY
4111 /*IN*/ PSINGLE_LIST_ENTRY ListHead)
4113 PSINGLE_LIST_ENTRY Entry;
4115 Entry = ListHead->Next;
4118 ListHead->Next = Entry->Next;
4126 * IN PSINGLE_LIST_ENTRY ListHead,
4127 * IN PSINGLE_LIST_ENTRY Entry)
4129 #define PushEntryList(_ListHead, \
4132 (_Entry)->Next = (_ListHead)->Next; \
4133 (_ListHead)->Next = (_Entry); \
4139 * IN PLIST_ENTRY Entry)
4141 #define RemoveEntryList(_Entry) \
4143 PLIST_ENTRY _OldFlink; \
4144 PLIST_ENTRY _OldBlink; \
4145 _OldFlink = (_Entry)->Flink; \
4146 _OldBlink = (_Entry)->Blink; \
4147 _OldFlink->Blink = _OldBlink; \
4148 _OldBlink->Flink = _OldFlink; \
4149 (_Entry)->Flink = NULL; \
4150 (_Entry)->Blink = NULL; \
4153 static __inline PLIST_ENTRY
4155 /*IN*/ PLIST_ENTRY ListHead)
4157 PLIST_ENTRY OldFlink;
4158 PLIST_ENTRY OldBlink;
4161 Entry = ListHead->Flink;
4162 OldFlink = ListHead->Flink->Flink;
4163 OldBlink = ListHead->Flink->Blink;
4164 OldFlink->Blink = OldBlink;
4165 OldBlink->Flink = OldFlink;
4167 if (Entry != ListHead)
4169 Entry->Flink = NULL;
4170 Entry->Blink = NULL;
4176 static __inline PLIST_ENTRY
4178 /*IN*/ PLIST_ENTRY ListHead)
4180 PLIST_ENTRY OldFlink;
4181 PLIST_ENTRY OldBlink;
4184 Entry = ListHead->Blink;
4185 OldFlink = ListHead->Blink->Flink;
4186 OldBlink = ListHead->Blink->Blink;
4187 OldFlink->Blink = OldBlink;
4188 OldBlink->Flink = OldFlink;
4190 if (Entry != ListHead)
4192 Entry->Flink = NULL;
4193 Entry->Blink = NULL;
4202 * IN PSLIST_HEADER SListHead)
4204 #define QueryDepthSList(_SListHead) \
4205 ((USHORT) ((_SListHead)->Alignment & 0xffff))
4207 #define InterlockedFlushSList(ListHead) ExInterlockedFlushSList(ListHead)
4212 RtlAnsiStringToUnicodeSize(
4213 /*IN*/ PANSI_STRING AnsiString);
4219 /*IN OUT*/ PRTL_RANGE_LIST RangeList,
4220 /*IN*/ ULONGLONG Start,
4221 /*IN*/ ULONGLONG End,
4222 /*IN*/ UCHAR Attributes,
4224 /*IN*/ PVOID UserData /*OPTIONAL*/,
4225 /*IN*/ PVOID Owner /*OPTIONAL*/);
4230 RtlAnsiStringToUnicodeString(
4231 /*IN OUT*/ PUNICODE_STRING DestinationString,
4232 /*IN*/ PANSI_STRING SourceString,
4233 /*IN*/ BOOLEAN AllocateDestinationString);
4238 RtlAppendUnicodeStringToString(
4239 /*IN OUT*/ PUNICODE_STRING Destination,
4240 /*IN*/ PUNICODE_STRING Source);
4245 RtlAppendUnicodeToString(
4246 /*IN OUT*/ PUNICODE_STRING Destination,
4247 /*IN*/ PCWSTR Source);
4253 /*IN*/ PRTL_BITMAP BitMapHeader,
4254 /*IN*/ ULONG StartingIndex,
4255 /*IN*/ ULONG Length);
4261 /*IN*/ PRTL_BITMAP BitMapHeader,
4262 /*IN*/ ULONG StartingIndex,
4263 /*IN*/ ULONG Length);
4270 /*IN*/ ULONG Base /*OPTIONAL*/,
4271 /*IN OUT*/ PULONG Value);
4277 /*IN*/ PRTL_BITMAP BitMapHeader,
4278 /*IN*/ ULONG BitPosition);
4283 RtlCheckRegistryKey(
4284 /*IN*/ ULONG RelativeTo,
4291 /*IN*/ PRTL_BITMAP BitMapHeader);
4297 PRTL_BITMAP BitMapHeader,
4304 /*IN*/ PRTL_BITMAP BitMapHeader,
4305 /*IN*/ ULONG StartingIndex,
4306 /*IN*/ ULONG NumberToClear);
4312 /*IN*/ CONST VOID *Source1,
4313 /*IN*/ CONST VOID *Source2,
4314 /*IN*/ SIZE_T Length);
4320 /*IN*/ PSTRING String1,
4321 /*IN*/ PSTRING String2,
4322 BOOLEAN CaseInSensitive);
4327 RtlCompareUnicodeString(
4328 /*IN*/ PUNICODE_STRING String1,
4329 /*IN*/ PUNICODE_STRING String2,
4330 /*IN*/ BOOLEAN CaseInSensitive);
4335 RtlConvertLongToLargeInteger(
4336 /*IN*/ LONG SignedInteger);
4341 RtlConvertLongToLuid(
4347 RtlConvertUlongToLargeInteger(
4348 /*IN*/ ULONG UnsignedInteger);
4353 RtlConvertUlongToLuid(
4359 * IN VOID UNALIGNED *Destination,
4360 * IN CONST VOID UNALIGNED *Source,
4363 #ifndef RtlCopyMemory
4364 #define RtlCopyMemory(Destination, Source, Length) \
4365 memcpy(Destination, Source, Length);
4368 #ifndef RtlCopyBytes
4369 #define RtlCopyBytes RtlCopyMemory
4376 /*IN*/ VOID UNALIGNED *Destination,
4377 /*IN*/ CONST VOID UNALIGNED *Source,
4378 /*IN*/ ULONG Length);
4384 /*OUT*/ PRTL_RANGE_LIST CopyRangeList,
4385 /*IN*/ PRTL_RANGE_LIST RangeList);
4391 /*IN OUT*/ PSTRING DestinationString,
4392 /*IN*/ PSTRING SourceString /*OPTIONAL*/);
4397 RtlCopyUnicodeString(
4398 /*IN OUT*/ PUNICODE_STRING DestinationString,
4399 /*IN*/ PUNICODE_STRING SourceString);
4404 RtlCreateRegistryKey(
4405 /*IN*/ ULONG RelativeTo,
4411 RtlCreateSecurityDescriptor(
4412 /*IN OUT*/ PSECURITY_DESCRIPTOR SecurityDescriptor,
4413 /*IN*/ ULONG Revision);
4418 RtlDeleteOwnersRanges(
4419 /*IN OUT*/ PRTL_RANGE_LIST RangeList,
4420 /*IN*/ PVOID Owner);
4426 /*IN OUT*/ PRTL_RANGE_LIST RangeList,
4427 /*IN*/ ULONGLONG Start,
4428 /*IN*/ ULONGLONG End,
4429 /*IN*/ PVOID Owner);
4434 RtlDeleteRegistryValue(
4435 /*IN*/ ULONG RelativeTo,
4437 /*IN*/ PCWSTR ValueName);
4442 RtlDosPathNameToNtPathName_U(
4443 /*IN*/ PCWSTR DosPathName,
4444 /*OUT*/ PUNICODE_STRING NtPathName,
4445 /*OUT*/ PCWSTR *NtFileNamePart,
4446 /*OUT*/ VOID *DirectoryInfo);
4454 #define RtlEqualLuid(_Luid1, \
4456 ((Luid1.LowPart == Luid2.LowPart) && (Luid1.HighPart == Luid2.HighPart))
4461 * IN VOID UNALIGNED *Destination,
4462 * IN CONST VOID UNALIGNED *Source,
4465 #define RtlEqualMemory(Destination, Source, Length) (!memcmp(Destination, Source, Length))
4471 /*IN*/ PSTRING String1,
4472 /*IN*/ PSTRING String2,
4473 /*IN*/ BOOLEAN CaseInSensitive);
4478 RtlEqualUnicodeString(
4479 /*IN*/ CONST UNICODE_STRING *String1,
4480 /*IN*/ CONST UNICODE_STRING *String2,
4481 /*IN*/ BOOLEAN CaseInSensitive);
4486 * IN VOID UNALIGNED *Destination,
4490 #ifndef RtlFillMemory
4491 #define RtlFillMemory(Destination, Length, Fill) \
4492 memset(Destination, Fill, Length)
4495 #ifndef RtlFillBytes
4496 #define RtlFillBytes RtlFillMemory
4503 /*IN*/ PRTL_BITMAP BitMapHeader,
4504 /*IN*/ ULONG NumberToFind,
4505 /*IN*/ ULONG HintIndex);
4510 RtlFindClearBitsAndSet(
4511 /*IN*/ PRTL_BITMAP BitMapHeader,
4512 /*IN*/ ULONG NumberToFind,
4513 /*IN*/ ULONG HintIndex);
4519 /*IN*/ PRTL_BITMAP BitMapHeader,
4520 /*OUT*/ PRTL_BITMAP_RUN RunArray,
4521 /*IN*/ ULONG SizeOfRunArray,
4522 /*IN*/ BOOLEAN LocateLongestRuns);
4527 RtlFindFirstRunClear(
4528 /*IN*/ PRTL_BITMAP BitMapHeader,
4529 /*OUT*/ PULONG StartingIndex);
4534 RtlFindLastBackwardRunClear(
4535 /*IN*/ PRTL_BITMAP BitMapHeader,
4536 /*IN*/ ULONG FromIndex,
4537 /*OUT*/ PULONG StartingRunIndex);
4542 RtlFindLeastSignificantBit(
4543 /*IN*/ ULONGLONG Set);
4548 RtlFindLongestRunClear(
4549 /*IN*/ PRTL_BITMAP BitMapHeader,
4550 /*OUT*/ PULONG StartingIndex);
4555 RtlFindMostSignificantBit(
4556 /*IN*/ ULONGLONG Set);
4561 RtlFindNextForwardRunClear(
4562 /*IN*/ PRTL_BITMAP BitMapHeader,
4563 /*IN*/ ULONG FromIndex,
4564 /*OUT*/ PULONG StartingRunIndex);
4570 /*IN*/ PRTL_RANGE_LIST RangeList,
4571 /*IN*/ ULONGLONG Minimum,
4572 /*IN*/ ULONGLONG Maximum,
4573 /*IN*/ ULONG Length,
4574 /*IN*/ ULONG Alignment,
4576 /*IN*/ UCHAR AttributeAvailableMask,
4577 /*IN*/ PVOID Context /*OPTIONAL*/,
4578 /*IN*/ PRTL_CONFLICT_RANGE_CALLBACK Callback /*OPTIONAL*/,
4579 /*OUT*/ PULONGLONG Start);
4585 /*IN*/ PRTL_BITMAP BitMapHeader,
4586 /*IN*/ ULONG NumberToFind,
4587 /*IN*/ ULONG HintIndex);
4592 RtlFindSetBitsAndClear(
4593 /*IN*/ PRTL_BITMAP BitMapHeader,
4594 /*IN*/ ULONG NumberToFind,
4595 /*IN*/ ULONG HintIndex);
4601 /*IN*/ PANSI_STRING AnsiString);
4607 /*IN*/ PRTL_RANGE_LIST RangeList);
4612 RtlFreeUnicodeString(
4613 /*IN*/ PUNICODE_STRING UnicodeString);
4618 RtlGetCallersAddress(
4619 /*OUT*/ PVOID *CallersAddress,
4620 /*OUT*/ PVOID *CallersCaller);
4626 /*IN OUT*/ PRTL_OSVERSIONINFOW lpVersionInformation);
4632 /*IN*/ PRTL_RANGE_LIST RangeList,
4633 /*OUT*/ PRTL_RANGE_LIST_ITERATOR Iterator,
4634 /*OUT*/ PRTL_RANGE *Range);
4640 /*IN OUT*/ PRTL_RANGE_LIST_ITERATOR Iterator,
4641 /*OUT*/ PRTL_RANGE *Range,
4642 /*IN*/ BOOLEAN MoveForwards);
4644 #define FOR_ALL_RANGES(RangeList, Iterator, Current) \
4645 for (RtlGetFirstRange((RangeList), (Iterator), &(Current)); \
4646 (Current) != NULL; \
4647 RtlGetNextRange((Iterator), &(Current), TRUE))
4649 #define FOR_ALL_RANGES_BACKWARDS(RangeList, Iterator, Current) \
4650 for (RtlGetLastRange((RangeList), (Iterator), &(Current)); \
4651 (Current) != NULL; \
4652 RtlGetNextRange((Iterator), &(Current), FALSE))
4658 /*IN*/ PUNICODE_STRING GuidString,
4659 /*OUT*/ GUID *Guid);
4664 RtlHashUnicodeString(
4665 /*IN*/ CONST UNICODE_STRING *String,
4666 /*IN*/ BOOLEAN CaseInSensitive,
4667 /*IN*/ ULONG HashAlgorithm,
4668 /*OUT*/ PULONG HashValue);
4674 /*IN OUT*/ PANSI_STRING DestinationString,
4675 /*IN*/ PCSZ SourceString);
4680 RtlInitializeBitMap(
4681 /*IN*/ PRTL_BITMAP BitMapHeader,
4682 /*IN*/ PULONG BitMapBuffer,
4683 /*IN*/ ULONG SizeOfBitMap);
4688 RtlInitializeRangeList(
4689 /*IN OUT*/ PRTL_RANGE_LIST RangeList);
4695 /*IN OUT*/ PSTRING DestinationString,
4696 /*IN*/ PCSZ SourceString);
4701 RtlInitUnicodeString(
4702 /*IN OUT*/ PUNICODE_STRING DestinationString,
4703 /*IN*/ PCWSTR SourceString);
4708 RtlInt64ToUnicodeString(
4709 /*IN*/ ULONGLONG Value,
4710 /*IN*/ ULONG Base /*OPTIONAL*/,
4711 /*IN OUT*/ PUNICODE_STRING String);
4716 RtlIntegerToUnicodeString(
4718 /*IN*/ ULONG Base /*OPTIONAL*/,
4719 /*IN OUT*/ PUNICODE_STRING String);
4724 RtlIntPtrToUnicodeString(
4726 ULONG Base /*OPTIONAL*/,
4727 PUNICODE_STRING String);
4733 /*OUT*/ PRTL_RANGE_LIST InvertedRangeList,
4734 /*IN*/ PRTL_RANGE_LIST RangeList);
4739 RtlIsRangeAvailable(
4740 /*IN*/ PRTL_RANGE_LIST RangeList,
4741 /*IN*/ ULONGLONG Start,
4742 /*IN*/ ULONGLONG End,
4744 /*IN*/ UCHAR AttributeAvailableMask,
4745 /*IN*/ PVOID Context /*OPTIONAL*/,
4746 /*IN*/ PRTL_CONFLICT_RANGE_CALLBACK Callback /*OPTIONAL*/,
4747 /*OUT*/ PBOOLEAN Available);
4754 #define RtlIsZeroLuid(_L1) \
4755 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
4760 RtlLengthSecurityDescriptor(
4761 /*IN*/ PSECURITY_DESCRIPTOR SecurityDescriptor);
4767 /*IN OUT*/ PACCESS_MASK AccessMask,
4768 /*IN*/ PGENERIC_MAPPING GenericMapping);
4774 /*OUT*/ PRTL_RANGE_LIST MergedRangeList,
4775 /*IN*/ PRTL_RANGE_LIST RangeList1,
4776 /*IN*/ PRTL_RANGE_LIST RangeList2,
4777 /*IN*/ ULONG Flags);
4782 * IN VOID UNALIGNED *Destination,
4783 * IN CONST VOID UNALIGNED *Source,
4786 #define RtlMoveMemory memmove
4791 RtlNumberOfClearBits(
4792 /*IN*/ PRTL_BITMAP BitMapHeader);
4798 /*IN*/ PRTL_BITMAP BitMapHeader);
4803 RtlPrefetchMemoryNonTemporal(
4804 /*IN*/ PVOID Source,
4805 /*IN*/ SIZE_T Length);
4810 RtlPrefixUnicodeString(
4811 /*IN*/ PUNICODE_STRING String1,
4812 /*IN*/ PUNICODE_STRING String2,
4813 /*IN*/ BOOLEAN CaseInSensitive);
4818 RtlQueryRegistryValues(
4819 /*IN*/ ULONG RelativeTo,
4821 /*IN*/ PRTL_QUERY_REGISTRY_TABLE QueryTable,
4822 /*IN*/ PVOID Context,
4823 /*IN*/ PVOID Environment /*OPTIONAL*/);
4829 /*IN OUT*/ PULONG DestinationAddress,
4830 /*IN*/ PULONG SourceAddress);
4836 /*IN OUT*/ PUSHORT DestinationAddress,
4837 /*IN*/ PUSHORT SourceAddress);
4843 /*IN*/ PRTL_BITMAP BitMapHeader);
4849 PRTL_BITMAP BitMapHeader,
4856 /*IN*/ PRTL_BITMAP BitMapHeader,
4857 /*IN*/ ULONG StartingIndex,
4858 /*IN*/ ULONG NumberToSet);
4863 RtlSetDaclSecurityDescriptor(
4864 /*IN OUT*/ PSECURITY_DESCRIPTOR SecurityDescriptor,
4865 /*IN*/ BOOLEAN DaclPresent,
4866 /*IN*/ PACL Dacl /*OPTIONAL*/,
4867 /*IN*/ BOOLEAN DaclDefaulted /*OPTIONAL*/);
4873 /*IN*/ PULONG Address,
4874 /*IN*/ ULONG Value);
4880 /*IN OUT*/ PULONGLONG Address,
4887 /*IN OUT*/ PULONG_PTR Address,
4888 /*IN*/ ULONG_PTR Value);
4894 /*IN*/ PUSHORT Address,
4895 /*IN*/ USHORT Value);
4901 /*IN*/ REFGUID Guid,
4902 /*OUT*/ PUNICODE_STRING GuidString);
4904 #define RtlStringCbCopyA(dst, dst_len, src) strncpy(dst, src, dst_len)
4905 #define RtlStringCbPrintfA(args...) snprintf(args)
4906 #define RtlStringCbVPrintfA(args...) vsnprintf(args)
4912 /*IN*/ PRTL_BITMAP BitMapHeader,
4913 /*IN*/ ULONG BitNumber);
4918 RtlTimeFieldsToTime(
4919 /*IN*/ PTIME_FIELDS TimeFields,
4920 /*IN*/ PLARGE_INTEGER Time);
4925 RtlTimeToTimeFields(
4926 /*IN*/ PLARGE_INTEGER Time,
4927 /*IN*/ PTIME_FIELDS TimeFields);
4933 /*IN*/ ULONG Source);
4938 RtlUlonglongByteSwap(
4939 /*IN*/ ULONGLONG Source);
4944 RtlUnicodeStringToAnsiSize(
4945 /*IN*/ PUNICODE_STRING UnicodeString);
4950 RtlUnicodeStringToAnsiString(
4951 /*IN OUT*/ PANSI_STRING DestinationString,
4952 /*IN*/ PUNICODE_STRING SourceString,
4953 /*IN*/ BOOLEAN AllocateDestinationString);
4958 RtlUnicodeStringToInteger(
4959 /*IN*/ PUNICODE_STRING String,
4960 /*IN*/ ULONG Base /*OPTIONAL*/,
4961 /*OUT*/ PULONG Value);
4966 RtlUpcaseUnicodeChar(
4967 /*IN*/ WCHAR SourceCharacter);
4972 RtlUpcaseUnicodeString(
4973 /*IN OUT*/ PUNICODE_STRING DestinationString /*OPTIONAL*/,
4974 /*IN*/ PCUNICODE_STRING SourceString,
4975 /*IN*/ BOOLEAN AllocateDestinationString);
4981 /*IN*/ CHAR Character);
4987 /*IN OUT*/ PSTRING DestinationString,
4988 /*IN*/ PSTRING SourceString);
4994 /*IN*/ USHORT Source);
4999 RtlValidRelativeSecurityDescriptor(
5000 /*IN*/ PSECURITY_DESCRIPTOR SecurityDescriptorInput,
5001 /*IN*/ ULONG SecurityDescriptorLength,
5002 /*IN*/ SECURITY_INFORMATION RequiredInformation);
5007 RtlValidSecurityDescriptor(
5008 /*IN*/ PSECURITY_DESCRIPTOR SecurityDescriptor);
5013 RtlVerifyVersionInfo(
5014 /*IN*/ PRTL_OSVERSIONINFOEXW VersionInfo,
5015 /*IN*/ ULONG TypeMask,
5016 /*IN*/ ULONGLONG ConditionMask);
5021 RtlVolumeDeviceToDosName(
5022 /*IN*/ PVOID VolumeDeviceObject,
5023 /*OUT*/ PUNICODE_STRING DosName);
5029 /*OUT*/ PVOID *Callers,
5031 /*IN*/ ULONG Flags);
5036 RtlWriteRegistryValue(
5037 /*IN*/ ULONG RelativeTo,
5039 /*IN*/ PCWSTR ValueName,
5040 /*IN*/ ULONG ValueType,
5041 /*IN*/ PVOID ValueData,
5042 /*IN*/ ULONG ValueLength);
5047 RtlxUnicodeStringToAnsiSize(
5048 /*IN*/ PUNICODE_STRING UnicodeString);
5053 * IN VOID UNALIGNED *Destination,
5056 #ifndef RtlZeroMemory
5057 #define RtlZeroMemory(Destination, Length) \
5058 memset(Destination, 0, Length)
5061 #ifndef RtlZeroBytes
5062 #define RtlZeroBytes RtlZeroMemory
5066 /** Executive support routines **/
5072 /*IN*/ PFAST_MUTEX FastMutex);
5077 ExAcquireFastMutexUnsafe(
5078 /*IN*/ PFAST_MUTEX FastMutex);
5083 ExAcquireResourceExclusiveLite(
5084 /*IN*/ PERESOURCE Resource,
5085 /*IN*/ BOOLEAN Wait);
5090 ExAcquireResourceSharedLite(
5091 /*IN*/ PERESOURCE Resource,
5092 /*IN*/ BOOLEAN Wait);
5097 ExAcquireSharedStarveExclusive(
5098 /*IN*/ PERESOURCE Resource,
5099 /*IN*/ BOOLEAN Wait);
5104 ExAcquireSharedWaitForExclusive(
5105 /*IN*/ PERESOURCE Resource,
5106 /*IN*/ BOOLEAN Wait);
5112 ExInterlockedPopEntrySList(
5113 /*IN*/ PSLIST_HEADER ListHead,
5114 /*IN*/ PKSPIN_LOCK Lock);
5120 ExInterlockedPushEntrySList(
5121 /*IN*/ PSLIST_HEADER ListHead,
5122 /*IN*/ PSINGLE_LIST_ENTRY ListEntry,
5123 /*IN*/ PKSPIN_LOCK Lock);
5126 #if (__USE_NTOSKRNL__) && (_WIN32_WINNT >= 0x0501)
5127 #define ExInterlockedPopEntrySList(_ListHead, \
5129 InterlockedPopEntrySList(_ListHead)
5131 #define ExInterlockedPushEntrySList(_ListHead, \
5134 InterlockedPushEntrySList(_ListHead, _ListEntry)
5135 #endif /* __USE_NTOSKRNL__ */
5137 #define ExQueryDepthSList(ListHead) QueryDepthSList(ListHead)
5139 static __inline PVOID
5140 ExAllocateFromNPagedLookasideList(
5141 /*IN*/ PNPAGED_LOOKASIDE_LIST Lookaside)
5145 Lookaside->TotalAllocates++;
5146 Entry = ExInterlockedPopEntrySList(&Lookaside->ListHead,
5147 &Lookaside->Obsoleted);
5148 if (Entry == NULL) {
5149 Lookaside->_DDK_DUMMYUNION_MEMBER(AllocateMisses)++;
5150 Entry = (Lookaside->Allocate)(Lookaside->Type,
5157 static __inline VOID
5158 ExFreeToNPagedLookasideList(
5159 /*IN*/ PNPAGED_LOOKASIDE_LIST Lookaside,
5162 Lookaside->TotalFrees++;
5163 if (ExQueryDepthSList(&Lookaside->ListHead) >= Lookaside->Depth) {
5164 Lookaside->_DDK_DUMMYUNION_N_MEMBER(2,FreeMisses)++;
5165 (Lookaside->Free)(Entry);
5167 ExInterlockedPushEntrySList(&Lookaside->ListHead,
5168 (PSLIST_ENTRY)Entry,
5169 &Lookaside->Obsoleted);
5173 #if (__USE_NTOSKRNL__) && (_WIN32_WINNT >= 0x0501)
5175 static __inline PVOID
5176 ExAllocateFromPagedLookasideList(
5177 /*IN*/ PPAGED_LOOKASIDE_LIST Lookaside)
5181 Lookaside->TotalAllocates++;
5182 Entry = InterlockedPopEntrySList(&Lookaside->ListHead);
5183 if (Entry == NULL) {
5184 Lookaside->_DDK_DUMMYUNION_MEMBER(AllocateMisses)++;
5185 Entry = (Lookaside->Allocate)(Lookaside->Type,
5192 static __inline VOID
5193 ExFreeToPagedLookasideList(
5194 /*IN*/ PPAGED_LOOKASIDE_LIST Lookaside,
5197 Lookaside->TotalFrees++;
5198 if (ExQueryDepthSList(&Lookaside->ListHead) >= Lookaside->Depth) {
5199 Lookaside->_DDK_DUMMYUNION_N_MEMBER(2,FreeMisses)++;
5200 (Lookaside->Free)(Entry);
5202 InterlockedPushEntrySList(&Lookaside->ListHead,
5203 (PSLIST_ENTRY)Entry);
5207 #else /* (__USE_NTOSKRNL__) && (_WIN32_WINNT >= 0x0501) */
5212 ExAllocateFromPagedLookasideList(
5213 /*IN*/ PPAGED_LOOKASIDE_LIST Lookaside);
5218 ExFreeToPagedLookasideList(
5219 /*IN*/ PPAGED_LOOKASIDE_LIST Lookaside,
5220 /*IN*/ PVOID Entry);
5222 #endif /* (__USE_NTOSKRNL__) && (_WIN32_WINNT >= 0x0501) */
5227 ExAllocatePoolWithQuotaTag(
5228 /*IN*/ POOL_TYPE PoolType,
5229 /*IN*/ SIZE_T NumberOfBytes,
5235 ExAllocatePoolWithTag(
5236 /*IN*/ POOL_TYPE PoolType,
5237 /*IN*/ SIZE_T NumberOfBytes,
5242 #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
5243 #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
5245 #else /* !POOL_TAGGING */
5251 /*IN*/ POOL_TYPE PoolType,
5252 /*IN*/ SIZE_T NumberOfBytes);
5257 ExAllocatePoolWithQuota(
5258 /*IN*/ POOL_TYPE PoolType,
5259 /*IN*/ SIZE_T NumberOfBytes);
5261 #endif /* POOL_TAGGING */
5266 ExAllocatePoolWithTagPriority(
5267 /*IN*/ POOL_TYPE PoolType,
5268 /*IN*/ SIZE_T NumberOfBytes,
5270 /*IN*/ EX_POOL_PRIORITY Priority);
5275 ExConvertExclusiveToSharedLite(
5276 /*IN*/ PERESOURCE Resource);
5282 /*OUT*/ PCALLBACK_OBJECT *CallbackObject,
5283 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes,
5284 /*IN*/ BOOLEAN Create,
5285 /*IN*/ BOOLEAN AllowMultipleCallbacks);
5290 ExDeleteNPagedLookasideList(
5291 /*IN*/ PNPAGED_LOOKASIDE_LIST Lookaside);
5296 ExDeletePagedLookasideList(
5297 /*IN*/ PPAGED_LOOKASIDE_LIST Lookaside);
5302 ExDeleteResourceLite(
5303 /*IN*/ PERESOURCE Resource);
5311 #define PROTECTED_POOL 0x80000000
5314 #define ExFreePool(P) ExFreePoolWithTag(P, 0)
5326 * ExGetCurrentResourceThread(
5329 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD) PsGetCurrentThread())
5334 ExGetExclusiveWaiterCount(
5335 /*IN*/ PERESOURCE Resource);
5346 ExGetSharedWaiterCount(
5347 /*IN*/ PERESOURCE Resource);
5353 /*IN*/ PRKEVENT Event,
5354 /*IN*/ EVENT_TYPE Type,
5355 /*IN*/ BOOLEAN State);
5359 * ExInitializeFastMutex(
5360 * IN PFAST_MUTEX FastMutex)
5362 #define ExInitializeFastMutex(_FastMutex) \
5364 (_FastMutex)->Count = 1; \
5365 (_FastMutex)->Owner = NULL; \
5366 (_FastMutex)->Contention = 0; \
5367 KeInitializeEvent(&(_FastMutex)->Event, SynchronizationEvent, FALSE); \
5373 ExInitializeNPagedLookasideList(
5374 /*IN*/ PNPAGED_LOOKASIDE_LIST Lookaside,
5375 /*IN*/ PALLOCATE_FUNCTION Allocate /*OPTIONAL*/,
5376 /*IN*/ PFREE_FUNCTION Free /*OPTIONAL*/,
5380 /*IN*/ USHORT Depth);
5385 ExInitializePagedLookasideList(
5386 /*IN*/ PPAGED_LOOKASIDE_LIST Lookaside,
5387 /*IN*/ PALLOCATE_FUNCTION Allocate /*OPTIONAL*/,
5388 /*IN*/ PFREE_FUNCTION Free /*OPTIONAL*/,
5392 /*IN*/ USHORT Depth);
5397 ExInitializeResourceLite(
5398 /*IN*/ PERESOURCE Resource);
5402 * InitializeSListHead(
5403 * IN PSLIST_HEADER SListHead)
5405 #define InitializeSListHead(_SListHead) \
5406 (_SListHead)->Alignment = 0
5408 #define ExInitializeSListHead InitializeSListHead
5413 ExInterlockedAddLargeInteger(
5414 /*IN*/ PLARGE_INTEGER Addend,
5415 /*IN*/ LARGE_INTEGER Increment,
5416 /*IN*/ PKSPIN_LOCK Lock);
5421 ExInterlockedAddLargeStatistic(
5422 /*IN*/ PLARGE_INTEGER Addend,
5423 /*IN*/ ULONG Increment);
5428 ExInterlockedAddUlong(
5429 /*IN*/ PULONG Addend,
5430 /*IN*/ ULONG Increment,
5436 ExfInterlockedAddUlong(
5437 /*IN*/ PULONG Addend,
5438 /*IN*/ ULONG Increment,
5445 ExInterlockedCompareExchange64(
5446 /*IN OUT*/ PLONGLONG Destination,
5447 /*IN*/ PLONGLONG Exchange,
5448 /*IN*/ PLONGLONG Comparand,
5449 /*IN*/ PKSPIN_LOCK Lock);
5454 ExInterlockedFlushSList(
5455 /*IN*/ PSLIST_HEADER ListHead);
5460 ExInterlockedInsertHeadList(
5461 /*IN*/ PLIST_ENTRY ListHead,
5462 /*IN*/ PLIST_ENTRY ListEntry,
5463 /*IN*/ PKSPIN_LOCK Lock);
5468 ExfInterlockedInsertHeadList(
5469 /*IN*/ PLIST_ENTRY ListHead,
5470 /*IN*/ PLIST_ENTRY ListEntry,
5471 /*IN*/ PKSPIN_LOCK Lock);
5476 ExInterlockedInsertTailList(
5477 /*IN*/ PLIST_ENTRY ListHead,
5478 /*IN*/ PLIST_ENTRY ListEntry,
5479 /*IN*/ PKSPIN_LOCK Lock);
5484 ExfInterlockedInsertTailList(
5485 /*IN*/ PLIST_ENTRY ListHead,
5486 /*IN*/ PLIST_ENTRY ListEntry,
5487 /*IN*/ PKSPIN_LOCK Lock);
5492 ExInterlockedPopEntryList(
5493 /*IN*/ PSINGLE_LIST_ENTRY ListHead,
5494 /*IN*/ PKSPIN_LOCK Lock);
5499 ExfInterlockedPopEntryList(
5500 /*IN*/ PSINGLE_LIST_ENTRY ListHead,
5501 /*IN*/ PKSPIN_LOCK Lock);
5507 ExInterlockedPushEntryList(
5508 /*IN*/ PSINGLE_LIST_ENTRY ListHead,
5509 /*IN*/ PSINGLE_LIST_ENTRY ListEntry,
5510 /*IN*/ PKSPIN_LOCK Lock);
5515 ExfInterlockedPushEntryList(
5516 /*IN*/ PSINGLE_LIST_ENTRY ListHead,
5517 /*IN*/ PSINGLE_LIST_ENTRY ListEntry,
5518 /*IN*/ PKSPIN_LOCK Lock);
5524 ExInterlockedRemoveHeadList(
5525 /*IN*/ PLIST_ENTRY ListHead,
5526 /*IN*/ PKSPIN_LOCK Lock);
5531 ExfInterlockedRemoveHeadList(
5532 /*IN*/ PLIST_ENTRY ListHead,
5533 /*IN*/ PKSPIN_LOCK Lock);
5539 ExIsProcessorFeaturePresent(
5540 /*IN*/ ULONG ProcessorFeature);
5545 ExIsResourceAcquiredExclusiveLite(
5546 /*IN*/ PERESOURCE Resource);
5551 ExIsResourceAcquiredLite(
5552 /*IN*/ PERESOURCE Resource);
5557 ExIsResourceAcquiredSharedLite(
5558 /*IN*/ PERESOURCE Resource);
5563 ExLocalTimeToSystemTime(
5564 /*IN*/ PLARGE_INTEGER LocalTime,
5565 /*OUT*/ PLARGE_INTEGER SystemTime);
5571 /*IN*/ PCALLBACK_OBJECT CallbackObject,
5572 /*IN*/ PVOID Argument1,
5573 /*IN*/ PVOID Argument2);
5578 ExRaiseAccessViolation(
5584 ExRaiseDatatypeMisalignment(
5591 /*IN*/ NTSTATUS Status);
5597 /*IN*/ PCALLBACK_OBJECT CallbackObject,
5598 /*IN*/ PCALLBACK_FUNCTION CallbackFunction,
5599 /*IN*/ PVOID CallbackContext);
5604 ExReinitializeResourceLite(
5605 /*IN*/ PERESOURCE Resource);
5611 /*IN*/ PFAST_MUTEX FastMutex);
5616 ExReleaseFastMutexUnsafe(
5617 /*IN*/ PFAST_MUTEX FastMutex);
5622 ExReleaseResourceForThreadLite(
5623 /*IN*/ PERESOURCE Resource,
5624 /*IN*/ ERESOURCE_THREAD ResourceThreadId);
5629 ExReleaseResourceLite(
5630 /*IN*/ PERESOURCE Resource);
5635 ExSetResourceOwnerPointer(
5636 /*IN*/ PERESOURCE Resource,
5637 /*IN*/ PVOID OwnerPointer);
5642 ExSetTimerResolution(
5643 /*IN*/ ULONG DesiredTime,
5644 /*IN*/ BOOLEAN SetResolution);
5649 ExSystemTimeToLocalTime(
5650 /*IN*/ PLARGE_INTEGER SystemTime,
5651 /*OUT*/ PLARGE_INTEGER LocalTime);
5656 ExTryToAcquireFastMutex(
5657 /*IN*/ PFAST_MUTEX FastMutex);
5662 ExTryToAcquireResourceExclusiveLite(
5663 /*IN*/ PERESOURCE Resource);
5668 ExUnregisterCallback(
5669 /*IN*/ PVOID CbRegistration);
5675 /*OUT*/ UUID *Uuid);
5681 /*IN*/ SUITE_TYPE SuiteType);
5685 #define PAGED_CODE() { \
5686 if (KeGetCurrentIrql() > APC_LEVEL) { \
5687 KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
5694 #define PAGED_CODE()
5702 /*IN*/ CONST VOID *Address,
5703 /*IN*/ ULONG Length,
5704 /*IN*/ ULONG Alignment);
5710 /*IN*/ CONST VOID *Address,
5711 /*IN*/ ULONG Length,
5712 /*IN*/ ULONG Alignment);
5716 /** Configuration manager routines **/
5722 /*IN*/ PEX_CALLBACK_FUNCTION Function,
5723 /*IN*/ PVOID Context,
5724 /*IN OUT*/ PLARGE_INTEGER Cookie);
5729 CmUnRegisterCallback(
5730 /*IN*/ LARGE_INTEGER Cookie);
5734 /** Filesystem runtime library routines **/
5739 FsRtlIsTotalDeviceFailure(
5740 /*IN*/ NTSTATUS Status);
5744 /** Hardware abstraction layer routines **/
5750 /*IN*/ PDEVICE_OBJECT DeviceObject,
5751 /*IN*/ ULONG SectorSize,
5752 /*IN*/ ULONG MBRTypeIdentifier,
5753 /*OUT*/ PVOID Buffer);
5758 READ_PORT_BUFFER_UCHAR(
5760 /*IN*/ PUCHAR Buffer,
5761 /*IN*/ ULONG Count);
5766 READ_PORT_BUFFER_ULONG(
5768 /*IN*/ PULONG Buffer,
5769 /*IN*/ ULONG Count);
5774 READ_PORT_BUFFER_USHORT(
5775 /*IN*/ PUSHORT Port,
5776 /*IN*/ PUSHORT Buffer,
5777 /*IN*/ ULONG Count);
5783 /*IN*/ PUCHAR Port);
5789 /*IN*/ PULONG Port);
5795 /*IN*/ PUSHORT Port);
5800 READ_REGISTER_BUFFER_UCHAR(
5801 /*IN*/ PUCHAR Register,
5802 /*IN*/ PUCHAR Buffer,
5803 /*IN*/ ULONG Count);
5808 READ_REGISTER_BUFFER_ULONG(
5809 /*IN*/ PULONG Register,
5810 /*IN*/ PULONG Buffer,
5811 /*IN*/ ULONG Count);
5816 READ_REGISTER_BUFFER_USHORT(
5817 /*IN*/ PUSHORT Register,
5818 /*IN*/ PUSHORT Buffer,
5819 /*IN*/ ULONG Count);
5824 READ_REGISTER_UCHAR(
5825 /*IN*/ PUCHAR Register);
5830 READ_REGISTER_ULONG(
5831 /*IN*/ PULONG Register);
5836 READ_REGISTER_USHORT(
5837 /*IN*/ PUSHORT Register);
5842 WRITE_PORT_BUFFER_UCHAR(
5844 /*IN*/ PUCHAR Buffer,
5845 /*IN*/ ULONG Count);
5850 WRITE_PORT_BUFFER_ULONG(
5852 /*IN*/ PULONG Buffer,
5853 /*IN*/ ULONG Count);
5858 WRITE_PORT_BUFFER_USHORT(
5859 /*IN*/ PUSHORT Port,
5860 /*IN*/ PUSHORT Buffer,
5861 /*IN*/ ULONG Count);
5868 /*IN*/ UCHAR Value);
5875 /*IN*/ ULONG Value);
5881 /*IN*/ PUSHORT Port,
5882 /*IN*/ USHORT Value);
5887 WRITE_REGISTER_BUFFER_UCHAR(
5888 /*IN*/ PUCHAR Register,
5889 /*IN*/ PUCHAR Buffer,
5890 /*IN*/ ULONG Count);
5895 WRITE_REGISTER_BUFFER_ULONG(
5896 /*IN*/ PULONG Register,
5897 /*IN*/ PULONG Buffer,
5898 /*IN*/ ULONG Count);
5903 WRITE_REGISTER_BUFFER_USHORT(
5904 /*IN*/ PUSHORT Register,
5905 /*IN*/ PUSHORT Buffer,
5906 /*IN*/ ULONG Count);
5911 WRITE_REGISTER_UCHAR(
5912 /*IN*/ PUCHAR Register,
5913 /*IN*/ UCHAR Value);
5918 WRITE_REGISTER_ULONG(
5919 /*IN*/ PULONG Register,
5920 /*IN*/ ULONG Value);
5925 WRITE_REGISTER_USHORT(
5926 /*IN*/ PUSHORT Register,
5927 /*IN*/ USHORT Value);
5929 /** I/O manager routines **/
5934 IoAcquireCancelSpinLock(
5935 /*OUT*/ PKIRQL Irql);
5940 IoAcquireRemoveLockEx(
5941 /*IN*/ PIO_REMOVE_LOCK RemoveLock,
5942 /*IN*/ PVOID Tag /*OPTIONAL*/,
5945 /*IN*/ ULONG RemlockSize);
5949 * IoAcquireRemoveLock(
5950 * IN PIO_REMOVE_LOCK RemoveLock,
5951 * IN PVOID Tag OPTIONAL)
5953 #define IoAcquireRemoveLock(_RemoveLock, \
5955 IoAcquireRemoveLockEx(_RemoveLock, _Tag, __FILE__, __LINE__, sizeof(IO_REMOVE_LOCK))
5959 * IoAdjustPagingPathCount(
5961 * IN BOOLEAN Increment)
5963 #define IoAdjustPagingPathCount(_Count, \
5968 InterlockedIncrement(_Count); \
5972 InterlockedDecrement(_Count); \
5979 IoAllocateController(
5980 /*IN*/ PCONTROLLER_OBJECT ControllerObject,
5981 /*IN*/ PDEVICE_OBJECT DeviceObject,
5982 /*IN*/ PDRIVER_CONTROL ExecutionRoutine,
5983 /*IN*/ PVOID Context);
5988 IoAllocateDriverObjectExtension(
5989 /*IN*/ PDRIVER_OBJECT DriverObject,
5990 /*IN*/ PVOID ClientIdentificationAddress,
5991 /*IN*/ ULONG DriverObjectExtensionSize,
5992 /*OUT*/ PVOID *DriverObjectExtension);
5994 typedef struct _IO_ERROR_LOG_PACKET {
5995 UCHAR MajorFunctionCode;
5997 USHORT DumpDataSize;
5998 USHORT NumberOfStrings;
5999 USHORT StringOffset;
6000 USHORT EventCategory;
6002 ULONG UniqueErrorValue;
6003 NTSTATUS FinalStatus;
6004 ULONG SequenceNumber;
6005 ULONG IoControlCode;
6006 LARGE_INTEGER DeviceOffset;
6008 } IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET;
6013 IoAllocateErrorLogEntry(
6014 /*IN*/ PVOID IoObject,
6015 /*IN*/ UCHAR EntrySize);
6021 /*IN*/ CCHAR StackSize,
6022 /*IN*/ BOOLEAN ChargeQuota);
6028 /*IN*/ PVOID VirtualAddress,
6029 /*IN*/ ULONG Length,
6030 /*IN*/ BOOLEAN SecondaryBuffer,
6031 /*IN*/ BOOLEAN ChargeQuota,
6032 /*IN OUT*/ PIRP Irp /*OPTIONAL*/);
6038 /*IN*/ PDEVICE_OBJECT DeviceObject);
6041 * VOID IoAssignArcName(
6042 * IN PUNICODE_STRING ArcName,
6043 * IN PUNICODE_STRING DeviceName);
6045 #define IoAssignArcName(_ArcName, _DeviceName) ( \
6046 IoCreateSymbolicLink((_ArcName), (_DeviceName)))
6052 /*IN*/ PDEVICE_OBJECT SourceDevice,
6053 /*IN*/ PUNICODE_STRING TargetDevice,
6054 /*OUT*/ PDEVICE_OBJECT *AttachedDevice);
6059 IoAttachDeviceToDeviceStack(
6060 /*IN*/ PDEVICE_OBJECT SourceDevice,
6061 /*IN*/ PDEVICE_OBJECT TargetDevice);
6066 IoBuildAsynchronousFsdRequest(
6067 /*IN*/ ULONG MajorFunction,
6068 /*IN*/ PDEVICE_OBJECT DeviceObject,
6069 /*IN OUT*/ PVOID Buffer /*OPTIONAL*/,
6070 /*IN*/ ULONG Length /*OPTIONAL*/,
6071 /*IN*/ PLARGE_INTEGER StartingOffset /*OPTIONAL*/,
6072 /*IN*/ PIO_STATUS_BLOCK IoStatusBlock /*OPTIONAL*/);
6077 IoBuildDeviceIoControlRequest(
6078 /*IN*/ ULONG IoControlCode,
6079 /*IN*/ PDEVICE_OBJECT DeviceObject,
6080 /*IN*/ PVOID InputBuffer /*OPTIONAL*/,
6081 /*IN*/ ULONG InputBufferLength,
6082 /*OUT*/ PVOID OutputBuffer /*OPTIONAL*/,
6083 /*IN*/ ULONG OutputBufferLength,
6084 /*IN*/ BOOLEAN InternalDeviceIoControl,
6085 /*IN*/ PKEVENT Event,
6086 /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock);
6092 /*IN*/ PMDL SourceMdl,
6093 /*IN OUT*/ PMDL TargetMdl,
6094 /*IN*/ PVOID VirtualAddress,
6095 /*IN*/ ULONG Length);
6100 IoBuildSynchronousFsdRequest(
6101 /*IN*/ ULONG MajorFunction,
6102 /*IN*/ PDEVICE_OBJECT DeviceObject,
6103 /*IN OUT*/ PVOID Buffer /*OPTIONAL*/,
6104 /*IN*/ ULONG Length /*OPTIONAL*/,
6105 /*IN*/ PLARGE_INTEGER StartingOffset /*OPTIONAL*/,
6106 /*IN*/ PKEVENT Event,
6107 /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock);
6113 /*IN*/ PDEVICE_OBJECT DeviceObject,
6114 /*IN OUT*/ PIRP Irp);
6119 * IN PDEVICE_OBJECT DeviceObject,
6122 #define IoCallDriver IofCallDriver
6128 /*IN*/ PDEVICE_OBJECT DeviceObject,
6129 /*IN*/ PFILE_OBJECT FileObject);
6141 /*IN*/ ACCESS_MASK DesiredAccess,
6142 /*IN*/ ULONG DesiredShareAccess,
6143 /*IN OUT*/ PFILE_OBJECT FileObject,
6144 /*IN OUT*/ PSHARE_ACCESS ShareAccess,
6145 /*IN*/ BOOLEAN Update);
6152 /*IN*/ CCHAR PriorityBoost);
6156 * IoCompleteRequest(
6158 * IN CCHAR PriorityBoost)
6160 #define IoCompleteRequest IofCompleteRequest
6166 /*OUT*/ PKINTERRUPT *InterruptObject,
6167 /*IN*/ PKSERVICE_ROUTINE ServiceRoutine,
6168 /*IN*/ PVOID ServiceContext,
6169 /*IN*/ PKSPIN_LOCK SpinLock /*OPTIONAL*/,
6170 /*IN*/ ULONG Vector,
6172 /*IN*/ KIRQL SynchronizeIrql,
6173 /*IN*/ KINTERRUPT_MODE InterruptMode,
6174 /*IN*/ BOOLEAN ShareVector,
6175 /*IN*/ KAFFINITY ProcessorEnableMask,
6176 /*IN*/ BOOLEAN FloatingSave);
6179 * PIO_STACK_LOCATION
6180 * IoGetCurrentIrpStackLocation(
6183 #define IoGetCurrentIrpStackLocation(_Irp) \
6184 ((_Irp)->Tail.Overlay.CurrentStackLocation)
6187 * PIO_STACK_LOCATION
6188 * IoGetNextIrpStackLocation(
6191 #define IoGetNextIrpStackLocation(_Irp) \
6192 ((_Irp)->Tail.Overlay.CurrentStackLocation - 1)
6196 * IoCopyCurrentIrpStackLocationToNext(
6199 #define IoCopyCurrentIrpStackLocationToNext(_Irp) \
6201 PIO_STACK_LOCATION _IrpSp; \
6202 PIO_STACK_LOCATION _NextIrpSp; \
6203 _IrpSp = IoGetCurrentIrpStackLocation(_Irp); \
6204 _NextIrpSp = IoGetNextIrpStackLocation(_Irp); \
6205 RtlCopyMemory(_NextIrpSp, _IrpSp, \
6206 FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine)); \
6207 _NextIrpSp->Control = 0; \
6220 /*IN*/ PDRIVER_OBJECT DriverObject,
6221 /*IN*/ ULONG DeviceExtensionSize,
6222 /*IN*/ PUNICODE_STRING DeviceName /*OPTIONAL*/,
6223 /*IN*/ DEVICE_TYPE DeviceType,
6224 /*IN*/ ULONG DeviceCharacteristics,
6225 /*IN*/ BOOLEAN Exclusive,
6226 /*OUT*/ PDEVICE_OBJECT *DeviceObject);
6232 /*IN*/ PDEVICE_OBJECT DeviceObject,
6233 /*IN*/ PCREATE_DISK Disk);
6239 /*OUT*/ PHANDLE FileHandle,
6240 /*IN*/ ACCESS_MASK DesiredAccess,
6241 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes,
6242 /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock,
6243 /*IN*/ PLARGE_INTEGER AllocationSize /*OPTIONAL*/,
6244 /*IN*/ ULONG FileAttributes,
6245 /*IN*/ ULONG ShareAccess,
6246 /*IN*/ ULONG Disposition,
6247 /*IN*/ ULONG CreateOptions,
6248 /*IN*/ PVOID EaBuffer /*OPTIONAL*/,
6249 /*IN*/ ULONG EaLength,
6250 /*IN*/ CREATE_FILE_TYPE CreateFileType,
6251 /*IN*/ PVOID ExtraCreateParameters /*OPTIONAL*/,
6252 /*IN*/ ULONG Options);
6257 IoCreateNotificationEvent(
6258 /*IN*/ PUNICODE_STRING EventName,
6259 /*OUT*/ PHANDLE EventHandle);
6264 IoCreateSymbolicLink(
6265 /*IN*/ PUNICODE_STRING SymbolicLinkName,
6266 /*IN*/ PUNICODE_STRING DeviceName);
6271 IoCreateSynchronizationEvent(
6272 /*IN*/ PUNICODE_STRING EventName,
6273 /*OUT*/ PHANDLE EventHandle);
6278 IoCreateUnprotectedSymbolicLink(
6279 /*IN*/ PUNICODE_STRING SymbolicLinkName,
6280 /*IN*/ PUNICODE_STRING DeviceName);
6287 /*IN*/ PIO_CSQ_INSERT_IRP CsqInsertIrp,
6288 /*IN*/ PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
6289 /*IN*/ PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
6290 /*IN*/ PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
6291 /*IN*/ PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
6292 /*IN*/ PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp);
6300 /*IN*/ PIO_CSQ_IRP_CONTEXT Context);
6307 /*IN*/ PIO_CSQ_IRP_CONTEXT Context);
6314 /*IN*/ PVOID PeekContext);
6320 /*IN*/ PCONTROLLER_OBJECT ControllerObject);
6326 /*IN*/ PDEVICE_OBJECT DeviceObject);
6331 IoDeleteSymbolicLink(
6332 /*IN*/ PUNICODE_STRING SymbolicLinkName);
6336 * IoDeassignArcName(
6337 * IN PUNICODE_STRING ArcName)
6339 #define IoDeassignArcName IoDeleteSymbolicLink
6345 /*IN OUT*/ PDEVICE_OBJECT TargetDevice);
6350 IoDisconnectInterrupt(
6351 /*IN*/ PKINTERRUPT InterruptObject);
6356 IoForwardIrpSynchronously(
6357 /*IN*/ PDEVICE_OBJECT DeviceObject,
6360 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
6366 /*IN*/ PCONTROLLER_OBJECT ControllerObject);
6371 IoFreeErrorLogEntry(
6390 /*IN*/ PIO_WORKITEM pIOWorkItem);
6395 IoGetAttachedDevice(
6396 /*IN*/ PDEVICE_OBJECT DeviceObject);
6401 IoGetAttachedDeviceReference(
6402 /*IN*/ PDEVICE_OBJECT DeviceObject);
6407 IoGetBootDiskInformation(
6408 /*IN OUT*/ PBOOTDISK_INFORMATION BootDiskInformation,
6412 PCONFIGURATION_INFORMATION
6414 IoGetConfigurationInformation(
6420 IoGetCurrentProcess(
6426 IoGetDeviceInterfaceAlias(
6427 /*IN*/ PUNICODE_STRING SymbolicLinkName,
6428 /*IN*/ CONST GUID *AliasInterfaceClassGuid,
6429 /*OUT*/ PUNICODE_STRING AliasSymbolicLinkName);
6434 IoGetDeviceInterfaces(
6435 /*IN*/ CONST GUID *InterfaceClassGuid,
6436 /*IN*/ PDEVICE_OBJECT PhysicalDeviceObject /*OPTIONAL*/,
6438 /*OUT*/ PWSTR *SymbolicLinkList);
6443 IoGetDeviceObjectPointer(
6444 /*IN*/ PUNICODE_STRING ObjectName,
6445 /*IN*/ ACCESS_MASK DesiredAccess,
6446 /*OUT*/ PFILE_OBJECT *FileObject,
6447 /*OUT*/ PDEVICE_OBJECT *DeviceObject);
6452 IoGetDeviceProperty(
6453 /*IN*/ PDEVICE_OBJECT DeviceObject,
6454 /*IN*/ DEVICE_REGISTRY_PROPERTY DeviceProperty,
6455 /*IN*/ ULONG BufferLength,
6456 /*OUT*/ PVOID PropertyBuffer,
6457 /*OUT*/ PULONG ResultLength);
6462 IoGetDeviceToVerify(
6463 /*IN*/ PETHREAD Thread);
6469 /*IN*/ PDEVICE_OBJECT PhysicalDeviceObject,
6470 /*IN*/ PDEVICE_DESCRIPTION DeviceDescription,
6471 /*IN OUT*/ PULONG NumberOfMapRegisters);
6476 IoGetDriverObjectExtension(
6477 /*IN*/ PDRIVER_OBJECT DriverObject,
6478 /*IN*/ PVOID ClientIdentificationAddress);
6483 IoGetFileObjectGenericMapping(
6488 * IoGetFunctionCodeFromCtlCode(
6489 * IN ULONG ControlCode)
6491 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
6492 (((_ControlCode) >> 2) & 0x00000FFF)
6503 IoGetRelatedDeviceObject(
6504 /*IN*/ PFILE_OBJECT FileObject);
6509 IoGetRemainingStackSize(
6516 /*OUT*/ PULONG_PTR LowLimit,
6517 /*OUT*/ PULONG_PTR HighLimit);
6524 /*IN*/ PKDEFERRED_ROUTINE DeferredRoutine,
6525 /*IN*/ PVOID DeferredContext);
6529 * IoInitializeDpcRequest(
6530 * IN PDEVICE_OBJECT DeviceObject,
6531 * IN PIO_DPC_ROUTINE DpcRoutine)
6533 #define IoInitializeDpcRequest(_DeviceObject, \
6535 KeInitializeDpc(&(_DeviceObject)->Dpc, \
6536 (PKDEFERRED_ROUTINE) (_DpcRoutine), \
6543 /*IN OUT*/ PIRP Irp,
6544 /*IN*/ USHORT PacketSize,
6545 /*IN*/ CCHAR StackSize);
6550 IoInitializeRemoveLockEx(
6551 /*IN*/ PIO_REMOVE_LOCK Lock,
6552 /*IN*/ ULONG AllocateTag,
6553 /*IN*/ ULONG MaxLockedMinutes,
6554 /*IN*/ ULONG HighWatermark,
6555 /*IN*/ ULONG RemlockSize);
6558 * IoInitializeRemoveLock(
6559 * IN PIO_REMOVE_LOCK Lock,
6560 * IN ULONG AllocateTag,
6561 * IN ULONG MaxLockedMinutes,
6562 * IN ULONG HighWatermark)
6564 #define IoInitializeRemoveLock( \
6565 Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
6566 IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
6567 HighWatermark, sizeof(IO_REMOVE_LOCK))
6573 /*IN*/ PDEVICE_OBJECT DeviceObject,
6574 /*IN*/ PIO_TIMER_ROUTINE TimerRoutine,
6575 /*IN*/ PVOID Context);
6580 IoInvalidateDeviceRelations(
6581 /*IN*/ PDEVICE_OBJECT DeviceObject,
6582 /*IN*/ DEVICE_RELATION_TYPE Type);
6587 IoInvalidateDeviceState(
6588 /*IN*/ PDEVICE_OBJECT PhysicalDeviceObject);
6594 /*IN*/ PIRP Irp /*OPTIONAL*/);
6598 * IoIsErrorUserInduced(
6599 * IN NTSTATUS Status);
6601 #define IoIsErrorUserInduced(Status) \
6602 ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
6603 ((Status) == STATUS_IO_TIMEOUT) || \
6604 ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
6605 ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
6606 ((Status) == STATUS_VERIFY_REQUIRED) || \
6607 ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
6608 ((Status) == STATUS_WRONG_VOLUME)))
6613 IoIsWdmVersionAvailable(
6614 /*IN*/ UCHAR MajorVersion,
6615 /*IN*/ UCHAR MinorVersion);
6620 IoMakeAssociatedIrp(
6622 /*IN*/ CCHAR StackSize);
6629 #define IoMarkIrpPending(_Irp) \
6630 (IoGetCurrentIrpStackLocation(_Irp)->Control |= SL_PENDING_RETURNED)
6635 IoOpenDeviceInterfaceRegistryKey(
6636 /*IN*/ PUNICODE_STRING SymbolicLinkName,
6637 /*IN*/ ACCESS_MASK DesiredAccess,
6638 /*OUT*/ PHANDLE DeviceInterfaceKey);
6643 IoOpenDeviceRegistryKey(
6644 /*IN*/ PDEVICE_OBJECT DeviceObject,
6645 /*IN*/ ULONG DevInstKeyType,
6646 /*IN*/ ACCESS_MASK DesiredAccess,
6647 /*OUT*/ PHANDLE DevInstRegKey);
6652 IoQueryDeviceDescription(
6653 /*IN*/ PINTERFACE_TYPE BusType /*OPTIONAL*/,
6654 /*IN*/ PULONG BusNumber /*OPTIONAL*/,
6655 /*IN*/ PCONFIGURATION_TYPE ControllerType /*OPTIONAL*/,
6656 /*IN*/ PULONG ControllerNumber /*OPTIONAL*/,
6657 /*IN*/ PCONFIGURATION_TYPE PeripheralType /*OPTIONAL*/,
6658 /*IN*/ PULONG PeripheralNumber /*OPTIONAL*/,
6659 /*IN*/ PIO_QUERY_DEVICE_ROUTINE CalloutRoutine,
6660 /*IN*/ PVOID Context);
6666 /*IN*/ PIO_WORKITEM pIOWorkItem,
6667 /*IN*/ PIO_WORKITEM_ROUTINE Routine,
6668 /*IN*/ WORK_QUEUE_TYPE QueueType,
6669 /*IN*/ PVOID Context);
6676 /*IN*/ PVPB Vpb /*OPTIONAL*/,
6677 /*IN*/ PDEVICE_OBJECT RealDeviceObject);
6682 IoRaiseInformationalHardError(
6683 /*IN*/ NTSTATUS ErrorStatus,
6684 /*IN*/ PUNICODE_STRING String /*OPTIONAL*/,
6685 /*IN*/ PKTHREAD Thread /*OPTIONAL*/);
6690 IoReadDiskSignature(
6691 /*IN*/ PDEVICE_OBJECT DeviceObject,
6692 /*IN*/ ULONG BytesPerSector,
6693 /*OUT*/ PDISK_SIGNATURE Signature);
6698 IoReadPartitionTableEx(
6699 /*IN*/ PDEVICE_OBJECT DeviceObject,
6700 /*IN*/ struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer);
6705 IoRegisterBootDriverReinitialization(
6706 /*IN*/ PDRIVER_OBJECT DriverObject,
6707 /*IN*/ PDRIVER_REINITIALIZE DriverReinitializationRoutine,
6708 /*IN*/ PVOID Context);
6713 IoRegisterBootDriverReinitialization(
6714 /*IN*/ PDRIVER_OBJECT DriverObject,
6715 /*IN*/ PDRIVER_REINITIALIZE DriverReinitializationRoutine,
6716 /*IN*/ PVOID Context);
6721 IoRegisterDeviceInterface(
6722 /*IN*/ PDEVICE_OBJECT PhysicalDeviceObject,
6723 /*IN*/ CONST GUID *InterfaceClassGuid,
6724 /*IN*/ PUNICODE_STRING ReferenceString /*OPTIONAL*/,
6725 /*OUT*/ PUNICODE_STRING SymbolicLinkName);
6730 IoRegisterDriverReinitialization(
6731 /*IN*/ PDRIVER_OBJECT DriverObject,
6732 /*IN*/ PDRIVER_REINITIALIZE DriverReinitializationRoutine,
6733 /*IN*/ PVOID Context);
6738 IoRegisterPlugPlayNotification(
6739 /*IN*/ IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
6740 /*IN*/ ULONG EventCategoryFlags,
6741 /*IN*/ PVOID EventCategoryData /*OPTIONAL*/,
6742 /*IN*/ PDRIVER_OBJECT DriverObject,
6743 /*IN*/ PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine,
6744 /*IN*/ PVOID Context,
6745 /*OUT*/ PVOID *NotificationEntry);
6750 IoRegisterShutdownNotification(
6751 /*IN*/ PDEVICE_OBJECT DeviceObject);
6756 IoReleaseCancelSpinLock(
6762 IoReleaseRemoveLockAndWaitEx(
6763 /*IN*/ PIO_REMOVE_LOCK RemoveLock,
6765 /*IN*/ ULONG RemlockSize);
6769 * IoReleaseRemoveLockAndWait(
6770 * IN PIO_REMOVE_LOCK RemoveLock,
6773 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
6775 IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
6780 IoReleaseRemoveLockEx(
6781 /*IN*/ PIO_REMOVE_LOCK RemoveLock,
6783 /*IN*/ ULONG RemlockSize);
6787 * IoReleaseRemoveLock(
6788 * IN PIO_REMOVE_LOCK RemoveLock,
6791 #define IoReleaseRemoveLock(_RemoveLock, \
6793 IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
6798 IoRemoveShareAccess(
6799 /*IN*/ PFILE_OBJECT FileObject,
6800 /*IN OUT*/ PSHARE_ACCESS ShareAccess);
6805 IoReportDetectedDevice(
6806 /*IN*/ PDRIVER_OBJECT DriverObject,
6807 /*IN*/ INTERFACE_TYPE LegacyBusType,
6808 /*IN*/ ULONG BusNumber,
6809 /*IN*/ ULONG SlotNumber,
6810 /*IN*/ PCM_RESOURCE_LIST ResourceList,
6811 /*IN*/ PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements /*OPTIONAL*/,
6812 /*IN*/ BOOLEAN ResourceAssigned,
6813 /*IN OUT*/ PDEVICE_OBJECT *DeviceObject);
6818 IoReportResourceForDetection(
6819 /*IN*/ PDRIVER_OBJECT DriverObject,
6820 /*IN*/ PCM_RESOURCE_LIST DriverList /*OPTIONAL*/,
6821 /*IN*/ ULONG DriverListSize /*OPTIONAL*/,
6822 /*IN*/ PDEVICE_OBJECT DeviceObject /*OPTIONAL*/,
6823 /*IN*/ PCM_RESOURCE_LIST DeviceList /*OPTIONAL*/,
6824 /*IN*/ ULONG DeviceListSize /*OPTIONAL*/,
6825 /*OUT*/ PBOOLEAN ConflictDetected);
6830 IoReportResourceUsage(
6831 /*IN*/ PUNICODE_STRING DriverClassName /*OPTIONAL*/,
6832 /*IN*/ PDRIVER_OBJECT DriverObject,
6833 /*IN*/ PCM_RESOURCE_LIST DriverList /*OPTIONAL*/,
6834 /*IN*/ ULONG DriverListSize /*OPTIONAL*/,
6835 /*IN*/ PDEVICE_OBJECT DeviceObject,
6836 /*IN*/ PCM_RESOURCE_LIST DeviceList /*OPTIONAL*/,
6837 /*IN*/ ULONG DeviceListSize /*OPTIONAL*/,
6838 /*IN*/ BOOLEAN OverrideConflict,
6839 /*OUT*/ PBOOLEAN ConflictDetected);
6844 IoReportTargetDeviceChange(
6845 /*IN*/ PDEVICE_OBJECT PhysicalDeviceObject,
6846 /*IN*/ PVOID NotificationStructure);
6851 IoReportTargetDeviceChangeAsynchronous(
6852 /*IN*/ PDEVICE_OBJECT PhysicalDeviceObject,
6853 /*IN*/ PVOID NotificationStructure,
6854 /*IN*/ PDEVICE_CHANGE_COMPLETE_CALLBACK Callback /*OPTIONAL*/,
6855 /*IN*/ PVOID Context /*OPTIONAL*/);
6860 IoRequestDeviceEject(
6861 /*IN*/ PDEVICE_OBJECT PhysicalDeviceObject);
6866 * IN PDEVICE_OBJECT DeviceObject,
6868 * IN PVOID Context);
6870 #define IoRequestDpc(DeviceObject, Irp, Context)( \
6871 KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
6877 /*IN OUT*/ PIRP Irp,
6878 /*IN*/ NTSTATUS Status);
6882 * IoSetCancelRoutine(
6884 * IN PDRIVER_CANCEL CancelRoutine)
6886 #define IoSetCancelRoutine(_Irp, \
6888 ((PDRIVER_CANCEL) InterlockedExchangePointer( \
6889 (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (_CancelRoutine)))
6893 * IoSetCompletionRoutine(
6895 * IN PIO_COMPLETION_ROUTINE CompletionRoutine,
6897 * IN BOOLEAN InvokeOnSuccess,
6898 * IN BOOLEAN InvokeOnError,
6899 * IN BOOLEAN InvokeOnCancel)
6901 #define IoSetCompletionRoutine(_Irp, \
6902 _CompletionRoutine, \
6908 PIO_STACK_LOCATION _IrpSp; \
6909 ASSERT(_InvokeOnSuccess || _InvokeOnError || _InvokeOnCancel ? \
6910 _CompletionRoutine != NULL : TRUE); \
6911 _IrpSp = IoGetNextIrpStackLocation(_Irp); \
6912 _IrpSp->CompletionRoutine = (PIO_COMPLETION_ROUTINE)(_CompletionRoutine); \
6913 _IrpSp->Context = (_Context); \
6914 _IrpSp->Control = 0; \
6915 if (_InvokeOnSuccess) _IrpSp->Control = SL_INVOKE_ON_SUCCESS; \
6916 if (_InvokeOnError) _IrpSp->Control |= SL_INVOKE_ON_ERROR; \
6917 if (_InvokeOnCancel) _IrpSp->Control |= SL_INVOKE_ON_CANCEL; \
6923 IoSetCompletionRoutineEx(
6924 /*IN*/ PDEVICE_OBJECT DeviceObject,
6926 /*IN*/ PIO_COMPLETION_ROUTINE CompletionRoutine,
6927 /*IN*/ PVOID Context,
6928 /*IN*/ BOOLEAN InvokeOnSuccess,
6929 /*IN*/ BOOLEAN InvokeOnError,
6930 /*IN*/ BOOLEAN InvokeOnCancel);
6935 IoSetDeviceInterfaceState(
6936 /*IN*/ PUNICODE_STRING SymbolicLinkName,
6937 /*IN*/ BOOLEAN Enable);
6942 IoSetHardErrorOrVerifyDevice(
6944 /*IN*/ PDEVICE_OBJECT DeviceObject);
6948 * IoSetNextIrpStackLocation(
6951 #define IoSetNextIrpStackLocation(_Irp) \
6953 (_Irp)->CurrentLocation--; \
6954 (_Irp)->Tail.Overlay.CurrentStackLocation--; \
6960 IoSetPartitionInformationEx(
6961 /*IN*/ PDEVICE_OBJECT DeviceObject,
6962 /*IN*/ ULONG PartitionNumber,
6963 /*IN*/ struct _SET_PARTITION_INFORMATION_EX *PartitionInfo);
6969 /*IN*/ ACCESS_MASK DesiredAccess,
6970 /*IN*/ ULONG DesiredShareAccess,
6971 /*IN OUT*/ PFILE_OBJECT FileObject,
6972 /*OUT*/ PSHARE_ACCESS ShareAccess);
6977 IoSetStartIoAttributes(
6978 /*IN*/ PDEVICE_OBJECT DeviceObject,
6979 /*IN*/ BOOLEAN DeferredStartIo,
6980 /*IN*/ BOOLEAN NonCancelable);
6985 IoSetSystemPartition(
6986 /*IN*/ PUNICODE_STRING VolumeNameString);
6991 IoSetThreadHardErrorMode(
6992 /*IN*/ BOOLEAN EnableHardErrors);
6997 * IN CCHAR StackSize)
6999 #define IoSizeOfIrp(_StackSize) \
7000 ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
7004 * IoSkipCurrentIrpStackLocation(
7007 #define IoSkipCurrentIrpStackLocation(_Irp) \
7009 (_Irp)->CurrentLocation++; \
7010 (_Irp)->Tail.Overlay.CurrentStackLocation++; \
7017 /*IN*/ PDEVICE_OBJECT DeviceObject,
7018 /*IN*/ BOOLEAN Cancelable);
7023 IoStartNextPacketByKey(
7024 /*IN*/ PDEVICE_OBJECT DeviceObject,
7025 /*IN*/ BOOLEAN Cancelable,
7032 /*IN*/ PDEVICE_OBJECT DeviceObject,
7034 /*IN*/ PULONG Key /*OPTIONAL*/,
7035 /*IN*/ PDRIVER_CANCEL CancelFunction /*OPTIONAL*/);
7041 /*IN*/ PDEVICE_OBJECT DeviceObject);
7047 /*IN*/ PDEVICE_OBJECT DeviceObject);
7052 IoUnregisterPlugPlayNotification(
7053 /*IN*/ PVOID NotificationEntry);
7058 IoUnregisterShutdownNotification(
7059 /*IN*/ PDEVICE_OBJECT DeviceObject);
7064 IoUpdateShareAccess(
7065 /*IN*/ PFILE_OBJECT FileObject,
7066 /*IN OUT*/ PSHARE_ACCESS ShareAccess);
7071 IoVerifyPartitionTable(
7072 /*IN*/ PDEVICE_OBJECT DeviceObject,
7073 /*IN*/ BOOLEAN FixErrors);
7078 IoVolumeDeviceToDosName(
7079 /*IN*/ PVOID VolumeDeviceObject,
7080 /*OUT*/ PUNICODE_STRING DosName);
7085 IoWMIAllocateInstanceIds(
7087 /*IN*/ ULONG InstanceCount,
7088 /*OUT*/ ULONG *FirstInstanceId);
7093 IoWMIDeviceObjectToProviderId(
7094 /*IN*/ PDEVICE_OBJECT DeviceObject);
7099 IoWMIDeviceObjectToInstanceName(
7100 /*IN*/ PVOID DataBlockObject,
7101 /*IN*/ PDEVICE_OBJECT DeviceObject,
7102 /*OUT*/ PUNICODE_STRING InstanceName);
7108 /*IN*/ PVOID DataBlockObject,
7109 /*IN*/ PUNICODE_STRING InstanceName,
7110 /*IN*/ ULONG MethodId,
7111 /*IN*/ ULONG InBufferSize,
7112 /*IN OUT*/ PULONG OutBufferSize,
7113 /*IN OUT*/ PUCHAR InOutBuffer);
7118 IoWMIHandleToInstanceName(
7119 /*IN*/ PVOID DataBlockObject,
7120 /*IN*/ HANDLE FileHandle,
7121 /*OUT*/ PUNICODE_STRING InstanceName);
7127 /*IN*/ GUID *DataBlockGuid,
7128 /*IN*/ ULONG DesiredAccess,
7129 /*OUT*/ PVOID *DataBlockObject);
7135 /*IN*/ PVOID DataBlockObject,
7136 /*IN OUT*/ ULONG *InOutBufferSize,
7137 /*OUT*/ PVOID OutBuffer);
7142 IoWMIQueryAllDataMultiple(
7143 /*IN*/ PVOID *DataBlockObjectList,
7144 /*IN*/ ULONG ObjectCount,
7145 /*IN OUT*/ ULONG *InOutBufferSize,
7146 /*OUT*/ PVOID OutBuffer);
7151 IoWMIQuerySingleInstance(
7152 /*IN*/ PVOID DataBlockObject,
7153 /*IN*/ PUNICODE_STRING InstanceName,
7154 /*IN OUT*/ ULONG *InOutBufferSize,
7155 /*OUT*/ PVOID OutBuffer);
7160 IoWMIQuerySingleInstanceMultiple(
7161 /*IN*/ PVOID *DataBlockObjectList,
7162 /*IN*/ PUNICODE_STRING InstanceNames,
7163 /*IN*/ ULONG ObjectCount,
7164 /*IN OUT*/ ULONG *InOutBufferSize,
7165 /*OUT*/ PVOID OutBuffer);
7170 IoWMIRegistrationControl(
7171 /*IN*/ PDEVICE_OBJECT DeviceObject,
7172 /*IN*/ ULONG Action);
7177 IoWMISetNotificationCallback(
7178 /*IN*/ PVOID Object,
7179 /*IN*/ WMI_NOTIFICATION_CALLBACK Callback,
7180 /*IN*/ PVOID Context);
7185 IoWMISetSingleInstance(
7186 /*IN*/ PVOID DataBlockObject,
7187 /*IN*/ PUNICODE_STRING InstanceName,
7188 /*IN*/ ULONG Version,
7189 /*IN*/ ULONG ValueBufferSize,
7190 /*IN*/ PVOID ValueBuffer);
7196 /*IN*/ PVOID DataBlockObject,
7197 /*IN*/ PUNICODE_STRING InstanceName,
7198 /*IN*/ ULONG DataItemId,
7199 /*IN*/ ULONG Version,
7200 /*IN*/ ULONG ValueBufferSize,
7201 /*IN*/ PVOID ValueBuffer);
7206 IoWMISuggestInstanceName(
7207 /*IN*/ PDEVICE_OBJECT PhysicalDeviceObject /*OPTIONAL*/,
7208 /*IN*/ PUNICODE_STRING SymbolicLinkName /*OPTIONAL*/,
7209 /*IN*/ BOOLEAN CombineNames,
7210 /*OUT*/ PUNICODE_STRING SuggestedInstanceName);
7216 /*IN*/ PVOID WnodeEventItem);
7221 IoWriteErrorLogEntry(
7222 /*IN*/ PVOID ElEntry);
7227 IoWritePartitionTableEx(
7228 /*IN*/ PDEVICE_OBJECT DeviceObject,
7229 /*IN*/ struct _DRIVE_LAYOUT_INFORMATION_EX *PartitionBuffer);
7233 /** Kernel routines **/
7238 KeAcquireInStackQueuedSpinLock(
7239 /*IN*/ PKSPIN_LOCK SpinLock,
7240 /*IN*/ PKLOCK_QUEUE_HANDLE LockHandle);
7245 KeAcquireInStackQueuedSpinLockAtDpcLevel(
7246 /*IN*/ PKSPIN_LOCK SpinLock,
7247 /*IN*/ PKLOCK_QUEUE_HANDLE LockHandle);
7252 KeAcquireInterruptSpinLock(
7253 /*IN*/ PKINTERRUPT Interrupt);
7259 /*IN*/ PKSPIN_LOCK SpinLock,
7260 /*OUT*/ PKIRQL OldIrql);
7262 /* System Service Dispatch Table */
7263 typedef PVOID (NTAPI * SSDT)(VOID);
7264 typedef SSDT * PSSDT;
7266 /* System Service Parameters Table */
7267 typedef UCHAR SSPT, * PSSPT;
7269 typedef struct _SSDT_ENTRY {
7271 PULONG ServiceCounterTable;
7272 ULONG NumberOfServices;
7274 } SSDT_ENTRY, *PSSDT_ENTRY;
7279 KeAddSystemServiceTable(
7281 /*IN*/ PULONG ServiceCounterTable,
7282 /*IN*/ ULONG NumberOfServices,
7284 /*IN*/ ULONG TableIndex);
7296 /*IN*/ PEPROCESS Process);
7302 /*IN*/ ULONG BugCheckCode);
7308 /*IN*/ ULONG BugCheckCode,
7309 /*IN*/ ULONG_PTR BugCheckParameter1,
7310 /*IN*/ ULONG_PTR BugCheckParameter2,
7311 /*IN*/ ULONG_PTR BugCheckParameter3,
7312 /*IN*/ ULONG_PTR BugCheckParameter4);
7318 /*IN*/ PKTIMER Timer);
7324 /*IN*/ PRKEVENT Event);
7329 KeDelayExecutionThread(
7330 /*IN*/ KPROCESSOR_MODE WaitMode,
7331 /*IN*/ BOOLEAN Alertable,
7332 /*IN*/ PLARGE_INTEGER Interval);
7337 KeDeregisterBugCheckCallback(
7338 /*IN*/ PKBUGCHECK_CALLBACK_RECORD CallbackRecord);
7349 KeEnterCriticalRegion(
7356 * IN BOOLEAN ReadOperation,
7357 * IN BOOLEAN DmaOperation)
7359 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
7364 KeFlushQueuedDpcs(VOID);
7381 KeGetRecommendedSharedDataAlignment(
7389 /*IN*/ PKTHREAD Thread,
7390 /*IN*/ UCHAR StateIndex,
7391 /*IN*/ PKKERNEL_ROUTINE KernelRoutine,
7392 /*IN*/ PKRUNDOWN_ROUTINE RundownRoutine,
7393 /*IN*/ PKNORMAL_ROUTINE NormalRoutine,
7395 /*IN*/ PVOID Context);
7400 KeInitializeDeviceQueue(
7401 /*IN*/ PKDEVICE_QUEUE DeviceQueue);
7407 /*IN*/ PRKMUTEX Mutex,
7408 /*IN*/ ULONG Level);
7413 KeInitializeSemaphore(
7414 /*IN*/ PRKSEMAPHORE Semaphore,
7421 KeInitializeSpinLock(
7422 /*IN*/ PKSPIN_LOCK SpinLock);
7428 /*IN*/ PKTIMER Timer);
7433 KeInitializeTimerEx(
7434 /*IN*/ PKTIMER Timer,
7435 /*IN*/ TIMER_TYPE Type);
7440 KeInsertByKeyDeviceQueue(
7441 /*IN*/ PKDEVICE_QUEUE DeviceQueue,
7442 /*IN*/ PKDEVICE_QUEUE_ENTRY DeviceQueueEntry,
7443 /*IN*/ ULONG SortKey);
7448 KeInsertDeviceQueue(
7449 /*IN*/ PKDEVICE_QUEUE DeviceQueue,
7450 /*IN*/ PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
7457 /*IN*/ PVOID SystemArgument1,
7458 /*IN*/ PVOID SystemArgument2);
7463 KeLeaveCriticalRegion(
7466 #define KeMemoryBarrier() asm("mfence;")
7472 /*IN*/ PRKEVENT Event,
7473 /*IN*/ KPRIORITY Increment,
7474 /*IN*/ BOOLEAN Wait);
7479 KeQueryInterruptTime(
7485 KeQueryPerformanceCounter(
7486 /*OUT*/ PLARGE_INTEGER PerformanceFrequency /*OPTIONAL*/);
7491 KeQueryPriorityThread(
7492 /*IN*/ PRKTHREAD Thread);
7498 /*OUT*/ PLARGE_INTEGER CurrentTime);
7504 /*OUT*/ PLARGE_INTEGER TickCount);
7509 KeQueryTimeIncrement(
7516 /*IN*/ PRKEVENT Event);
7522 /*IN*/ PRKMUTEX Mutex);
7527 KeReadStateSemaphore(
7528 /*IN*/ PRKSEMAPHORE Semaphore);
7534 /*IN*/ PKTIMER Timer);
7539 KeRegisterBugCheckCallback(
7540 /*IN*/ PKBUGCHECK_CALLBACK_RECORD CallbackRecord,
7541 /*IN*/ PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine,
7542 /*IN*/ PVOID Buffer,
7543 /*IN*/ ULONG Length,
7544 /*IN*/ PUCHAR Component);
7549 KeReleaseInStackQueuedSpinLock(
7550 /*IN*/ PKLOCK_QUEUE_HANDLE LockHandle);
7555 KeReleaseInStackQueuedSpinLockFromDpcLevel(
7556 /*IN*/ PKLOCK_QUEUE_HANDLE LockHandle);
7561 KeReleaseInterruptSpinLock(
7562 /*IN*/ PKINTERRUPT Interrupt,
7563 /*IN*/ KIRQL OldIrql);
7569 /*IN*/ PRKMUTEX Mutex,
7570 /*IN*/ BOOLEAN Wait);
7576 /*IN*/ PRKSEMAPHORE Semaphore,
7577 /*IN*/ KPRIORITY Increment,
7578 /*IN*/ LONG Adjustment,
7579 /*IN*/ BOOLEAN Wait);
7585 /*IN*/ PKSPIN_LOCK SpinLock,
7586 /*IN*/ KIRQL NewIrql);
7589 PKDEVICE_QUEUE_ENTRY
7591 KeRemoveByKeyDeviceQueue(
7592 /*IN*/ PKDEVICE_QUEUE DeviceQueue,
7593 /*IN*/ ULONG SortKey);
7596 PKDEVICE_QUEUE_ENTRY
7598 KeRemoveDeviceQueue(
7599 /*IN*/ PKDEVICE_QUEUE DeviceQueue);
7604 KeRemoveEntryDeviceQueue(
7605 /*IN*/ PKDEVICE_QUEUE DeviceQueue,
7606 /*IN*/ PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
7618 /*IN*/ PRKEVENT Event);
7623 KeRestoreFloatingPointState(
7624 /*IN*/ PKFLOATING_SAVE FloatSave);
7629 KeSaveFloatingPointState(
7630 /*OUT*/ PKFLOATING_SAVE FloatSave);
7635 KeSetBasePriorityThread(
7636 /*IN*/ PRKTHREAD Thread,
7637 /*IN*/ LONG Increment);
7643 /*IN*/ PRKEVENT Event,
7644 /*IN*/ KPRIORITY Increment,
7645 /*IN*/ BOOLEAN Wait);
7652 /*IN*/ KDPC_IMPORTANCE Importance);
7657 KeSetPriorityThread(
7658 /*IN*/ PKTHREAD Thread,
7659 /*IN*/ KPRIORITY Priority);
7664 KeSetTargetProcessorDpc(
7666 /*IN*/ CCHAR Number);
7672 /*IN*/ PKTIMER Timer,
7673 /*IN*/ LARGE_INTEGER DueTime,
7674 /*IN*/ PKDPC Dpc /*OPTIONAL*/);
7680 /*IN*/ PKTIMER Timer,
7681 /*IN*/ LARGE_INTEGER DueTime,
7682 /*IN*/ LONG Period /*OPTIONAL*/,
7683 /*IN*/ PKDPC Dpc /*OPTIONAL*/);
7688 KeSetTimeUpdateNotifyRoutine(
7689 /*IN*/ PTIME_UPDATE_NOTIFY_ROUTINE NotifyRoutine);
7694 KeStallExecutionProcessor(
7695 /*IN*/ ULONG MicroSeconds);
7700 KeSynchronizeExecution(
7701 /*IN*/ PKINTERRUPT Interrupt,
7702 /*IN*/ PKSYNCHRONIZE_ROUTINE SynchronizeRoutine,
7703 /*IN*/ PVOID SynchronizeContext);
7708 KeWaitForMultipleObjects(
7710 /*IN*/ PVOID Object[],
7711 /*IN*/ WAIT_TYPE WaitType,
7712 /*IN*/ KWAIT_REASON WaitReason,
7713 /*IN*/ KPROCESSOR_MODE WaitMode,
7714 /*IN*/ BOOLEAN Alertable,
7715 /*IN*/ PLARGE_INTEGER Timeout /*OPTIONAL */,
7716 /*IN*/ PKWAIT_BLOCK WaitBlockArray /*OPTIONAL*/);
7721 KeWaitForMutexObject(
7722 /*IN*/ PRKMUTEX Mutex,
7723 /*IN*/ KWAIT_REASON WaitReason,
7724 /*IN*/ KPROCESSOR_MODE WaitMode,
7725 /*IN*/ BOOLEAN Alertable,
7726 /*IN*/ PLARGE_INTEGER Timeout /*OPTIONAL*/);
7731 KeWaitForSingleObject(
7732 /*IN*/ PVOID Object,
7733 /*IN*/ KWAIT_REASON WaitReason,
7734 /*IN*/ KPROCESSOR_MODE WaitMode,
7735 /*IN*/ BOOLEAN Alertable,
7736 /*IN*/ PLARGE_INTEGER Timeout /*OPTIONAL*/);
7742 /*IN*/ KIRQL new_irql,
7743 /*OUT*/ PKIRQL old_irql);
7754 KeRaiseIrqlToDpcLevel(
7757 /** Memory manager routines **/
7764 /*IN*/ ULONG NumberOfBytes);
7769 MmAllocateContiguousMemory(
7770 /*IN*/ ULONG NumberOfBytes,
7771 /*IN*/ PHYSICAL_ADDRESS HighestAcceptableAddress);
7776 MmAllocateContiguousMemorySpecifyCache(
7777 /*IN*/ SIZE_T NumberOfBytes,
7778 /*IN*/ PHYSICAL_ADDRESS LowestAcceptableAddress,
7779 /*IN*/ PHYSICAL_ADDRESS HighestAcceptableAddress,
7780 /*IN*/ PHYSICAL_ADDRESS BoundaryAddressMultiple /*OPTIONAL*/,
7781 /*IN*/ MEMORY_CACHING_TYPE CacheType);
7786 MmAllocateMappingAddress(
7787 /*IN*/ SIZE_T NumberOfBytes,
7788 /*IN*/ ULONG PoolTag);
7793 MmAllocateNonCachedMemory(
7794 /*IN*/ ULONG NumberOfBytes);
7799 MmAllocatePagesForMdl(
7800 /*IN*/ PHYSICAL_ADDRESS LowAddress,
7801 /*IN*/ PHYSICAL_ADDRESS HighAddress,
7802 /*IN*/ PHYSICAL_ADDRESS SkipBytes,
7803 /*IN*/ SIZE_T TotalBytes);
7808 MmBuildMdlForNonPagedPool(
7809 /*IN OUT*/ PMDL MemoryDescriptorList);
7815 /*OUT*/ PSECTION_OBJECT *SectionObject,
7816 /*IN*/ ACCESS_MASK DesiredAccess,
7817 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes /*OPTIONAL*/,
7818 /*IN*/ PLARGE_INTEGER MaximumSize,
7819 /*IN*/ ULONG SectionPageProtection,
7820 /*IN*/ ULONG AllocationAttributes,
7821 /*IN*/ HANDLE FileHandle /*OPTIONAL*/,
7822 /*IN*/ PFILE_OBJECT File /*OPTIONAL*/);
7824 typedef enum _MMFLUSH_TYPE {
7832 MmFlushImageSection(
7833 /*IN*/ PSECTION_OBJECT_POINTERS SectionObjectPointer,
7834 /*IN*/ MMFLUSH_TYPE FlushType);
7839 MmFreeContiguousMemory(
7840 /*IN*/ PVOID BaseAddress);
7845 MmFreeContiguousMemorySpecifyCache(
7846 /*IN*/ PVOID BaseAddress,
7847 /*IN*/ SIZE_T NumberOfBytes,
7848 /*IN*/ MEMORY_CACHING_TYPE CacheType);
7853 MmFreeMappingAddress(
7854 /*IN*/ PVOID BaseAddress,
7855 /*IN*/ ULONG PoolTag);
7860 MmFreeNonCachedMemory(
7861 /*IN*/ PVOID BaseAddress,
7862 /*IN*/ SIZE_T NumberOfBytes);
7868 /*IN*/ PMDL MemoryDescriptorList);
7872 * MmGetMdlByteCount(
7875 #define MmGetMdlByteCount(_Mdl) \
7880 * MmGetMdlByteOffset(
7883 #define MmGetMdlByteOffset(_Mdl) \
7884 ((_Mdl)->ByteOffset)
7891 #define MmGetMdlPfnArray(_Mdl) \
7892 ((PPFN_NUMBER) ((_Mdl) + 1))
7896 * MmGetMdlVirtualAddress(
7899 #define MmGetMdlVirtualAddress(_Mdl) \
7900 ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
7905 MmGetPhysicalAddress(
7906 /*IN*/ PVOID BaseAddress);
7909 PPHYSICAL_MEMORY_RANGE
7911 MmGetPhysicalMemoryRanges(
7917 MmGetVirtualForPhysical(
7918 /*IN*/ PHYSICAL_ADDRESS PhysicalAddress);
7923 MmMapLockedPagesSpecifyCache(
7924 /*IN*/ PMDL MemoryDescriptorList,
7925 /*IN*/ KPROCESSOR_MODE AccessMode,
7926 /*IN*/ MEMORY_CACHING_TYPE CacheType,
7927 /*IN*/ PVOID BaseAddress,
7928 /*IN*/ ULONG BugCheckOnFailure,
7929 /*IN*/ MM_PAGE_PRIORITY Priority);
7934 MmMapLockedPagesWithReservedMapping(
7935 /*IN*/ PVOID MappingAddress,
7936 /*IN*/ ULONG PoolTag,
7937 /*IN*/ PMDL MemoryDescriptorList,
7938 /*IN*/ MEMORY_CACHING_TYPE CacheType);
7943 MmMapUserAddressesToPage(
7944 /*IN*/ PVOID BaseAddress,
7945 /*IN*/ SIZE_T NumberOfBytes,
7946 /*IN*/ PVOID PageAddress);
7952 /*IN*/ PHYSICAL_ADDRESS PhysicalAddress,
7953 /*IN*/ SIZE_T NumberOfBytes,
7954 /*IN*/ MEMORY_CACHING_TYPE CacheType);
7959 MmMapViewInSessionSpace(
7960 /*IN*/ PVOID Section,
7961 /*OUT*/ PVOID *MappedBase,
7962 /*IN OUT*/ PSIZE_T ViewSize);
7967 MmMapViewInSystemSpace(
7968 /*IN*/ PVOID Section,
7969 /*OUT*/ PVOID *MappedBase,
7970 /*IN*/ PSIZE_T ViewSize);
7975 MmMarkPhysicalMemoryAsBad(
7976 /*IN*/ PPHYSICAL_ADDRESS StartAddress,
7977 /*IN OUT*/ PLARGE_INTEGER NumberOfBytes);
7982 MmMarkPhysicalMemoryAsGood(
7983 /*IN*/ PPHYSICAL_ADDRESS StartAddress,
7984 /*IN OUT*/ PLARGE_INTEGER NumberOfBytes);
7988 * MmGetSystemAddressForMdlSafe(
7990 * IN MM_PAGE_PRIORITY Priority)
7992 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
7993 ((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
7994 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
7995 (_Mdl)->MappedSystemVa : \
7996 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
7997 KernelMode, MmCached, NULL, FALSE, _Priority)
8002 MmGetSystemRoutineAddress(
8003 /*IN*/ PUNICODE_STRING SystemRoutineName);
8007 * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
8011 #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, \
8013 ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
8014 + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
8019 * IN PMDL MemoryDescriptorList,
8023 #define MmInitializeMdl(_MemoryDescriptorList, \
8027 (_MemoryDescriptorList)->Next = (PMDL) NULL; \
8028 (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
8029 (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
8030 (_MemoryDescriptorList)->MdlFlags = 0; \
8031 (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
8032 (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
8033 (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
8040 /*IN*/ PVOID VirtualAddress);
8045 MmIsDriverVerifying(
8046 /*IN*/ PDRIVER_OBJECT DriverObject);
8051 MmIsThisAnNtAsSystem(
8057 MmIsVerifierEnabled(
8058 /*OUT*/ PULONG VerifierFlags);
8063 MmLockPagableDataSection(
8064 /*IN*/ PVOID AddressWithinSection);
8069 MmLockPagableImageSection(
8070 /*IN*/ PVOID AddressWithinSection);
8074 * MmLockPagableCodeSection(
8075 * IN PVOID AddressWithinSection)
8077 #define MmLockPagableCodeSection MmLockPagableDataSection
8082 MmLockPagableSectionByHandle(
8083 /*IN*/ PVOID ImageSectionHandle);
8089 /*IN*/ PHYSICAL_ADDRESS PhysicalAddress,
8090 /*IN*/ ULONG NumberOfBytes,
8091 /*IN*/ MEMORY_CACHING_TYPE CacheEnable);
8097 /*IN*/ PMDL MemoryDescriptorList,
8098 /*IN*/ KPROCESSOR_MODE AccessMode);
8104 /*IN*/ PVOID AddressWithinSection);
8109 MmProbeAndLockProcessPages(
8110 /*IN OUT*/ PMDL MemoryDescriptorList,
8111 /*IN*/ PEPROCESS Process,
8112 /*IN*/ KPROCESSOR_MODE AccessMode,
8113 /*IN*/ LOCK_OPERATION Operation);
8118 MmProtectMdlSystemAddress(
8119 /*IN*/ PMDL MemoryDescriptorList,
8120 /*IN*/ ULONG NewProtect);
8126 /*IN*/ PVOID BaseAddress,
8127 /*IN*/ PMDL MemoryDescriptorList);
8132 MmUnmapViewInSessionSpace(
8133 /*IN*/ PVOID MappedBase);
8138 MmUnmapViewInSystemSpace(
8139 /*IN*/ PVOID MappedBase);
8144 MmUnsecureVirtualMemory(
8145 /*IN*/ HANDLE SecureHandle);
8149 * MmPrepareMdlForReuse(
8152 #define MmPrepareMdlForReuse(_Mdl) \
8154 if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
8155 ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
8156 MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
8157 } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
8158 ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
8165 MmProbeAndLockPages(
8166 /*IN OUT*/ PMDL MemoryDescriptorList,
8167 /*IN*/ KPROCESSOR_MODE AccessMode,
8168 /*IN*/ LOCK_OPERATION Operation);
8179 MmRemovePhysicalMemory(
8180 /*IN*/ PPHYSICAL_ADDRESS StartAddress,
8181 /*IN OUT*/ PLARGE_INTEGER NumberOfBytes);
8186 MmResetDriverPaging(
8187 /*IN*/ PVOID AddressWithinSection);
8192 MmSecureVirtualMemory(
8193 /*IN*/ PVOID Address,
8195 /*IN*/ ULONG ProbeMode);
8202 /*IN*/ SIZE_T Length);
8207 MmUnlockPagableImageSection(
8208 /*IN*/ PVOID ImageSectionHandle);
8214 /*IN*/ PMDL MemoryDescriptorList);
8220 /*IN*/ PVOID BaseAddress,
8221 /*IN*/ SIZE_T NumberOfBytes);
8226 MmUnmapReservedMapping(
8227 /*IN*/ PVOID BaseAddress,
8228 /*IN*/ ULONG PoolTag,
8229 /*IN*/ PMDL MemoryDescriptorList);
8234 MmUnmapVideoDisplay(
8235 /*IN*/ PVOID BaseAddress,
8236 /*IN*/ SIZE_T NumberOfBytes);
8240 /** Object manager routines **/
8246 /*IN*/ PACCESS_STATE AccessState,
8247 /*IN*/ PSECURITY_DESCRIPTOR SecurityDescriptor,
8248 /*IN*/ PVOID Object,
8249 /*IN*/ POBJECT_TYPE Type);
8254 ObDereferenceSecurityDescriptor(
8255 PSECURITY_DESCRIPTOR SecurityDescriptor,
8261 ObfDereferenceObject(
8262 /*IN*/ PVOID Object);
8266 * ObDereferenceObject(
8269 #define ObDereferenceObject ObfDereferenceObject
8274 ObGetObjectSecurity(
8275 /*IN*/ PVOID Object,
8276 /*OUT*/ PSECURITY_DESCRIPTOR *SecurityDescriptor,
8277 /*OUT*/ PBOOLEAN MemoryAllocated);
8283 /*IN*/ PVOID Object,
8284 /*IN*/ PACCESS_STATE PassedAccessState /*OPTIONAL*/,
8285 /*IN*/ ACCESS_MASK DesiredAccess,
8286 /*IN*/ ULONG AdditionalReferences,
8287 /*OUT*/ PVOID* ReferencedObject /*OPTIONAL*/,
8288 /*OUT*/ PHANDLE Handle);
8294 /*IN*/ PVOID Object);
8299 ObLogSecurityDescriptor(
8300 /*IN*/ PSECURITY_DESCRIPTOR InputSecurityDescriptor,
8301 /*OUT*/ PSECURITY_DESCRIPTOR *OutputSecurityDescriptor,
8302 /*IN*/ ULONG RefBias);
8305 * ObReferenceObject(
8308 #define ObReferenceObject ObfReferenceObject
8313 ObMakeTemporaryObject(
8314 /*IN*/ PVOID Object);
8320 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes,
8321 /*IN*/ POBJECT_TYPE ObjectType,
8322 /*IN OUT*/ PVOID ParseContext /*OPTIONAL*/,
8323 /*IN*/ KPROCESSOR_MODE AccessMode,
8324 /*IN*/ ACCESS_MASK DesiredAccess,
8325 /*IN*/ PACCESS_STATE PassedAccessState,
8326 /*OUT*/ PHANDLE Handle);
8331 ObOpenObjectByPointer(
8332 /*IN*/ PVOID Object,
8333 /*IN*/ ULONG HandleAttributes,
8334 /*IN*/ PACCESS_STATE PassedAccessState /*OPTIONAL*/,
8335 /*IN*/ ACCESS_MASK DesiredAccess /*OPTIONAL*/,
8336 /*IN*/ POBJECT_TYPE ObjectType /*OPTIONAL*/,
8337 /*IN*/ KPROCESSOR_MODE AccessMode,
8338 /*OUT*/ PHANDLE Handle);
8343 ObQueryObjectAuditingByHandle(
8344 /*IN*/ HANDLE Handle,
8345 /*OUT*/ PBOOLEAN GenerateOnClose);
8350 ObReferenceObjectByHandle(
8351 /*IN*/ HANDLE Handle,
8352 /*IN*/ ACCESS_MASK DesiredAccess,
8353 /*IN*/ POBJECT_TYPE ObjectType /*OPTIONAL*/,
8354 /*IN*/ KPROCESSOR_MODE AccessMode,
8355 /*OUT*/ PVOID *Object,
8356 /*OUT*/ POBJECT_HANDLE_INFORMATION HandleInformation /*OPTIONAL*/);
8361 ObReferenceObjectByName(
8362 /*IN*/ PUNICODE_STRING ObjectPath,
8363 /*IN*/ ULONG Attributes,
8364 /*IN*/ PACCESS_STATE PassedAccessState /*OPTIONAL*/,
8365 /*IN*/ ACCESS_MASK DesiredAccess /*OPTIONAL*/,
8366 /*IN*/ POBJECT_TYPE ObjectType,
8367 /*IN*/ KPROCESSOR_MODE AccessMode,
8368 /*IN OUT*/ PVOID ParseContext /*OPTIONAL*/,
8369 /*OUT*/ PVOID *Object);
8374 ObReferenceObjectByPointer(
8375 /*IN*/ PVOID Object,
8376 /*IN*/ ACCESS_MASK DesiredAccess,
8377 /*IN*/ POBJECT_TYPE ObjectType,
8378 /*IN*/ KPROCESSOR_MODE AccessMode);
8383 ObReferenceSecurityDescriptor(
8384 /*IN*/ PSECURITY_DESCRIPTOR SecurityDescriptor,
8385 /*IN*/ ULONG Count);
8390 ObReleaseObjectSecurity(
8391 /*IN*/ PSECURITY_DESCRIPTOR SecurityDescriptor,
8392 /*IN*/ BOOLEAN MemoryAllocated);
8396 /** Process manager routines **/
8401 PsCreateSystemProcess(
8402 /*IN*/ PHANDLE ProcessHandle,
8403 /*IN*/ ACCESS_MASK DesiredAccess,
8404 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes);
8409 PsCreateSystemThread(
8410 /*OUT*/ PHANDLE ThreadHandle,
8411 /*IN*/ ULONG DesiredAccess,
8412 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes /*OPTIONAL*/,
8413 /*IN*/ HANDLE ProcessHandle /*OPTIONAL*/,
8414 /*OUT*/ PCLIENT_ID ClientId /*OPTIONAL*/,
8415 /*IN*/ PKSTART_ROUTINE StartRoutine,
8416 /*IN*/ PVOID StartContext);
8420 * PsGetCurrentProcess(VOID)
8422 #define PsGetCurrentProcess IoGetCurrentProcess
8427 PsGetCurrentProcessId(
8432 * PsGetCurrentThread(VOID)
8434 #define PsGetCurrentThread() \
8435 ((PETHREAD) KeGetCurrentThread())
8440 PsGetCurrentThreadId(
8447 PULONG MajorVersion /*OPTIONAL*/,
8448 PULONG MinorVersion /*OPTIONAL*/,
8449 PULONG BuildNumber /*OPTIONAL*/,
8450 PUNICODE_STRING CSDVersion /*OPTIONAL*/);
8455 PsRemoveCreateThreadNotifyRoutine(
8456 /*IN*/ PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
8461 PsRemoveLoadImageNotifyRoutine(
8462 /*IN*/ PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
8467 PsSetCreateProcessNotifyRoutine(
8468 /*IN*/ PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
8469 /*IN*/ BOOLEAN Remove);
8474 PsSetCreateThreadNotifyRoutine(
8475 /*IN*/ PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
8480 PsSetLoadImageNotifyRoutine(
8481 /*IN*/ PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
8486 PsTerminateSystemThread(
8487 /*IN*/ NTSTATUS ExitStatus);
8491 /** Security reference monitor routines **/
8497 /*IN*/ PSECURITY_DESCRIPTOR SecurityDescriptor,
8498 /*IN*/ PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext,
8499 /*IN*/ BOOLEAN SubjectContextLocked,
8500 /*IN*/ ACCESS_MASK DesiredAccess,
8501 /*IN*/ ACCESS_MASK PreviouslyGrantedAccess,
8502 /*OUT*/ PPRIVILEGE_SET *Privileges /*OPTIONAL*/,
8503 /*IN*/ PGENERIC_MAPPING GenericMapping,
8504 /*IN*/ KPROCESSOR_MODE AccessMode,
8505 /*OUT*/ PACCESS_MASK GrantedAccess,
8506 /*OUT*/ PNTSTATUS AccessStatus);
8512 /*IN*/ PSECURITY_DESCRIPTOR ParentDescriptor /*OPTIONAL*/,
8513 /*IN*/ PSECURITY_DESCRIPTOR ExplicitDescriptor /*OPTIONAL*/,
8514 /*OUT*/ PSECURITY_DESCRIPTOR *NewDescriptor,
8515 /*IN*/ BOOLEAN IsDirectoryObject,
8516 /*IN*/ PSECURITY_SUBJECT_CONTEXT SubjectContext,
8517 /*IN*/ PGENERIC_MAPPING GenericMapping,
8518 /*IN*/ POOL_TYPE PoolType);
8524 /*IN*/ PSECURITY_DESCRIPTOR ParentDescriptor /*OPTIONAL*/,
8525 /*IN*/ PSECURITY_DESCRIPTOR ExplicitDescriptor /*OPTIONAL*/,
8526 /*OUT*/ PSECURITY_DESCRIPTOR *NewDescriptor,
8527 /*IN*/ GUID *ObjectType /*OPTIONAL*/,
8528 /*IN*/ BOOLEAN IsDirectoryObject,
8529 /*IN*/ ULONG AutoInheritFlags,
8530 /*IN*/ PSECURITY_SUBJECT_CONTEXT SubjectContext,
8531 /*IN*/ PGENERIC_MAPPING GenericMapping,
8532 /*IN*/ POOL_TYPE PoolType);
8538 /*IN OUT*/ PSECURITY_DESCRIPTOR *SecurityDescriptor);
8543 SeSinglePrivilegeCheck(
8544 LUID PrivilegeValue,
8545 KPROCESSOR_MODE PreviousMode);
8550 SeValidSecurityDescriptor(
8551 /*IN*/ ULONG Length,
8552 /*IN*/ PSECURITY_DESCRIPTOR SecurityDescriptor);
8556 /** NtXxx routines **/
8562 /*OUT*/ PHANDLE ProcessHandle,
8563 /*IN*/ ACCESS_MASK DesiredAccess,
8564 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes,
8565 /*IN*/ PCLIENT_ID ClientId /*OPTIONAL*/);
8570 NtQueryInformationProcess(
8571 /*IN*/ HANDLE ProcessHandle,
8572 /*IN*/ PROCESSINFOCLASS ProcessInformationClass,
8573 /*OUT*/ PVOID ProcessInformation,
8574 /*IN*/ ULONG ProcessInformationLength,
8575 /*OUT*/ PULONG ReturnLength /*OPTIONAL*/);
8579 /** NtXxx and ZwXxx routines **/
8585 /*IN*/ HANDLE TimerHandle,
8586 /*OUT*/ PBOOLEAN CurrentState /*OPTIONAL*/);
8592 /*IN*/ HANDLE TimerHandle,
8593 /*OUT*/ PBOOLEAN CurrentState /*OPTIONAL*/);
8599 /*IN*/ HANDLE Handle);
8605 /*IN*/ HANDLE Handle);
8610 NtCreateDirectoryObject(
8611 /*OUT*/ PHANDLE DirectoryHandle,
8612 /*IN*/ ACCESS_MASK DesiredAccess,
8613 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes);
8618 ZwCreateDirectoryObject(
8619 /*OUT*/ PHANDLE DirectoryHandle,
8620 /*IN*/ ACCESS_MASK DesiredAccess,
8621 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes);
8627 /*OUT*/ PHANDLE EventHandle,
8628 /*IN*/ ACCESS_MASK DesiredAccess,
8629 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes,
8630 /*IN*/ BOOLEAN ManualReset,
8631 /*IN*/ BOOLEAN InitialState);
8637 /*OUT*/ PHANDLE EventHandle,
8638 /*IN*/ ACCESS_MASK DesiredAccess,
8639 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes,
8640 /*IN*/ BOOLEAN ManualReset,
8641 /*IN*/ BOOLEAN InitialState);
8647 /*OUT*/ PHANDLE FileHandle,
8648 /*IN*/ ACCESS_MASK DesiredAccess,
8649 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes,
8650 /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock,
8651 /*IN*/ PLARGE_INTEGER AllocationSize /*OPTIONAL*/,
8652 /*IN*/ ULONG FileAttributes,
8653 /*IN*/ ULONG ShareAccess,
8654 /*IN*/ ULONG CreateDisposition,
8655 /*IN*/ ULONG CreateOptions,
8656 /*IN*/ PVOID EaBuffer /*OPTIONAL*/,
8657 /*IN*/ ULONG EaLength);
8663 /*OUT*/ PHANDLE FileHandle,
8664 /*IN*/ ACCESS_MASK DesiredAccess,
8665 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes,
8666 /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock,
8667 /*IN*/ PLARGE_INTEGER AllocationSize /*OPTIONAL*/,
8668 /*IN*/ ULONG FileAttributes,
8669 /*IN*/ ULONG ShareAccess,
8670 /*IN*/ ULONG CreateDisposition,
8671 /*IN*/ ULONG CreateOptions,
8672 /*IN*/ PVOID EaBuffer /*OPTIONAL*/,
8673 /*IN*/ ULONG EaLength);
8679 /*OUT*/ PHANDLE KeyHandle,
8680 /*IN*/ ACCESS_MASK DesiredAccess,
8681 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes,
8682 /*IN*/ ULONG TitleIndex,
8683 /*IN*/ PUNICODE_STRING Class /*OPTIONAL*/,
8684 /*IN*/ ULONG CreateOptions,
8685 /*OUT*/ PULONG Disposition /*OPTIONAL*/);
8691 /*OUT*/ PHANDLE KeyHandle,
8692 /*IN*/ ACCESS_MASK DesiredAccess,
8693 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes,
8694 /*IN*/ ULONG TitleIndex,
8695 /*IN*/ PUNICODE_STRING Class /*OPTIONAL*/,
8696 /*IN*/ ULONG CreateOptions,
8697 /*OUT*/ PULONG Disposition /*OPTIONAL*/);
8703 /*OUT*/ PHANDLE TimerHandle,
8704 /*IN*/ ACCESS_MASK DesiredAccess,
8705 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes /*OPTIONAL*/,
8706 /*IN*/ TIMER_TYPE TimerType);
8712 /*OUT*/ PHANDLE TimerHandle,
8713 /*IN*/ ACCESS_MASK DesiredAccess,
8714 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes /*OPTIONAL*/,
8715 /*IN*/ TIMER_TYPE TimerType);
8721 /*IN*/ HANDLE KeyHandle);
8727 /*IN*/ HANDLE KeyHandle);
8733 /*IN*/ HANDLE KeyHandle,
8734 /*IN*/ PUNICODE_STRING ValueName);
8740 /*IN*/ HANDLE KeyHandle,
8741 /*IN*/ PUNICODE_STRING ValueName);
8746 NtDeviceIoControlFile(
8747 /*IN*/ HANDLE DeviceHandle,
8748 /*IN*/ HANDLE Event /*OPTIONAL*/,
8749 /*IN*/ PIO_APC_ROUTINE UserApcRoutine /*OPTIONAL*/,
8750 /*IN*/ PVOID UserApcContext /*OPTIONAL*/,
8751 /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock,
8752 /*IN*/ ULONG IoControlCode,
8753 /*IN*/ PVOID InputBuffer,
8754 /*IN*/ ULONG InputBufferSize,
8755 /*OUT*/ PVOID OutputBuffer,
8756 /*IN*/ ULONG OutputBufferSize);
8761 ZwDeviceIoControlFile(
8762 /*IN*/ HANDLE DeviceHandle,
8763 /*IN*/ HANDLE Event /*OPTIONAL*/,
8764 /*IN*/ PIO_APC_ROUTINE UserApcRoutine /*OPTIONAL*/,
8765 /*IN*/ PVOID UserApcContext /*OPTIONAL*/,
8766 /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock,
8767 /*IN*/ ULONG IoControlCode,
8768 /*IN*/ PVOID InputBuffer,
8769 /*IN*/ ULONG InputBufferSize,
8770 /*OUT*/ PVOID OutputBuffer,
8771 /*IN*/ ULONG OutputBufferSize);
8777 /*IN*/ HANDLE KeyHandle,
8779 /*IN*/ KEY_INFORMATION_CLASS KeyInformationClass,
8780 /*OUT*/ PVOID KeyInformation,
8781 /*IN*/ ULONG Length,
8782 /*OUT*/ PULONG ResultLength);
8788 /*IN*/ HANDLE KeyHandle,
8790 /*IN*/ KEY_INFORMATION_CLASS KeyInformationClass,
8791 /*OUT*/ PVOID KeyInformation,
8792 /*IN*/ ULONG Length,
8793 /*OUT*/ PULONG ResultLength);
8798 NtEnumerateValueKey(
8799 /*IN*/ HANDLE KeyHandle,
8801 /*IN*/ KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
8802 /*OUT*/ PVOID KeyValueInformation,
8803 /*IN*/ ULONG Length,
8804 /*OUT*/ PULONG ResultLength);
8809 ZwEnumerateValueKey(
8810 /*IN*/ HANDLE KeyHandle,
8812 /*IN*/ KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
8813 /*OUT*/ PVOID KeyValueInformation,
8814 /*IN*/ ULONG Length,
8815 /*OUT*/ PULONG ResultLength);
8821 /*IN*/ HANDLE KeyHandle);
8827 /*IN*/ HANDLE KeyHandle);
8832 NtMakeTemporaryObject(
8833 /*IN*/ HANDLE Handle);
8838 ZwMakeTemporaryObject(
8839 /*IN*/ HANDLE Handle);
8845 /*IN*/ HANDLE SectionHandle,
8846 /*IN*/ HANDLE ProcessHandle,
8847 /*IN OUT*/ PVOID *BaseAddress,
8848 /*IN*/ ULONG ZeroBits,
8849 /*IN*/ ULONG CommitSize,
8850 /*IN OUT*/ PLARGE_INTEGER SectionOffset /*OPTIONAL*/,
8851 /*IN OUT*/ PSIZE_T ViewSize,
8852 /*IN*/ SECTION_INHERIT InheritDisposition,
8853 /*IN*/ ULONG AllocationType,
8854 /*IN*/ ULONG Protect);
8860 /*IN*/ HANDLE SectionHandle,
8861 /*IN*/ HANDLE ProcessHandle,
8862 /*IN OUT*/ PVOID *BaseAddress,
8863 /*IN*/ ULONG ZeroBits,
8864 /*IN*/ ULONG CommitSize,
8865 /*IN OUT*/ PLARGE_INTEGER SectionOffset /*OPTIONAL*/,
8866 /*IN OUT*/ PSIZE_T ViewSize,
8867 /*IN*/ SECTION_INHERIT InheritDisposition,
8868 /*IN*/ ULONG AllocationType,
8869 /*IN*/ ULONG Protect);
8875 /*OUT*/ PHANDLE FileHandle,
8876 /*IN*/ ACCESS_MASK DesiredAccess,
8877 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes,
8878 /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock,
8879 /*IN*/ ULONG ShareAccess,
8880 /*IN*/ ULONG OpenOptions);
8886 /*OUT*/ PHANDLE FileHandle,
8887 /*IN*/ ACCESS_MASK DesiredAccess,
8888 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes,
8889 /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock,
8890 /*IN*/ ULONG ShareAccess,
8891 /*IN*/ ULONG OpenOptions);
8897 /*OUT*/ PHANDLE KeyHandle,
8898 /*IN*/ ACCESS_MASK DesiredAccess,
8899 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes);
8905 /*OUT*/ PHANDLE KeyHandle,
8906 /*IN*/ ACCESS_MASK DesiredAccess,
8907 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes);
8913 /*OUT*/ PHANDLE SectionHandle,
8914 /*IN*/ ACCESS_MASK DesiredAccess,
8915 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes);
8921 /*OUT*/ PHANDLE SectionHandle,
8922 /*IN*/ ACCESS_MASK DesiredAccess,
8923 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes);
8928 NtOpenSymbolicLinkObject(
8929 /*OUT*/ PHANDLE LinkHandle,
8930 /*IN*/ ACCESS_MASK DesiredAccess,
8931 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes);
8936 ZwOpenSymbolicLinkObject(
8937 /*OUT*/ PHANDLE LinkHandle,
8938 /*IN*/ ACCESS_MASK DesiredAccess,
8939 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes);
8945 /*OUT*/ PHANDLE TimerHandle,
8946 /*IN*/ ACCESS_MASK DesiredAccess,
8947 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes);
8953 /*OUT*/ PHANDLE TimerHandle,
8954 /*IN*/ ACCESS_MASK DesiredAccess,
8955 /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes);
8960 NtQueryInformationFile(
8961 /*IN*/ HANDLE FileHandle,
8962 /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock,
8963 /*OUT*/ PVOID FileInformation,
8964 /*IN*/ ULONG Length,
8965 /*IN*/ FILE_INFORMATION_CLASS FileInformationClass);
8970 ZwQueryInformationFile(
8971 /*IN*/ HANDLE FileHandle,
8972 /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock,
8973 /*OUT*/ PVOID FileInformation,
8974 /*IN*/ ULONG Length,
8975 /*IN*/ FILE_INFORMATION_CLASS FileInformationClass);
8981 /*IN*/ HANDLE KeyHandle,
8982 /*IN*/ KEY_INFORMATION_CLASS KeyInformationClass,
8983 /*OUT*/ PVOID KeyInformation,
8984 /*IN*/ ULONG Length,
8985 /*OUT*/ PULONG ResultLength);
8991 /*IN*/ HANDLE KeyHandle,
8992 /*IN*/ KEY_INFORMATION_CLASS KeyInformationClass,
8993 /*OUT*/ PVOID KeyInformation,
8994 /*IN*/ ULONG Length,
8995 /*OUT*/ PULONG ResultLength);
9000 NtQuerySymbolicLinkObject(
9001 /*IN*/ HANDLE LinkHandle,
9002 /*IN OUT*/ PUNICODE_STRING LinkTarget,
9003 /*OUT*/ PULONG ReturnedLength /*OPTIONAL*/);
9008 ZwQuerySymbolicLinkObject(
9009 /*IN*/ HANDLE LinkHandle,
9010 /*IN OUT*/ PUNICODE_STRING LinkTarget,
9011 /*OUT*/ PULONG ReturnedLength /*OPTIONAL*/);
9017 /*IN*/ HANDLE TimerHandle,
9018 /*IN*/ TIMER_INFORMATION_CLASS TimerInformationClass,
9019 /*OUT*/ PVOID TimerInformation,
9020 /*IN*/ ULONG TimerInformationLength,
9021 /*OUT*/ PULONG ReturnedLength /*OPTIONAL*/);
9027 /*IN*/ HANDLE TimerHandle,
9028 /*IN*/ TIMER_INFORMATION_CLASS TimerInformationClass,
9029 /*OUT*/ PVOID TimerInformation,
9030 /*IN*/ ULONG TimerInformationLength,
9031 /*OUT*/ PULONG ReturnedLength /*OPTIONAL*/);
9037 /*IN*/ HANDLE KeyHandle,
9038 /*IN*/ PUNICODE_STRING ValueName,
9039 /*IN*/ KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
9040 /*OUT*/ PVOID KeyValueInformation,
9041 /*IN*/ ULONG Length,
9042 /*OUT*/ PULONG ResultLength);
9048 /*IN*/ HANDLE KeyHandle,
9049 /*IN*/ PUNICODE_STRING ValueName,
9050 /*IN*/ KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
9051 /*OUT*/ PVOID KeyValueInformation,
9052 /*IN*/ ULONG Length,
9053 /*OUT*/ PULONG ResultLength);
9059 /*IN*/ HANDLE FileHandle,
9060 /*IN*/ HANDLE Event /*OPTIONAL*/,
9061 /*IN*/ PIO_APC_ROUTINE ApcRoutine /*OPTIONAL*/,
9062 /*IN*/ PVOID ApcContext /*OPTIONAL*/,
9063 /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock,
9064 /*OUT*/ PVOID Buffer,
9065 /*IN*/ ULONG Length,
9066 /*IN*/ PLARGE_INTEGER ByteOffset /*OPTIONAL*/,
9067 /*IN*/ PULONG Key /*OPTIONAL*/);
9073 /*IN*/ HANDLE FileHandle,
9074 /*IN*/ HANDLE Event /*OPTIONAL*/,
9075 /*IN*/ PIO_APC_ROUTINE ApcRoutine /*OPTIONAL*/,
9076 /*IN*/ PVOID ApcContext /*OPTIONAL*/,
9077 /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock,
9078 /*OUT*/ PVOID Buffer,
9079 /*IN*/ ULONG Length,
9080 /*IN*/ PLARGE_INTEGER ByteOffset /*OPTIONAL*/,
9081 /*IN*/ PULONG Key /*OPTIONAL*/);
9087 /*IN*/ HANDLE EventHandle,
9088 /*IN*/ PULONG NumberOfThreadsReleased);
9094 /*IN*/ HANDLE EventHandle,
9095 /*IN*/ PULONG NumberOfThreadsReleased);
9100 NtSetInformationFile(
9101 /*IN*/ HANDLE FileHandle,
9102 /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock,
9103 /*IN*/ PVOID FileInformation,
9104 /*IN*/ ULONG Length,
9105 /*IN*/ FILE_INFORMATION_CLASS FileInformationClass);
9110 ZwSetInformationFile(
9111 /*IN*/ HANDLE FileHandle,
9112 /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock,
9113 /*IN*/ PVOID FileInformation,
9114 /*IN*/ ULONG Length,
9115 /*IN*/ FILE_INFORMATION_CLASS FileInformationClass);
9120 NtSetInformationThread(
9121 /*IN*/ HANDLE ThreadHandle,
9122 /*IN*/ THREADINFOCLASS ThreadInformationClass,
9123 /*IN*/ PVOID ThreadInformation,
9124 /*IN*/ ULONG ThreadInformationLength);
9129 ZwSetInformationThread(
9130 /*IN*/ HANDLE ThreadHandle,
9131 /*IN*/ THREADINFOCLASS ThreadInformationClass,
9132 /*IN*/ PVOID ThreadInformation,
9133 /*IN*/ ULONG ThreadInformationLength);
9139 /*IN*/ HANDLE TimerHandle,
9140 /*IN*/ PLARGE_INTEGER DueTime,
9141 /*IN*/ PTIMER_APC_ROUTINE TimerApcRoutine /*OPTIONAL*/,
9142 /*IN*/ PVOID TimerContext /*OPTIONAL*/,
9143 /*IN*/ BOOLEAN WakeTimer,
9144 /*IN*/ LONG Period /*OPTIONAL*/,
9145 /*OUT*/ PBOOLEAN PreviousState /*OPTIONAL*/);
9151 /*IN*/ HANDLE TimerHandle,
9152 /*IN*/ PLARGE_INTEGER DueTime,
9153 /*IN*/ PTIMER_APC_ROUTINE TimerApcRoutine /*OPTIONAL*/,
9154 /*IN*/ PVOID TimerContext /*OPTIONAL*/,
9155 /*IN*/ BOOLEAN WakeTimer,
9156 /*IN*/ LONG Period /*OPTIONAL*/,
9157 /*OUT*/ PBOOLEAN PreviousState /*OPTIONAL*/);
9163 /*IN*/ HANDLE KeyHandle,
9164 /*IN*/ PUNICODE_STRING ValueName,
9165 /*IN*/ ULONG TitleIndex /*OPTIONAL*/,
9168 /*IN*/ ULONG DataSize);
9174 /*IN*/ HANDLE KeyHandle,
9175 /*IN*/ PUNICODE_STRING ValueName,
9176 /*IN*/ ULONG TitleIndex /*OPTIONAL*/,
9179 /*IN*/ ULONG DataSize);
9181 /* [Nt|Zw]MapViewOfSection.InheritDisposition constants */
9182 #define AT_EXTENDABLE_FILE 0x00002000
9183 #define SEC_NO_CHANGE 0x00400000
9184 #define AT_RESERVED 0x20000000
9185 #define AT_ROUND_TO_PAGE 0x40000000
9190 NtUnmapViewOfSection(
9191 /*IN*/ HANDLE ProcessHandle,
9192 /*IN*/ PVOID BaseAddress);
9197 ZwUnmapViewOfSection(
9198 /*IN*/ HANDLE ProcessHandle,
9199 /*IN*/ PVOID BaseAddress);
9204 NtWaitForSingleObject(
9205 /*IN*/ HANDLE Object,
9206 /*IN*/ BOOLEAN Alertable,
9207 /*IN*/ PLARGE_INTEGER Time);
9212 ZwWaitForSingleObject(
9213 /*IN*/ HANDLE Object,
9214 /*IN*/ BOOLEAN Alertable,
9215 /*IN*/ PLARGE_INTEGER Time);
9221 /*IN*/ HANDLE FileHandle,
9222 /*IN*/ HANDLE Event /*OPTIONAL*/,
9223 /*IN*/ PIO_APC_ROUTINE ApcRoutine /*OPTIONAL*/,
9224 /*IN*/ PVOID ApcContext /*OPTIONAL*/,
9225 /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock,
9226 /*IN*/ PVOID Buffer,
9227 /*IN*/ ULONG Length,
9228 /*IN*/ PLARGE_INTEGER ByteOffset /*OPTIONAL*/,
9229 /*IN*/ PULONG Key /*OPTIONAL*/);
9235 /*IN*/ HANDLE FileHandle,
9236 /*IN*/ HANDLE Event /*OPTIONAL*/,
9237 /*IN*/ PIO_APC_ROUTINE ApcRoutine /*OPTIONAL*/,
9238 /*IN*/ PVOID ApcContext /*OPTIONAL*/,
9239 /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock,
9240 /*IN*/ PVOID Buffer,
9241 /*IN*/ ULONG Length,
9242 /*IN*/ PLARGE_INTEGER ByteOffset /*OPTIONAL*/,
9243 /*IN*/ PULONG Key /*OPTIONAL*/);
9247 /** Power management support routines **/
9253 /*IN*/ PDEVICE_OBJECT DeviceObject,
9254 /*IN OUT*/ PIRP Irp);
9259 PoRegisterDeviceForIdleDetection(
9260 /*IN*/ PDEVICE_OBJECT DeviceObject,
9261 /*IN*/ ULONG ConservationIdleTime,
9262 /*IN*/ ULONG PerformanceIdleTime,
9263 /*IN*/ DEVICE_POWER_STATE State);
9268 PoRegisterSystemState(
9269 /*IN*/ PVOID StateHandle,
9270 /*IN*/ EXECUTION_STATE Flags);
9276 /*IN*/ PDEVICE_OBJECT DeviceObject,
9277 /*IN*/ UCHAR MinorFunction,
9278 /*IN*/ POWER_STATE PowerState,
9279 /*IN*/ PREQUEST_POWER_COMPLETE CompletionFunction,
9280 /*IN*/ PVOID Context,
9281 /*OUT*/ PIRP *Irp /*OPTIONAL*/);
9286 PoRequestShutdownEvent(
9287 /*OUT*/ PVOID *Event);
9293 PULONG IdlePointer);
9299 /*IN*/ PDEVICE_OBJECT DeviceObject,
9300 /*IN*/ POWER_STATE_TYPE Type,
9301 /*IN*/ POWER_STATE State);
9307 /*IN*/ EXECUTION_STATE Flags);
9312 PoStartNextPowerIrp(
9318 PoUnregisterSystemState(
9319 /*IN*/ PVOID StateHandle);
9323 /** WMI library support routines **/
9329 /*IN*/ PDEVICE_OBJECT DeviceObject,
9331 /*IN*/ NTSTATUS Status,
9332 /*IN*/ ULONG BufferUsed,
9333 /*IN*/ CCHAR PriorityBoost);
9339 /*IN*/ PDEVICE_OBJECT DeviceObject,
9341 /*IN*/ ULONG InstanceIndex,
9342 /*IN*/ ULONG EventDataSize,
9343 /*IN*/ PVOID EventData);
9348 WmiQueryTraceInformation(
9349 /*IN*/ TRACE_INFORMATION_CLASS TraceInformationClass,
9350 /*OUT*/ PVOID TraceInformation,
9351 /*IN*/ ULONG TraceInformationLength,
9352 /*OUT*/ PULONG RequiredLength /*OPTIONAL*/,
9353 /*IN*/ PVOID Buffer /*OPTIONAL*/);
9359 /*IN*/ PWMILIB_CONTEXT WmiLibInfo,
9360 /*IN*/ PDEVICE_OBJECT DeviceObject,
9362 /*OUT*/ PSYSCTL_IRP_DISPOSITION IrpDisposition);
9368 /*IN*/ TRACEHANDLE LoggerHandle,
9369 /*IN*/ ULONG MessageFlags,
9370 /*IN*/ LPGUID MessageGuid,
9371 /*IN*/ USHORT MessageNumber,
9375 /* FIXME: Get va_list from where? */
9380 /*IN*/ TRACEHANDLE LoggerHandle,
9381 /*IN*/ ULONG MessageFlags,
9382 /*IN*/ LPGUID MessageGuid,
9383 /*IN*/ USHORT MessageNumber,
9384 /*IN*/ va_list MessageArgList);
9388 /** Kernel debugger routines **/
9411 DbgBreakPointWithStatus(
9412 /*IN*/ ULONG Status);
9425 /*IN*/ ULONG ComponentId,
9433 DbgPrintReturnControlC(
9440 DbgQueryDebugFilterState(
9441 /*IN*/ ULONG ComponentId,
9442 /*IN*/ ULONG Level);
9447 DbgSetDebugFilterState(
9448 /*IN*/ ULONG ComponentId,
9450 /*IN*/ BOOLEAN State);
9454 #define KdPrint(_x_) DbgPrint _x_
9455 #define KdPrintEx(_x_) DbgPrintEx _x_
9456 #define KdBreakPoint() DbgBreakPoint()
9457 #define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
9461 #define KdPrint(_x_)
9462 #define KdPrintEx(_x_)
9463 #define KdBreakPoint()
9464 #define KdBreakPointWithStatus(s)
9468 extern NTOSAPI PBOOLEAN KdDebuggerNotPresent;
9469 extern NTOSAPI PBOOLEAN KdDebuggerEnabled;
9470 #define KD_DEBUGGER_ENABLED *KdDebuggerEnabled
9471 #define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
9477 #endif /* __WINDDK_H */