/* * winddk.h * * Windows Device Driver Kit * * This file is part of the w32api package. * * Contributors: * Created by Casper S. Hornstrup * * THIS SOFTWARE IS NOT COPYRIGHTED * * This source code is offered for use in the public domain. You may * use, modify or distribute it freely. * * This code is distributed in the hope that it will be useful but * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY * DISCLAIMED. This includes but is not limited to warranties of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * */ #ifndef __WINDDK_H #define __WINDDK_H #if __GNUC__ >= 3 #pragma GCC system_header #endif #ifdef __cplusplus extern "C" { #endif /* ** Definitions specific to this Device Driver Kit */ #define DDKAPI __stdcall #define DDKFASTAPI __fastcall #define DDKCDECLAPI __cdecl #if defined(_NTOSKRNL_) #ifndef NTOSAPI #define NTOSAPI DECL_EXPORT #endif #define DECLARE_INTERNAL_OBJECT(x) typedef struct _##x; typedef struct _##x *P##x; #define DECLARE_INTERNAL_OBJECT2(x,y) typedef struct _##x; typedef struct _##x *P##y; #else #ifndef NTOSAPI #define NTOSAPI DECL_IMPORT #endif #define DECLARE_INTERNAL_OBJECT(x) struct _##x; typedef struct _##x *P##x; #define DECLARE_INTERNAL_OBJECT2(x,y) struct _##x; typedef struct _##x *P##y; #endif /* Pseudo modifiers for parameters We don't use these unnecessary defines in the w32api headers. Define them by default since that is what people expect, but allow users to avoid the pollution. */ #ifndef _NO_W32_PSEUDO_MODIFIERS #define IN #define OUT #define OPTIONAL #define UNALLIGNED #endif #define CONST const #define VOLATILE volatile #define RESTRICTED_POINTER #define POINTER_ALIGNMENT #ifdef NONAMELESSUNION # define _DDK_DUMMYUNION_MEMBER(name) DUMMYUNIONNAME.name # define _DDK_DUMMYUNION_N_MEMBER(n, name) DUMMYUNIONNAME##n.name #else # define _DDK_DUMMYUNION_MEMBER(name) name # define _DDK_DUMMYUNION_N_MEMBER(n, name) name #endif /* ** Forward declarations */ struct _IRP; struct _MDL; struct _KAPC; struct _KDPC; struct _KPCR; struct _KPRCB; struct _KTSS; struct _FILE_OBJECT; struct _DMA_ADAPTER; struct _DEVICE_OBJECT; struct _DRIVER_OBJECT; struct _SECTION_OBJECT; struct _IO_STATUS_BLOCK; struct _DEVICE_DESCRIPTION; struct _SCATTER_GATHER_LIST; DECLARE_INTERNAL_OBJECT(ADAPTER_OBJECT) DECLARE_INTERNAL_OBJECT(DMA_ADAPTER) DECLARE_INTERNAL_OBJECT(IO_STATUS_BLOCK) DECLARE_INTERNAL_OBJECT(SECTION_OBJECT) #if 1 /* FIXME: Unknown definitions */ struct _SET_PARTITION_INFORMATION_EX; typedef ULONG WAIT_TYPE; typedef HANDLE TRACEHANDLE; typedef PVOID PWMILIB_CONTEXT; typedef PVOID PSYSCTL_IRP_DISPOSITION; typedef ULONG LOGICAL; #endif /* ** Routines specific to this DDK */ #define TAG(_a, _b, _c, _d) (ULONG) \ (((_a) << 0) + ((_b) << 8) + ((_c) << 16) + ((_d) << 24)) #ifdef __GNUC__ static __inline struct _KPCR * KeGetCurrentKPCR( VOID) { ULONG Value; __asm__ __volatile__ ( #if (__GNUC__ >= 3) /* support -masm=intel */ "mov{l} {%%fs:0x18, %0|%0, %%fs:0x18}\n\t" #else "movl %%fs:0x18, %0\n\t" #endif : "=r" (Value) : /* no inputs */ ); return (struct _KPCR *) Value; } #elif defined( __WATCOMC__ ) extern struct _KPCR * KeGetCurrentKPCR( void ); #pragma aux KeGetCurrentKPCR = \ "mov eax, fs:[0x18]" \ value [ eax ]; #endif /* ** Simple structures */ typedef LONG KPRIORITY; typedef UCHAR KIRQL, *PKIRQL; typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK; typedef ULONG_PTR KAFFINITY, *PKAFFINITY; typedef CCHAR KPROCESSOR_MODE; typedef enum _MODE { KernelMode, UserMode, MaximumMode } MODE; /* Structures not exposed to drivers */ typedef struct _IO_TIMER *PIO_TIMER; typedef struct _EPROCESS *PEPROCESS; typedef struct _ETHREAD *PETHREAD; typedef struct _KINTERRUPT *PKINTERRUPT; typedef struct _OBJECT_TYPE *POBJECT_TYPE; typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD; typedef struct _COMPRESSED_DATA_INFO *PCOMPRESSED_DATA_INFO; typedef struct _HAL_DISPATCH_TABLE *PHAL_DISPATCH_TABLE; typedef struct _HAL_PRIVATE_DISPATCH_TABLE *PHAL_PRIVATE_DISPATCH_TABLE; typedef struct _DRIVE_LAYOUT_INFORMATION *PDRIVE_LAYOUT_INFORMATION; typedef struct _DRIVE_LAYOUT_INFORMATION_EX *PDRIVE_LAYOUT_INFORMATION_EX; /* Constants */ #define MAXIMUM_PROCESSORS 32 #define MAXIMUM_WAIT_OBJECTS 64 #define METHOD_BUFFERED 0 #define METHOD_IN_DIRECT 1 #define METHOD_OUT_DIRECT 2 #define METHOD_NEITHER 3 #define LOW_PRIORITY 0 #define LOW_REALTIME_PRIORITY 16 #define HIGH_PRIORITY 31 #define MAXIMUM_PRIORITY 32 #define FILE_SUPERSEDED 0x00000000 #define FILE_OPENED 0x00000001 #define FILE_CREATED 0x00000002 #define FILE_OVERWRITTEN 0x00000003 #define FILE_EXISTS 0x00000004 #define FILE_DOES_NOT_EXIST 0x00000005 /* also in winnt.h */ #define FILE_LIST_DIRECTORY 0x00000001 #define FILE_READ_DATA 0x00000001 #define FILE_ADD_FILE 0x00000002 #define FILE_WRITE_DATA 0x00000002 #define FILE_ADD_SUBDIRECTORY 0x00000004 #define FILE_APPEND_DATA 0x00000004 #define FILE_CREATE_PIPE_INSTANCE 0x00000004 #define FILE_READ_EA 0x00000008 #define FILE_WRITE_EA 0x00000010 #define FILE_EXECUTE 0x00000020 #define FILE_TRAVERSE 0x00000020 #define FILE_DELETE_CHILD 0x00000040 #define FILE_READ_ATTRIBUTES 0x00000080 #define FILE_WRITE_ATTRIBUTES 0x00000100 #define FILE_SHARE_READ 0x00000001 #define FILE_SHARE_WRITE 0x00000002 #define FILE_SHARE_DELETE 0x00000004 #define FILE_SHARE_VALID_FLAGS 0x00000007 #define FILE_ATTRIBUTE_READONLY 0x00000001 #define FILE_ATTRIBUTE_HIDDEN 0x00000002 #define FILE_ATTRIBUTE_SYSTEM 0x00000004 #define FILE_ATTRIBUTE_DIRECTORY 0x00000010 #define FILE_ATTRIBUTE_ARCHIVE 0x00000020 #define FILE_ATTRIBUTE_DEVICE 0x00000040 #define FILE_ATTRIBUTE_NORMAL 0x00000080 #define FILE_ATTRIBUTE_TEMPORARY 0x00000100 #define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200 #define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400 #define FILE_ATTRIBUTE_COMPRESSED 0x00000800 #define FILE_ATTRIBUTE_OFFLINE 0x00001000 #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000 #define FILE_ATTRIBUTE_ENCRYPTED 0x00004000 #define FILE_ATTRIBUTE_VALID_FLAGS 0x00007fb7 #define FILE_ATTRIBUTE_VALID_SET_FLAGS 0x000031a7 #define FILE_COPY_STRUCTURED_STORAGE 0x00000041 #define FILE_STRUCTURED_STORAGE 0x00000441 #define FILE_VALID_OPTION_FLAGS 0x00ffffff #define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032 #define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032 #define FILE_VALID_SET_FLAGS 0x00000036 #define FILE_SUPERSEDE 0x00000000 #define FILE_OPEN 0x00000001 #define FILE_CREATE 0x00000002 #define FILE_OPEN_IF 0x00000003 #define FILE_OVERWRITE 0x00000004 #define FILE_OVERWRITE_IF 0x00000005 #define FILE_MAXIMUM_DISPOSITION 0x00000005 #define FILE_DIRECTORY_FILE 0x00000001 #define FILE_WRITE_THROUGH 0x00000002 #define FILE_SEQUENTIAL_ONLY 0x00000004 #define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008 #define FILE_SYNCHRONOUS_IO_ALERT 0x00000010 #define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020 #define FILE_NON_DIRECTORY_FILE 0x00000040 #define FILE_CREATE_TREE_CONNECTION 0x00000080 #define FILE_COMPLETE_IF_OPLOCKED 0x00000100 #define FILE_NO_EA_KNOWLEDGE 0x00000200 #define FILE_OPEN_FOR_RECOVERY 0x00000400 #define FILE_RANDOM_ACCESS 0x00000800 #define FILE_DELETE_ON_CLOSE 0x00001000 #define FILE_OPEN_BY_FILE_ID 0x00002000 #define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000 #define FILE_NO_COMPRESSION 0x00008000 #define FILE_RESERVE_OPFILTER 0x00100000 #define FILE_OPEN_REPARSE_POINT 0x00200000 #define FILE_OPEN_NO_RECALL 0x00400000 #define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000 #define FILE_ANY_ACCESS 0x00000000 #define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS #define FILE_READ_ACCESS 0x00000001 #define FILE_WRITE_ACCESS 0x00000002 #define FILE_ALL_ACCESS \ (STANDARD_RIGHTS_REQUIRED | \ SYNCHRONIZE | \ 0x1FF) #define FILE_GENERIC_EXECUTE \ (STANDARD_RIGHTS_EXECUTE | \ FILE_READ_ATTRIBUTES | \ FILE_EXECUTE | \ SYNCHRONIZE) #define FILE_GENERIC_READ \ (STANDARD_RIGHTS_READ | \ FILE_READ_DATA | \ FILE_READ_ATTRIBUTES | \ FILE_READ_EA | \ SYNCHRONIZE) #define FILE_GENERIC_WRITE \ (STANDARD_RIGHTS_WRITE | \ FILE_WRITE_DATA | \ FILE_WRITE_ATTRIBUTES | \ FILE_WRITE_EA | \ FILE_APPEND_DATA | \ SYNCHRONIZE) /* end winnt.h */ #define DIRECTORY_QUERY (0x0001) #define DIRECTORY_TRAVERSE (0x0002) #define DIRECTORY_CREATE_OBJECT (0x0004) #define DIRECTORY_CREATE_SUBDIRECTORY (0x0008) #define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF) /* Exported object types */ extern NTOSAPI POBJECT_TYPE ExDesktopObjectType; extern NTOSAPI POBJECT_TYPE ExEventObjectType; extern NTOSAPI POBJECT_TYPE ExSemaphoreObjectType; extern NTOSAPI POBJECT_TYPE ExWindowStationObjectType; extern NTOSAPI POBJECT_TYPE IoAdapterObjectType; extern NTOSAPI ULONG IoDeviceHandlerObjectSize; extern NTOSAPI POBJECT_TYPE IoDeviceHandlerObjectType; extern NTOSAPI POBJECT_TYPE IoDeviceObjectType; extern NTOSAPI POBJECT_TYPE IoDriverObjectType; extern NTOSAPI POBJECT_TYPE IoFileObjectType; extern NTOSAPI POBJECT_TYPE LpcPortObjectType; extern NTOSAPI POBJECT_TYPE MmSectionObjectType; extern NTOSAPI POBJECT_TYPE SeTokenObjectType; extern NTOSAPI CCHAR KeNumberProcessors; extern NTOSAPI PHAL_DISPATCH_TABLE HalDispatchTable; extern NTOSAPI PHAL_PRIVATE_DISPATCH_TABLE HalPrivateDispatchTable; /* ** IRP function codes */ #define IRP_MJ_CREATE 0x00 #define IRP_MJ_CREATE_NAMED_PIPE 0x01 #define IRP_MJ_CLOSE 0x02 #define IRP_MJ_READ 0x03 #define IRP_MJ_WRITE 0x04 #define IRP_MJ_QUERY_INFORMATION 0x05 #define IRP_MJ_SET_INFORMATION 0x06 #define IRP_MJ_QUERY_EA 0x07 #define IRP_MJ_SET_EA 0x08 #define IRP_MJ_FLUSH_BUFFERS 0x09 #define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0a #define IRP_MJ_SET_VOLUME_INFORMATION 0x0b #define IRP_MJ_DIRECTORY_CONTROL 0x0c #define IRP_MJ_FILE_SYSTEM_CONTROL 0x0d #define IRP_MJ_DEVICE_CONTROL 0x0e #define IRP_MJ_INTERNAL_DEVICE_CONTROL 0x0f #define IRP_MJ_SCSI 0x0f #define IRP_MJ_SHUTDOWN 0x10 #define IRP_MJ_LOCK_CONTROL 0x11 #define IRP_MJ_CLEANUP 0x12 #define IRP_MJ_CREATE_MAILSLOT 0x13 #define IRP_MJ_QUERY_SECURITY 0x14 #define IRP_MJ_SET_SECURITY 0x15 #define IRP_MJ_POWER 0x16 #define IRP_MJ_SYSTEM_CONTROL 0x17 #define IRP_MJ_DEVICE_CHANGE 0x18 #define IRP_MJ_QUERY_QUOTA 0x19 #define IRP_MJ_SET_QUOTA 0x1a #define IRP_MJ_PNP 0x1b #define IRP_MJ_PNP_POWER 0x1b #define IRP_MJ_MAXIMUM_FUNCTION 0x1b #define IRP_MN_QUERY_DIRECTORY 0x01 #define IRP_MN_NOTIFY_CHANGE_DIRECTORY 0x02 #define IRP_MN_USER_FS_REQUEST 0x00 #define IRP_MN_MOUNT_VOLUME 0x01 #define IRP_MN_VERIFY_VOLUME 0x02 #define IRP_MN_LOAD_FILE_SYSTEM 0x03 #define IRP_MN_TRACK_LINK 0x04 #define IRP_MN_KERNEL_CALL 0x04 #define IRP_MN_LOCK 0x01 #define IRP_MN_UNLOCK_SINGLE 0x02 #define IRP_MN_UNLOCK_ALL 0x03 #define IRP_MN_UNLOCK_ALL_BY_KEY 0x04 #define IRP_MN_NORMAL 0x00 #define IRP_MN_DPC 0x01 #define IRP_MN_MDL 0x02 #define IRP_MN_COMPLETE 0x04 #define IRP_MN_COMPRESSED 0x08 #define IRP_MN_MDL_DPC (IRP_MN_MDL | IRP_MN_DPC) #define IRP_MN_COMPLETE_MDL (IRP_MN_COMPLETE | IRP_MN_MDL) #define IRP_MN_COMPLETE_MDL_DPC (IRP_MN_COMPLETE_MDL | IRP_MN_DPC) #define IRP_MN_SCSI_CLASS 0x01 #define IRP_MN_START_DEVICE 0x00 #define IRP_MN_QUERY_REMOVE_DEVICE 0x01 #define IRP_MN_REMOVE_DEVICE 0x02 #define IRP_MN_CANCEL_REMOVE_DEVICE 0x03 #define IRP_MN_STOP_DEVICE 0x04 #define IRP_MN_QUERY_STOP_DEVICE 0x05 #define IRP_MN_CANCEL_STOP_DEVICE 0x06 #define IRP_MN_QUERY_DEVICE_RELATIONS 0x07 #define IRP_MN_QUERY_INTERFACE 0x08 #define IRP_MN_QUERY_CAPABILITIES 0x09 #define IRP_MN_QUERY_RESOURCES 0x0A #define IRP_MN_QUERY_RESOURCE_REQUIREMENTS 0x0B #define IRP_MN_QUERY_DEVICE_TEXT 0x0C #define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D #define IRP_MN_READ_CONFIG 0x0F #define IRP_MN_WRITE_CONFIG 0x10 #define IRP_MN_EJECT 0x11 #define IRP_MN_SET_LOCK 0x12 #define IRP_MN_QUERY_ID 0x13 #define IRP_MN_QUERY_PNP_DEVICE_STATE 0x14 #define IRP_MN_QUERY_BUS_INFORMATION 0x15 #define IRP_MN_DEVICE_USAGE_NOTIFICATION 0x16 #define IRP_MN_SURPRISE_REMOVAL 0x17 #define IRP_MN_QUERY_LEGACY_BUS_INFORMATION 0x18 #define IRP_MN_WAIT_WAKE 0x00 #define IRP_MN_POWER_SEQUENCE 0x01 #define IRP_MN_SET_POWER 0x02 #define IRP_MN_QUERY_POWER 0x03 #define IRP_MN_QUERY_ALL_DATA 0x00 #define IRP_MN_QUERY_SINGLE_INSTANCE 0x01 #define IRP_MN_CHANGE_SINGLE_INSTANCE 0x02 #define IRP_MN_CHANGE_SINGLE_ITEM 0x03 #define IRP_MN_ENABLE_EVENTS 0x04 #define IRP_MN_DISABLE_EVENTS 0x05 #define IRP_MN_ENABLE_COLLECTION 0x06 #define IRP_MN_DISABLE_COLLECTION 0x07 #define IRP_MN_REGINFO 0x08 #define IRP_MN_EXECUTE_METHOD 0x09 #define IRP_MN_REGINFO_EX 0x0b typedef enum _IO_ALLOCATION_ACTION { KeepObject = 1, DeallocateObject, DeallocateObjectKeepRegisters } IO_ALLOCATION_ACTION, *PIO_ALLOCATION_ACTION; typedef IO_ALLOCATION_ACTION (DDKAPI *PDRIVER_CONTROL)( /*IN*/ struct _DEVICE_OBJECT *DeviceObject, /*IN*/ struct _IRP *Irp, /*IN*/ PVOID MapRegisterBase, /*IN*/ PVOID Context); typedef VOID (DDKAPI *PDRIVER_LIST_CONTROL)( /*IN*/ struct _DEVICE_OBJECT *DeviceObject, /*IN*/ struct _IRP *Irp, /*IN*/ struct _SCATTER_GATHER_LIST *ScatterGather, /*IN*/ PVOID Context); typedef NTSTATUS (DDKAPI *PDRIVER_ADD_DEVICE)( /*IN*/ struct _DRIVER_OBJECT *DriverObject, /*IN*/ struct _DEVICE_OBJECT *PhysicalDeviceObject); typedef NTSTATUS (DDKAPI *PIO_COMPLETION_ROUTINE)( /*IN*/ struct _DEVICE_OBJECT *DeviceObject, /*IN*/ struct _IRP *Irp, /*IN*/ PVOID Context); typedef VOID (DDKAPI *PDRIVER_CANCEL)( /*IN*/ struct _DEVICE_OBJECT *DeviceObject, /*IN*/ struct _IRP *Irp); typedef VOID (DDKAPI *PKDEFERRED_ROUTINE)( /*IN*/ struct _KDPC *Dpc, /*IN*/ PVOID DeferredContext, /*IN*/ PVOID SystemArgument1, /*IN*/ PVOID SystemArgument2); typedef NTSTATUS (DDKAPI *PDRIVER_DISPATCH)( /*IN*/ struct _DEVICE_OBJECT *DeviceObject, /*IN*/ struct _IRP *Irp); typedef VOID (DDKAPI *PIO_DPC_ROUTINE)( /*IN*/ struct _KDPC *Dpc, /*IN*/ struct _DEVICE_OBJECT *DeviceObject, /*IN*/ struct _IRP *Irp, /*IN*/ PVOID Context); typedef NTSTATUS (DDKAPI *PMM_DLL_INITIALIZE)( /*IN*/ PUNICODE_STRING RegistryPath); typedef NTSTATUS (DDKAPI *PMM_DLL_UNLOAD)( VOID); typedef NTSTATUS (DDKAPI *PDRIVER_ENTRY)( /*IN*/ struct _DRIVER_OBJECT *DriverObject, /*IN*/ PUNICODE_STRING RegistryPath); typedef NTSTATUS (DDKAPI *PDRIVER_INITIALIZE)( /*IN*/ struct _DRIVER_OBJECT *DriverObject, /*IN*/ PUNICODE_STRING RegistryPath); typedef BOOLEAN (DDKAPI *PKSERVICE_ROUTINE)( /*IN*/ struct _KINTERRUPT *Interrupt, /*IN*/ PVOID ServiceContext); typedef VOID (DDKAPI *PIO_TIMER_ROUTINE)( /*IN*/ struct _DEVICE_OBJECT *DeviceObject, /*IN*/ PVOID Context); typedef VOID (DDKAPI *PDRIVER_REINITIALIZE)( /*IN*/ struct _DRIVER_OBJECT *DriverObject, /*IN*/ PVOID Context, /*IN*/ ULONG Count); typedef NTSTATUS (DDKAPI *PDRIVER_STARTIO)( /*IN*/ struct _DEVICE_OBJECT *DeviceObject, /*IN*/ struct _IRP *Irp); typedef BOOLEAN (DDKAPI *PKSYNCHRONIZE_ROUTINE)( /*IN*/ PVOID SynchronizeContext); typedef VOID (DDKAPI *PDRIVER_UNLOAD)( /*IN*/ struct _DRIVER_OBJECT *DriverObject); /* ** Plug and Play structures */ typedef VOID DDKAPI (*PINTERFACE_REFERENCE)( PVOID Context); typedef VOID DDKAPI (*PINTERFACE_DEREFERENCE)( PVOID Context); typedef BOOLEAN DDKAPI (*PTRANSLATE_BUS_ADDRESS)( /*IN*/ PVOID Context, /*IN*/ PHYSICAL_ADDRESS BusAddress, /*IN*/ ULONG Length, /*IN OUT*/ PULONG AddressSpace, /*OUT*/ PPHYSICAL_ADDRESS TranslatedAddress); typedef struct _DMA_ADAPTER* DDKAPI (*PGET_DMA_ADAPTER)( /*IN*/ PVOID Context, /*IN*/ struct _DEVICE_DESCRIPTION *DeviceDescriptor, /*OUT*/ PULONG NumberOfMapRegisters); typedef ULONG DDKAPI (*PGET_SET_DEVICE_DATA)( /*IN*/ PVOID Context, /*IN*/ ULONG DataType, /*IN*/ PVOID Buffer, /*IN*/ ULONG Offset, /*IN*/ ULONG Length); typedef union _POWER_STATE { SYSTEM_POWER_STATE SystemState; DEVICE_POWER_STATE DeviceState; } POWER_STATE, *PPOWER_STATE; typedef enum _POWER_STATE_TYPE { SystemPowerState, DevicePowerState } POWER_STATE_TYPE, *PPOWER_STATE_TYPE; typedef struct _BUS_INTERFACE_STANDARD { USHORT Size; USHORT Version; PVOID Context; PINTERFACE_REFERENCE InterfaceReference; PINTERFACE_DEREFERENCE InterfaceDereference; PTRANSLATE_BUS_ADDRESS TranslateBusAddress; PGET_DMA_ADAPTER GetDmaAdapter; PGET_SET_DEVICE_DATA SetBusData; PGET_SET_DEVICE_DATA GetBusData; } BUS_INTERFACE_STANDARD, *PBUS_INTERFACE_STANDARD; typedef struct _DEVICE_CAPABILITIES { USHORT Size; USHORT Version; ULONG DeviceD1 : 1; ULONG DeviceD2 : 1; ULONG LockSupported : 1; ULONG EjectSupported : 1; ULONG Removable : 1; ULONG DockDevice : 1; ULONG UniqueID : 1; ULONG SilentInstall : 1; ULONG RawDeviceOK : 1; ULONG SurpriseRemovalOK : 1; ULONG WakeFromD0 : 1; ULONG WakeFromD1 : 1; ULONG WakeFromD2 : 1; ULONG WakeFromD3 : 1; ULONG HardwareDisabled : 1; ULONG NonDynamic : 1; ULONG WarmEjectSupported : 1; ULONG NoDisplayInUI : 1; ULONG Reserved : 14; ULONG Address; ULONG UINumber; DEVICE_POWER_STATE DeviceState[PowerSystemMaximum]; SYSTEM_POWER_STATE SystemWake; DEVICE_POWER_STATE DeviceWake; ULONG D1Latency; ULONG D2Latency; ULONG D3Latency; } DEVICE_CAPABILITIES, *PDEVICE_CAPABILITIES; typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION { USHORT Version; USHORT Size; GUID Event; GUID InterfaceClassGuid; PUNICODE_STRING SymbolicLinkName; } DEVICE_INTERFACE_CHANGE_NOTIFICATION, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION; typedef struct _HWPROFILE_CHANGE_NOTIFICATION { USHORT Version; USHORT Size; GUID Event; } HWPROFILE_CHANGE_NOTIFICATION, *PHWPROFILE_CHANGE_NOTIFICATION; #undef INTERFACE typedef struct _INTERFACE { USHORT Size; USHORT Version; PVOID Context; PINTERFACE_REFERENCE InterfaceReference; PINTERFACE_DEREFERENCE InterfaceDereference; } INTERFACE, *PINTERFACE; typedef struct _PLUGPLAY_NOTIFICATION_HEADER { USHORT Version; USHORT Size; GUID Event; } PLUGPLAY_NOTIFICATION_HEADER, *PPLUGPLAY_NOTIFICATION_HEADER; typedef ULONG PNP_DEVICE_STATE, *PPNP_DEVICE_STATE; /* PNP_DEVICE_STATE */ #define PNP_DEVICE_DISABLED 0x00000001 #define PNP_DEVICE_DONT_DISPLAY_IN_UI 0x00000002 #define PNP_DEVICE_FAILED 0x00000004 #define PNP_DEVICE_REMOVED 0x00000008 #define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010 #define PNP_DEVICE_NOT_DISABLEABLE 0x00000020 typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION { USHORT Version; USHORT Size; GUID Event; struct _FILE_OBJECT *FileObject; LONG NameBufferOffset; UCHAR CustomDataBuffer[1]; } TARGET_DEVICE_CUSTOM_NOTIFICATION, *PTARGET_DEVICE_CUSTOM_NOTIFICATION; typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION { USHORT Version; USHORT Size; GUID Event; struct _FILE_OBJECT *FileObject; } TARGET_DEVICE_REMOVAL_NOTIFICATION, *PTARGET_DEVICE_REMOVAL_NOTIFICATION; typedef enum _BUS_QUERY_ID_TYPE { BusQueryDeviceID, BusQueryHardwareIDs, BusQueryCompatibleIDs, BusQueryInstanceID, BusQueryDeviceSerialNumber } BUS_QUERY_ID_TYPE, *PBUS_QUERY_ID_TYPE; typedef enum _DEVICE_TEXT_TYPE { DeviceTextDescription, DeviceTextLocationInformation } DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE; typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE { DeviceUsageTypeUndefined, DeviceUsageTypePaging, DeviceUsageTypeHibernation, DeviceUsageTypeDumpFile } DEVICE_USAGE_NOTIFICATION_TYPE; typedef struct _POWER_SEQUENCE { ULONG SequenceD1; ULONG SequenceD2; ULONG SequenceD3; } POWER_SEQUENCE, *PPOWER_SEQUENCE; typedef enum { DevicePropertyDeviceDescription, DevicePropertyHardwareID, DevicePropertyCompatibleIDs, DevicePropertyBootConfiguration, DevicePropertyBootConfigurationTranslated, DevicePropertyClassName, DevicePropertyClassGuid, DevicePropertyDriverKeyName, DevicePropertyManufacturer, DevicePropertyFriendlyName, DevicePropertyLocationInformation, DevicePropertyPhysicalDeviceObjectName, DevicePropertyBusTypeGuid, DevicePropertyLegacyBusType, DevicePropertyBusNumber, DevicePropertyEnumeratorName, DevicePropertyAddress, DevicePropertyUINumber, DevicePropertyInstallState, DevicePropertyRemovalPolicy } DEVICE_REGISTRY_PROPERTY; typedef enum _IO_NOTIFICATION_EVENT_CATEGORY { EventCategoryReserved, EventCategoryHardwareProfileChange, EventCategoryDeviceInterfaceChange, EventCategoryTargetDeviceChange } IO_NOTIFICATION_EVENT_CATEGORY; #define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES 0x00000001 typedef NTSTATUS DDKAPI (*PDRIVER_NOTIFICATION_CALLBACK_ROUTINE)( /*IN*/ PVOID NotificationStructure, /*IN*/ PVOID Context); typedef VOID DDKAPI (*PDEVICE_CHANGE_COMPLETE_CALLBACK)( /*IN*/ PVOID Context); /* ** System structures */ #define SYMBOLIC_LINK_QUERY 0x0001 #define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1) /* also in winnt,h */ #define DUPLICATE_CLOSE_SOURCE 0x00000001 #define DUPLICATE_SAME_ACCESS 0x00000002 #define DUPLICATE_SAME_ATTRIBUTES 0x00000004 /* end winnt.h */ typedef struct _OBJECT_NAME_INFORMATION { UNICODE_STRING Name; } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION; typedef VOID DDKAPI (*PIO_APC_ROUTINE)( /*IN*/ PVOID ApcContext, /*IN*/ PIO_STATUS_BLOCK IoStatusBlock, /*IN*/ ULONG Reserved); typedef struct _IO_STATUS_BLOCK { _ANONYMOUS_UNION union { NTSTATUS Status; PVOID Pointer; } DUMMYUNIONNAME; ULONG_PTR Information; } IO_STATUS_BLOCK; typedef VOID DDKAPI (*PKNORMAL_ROUTINE)( /*IN*/ PVOID NormalContext, /*IN*/ PVOID SystemArgument1, /*IN*/ PVOID SystemArgument2); typedef VOID DDKAPI (*PKKERNEL_ROUTINE)( /*IN*/ struct _KAPC *Apc, /*IN OUT*/ PKNORMAL_ROUTINE *NormalRoutine, /*IN OUT*/ PVOID *NormalContext, /*IN OUT*/ PVOID *SystemArgument1, /*IN OUT*/ PVOID *SystemArgument2); typedef VOID DDKAPI (*PKRUNDOWN_ROUTINE)( /*IN*/ struct _KAPC *Apc); typedef BOOLEAN DDKAPI (*PKTRANSFER_ROUTINE)( VOID); typedef struct _KAPC { CSHORT Type; CSHORT Size; ULONG Spare0; struct _KTHREAD *Thread; LIST_ENTRY ApcListEntry; PKKERNEL_ROUTINE KernelRoutine; PKRUNDOWN_ROUTINE RundownRoutine; PKNORMAL_ROUTINE NormalRoutine; PVOID NormalContext; PVOID SystemArgument1; PVOID SystemArgument2; CCHAR ApcStateIndex; KPROCESSOR_MODE ApcMode; BOOLEAN Inserted; } KAPC, *PKAPC, *RESTRICTED_POINTER PRKAPC; typedef struct _KDEVICE_QUEUE { CSHORT Type; CSHORT Size; LIST_ENTRY DeviceListHead; KSPIN_LOCK Lock; BOOLEAN Busy; } KDEVICE_QUEUE, *PKDEVICE_QUEUE, *RESTRICTED_POINTER PRKDEVICE_QUEUE; typedef struct _KDEVICE_QUEUE_ENTRY { LIST_ENTRY DeviceListEntry; ULONG SortKey; BOOLEAN Inserted; } KDEVICE_QUEUE_ENTRY, *PKDEVICE_QUEUE_ENTRY, *RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY; #define LOCK_QUEUE_WAIT 1 #define LOCK_QUEUE_OWNER 2 typedef enum _KSPIN_LOCK_QUEUE_NUMBER { LockQueueDispatcherLock, LockQueueContextSwapLock, LockQueuePfnLock, LockQueueSystemSpaceLock, LockQueueVacbLock, LockQueueMasterLock, LockQueueNonPagedPoolLock, LockQueueIoCancelLock, LockQueueWorkQueueLock, LockQueueIoVpbLock, LockQueueIoDatabaseLock, LockQueueIoCompletionLock, LockQueueNtfsStructLock, LockQueueAfdWorkQueueLock, LockQueueBcbLock, LockQueueMaximumLock } KSPIN_LOCK_QUEUE_NUMBER, *PKSPIN_LOCK_QUEUE_NUMBER; typedef struct _KSPIN_LOCK_QUEUE { struct _KSPIN_LOCK_QUEUE *VOLATILE Next; PKSPIN_LOCK VOLATILE Lock; } KSPIN_LOCK_QUEUE, *PKSPIN_LOCK_QUEUE; typedef struct _KLOCK_QUEUE_HANDLE { KSPIN_LOCK_QUEUE LockQueue; KIRQL OldIrql; } KLOCK_QUEUE_HANDLE, *PKLOCK_QUEUE_HANDLE; typedef struct _KDPC { CSHORT Type; UCHAR Number; UCHAR Importance; LIST_ENTRY DpcListEntry; PKDEFERRED_ROUTINE DeferredRoutine; PVOID DeferredContext; PVOID SystemArgument1; PVOID SystemArgument2; PULONG_PTR Lock; } KDPC, *PKDPC, *RESTRICTED_POINTER PRKDPC; typedef struct _WAIT_CONTEXT_BLOCK { KDEVICE_QUEUE_ENTRY WaitQueueEntry; struct _DRIVER_CONTROL *DeviceRoutine; PVOID DeviceContext; ULONG NumberOfMapRegisters; PVOID DeviceObject; PVOID CurrentIrp; PKDPC BufferChainingDpc; } WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK; typedef struct _DISPATCHER_HEADER { UCHAR Type; UCHAR Absolute; UCHAR Size; UCHAR Inserted; LONG SignalState; LIST_ENTRY WaitListHead; } DISPATCHER_HEADER, *PDISPATCHER_HEADER; typedef struct _KEVENT { DISPATCHER_HEADER Header; } KEVENT, *PKEVENT, *RESTRICTED_POINTER PRKEVENT; typedef struct _KSEMAPHORE { DISPATCHER_HEADER Header; LONG Limit; } KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE; typedef struct _FAST_MUTEX { LONG Count; struct _KTHREAD *Owner; ULONG Contention; KEVENT Event; ULONG OldIrql; } FAST_MUTEX, *PFAST_MUTEX; typedef struct _KTIMER { DISPATCHER_HEADER Header; ULARGE_INTEGER DueTime; LIST_ENTRY TimerListEntry; struct _KDPC *Dpc; LONG Period; } KTIMER, *PKTIMER, *RESTRICTED_POINTER PRKTIMER; typedef struct _KMUTANT { DISPATCHER_HEADER Header; LIST_ENTRY MutantListEntry; struct _KTHREAD *RESTRICTED_POINTER OwnerThread; BOOLEAN Abandoned; UCHAR ApcDisable; } KMUTANT, *PKMUTANT, *RESTRICTED_POINTER PRKMUTANT, KMUTEX, *PKMUTEX, *RESTRICTED_POINTER PRKMUTEX; typedef enum _TIMER_TYPE { NotificationTimer, SynchronizationTimer } TIMER_TYPE; #define EVENT_INCREMENT 1 #define IO_NO_INCREMENT 0 #define IO_CD_ROM_INCREMENT 1 #define IO_DISK_INCREMENT 1 #define IO_KEYBOARD_INCREMENT 6 #define IO_MAILSLOT_INCREMENT 2 #define IO_MOUSE_INCREMENT 6 #define IO_NAMED_PIPE_INCREMENT 2 #define IO_NETWORK_INCREMENT 2 #define IO_PARALLEL_INCREMENT 1 #define IO_SERIAL_INCREMENT 2 #define IO_SOUND_INCREMENT 8 #define IO_VIDEO_INCREMENT 1 #define SEMAPHORE_INCREMENT 1 typedef struct _IRP { CSHORT Type; USHORT Size; struct _MDL *MdlAddress; ULONG Flags; union { struct _IRP *MasterIrp; LONG IrpCount; PVOID SystemBuffer; } AssociatedIrp; LIST_ENTRY ThreadListEntry; IO_STATUS_BLOCK IoStatus; KPROCESSOR_MODE RequestorMode; BOOLEAN PendingReturned; CHAR StackCount; CHAR CurrentLocation; BOOLEAN Cancel; KIRQL CancelIrql; CCHAR ApcEnvironment; UCHAR AllocationFlags; PIO_STATUS_BLOCK UserIosb; PKEVENT UserEvent; union { struct { PIO_APC_ROUTINE UserApcRoutine; PVOID UserApcContext; } AsynchronousParameters; LARGE_INTEGER AllocationSize; } Overlay; PDRIVER_CANCEL CancelRoutine; PVOID UserBuffer; union { struct { _ANONYMOUS_UNION union { KDEVICE_QUEUE_ENTRY DeviceQueueEntry; _ANONYMOUS_STRUCT struct { PVOID DriverContext[4]; } DUMMYSTRUCTNAME; } DUMMYUNIONNAME; PETHREAD Thread; PCHAR AuxiliaryBuffer; _ANONYMOUS_STRUCT struct { LIST_ENTRY ListEntry; _ANONYMOUS_UNION union { struct _IO_STACK_LOCATION *CurrentStackLocation; ULONG PacketType; } DUMMYUNIONNAME; } DUMMYSTRUCTNAME; struct _FILE_OBJECT *OriginalFileObject; } Overlay; KAPC Apc; PVOID CompletionKey; } Tail; } IRP; typedef struct _IRP *PIRP; /* IRP.Flags */ #define SL_FORCE_ACCESS_CHECK 0x01 #define SL_OPEN_PAGING_FILE 0x02 #define SL_OPEN_TARGET_DIRECTORY 0x04 #define SL_CASE_SENSITIVE 0x80 #define SL_KEY_SPECIFIED 0x01 #define SL_OVERRIDE_VERIFY_VOLUME 0x02 #define SL_WRITE_THROUGH 0x04 #define SL_FT_SEQUENTIAL_WRITE 0x08 #define SL_FAIL_IMMEDIATELY 0x01 #define SL_EXCLUSIVE_LOCK 0x02 #define SL_RESTART_SCAN 0x01 #define SL_RETURN_SINGLE_ENTRY 0x02 #define SL_INDEX_SPECIFIED 0x04 #define SL_WATCH_TREE 0x01 #define SL_ALLOW_RAW_MOUNT 0x01 #define CTL_CODE(DeviceType, Function, Method, Access)( \ ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)) #define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16) enum { IRP_NOCACHE = 0x1, IRP_PAGING_IO = 0x2, IRP_MOUNT_COMPLETION = 0x2, IRP_SYNCHRONOUS_API = 0x4, IRP_ASSOCIATED_IRP = 0x8, IRP_BUFFERED_IO = 0x10, IRP_DEALLOCATE_BUFFER = 0x20, IRP_INPUT_OPERATION = 0x40, IRP_SYNCHRONOUS_PAGING_IO = 0x40, IRP_CREATE_OPERATION = 0x80, IRP_READ_OPERATION = 0x100, IRP_WRITE_OPERATION = 0x200, IRP_CLOSE_OPERATION = 0x400, IRP_DEFER_IO_COMPLETION = 0x800, IRP_OB_QUERY_NAME = 0x1000, IRP_HOLD_DEVICE_QUEUE = 0x2000, IRP_RETRY_IO_COMPLETION = 0x4000 }; typedef struct _DRIVE_LAYOUT_INFORMATION_MBR { ULONG Signature; } DRIVE_LAYOUT_INFORMATION_MBR, *PDRIVE_LAYOUT_INFORMATION_MBR; typedef struct _DRIVE_LAYOUT_INFORMATION_GPT { GUID DiskId; LARGE_INTEGER StartingUsableOffset; LARGE_INTEGER UsableLength; ULONG MaxPartitionCount; } DRIVE_LAYOUT_INFORMATION_GPT, *PDRIVE_LAYOUT_INFORMATION_GPT; typedef struct _PARTITION_INFORMATION_MBR { UCHAR PartitionType; BOOLEAN BootIndicator; BOOLEAN RecognizedPartition; ULONG HiddenSectors; } PARTITION_INFORMATION_MBR, *PPARTITION_INFORMATION_MBR; typedef struct _BOOTDISK_INFORMATION { LONGLONG BootPartitionOffset; LONGLONG SystemPartitionOffset; ULONG BootDeviceSignature; ULONG SystemDeviceSignature; } BOOTDISK_INFORMATION, *PBOOTDISK_INFORMATION; typedef struct _BOOTDISK_INFORMATION_EX { LONGLONG BootPartitionOffset; LONGLONG SystemPartitionOffset; ULONG BootDeviceSignature; ULONG SystemDeviceSignature; GUID BootDeviceGuid; GUID SystemDeviceGuid; BOOLEAN BootDeviceIsGpt; BOOLEAN SystemDeviceIsGpt; } BOOTDISK_INFORMATION_EX, *PBOOTDISK_INFORMATION_EX; typedef struct _EISA_MEMORY_TYPE { UCHAR ReadWrite : 1; UCHAR Cached : 1; UCHAR Reserved0 : 1; UCHAR Type : 2; UCHAR Shared : 1; UCHAR Reserved1 : 1; UCHAR MoreEntries : 1; } EISA_MEMORY_TYPE, *PEISA_MEMORY_TYPE; #include typedef struct _EISA_MEMORY_CONFIGURATION { EISA_MEMORY_TYPE ConfigurationByte; UCHAR DataSize; USHORT AddressLowWord; UCHAR AddressHighByte; USHORT MemorySize; } EISA_MEMORY_CONFIGURATION, *PEISA_MEMORY_CONFIGURATION; #include typedef struct _EISA_IRQ_DESCRIPTOR { UCHAR Interrupt : 4; UCHAR Reserved : 1; UCHAR LevelTriggered : 1; UCHAR Shared : 1; UCHAR MoreEntries : 1; } EISA_IRQ_DESCRIPTOR, *PEISA_IRQ_DESCRIPTOR; typedef struct _EISA_IRQ_CONFIGURATION { EISA_IRQ_DESCRIPTOR ConfigurationByte; UCHAR Reserved; } EISA_IRQ_CONFIGURATION, *PEISA_IRQ_CONFIGURATION; typedef struct _DMA_CONFIGURATION_BYTE0 { UCHAR Channel : 3; UCHAR Reserved : 3; UCHAR Shared : 1; UCHAR MoreEntries : 1; } DMA_CONFIGURATION_BYTE0; typedef struct _DMA_CONFIGURATION_BYTE1 { UCHAR Reserved0 : 2; UCHAR TransferSize : 2; UCHAR Timing : 2; UCHAR Reserved1 : 2; } DMA_CONFIGURATION_BYTE1; typedef struct _EISA_DMA_CONFIGURATION { DMA_CONFIGURATION_BYTE0 ConfigurationByte0; DMA_CONFIGURATION_BYTE1 ConfigurationByte1; } EISA_DMA_CONFIGURATION, *PEISA_DMA_CONFIGURATION; #include typedef struct _EISA_PORT_DESCRIPTOR { UCHAR NumberPorts : 5; UCHAR Reserved : 1; UCHAR Shared : 1; UCHAR MoreEntries : 1; } EISA_PORT_DESCRIPTOR, *PEISA_PORT_DESCRIPTOR; typedef struct _EISA_PORT_CONFIGURATION { EISA_PORT_DESCRIPTOR Configuration; USHORT PortAddress; } EISA_PORT_CONFIGURATION, *PEISA_PORT_CONFIGURATION; #include typedef struct _CM_EISA_FUNCTION_INFORMATION { ULONG CompressedId; UCHAR IdSlotFlags1; UCHAR IdSlotFlags2; UCHAR MinorRevision; UCHAR MajorRevision; UCHAR Selections[26]; UCHAR FunctionFlags; UCHAR TypeString[80]; EISA_MEMORY_CONFIGURATION EisaMemory[9]; EISA_IRQ_CONFIGURATION EisaIrq[7]; EISA_DMA_CONFIGURATION EisaDma[4]; EISA_PORT_CONFIGURATION EisaPort[20]; UCHAR InitializationData[60]; } CM_EISA_FUNCTION_INFORMATION, *PCM_EISA_FUNCTION_INFORMATION; /* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */ #define EISA_FUNCTION_ENABLED 0x80 #define EISA_FREE_FORM_DATA 0x40 #define EISA_HAS_PORT_INIT_ENTRY 0x20 #define EISA_HAS_PORT_RANGE 0x10 #define EISA_HAS_DMA_ENTRY 0x08 #define EISA_HAS_IRQ_ENTRY 0x04 #define EISA_HAS_MEMORY_ENTRY 0x02 #define EISA_HAS_TYPE_ENTRY 0x01 #define EISA_HAS_INFORMATION \ (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \ + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY) typedef struct _CM_EISA_SLOT_INFORMATION { UCHAR ReturnCode; UCHAR ReturnFlags; UCHAR MajorRevision; UCHAR MinorRevision; USHORT Checksum; UCHAR NumberFunctions; UCHAR FunctionInformation; ULONG CompressedId; } CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION; /* CM_EISA_SLOT_INFORMATION.ReturnCode */ #define EISA_INVALID_SLOT 0x80 #define EISA_INVALID_FUNCTION 0x81 #define EISA_INVALID_CONFIGURATION 0x82 #define EISA_EMPTY_SLOT 0x83 #define EISA_INVALID_BIOS_CALL 0x86 typedef struct _CM_FLOPPY_DEVICE_DATA { USHORT Version; USHORT Revision; CHAR Size[8]; ULONG MaxDensity; ULONG MountDensity; UCHAR StepRateHeadUnloadTime; UCHAR HeadLoadTime; UCHAR MotorOffTime; UCHAR SectorLengthCode; UCHAR SectorPerTrack; UCHAR ReadWriteGapLength; UCHAR DataTransferLength; UCHAR FormatGapLength; UCHAR FormatFillCharacter; UCHAR HeadSettleTime; UCHAR MotorSettleTime; UCHAR MaximumTrackValue; UCHAR DataTransferRate; } CM_FLOPPY_DEVICE_DATA, *PCM_FLOPPY_DEVICE_DATA; typedef enum _INTERFACE_TYPE { InterfaceTypeUndefined = -1, Internal, Isa, Eisa, MicroChannel, TurboChannel, PCIBus, VMEBus, NuBus, PCMCIABus, CBus, MPIBus, MPSABus, ProcessorInternal, InternalPowerBus, PNPISABus, PNPBus, MaximumInterfaceType } INTERFACE_TYPE, *PINTERFACE_TYPE; typedef struct _PNP_BUS_INFORMATION { GUID BusTypeGuid; INTERFACE_TYPE LegacyBusType; ULONG BusNumber; } PNP_BUS_INFORMATION, *PPNP_BUS_INFORMATION; #include typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR { UCHAR Type; UCHAR ShareDisposition; USHORT Flags; union { struct { PHYSICAL_ADDRESS Start; ULONG Length; } Generic; struct { PHYSICAL_ADDRESS Start; ULONG Length; } Port; struct { ULONG Level; ULONG Vector; ULONG Affinity; } Interrupt; struct { PHYSICAL_ADDRESS Start; ULONG Length; } Memory; struct { ULONG Channel; ULONG Port; ULONG Reserved1; } Dma; struct { ULONG Data[3]; } DevicePrivate; struct { ULONG Start; ULONG Length; ULONG Reserved; } BusNumber; struct { ULONG DataSize; ULONG Reserved1; ULONG Reserved2; } DeviceSpecificData; } u; } CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR; /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Type */ #define CmResourceTypeNull 0 #define CmResourceTypePort 1 #define CmResourceTypeInterrupt 2 #define CmResourceTypeMemory 3 #define CmResourceTypeDma 4 #define CmResourceTypeDeviceSpecific 5 #define CmResourceTypeBusNumber 6 #define CmResourceTypeMaximum 7 #define CmResourceTypeNonArbitrated 128 #define CmResourceTypeConfigData 128 #define CmResourceTypeDevicePrivate 129 #define CmResourceTypePcCardConfig 130 #define CmResourceTypeMfCardConfig 131 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.ShareDisposition */ typedef enum _CM_SHARE_DISPOSITION { CmResourceShareUndetermined, CmResourceShareDeviceExclusive, CmResourceShareDriverExclusive, CmResourceShareShared } CM_SHARE_DISPOSITION; /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypePort */ #define CM_RESOURCE_PORT_MEMORY 0x0000 #define CM_RESOURCE_PORT_IO 0x0001 #define CM_RESOURCE_PORT_10_BIT_DECODE 0x0004 #define CM_RESOURCE_PORT_12_BIT_DECODE 0x0008 #define CM_RESOURCE_PORT_16_BIT_DECODE 0x0010 #define CM_RESOURCE_PORT_POSITIVE_DECODE 0x0020 #define CM_RESOURCE_PORT_PASSIVE_DECODE 0x0040 #define CM_RESOURCE_PORT_WINDOW_DECODE 0x0080 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeInterrupt */ #define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0x0000 #define CM_RESOURCE_INTERRUPT_LATCHED 0x0001 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeMemory */ #define CM_RESOURCE_MEMORY_READ_WRITE 0x0000 #define CM_RESOURCE_MEMORY_READ_ONLY 0x0001 #define CM_RESOURCE_MEMORY_WRITE_ONLY 0x0002 #define CM_RESOURCE_MEMORY_PREFETCHABLE 0x0004 #define CM_RESOURCE_MEMORY_COMBINEDWRITE 0x0008 #define CM_RESOURCE_MEMORY_24 0x0010 #define CM_RESOURCE_MEMORY_CACHEABLE 0x0020 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeDma */ #define CM_RESOURCE_DMA_8 0x0000 #define CM_RESOURCE_DMA_16 0x0001 #define CM_RESOURCE_DMA_32 0x0002 #define CM_RESOURCE_DMA_8_AND_16 0x0004 #define CM_RESOURCE_DMA_BUS_MASTER 0x0008 #define CM_RESOURCE_DMA_TYPE_A 0x0010 #define CM_RESOURCE_DMA_TYPE_B 0x0020 #define CM_RESOURCE_DMA_TYPE_F 0x0040 typedef struct _CM_PARTIAL_RESOURCE_LIST { USHORT Version; USHORT Revision; ULONG Count; CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1]; } CM_PARTIAL_RESOURCE_LIST, *PCM_PARTIAL_RESOURCE_LIST; typedef struct _CM_FULL_RESOURCE_DESCRIPTOR { INTERFACE_TYPE InterfaceType; ULONG BusNumber; CM_PARTIAL_RESOURCE_LIST PartialResourceList; } CM_FULL_RESOURCE_DESCRIPTOR, *PCM_FULL_RESOURCE_DESCRIPTOR; typedef struct _CM_RESOURCE_LIST { ULONG Count; CM_FULL_RESOURCE_DESCRIPTOR List[1]; } CM_RESOURCE_LIST, *PCM_RESOURCE_LIST; typedef struct _CM_INT13_DRIVE_PARAMETER { USHORT DriveSelect; ULONG MaxCylinders; USHORT SectorsPerTrack; USHORT MaxHeads; USHORT NumberDrives; } CM_INT13_DRIVE_PARAMETER, *PCM_INT13_DRIVE_PARAMETER; #include typedef struct _CM_KEYBOARD_DEVICE_DATA { USHORT Version; USHORT Revision; UCHAR Type; UCHAR Subtype; USHORT KeyboardFlags; } CM_KEYBOARD_DEVICE_DATA, *PCM_KEYBOARD_DEVICE_DATA; #define KEYBOARD_INSERT_ON 0x80 #define KEYBOARD_CAPS_LOCK_ON 0x40 #define KEYBOARD_NUM_LOCK_ON 0x20 #define KEYBOARD_SCROLL_LOCK_ON 0x10 #define KEYBOARD_ALT_KEY_DOWN 0x08 #define KEYBOARD_CTRL_KEY_DOWN 0x04 #define KEYBOARD_LEFT_SHIFT_DOWN 0x02 #define KEYBOARD_RIGHT_SHIFT_DOWN 0x01 typedef struct _CM_MCA_POS_DATA { USHORT AdapterId; UCHAR PosData1; UCHAR PosData2; UCHAR PosData3; UCHAR PosData4; } CM_MCA_POS_DATA, *PCM_MCA_POS_DATA; typedef struct CM_Power_Data_s { ULONG PD_Size; DEVICE_POWER_STATE PD_MostRecentPowerState; ULONG PD_Capabilities; ULONG PD_D1Latency; ULONG PD_D2Latency; ULONG PD_D3Latency; DEVICE_POWER_STATE PD_PowerStateMapping[PowerSystemMaximum]; } CM_POWER_DATA, *PCM_POWER_DATA; #define PDCAP_D0_SUPPORTED 0x00000001 #define PDCAP_D1_SUPPORTED 0x00000002 #define PDCAP_D2_SUPPORTED 0x00000004 #define PDCAP_D3_SUPPORTED 0x00000008 #define PDCAP_WAKE_FROM_D0_SUPPORTED 0x00000010 #define PDCAP_WAKE_FROM_D1_SUPPORTED 0x00000020 #define PDCAP_WAKE_FROM_D2_SUPPORTED 0x00000040 #define PDCAP_WAKE_FROM_D3_SUPPORTED 0x00000080 #define PDCAP_WARM_EJECT_SUPPORTED 0x00000100 typedef struct _CM_SCSI_DEVICE_DATA { USHORT Version; USHORT Revision; UCHAR HostIdentifier; } CM_SCSI_DEVICE_DATA, *PCM_SCSI_DEVICE_DATA; typedef struct _CM_SERIAL_DEVICE_DATA { USHORT Version; USHORT Revision; ULONG BaudClock; } CM_SERIAL_DEVICE_DATA, *PCM_SERIAL_DEVICE_DATA; /* IO_RESOURCE_DESCRIPTOR.Option */ #define IO_RESOURCE_PREFERRED 0x01 #define IO_RESOURCE_DEFAULT 0x02 #define IO_RESOURCE_ALTERNATIVE 0x08 typedef struct _IO_RESOURCE_DESCRIPTOR { UCHAR Option; UCHAR Type; UCHAR ShareDisposition; UCHAR Spare1; USHORT Flags; USHORT Spare2; union { struct { ULONG Length; ULONG Alignment; PHYSICAL_ADDRESS MinimumAddress; PHYSICAL_ADDRESS MaximumAddress; } Port; struct { ULONG Length; ULONG Alignment; PHYSICAL_ADDRESS MinimumAddress; PHYSICAL_ADDRESS MaximumAddress; } Memory; struct { ULONG MinimumVector; ULONG MaximumVector; } Interrupt; struct { ULONG MinimumChannel; ULONG MaximumChannel; } Dma; struct { ULONG Length; ULONG Alignment; PHYSICAL_ADDRESS MinimumAddress; PHYSICAL_ADDRESS MaximumAddress; } Generic; struct { ULONG Data[3]; } DevicePrivate; struct { ULONG Length; ULONG MinBusNumber; ULONG MaxBusNumber; ULONG Reserved; } BusNumber; struct { ULONG Priority; ULONG Reserved1; ULONG Reserved2; } ConfigData; } u; } IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR; typedef struct _IO_RESOURCE_LIST { USHORT Version; USHORT Revision; ULONG Count; IO_RESOURCE_DESCRIPTOR Descriptors[1]; } IO_RESOURCE_LIST, *PIO_RESOURCE_LIST; typedef struct _IO_RESOURCE_REQUIREMENTS_LIST { ULONG ListSize; INTERFACE_TYPE InterfaceType; ULONG BusNumber; ULONG SlotNumber; ULONG Reserved[3]; ULONG AlternativeLists; IO_RESOURCE_LIST List[1]; } IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST; typedef struct _CONTROLLER_OBJECT { CSHORT Type; CSHORT Size; PVOID ControllerExtension; KDEVICE_QUEUE DeviceWaitQueue; ULONG Spare1; LARGE_INTEGER Spare2; } CONTROLLER_OBJECT, *PCONTROLLER_OBJECT; typedef enum _DMA_WIDTH { Width8Bits, Width16Bits, Width32Bits, MaximumDmaWidth } DMA_WIDTH, *PDMA_WIDTH; typedef enum _DMA_SPEED { Compatible, TypeA, TypeB, TypeC, TypeF, MaximumDmaSpeed } DMA_SPEED, *PDMA_SPEED; /* DEVICE_DESCRIPTION.Version */ #define DEVICE_DESCRIPTION_VERSION 0x0000 #define DEVICE_DESCRIPTION_VERSION1 0x0001 #define DEVICE_DESCRIPTION_VERSION2 0x0002 typedef struct _DEVICE_DESCRIPTION { ULONG Version; BOOLEAN Master; BOOLEAN ScatterGather; BOOLEAN DemandMode; BOOLEAN AutoInitialize; BOOLEAN Dma32BitAddresses; BOOLEAN IgnoreCount; BOOLEAN Reserved1; BOOLEAN Dma64BitAddresses; ULONG BusNumber; ULONG DmaChannel; INTERFACE_TYPE InterfaceType; DMA_WIDTH DmaWidth; DMA_SPEED DmaSpeed; ULONG MaximumLength; ULONG DmaPort; } DEVICE_DESCRIPTION, *PDEVICE_DESCRIPTION; /* VPB.Flags */ #define VPB_MOUNTED 0x0001 #define VPB_LOCKED 0x0002 #define VPB_PERSISTENT 0x0004 #define VPB_REMOVE_PENDING 0x0008 #define VPB_RAW_MOUNT 0x0010 #define MAXIMUM_VOLUME_LABEL_LENGTH (32 * sizeof(WCHAR)) typedef struct _VPB { CSHORT Type; CSHORT Size; USHORT Flags; USHORT VolumeLabelLength; struct _DEVICE_OBJECT *DeviceObject; struct _DEVICE_OBJECT *RealDevice; ULONG SerialNumber; ULONG ReferenceCount; WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)]; } VPB, *PVPB; /* DEVICE_OBJECT.Flags */ #define DO_VERIFY_VOLUME 0x00000002 #define DO_BUFFERED_IO 0x00000004 #define DO_EXCLUSIVE 0x00000008 #define DO_DIRECT_IO 0x00000010 #define DO_MAP_IO_BUFFER 0x00000020 #define DO_DEVICE_HAS_NAME 0x00000040 #define DO_DEVICE_INITIALIZING 0x00000080 #define DO_SYSTEM_BOOT_PARTITION 0x00000100 #define DO_LONG_TERM_REQUESTS 0x00000200 #define DO_NEVER_LAST_DEVICE 0x00000400 #define DO_SHUTDOWN_REGISTERED 0x00000800 #define DO_BUS_ENUMERATED_DEVICE 0x00001000 #define DO_POWER_PAGABLE 0x00002000 #define DO_POWER_INRUSH 0x00004000 #define DO_LOW_PRIORITY_FILESYSTEM 0x00010000 /* DEVICE_OBJECT.Characteristics */ #define FILE_REMOVABLE_MEDIA 0x00000001 #define FILE_READ_ONLY_DEVICE 0x00000002 #define FILE_FLOPPY_DISKETTE 0x00000004 #define FILE_WRITE_ONCE_MEDIA 0x00000008 #define FILE_REMOTE_DEVICE 0x00000010 #define FILE_DEVICE_IS_MOUNTED 0x00000020 #define FILE_VIRTUAL_VOLUME 0x00000040 #define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080 #define FILE_DEVICE_SECURE_OPEN 0x00000100 /* DEVICE_OBJECT.AlignmentRequirement */ #define FILE_BYTE_ALIGNMENT 0x00000000 #define FILE_WORD_ALIGNMENT 0x00000001 #define FILE_LONG_ALIGNMENT 0x00000003 #define FILE_QUAD_ALIGNMENT 0x00000007 #define FILE_OCTA_ALIGNMENT 0x0000000f #define FILE_32_BYTE_ALIGNMENT 0x0000001f #define FILE_64_BYTE_ALIGNMENT 0x0000003f #define FILE_128_BYTE_ALIGNMENT 0x0000007f #define FILE_256_BYTE_ALIGNMENT 0x000000ff #define FILE_512_BYTE_ALIGNMENT 0x000001ff /* DEVICE_OBJECT.DeviceType */ #define DEVICE_TYPE ULONG #define FILE_DEVICE_BEEP 0x00000001 #define FILE_DEVICE_CD_ROM 0x00000002 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003 #define FILE_DEVICE_CONTROLLER 0x00000004 #define FILE_DEVICE_DATALINK 0x00000005 #define FILE_DEVICE_DFS 0x00000006 #define FILE_DEVICE_DISK 0x00000007 #define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008 #define FILE_DEVICE_FILE_SYSTEM 0x00000009 #define FILE_DEVICE_INPORT_PORT 0x0000000a #define FILE_DEVICE_KEYBOARD 0x0000000b #define FILE_DEVICE_MAILSLOT 0x0000000c #define FILE_DEVICE_MIDI_IN 0x0000000d #define FILE_DEVICE_MIDI_OUT 0x0000000e #define FILE_DEVICE_MOUSE 0x0000000f #define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010 #define FILE_DEVICE_NAMED_PIPE 0x00000011 #define FILE_DEVICE_NETWORK 0x00000012 #define FILE_DEVICE_NETWORK_BROWSER 0x00000013 #define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014 #define FILE_DEVICE_NULL 0x00000015 #define FILE_DEVICE_PARALLEL_PORT 0x00000016 #define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017 #define FILE_DEVICE_PRINTER 0x00000018 #define FILE_DEVICE_SCANNER 0x00000019 #define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a #define FILE_DEVICE_SERIAL_PORT 0x0000001b #define FILE_DEVICE_SCREEN 0x0000001c #define FILE_DEVICE_SOUND 0x0000001d #define FILE_DEVICE_STREAMS 0x0000001e #define FILE_DEVICE_TAPE 0x0000001f #define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020 #define FILE_DEVICE_TRANSPORT 0x00000021 #define FILE_DEVICE_UNKNOWN 0x00000022 #define FILE_DEVICE_VIDEO 0x00000023 #define FILE_DEVICE_VIRTUAL_DISK 0x00000024 #define FILE_DEVICE_WAVE_IN 0x00000025 #define FILE_DEVICE_WAVE_OUT 0x00000026 #define FILE_DEVICE_8042_PORT 0x00000027 #define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028 #define FILE_DEVICE_BATTERY 0x00000029 #define FILE_DEVICE_BUS_EXTENDER 0x0000002a #define FILE_DEVICE_MODEM 0x0000002b #define FILE_DEVICE_VDM 0x0000002c #define FILE_DEVICE_MASS_STORAGE 0x0000002d #define FILE_DEVICE_SMB 0x0000002e #define FILE_DEVICE_KS 0x0000002f #define FILE_DEVICE_CHANGER 0x00000030 #define FILE_DEVICE_SMARTCARD 0x00000031 #define FILE_DEVICE_ACPI 0x00000032 #define FILE_DEVICE_DVD 0x00000033 #define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034 #define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035 #define FILE_DEVICE_DFS_VOLUME 0x00000036 #define FILE_DEVICE_SERENUM 0x00000037 #define FILE_DEVICE_TERMSRV 0x00000038 #define FILE_DEVICE_KSEC 0x00000039 #define FILE_DEVICE_FIPS 0x0000003a typedef struct _DEVICE_OBJECT { CSHORT Type; USHORT Size; LONG ReferenceCount; struct _DRIVER_OBJECT *DriverObject; struct _DEVICE_OBJECT *NextDevice; struct _DEVICE_OBJECT *AttachedDevice; struct _IRP *CurrentIrp; PIO_TIMER Timer; ULONG Flags; ULONG Characteristics; PVPB Vpb; PVOID DeviceExtension; DEVICE_TYPE DeviceType; CCHAR StackSize; union { LIST_ENTRY ListEntry; WAIT_CONTEXT_BLOCK Wcb; } Queue; ULONG AlignmentRequirement; KDEVICE_QUEUE DeviceQueue; KDPC Dpc; ULONG ActiveThreadCount; PSECURITY_DESCRIPTOR SecurityDescriptor; KEVENT DeviceLock; USHORT SectorSize; USHORT Spare1; struct _DEVOBJ_EXTENSION *DeviceObjectExtension; PVOID Reserved; } DEVICE_OBJECT; typedef struct _DEVICE_OBJECT *PDEVICE_OBJECT; typedef enum _DEVICE_RELATION_TYPE { BusRelations, EjectionRelations, PowerRelations, RemovalRelations, TargetDeviceRelation, SingleBusRelations } DEVICE_RELATION_TYPE, *PDEVICE_RELATION_TYPE; typedef struct _DEVICE_RELATIONS { ULONG Count; PDEVICE_OBJECT Objects[1]; } DEVICE_RELATIONS, *PDEVICE_RELATIONS; typedef struct _SCATTER_GATHER_ELEMENT { PHYSICAL_ADDRESS Address; ULONG Length; ULONG_PTR Reserved; } SCATTER_GATHER_ELEMENT, *PSCATTER_GATHER_ELEMENT; typedef struct _SCATTER_GATHER_LIST { ULONG NumberOfElements; ULONG_PTR Reserved; SCATTER_GATHER_ELEMENT Elements[0]; } SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST; typedef struct _MDL { struct _MDL *Next; CSHORT Size; CSHORT MdlFlags; struct _EPROCESS *Process; PVOID MappedSystemVa; PVOID StartVa; ULONG ByteCount; ULONG ByteOffset; } MDL, *PMDL; #define MDL_MAPPED_TO_SYSTEM_VA 0x0001 #define MDL_PAGES_LOCKED 0x0002 #define MDL_SOURCE_IS_NONPAGED_POOL 0x0004 #define MDL_ALLOCATED_FIXED_SIZE 0x0008 #define MDL_PARTIAL 0x0010 #define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020 #define MDL_IO_PAGE_READ 0x0040 #define MDL_WRITE_OPERATION 0x0080 #define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100 #define MDL_FREE_EXTRA_PTES 0x0200 #define MDL_IO_SPACE 0x0800 #define MDL_NETWORK_HEADER 0x1000 #define MDL_MAPPING_CAN_FAIL 0x2000 #define MDL_ALLOCATED_MUST_SUCCEED 0x4000 #define MDL_MAPPING_FLAGS ( \ MDL_MAPPED_TO_SYSTEM_VA | \ MDL_PAGES_LOCKED | \ MDL_SOURCE_IS_NONPAGED_POOL | \ MDL_PARTIAL_HAS_BEEN_MAPPED | \ MDL_PARENT_MAPPED_SYSTEM_VA | \ MDL_SYSTEM_VA | \ MDL_IO_SPACE) typedef VOID DDKAPI (*PPUT_DMA_ADAPTER)( /*IN*/ PDMA_ADAPTER DmaAdapter); typedef PVOID DDKAPI (*PALLOCATE_COMMON_BUFFER)( /*IN*/ PDMA_ADAPTER DmaAdapter, /*IN*/ ULONG Length, /*OUT*/ PPHYSICAL_ADDRESS LogicalAddress, /*IN*/ BOOLEAN CacheEnabled); typedef VOID DDKAPI (*PFREE_COMMON_BUFFER)( /*IN*/ PDMA_ADAPTER DmaAdapter, /*IN*/ ULONG Length, /*IN*/ PHYSICAL_ADDRESS LogicalAddress, /*IN*/ PVOID VirtualAddress, /*IN*/ BOOLEAN CacheEnabled); typedef NTSTATUS DDKAPI (*PALLOCATE_ADAPTER_CHANNEL)( /*IN*/ PDMA_ADAPTER DmaAdapter, /*IN*/ PDEVICE_OBJECT DeviceObject, /*IN*/ ULONG NumberOfMapRegisters, /*IN*/ PDRIVER_CONTROL ExecutionRoutine, /*IN*/ PVOID Context); typedef BOOLEAN DDKAPI (*PFLUSH_ADAPTER_BUFFERS)( /*IN*/ PDMA_ADAPTER DmaAdapter, /*IN*/ PMDL Mdl, /*IN*/ PVOID MapRegisterBase, /*IN*/ PVOID CurrentVa, /*IN*/ ULONG Length, /*IN*/ BOOLEAN WriteToDevice); typedef VOID DDKAPI (*PFREE_ADAPTER_CHANNEL)( /*IN*/ PDMA_ADAPTER DmaAdapter); typedef VOID DDKAPI (*PFREE_MAP_REGISTERS)( /*IN*/ PDMA_ADAPTER DmaAdapter, PVOID MapRegisterBase, ULONG NumberOfMapRegisters); typedef PHYSICAL_ADDRESS DDKAPI (*PMAP_TRANSFER)( /*IN*/ PDMA_ADAPTER DmaAdapter, /*IN*/ PMDL Mdl, /*IN*/ PVOID MapRegisterBase, /*IN*/ PVOID CurrentVa, /*IN OUT*/ PULONG Length, /*IN*/ BOOLEAN WriteToDevice); typedef ULONG DDKAPI (*PGET_DMA_ALIGNMENT)( /*IN*/ PDMA_ADAPTER DmaAdapter); typedef ULONG DDKAPI (*PREAD_DMA_COUNTER)( /*IN*/ PDMA_ADAPTER DmaAdapter); typedef NTSTATUS DDKAPI (*PGET_SCATTER_GATHER_LIST)( /*IN*/ PDMA_ADAPTER DmaAdapter, /*IN*/ PDEVICE_OBJECT DeviceObject, /*IN*/ PMDL Mdl, /*IN*/ PVOID CurrentVa, /*IN*/ ULONG Length, /*IN*/ PDRIVER_LIST_CONTROL ExecutionRoutine, /*IN*/ PVOID Context, /*IN*/ BOOLEAN WriteToDevice); typedef VOID DDKAPI (*PPUT_SCATTER_GATHER_LIST)( /*IN*/ PDMA_ADAPTER DmaAdapter, /*IN*/ PSCATTER_GATHER_LIST ScatterGather, /*IN*/ BOOLEAN WriteToDevice); typedef NTSTATUS DDKAPI (*PCALCULATE_SCATTER_GATHER_LIST_SIZE)( /*IN*/ PDMA_ADAPTER DmaAdapter, /*IN*/ PMDL Mdl /*OPTIONAL*/, /*IN*/ PVOID CurrentVa, /*IN*/ ULONG Length, /*OUT*/ PULONG ScatterGatherListSize, /*OUT*/ PULONG pNumberOfMapRegisters /*OPTIONAL*/); typedef NTSTATUS DDKAPI (*PBUILD_SCATTER_GATHER_LIST)( /*IN*/ PDMA_ADAPTER DmaAdapter, /*IN*/ PDEVICE_OBJECT DeviceObject, /*IN*/ PMDL Mdl, /*IN*/ PVOID CurrentVa, /*IN*/ ULONG Length, /*IN*/ PDRIVER_LIST_CONTROL ExecutionRoutine, /*IN*/ PVOID Context, /*IN*/ BOOLEAN WriteToDevice, /*IN*/ PVOID ScatterGatherBuffer, /*IN*/ ULONG ScatterGatherLength); typedef NTSTATUS DDKAPI (*PBUILD_MDL_FROM_SCATTER_GATHER_LIST)( /*IN*/ PDMA_ADAPTER DmaAdapter, /*IN*/ PSCATTER_GATHER_LIST ScatterGather, /*IN*/ PMDL OriginalMdl, /*OUT*/ PMDL *TargetMdl); typedef struct _DMA_OPERATIONS { ULONG Size; PPUT_DMA_ADAPTER PutDmaAdapter; PALLOCATE_COMMON_BUFFER AllocateCommonBuffer; PFREE_COMMON_BUFFER FreeCommonBuffer; PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel; PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers; PFREE_ADAPTER_CHANNEL FreeAdapterChannel; PFREE_MAP_REGISTERS FreeMapRegisters; PMAP_TRANSFER MapTransfer; PGET_DMA_ALIGNMENT GetDmaAlignment; PREAD_DMA_COUNTER ReadDmaCounter; PGET_SCATTER_GATHER_LIST GetScatterGatherList; PPUT_SCATTER_GATHER_LIST PutScatterGatherList; PCALCULATE_SCATTER_GATHER_LIST_SIZE CalculateScatterGatherList; PBUILD_SCATTER_GATHER_LIST BuildScatterGatherList; PBUILD_MDL_FROM_SCATTER_GATHER_LIST BuildMdlFromScatterGatherList; } DMA_OPERATIONS, *PDMA_OPERATIONS; typedef struct _DMA_ADAPTER { USHORT Version; USHORT Size; PDMA_OPERATIONS DmaOperations; } DMA_ADAPTER; typedef enum _FILE_INFORMATION_CLASS { FileDirectoryInformation = 1, FileFullDirectoryInformation, FileBothDirectoryInformation, FileBasicInformation, FileStandardInformation, FileInternalInformation, FileEaInformation, FileAccessInformation, FileNameInformation, FileRenameInformation, FileLinkInformation, FileNamesInformation, FileDispositionInformation, FilePositionInformation, FileFullEaInformation, FileModeInformation, FileAlignmentInformation, FileAllInformation, FileAllocationInformation, FileEndOfFileInformation, FileAlternateNameInformation, FileStreamInformation, FilePipeInformation, FilePipeLocalInformation, FilePipeRemoteInformation, FileMailslotQueryInformation, FileMailslotSetInformation, FileCompressionInformation, FileObjectIdInformation, FileCompletionInformation, FileMoveClusterInformation, FileQuotaInformation, FileReparsePointInformation, FileNetworkOpenInformation, FileAttributeTagInformation, FileTrackingInformation, FileIdBothDirectoryInformation, FileIdFullDirectoryInformation, FileValidDataLengthInformation, FileShortNameInformation, FileMaximumInformation } FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS; typedef struct _FILE_POSITION_INFORMATION { LARGE_INTEGER CurrentByteOffset; } FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION; typedef struct _FILE_ALIGNMENT_INFORMATION { ULONG AlignmentRequirement; } FILE_ALIGNMENT_INFORMATION; typedef struct _FILE_NAME_INFORMATION { ULONG FileNameLength; WCHAR FileName[1]; } FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION; typedef struct _FILE_BASIC_INFORMATION { LARGE_INTEGER CreationTime; LARGE_INTEGER LastAccessTime; LARGE_INTEGER LastWriteTime; LARGE_INTEGER ChangeTime; ULONG FileAttributes; } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION; typedef struct _FILE_STANDARD_INFORMATION { LARGE_INTEGER AllocationSize; LARGE_INTEGER EndOfFile; ULONG NumberOfLinks; BOOLEAN DeletePending; BOOLEAN Directory; } FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION; typedef struct _FILE_NETWORK_OPEN_INFORMATION { LARGE_INTEGER CreationTime; LARGE_INTEGER LastAccessTime; LARGE_INTEGER LastWriteTime; LARGE_INTEGER ChangeTime; LARGE_INTEGER AllocationSize; LARGE_INTEGER EndOfFile; ULONG FileAttributes; } FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION; typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION { ULONG FileAttributes; ULONG ReparseTag; } FILE_ATTRIBUTE_TAG_INFORMATION, *PFILE_ATTRIBUTE_TAG_INFORMATION; typedef struct _FILE_DISPOSITION_INFORMATION { BOOLEAN DoDeleteFile; } FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION; typedef struct _FILE_END_OF_FILE_INFORMATION { LARGE_INTEGER EndOfFile; } FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION; typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION { LARGE_INTEGER ValidDataLength; } FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION; typedef enum _FSINFOCLASS { FileFsVolumeInformation = 1, FileFsLabelInformation, FileFsSizeInformation, FileFsDeviceInformation, FileFsAttributeInformation, FileFsControlInformation, FileFsFullSizeInformation, FileFsObjectIdInformation, FileFsDriverPathInformation, FileFsMaximumInformation } FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS; typedef struct _FILE_FS_DEVICE_INFORMATION { DEVICE_TYPE DeviceType; ULONG Characteristics; } FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION; typedef struct _FILE_FULL_EA_INFORMATION { ULONG NextEntryOffset; UCHAR Flags; UCHAR EaNameLength; USHORT EaValueLength; CHAR EaName[1]; } FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION; typedef ULONG_PTR ERESOURCE_THREAD; typedef ERESOURCE_THREAD *PERESOURCE_THREAD; typedef struct _OWNER_ENTRY { ERESOURCE_THREAD OwnerThread; _ANONYMOUS_UNION union { LONG OwnerCount; ULONG TableSize; } DUMMYUNIONNAME; } OWNER_ENTRY, *POWNER_ENTRY; /* ERESOURCE.Flag */ #define ResourceNeverExclusive 0x0010 #define ResourceReleaseByOtherThread 0x0020 #define ResourceOwnedExclusive 0x0080 #define RESOURCE_HASH_TABLE_SIZE 64 typedef struct _ERESOURCE { LIST_ENTRY SystemResourcesList; POWNER_ENTRY OwnerTable; SHORT ActiveCount; USHORT Flag; PKSEMAPHORE SharedWaiters; PKEVENT ExclusiveWaiters; OWNER_ENTRY OwnerThreads[2]; ULONG ContentionCount; USHORT NumberOfSharedWaiters; USHORT NumberOfExclusiveWaiters; _ANONYMOUS_UNION union { PVOID Address; ULONG_PTR CreatorBackTraceIndex; } DUMMYUNIONNAME; KSPIN_LOCK SpinLock; } ERESOURCE, *PERESOURCE; /* NOTE: PVOID for methods to avoid 'assignment from incompatible pointer type' warning */ typedef struct _DRIVER_EXTENSION { struct _DRIVER_OBJECT *DriverObject; PVOID AddDevice; ULONG Count; UNICODE_STRING ServiceKeyName; } DRIVER_EXTENSION, *PDRIVER_EXTENSION; typedef BOOLEAN DDKAPI (*PFAST_IO_CHECK_IF_POSSIBLE)( /*IN*/ struct _FILE_OBJECT *FileObject, /*IN*/ PLARGE_INTEGER FileOffset, /*IN*/ ULONG Length, /*IN*/ BOOLEAN Wait, /*IN*/ ULONG LockKey, /*IN*/ BOOLEAN CheckForReadOperation, /*OUT*/ PIO_STATUS_BLOCK IoStatus, /*IN*/ struct _DEVICE_OBJECT *DeviceObject); typedef BOOLEAN DDKAPI (*PFAST_IO_READ)( /*IN*/ struct _FILE_OBJECT *FileObject, /*IN*/ PLARGE_INTEGER FileOffset, /*IN*/ ULONG Length, /*IN*/ BOOLEAN Wait, /*IN*/ ULONG LockKey, /*OUT*/ PVOID Buffer, /*OUT*/ PIO_STATUS_BLOCK IoStatus, /*IN*/ struct _DEVICE_OBJECT *DeviceObject); typedef BOOLEAN DDKAPI (*PFAST_IO_WRITE)( /*IN*/ struct _FILE_OBJECT *FileObject, /*IN*/ PLARGE_INTEGER FileOffset, /*IN*/ ULONG Length, /*IN*/ BOOLEAN Wait, /*IN*/ ULONG LockKey, /*IN*/ PVOID Buffer, /*OUT*/ PIO_STATUS_BLOCK IoStatus, /*IN*/ struct _DEVICE_OBJECT *DeviceObject); typedef BOOLEAN DDKAPI (*PFAST_IO_QUERY_BASIC_INFO)( /*IN*/ struct _FILE_OBJECT *FileObject, /*IN*/ BOOLEAN Wait, /*OUT*/ PFILE_BASIC_INFORMATION Buffer, /*OUT*/ PIO_STATUS_BLOCK IoStatus, /*IN*/ struct _DEVICE_OBJECT *DeviceObject); typedef BOOLEAN DDKAPI (*PFAST_IO_QUERY_STANDARD_INFO)( /*IN*/ struct _FILE_OBJECT *FileObject, /*IN*/ BOOLEAN Wait, /*OUT*/ PFILE_STANDARD_INFORMATION Buffer, /*OUT*/ PIO_STATUS_BLOCK IoStatus, /*IN*/ struct _DEVICE_OBJECT *DeviceObject); typedef BOOLEAN DDKAPI (*PFAST_IO_LOCK)( /*IN*/ struct _FILE_OBJECT *FileObject, /*IN*/ PLARGE_INTEGER FileOffset, /*IN*/ PLARGE_INTEGER Length, PEPROCESS ProcessId, ULONG Key, BOOLEAN FailImmediately, BOOLEAN ExclusiveLock, /*OUT*/ PIO_STATUS_BLOCK IoStatus, /*IN*/ struct _DEVICE_OBJECT *DeviceObject); typedef BOOLEAN DDKAPI (*PFAST_IO_UNLOCK_SINGLE)( /*IN*/ struct _FILE_OBJECT *FileObject, /*IN*/ PLARGE_INTEGER FileOffset, /*IN*/ PLARGE_INTEGER Length, PEPROCESS ProcessId, ULONG Key, /*OUT*/ PIO_STATUS_BLOCK IoStatus, /*IN*/ struct _DEVICE_OBJECT *DeviceObject); typedef BOOLEAN DDKAPI (*PFAST_IO_UNLOCK_ALL)( /*IN*/ struct _FILE_OBJECT *FileObject, PEPROCESS ProcessId, /*OUT*/ PIO_STATUS_BLOCK IoStatus, /*IN*/ struct _DEVICE_OBJECT *DeviceObject); typedef BOOLEAN DDKAPI (*PFAST_IO_UNLOCK_ALL_BY_KEY)( /*IN*/ struct _FILE_OBJECT *FileObject, PVOID ProcessId, ULONG Key, /*OUT*/ PIO_STATUS_BLOCK IoStatus, /*IN*/ struct _DEVICE_OBJECT *DeviceObject); typedef BOOLEAN DDKAPI (*PFAST_IO_DEVICE_CONTROL)( /*IN*/ struct _FILE_OBJECT *FileObject, /*IN*/ BOOLEAN Wait, /*IN*/ PVOID InputBuffer /*OPTIONAL*/, /*IN*/ ULONG InputBufferLength, /*OUT*/ PVOID OutputBuffer /*OPTIONAL*/, /*IN*/ ULONG OutputBufferLength, /*IN*/ ULONG IoControlCode, /*OUT*/ PIO_STATUS_BLOCK IoStatus, /*IN*/ struct _DEVICE_OBJECT *DeviceObject); typedef VOID DDKAPI (*PFAST_IO_ACQUIRE_FILE)( /*IN*/ struct _FILE_OBJECT *FileObject); typedef VOID DDKAPI (*PFAST_IO_RELEASE_FILE)( /*IN*/ struct _FILE_OBJECT *FileObject); typedef VOID DDKAPI (*PFAST_IO_DETACH_DEVICE)( /*IN*/ struct _DEVICE_OBJECT *SourceDevice, /*IN*/ struct _DEVICE_OBJECT *TargetDevice); typedef BOOLEAN DDKAPI (*PFAST_IO_QUERY_NETWORK_OPEN_INFO)( /*IN*/ struct _FILE_OBJECT *FileObject, /*IN*/ BOOLEAN Wait, /*OUT*/ struct _FILE_NETWORK_OPEN_INFORMATION *Buffer, /*OUT*/ struct _IO_STATUS_BLOCK *IoStatus, /*IN*/ struct _DEVICE_OBJECT *DeviceObject); typedef NTSTATUS DDKAPI (*PFAST_IO_ACQUIRE_FOR_MOD_WRITE)( /*IN*/ struct _FILE_OBJECT *FileObject, /*IN*/ PLARGE_INTEGER EndingOffset, /*OUT*/ struct _ERESOURCE **ResourceToRelease, /*IN*/ struct _DEVICE_OBJECT *DeviceObject); typedef BOOLEAN DDKAPI (*PFAST_IO_MDL_READ)( /*IN*/ struct _FILE_OBJECT *FileObject, /*IN*/ PLARGE_INTEGER FileOffset, /*IN*/ ULONG Length, /*IN*/ ULONG LockKey, /*OUT*/ PMDL *MdlChain, /*OUT*/ PIO_STATUS_BLOCK IoStatus, /*IN*/ struct _DEVICE_OBJECT *DeviceObject); typedef BOOLEAN DDKAPI (*PFAST_IO_MDL_READ_COMPLETE)( /*IN*/ struct _FILE_OBJECT *FileObject, /*IN*/ PMDL MdlChain, /*IN*/ struct _DEVICE_OBJECT *DeviceObject); typedef BOOLEAN DDKAPI (*PFAST_IO_PREPARE_MDL_WRITE)( /*IN*/ struct _FILE_OBJECT *FileObject, /*IN*/ PLARGE_INTEGER FileOffset, /*IN*/ ULONG Length, /*IN*/ ULONG LockKey, /*OUT*/ PMDL *MdlChain, /*OUT*/ PIO_STATUS_BLOCK IoStatus, /*IN*/ struct _DEVICE_OBJECT *DeviceObject); typedef BOOLEAN DDKAPI (*PFAST_IO_MDL_WRITE_COMPLETE)( /*IN*/ struct _FILE_OBJECT *FileObject, /*IN*/ PLARGE_INTEGER FileOffset, /*IN*/ PMDL MdlChain, /*IN*/ struct _DEVICE_OBJECT *DeviceObject); typedef BOOLEAN DDKAPI (*PFAST_IO_READ_COMPRESSED)( /*IN*/ struct _FILE_OBJECT *FileObject, /*IN*/ PLARGE_INTEGER FileOffset, /*IN*/ ULONG Length, /*IN*/ ULONG LockKey, /*OUT*/ PVOID Buffer, /*OUT*/ PMDL *MdlChain, /*OUT*/ PIO_STATUS_BLOCK IoStatus, /*OUT*/ struct _COMPRESSED_DATA_INFO *CompressedDataInfo, /*IN*/ ULONG CompressedDataInfoLength, /*IN*/ struct _DEVICE_OBJECT *DeviceObject); typedef BOOLEAN DDKAPI (*PFAST_IO_WRITE_COMPRESSED)( /*IN*/ struct _FILE_OBJECT *FileObject, /*IN*/ PLARGE_INTEGER FileOffset, /*IN*/ ULONG Length, /*IN*/ ULONG LockKey, /*IN*/ PVOID Buffer, /*OUT*/ PMDL *MdlChain, /*OUT*/ PIO_STATUS_BLOCK IoStatus, /*IN*/ struct _COMPRESSED_DATA_INFO *CompressedDataInfo, /*IN*/ ULONG CompressedDataInfoLength, /*IN*/ struct _DEVICE_OBJECT *DeviceObject); typedef BOOLEAN DDKAPI (*PFAST_IO_MDL_READ_COMPLETE_COMPRESSED)( /*IN*/ struct _FILE_OBJECT *FileObject, /*IN*/ PMDL MdlChain, /*IN*/ struct _DEVICE_OBJECT *DeviceObject); typedef BOOLEAN DDKAPI (*PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED)( /*IN*/ struct _FILE_OBJECT *FileObject, /*IN*/ PLARGE_INTEGER FileOffset, /*IN*/ PMDL MdlChain, /*IN*/ struct _DEVICE_OBJECT *DeviceObject); typedef BOOLEAN DDKAPI (*PFAST_IO_QUERY_OPEN)( /*IN*/ struct _IRP *Irp, /*OUT*/ PFILE_NETWORK_OPEN_INFORMATION NetworkInformation, /*IN*/ struct _DEVICE_OBJECT *DeviceObject); typedef NTSTATUS DDKAPI (*PFAST_IO_RELEASE_FOR_MOD_WRITE)( /*IN*/ struct _FILE_OBJECT *FileObject, /*IN*/ struct _ERESOURCE *ResourceToRelease, /*IN*/ struct _DEVICE_OBJECT *DeviceObject); typedef NTSTATUS DDKAPI (*PFAST_IO_ACQUIRE_FOR_CCFLUSH)( /*IN*/ struct _FILE_OBJECT *FileObject, /*IN*/ struct _DEVICE_OBJECT *DeviceObject); typedef NTSTATUS DDKAPI (*PFAST_IO_RELEASE_FOR_CCFLUSH) ( /*IN*/ struct _FILE_OBJECT *FileObject, /*IN*/ struct _DEVICE_OBJECT *DeviceObject); typedef struct _FAST_IO_DISPATCH { ULONG SizeOfFastIoDispatch; PFAST_IO_CHECK_IF_POSSIBLE FastIoCheckIfPossible; PFAST_IO_READ FastIoRead; PFAST_IO_WRITE FastIoWrite; PFAST_IO_QUERY_BASIC_INFO FastIoQueryBasicInfo; PFAST_IO_QUERY_STANDARD_INFO FastIoQueryStandardInfo; PFAST_IO_LOCK FastIoLock; PFAST_IO_UNLOCK_SINGLE FastIoUnlockSingle; PFAST_IO_UNLOCK_ALL FastIoUnlockAll; PFAST_IO_UNLOCK_ALL_BY_KEY FastIoUnlockAllByKey; PFAST_IO_DEVICE_CONTROL FastIoDeviceControl; PFAST_IO_ACQUIRE_FILE AcquireFileForNtCreateSection; PFAST_IO_RELEASE_FILE ReleaseFileForNtCreateSection; PFAST_IO_DETACH_DEVICE FastIoDetachDevice; PFAST_IO_QUERY_NETWORK_OPEN_INFO FastIoQueryNetworkOpenInfo; PFAST_IO_ACQUIRE_FOR_MOD_WRITE AcquireForModWrite; PFAST_IO_MDL_READ MdlRead; PFAST_IO_MDL_READ_COMPLETE MdlReadComplete; PFAST_IO_PREPARE_MDL_WRITE PrepareMdlWrite; PFAST_IO_MDL_WRITE_COMPLETE MdlWriteComplete; PFAST_IO_READ_COMPRESSED FastIoReadCompressed; PFAST_IO_WRITE_COMPRESSED FastIoWriteCompressed; PFAST_IO_MDL_READ_COMPLETE_COMPRESSED MdlReadCompleteCompressed; PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED MdlWriteCompleteCompressed; PFAST_IO_QUERY_OPEN FastIoQueryOpen; PFAST_IO_RELEASE_FOR_MOD_WRITE ReleaseForModWrite; PFAST_IO_ACQUIRE_FOR_CCFLUSH AcquireForCcFlush; PFAST_IO_RELEASE_FOR_CCFLUSH ReleaseForCcFlush; } FAST_IO_DISPATCH, *PFAST_IO_DISPATCH; typedef struct _DRIVER_OBJECT { CSHORT Type; CSHORT Size; PDEVICE_OBJECT DeviceObject; ULONG Flags; PVOID DriverStart; ULONG DriverSize; PVOID DriverSection; PDRIVER_EXTENSION DriverExtension; UNICODE_STRING DriverName; PUNICODE_STRING HardwareDatabase; PFAST_IO_DISPATCH FastIoDispatch; PDRIVER_INITIALIZE DriverInit; PDRIVER_STARTIO DriverStartIo; PDRIVER_UNLOAD DriverUnload; PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1]; } DRIVER_OBJECT; typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT; typedef struct _SECTION_OBJECT_POINTERS { PVOID DataSectionObject; PVOID SharedCacheMap; PVOID ImageSectionObject; } SECTION_OBJECT_POINTERS, *PSECTION_OBJECT_POINTERS; typedef struct _IO_COMPLETION_CONTEXT { PVOID Port; PVOID Key; } IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT; /* FILE_OBJECT.Flags */ #define FO_FILE_OPEN 0x00000001 #define FO_SYNCHRONOUS_IO 0x00000002 #define FO_ALERTABLE_IO 0x00000004 #define FO_NO_INTERMEDIATE_BUFFERING 0x00000008 #define FO_WRITE_THROUGH 0x00000010 #define FO_SEQUENTIAL_ONLY 0x00000020 #define FO_CACHE_SUPPORTED 0x00000040 #define FO_NAMED_PIPE 0x00000080 #define FO_STREAM_FILE 0x00000100 #define FO_MAILSLOT 0x00000200 #define FO_GENERATE_AUDIT_ON_CLOSE 0x00000400 #define FO_DIRECT_DEVICE_OPEN 0x00000800 #define FO_FILE_MODIFIED 0x00001000 #define FO_FILE_SIZE_CHANGED 0x00002000 #define FO_CLEANUP_COMPLETE 0x00004000 #define FO_TEMPORARY_FILE 0x00008000 #define FO_DELETE_ON_CLOSE 0x00010000 #define FO_OPENED_CASE_SENSITIVE 0x00020000 #define FO_HANDLE_CREATED 0x00040000 #define FO_FILE_FAST_IO_READ 0x00080000 #define FO_RANDOM_ACCESS 0x00100000 #define FO_FILE_OPEN_CANCELLED 0x00200000 #define FO_VOLUME_OPEN 0x00400000 #define FO_FILE_OBJECT_HAS_EXTENSION 0x00800000 #define FO_REMOTE_ORIGIN 0x01000000 typedef struct _FILE_OBJECT { CSHORT Type; CSHORT Size; PDEVICE_OBJECT DeviceObject; PVPB Vpb; PVOID FsContext; PVOID FsContext2; PSECTION_OBJECT_POINTERS SectionObjectPointer; PVOID PrivateCacheMap; NTSTATUS FinalStatus; struct _FILE_OBJECT *RelatedFileObject; BOOLEAN LockOperation; BOOLEAN DeletePending; BOOLEAN ReadAccess; BOOLEAN WriteAccess; BOOLEAN DeleteAccess; BOOLEAN SharedRead; BOOLEAN SharedWrite; BOOLEAN SharedDelete; ULONG Flags; UNICODE_STRING FileName; LARGE_INTEGER CurrentByteOffset; ULONG Waiters; ULONG Busy; PVOID LastLock; KEVENT Lock; KEVENT Event; PIO_COMPLETION_CONTEXT CompletionContext; } FILE_OBJECT; typedef struct _FILE_OBJECT *PFILE_OBJECT; typedef enum _SECURITY_OPERATION_CODE { SetSecurityDescriptor, QuerySecurityDescriptor, DeleteSecurityDescriptor, AssignSecurityDescriptor } SECURITY_OPERATION_CODE, *PSECURITY_OPERATION_CODE; #define INITIAL_PRIVILEGE_COUNT 3 typedef struct _INITIAL_PRIVILEGE_SET { ULONG PrivilegeCount; ULONG Control; LUID_AND_ATTRIBUTES Privilege[INITIAL_PRIVILEGE_COUNT]; } INITIAL_PRIVILEGE_SET, * PINITIAL_PRIVILEGE_SET; typedef struct _SECURITY_SUBJECT_CONTEXT { PACCESS_TOKEN ClientToken; SECURITY_IMPERSONATION_LEVEL ImpersonationLevel; PACCESS_TOKEN PrimaryToken; PVOID ProcessAuditId; } SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT; #include typedef struct _ACCESS_STATE { LUID OperationID; BOOLEAN SecurityEvaluated; BOOLEAN GenerateAudit; BOOLEAN GenerateOnClose; BOOLEAN PrivilegesAllocated; ULONG Flags; ACCESS_MASK RemainingDesiredAccess; ACCESS_MASK PreviouslyGrantedAccess; ACCESS_MASK OriginalDesiredAccess; SECURITY_SUBJECT_CONTEXT SubjectSecurityContext; PSECURITY_DESCRIPTOR SecurityDescriptor; PVOID AuxData; union { INITIAL_PRIVILEGE_SET InitialPrivilegeSet; PRIVILEGE_SET PrivilegeSet; } Privileges; BOOLEAN AuditPrivileges; UNICODE_STRING ObjectName; UNICODE_STRING ObjectTypeName; } ACCESS_STATE, *PACCESS_STATE; #include typedef struct _IO_SECURITY_CONTEXT { PSECURITY_QUALITY_OF_SERVICE SecurityQos; PACCESS_STATE AccessState; ACCESS_MASK DesiredAccess; ULONG FullCreateOptions; } IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT; struct _IO_CSQ; typedef struct _IO_CSQ_IRP_CONTEXT { ULONG Type; struct _IRP *Irp; struct _IO_CSQ *Csq; } IO_CSQ_IRP_CONTEXT, *PIO_CSQ_IRP_CONTEXT; typedef VOID DDKAPI (*PIO_CSQ_INSERT_IRP)( /*IN*/ struct _IO_CSQ *Csq, /*IN*/ PIRP Irp); typedef VOID DDKAPI (*PIO_CSQ_REMOVE_IRP)( /*IN*/ struct _IO_CSQ *Csq, /*IN*/ PIRP Irp); typedef PIRP DDKAPI (*PIO_CSQ_PEEK_NEXT_IRP)( /*IN*/ struct _IO_CSQ *Csq, /*IN*/ PIRP Irp, /*IN*/ PVOID PeekContext); typedef VOID DDKAPI (*PIO_CSQ_ACQUIRE_LOCK)( /*IN*/ struct _IO_CSQ *Csq, /*OUT*/ PKIRQL Irql); typedef VOID DDKAPI (*PIO_CSQ_RELEASE_LOCK)( /*IN*/ struct _IO_CSQ *Csq, /*IN*/ KIRQL Irql); typedef VOID DDKAPI (*PIO_CSQ_COMPLETE_CANCELED_IRP)( /*IN*/ struct _IO_CSQ *Csq, /*IN*/ PIRP Irp); typedef struct _IO_CSQ { ULONG Type; PIO_CSQ_INSERT_IRP CsqInsertIrp; PIO_CSQ_REMOVE_IRP CsqRemoveIrp; PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp; PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock; PIO_CSQ_RELEASE_LOCK CsqReleaseLock; PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp; PVOID ReservePointer; } IO_CSQ, *PIO_CSQ; #include typedef struct _IO_STACK_LOCATION { UCHAR MajorFunction; UCHAR MinorFunction; UCHAR Flags; UCHAR Control; union { struct { PIO_SECURITY_CONTEXT SecurityContext; ULONG Options; USHORT POINTER_ALIGNMENT FileAttributes; USHORT ShareAccess; ULONG POINTER_ALIGNMENT EaLength; } Create; struct { ULONG Length; ULONG POINTER_ALIGNMENT Key; LARGE_INTEGER ByteOffset; } Read; struct { ULONG Length; ULONG POINTER_ALIGNMENT Key; LARGE_INTEGER ByteOffset; } Write; struct { ULONG Length; FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass; } QueryFile; struct { ULONG Length; FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass; PFILE_OBJECT FileObject; _ANONYMOUS_UNION union { _ANONYMOUS_STRUCT struct { BOOLEAN ReplaceIfExists; BOOLEAN AdvanceOnly; } DUMMYSTRUCTNAME; ULONG ClusterCount; HANDLE DeleteHandle; } DUMMYUNIONNAME; } SetFile; struct { ULONG Length; FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass; } QueryVolume; struct { ULONG OutputBufferLength; ULONG POINTER_ALIGNMENT InputBufferLength; ULONG POINTER_ALIGNMENT IoControlCode; PVOID Type3InputBuffer; } DeviceIoControl; struct { SECURITY_INFORMATION SecurityInformation; ULONG POINTER_ALIGNMENT Length; } QuerySecurity; struct { SECURITY_INFORMATION SecurityInformation; PSECURITY_DESCRIPTOR SecurityDescriptor; } SetSecurity; struct { PVPB Vpb; PDEVICE_OBJECT DeviceObject; } MountVolume; struct { PVPB Vpb; PDEVICE_OBJECT DeviceObject; } VerifyVolume; struct { struct _SCSI_REQUEST_BLOCK *Srb; } Scsi; struct { DEVICE_RELATION_TYPE Type; } QueryDeviceRelations; struct { CONST GUID *InterfaceType; USHORT Size; USHORT Version; PINTERFACE Interface; PVOID InterfaceSpecificData; } QueryInterface; struct { PDEVICE_CAPABILITIES Capabilities; } DeviceCapabilities; struct { PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList; } FilterResourceRequirements; struct { ULONG WhichSpace; PVOID Buffer; ULONG Offset; ULONG POINTER_ALIGNMENT Length; } ReadWriteConfig; struct { BOOLEAN Lock; } SetLock; struct { BUS_QUERY_ID_TYPE IdType; } QueryId; struct { DEVICE_TEXT_TYPE DeviceTextType; LCID POINTER_ALIGNMENT LocaleId; } QueryDeviceText; struct { BOOLEAN InPath; BOOLEAN Reserved[3]; DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type; } UsageNotification; struct { SYSTEM_POWER_STATE PowerState; } WaitWake; struct { PPOWER_SEQUENCE PowerSequence; } PowerSequence; struct { ULONG SystemContext; POWER_STATE_TYPE POINTER_ALIGNMENT Type; POWER_STATE POINTER_ALIGNMENT State; POWER_ACTION POINTER_ALIGNMENT ShutdownType; } Power; struct { PCM_RESOURCE_LIST AllocatedResources; PCM_RESOURCE_LIST AllocatedResourcesTranslated; } StartDevice; struct { ULONG_PTR ProviderId; PVOID DataPath; ULONG BufferSize; PVOID Buffer; } WMI; struct { PVOID Argument1; PVOID Argument2; PVOID Argument3; PVOID Argument4; } Others; } Parameters; PDEVICE_OBJECT DeviceObject; PFILE_OBJECT FileObject; PIO_COMPLETION_ROUTINE CompletionRoutine; PVOID Context; } IO_STACK_LOCATION, *PIO_STACK_LOCATION; #include /* IO_STACK_LOCATION.Control */ #define SL_PENDING_RETURNED 0x01 #define SL_INVOKE_ON_CANCEL 0x20 #define SL_INVOKE_ON_SUCCESS 0x40 #define SL_INVOKE_ON_ERROR 0x80 typedef enum _KEY_INFORMATION_CLASS { KeyBasicInformation, KeyNodeInformation, KeyFullInformation, KeyNameInformation, KeyCachedInformation, KeyFlagsInformation } KEY_INFORMATION_CLASS; typedef struct _KEY_BASIC_INFORMATION { LARGE_INTEGER LastWriteTime; ULONG TitleIndex; ULONG NameLength; WCHAR Name[1]; } KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION; typedef struct _KEY_FULL_INFORMATION { LARGE_INTEGER LastWriteTime; ULONG TitleIndex; ULONG ClassOffset; ULONG ClassLength; ULONG SubKeys; ULONG MaxNameLen; ULONG MaxClassLen; ULONG Values; ULONG MaxValueNameLen; ULONG MaxValueDataLen; WCHAR Class[1]; } KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION; typedef struct _KEY_NODE_INFORMATION { LARGE_INTEGER LastWriteTime; ULONG TitleIndex; ULONG ClassOffset; ULONG ClassLength; ULONG NameLength; WCHAR Name[1]; } KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION; typedef struct _KEY_VALUE_BASIC_INFORMATION { ULONG TitleIndex; ULONG Type; ULONG NameLength; WCHAR Name[1]; } KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION; typedef struct _KEY_VALUE_FULL_INFORMATION { ULONG TitleIndex; ULONG Type; ULONG DataOffset; ULONG DataLength; ULONG NameLength; WCHAR Name[1]; } KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION; typedef struct _KEY_VALUE_PARTIAL_INFORMATION { ULONG TitleIndex; ULONG Type; ULONG DataLength; UCHAR Data[1]; } KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION; typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 { ULONG Type; ULONG DataLength; UCHAR Data[1]; } KEY_VALUE_PARTIAL_INFORMATION_ALIGN64, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64; typedef struct _KEY_VALUE_ENTRY { PUNICODE_STRING ValueName; ULONG DataLength; ULONG DataOffset; ULONG Type; } KEY_VALUE_ENTRY, *PKEY_VALUE_ENTRY; typedef enum _KEY_VALUE_INFORMATION_CLASS { KeyValueBasicInformation, KeyValueFullInformation, KeyValuePartialInformation, KeyValueFullInformationAlign64, KeyValuePartialInformationAlign64 } KEY_VALUE_INFORMATION_CLASS; /* KEY_VALUE_Xxx.Type */ #define REG_NONE 0 #define REG_SZ 1 #define REG_EXPAND_SZ 2 #define REG_BINARY 3 #define REG_DWORD 4 #define REG_DWORD_LITTLE_ENDIAN 4 #define REG_DWORD_BIG_ENDIAN 5 #define REG_LINK 6 #define REG_MULTI_SZ 7 #define REG_RESOURCE_LIST 8 #define REG_FULL_RESOURCE_DESCRIPTOR 9 #define REG_RESOURCE_REQUIREMENTS_LIST 10 #define REG_QWORD 11 #define REG_QWORD_LITTLE_ENDIAN 11 #define PCI_TYPE0_ADDRESSES 6 #define PCI_TYPE1_ADDRESSES 2 #define PCI_TYPE2_ADDRESSES 5 typedef struct _PCI_COMMON_CONFIG { USHORT VendorID; USHORT DeviceID; USHORT Command; USHORT Status; UCHAR RevisionID; UCHAR ProgIf; UCHAR SubClass; UCHAR BaseClass; UCHAR CacheLineSize; UCHAR LatencyTimer; UCHAR HeaderType; UCHAR BIST; union { struct _PCI_HEADER_TYPE_0 { ULONG BaseAddresses[PCI_TYPE0_ADDRESSES]; ULONG CIS; USHORT SubVendorID; USHORT SubSystemID; ULONG ROMBaseAddress; UCHAR CapabilitiesPtr; UCHAR Reserved1[3]; ULONG Reserved2; UCHAR InterruptLine; UCHAR InterruptPin; UCHAR MinimumGrant; UCHAR MaximumLatency; } type0; struct _PCI_HEADER_TYPE_1 { ULONG BaseAddresses[PCI_TYPE1_ADDRESSES]; UCHAR PrimaryBus; UCHAR SecondaryBus; UCHAR SubordinateBus; UCHAR SecondaryLatency; UCHAR IOBase; UCHAR IOLimit; USHORT SecondaryStatus; USHORT MemoryBase; USHORT MemoryLimit; USHORT PrefetchBase; USHORT PrefetchLimit; ULONG PrefetchBaseUpper32; ULONG PrefetchLimitUpper32; USHORT IOBaseUpper16; USHORT IOLimitUpper16; UCHAR CapabilitiesPtr; UCHAR Reserved1[3]; ULONG ROMBaseAddress; UCHAR InterruptLine; UCHAR InterruptPin; USHORT BridgeControl; } type1; struct _PCI_HEADER_TYPE_2 { ULONG SocketRegistersBaseAddress; UCHAR CapabilitiesPtr; UCHAR Reserved; USHORT SecondaryStatus; UCHAR PrimaryBus; UCHAR SecondaryBus; UCHAR SubordinateBus; UCHAR SecondaryLatency; struct { ULONG Base; ULONG Limit; } Range[PCI_TYPE2_ADDRESSES - 1]; UCHAR InterruptLine; UCHAR InterruptPin; USHORT BridgeControl; } type2; } u; UCHAR DeviceSpecific[192]; } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG; /* PCI_COMMON_CONFIG.Command */ #define PCI_ENABLE_IO_SPACE 0x0001 #define PCI_ENABLE_MEMORY_SPACE 0x0002 #define PCI_ENABLE_BUS_MASTER 0x0004 #define PCI_ENABLE_SPECIAL_CYCLES 0x0008 #define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010 #define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020 #define PCI_ENABLE_PARITY 0x0040 #define PCI_ENABLE_WAIT_CYCLE 0x0080 #define PCI_ENABLE_SERR 0x0100 #define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200 /* PCI_COMMON_CONFIG.Status */ #define PCI_STATUS_CAPABILITIES_LIST 0x0010 #define PCI_STATUS_66MHZ_CAPABLE 0x0020 #define PCI_STATUS_UDF_SUPPORTED 0x0040 #define PCI_STATUS_FAST_BACK_TO_BACK 0x0080 #define PCI_STATUS_DATA_PARITY_DETECTED 0x0100 #define PCI_STATUS_DEVSEL 0x0600 #define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800 #define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000 #define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000 #define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000 #define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000 /* PCI_COMMON_CONFIG.HeaderType */ #define PCI_MULTIFUNCTION 0x80 #define PCI_DEVICE_TYPE 0x00 #define PCI_BRIDGE_TYPE 0x01 #define PCI_CARDBUS_BRIDGE_TYPE 0x02 #define PCI_CONFIGURATION_TYPE(PciData) \ (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION) #define PCI_MULTIFUNCTION_DEVICE(PciData) \ ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0) typedef struct _PCI_SLOT_NUMBER { union { struct { ULONG DeviceNumber : 5; ULONG FunctionNumber : 3; ULONG Reserved : 24; } bits; ULONG AsULONG; } u; } PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER; typedef enum _POOL_TYPE { NonPagedPool, PagedPool, NonPagedPoolMustSucceed, DontUseThisType, NonPagedPoolCacheAligned, PagedPoolCacheAligned, NonPagedPoolCacheAlignedMustS, MaxPoolType, NonPagedPoolSession = 32, PagedPoolSession, NonPagedPoolMustSucceedSession, DontUseThisTypeSession, NonPagedPoolCacheAlignedSession, PagedPoolCacheAlignedSession, NonPagedPoolCacheAlignedMustSSession } POOL_TYPE; typedef enum _EX_POOL_PRIORITY { LowPoolPriority, LowPoolPrioritySpecialPoolOverrun = 8, LowPoolPrioritySpecialPoolUnderrun = 9, NormalPoolPriority = 16, NormalPoolPrioritySpecialPoolOverrun = 24, NormalPoolPrioritySpecialPoolUnderrun = 25, HighPoolPriority = 32, HighPoolPrioritySpecialPoolOverrun = 40, HighPoolPrioritySpecialPoolUnderrun = 41 } EX_POOL_PRIORITY; /* PRIVILEGE_SET.Control */ #define PRIVILEGE_SET_ALL_NECESSARY 1 typedef struct _RTL_OSVERSIONINFOW { ULONG dwOSVersionInfoSize; ULONG dwMajorVersion; ULONG dwMinorVersion; ULONG dwBuildNumber; ULONG dwPlatformId; WCHAR szCSDVersion[128]; } RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW; typedef struct _RTL_OSVERSIONINFOEXW { ULONG dwOSVersionInfoSize; ULONG dwMajorVersion; ULONG dwMinorVersion; ULONG dwBuildNumber; ULONG dwPlatformId; WCHAR szCSDVersion[128]; USHORT wServicePackMajor; USHORT wServicePackMinor; USHORT wSuiteMask; UCHAR wProductType; UCHAR wReserved; } RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW; NTOSAPI ULONGLONG DDKAPI VerSetConditionMask( /*IN*/ ULONGLONG ConditionMask, /*IN*/ ULONG TypeMask, /*IN*/ UCHAR Condition); #define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType) \ ((ConditionMask) = VerSetConditionMask((ConditionMask), \ (TypeBitMask), (ComparisonType))) /* RtlVerifyVersionInfo() TypeMask */ #define VER_MINORVERSION 0x0000001 #define VER_MAJORVERSION 0x0000002 #define VER_BUILDNUMBER 0x0000004 #define VER_PLATFORMID 0x0000008 #define VER_SERVICEPACKMINOR 0x0000010 #define VER_SERVICEPACKMAJOR 0x0000020 #define VER_SUITENAME 0x0000040 #define VER_PRODUCT_TYPE 0x0000080 /* RtlVerifyVersionInfo() ComparisonType */ #define VER_EQUAL 1 #define VER_GREATER 2 #define VER_GREATER_EQUAL 3 #define VER_LESS 4 #define VER_LESS_EQUAL 5 #define VER_AND 6 #define VER_OR 7 #define VER_CONDITION_MASK 7 #define VER_NUM_BITS_PER_CONDITION_MASK 3 typedef struct _RTL_BITMAP { ULONG SizeOfBitMap; PULONG Buffer; } RTL_BITMAP, *PRTL_BITMAP; typedef struct _RTL_BITMAP_RUN { ULONG StartingIndex; ULONG NumberOfBits; } RTL_BITMAP_RUN, *PRTL_BITMAP_RUN; typedef NTSTATUS DDKAPI (*PRTL_QUERY_REGISTRY_ROUTINE)( /*IN*/ PWSTR ValueName, /*IN*/ ULONG ValueType, /*IN*/ PVOID ValueData, /*IN*/ ULONG ValueLength, /*IN*/ PVOID Context, /*IN*/ PVOID EntryContext); #define RTL_REGISTRY_ABSOLUTE 0 #define RTL_REGISTRY_SERVICES 1 #define RTL_REGISTRY_CONTROL 2 #define RTL_REGISTRY_WINDOWS_NT 3 #define RTL_REGISTRY_DEVICEMAP 4 #define RTL_REGISTRY_USER 5 /* RTL_QUERY_REGISTRY_TABLE.Flags */ #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001 #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004 #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010 #define RTL_QUERY_REGISTRY_DIRECT 0x00000020 #define RTL_QUERY_REGISTRY_DELETE 0x00000040 typedef struct _RTL_QUERY_REGISTRY_TABLE { PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine; ULONG Flags; PWSTR Name; PVOID EntryContext; ULONG DefaultType; PVOID DefaultData; ULONG DefaultLength; } RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE; typedef struct _TIME_FIELDS { CSHORT Year; CSHORT Month; CSHORT Day; CSHORT Hour; CSHORT Minute; CSHORT Second; CSHORT Milliseconds; CSHORT Weekday; } TIME_FIELDS, *PTIME_FIELDS; typedef PVOID DDKAPI (*PALLOCATE_FUNCTION)( /*IN*/ POOL_TYPE PoolType, /*IN*/ SIZE_T NumberOfBytes, /*IN*/ ULONG Tag); typedef VOID DDKAPI (*PFREE_FUNCTION)( /*IN*/ PVOID Buffer); #define GENERAL_LOOKASIDE_S \ SLIST_HEADER ListHead; \ USHORT Depth; \ USHORT MaximumDepth; \ ULONG TotalAllocates; \ _ANONYMOUS_UNION union { \ ULONG AllocateMisses; \ ULONG AllocateHits; \ } DUMMYUNIONNAME; \ ULONG TotalFrees; \ _ANONYMOUS_UNION union { \ ULONG FreeMisses; \ ULONG FreeHits; \ } DUMMYUNIONNAME2; \ POOL_TYPE Type; \ ULONG Tag; \ ULONG Size; \ PALLOCATE_FUNCTION Allocate; \ PFREE_FUNCTION Free; \ LIST_ENTRY ListEntry; \ ULONG LastTotalAllocates; \ _ANONYMOUS_UNION union { \ ULONG LastAllocateMisses; \ ULONG LastAllocateHits; \ } DUMMYUNIONNAME3; \ ULONG Future[2]; typedef struct _GENERAL_LOOKASIDE { GENERAL_LOOKASIDE_S } GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE; typedef struct _NPAGED_LOOKASIDE_LIST { GENERAL_LOOKASIDE_S KSPIN_LOCK Obsoleted; } NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST; typedef struct _PAGED_LOOKASIDE_LIST { GENERAL_LOOKASIDE_S FAST_MUTEX Obsoleted; } PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST; typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT; typedef VOID DDKAPI (*PCALLBACK_FUNCTION)( /*IN*/ PVOID CallbackContext, /*IN*/ PVOID Argument1, /*IN*/ PVOID Argument2); typedef enum _EVENT_TYPE { NotificationEvent, SynchronizationEvent } EVENT_TYPE; typedef enum _KWAIT_REASON { Executive, FreePage, PageIn, PoolAllocation, DelayExecution, Suspended, UserRequest, WrExecutive, WrFreePage, WrPageIn, WrPoolAllocation, WrDelayExecution, WrSuspended, WrUserRequest, WrEventPair, WrQueue, WrLpcReceive, WrLpcReply, WrVirtualMemory, WrPageOut, WrRendezvous, Spare2, Spare3, Spare4, Spare5, Spare6, WrKernel, MaximumWaitReason } KWAIT_REASON; typedef struct _KWAIT_BLOCK { LIST_ENTRY WaitListEntry; struct _KTHREAD * RESTRICTED_POINTER Thread; PVOID Object; struct _KWAIT_BLOCK * RESTRICTED_POINTER NextWaitBlock; USHORT WaitKey; USHORT WaitType; } KWAIT_BLOCK, *PKWAIT_BLOCK, *RESTRICTED_POINTER PRKWAIT_BLOCK; typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK; typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK { BOOLEAN Removed; BOOLEAN Reserved[3]; LONG IoCount; KEVENT RemoveEvent; } IO_REMOVE_LOCK_COMMON_BLOCK; typedef struct _IO_REMOVE_LOCK_DBG_BLOCK { LONG Signature; LONG HighWatermark; LONGLONG MaxLockedTicks; LONG AllocateTag; LIST_ENTRY LockList; KSPIN_LOCK Spin; LONG LowMemoryCount; ULONG Reserved1[4]; PVOID Reserved2; PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks; } IO_REMOVE_LOCK_DBG_BLOCK; typedef struct _IO_REMOVE_LOCK { IO_REMOVE_LOCK_COMMON_BLOCK Common; #ifdef DBG IO_REMOVE_LOCK_DBG_BLOCK Dbg; #endif } IO_REMOVE_LOCK, *PIO_REMOVE_LOCK; typedef struct _IO_WORKITEM *PIO_WORKITEM; typedef VOID DDKAPI (*PIO_WORKITEM_ROUTINE)( /*IN*/ PDEVICE_OBJECT DeviceObject, /*IN*/ PVOID Context); typedef struct _SHARE_ACCESS { ULONG OpenCount; ULONG Readers; ULONG Writers; ULONG Deleters; ULONG SharedRead; ULONG SharedWrite; ULONG SharedDelete; } SHARE_ACCESS, *PSHARE_ACCESS; typedef enum _KINTERRUPT_MODE { LevelSensitive, Latched } KINTERRUPT_MODE; typedef VOID DDKAPI (*PKINTERRUPT_ROUTINE)( VOID); typedef enum _KPROFILE_SOURCE { ProfileTime, ProfileAlignmentFixup, ProfileTotalIssues, ProfilePipelineDry, ProfileLoadInstructions, ProfilePipelineFrozen, ProfileBranchInstructions, ProfileTotalNonissues, ProfileDcacheMisses, ProfileIcacheMisses, ProfileCacheMisses, ProfileBranchMispredictions, ProfileStoreInstructions, ProfileFpInstructions, ProfileIntegerInstructions, Profile2Issue, Profile3Issue, Profile4Issue, ProfileSpecialInstructions, ProfileTotalCycles, ProfileIcacheIssues, ProfileDcacheAccesses, ProfileMemoryBarrierCycles, ProfileLoadLinkedIssues, ProfileMaximum } KPROFILE_SOURCE; typedef enum _CREATE_FILE_TYPE { CreateFileTypeNone, CreateFileTypeNamedPipe, CreateFileTypeMailslot } CREATE_FILE_TYPE; typedef struct _CONFIGURATION_INFORMATION { ULONG DiskCount; ULONG FloppyCount; ULONG CdRomCount; ULONG TapeCount; ULONG ScsiPortCount; ULONG SerialCount; ULONG ParallelCount; BOOLEAN AtDiskPrimaryAddressClaimed; BOOLEAN AtDiskSecondaryAddressClaimed; ULONG Version; ULONG MediumChangerCount; } CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION; typedef enum _CONFIGURATION_TYPE { ArcSystem, CentralProcessor, FloatingPointProcessor, PrimaryIcache, PrimaryDcache, SecondaryIcache, SecondaryDcache, SecondaryCache, EisaAdapter, TcAdapter, ScsiAdapter, DtiAdapter, MultiFunctionAdapter, DiskController, TapeController, CdromController, WormController, SerialController, NetworkController, DisplayController, ParallelController, PointerController, KeyboardController, AudioController, OtherController, DiskPeripheral, FloppyDiskPeripheral, TapePeripheral, ModemPeripheral, MonitorPeripheral, PrinterPeripheral, PointerPeripheral, KeyboardPeripheral, TerminalPeripheral, OtherPeripheral, LinePeripheral, NetworkPeripheral, SystemMemory, DockingInformation, RealModeIrqRoutingTable, MaximumType } CONFIGURATION_TYPE, *PCONFIGURATION_TYPE; typedef NTSTATUS (*PIO_QUERY_DEVICE_ROUTINE)( /*IN*/ PVOID Context, /*IN*/ PUNICODE_STRING PathName, /*IN*/ INTERFACE_TYPE BusType, /*IN*/ ULONG BusNumber, /*IN*/ PKEY_VALUE_FULL_INFORMATION *BusInformation, /*IN*/ CONFIGURATION_TYPE ControllerType, /*IN*/ ULONG ControllerNumber, /*IN*/ PKEY_VALUE_FULL_INFORMATION *ControllerInformation, /*IN*/ CONFIGURATION_TYPE PeripheralType, /*IN*/ ULONG PeripheralNumber, /*IN*/ PKEY_VALUE_FULL_INFORMATION *PeripheralInformation); typedef enum _WORK_QUEUE_TYPE { CriticalWorkQueue, DelayedWorkQueue, HyperCriticalWorkQueue, MaximumWorkQueue } WORK_QUEUE_TYPE; typedef VOID DDKAPI (*PWORKER_THREAD_ROUTINE)( /*IN*/ PVOID Parameter); typedef struct _WORK_QUEUE_ITEM { LIST_ENTRY List; PWORKER_THREAD_ROUTINE WorkerRoutine; PVOID Parameter; } WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM; typedef enum _KBUGCHECK_BUFFER_DUMP_STATE { BufferEmpty, BufferInserted, BufferStarted, BufferFinished, BufferIncomplete } KBUGCHECK_BUFFER_DUMP_STATE; typedef VOID DDKAPI (*PKBUGCHECK_CALLBACK_ROUTINE)( /*IN*/ PVOID Buffer, /*IN*/ ULONG Length); typedef struct _KBUGCHECK_CALLBACK_RECORD { LIST_ENTRY Entry; PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine; PVOID Buffer; ULONG Length; PUCHAR Component; ULONG_PTR Checksum; UCHAR State; } KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD; /* * VOID * KeInitializeCallbackRecord( * IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord) */ #define KeInitializeCallbackRecord(CallbackRecord) \ CallbackRecord->State = BufferEmpty; typedef enum _KDPC_IMPORTANCE { LowImportance, MediumImportance, HighImportance } KDPC_IMPORTANCE; typedef enum _MEMORY_CACHING_TYPE_ORIG { MmFrameBufferCached = 2 } MEMORY_CACHING_TYPE_ORIG; typedef enum _MEMORY_CACHING_TYPE { MmNonCached = FALSE, MmCached = TRUE, MmWriteCombined = MmFrameBufferCached, MmHardwareCoherentCached, MmNonCachedUnordered, MmUSWCCached, MmMaximumCacheType } MEMORY_CACHING_TYPE; typedef enum _MM_PAGE_PRIORITY { LowPagePriority, NormalPagePriority = 16, HighPagePriority = 32 } MM_PAGE_PRIORITY; typedef enum _LOCK_OPERATION { IoReadAccess, IoWriteAccess, IoModifyAccess } LOCK_OPERATION; typedef enum _MM_SYSTEM_SIZE { MmSmallSystem, MmMediumSystem, MmLargeSystem } MM_SYSTEM_SIZE; typedef struct _OBJECT_HANDLE_INFORMATION { ULONG HandleAttributes; ACCESS_MASK GrantedAccess; } OBJECT_HANDLE_INFORMATION, *POBJECT_HANDLE_INFORMATION; typedef struct _CLIENT_ID { HANDLE UniqueProcess; HANDLE UniqueThread; } CLIENT_ID, *PCLIENT_ID; typedef VOID DDKAPI (*PKSTART_ROUTINE)( /*IN*/ PVOID StartContext); typedef VOID DDKAPI (*PCREATE_PROCESS_NOTIFY_ROUTINE)( /*IN*/ HANDLE ParentId, /*IN*/ HANDLE ProcessId, /*IN*/ BOOLEAN Create); typedef VOID DDKAPI (*PCREATE_THREAD_NOTIFY_ROUTINE)( /*IN*/ HANDLE ProcessId, /*IN*/ HANDLE ThreadId, /*IN*/ BOOLEAN Create); typedef struct _IMAGE_INFO { _ANONYMOUS_UNION union { ULONG Properties; _ANONYMOUS_STRUCT struct { ULONG ImageAddressingMode : 8; ULONG SystemModeImage : 1; ULONG ImageMappedToAllPids : 1; ULONG Reserved : 22; } DUMMYSTRUCTNAME; } DUMMYUNIONNAME; PVOID ImageBase; ULONG ImageSelector; SIZE_T ImageSize; ULONG ImageSectionNumber; } IMAGE_INFO, *PIMAGE_INFO; #define IMAGE_ADDRESSING_MODE_32BIT 3 typedef VOID DDKAPI (*PLOAD_IMAGE_NOTIFY_ROUTINE)( /*IN*/ PUNICODE_STRING FullImageName, /*IN*/ HANDLE ProcessId, /*IN*/ PIMAGE_INFO ImageInfo); typedef enum _PROCESSINFOCLASS { ProcessBasicInformation, ProcessQuotaLimits, ProcessIoCounters, ProcessVmCounters, ProcessTimes, ProcessBasePriority, ProcessRaisePriority, ProcessDebugPort, ProcessExceptionPort, ProcessAccessToken, ProcessLdtInformation, ProcessLdtSize, ProcessDefaultHardErrorMode, ProcessIoPortHandlers, ProcessPooledUsageAndLimits, ProcessWorkingSetWatch, ProcessUserModeIOPL, ProcessEnableAlignmentFaultFixup, ProcessPriorityClass, ProcessWx86Information, ProcessHandleCount, ProcessAffinityMask, ProcessPriorityBoost, ProcessDeviceMap, ProcessSessionInformation, ProcessForegroundInformation, ProcessWow64Information, ProcessImageFileName, ProcessLUIDDeviceMapsEnabled, ProcessBreakOnTermination, ProcessDebugObjectHandle, ProcessDebugFlags, ProcessHandleTracing, MaxProcessInfoClass } PROCESSINFOCLASS; typedef enum _THREADINFOCLASS { ThreadBasicInformation, ThreadTimes, ThreadPriority, ThreadBasePriority, ThreadAffinityMask, ThreadImpersonationToken, ThreadDescriptorTableEntry, ThreadEnableAlignmentFaultFixup, ThreadEventPair_Reusable, ThreadQuerySetWin32StartAddress, ThreadZeroTlsCell, ThreadPerformanceCount, ThreadAmILastThread, ThreadIdealProcessor, ThreadPriorityBoost, ThreadSetTlsArrayAddress, ThreadIsIoPending, ThreadHideFromDebugger, ThreadBreakOnTermination, MaxThreadInfoClass } THREADINFOCLASS; #define ES_SYSTEM_REQUIRED 0x00000001 #define ES_DISPLAY_REQUIRED 0x00000002 #define ES_USER_PRESENT 0x00000004 #define ES_CONTINUOUS 0x80000000 typedef ULONG EXECUTION_STATE; typedef VOID DDKAPI (*PREQUEST_POWER_COMPLETE)( /*IN*/ PDEVICE_OBJECT DeviceObject, /*IN*/ UCHAR MinorFunction, /*IN*/ POWER_STATE PowerState, /*IN*/ PVOID Context, /*IN*/ PIO_STATUS_BLOCK IoStatus); typedef enum _TRACE_INFORMATION_CLASS { TraceIdClass, TraceHandleClass, TraceEnableFlagsClass, TraceEnableLevelClass, GlobalLoggerHandleClass, EventLoggerHandleClass, AllLoggerHandlesClass, TraceHandleByNameClass } TRACE_INFORMATION_CLASS; typedef NTSTATUS DDKAPI (*PEX_CALLBACK_FUNCTION)( /*IN*/ PVOID CallbackContext, /*IN*/ PVOID Argument1, /*IN*/ PVOID Argument2); /* ** Storage structures */ typedef enum _PARTITION_STYLE { PARTITION_STYLE_MBR, PARTITION_STYLE_GPT } PARTITION_STYLE; typedef struct _CREATE_DISK_MBR { ULONG Signature; } CREATE_DISK_MBR, *PCREATE_DISK_MBR; typedef struct _CREATE_DISK_GPT { GUID DiskId; ULONG MaxPartitionCount; } CREATE_DISK_GPT, *PCREATE_DISK_GPT; typedef struct _CREATE_DISK { PARTITION_STYLE PartitionStyle; _ANONYMOUS_UNION union { CREATE_DISK_MBR Mbr; CREATE_DISK_GPT Gpt; } DUMMYUNIONNAME; } CREATE_DISK, *PCREATE_DISK; typedef struct _DISK_SIGNATURE { ULONG PartitionStyle; _ANONYMOUS_UNION union { struct { ULONG Signature; ULONG CheckSum; } Mbr; struct { GUID DiskId; } Gpt; } DUMMYUNIONNAME; } DISK_SIGNATURE, *PDISK_SIGNATURE; typedef VOID DDKFASTAPI (*PTIME_UPDATE_NOTIFY_ROUTINE)( /*IN*/ HANDLE ThreadId, /*IN*/ KPROCESSOR_MODE Mode); #define DBG_STATUS_CONTROL_C 1 #define DBG_STATUS_SYSRQ 2 #define DBG_STATUS_BUGCHECK_FIRST 3 #define DBG_STATUS_BUGCHECK_SECOND 4 #define DBG_STATUS_FATAL 5 #define DBG_STATUS_DEBUG_CONTROL 6 #define DBG_STATUS_WORKER 7 typedef struct _PHYSICAL_MEMORY_RANGE { PHYSICAL_ADDRESS BaseAddress; LARGE_INTEGER NumberOfBytes; } PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE; typedef ULONG_PTR (*PDRIVER_VERIFIER_THUNK_ROUTINE)( /*IN*/ PVOID Context); typedef struct _DRIVER_VERIFIER_THUNK_PAIRS { PDRIVER_VERIFIER_THUNK_ROUTINE PristineRoutine; PDRIVER_VERIFIER_THUNK_ROUTINE NewRoutine; } DRIVER_VERIFIER_THUNK_PAIRS, *PDRIVER_VERIFIER_THUNK_PAIRS; #define DRIVER_VERIFIER_SPECIAL_POOLING 0x0001 #define DRIVER_VERIFIER_FORCE_IRQL_CHECKING 0x0002 #define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES 0x0004 #define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS 0x0008 #define DRIVER_VERIFIER_IO_CHECKING 0x0010 #define RTL_RANGE_LIST_ADD_IF_CONFLICT 0x00000001 #define RTL_RANGE_LIST_ADD_SHARED 0x00000002 #define RTL_RANGE_LIST_SHARED_OK 0x00000001 #define RTL_RANGE_LIST_NULL_CONFLICT_OK 0x00000002 #define RTL_RANGE_LIST_SHARED_OK 0x00000001 #define RTL_RANGE_LIST_NULL_CONFLICT_OK 0x00000002 #define RTL_RANGE_LIST_MERGE_IF_CONFLICT RTL_RANGE_LIST_ADD_IF_CONFLICT typedef struct _RTL_RANGE { ULONGLONG Start; ULONGLONG End; PVOID UserData; PVOID Owner; UCHAR Attributes; UCHAR Flags; } RTL_RANGE, *PRTL_RANGE; #define RTL_RANGE_SHARED 0x01 #define RTL_RANGE_CONFLICT 0x02 typedef struct _RTL_RANGE_LIST { LIST_ENTRY ListHead; ULONG Flags; ULONG Count; ULONG Stamp; } RTL_RANGE_LIST, *PRTL_RANGE_LIST; typedef struct _RANGE_LIST_ITERATOR { PLIST_ENTRY RangeListHead; PLIST_ENTRY MergedHead; PVOID Current; ULONG Stamp; } RTL_RANGE_LIST_ITERATOR, *PRTL_RANGE_LIST_ITERATOR; typedef BOOLEAN (*PRTL_CONFLICT_RANGE_CALLBACK)( /*IN*/ PVOID Context, /*IN*/ PRTL_RANGE Range); #define HASH_STRING_ALGORITHM_DEFAULT 0 #define HASH_STRING_ALGORITHM_X65599 1 #define HASH_STRING_ALGORITHM_INVALID 0xffffffff typedef enum _SUITE_TYPE { SmallBusiness, Enterprise, BackOffice, CommunicationServer, TerminalServer, SmallBusinessRestricted, EmbeddedNT, DataCenter, SingleUserTS, Personal, Blade, MaxSuiteType } SUITE_TYPE; typedef VOID DDKAPI (*PTIMER_APC_ROUTINE)( /*IN*/ PVOID TimerContext, /*IN*/ ULONG TimerLowValue, /*IN*/ LONG TimerHighValue); /* ** WMI structures */ typedef VOID DDKAPI (*WMI_NOTIFICATION_CALLBACK)( PVOID Wnode, PVOID Context); /* ** Architecture specific structures */ #ifdef _X86_ typedef ULONG PFN_NUMBER, *PPFN_NUMBER; #define PASSIVE_LEVEL 0 #define LOW_LEVEL 0 #define APC_LEVEL 1 #define DISPATCH_LEVEL 2 #define SYNCH_LEVEL 27 #define PROFILE_LEVEL 27 #define CLOCK1_LEVEL 28 #define CLOCK2_LEVEL 28 #define IPI_LEVEL 29 #define POWER_LEVEL 30 #define HIGH_LEVEL 31 typedef struct _KPCR_TIB { PVOID ExceptionList; /* 00 */ PVOID StackBase; /* 04 */ PVOID StackLimit; /* 08 */ PVOID SubSystemTib; /* 0C */ _ANONYMOUS_UNION union { PVOID FiberData; /* 10 */ DWORD Version; /* 10 */ } DUMMYUNIONNAME; PVOID ArbitraryUserPointer; /* 14 */ struct _NT_TIB *Self; /* 18 */ } KPCR_TIB, *PKPCR_TIB; /* 1C */ #define PCR_MINOR_VERSION 1 #define PCR_MAJOR_VERSION 1 typedef struct _KPCR { KPCR_TIB Tib; /* 00 */ struct _KPCR *Self; /* 1C */ struct _KPRCB *PCRCB; /* 20 */ KIRQL Irql; /* 24 */ ULONG IRR; /* 28 */ ULONG IrrActive; /* 2C */ ULONG IDR; /* 30 */ PVOID KdVersionBlock; /* 34 */ PUSHORT IDT; /* 38 */ PUSHORT GDT; /* 3C */ struct _KTSS *TSS; /* 40 */ USHORT MajorVersion; /* 44 */ USHORT MinorVersion; /* 46 */ KAFFINITY SetMember; /* 48 */ ULONG StallScaleFactor; /* 4C */ UCHAR SpareUnused; /* 50 */ UCHAR Number; /* 51 */ } KPCR, *PKPCR; /* 54 */ typedef struct _KFLOATING_SAVE { ULONG ControlWord; ULONG StatusWord; ULONG ErrorOffset; ULONG ErrorSelector; ULONG DataOffset; ULONG DataSelector; ULONG Cr0NpxState; ULONG Spare1; } KFLOATING_SAVE, *PKFLOATING_SAVE; #define PAGE_SIZE 0x1000 #define PAGE_SHIFT 12L extern NTOSAPI PVOID *MmHighestUserAddress; extern NTOSAPI PVOID *MmSystemRangeStart; extern NTOSAPI ULONG *MmUserProbeAddress; #define MM_HIGHEST_USER_ADDRESS *MmHighestUserAddress #define MM_SYSTEM_RANGE_START *MmSystemRangeStart #define MM_USER_PROBE_ADDRESS *MmUserProbeAddress #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000 #define KI_USER_SHARED_DATA 0xffdf0000 #define SharedUserData ((KUSER_SHARED_DATA * CONST) KI_USER_SHARED_DATA) #define EFLAG_SIGN 0x8000 #define EFLAG_ZERO 0x4000 #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO) #define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT) #define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT) #define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT) typedef enum _INTERLOCKED_RESULT { ResultNegative = RESULT_NEGATIVE, ResultZero = RESULT_ZERO, ResultPositive = RESULT_POSITIVE } INTERLOCKED_RESULT; NTOSAPI KIRQL DDKAPI KeGetCurrentIrql( VOID); /* * ULONG * KeGetCurrentProcessorNumber( * VOID) */ #define KeGetCurrentProcessorNumber() \ ((ULONG)KeGetCurrentKPCR()->Number) #if __USE_NTOSKRNL__ /* CAREFUL: These are exported from ntoskrnl.exe as __fastcall functions, but are also exported from kernel32.dll and declared in winbase.h as __stdcall */ #if !defined(__INTERLOCKED_DECLARED) #define __INTERLOCKED_DECLARED NTOSAPI LONG DDKFASTAPI InterlockedIncrement( /*IN*/ LONG VOLATILE *Addend); NTOSAPI LONG DDKFASTAPI InterlockedDecrement( /*IN*/ LONG VOLATILE *Addend); NTOSAPI LONG DDKFASTAPI InterlockedCompareExchange( /*IN OUT*/ PLONG VOLATILE Destination, /*IN*/ LONG Exchange, /*IN*/ LONG Comparand); NTOSAPI LONG DDKFASTAPI InterlockedExchange( /*IN OUT*/ PLONG VOLATILE Target, /*IN*/ LONG Value); NTOSAPI LONG DDKFASTAPI InterlockedExchangeAdd( /*IN OUT*/ PLONG VOLATILE Addend, /*IN*/ LONG Value); /* * PVOID * InterlockedExchangePointer( * IN OUT PVOID VOLATILE *Target, * IN PVOID Value) */ #define InterlockedExchangePointer(Target, Value) \ ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value)) /* * PVOID * InterlockedCompareExchangePointer( * IN OUT PVOID *Destination, * IN PVOID Exchange, * IN PVOID Comparand) */ #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \ ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand)) #if (_WIN32_WINNT >= 0x0501) PSLIST_ENTRY DDKFASTAPI InterlockedPopEntrySList( /*IN*/ PSLIST_HEADER ListHead); NTOSAPI PSLIST_ENTRY DDKFASTAPI InterlockedPushEntrySList( /*IN*/ PSLIST_HEADER ListHead, /*IN*/ PSLIST_ENTRY ListEntry); #endif /* _WIN32_WINNT >= 0x0501 */ #endif /* !__INTERLOCKED_DECLARED */ #endif /* __USE_NTOSKRNL__ */ NTOSAPI VOID DDKFASTAPI KefAcquireSpinLockAtDpcLevel( /*IN*/ PKSPIN_LOCK SpinLock); NTOSAPI VOID DDKFASTAPI KefReleaseSpinLockFromDpcLevel( /*IN*/ PKSPIN_LOCK SpinLock); #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock) #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock) #define RtlCopyMemoryNonTemporal RtlCopyMemory #define KeGetDcacheFillSize() 1L #endif /* _X86_ */ /* ** Utillity functions */ #define ARGUMENT_PRESENT(ArgumentPointer) \ ((BOOLEAN) ((PVOID)ArgumentPointer != (PVOID)NULL)) /* * ULONG * BYTE_OFFSET( * IN PVOID Va) */ #define BYTE_OFFSET(Va) \ ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1))) /* * ULONG * BYTES_TO_PAGES( * IN ULONG Size) */ #define BYTES_TO_PAGES(Size) \ ((ULONG) ((ULONG_PTR) (Size) >> PAGE_SHIFT) + (((ULONG) (Size) & (PAGE_SIZE - 1)) != 0)) /* * PCHAR * CONTAINING_RECORD( * IN PCHAR Address, * IN TYPE Type, * IN PCHAR Field); */ #ifndef CONTAINING_RECORD #define CONTAINING_RECORD(Address, Type, Field) \ ((Type *) (((ULONG_PTR) Address) - FIELD_OFFSET(Type, Field))) #endif /* LONG * FIELD_OFFSET( * IN TYPE Type, * IN PCHAR Field); */ #ifndef FIELD_OFFSET #define FIELD_OFFSET(Type, Field) \ ((LONG) (&(((Type *) 0)->Field))) #endif /* * PVOID * PAGE_ALIGN( * IN PVOID Va) */ #define PAGE_ALIGN(Va) \ ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1))) /* * ULONG_PTR * ROUND_TO_PAGES( * IN ULONG_PTR Size) */ #define ROUND_TO_PAGES(Size) \ ((ULONG_PTR) (((ULONG_PTR) Size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))) NTOSAPI VOID DDKAPI RtlAssert( /*IN*/ PVOID FailedAssertion, /*IN*/ PVOID FileName, /*IN*/ ULONG LineNumber, /*IN*/ PCHAR Message); #ifdef DBG #define ASSERT(exp) \ ((!(exp)) ? \ (RtlAssert( #exp, __FILE__, __LINE__, NULL ), FALSE) : TRUE) #define ASSERTMSG(msg, exp) \ ((!(exp)) ? \ (RtlAssert( #exp, __FILE__, __LINE__, msg ), FALSE) : TRUE) #define RTL_SOFT_ASSERT(exp) \ ((!(_exp)) ? \ (DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE) : TRUE) #define RTL_SOFT_ASSERTMSG(msg, exp) \ ((!(exp)) ? \ (DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE) : TRUE) #define RTL_VERIFY(exp) ASSERT(exp) #define RTL_VERIFYMSG(msg, exp) ASSERT(msg, exp) #define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp) #define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp) #else /* !DBG */ #define ASSERT(exp) ((VOID) 0) #define ASSERTMSG(msg, exp) ((VOID) 0) #define RTL_SOFT_ASSERT(exp) ((VOID) 0) #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0) #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE) #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE) #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE) #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE) #endif /* DBG */ /* ** Driver support routines */ /** Runtime library routines **/ /* * VOID * InitializeListHead( * IN PLIST_ENTRY ListHead) */ #define InitializeListHead(_ListHead) \ { \ (_ListHead)->Flink = (_ListHead); \ (_ListHead)->Blink = (_ListHead); \ } /* * VOID * InsertHeadList( * IN PLIST_ENTRY ListHead, * IN PLIST_ENTRY Entry) */ #define InsertHeadList(_ListHead, \ _Entry) \ { \ PLIST_ENTRY _OldFlink; \ _OldFlink = (_ListHead)->Flink; \ (_Entry)->Flink = _OldFlink; \ (_Entry)->Blink = (_ListHead); \ _OldFlink->Blink = (_Entry); \ (_ListHead)->Flink = (_Entry); \ } /* * VOID * InsertTailList( * IN PLIST_ENTRY ListHead, * IN PLIST_ENTRY Entry) */ #define InsertTailList(_ListHead, \ _Entry) \ { \ PLIST_ENTRY _OldBlink; \ _OldBlink = (_ListHead)->Blink; \ (_Entry)->Flink = (_ListHead); \ (_Entry)->Blink = _OldBlink; \ _OldBlink->Flink = (_Entry); \ (_ListHead)->Blink = (_Entry); \ } /* * BOOLEAN * IsListEmpty( * IN PLIST_ENTRY ListHead) */ #define IsListEmpty(_ListHead) \ ((_ListHead)->Flink == (_ListHead)) static __inline PSINGLE_LIST_ENTRY PopEntryList( /*IN*/ PSINGLE_LIST_ENTRY ListHead) { PSINGLE_LIST_ENTRY Entry; Entry = ListHead->Next; if (Entry != NULL) { ListHead->Next = Entry->Next; } return Entry; } /* * VOID * PushEntryList( * IN PSINGLE_LIST_ENTRY ListHead, * IN PSINGLE_LIST_ENTRY Entry) */ #define PushEntryList(_ListHead, \ _Entry) \ { \ (_Entry)->Next = (_ListHead)->Next; \ (_ListHead)->Next = (_Entry); \ } /* * VOID * RemoveEntryList( * IN PLIST_ENTRY Entry) */ #define RemoveEntryList(_Entry) \ { \ PLIST_ENTRY _OldFlink; \ PLIST_ENTRY _OldBlink; \ _OldFlink = (_Entry)->Flink; \ _OldBlink = (_Entry)->Blink; \ _OldFlink->Blink = _OldBlink; \ _OldBlink->Flink = _OldFlink; \ (_Entry)->Flink = NULL; \ (_Entry)->Blink = NULL; \ } static __inline PLIST_ENTRY RemoveHeadList( /*IN*/ PLIST_ENTRY ListHead) { PLIST_ENTRY OldFlink; PLIST_ENTRY OldBlink; PLIST_ENTRY Entry; Entry = ListHead->Flink; OldFlink = ListHead->Flink->Flink; OldBlink = ListHead->Flink->Blink; OldFlink->Blink = OldBlink; OldBlink->Flink = OldFlink; if (Entry != ListHead) { Entry->Flink = NULL; Entry->Blink = NULL; } return Entry; } static __inline PLIST_ENTRY RemoveTailList( /*IN*/ PLIST_ENTRY ListHead) { PLIST_ENTRY OldFlink; PLIST_ENTRY OldBlink; PLIST_ENTRY Entry; Entry = ListHead->Blink; OldFlink = ListHead->Blink->Flink; OldBlink = ListHead->Blink->Blink; OldFlink->Blink = OldBlink; OldBlink->Flink = OldFlink; if (Entry != ListHead) { Entry->Flink = NULL; Entry->Blink = NULL; } return Entry; } /* * USHORT * QueryDepthSList( * IN PSLIST_HEADER SListHead) */ #define QueryDepthSList(_SListHead) \ ((USHORT) ((_SListHead)->Alignment & 0xffff)) #define InterlockedFlushSList(ListHead) ExInterlockedFlushSList(ListHead) NTOSAPI ULONG DDKAPI RtlAnsiStringToUnicodeSize( /*IN*/ PANSI_STRING AnsiString); NTOSAPI NTSTATUS DDKAPI RtlAddRange( /*IN OUT*/ PRTL_RANGE_LIST RangeList, /*IN*/ ULONGLONG Start, /*IN*/ ULONGLONG End, /*IN*/ UCHAR Attributes, /*IN*/ ULONG Flags, /*IN*/ PVOID UserData /*OPTIONAL*/, /*IN*/ PVOID Owner /*OPTIONAL*/); NTOSAPI NTSTATUS DDKAPI RtlAnsiStringToUnicodeString( /*IN OUT*/ PUNICODE_STRING DestinationString, /*IN*/ PANSI_STRING SourceString, /*IN*/ BOOLEAN AllocateDestinationString); NTOSAPI NTSTATUS DDKAPI RtlAppendUnicodeStringToString( /*IN OUT*/ PUNICODE_STRING Destination, /*IN*/ PUNICODE_STRING Source); NTOSAPI NTSTATUS DDKAPI RtlAppendUnicodeToString( /*IN OUT*/ PUNICODE_STRING Destination, /*IN*/ PCWSTR Source); NTOSAPI BOOLEAN DDKAPI RtlAreBitsClear( /*IN*/ PRTL_BITMAP BitMapHeader, /*IN*/ ULONG StartingIndex, /*IN*/ ULONG Length); NTOSAPI BOOLEAN DDKAPI RtlAreBitsSet( /*IN*/ PRTL_BITMAP BitMapHeader, /*IN*/ ULONG StartingIndex, /*IN*/ ULONG Length); NTOSAPI NTSTATUS DDKAPI RtlCharToInteger( /*IN*/ PCSZ String, /*IN*/ ULONG Base /*OPTIONAL*/, /*IN OUT*/ PULONG Value); NTOSAPI ULONG DDKAPI RtlCheckBit( /*IN*/ PRTL_BITMAP BitMapHeader, /*IN*/ ULONG BitPosition); NTOSAPI NTSTATUS DDKAPI RtlCheckRegistryKey( /*IN*/ ULONG RelativeTo, /*IN*/ PWSTR Path); NTOSAPI VOID DDKAPI RtlClearAllBits( /*IN*/ PRTL_BITMAP BitMapHeader); NTOSAPI VOID DDKAPI RtlClearBit( PRTL_BITMAP BitMapHeader, ULONG BitNumber); NTOSAPI VOID DDKAPI RtlClearBits( /*IN*/ PRTL_BITMAP BitMapHeader, /*IN*/ ULONG StartingIndex, /*IN*/ ULONG NumberToClear); NTOSAPI SIZE_T DDKAPI RtlCompareMemory( /*IN*/ CONST VOID *Source1, /*IN*/ CONST VOID *Source2, /*IN*/ SIZE_T Length); NTOSAPI LONG DDKAPI RtlCompareString( /*IN*/ PSTRING String1, /*IN*/ PSTRING String2, BOOLEAN CaseInSensitive); NTOSAPI LONG DDKAPI RtlCompareUnicodeString( /*IN*/ PUNICODE_STRING String1, /*IN*/ PUNICODE_STRING String2, /*IN*/ BOOLEAN CaseInSensitive); NTOSAPI LARGE_INTEGER DDKAPI RtlConvertLongToLargeInteger( /*IN*/ LONG SignedInteger); NTOSAPI LUID DDKAPI RtlConvertLongToLuid( /*IN*/ LONG Long); NTOSAPI LARGE_INTEGER DDKAPI RtlConvertUlongToLargeInteger( /*IN*/ ULONG UnsignedInteger); NTOSAPI LUID DDKAPI RtlConvertUlongToLuid( ULONG Ulong); /* * VOID * RtlCopyMemory( * IN VOID UNALIGNED *Destination, * IN CONST VOID UNALIGNED *Source, * IN SIZE_T Length) */ #ifndef RtlCopyMemory #define RtlCopyMemory(Destination, Source, Length) \ memcpy(Destination, Source, Length); #endif #ifndef RtlCopyBytes #define RtlCopyBytes RtlCopyMemory #endif NTOSAPI VOID DDKAPI RtlCopyMemory32( /*IN*/ VOID UNALIGNED *Destination, /*IN*/ CONST VOID UNALIGNED *Source, /*IN*/ ULONG Length); NTOSAPI NTSTATUS DDKAPI RtlCopyRangeList( /*OUT*/ PRTL_RANGE_LIST CopyRangeList, /*IN*/ PRTL_RANGE_LIST RangeList); NTOSAPI VOID DDKAPI RtlCopyString( /*IN OUT*/ PSTRING DestinationString, /*IN*/ PSTRING SourceString /*OPTIONAL*/); NTOSAPI VOID DDKAPI RtlCopyUnicodeString( /*IN OUT*/ PUNICODE_STRING DestinationString, /*IN*/ PUNICODE_STRING SourceString); NTOSAPI NTSTATUS DDKAPI RtlCreateRegistryKey( /*IN*/ ULONG RelativeTo, /*IN*/ PWSTR Path); NTOSAPI NTSTATUS DDKAPI RtlCreateSecurityDescriptor( /*IN OUT*/ PSECURITY_DESCRIPTOR SecurityDescriptor, /*IN*/ ULONG Revision); NTOSAPI NTSTATUS DDKAPI RtlDeleteOwnersRanges( /*IN OUT*/ PRTL_RANGE_LIST RangeList, /*IN*/ PVOID Owner); NTOSAPI NTSTATUS DDKAPI RtlDeleteRange( /*IN OUT*/ PRTL_RANGE_LIST RangeList, /*IN*/ ULONGLONG Start, /*IN*/ ULONGLONG End, /*IN*/ PVOID Owner); NTOSAPI NTSTATUS DDKAPI RtlDeleteRegistryValue( /*IN*/ ULONG RelativeTo, /*IN*/ PCWSTR Path, /*IN*/ PCWSTR ValueName); NTOSAPI BOOL DDKAPI RtlDosPathNameToNtPathName_U( /*IN*/ PCWSTR DosPathName, /*OUT*/ PUNICODE_STRING NtPathName, /*OUT*/ PCWSTR *NtFileNamePart, /*OUT*/ VOID *DirectoryInfo); /* * BOOLEAN * RtlEqualLuid( * IN LUID Luid1, * IN LUID Luid2) */ #define RtlEqualLuid(_Luid1, \ _Luid2) \ ((Luid1.LowPart == Luid2.LowPart) && (Luid1.HighPart == Luid2.HighPart)) /* * ULONG * RtlEqualMemory( * IN VOID UNALIGNED *Destination, * IN CONST VOID UNALIGNED *Source, * IN SIZE_T Length) */ #define RtlEqualMemory(Destination, Source, Length) (!memcmp(Destination, Source, Length)) NTOSAPI BOOLEAN DDKAPI RtlEqualString( /*IN*/ PSTRING String1, /*IN*/ PSTRING String2, /*IN*/ BOOLEAN CaseInSensitive); NTOSAPI BOOLEAN DDKAPI RtlEqualUnicodeString( /*IN*/ CONST UNICODE_STRING *String1, /*IN*/ CONST UNICODE_STRING *String2, /*IN*/ BOOLEAN CaseInSensitive); /* * VOID * RtlFillMemory( * IN VOID UNALIGNED *Destination, * IN SIZE_T Length, * IN UCHAR Fill) */ #ifndef RtlFillMemory #define RtlFillMemory(Destination, Length, Fill) \ memset(Destination, Fill, Length) #endif #ifndef RtlFillBytes #define RtlFillBytes RtlFillMemory #endif NTOSAPI ULONG DDKAPI RtlFindClearBits( /*IN*/ PRTL_BITMAP BitMapHeader, /*IN*/ ULONG NumberToFind, /*IN*/ ULONG HintIndex); NTOSAPI ULONG DDKAPI RtlFindClearBitsAndSet( /*IN*/ PRTL_BITMAP BitMapHeader, /*IN*/ ULONG NumberToFind, /*IN*/ ULONG HintIndex); NTOSAPI ULONG DDKAPI RtlFindClearRuns( /*IN*/ PRTL_BITMAP BitMapHeader, /*OUT*/ PRTL_BITMAP_RUN RunArray, /*IN*/ ULONG SizeOfRunArray, /*IN*/ BOOLEAN LocateLongestRuns); NTOSAPI ULONG DDKAPI RtlFindFirstRunClear( /*IN*/ PRTL_BITMAP BitMapHeader, /*OUT*/ PULONG StartingIndex); NTOSAPI ULONG DDKAPI RtlFindLastBackwardRunClear( /*IN*/ PRTL_BITMAP BitMapHeader, /*IN*/ ULONG FromIndex, /*OUT*/ PULONG StartingRunIndex); NTOSAPI CCHAR DDKAPI RtlFindLeastSignificantBit( /*IN*/ ULONGLONG Set); NTOSAPI ULONG DDKAPI RtlFindLongestRunClear( /*IN*/ PRTL_BITMAP BitMapHeader, /*OUT*/ PULONG StartingIndex); NTOSAPI CCHAR DDKAPI RtlFindMostSignificantBit( /*IN*/ ULONGLONG Set); NTOSAPI ULONG DDKAPI RtlFindNextForwardRunClear( /*IN*/ PRTL_BITMAP BitMapHeader, /*IN*/ ULONG FromIndex, /*OUT*/ PULONG StartingRunIndex); NTOSAPI NTSTATUS DDKAPI RtlFindRange( /*IN*/ PRTL_RANGE_LIST RangeList, /*IN*/ ULONGLONG Minimum, /*IN*/ ULONGLONG Maximum, /*IN*/ ULONG Length, /*IN*/ ULONG Alignment, /*IN*/ ULONG Flags, /*IN*/ UCHAR AttributeAvailableMask, /*IN*/ PVOID Context /*OPTIONAL*/, /*IN*/ PRTL_CONFLICT_RANGE_CALLBACK Callback /*OPTIONAL*/, /*OUT*/ PULONGLONG Start); NTOSAPI ULONG DDKAPI RtlFindSetBits( /*IN*/ PRTL_BITMAP BitMapHeader, /*IN*/ ULONG NumberToFind, /*IN*/ ULONG HintIndex); NTOSAPI ULONG DDKAPI RtlFindSetBitsAndClear( /*IN*/ PRTL_BITMAP BitMapHeader, /*IN*/ ULONG NumberToFind, /*IN*/ ULONG HintIndex); NTOSAPI VOID DDKAPI RtlFreeAnsiString( /*IN*/ PANSI_STRING AnsiString); NTOSAPI VOID DDKAPI RtlFreeRangeList( /*IN*/ PRTL_RANGE_LIST RangeList); NTOSAPI VOID DDKAPI RtlFreeUnicodeString( /*IN*/ PUNICODE_STRING UnicodeString); NTOSAPI VOID DDKAPI RtlGetCallersAddress( /*OUT*/ PVOID *CallersAddress, /*OUT*/ PVOID *CallersCaller); NTOSAPI NTSTATUS DDKAPI RtlGetVersion( /*IN OUT*/ PRTL_OSVERSIONINFOW lpVersionInformation); NTOSAPI NTSTATUS DDKAPI RtlGetFirstRange( /*IN*/ PRTL_RANGE_LIST RangeList, /*OUT*/ PRTL_RANGE_LIST_ITERATOR Iterator, /*OUT*/ PRTL_RANGE *Range); NTOSAPI NTSTATUS DDKAPI RtlGetNextRange( /*IN OUT*/ PRTL_RANGE_LIST_ITERATOR Iterator, /*OUT*/ PRTL_RANGE *Range, /*IN*/ BOOLEAN MoveForwards); #define FOR_ALL_RANGES(RangeList, Iterator, Current) \ for (RtlGetFirstRange((RangeList), (Iterator), &(Current)); \ (Current) != NULL; \ RtlGetNextRange((Iterator), &(Current), TRUE)) #define FOR_ALL_RANGES_BACKWARDS(RangeList, Iterator, Current) \ for (RtlGetLastRange((RangeList), (Iterator), &(Current)); \ (Current) != NULL; \ RtlGetNextRange((Iterator), &(Current), FALSE)) NTOSAPI NTSTATUS DDKAPI RtlGUIDFromString( /*IN*/ PUNICODE_STRING GuidString, /*OUT*/ GUID *Guid); NTOSAPI NTSTATUS DDKAPI RtlHashUnicodeString( /*IN*/ CONST UNICODE_STRING *String, /*IN*/ BOOLEAN CaseInSensitive, /*IN*/ ULONG HashAlgorithm, /*OUT*/ PULONG HashValue); NTOSAPI VOID DDKAPI RtlInitAnsiString( /*IN OUT*/ PANSI_STRING DestinationString, /*IN*/ PCSZ SourceString); NTOSAPI VOID DDKAPI RtlInitializeBitMap( /*IN*/ PRTL_BITMAP BitMapHeader, /*IN*/ PULONG BitMapBuffer, /*IN*/ ULONG SizeOfBitMap); NTOSAPI VOID DDKAPI RtlInitializeRangeList( /*IN OUT*/ PRTL_RANGE_LIST RangeList); NTOSAPI VOID DDKAPI RtlInitString( /*IN OUT*/ PSTRING DestinationString, /*IN*/ PCSZ SourceString); NTOSAPI VOID DDKAPI RtlInitUnicodeString( /*IN OUT*/ PUNICODE_STRING DestinationString, /*IN*/ PCWSTR SourceString); NTOSAPI NTSTATUS DDKAPI RtlInt64ToUnicodeString( /*IN*/ ULONGLONG Value, /*IN*/ ULONG Base /*OPTIONAL*/, /*IN OUT*/ PUNICODE_STRING String); NTOSAPI NTSTATUS DDKAPI RtlIntegerToUnicodeString( /*IN*/ ULONG Value, /*IN*/ ULONG Base /*OPTIONAL*/, /*IN OUT*/ PUNICODE_STRING String); NTOSAPI NTSTATUS DDKAPI RtlIntPtrToUnicodeString( PLONG Value, ULONG Base /*OPTIONAL*/, PUNICODE_STRING String); NTOSAPI NTSTATUS DDKAPI RtlInvertRangeList( /*OUT*/ PRTL_RANGE_LIST InvertedRangeList, /*IN*/ PRTL_RANGE_LIST RangeList); NTOSAPI NTSTATUS DDKAPI RtlIsRangeAvailable( /*IN*/ PRTL_RANGE_LIST RangeList, /*IN*/ ULONGLONG Start, /*IN*/ ULONGLONG End, /*IN*/ ULONG Flags, /*IN*/ UCHAR AttributeAvailableMask, /*IN*/ PVOID Context /*OPTIONAL*/, /*IN*/ PRTL_CONFLICT_RANGE_CALLBACK Callback /*OPTIONAL*/, /*OUT*/ PBOOLEAN Available); /* * BOOLEAN * RtlIsZeroLuid( * IN PLUID L1) */ #define RtlIsZeroLuid(_L1) \ ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart))) NTOSAPI ULONG DDKAPI RtlLengthSecurityDescriptor( /*IN*/ PSECURITY_DESCRIPTOR SecurityDescriptor); NTOSAPI VOID DDKAPI RtlMapGenericMask( /*IN OUT*/ PACCESS_MASK AccessMask, /*IN*/ PGENERIC_MAPPING GenericMapping); NTOSAPI NTSTATUS DDKAPI RtlMergeRangeLists( /*OUT*/ PRTL_RANGE_LIST MergedRangeList, /*IN*/ PRTL_RANGE_LIST RangeList1, /*IN*/ PRTL_RANGE_LIST RangeList2, /*IN*/ ULONG Flags); /* * VOID * RtlMoveMemory( * IN VOID UNALIGNED *Destination, * IN CONST VOID UNALIGNED *Source, * IN SIZE_T Length) */ #define RtlMoveMemory memmove NTOSAPI ULONG DDKAPI RtlNumberOfClearBits( /*IN*/ PRTL_BITMAP BitMapHeader); NTOSAPI ULONG DDKAPI RtlNumberOfSetBits( /*IN*/ PRTL_BITMAP BitMapHeader); NTOSAPI VOID DDKFASTAPI RtlPrefetchMemoryNonTemporal( /*IN*/ PVOID Source, /*IN*/ SIZE_T Length); NTOSAPI BOOLEAN DDKAPI RtlPrefixUnicodeString( /*IN*/ PUNICODE_STRING String1, /*IN*/ PUNICODE_STRING String2, /*IN*/ BOOLEAN CaseInSensitive); NTOSAPI NTSTATUS DDKAPI RtlQueryRegistryValues( /*IN*/ ULONG RelativeTo, /*IN*/ PCWSTR Path, /*IN*/ PRTL_QUERY_REGISTRY_TABLE QueryTable, /*IN*/ PVOID Context, /*IN*/ PVOID Environment /*OPTIONAL*/); NTOSAPI VOID DDKAPI RtlRetrieveUlong( /*IN OUT*/ PULONG DestinationAddress, /*IN*/ PULONG SourceAddress); NTOSAPI VOID DDKAPI RtlRetrieveUshort( /*IN OUT*/ PUSHORT DestinationAddress, /*IN*/ PUSHORT SourceAddress); NTOSAPI VOID DDKAPI RtlSetAllBits( /*IN*/ PRTL_BITMAP BitMapHeader); NTOSAPI VOID DDKAPI RtlSetBit( PRTL_BITMAP BitMapHeader, ULONG BitNumber); NTOSAPI VOID DDKAPI RtlSetBits( /*IN*/ PRTL_BITMAP BitMapHeader, /*IN*/ ULONG StartingIndex, /*IN*/ ULONG NumberToSet); NTOSAPI NTSTATUS DDKAPI RtlSetDaclSecurityDescriptor( /*IN OUT*/ PSECURITY_DESCRIPTOR SecurityDescriptor, /*IN*/ BOOLEAN DaclPresent, /*IN*/ PACL Dacl /*OPTIONAL*/, /*IN*/ BOOLEAN DaclDefaulted /*OPTIONAL*/); NTOSAPI VOID DDKAPI RtlStoreUlong( /*IN*/ PULONG Address, /*IN*/ ULONG Value); NTOSAPI VOID DDKAPI RtlStoreUlonglong( /*IN OUT*/ PULONGLONG Address, ULONGLONG Value); NTOSAPI VOID DDKAPI RtlStoreUlongPtr( /*IN OUT*/ PULONG_PTR Address, /*IN*/ ULONG_PTR Value); NTOSAPI VOID DDKAPI RtlStoreUshort( /*IN*/ PUSHORT Address, /*IN*/ USHORT Value); NTOSAPI NTSTATUS DDKAPI RtlStringFromGUID( /*IN*/ REFGUID Guid, /*OUT*/ PUNICODE_STRING GuidString); #define RtlStringCbCopyA(dst, dst_len, src) strncpy(dst, src, dst_len) #define RtlStringCbPrintfA(args...) snprintf(args) #define RtlStringCbVPrintfA(args...) vsnprintf(args) NTOSAPI BOOLEAN DDKAPI RtlTestBit( /*IN*/ PRTL_BITMAP BitMapHeader, /*IN*/ ULONG BitNumber); NTOSAPI BOOLEAN DDKAPI RtlTimeFieldsToTime( /*IN*/ PTIME_FIELDS TimeFields, /*IN*/ PLARGE_INTEGER Time); NTOSAPI VOID DDKAPI RtlTimeToTimeFields( /*IN*/ PLARGE_INTEGER Time, /*IN*/ PTIME_FIELDS TimeFields); NTOSAPI ULONG DDKFASTAPI RtlUlongByteSwap( /*IN*/ ULONG Source); NTOSAPI ULONGLONG DDKFASTAPI RtlUlonglongByteSwap( /*IN*/ ULONGLONG Source); NTOSAPI ULONG DDKAPI RtlUnicodeStringToAnsiSize( /*IN*/ PUNICODE_STRING UnicodeString); NTOSAPI NTSTATUS DDKAPI RtlUnicodeStringToAnsiString( /*IN OUT*/ PANSI_STRING DestinationString, /*IN*/ PUNICODE_STRING SourceString, /*IN*/ BOOLEAN AllocateDestinationString); NTOSAPI NTSTATUS DDKAPI RtlUnicodeStringToInteger( /*IN*/ PUNICODE_STRING String, /*IN*/ ULONG Base /*OPTIONAL*/, /*OUT*/ PULONG Value); NTOSAPI WCHAR DDKAPI RtlUpcaseUnicodeChar( /*IN*/ WCHAR SourceCharacter); NTOSAPI NTSTATUS DDKAPI RtlUpcaseUnicodeString( /*IN OUT*/ PUNICODE_STRING DestinationString /*OPTIONAL*/, /*IN*/ PCUNICODE_STRING SourceString, /*IN*/ BOOLEAN AllocateDestinationString); NTOSAPI CHAR DDKAPI RtlUpperChar( /*IN*/ CHAR Character); NTOSAPI VOID DDKAPI RtlUpperString( /*IN OUT*/ PSTRING DestinationString, /*IN*/ PSTRING SourceString); NTOSAPI USHORT DDKFASTAPI RtlUshortByteSwap( /*IN*/ USHORT Source); NTOSAPI BOOLEAN DDKAPI RtlValidRelativeSecurityDescriptor( /*IN*/ PSECURITY_DESCRIPTOR SecurityDescriptorInput, /*IN*/ ULONG SecurityDescriptorLength, /*IN*/ SECURITY_INFORMATION RequiredInformation); NTOSAPI BOOLEAN DDKAPI RtlValidSecurityDescriptor( /*IN*/ PSECURITY_DESCRIPTOR SecurityDescriptor); NTOSAPI NTSTATUS DDKAPI RtlVerifyVersionInfo( /*IN*/ PRTL_OSVERSIONINFOEXW VersionInfo, /*IN*/ ULONG TypeMask, /*IN*/ ULONGLONG ConditionMask); NTOSAPI NTSTATUS DDKAPI RtlVolumeDeviceToDosName( /*IN*/ PVOID VolumeDeviceObject, /*OUT*/ PUNICODE_STRING DosName); NTOSAPI ULONG DDKAPI RtlWalkFrameChain( /*OUT*/ PVOID *Callers, /*IN*/ ULONG Count, /*IN*/ ULONG Flags); NTOSAPI NTSTATUS DDKAPI RtlWriteRegistryValue( /*IN*/ ULONG RelativeTo, /*IN*/ PCWSTR Path, /*IN*/ PCWSTR ValueName, /*IN*/ ULONG ValueType, /*IN*/ PVOID ValueData, /*IN*/ ULONG ValueLength); NTOSAPI ULONG DDKAPI RtlxUnicodeStringToAnsiSize( /*IN*/ PUNICODE_STRING UnicodeString); /* * VOID * RtlZeroMemory( * IN VOID UNALIGNED *Destination, * IN SIZE_T Length) */ #ifndef RtlZeroMemory #define RtlZeroMemory(Destination, Length) \ memset(Destination, 0, Length) #endif #ifndef RtlZeroBytes #define RtlZeroBytes RtlZeroMemory #endif /** Executive support routines **/ NTOSAPI VOID DDKFASTAPI ExAcquireFastMutex( /*IN*/ PFAST_MUTEX FastMutex); NTOSAPI VOID DDKFASTAPI ExAcquireFastMutexUnsafe( /*IN*/ PFAST_MUTEX FastMutex); NTOSAPI BOOLEAN DDKAPI ExAcquireResourceExclusiveLite( /*IN*/ PERESOURCE Resource, /*IN*/ BOOLEAN Wait); NTOSAPI BOOLEAN DDKAPI ExAcquireResourceSharedLite( /*IN*/ PERESOURCE Resource, /*IN*/ BOOLEAN Wait); NTOSAPI BOOLEAN DDKAPI ExAcquireSharedStarveExclusive( /*IN*/ PERESOURCE Resource, /*IN*/ BOOLEAN Wait); NTOSAPI BOOLEAN DDKAPI ExAcquireSharedWaitForExclusive( /*IN*/ PERESOURCE Resource, /*IN*/ BOOLEAN Wait); NTOSAPI PSINGLE_LIST_ENTRY DDKFASTAPI ExInterlockedPopEntrySList( /*IN*/ PSLIST_HEADER ListHead, /*IN*/ PKSPIN_LOCK Lock); NTOSAPI PSINGLE_LIST_ENTRY DDKFASTAPI ExInterlockedPushEntrySList( /*IN*/ PSLIST_HEADER ListHead, /*IN*/ PSINGLE_LIST_ENTRY ListEntry, /*IN*/ PKSPIN_LOCK Lock); #if (__USE_NTOSKRNL__) && (_WIN32_WINNT >= 0x0501) #define ExInterlockedPopEntrySList(_ListHead, \ _Lock) \ InterlockedPopEntrySList(_ListHead) #define ExInterlockedPushEntrySList(_ListHead, \ _ListEntry, \ _Lock) \ InterlockedPushEntrySList(_ListHead, _ListEntry) #endif /* __USE_NTOSKRNL__ */ #define ExQueryDepthSList(ListHead) QueryDepthSList(ListHead) static __inline PVOID ExAllocateFromNPagedLookasideList( /*IN*/ PNPAGED_LOOKASIDE_LIST Lookaside) { PVOID Entry; Lookaside->TotalAllocates++; Entry = ExInterlockedPopEntrySList(&Lookaside->ListHead, &Lookaside->Obsoleted); if (Entry == NULL) { Lookaside->_DDK_DUMMYUNION_MEMBER(AllocateMisses)++; Entry = (Lookaside->Allocate)(Lookaside->Type, Lookaside->Size, Lookaside->Tag); } return Entry; } static __inline VOID ExFreeToNPagedLookasideList( /*IN*/ PNPAGED_LOOKASIDE_LIST Lookaside, /*IN*/ PVOID Entry) { Lookaside->TotalFrees++; if (ExQueryDepthSList(&Lookaside->ListHead) >= Lookaside->Depth) { Lookaside->_DDK_DUMMYUNION_N_MEMBER(2,FreeMisses)++; (Lookaside->Free)(Entry); } else { ExInterlockedPushEntrySList(&Lookaside->ListHead, (PSLIST_ENTRY)Entry, &Lookaside->Obsoleted); } } #if (__USE_NTOSKRNL__) && (_WIN32_WINNT >= 0x0501) static __inline PVOID ExAllocateFromPagedLookasideList( /*IN*/ PPAGED_LOOKASIDE_LIST Lookaside) { PVOID Entry; Lookaside->TotalAllocates++; Entry = InterlockedPopEntrySList(&Lookaside->ListHead); if (Entry == NULL) { Lookaside->_DDK_DUMMYUNION_MEMBER(AllocateMisses)++; Entry = (Lookaside->Allocate)(Lookaside->Type, Lookaside->Size, Lookaside->Tag); } return Entry; } static __inline VOID ExFreeToPagedLookasideList( /*IN*/ PPAGED_LOOKASIDE_LIST Lookaside, /*IN*/ PVOID Entry) { Lookaside->TotalFrees++; if (ExQueryDepthSList(&Lookaside->ListHead) >= Lookaside->Depth) { Lookaside->_DDK_DUMMYUNION_N_MEMBER(2,FreeMisses)++; (Lookaside->Free)(Entry); } else { InterlockedPushEntrySList(&Lookaside->ListHead, (PSLIST_ENTRY)Entry); } } #else /* (__USE_NTOSKRNL__) && (_WIN32_WINNT >= 0x0501) */ NTOSAPI PVOID DDKAPI ExAllocateFromPagedLookasideList( /*IN*/ PPAGED_LOOKASIDE_LIST Lookaside); NTOSAPI VOID DDKAPI ExFreeToPagedLookasideList( /*IN*/ PPAGED_LOOKASIDE_LIST Lookaside, /*IN*/ PVOID Entry); #endif /* (__USE_NTOSKRNL__) && (_WIN32_WINNT >= 0x0501) */ NTOSAPI PVOID DDKAPI ExAllocatePoolWithQuotaTag( /*IN*/ POOL_TYPE PoolType, /*IN*/ SIZE_T NumberOfBytes, /*IN*/ ULONG Tag); NTOSAPI PVOID DDKAPI ExAllocatePoolWithTag( /*IN*/ POOL_TYPE PoolType, /*IN*/ SIZE_T NumberOfBytes, /*IN*/ ULONG Tag); #ifdef POOL_TAGGING #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD') #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD') #else /* !POOL_TAGGING */ NTOSAPI PVOID DDKAPI ExAllocatePool( /*IN*/ POOL_TYPE PoolType, /*IN*/ SIZE_T NumberOfBytes); NTOSAPI PVOID DDKAPI ExAllocatePoolWithQuota( /*IN*/ POOL_TYPE PoolType, /*IN*/ SIZE_T NumberOfBytes); #endif /* POOL_TAGGING */ NTOSAPI PVOID DDKAPI ExAllocatePoolWithTagPriority( /*IN*/ POOL_TYPE PoolType, /*IN*/ SIZE_T NumberOfBytes, /*IN*/ ULONG Tag, /*IN*/ EX_POOL_PRIORITY Priority); NTOSAPI VOID DDKAPI ExConvertExclusiveToSharedLite( /*IN*/ PERESOURCE Resource); NTOSAPI NTSTATUS DDKAPI ExCreateCallback( /*OUT*/ PCALLBACK_OBJECT *CallbackObject, /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes, /*IN*/ BOOLEAN Create, /*IN*/ BOOLEAN AllowMultipleCallbacks); NTOSAPI VOID DDKAPI ExDeleteNPagedLookasideList( /*IN*/ PNPAGED_LOOKASIDE_LIST Lookaside); NTOSAPI VOID DDKAPI ExDeletePagedLookasideList( /*IN*/ PPAGED_LOOKASIDE_LIST Lookaside); NTOSAPI NTSTATUS DDKAPI ExDeleteResourceLite( /*IN*/ PERESOURCE Resource); NTOSAPI VOID DDKAPI ExFreePool( /*IN*/ PVOID P); #define PROTECTED_POOL 0x80000000 #ifdef POOL_TAGGING #define ExFreePool(P) ExFreePoolWithTag(P, 0) #endif NTOSAPI VOID DDKAPI ExFreePoolWithTag( /*IN*/ PVOID P, /*IN*/ ULONG Tag); /* * ERESOURCE_THREAD * ExGetCurrentResourceThread( * VOID); */ #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD) PsGetCurrentThread()) NTOSAPI ULONG DDKAPI ExGetExclusiveWaiterCount( /*IN*/ PERESOURCE Resource); NTOSAPI KPROCESSOR_MODE DDKAPI ExGetPreviousMode( VOID); NTOSAPI ULONG DDKAPI ExGetSharedWaiterCount( /*IN*/ PERESOURCE Resource); NTOSAPI VOID DDKAPI KeInitializeEvent( /*IN*/ PRKEVENT Event, /*IN*/ EVENT_TYPE Type, /*IN*/ BOOLEAN State); /* * VOID DDKAPI * ExInitializeFastMutex( * IN PFAST_MUTEX FastMutex) */ #define ExInitializeFastMutex(_FastMutex) \ { \ (_FastMutex)->Count = 1; \ (_FastMutex)->Owner = NULL; \ (_FastMutex)->Contention = 0; \ KeInitializeEvent(&(_FastMutex)->Event, SynchronizationEvent, FALSE); \ } NTOSAPI VOID DDKAPI ExInitializeNPagedLookasideList( /*IN*/ PNPAGED_LOOKASIDE_LIST Lookaside, /*IN*/ PALLOCATE_FUNCTION Allocate /*OPTIONAL*/, /*IN*/ PFREE_FUNCTION Free /*OPTIONAL*/, /*IN*/ ULONG Flags, /*IN*/ SIZE_T Size, /*IN*/ ULONG Tag, /*IN*/ USHORT Depth); NTOSAPI VOID DDKAPI ExInitializePagedLookasideList( /*IN*/ PPAGED_LOOKASIDE_LIST Lookaside, /*IN*/ PALLOCATE_FUNCTION Allocate /*OPTIONAL*/, /*IN*/ PFREE_FUNCTION Free /*OPTIONAL*/, /*IN*/ ULONG Flags, /*IN*/ SIZE_T Size, /*IN*/ ULONG Tag, /*IN*/ USHORT Depth); NTOSAPI NTSTATUS DDKAPI ExInitializeResourceLite( /*IN*/ PERESOURCE Resource); /* * VOID * InitializeSListHead( * IN PSLIST_HEADER SListHead) */ #define InitializeSListHead(_SListHead) \ (_SListHead)->Alignment = 0 #define ExInitializeSListHead InitializeSListHead NTOSAPI LARGE_INTEGER DDKAPI ExInterlockedAddLargeInteger( /*IN*/ PLARGE_INTEGER Addend, /*IN*/ LARGE_INTEGER Increment, /*IN*/ PKSPIN_LOCK Lock); NTOSAPI VOID DDKFASTAPI ExInterlockedAddLargeStatistic( /*IN*/ PLARGE_INTEGER Addend, /*IN*/ ULONG Increment); NTOSAPI ULONG DDKAPI ExInterlockedAddUlong( /*IN*/ PULONG Addend, /*IN*/ ULONG Increment, PKSPIN_LOCK Lock); NTOSAPI ULONG DDKFASTAPI ExfInterlockedAddUlong( /*IN*/ PULONG Addend, /*IN*/ ULONG Increment, PKSPIN_LOCK Lock); NTOSAPI LONGLONG DDKFASTAPI ExInterlockedCompareExchange64( /*IN OUT*/ PLONGLONG Destination, /*IN*/ PLONGLONG Exchange, /*IN*/ PLONGLONG Comparand, /*IN*/ PKSPIN_LOCK Lock); NTOSAPI PSINGLE_LIST_ENTRY DDKFASTAPI ExInterlockedFlushSList( /*IN*/ PSLIST_HEADER ListHead); NTOSAPI PLIST_ENTRY DDKAPI ExInterlockedInsertHeadList( /*IN*/ PLIST_ENTRY ListHead, /*IN*/ PLIST_ENTRY ListEntry, /*IN*/ PKSPIN_LOCK Lock); NTOSAPI PLIST_ENTRY DDKFASTAPI ExfInterlockedInsertHeadList( /*IN*/ PLIST_ENTRY ListHead, /*IN*/ PLIST_ENTRY ListEntry, /*IN*/ PKSPIN_LOCK Lock); NTOSAPI PLIST_ENTRY DDKAPI ExInterlockedInsertTailList( /*IN*/ PLIST_ENTRY ListHead, /*IN*/ PLIST_ENTRY ListEntry, /*IN*/ PKSPIN_LOCK Lock); NTOSAPI PLIST_ENTRY DDKFASTAPI ExfInterlockedInsertTailList( /*IN*/ PLIST_ENTRY ListHead, /*IN*/ PLIST_ENTRY ListEntry, /*IN*/ PKSPIN_LOCK Lock); NTOSAPI PSINGLE_LIST_ENTRY DDKAPI ExInterlockedPopEntryList( /*IN*/ PSINGLE_LIST_ENTRY ListHead, /*IN*/ PKSPIN_LOCK Lock); NTOSAPI PSINGLE_LIST_ENTRY DDKFASTAPI ExfInterlockedPopEntryList( /*IN*/ PSINGLE_LIST_ENTRY ListHead, /*IN*/ PKSPIN_LOCK Lock); NTOSAPI PSINGLE_LIST_ENTRY DDKAPI ExInterlockedPushEntryList( /*IN*/ PSINGLE_LIST_ENTRY ListHead, /*IN*/ PSINGLE_LIST_ENTRY ListEntry, /*IN*/ PKSPIN_LOCK Lock); NTOSAPI PSINGLE_LIST_ENTRY DDKFASTAPI ExfInterlockedPushEntryList( /*IN*/ PSINGLE_LIST_ENTRY ListHead, /*IN*/ PSINGLE_LIST_ENTRY ListEntry, /*IN*/ PKSPIN_LOCK Lock); NTOSAPI PLIST_ENTRY DDKAPI ExInterlockedRemoveHeadList( /*IN*/ PLIST_ENTRY ListHead, /*IN*/ PKSPIN_LOCK Lock); NTOSAPI PLIST_ENTRY DDKFASTAPI ExfInterlockedRemoveHeadList( /*IN*/ PLIST_ENTRY ListHead, /*IN*/ PKSPIN_LOCK Lock); NTOSAPI BOOLEAN DDKAPI ExIsProcessorFeaturePresent( /*IN*/ ULONG ProcessorFeature); NTOSAPI BOOLEAN DDKAPI ExIsResourceAcquiredExclusiveLite( /*IN*/ PERESOURCE Resource); NTOSAPI USHORT DDKAPI ExIsResourceAcquiredLite( /*IN*/ PERESOURCE Resource); NTOSAPI USHORT DDKAPI ExIsResourceAcquiredSharedLite( /*IN*/ PERESOURCE Resource); NTOSAPI VOID DDKAPI ExLocalTimeToSystemTime( /*IN*/ PLARGE_INTEGER LocalTime, /*OUT*/ PLARGE_INTEGER SystemTime); NTOSAPI VOID DDKAPI ExNotifyCallback( /*IN*/ PCALLBACK_OBJECT CallbackObject, /*IN*/ PVOID Argument1, /*IN*/ PVOID Argument2); NTOSAPI VOID DDKAPI ExRaiseAccessViolation( VOID); NTOSAPI VOID DDKAPI ExRaiseDatatypeMisalignment( VOID); NTOSAPI VOID DDKAPI ExRaiseStatus( /*IN*/ NTSTATUS Status); NTOSAPI PVOID DDKAPI ExRegisterCallback( /*IN*/ PCALLBACK_OBJECT CallbackObject, /*IN*/ PCALLBACK_FUNCTION CallbackFunction, /*IN*/ PVOID CallbackContext); NTOSAPI VOID DDKAPI ExReinitializeResourceLite( /*IN*/ PERESOURCE Resource); NTOSAPI VOID DDKFASTAPI ExReleaseFastMutex( /*IN*/ PFAST_MUTEX FastMutex); NTOSAPI VOID DDKFASTAPI ExReleaseFastMutexUnsafe( /*IN*/ PFAST_MUTEX FastMutex); NTOSAPI VOID DDKAPI ExReleaseResourceForThreadLite( /*IN*/ PERESOURCE Resource, /*IN*/ ERESOURCE_THREAD ResourceThreadId); NTOSAPI VOID DDKFASTAPI ExReleaseResourceLite( /*IN*/ PERESOURCE Resource); NTOSAPI VOID DDKAPI ExSetResourceOwnerPointer( /*IN*/ PERESOURCE Resource, /*IN*/ PVOID OwnerPointer); NTOSAPI ULONG DDKAPI ExSetTimerResolution( /*IN*/ ULONG DesiredTime, /*IN*/ BOOLEAN SetResolution); NTOSAPI VOID DDKAPI ExSystemTimeToLocalTime( /*IN*/ PLARGE_INTEGER SystemTime, /*OUT*/ PLARGE_INTEGER LocalTime); NTOSAPI BOOLEAN DDKFASTAPI ExTryToAcquireFastMutex( /*IN*/ PFAST_MUTEX FastMutex); NTOSAPI BOOLEAN DDKAPI ExTryToAcquireResourceExclusiveLite( /*IN*/ PERESOURCE Resource); NTOSAPI VOID DDKAPI ExUnregisterCallback( /*IN*/ PVOID CbRegistration); NTOSAPI NTSTATUS DDKAPI ExUuidCreate( /*OUT*/ UUID *Uuid); NTOSAPI BOOLEAN DDKAPI ExVerifySuite( /*IN*/ SUITE_TYPE SuiteType); #ifdef DBG #define PAGED_CODE() { \ if (KeGetCurrentIrql() > APC_LEVEL) { \ KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \ ASSERT(FALSE); \ } \ } #else #define PAGED_CODE() #endif NTOSAPI VOID DDKAPI ProbeForRead( /*IN*/ CONST VOID *Address, /*IN*/ ULONG Length, /*IN*/ ULONG Alignment); NTOSAPI VOID DDKAPI ProbeForWrite( /*IN*/ CONST VOID *Address, /*IN*/ ULONG Length, /*IN*/ ULONG Alignment); /** Configuration manager routines **/ NTOSAPI NTSTATUS DDKAPI CmRegisterCallback( /*IN*/ PEX_CALLBACK_FUNCTION Function, /*IN*/ PVOID Context, /*IN OUT*/ PLARGE_INTEGER Cookie); NTOSAPI NTSTATUS DDKAPI CmUnRegisterCallback( /*IN*/ LARGE_INTEGER Cookie); /** Filesystem runtime library routines **/ NTOSAPI BOOLEAN DDKAPI FsRtlIsTotalDeviceFailure( /*IN*/ NTSTATUS Status); /** Hardware abstraction layer routines **/ NTOSAPI VOID DDKFASTAPI HalExamineMBR( /*IN*/ PDEVICE_OBJECT DeviceObject, /*IN*/ ULONG SectorSize, /*IN*/ ULONG MBRTypeIdentifier, /*OUT*/ PVOID Buffer); NTOSAPI VOID DDKAPI READ_PORT_BUFFER_UCHAR( /*IN*/ PUCHAR Port, /*IN*/ PUCHAR Buffer, /*IN*/ ULONG Count); NTOSAPI VOID DDKAPI READ_PORT_BUFFER_ULONG( /*IN*/ PULONG Port, /*IN*/ PULONG Buffer, /*IN*/ ULONG Count); NTOSAPI VOID DDKAPI READ_PORT_BUFFER_USHORT( /*IN*/ PUSHORT Port, /*IN*/ PUSHORT Buffer, /*IN*/ ULONG Count); NTOSAPI UCHAR DDKAPI READ_PORT_UCHAR( /*IN*/ PUCHAR Port); NTOSAPI ULONG DDKAPI READ_PORT_ULONG( /*IN*/ PULONG Port); NTOSAPI USHORT DDKAPI READ_PORT_USHORT( /*IN*/ PUSHORT Port); NTOSAPI VOID DDKAPI READ_REGISTER_BUFFER_UCHAR( /*IN*/ PUCHAR Register, /*IN*/ PUCHAR Buffer, /*IN*/ ULONG Count); NTOSAPI VOID DDKAPI READ_REGISTER_BUFFER_ULONG( /*IN*/ PULONG Register, /*IN*/ PULONG Buffer, /*IN*/ ULONG Count); NTOSAPI VOID DDKAPI READ_REGISTER_BUFFER_USHORT( /*IN*/ PUSHORT Register, /*IN*/ PUSHORT Buffer, /*IN*/ ULONG Count); NTOSAPI UCHAR DDKAPI READ_REGISTER_UCHAR( /*IN*/ PUCHAR Register); NTOSAPI ULONG DDKAPI READ_REGISTER_ULONG( /*IN*/ PULONG Register); NTOSAPI USHORT DDKAPI READ_REGISTER_USHORT( /*IN*/ PUSHORT Register); NTOSAPI VOID DDKAPI WRITE_PORT_BUFFER_UCHAR( /*IN*/ PUCHAR Port, /*IN*/ PUCHAR Buffer, /*IN*/ ULONG Count); NTOSAPI VOID DDKAPI WRITE_PORT_BUFFER_ULONG( /*IN*/ PULONG Port, /*IN*/ PULONG Buffer, /*IN*/ ULONG Count); NTOSAPI VOID DDKAPI WRITE_PORT_BUFFER_USHORT( /*IN*/ PUSHORT Port, /*IN*/ PUSHORT Buffer, /*IN*/ ULONG Count); NTOSAPI VOID DDKAPI WRITE_PORT_UCHAR( /*IN*/ PUCHAR Port, /*IN*/ UCHAR Value); NTOSAPI VOID DDKAPI WRITE_PORT_ULONG( /*IN*/ PULONG Port, /*IN*/ ULONG Value); NTOSAPI VOID DDKAPI WRITE_PORT_USHORT( /*IN*/ PUSHORT Port, /*IN*/ USHORT Value); NTOSAPI VOID DDKAPI WRITE_REGISTER_BUFFER_UCHAR( /*IN*/ PUCHAR Register, /*IN*/ PUCHAR Buffer, /*IN*/ ULONG Count); NTOSAPI VOID DDKAPI WRITE_REGISTER_BUFFER_ULONG( /*IN*/ PULONG Register, /*IN*/ PULONG Buffer, /*IN*/ ULONG Count); NTOSAPI VOID DDKAPI WRITE_REGISTER_BUFFER_USHORT( /*IN*/ PUSHORT Register, /*IN*/ PUSHORT Buffer, /*IN*/ ULONG Count); NTOSAPI VOID DDKAPI WRITE_REGISTER_UCHAR( /*IN*/ PUCHAR Register, /*IN*/ UCHAR Value); NTOSAPI VOID DDKAPI WRITE_REGISTER_ULONG( /*IN*/ PULONG Register, /*IN*/ ULONG Value); NTOSAPI VOID DDKAPI WRITE_REGISTER_USHORT( /*IN*/ PUSHORT Register, /*IN*/ USHORT Value); /** I/O manager routines **/ NTOSAPI VOID DDKAPI IoAcquireCancelSpinLock( /*OUT*/ PKIRQL Irql); NTOSAPI NTSTATUS DDKAPI IoAcquireRemoveLockEx( /*IN*/ PIO_REMOVE_LOCK RemoveLock, /*IN*/ PVOID Tag /*OPTIONAL*/, /*IN*/ PCSTR File, /*IN*/ ULONG Line, /*IN*/ ULONG RemlockSize); /* * NTSTATUS * IoAcquireRemoveLock( * IN PIO_REMOVE_LOCK RemoveLock, * IN PVOID Tag OPTIONAL) */ #define IoAcquireRemoveLock(_RemoveLock, \ _Tag) \ IoAcquireRemoveLockEx(_RemoveLock, _Tag, __FILE__, __LINE__, sizeof(IO_REMOVE_LOCK)) /* * VOID * IoAdjustPagingPathCount( * IN PLONG Count, * IN BOOLEAN Increment) */ #define IoAdjustPagingPathCount(_Count, \ _Increment) \ { \ if (_Increment) \ { \ InterlockedIncrement(_Count); \ } \ else \ { \ InterlockedDecrement(_Count); \ } \ } NTOSAPI VOID DDKAPI IoAllocateController( /*IN*/ PCONTROLLER_OBJECT ControllerObject, /*IN*/ PDEVICE_OBJECT DeviceObject, /*IN*/ PDRIVER_CONTROL ExecutionRoutine, /*IN*/ PVOID Context); NTOSAPI NTSTATUS DDKAPI IoAllocateDriverObjectExtension( /*IN*/ PDRIVER_OBJECT DriverObject, /*IN*/ PVOID ClientIdentificationAddress, /*IN*/ ULONG DriverObjectExtensionSize, /*OUT*/ PVOID *DriverObjectExtension); typedef struct _IO_ERROR_LOG_PACKET { UCHAR MajorFunctionCode; UCHAR RetryCount; USHORT DumpDataSize; USHORT NumberOfStrings; USHORT StringOffset; USHORT EventCategory; NTSTATUS ErrorCode; ULONG UniqueErrorValue; NTSTATUS FinalStatus; ULONG SequenceNumber; ULONG IoControlCode; LARGE_INTEGER DeviceOffset; ULONG DumpData[1]; } IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET; NTOSAPI PVOID DDKAPI IoAllocateErrorLogEntry( /*IN*/ PVOID IoObject, /*IN*/ UCHAR EntrySize); NTOSAPI PIRP DDKAPI IoAllocateIrp( /*IN*/ CCHAR StackSize, /*IN*/ BOOLEAN ChargeQuota); NTOSAPI PMDL DDKAPI IoAllocateMdl( /*IN*/ PVOID VirtualAddress, /*IN*/ ULONG Length, /*IN*/ BOOLEAN SecondaryBuffer, /*IN*/ BOOLEAN ChargeQuota, /*IN OUT*/ PIRP Irp /*OPTIONAL*/); NTOSAPI PIO_WORKITEM DDKAPI IoAllocateWorkItem( /*IN*/ PDEVICE_OBJECT DeviceObject); /* * VOID IoAssignArcName( * IN PUNICODE_STRING ArcName, * IN PUNICODE_STRING DeviceName); */ #define IoAssignArcName(_ArcName, _DeviceName) ( \ IoCreateSymbolicLink((_ArcName), (_DeviceName))) NTOSAPI NTSTATUS DDKAPI IoAttachDevice( /*IN*/ PDEVICE_OBJECT SourceDevice, /*IN*/ PUNICODE_STRING TargetDevice, /*OUT*/ PDEVICE_OBJECT *AttachedDevice); NTOSAPI PDEVICE_OBJECT DDKAPI IoAttachDeviceToDeviceStack( /*IN*/ PDEVICE_OBJECT SourceDevice, /*IN*/ PDEVICE_OBJECT TargetDevice); NTOSAPI PIRP DDKAPI IoBuildAsynchronousFsdRequest( /*IN*/ ULONG MajorFunction, /*IN*/ PDEVICE_OBJECT DeviceObject, /*IN OUT*/ PVOID Buffer /*OPTIONAL*/, /*IN*/ ULONG Length /*OPTIONAL*/, /*IN*/ PLARGE_INTEGER StartingOffset /*OPTIONAL*/, /*IN*/ PIO_STATUS_BLOCK IoStatusBlock /*OPTIONAL*/); NTOSAPI PIRP DDKAPI IoBuildDeviceIoControlRequest( /*IN*/ ULONG IoControlCode, /*IN*/ PDEVICE_OBJECT DeviceObject, /*IN*/ PVOID InputBuffer /*OPTIONAL*/, /*IN*/ ULONG InputBufferLength, /*OUT*/ PVOID OutputBuffer /*OPTIONAL*/, /*IN*/ ULONG OutputBufferLength, /*IN*/ BOOLEAN InternalDeviceIoControl, /*IN*/ PKEVENT Event, /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock); NTOSAPI VOID DDKAPI IoBuildPartialMdl( /*IN*/ PMDL SourceMdl, /*IN OUT*/ PMDL TargetMdl, /*IN*/ PVOID VirtualAddress, /*IN*/ ULONG Length); NTOSAPI PIRP DDKAPI IoBuildSynchronousFsdRequest( /*IN*/ ULONG MajorFunction, /*IN*/ PDEVICE_OBJECT DeviceObject, /*IN OUT*/ PVOID Buffer /*OPTIONAL*/, /*IN*/ ULONG Length /*OPTIONAL*/, /*IN*/ PLARGE_INTEGER StartingOffset /*OPTIONAL*/, /*IN*/ PKEVENT Event, /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock); NTOSAPI NTSTATUS DDKFASTAPI IofCallDriver( /*IN*/ PDEVICE_OBJECT DeviceObject, /*IN OUT*/ PIRP Irp); /* * NTSTATUS * IoCallDriver( * IN PDEVICE_OBJECT DeviceObject, * IN OUT PIRP Irp) */ #define IoCallDriver IofCallDriver NTOSAPI VOID DDKAPI IoCancelFileOpen( /*IN*/ PDEVICE_OBJECT DeviceObject, /*IN*/ PFILE_OBJECT FileObject); NTOSAPI BOOLEAN DDKAPI IoCancelIrp( /*IN*/ PIRP Irp); NTOSAPI NTSTATUS DDKAPI IoCheckShareAccess( /*IN*/ ACCESS_MASK DesiredAccess, /*IN*/ ULONG DesiredShareAccess, /*IN OUT*/ PFILE_OBJECT FileObject, /*IN OUT*/ PSHARE_ACCESS ShareAccess, /*IN*/ BOOLEAN Update); NTOSAPI VOID DDKFASTAPI IofCompleteRequest( /*IN*/ PIRP Irp, /*IN*/ CCHAR PriorityBoost); /* * VOID * IoCompleteRequest( * IN PIRP Irp, * IN CCHAR PriorityBoost) */ #define IoCompleteRequest IofCompleteRequest NTOSAPI NTSTATUS DDKAPI IoConnectInterrupt( /*OUT*/ PKINTERRUPT *InterruptObject, /*IN*/ PKSERVICE_ROUTINE ServiceRoutine, /*IN*/ PVOID ServiceContext, /*IN*/ PKSPIN_LOCK SpinLock /*OPTIONAL*/, /*IN*/ ULONG Vector, /*IN*/ KIRQL Irql, /*IN*/ KIRQL SynchronizeIrql, /*IN*/ KINTERRUPT_MODE InterruptMode, /*IN*/ BOOLEAN ShareVector, /*IN*/ KAFFINITY ProcessorEnableMask, /*IN*/ BOOLEAN FloatingSave); /* * PIO_STACK_LOCATION * IoGetCurrentIrpStackLocation( * IN PIRP Irp) */ #define IoGetCurrentIrpStackLocation(_Irp) \ ((_Irp)->Tail.Overlay.CurrentStackLocation) /* * PIO_STACK_LOCATION * IoGetNextIrpStackLocation( * IN PIRP Irp) */ #define IoGetNextIrpStackLocation(_Irp) \ ((_Irp)->Tail.Overlay.CurrentStackLocation - 1) /* * VOID * IoCopyCurrentIrpStackLocationToNext( * IN PIRP Irp) */ #define IoCopyCurrentIrpStackLocationToNext(_Irp) \ { \ PIO_STACK_LOCATION _IrpSp; \ PIO_STACK_LOCATION _NextIrpSp; \ _IrpSp = IoGetCurrentIrpStackLocation(_Irp); \ _NextIrpSp = IoGetNextIrpStackLocation(_Irp); \ RtlCopyMemory(_NextIrpSp, _IrpSp, \ FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine)); \ _NextIrpSp->Control = 0; \ } NTOSAPI PCONTROLLER_OBJECT DDKAPI IoCreateController( /*IN*/ ULONG Size); NTOSAPI NTSTATUS DDKAPI IoCreateDevice( /*IN*/ PDRIVER_OBJECT DriverObject, /*IN*/ ULONG DeviceExtensionSize, /*IN*/ PUNICODE_STRING DeviceName /*OPTIONAL*/, /*IN*/ DEVICE_TYPE DeviceType, /*IN*/ ULONG DeviceCharacteristics, /*IN*/ BOOLEAN Exclusive, /*OUT*/ PDEVICE_OBJECT *DeviceObject); NTOSAPI NTSTATUS DDKAPI IoCreateDisk( /*IN*/ PDEVICE_OBJECT DeviceObject, /*IN*/ PCREATE_DISK Disk); NTOSAPI NTSTATUS DDKAPI IoCreateFile( /*OUT*/ PHANDLE FileHandle, /*IN*/ ACCESS_MASK DesiredAccess, /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes, /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock, /*IN*/ PLARGE_INTEGER AllocationSize /*OPTIONAL*/, /*IN*/ ULONG FileAttributes, /*IN*/ ULONG ShareAccess, /*IN*/ ULONG Disposition, /*IN*/ ULONG CreateOptions, /*IN*/ PVOID EaBuffer /*OPTIONAL*/, /*IN*/ ULONG EaLength, /*IN*/ CREATE_FILE_TYPE CreateFileType, /*IN*/ PVOID ExtraCreateParameters /*OPTIONAL*/, /*IN*/ ULONG Options); NTOSAPI PKEVENT DDKAPI IoCreateNotificationEvent( /*IN*/ PUNICODE_STRING EventName, /*OUT*/ PHANDLE EventHandle); NTOSAPI NTSTATUS DDKAPI IoCreateSymbolicLink( /*IN*/ PUNICODE_STRING SymbolicLinkName, /*IN*/ PUNICODE_STRING DeviceName); NTOSAPI PKEVENT DDKAPI IoCreateSynchronizationEvent( /*IN*/ PUNICODE_STRING EventName, /*OUT*/ PHANDLE EventHandle); NTOSAPI NTSTATUS DDKAPI IoCreateUnprotectedSymbolicLink( /*IN*/ PUNICODE_STRING SymbolicLinkName, /*IN*/ PUNICODE_STRING DeviceName); NTOSAPI VOID DDKAPI IoCsqInitialize( PIO_CSQ Csq, /*IN*/ PIO_CSQ_INSERT_IRP CsqInsertIrp, /*IN*/ PIO_CSQ_REMOVE_IRP CsqRemoveIrp, /*IN*/ PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp, /*IN*/ PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock, /*IN*/ PIO_CSQ_RELEASE_LOCK CsqReleaseLock, /*IN*/ PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp); NTOSAPI VOID DDKAPI IoCsqInsertIrp( /*IN*/ PIO_CSQ Csq, /*IN*/ PIRP Irp, /*IN*/ PIO_CSQ_IRP_CONTEXT Context); NTOSAPI PIRP DDKAPI IoCsqRemoveIrp( /*IN*/ PIO_CSQ Csq, /*IN*/ PIO_CSQ_IRP_CONTEXT Context); NTOSAPI PIRP DDKAPI IoCsqRemoveNextIrp( /*IN*/ PIO_CSQ Csq, /*IN*/ PVOID PeekContext); NTOSAPI VOID DDKAPI IoDeleteController( /*IN*/ PCONTROLLER_OBJECT ControllerObject); NTOSAPI VOID DDKAPI IoDeleteDevice( /*IN*/ PDEVICE_OBJECT DeviceObject); NTOSAPI NTSTATUS DDKAPI IoDeleteSymbolicLink( /*IN*/ PUNICODE_STRING SymbolicLinkName); /* * VOID * IoDeassignArcName( * IN PUNICODE_STRING ArcName) */ #define IoDeassignArcName IoDeleteSymbolicLink NTOSAPI VOID DDKAPI IoDetachDevice( /*IN OUT*/ PDEVICE_OBJECT TargetDevice); NTOSAPI VOID DDKAPI IoDisconnectInterrupt( /*IN*/ PKINTERRUPT InterruptObject); NTOSAPI BOOLEAN DDKAPI IoForwardIrpSynchronously( /*IN*/ PDEVICE_OBJECT DeviceObject, /*IN*/ PIRP Irp); #define IoForwardAndCatchIrp IoForwardIrpSynchronously NTOSAPI VOID DDKAPI IoFreeController( /*IN*/ PCONTROLLER_OBJECT ControllerObject); NTOSAPI VOID DDKAPI IoFreeErrorLogEntry( PVOID ElEntry); NTOSAPI VOID DDKAPI IoFreeIrp( /*IN*/ PIRP Irp); NTOSAPI VOID DDKAPI IoFreeMdl( /*IN*/ PMDL Mdl); NTOSAPI VOID DDKAPI IoFreeWorkItem( /*IN*/ PIO_WORKITEM pIOWorkItem); NTOSAPI PDEVICE_OBJECT DDKAPI IoGetAttachedDevice( /*IN*/ PDEVICE_OBJECT DeviceObject); NTOSAPI PDEVICE_OBJECT DDKAPI IoGetAttachedDeviceReference( /*IN*/ PDEVICE_OBJECT DeviceObject); NTOSAPI NTSTATUS DDKAPI IoGetBootDiskInformation( /*IN OUT*/ PBOOTDISK_INFORMATION BootDiskInformation, /*IN*/ ULONG Size); NTOSAPI PCONFIGURATION_INFORMATION DDKAPI IoGetConfigurationInformation( VOID); NTOSAPI PEPROCESS DDKAPI IoGetCurrentProcess( VOID); NTOSAPI NTSTATUS DDKAPI IoGetDeviceInterfaceAlias( /*IN*/ PUNICODE_STRING SymbolicLinkName, /*IN*/ CONST GUID *AliasInterfaceClassGuid, /*OUT*/ PUNICODE_STRING AliasSymbolicLinkName); NTOSAPI NTSTATUS DDKAPI IoGetDeviceInterfaces( /*IN*/ CONST GUID *InterfaceClassGuid, /*IN*/ PDEVICE_OBJECT PhysicalDeviceObject /*OPTIONAL*/, /*IN*/ ULONG Flags, /*OUT*/ PWSTR *SymbolicLinkList); NTOSAPI NTSTATUS DDKAPI IoGetDeviceObjectPointer( /*IN*/ PUNICODE_STRING ObjectName, /*IN*/ ACCESS_MASK DesiredAccess, /*OUT*/ PFILE_OBJECT *FileObject, /*OUT*/ PDEVICE_OBJECT *DeviceObject); NTOSAPI NTSTATUS DDKAPI IoGetDeviceProperty( /*IN*/ PDEVICE_OBJECT DeviceObject, /*IN*/ DEVICE_REGISTRY_PROPERTY DeviceProperty, /*IN*/ ULONG BufferLength, /*OUT*/ PVOID PropertyBuffer, /*OUT*/ PULONG ResultLength); NTOSAPI PDEVICE_OBJECT DDKAPI IoGetDeviceToVerify( /*IN*/ PETHREAD Thread); NTOSAPI PDMA_ADAPTER DDKAPI IoGetDmaAdapter( /*IN*/ PDEVICE_OBJECT PhysicalDeviceObject, /*IN*/ PDEVICE_DESCRIPTION DeviceDescription, /*IN OUT*/ PULONG NumberOfMapRegisters); NTOSAPI PVOID DDKAPI IoGetDriverObjectExtension( /*IN*/ PDRIVER_OBJECT DriverObject, /*IN*/ PVOID ClientIdentificationAddress); NTOSAPI PGENERIC_MAPPING DDKAPI IoGetFileObjectGenericMapping( VOID); /* * ULONG * IoGetFunctionCodeFromCtlCode( * IN ULONG ControlCode) */ #define IoGetFunctionCodeFromCtlCode(_ControlCode) \ (((_ControlCode) >> 2) & 0x00000FFF) NTOSAPI PVOID DDKAPI IoGetInitialStack( VOID); NTOSAPI PDEVICE_OBJECT DDKAPI IoGetRelatedDeviceObject( /*IN*/ PFILE_OBJECT FileObject); NTOSAPI ULONG DDKAPI IoGetRemainingStackSize( VOID); NTOSAPI VOID DDKAPI IoGetStackLimits( /*OUT*/ PULONG_PTR LowLimit, /*OUT*/ PULONG_PTR HighLimit); NTOSAPI VOID DDKAPI KeInitializeDpc( /*IN*/ PRKDPC Dpc, /*IN*/ PKDEFERRED_ROUTINE DeferredRoutine, /*IN*/ PVOID DeferredContext); /* * VOID * IoInitializeDpcRequest( * IN PDEVICE_OBJECT DeviceObject, * IN PIO_DPC_ROUTINE DpcRoutine) */ #define IoInitializeDpcRequest(_DeviceObject, \ _DpcRoutine) \ KeInitializeDpc(&(_DeviceObject)->Dpc, \ (PKDEFERRED_ROUTINE) (_DpcRoutine), \ _DeviceObject) NTOSAPI VOID DDKAPI IoInitializeIrp( /*IN OUT*/ PIRP Irp, /*IN*/ USHORT PacketSize, /*IN*/ CCHAR StackSize); NTOSAPI VOID DDKAPI IoInitializeRemoveLockEx( /*IN*/ PIO_REMOVE_LOCK Lock, /*IN*/ ULONG AllocateTag, /*IN*/ ULONG MaxLockedMinutes, /*IN*/ ULONG HighWatermark, /*IN*/ ULONG RemlockSize); /* VOID * IoInitializeRemoveLock( * IN PIO_REMOVE_LOCK Lock, * IN ULONG AllocateTag, * IN ULONG MaxLockedMinutes, * IN ULONG HighWatermark) */ #define IoInitializeRemoveLock( \ Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \ IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \ HighWatermark, sizeof(IO_REMOVE_LOCK)) NTOSAPI NTSTATUS DDKAPI IoInitializeTimer( /*IN*/ PDEVICE_OBJECT DeviceObject, /*IN*/ PIO_TIMER_ROUTINE TimerRoutine, /*IN*/ PVOID Context); NTOSAPI VOID DDKAPI IoInvalidateDeviceRelations( /*IN*/ PDEVICE_OBJECT DeviceObject, /*IN*/ DEVICE_RELATION_TYPE Type); NTOSAPI VOID DDKAPI IoInvalidateDeviceState( /*IN*/ PDEVICE_OBJECT PhysicalDeviceObject); NTOSAPI BOOLEAN DDKAPI IoIs32bitProcess( /*IN*/ PIRP Irp /*OPTIONAL*/); /* * BOOLEAN * IoIsErrorUserInduced( * IN NTSTATUS Status); */ #define IoIsErrorUserInduced(Status) \ ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \ ((Status) == STATUS_IO_TIMEOUT) || \ ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \ ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \ ((Status) == STATUS_VERIFY_REQUIRED) || \ ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \ ((Status) == STATUS_WRONG_VOLUME))) NTOSAPI BOOLEAN DDKAPI IoIsWdmVersionAvailable( /*IN*/ UCHAR MajorVersion, /*IN*/ UCHAR MinorVersion); NTOSAPI PIRP DDKAPI IoMakeAssociatedIrp( /*IN*/ PIRP Irp, /*IN*/ CCHAR StackSize); /* * VOID * IoMarkIrpPending( * IN OUT PIRP Irp) */ #define IoMarkIrpPending(_Irp) \ (IoGetCurrentIrpStackLocation(_Irp)->Control |= SL_PENDING_RETURNED) NTOSAPI NTSTATUS DDKAPI IoOpenDeviceInterfaceRegistryKey( /*IN*/ PUNICODE_STRING SymbolicLinkName, /*IN*/ ACCESS_MASK DesiredAccess, /*OUT*/ PHANDLE DeviceInterfaceKey); NTOSAPI NTSTATUS DDKAPI IoOpenDeviceRegistryKey( /*IN*/ PDEVICE_OBJECT DeviceObject, /*IN*/ ULONG DevInstKeyType, /*IN*/ ACCESS_MASK DesiredAccess, /*OUT*/ PHANDLE DevInstRegKey); NTOSAPI NTSTATUS DDKAPI IoQueryDeviceDescription( /*IN*/ PINTERFACE_TYPE BusType /*OPTIONAL*/, /*IN*/ PULONG BusNumber /*OPTIONAL*/, /*IN*/ PCONFIGURATION_TYPE ControllerType /*OPTIONAL*/, /*IN*/ PULONG ControllerNumber /*OPTIONAL*/, /*IN*/ PCONFIGURATION_TYPE PeripheralType /*OPTIONAL*/, /*IN*/ PULONG PeripheralNumber /*OPTIONAL*/, /*IN*/ PIO_QUERY_DEVICE_ROUTINE CalloutRoutine, /*IN*/ PVOID Context); NTOSAPI VOID DDKAPI IoQueueWorkItem( /*IN*/ PIO_WORKITEM pIOWorkItem, /*IN*/ PIO_WORKITEM_ROUTINE Routine, /*IN*/ WORK_QUEUE_TYPE QueueType, /*IN*/ PVOID Context); NTOSAPI VOID DDKAPI IoRaiseHardError( /*IN*/ PIRP Irp, /*IN*/ PVPB Vpb /*OPTIONAL*/, /*IN*/ PDEVICE_OBJECT RealDeviceObject); NTOSAPI BOOLEAN DDKAPI IoRaiseInformationalHardError( /*IN*/ NTSTATUS ErrorStatus, /*IN*/ PUNICODE_STRING String /*OPTIONAL*/, /*IN*/ PKTHREAD Thread /*OPTIONAL*/); NTOSAPI NTSTATUS DDKAPI IoReadDiskSignature( /*IN*/ PDEVICE_OBJECT DeviceObject, /*IN*/ ULONG BytesPerSector, /*OUT*/ PDISK_SIGNATURE Signature); NTOSAPI NTSTATUS DDKAPI IoReadPartitionTableEx( /*IN*/ PDEVICE_OBJECT DeviceObject, /*IN*/ struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer); NTOSAPI VOID DDKAPI IoRegisterBootDriverReinitialization( /*IN*/ PDRIVER_OBJECT DriverObject, /*IN*/ PDRIVER_REINITIALIZE DriverReinitializationRoutine, /*IN*/ PVOID Context); NTOSAPI VOID DDKAPI IoRegisterBootDriverReinitialization( /*IN*/ PDRIVER_OBJECT DriverObject, /*IN*/ PDRIVER_REINITIALIZE DriverReinitializationRoutine, /*IN*/ PVOID Context); NTOSAPI NTSTATUS DDKAPI IoRegisterDeviceInterface( /*IN*/ PDEVICE_OBJECT PhysicalDeviceObject, /*IN*/ CONST GUID *InterfaceClassGuid, /*IN*/ PUNICODE_STRING ReferenceString /*OPTIONAL*/, /*OUT*/ PUNICODE_STRING SymbolicLinkName); NTOSAPI VOID DDKAPI IoRegisterDriverReinitialization( /*IN*/ PDRIVER_OBJECT DriverObject, /*IN*/ PDRIVER_REINITIALIZE DriverReinitializationRoutine, /*IN*/ PVOID Context); NTOSAPI NTSTATUS DDKAPI IoRegisterPlugPlayNotification( /*IN*/ IO_NOTIFICATION_EVENT_CATEGORY EventCategory, /*IN*/ ULONG EventCategoryFlags, /*IN*/ PVOID EventCategoryData /*OPTIONAL*/, /*IN*/ PDRIVER_OBJECT DriverObject, /*IN*/ PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine, /*IN*/ PVOID Context, /*OUT*/ PVOID *NotificationEntry); NTOSAPI NTSTATUS DDKAPI IoRegisterShutdownNotification( /*IN*/ PDEVICE_OBJECT DeviceObject); NTOSAPI VOID DDKAPI IoReleaseCancelSpinLock( /*IN*/ KIRQL Irql); NTOSAPI VOID DDKAPI IoReleaseRemoveLockAndWaitEx( /*IN*/ PIO_REMOVE_LOCK RemoveLock, /*IN*/ PVOID Tag, /*IN*/ ULONG RemlockSize); /* * VOID * IoReleaseRemoveLockAndWait( * IN PIO_REMOVE_LOCK RemoveLock, * IN PVOID Tag) */ #define IoReleaseRemoveLockAndWait(_RemoveLock, \ _Tag) \ IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK)) NTOSAPI VOID DDKAPI IoReleaseRemoveLockEx( /*IN*/ PIO_REMOVE_LOCK RemoveLock, /*IN*/ PVOID Tag, /*IN*/ ULONG RemlockSize); /* * VOID * IoReleaseRemoveLock( * IN PIO_REMOVE_LOCK RemoveLock, * IN PVOID Tag) */ #define IoReleaseRemoveLock(_RemoveLock, \ _Tag) \ IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK)) NTOSAPI VOID DDKAPI IoRemoveShareAccess( /*IN*/ PFILE_OBJECT FileObject, /*IN OUT*/ PSHARE_ACCESS ShareAccess); NTOSAPI NTSTATUS DDKAPI IoReportDetectedDevice( /*IN*/ PDRIVER_OBJECT DriverObject, /*IN*/ INTERFACE_TYPE LegacyBusType, /*IN*/ ULONG BusNumber, /*IN*/ ULONG SlotNumber, /*IN*/ PCM_RESOURCE_LIST ResourceList, /*IN*/ PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements /*OPTIONAL*/, /*IN*/ BOOLEAN ResourceAssigned, /*IN OUT*/ PDEVICE_OBJECT *DeviceObject); NTOSAPI NTSTATUS DDKAPI IoReportResourceForDetection( /*IN*/ PDRIVER_OBJECT DriverObject, /*IN*/ PCM_RESOURCE_LIST DriverList /*OPTIONAL*/, /*IN*/ ULONG DriverListSize /*OPTIONAL*/, /*IN*/ PDEVICE_OBJECT DeviceObject /*OPTIONAL*/, /*IN*/ PCM_RESOURCE_LIST DeviceList /*OPTIONAL*/, /*IN*/ ULONG DeviceListSize /*OPTIONAL*/, /*OUT*/ PBOOLEAN ConflictDetected); NTOSAPI NTSTATUS DDKAPI IoReportResourceUsage( /*IN*/ PUNICODE_STRING DriverClassName /*OPTIONAL*/, /*IN*/ PDRIVER_OBJECT DriverObject, /*IN*/ PCM_RESOURCE_LIST DriverList /*OPTIONAL*/, /*IN*/ ULONG DriverListSize /*OPTIONAL*/, /*IN*/ PDEVICE_OBJECT DeviceObject, /*IN*/ PCM_RESOURCE_LIST DeviceList /*OPTIONAL*/, /*IN*/ ULONG DeviceListSize /*OPTIONAL*/, /*IN*/ BOOLEAN OverrideConflict, /*OUT*/ PBOOLEAN ConflictDetected); NTOSAPI NTSTATUS DDKAPI IoReportTargetDeviceChange( /*IN*/ PDEVICE_OBJECT PhysicalDeviceObject, /*IN*/ PVOID NotificationStructure); NTOSAPI NTSTATUS DDKAPI IoReportTargetDeviceChangeAsynchronous( /*IN*/ PDEVICE_OBJECT PhysicalDeviceObject, /*IN*/ PVOID NotificationStructure, /*IN*/ PDEVICE_CHANGE_COMPLETE_CALLBACK Callback /*OPTIONAL*/, /*IN*/ PVOID Context /*OPTIONAL*/); NTOSAPI VOID DDKAPI IoRequestDeviceEject( /*IN*/ PDEVICE_OBJECT PhysicalDeviceObject); /* * VOID * IoRequestDpc( * IN PDEVICE_OBJECT DeviceObject, * IN PIRP Irp, * IN PVOID Context); */ #define IoRequestDpc(DeviceObject, Irp, Context)( \ KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context))) NTOSAPI VOID DDKAPI IoReuseIrp( /*IN OUT*/ PIRP Irp, /*IN*/ NTSTATUS Status); /* * PDRIVER_CANCEL * IoSetCancelRoutine( * IN PIRP Irp, * IN PDRIVER_CANCEL CancelRoutine) */ #define IoSetCancelRoutine(_Irp, \ _CancelRoutine) \ ((PDRIVER_CANCEL) InterlockedExchangePointer( \ (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (_CancelRoutine))) /* * VOID * IoSetCompletionRoutine( * IN PIRP Irp, * IN PIO_COMPLETION_ROUTINE CompletionRoutine, * IN PVOID Context, * IN BOOLEAN InvokeOnSuccess, * IN BOOLEAN InvokeOnError, * IN BOOLEAN InvokeOnCancel) */ #define IoSetCompletionRoutine(_Irp, \ _CompletionRoutine, \ _Context, \ _InvokeOnSuccess, \ _InvokeOnError, \ _InvokeOnCancel) \ { \ PIO_STACK_LOCATION _IrpSp; \ ASSERT(_InvokeOnSuccess || _InvokeOnError || _InvokeOnCancel ? \ _CompletionRoutine != NULL : TRUE); \ _IrpSp = IoGetNextIrpStackLocation(_Irp); \ _IrpSp->CompletionRoutine = (PIO_COMPLETION_ROUTINE)(_CompletionRoutine); \ _IrpSp->Context = (_Context); \ _IrpSp->Control = 0; \ if (_InvokeOnSuccess) _IrpSp->Control = SL_INVOKE_ON_SUCCESS; \ if (_InvokeOnError) _IrpSp->Control |= SL_INVOKE_ON_ERROR; \ if (_InvokeOnCancel) _IrpSp->Control |= SL_INVOKE_ON_CANCEL; \ } NTOSAPI VOID DDKAPI IoSetCompletionRoutineEx( /*IN*/ PDEVICE_OBJECT DeviceObject, /*IN*/ PIRP Irp, /*IN*/ PIO_COMPLETION_ROUTINE CompletionRoutine, /*IN*/ PVOID Context, /*IN*/ BOOLEAN InvokeOnSuccess, /*IN*/ BOOLEAN InvokeOnError, /*IN*/ BOOLEAN InvokeOnCancel); NTOSAPI NTSTATUS DDKAPI IoSetDeviceInterfaceState( /*IN*/ PUNICODE_STRING SymbolicLinkName, /*IN*/ BOOLEAN Enable); NTOSAPI VOID DDKAPI IoSetHardErrorOrVerifyDevice( /*IN*/ PIRP Irp, /*IN*/ PDEVICE_OBJECT DeviceObject); /* * VOID * IoSetNextIrpStackLocation( * IN OUT PIRP Irp) */ #define IoSetNextIrpStackLocation(_Irp) \ { \ (_Irp)->CurrentLocation--; \ (_Irp)->Tail.Overlay.CurrentStackLocation--; \ } NTOSAPI NTSTATUS DDKAPI IoSetPartitionInformationEx( /*IN*/ PDEVICE_OBJECT DeviceObject, /*IN*/ ULONG PartitionNumber, /*IN*/ struct _SET_PARTITION_INFORMATION_EX *PartitionInfo); NTOSAPI VOID DDKAPI IoSetShareAccess( /*IN*/ ACCESS_MASK DesiredAccess, /*IN*/ ULONG DesiredShareAccess, /*IN OUT*/ PFILE_OBJECT FileObject, /*OUT*/ PSHARE_ACCESS ShareAccess); NTOSAPI VOID DDKAPI IoSetStartIoAttributes( /*IN*/ PDEVICE_OBJECT DeviceObject, /*IN*/ BOOLEAN DeferredStartIo, /*IN*/ BOOLEAN NonCancelable); NTOSAPI NTSTATUS DDKAPI IoSetSystemPartition( /*IN*/ PUNICODE_STRING VolumeNameString); NTOSAPI BOOLEAN DDKAPI IoSetThreadHardErrorMode( /*IN*/ BOOLEAN EnableHardErrors); /* * USHORT * IoSizeOfIrp( * IN CCHAR StackSize) */ #define IoSizeOfIrp(_StackSize) \ ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION))))) /* * VOID * IoSkipCurrentIrpStackLocation( * IN PIRP Irp) */ #define IoSkipCurrentIrpStackLocation(_Irp) \ { \ (_Irp)->CurrentLocation++; \ (_Irp)->Tail.Overlay.CurrentStackLocation++; \ } NTOSAPI VOID DDKAPI IoStartNextPacket( /*IN*/ PDEVICE_OBJECT DeviceObject, /*IN*/ BOOLEAN Cancelable); NTOSAPI VOID DDKAPI IoStartNextPacketByKey( /*IN*/ PDEVICE_OBJECT DeviceObject, /*IN*/ BOOLEAN Cancelable, /*IN*/ ULONG Key); NTOSAPI VOID DDKAPI IoStartPacket( /*IN*/ PDEVICE_OBJECT DeviceObject, /*IN*/ PIRP Irp, /*IN*/ PULONG Key /*OPTIONAL*/, /*IN*/ PDRIVER_CANCEL CancelFunction /*OPTIONAL*/); NTOSAPI VOID DDKAPI IoStartTimer( /*IN*/ PDEVICE_OBJECT DeviceObject); NTOSAPI VOID DDKAPI IoStopTimer( /*IN*/ PDEVICE_OBJECT DeviceObject); NTOSAPI NTSTATUS DDKAPI IoUnregisterPlugPlayNotification( /*IN*/ PVOID NotificationEntry); NTOSAPI VOID DDKAPI IoUnregisterShutdownNotification( /*IN*/ PDEVICE_OBJECT DeviceObject); NTOSAPI VOID DDKAPI IoUpdateShareAccess( /*IN*/ PFILE_OBJECT FileObject, /*IN OUT*/ PSHARE_ACCESS ShareAccess); NTOSAPI NTSTATUS DDKAPI IoVerifyPartitionTable( /*IN*/ PDEVICE_OBJECT DeviceObject, /*IN*/ BOOLEAN FixErrors); NTOSAPI NTSTATUS DDKAPI IoVolumeDeviceToDosName( /*IN*/ PVOID VolumeDeviceObject, /*OUT*/ PUNICODE_STRING DosName); NTOSAPI NTSTATUS DDKAPI IoWMIAllocateInstanceIds( /*IN*/ GUID *Guid, /*IN*/ ULONG InstanceCount, /*OUT*/ ULONG *FirstInstanceId); NTOSAPI ULONG DDKAPI IoWMIDeviceObjectToProviderId( /*IN*/ PDEVICE_OBJECT DeviceObject); NTOSAPI NTSTATUS DDKAPI IoWMIDeviceObjectToInstanceName( /*IN*/ PVOID DataBlockObject, /*IN*/ PDEVICE_OBJECT DeviceObject, /*OUT*/ PUNICODE_STRING InstanceName); NTOSAPI NTSTATUS DDKAPI IoWMIExecuteMethod( /*IN*/ PVOID DataBlockObject, /*IN*/ PUNICODE_STRING InstanceName, /*IN*/ ULONG MethodId, /*IN*/ ULONG InBufferSize, /*IN OUT*/ PULONG OutBufferSize, /*IN OUT*/ PUCHAR InOutBuffer); NTOSAPI NTSTATUS DDKAPI IoWMIHandleToInstanceName( /*IN*/ PVOID DataBlockObject, /*IN*/ HANDLE FileHandle, /*OUT*/ PUNICODE_STRING InstanceName); NTOSAPI NTSTATUS DDKAPI IoWMIOpenBlock( /*IN*/ GUID *DataBlockGuid, /*IN*/ ULONG DesiredAccess, /*OUT*/ PVOID *DataBlockObject); NTOSAPI NTSTATUS DDKAPI IoWMIQueryAllData( /*IN*/ PVOID DataBlockObject, /*IN OUT*/ ULONG *InOutBufferSize, /*OUT*/ PVOID OutBuffer); NTOSAPI NTSTATUS DDKAPI IoWMIQueryAllDataMultiple( /*IN*/ PVOID *DataBlockObjectList, /*IN*/ ULONG ObjectCount, /*IN OUT*/ ULONG *InOutBufferSize, /*OUT*/ PVOID OutBuffer); NTOSAPI NTSTATUS DDKAPI IoWMIQuerySingleInstance( /*IN*/ PVOID DataBlockObject, /*IN*/ PUNICODE_STRING InstanceName, /*IN OUT*/ ULONG *InOutBufferSize, /*OUT*/ PVOID OutBuffer); NTOSAPI NTSTATUS DDKAPI IoWMIQuerySingleInstanceMultiple( /*IN*/ PVOID *DataBlockObjectList, /*IN*/ PUNICODE_STRING InstanceNames, /*IN*/ ULONG ObjectCount, /*IN OUT*/ ULONG *InOutBufferSize, /*OUT*/ PVOID OutBuffer); NTOSAPI NTSTATUS DDKAPI IoWMIRegistrationControl( /*IN*/ PDEVICE_OBJECT DeviceObject, /*IN*/ ULONG Action); NTOSAPI NTSTATUS DDKAPI IoWMISetNotificationCallback( /*IN*/ PVOID Object, /*IN*/ WMI_NOTIFICATION_CALLBACK Callback, /*IN*/ PVOID Context); NTOSAPI NTSTATUS DDKAPI IoWMISetSingleInstance( /*IN*/ PVOID DataBlockObject, /*IN*/ PUNICODE_STRING InstanceName, /*IN*/ ULONG Version, /*IN*/ ULONG ValueBufferSize, /*IN*/ PVOID ValueBuffer); NTOSAPI NTSTATUS DDKAPI IoWMISetSingleItem( /*IN*/ PVOID DataBlockObject, /*IN*/ PUNICODE_STRING InstanceName, /*IN*/ ULONG DataItemId, /*IN*/ ULONG Version, /*IN*/ ULONG ValueBufferSize, /*IN*/ PVOID ValueBuffer); NTOSAPI NTSTATUS DDKAPI IoWMISuggestInstanceName( /*IN*/ PDEVICE_OBJECT PhysicalDeviceObject /*OPTIONAL*/, /*IN*/ PUNICODE_STRING SymbolicLinkName /*OPTIONAL*/, /*IN*/ BOOLEAN CombineNames, /*OUT*/ PUNICODE_STRING SuggestedInstanceName); NTOSAPI NTSTATUS DDKAPI IoWMIWriteEvent( /*IN*/ PVOID WnodeEventItem); NTOSAPI VOID DDKAPI IoWriteErrorLogEntry( /*IN*/ PVOID ElEntry); NTOSAPI NTSTATUS DDKAPI IoWritePartitionTableEx( /*IN*/ PDEVICE_OBJECT DeviceObject, /*IN*/ struct _DRIVE_LAYOUT_INFORMATION_EX *PartitionBuffer); /** Kernel routines **/ NTOSAPI VOID DDKFASTAPI KeAcquireInStackQueuedSpinLock( /*IN*/ PKSPIN_LOCK SpinLock, /*IN*/ PKLOCK_QUEUE_HANDLE LockHandle); NTOSAPI VOID DDKFASTAPI KeAcquireInStackQueuedSpinLockAtDpcLevel( /*IN*/ PKSPIN_LOCK SpinLock, /*IN*/ PKLOCK_QUEUE_HANDLE LockHandle); NTOSAPI KIRQL DDKAPI KeAcquireInterruptSpinLock( /*IN*/ PKINTERRUPT Interrupt); NTOSAPI VOID DDKAPI KeAcquireSpinLock( /*IN*/ PKSPIN_LOCK SpinLock, /*OUT*/ PKIRQL OldIrql); /* System Service Dispatch Table */ typedef PVOID (NTAPI * SSDT)(VOID); typedef SSDT * PSSDT; /* System Service Parameters Table */ typedef UCHAR SSPT, * PSSPT; typedef struct _SSDT_ENTRY { PSSDT SSDT; PULONG ServiceCounterTable; ULONG NumberOfServices; PSSPT SSPT; } SSDT_ENTRY, *PSSDT_ENTRY; NTOSAPI BOOLEAN DDKAPI KeAddSystemServiceTable( /*IN*/ PSSDT SSDT, /*IN*/ PULONG ServiceCounterTable, /*IN*/ ULONG NumberOfServices, /*IN*/ PSSPT SSPT, /*IN*/ ULONG TableIndex); NTOSAPI BOOLEAN DDKAPI KeAreApcsDisabled( VOID); NTOSAPI VOID DDKAPI KeAttachProcess( /*IN*/ PEPROCESS Process); NTOSAPI VOID DDKAPI KeBugCheck( /*IN*/ ULONG BugCheckCode); NTOSAPI VOID DDKAPI KeBugCheckEx( /*IN*/ ULONG BugCheckCode, /*IN*/ ULONG_PTR BugCheckParameter1, /*IN*/ ULONG_PTR BugCheckParameter2, /*IN*/ ULONG_PTR BugCheckParameter3, /*IN*/ ULONG_PTR BugCheckParameter4); NTOSAPI BOOLEAN DDKAPI KeCancelTimer( /*IN*/ PKTIMER Timer); NTOSAPI VOID DDKAPI KeClearEvent( /*IN*/ PRKEVENT Event); NTOSAPI NTSTATUS DDKAPI KeDelayExecutionThread( /*IN*/ KPROCESSOR_MODE WaitMode, /*IN*/ BOOLEAN Alertable, /*IN*/ PLARGE_INTEGER Interval); NTOSAPI BOOLEAN DDKAPI KeDeregisterBugCheckCallback( /*IN*/ PKBUGCHECK_CALLBACK_RECORD CallbackRecord); NTOSAPI VOID DDKAPI KeDetachProcess( VOID); NTOSAPI VOID DDKAPI KeEnterCriticalRegion( VOID); /* * VOID * KeFlushIoBuffers( * IN PMDL Mdl, * IN BOOLEAN ReadOperation, * IN BOOLEAN DmaOperation) */ #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation) NTOSAPI VOID DDKAPI KeFlushQueuedDpcs(VOID); NTOSAPI PRKTHREAD DDKAPI KeGetCurrentThread( VOID); NTOSAPI KPROCESSOR_MODE DDKAPI KeGetPreviousMode( VOID); NTOSAPI ULONG DDKAPI KeGetRecommendedSharedDataAlignment( VOID); NTOSAPI VOID DDKAPI KeInitializeApc( /*IN*/ PKAPC Apc, /*IN*/ PKTHREAD Thread, /*IN*/ UCHAR StateIndex, /*IN*/ PKKERNEL_ROUTINE KernelRoutine, /*IN*/ PKRUNDOWN_ROUTINE RundownRoutine, /*IN*/ PKNORMAL_ROUTINE NormalRoutine, /*IN*/ UCHAR Mode, /*IN*/ PVOID Context); NTOSAPI VOID DDKAPI KeInitializeDeviceQueue( /*IN*/ PKDEVICE_QUEUE DeviceQueue); NTOSAPI VOID DDKAPI KeInitializeMutex( /*IN*/ PRKMUTEX Mutex, /*IN*/ ULONG Level); NTOSAPI VOID DDKAPI KeInitializeSemaphore( /*IN*/ PRKSEMAPHORE Semaphore, /*IN*/ LONG Count, /*IN*/ LONG Limit); NTOSAPI VOID DDKAPI KeInitializeSpinLock( /*IN*/ PKSPIN_LOCK SpinLock); NTOSAPI VOID DDKAPI KeInitializeTimer( /*IN*/ PKTIMER Timer); NTOSAPI VOID DDKAPI KeInitializeTimerEx( /*IN*/ PKTIMER Timer, /*IN*/ TIMER_TYPE Type); NTOSAPI BOOLEAN DDKAPI KeInsertByKeyDeviceQueue( /*IN*/ PKDEVICE_QUEUE DeviceQueue, /*IN*/ PKDEVICE_QUEUE_ENTRY DeviceQueueEntry, /*IN*/ ULONG SortKey); NTOSAPI BOOLEAN DDKAPI KeInsertDeviceQueue( /*IN*/ PKDEVICE_QUEUE DeviceQueue, /*IN*/ PKDEVICE_QUEUE_ENTRY DeviceQueueEntry); NTOSAPI BOOLEAN DDKAPI KeInsertQueueDpc( /*IN*/ PRKDPC Dpc, /*IN*/ PVOID SystemArgument1, /*IN*/ PVOID SystemArgument2); NTOSAPI VOID DDKAPI KeLeaveCriticalRegion( VOID); #define KeMemoryBarrier() asm("mfence;") NTOSAPI NTSTATUS DDKAPI KePulseEvent( /*IN*/ PRKEVENT Event, /*IN*/ KPRIORITY Increment, /*IN*/ BOOLEAN Wait); NTOSAPI ULONGLONG DDKAPI KeQueryInterruptTime( VOID); NTOSAPI LARGE_INTEGER DDKAPI KeQueryPerformanceCounter( /*OUT*/ PLARGE_INTEGER PerformanceFrequency /*OPTIONAL*/); NTOSAPI KPRIORITY DDKAPI KeQueryPriorityThread( /*IN*/ PRKTHREAD Thread); NTOSAPI VOID DDKAPI KeQuerySystemTime( /*OUT*/ PLARGE_INTEGER CurrentTime); NTOSAPI VOID DDKAPI KeQueryTickCount( /*OUT*/ PLARGE_INTEGER TickCount); NTOSAPI ULONG DDKAPI KeQueryTimeIncrement( VOID); NTOSAPI LONG DDKAPI KeReadStateEvent( /*IN*/ PRKEVENT Event); NTOSAPI LONG DDKAPI KeReadStateMutex( /*IN*/ PRKMUTEX Mutex); NTOSAPI LONG DDKAPI KeReadStateSemaphore( /*IN*/ PRKSEMAPHORE Semaphore); NTOSAPI BOOLEAN DDKAPI KeReadStateTimer( /*IN*/ PKTIMER Timer); NTOSAPI BOOLEAN DDKAPI KeRegisterBugCheckCallback( /*IN*/ PKBUGCHECK_CALLBACK_RECORD CallbackRecord, /*IN*/ PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine, /*IN*/ PVOID Buffer, /*IN*/ ULONG Length, /*IN*/ PUCHAR Component); NTOSAPI VOID DDKFASTAPI KeReleaseInStackQueuedSpinLock( /*IN*/ PKLOCK_QUEUE_HANDLE LockHandle); NTOSAPI VOID DDKFASTAPI KeReleaseInStackQueuedSpinLockFromDpcLevel( /*IN*/ PKLOCK_QUEUE_HANDLE LockHandle); NTOSAPI VOID DDKAPI KeReleaseInterruptSpinLock( /*IN*/ PKINTERRUPT Interrupt, /*IN*/ KIRQL OldIrql); NTOSAPI LONG DDKAPI KeReleaseMutex( /*IN*/ PRKMUTEX Mutex, /*IN*/ BOOLEAN Wait); NTOSAPI LONG DDKAPI KeReleaseSemaphore( /*IN*/ PRKSEMAPHORE Semaphore, /*IN*/ KPRIORITY Increment, /*IN*/ LONG Adjustment, /*IN*/ BOOLEAN Wait); NTOSAPI VOID DDKAPI KeReleaseSpinLock( /*IN*/ PKSPIN_LOCK SpinLock, /*IN*/ KIRQL NewIrql); NTOSAPI PKDEVICE_QUEUE_ENTRY DDKAPI KeRemoveByKeyDeviceQueue( /*IN*/ PKDEVICE_QUEUE DeviceQueue, /*IN*/ ULONG SortKey); NTOSAPI PKDEVICE_QUEUE_ENTRY DDKAPI KeRemoveDeviceQueue( /*IN*/ PKDEVICE_QUEUE DeviceQueue); NTOSAPI BOOLEAN DDKAPI KeRemoveEntryDeviceQueue( /*IN*/ PKDEVICE_QUEUE DeviceQueue, /*IN*/ PKDEVICE_QUEUE_ENTRY DeviceQueueEntry); NTOSAPI BOOLEAN DDKAPI KeRemoveQueueDpc( /*IN*/ PRKDPC Dpc); NTOSAPI LONG DDKAPI KeResetEvent( /*IN*/ PRKEVENT Event); NTOSAPI NTSTATUS DDKAPI KeRestoreFloatingPointState( /*IN*/ PKFLOATING_SAVE FloatSave); NTOSAPI NTSTATUS DDKAPI KeSaveFloatingPointState( /*OUT*/ PKFLOATING_SAVE FloatSave); NTOSAPI LONG DDKAPI KeSetBasePriorityThread( /*IN*/ PRKTHREAD Thread, /*IN*/ LONG Increment); NTOSAPI LONG DDKAPI KeSetEvent( /*IN*/ PRKEVENT Event, /*IN*/ KPRIORITY Increment, /*IN*/ BOOLEAN Wait); NTOSAPI VOID DDKAPI KeSetImportanceDpc( /*IN*/ PRKDPC Dpc, /*IN*/ KDPC_IMPORTANCE Importance); NTOSAPI KPRIORITY DDKAPI KeSetPriorityThread( /*IN*/ PKTHREAD Thread, /*IN*/ KPRIORITY Priority); NTOSAPI VOID DDKAPI KeSetTargetProcessorDpc( /*IN*/ PRKDPC Dpc, /*IN*/ CCHAR Number); NTOSAPI BOOLEAN DDKAPI KeSetTimer( /*IN*/ PKTIMER Timer, /*IN*/ LARGE_INTEGER DueTime, /*IN*/ PKDPC Dpc /*OPTIONAL*/); NTOSAPI BOOLEAN DDKAPI KeSetTimerEx( /*IN*/ PKTIMER Timer, /*IN*/ LARGE_INTEGER DueTime, /*IN*/ LONG Period /*OPTIONAL*/, /*IN*/ PKDPC Dpc /*OPTIONAL*/); NTOSAPI VOID DDKFASTAPI KeSetTimeUpdateNotifyRoutine( /*IN*/ PTIME_UPDATE_NOTIFY_ROUTINE NotifyRoutine); NTOSAPI VOID DDKAPI KeStallExecutionProcessor( /*IN*/ ULONG MicroSeconds); NTOSAPI BOOLEAN DDKAPI KeSynchronizeExecution( /*IN*/ PKINTERRUPT Interrupt, /*IN*/ PKSYNCHRONIZE_ROUTINE SynchronizeRoutine, /*IN*/ PVOID SynchronizeContext); NTOSAPI NTSTATUS DDKAPI KeWaitForMultipleObjects( /*IN*/ ULONG Count, /*IN*/ PVOID Object[], /*IN*/ WAIT_TYPE WaitType, /*IN*/ KWAIT_REASON WaitReason, /*IN*/ KPROCESSOR_MODE WaitMode, /*IN*/ BOOLEAN Alertable, /*IN*/ PLARGE_INTEGER Timeout /*OPTIONAL */, /*IN*/ PKWAIT_BLOCK WaitBlockArray /*OPTIONAL*/); NTOSAPI NTSTATUS DDKAPI KeWaitForMutexObject( /*IN*/ PRKMUTEX Mutex, /*IN*/ KWAIT_REASON WaitReason, /*IN*/ KPROCESSOR_MODE WaitMode, /*IN*/ BOOLEAN Alertable, /*IN*/ PLARGE_INTEGER Timeout /*OPTIONAL*/); NTOSAPI NTSTATUS DDKAPI KeWaitForSingleObject( /*IN*/ PVOID Object, /*IN*/ KWAIT_REASON WaitReason, /*IN*/ KPROCESSOR_MODE WaitMode, /*IN*/ BOOLEAN Alertable, /*IN*/ PLARGE_INTEGER Timeout /*OPTIONAL*/); NTOSAPI VOID DDKAPI KeRaiseIrql( /*IN*/ KIRQL new_irql, /*OUT*/ PKIRQL old_irql); NTOSAPI VOID DDKAPI KeLowerIrql( /*IN*/ KIRQL irql); NTOSAPI KIRQL DDKAPI KeRaiseIrqlToDpcLevel( VOID); /** Memory manager routines **/ NTOSAPI NTSTATUS DDKAPI MmAdvanceMdl( /*IN*/ PMDL Mdl, /*IN*/ ULONG NumberOfBytes); NTOSAPI PVOID DDKAPI MmAllocateContiguousMemory( /*IN*/ ULONG NumberOfBytes, /*IN*/ PHYSICAL_ADDRESS HighestAcceptableAddress); NTOSAPI PVOID DDKAPI MmAllocateContiguousMemorySpecifyCache( /*IN*/ SIZE_T NumberOfBytes, /*IN*/ PHYSICAL_ADDRESS LowestAcceptableAddress, /*IN*/ PHYSICAL_ADDRESS HighestAcceptableAddress, /*IN*/ PHYSICAL_ADDRESS BoundaryAddressMultiple /*OPTIONAL*/, /*IN*/ MEMORY_CACHING_TYPE CacheType); NTOSAPI PVOID DDKAPI MmAllocateMappingAddress( /*IN*/ SIZE_T NumberOfBytes, /*IN*/ ULONG PoolTag); NTOSAPI PVOID DDKAPI MmAllocateNonCachedMemory( /*IN*/ ULONG NumberOfBytes); NTOSAPI PMDL DDKAPI MmAllocatePagesForMdl( /*IN*/ PHYSICAL_ADDRESS LowAddress, /*IN*/ PHYSICAL_ADDRESS HighAddress, /*IN*/ PHYSICAL_ADDRESS SkipBytes, /*IN*/ SIZE_T TotalBytes); NTOSAPI VOID DDKAPI MmBuildMdlForNonPagedPool( /*IN OUT*/ PMDL MemoryDescriptorList); NTOSAPI NTSTATUS DDKAPI MmCreateSection( /*OUT*/ PSECTION_OBJECT *SectionObject, /*IN*/ ACCESS_MASK DesiredAccess, /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes /*OPTIONAL*/, /*IN*/ PLARGE_INTEGER MaximumSize, /*IN*/ ULONG SectionPageProtection, /*IN*/ ULONG AllocationAttributes, /*IN*/ HANDLE FileHandle /*OPTIONAL*/, /*IN*/ PFILE_OBJECT File /*OPTIONAL*/); typedef enum _MMFLUSH_TYPE { MmFlushForDelete, MmFlushForWrite } MMFLUSH_TYPE; NTOSAPI BOOLEAN DDKAPI MmFlushImageSection( /*IN*/ PSECTION_OBJECT_POINTERS SectionObjectPointer, /*IN*/ MMFLUSH_TYPE FlushType); NTOSAPI VOID DDKAPI MmFreeContiguousMemory( /*IN*/ PVOID BaseAddress); NTOSAPI VOID DDKAPI MmFreeContiguousMemorySpecifyCache( /*IN*/ PVOID BaseAddress, /*IN*/ SIZE_T NumberOfBytes, /*IN*/ MEMORY_CACHING_TYPE CacheType); NTOSAPI VOID DDKAPI MmFreeMappingAddress( /*IN*/ PVOID BaseAddress, /*IN*/ ULONG PoolTag); NTOSAPI VOID DDKAPI MmFreeNonCachedMemory( /*IN*/ PVOID BaseAddress, /*IN*/ SIZE_T NumberOfBytes); NTOSAPI VOID DDKAPI MmFreePagesFromMdl( /*IN*/ PMDL MemoryDescriptorList); /* * ULONG * MmGetMdlByteCount( * IN PMDL Mdl) */ #define MmGetMdlByteCount(_Mdl) \ ((_Mdl)->ByteCount) /* * ULONG * MmGetMdlByteOffset( * IN PMDL Mdl) */ #define MmGetMdlByteOffset(_Mdl) \ ((_Mdl)->ByteOffset) /* * PPFN_NUMBER * MmGetMdlPfnArray( * IN PMDL Mdl) */ #define MmGetMdlPfnArray(_Mdl) \ ((PPFN_NUMBER) ((_Mdl) + 1)) /* * PVOID * MmGetMdlVirtualAddress( * IN PMDL Mdl) */ #define MmGetMdlVirtualAddress(_Mdl) \ ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset)) NTOSAPI PHYSICAL_ADDRESS DDKAPI MmGetPhysicalAddress( /*IN*/ PVOID BaseAddress); NTOSAPI PPHYSICAL_MEMORY_RANGE DDKAPI MmGetPhysicalMemoryRanges( VOID); NTOSAPI PVOID DDKAPI MmGetVirtualForPhysical( /*IN*/ PHYSICAL_ADDRESS PhysicalAddress); NTOSAPI PVOID DDKAPI MmMapLockedPagesSpecifyCache( /*IN*/ PMDL MemoryDescriptorList, /*IN*/ KPROCESSOR_MODE AccessMode, /*IN*/ MEMORY_CACHING_TYPE CacheType, /*IN*/ PVOID BaseAddress, /*IN*/ ULONG BugCheckOnFailure, /*IN*/ MM_PAGE_PRIORITY Priority); NTOSAPI PVOID DDKAPI MmMapLockedPagesWithReservedMapping( /*IN*/ PVOID MappingAddress, /*IN*/ ULONG PoolTag, /*IN*/ PMDL MemoryDescriptorList, /*IN*/ MEMORY_CACHING_TYPE CacheType); NTOSAPI NTSTATUS DDKAPI MmMapUserAddressesToPage( /*IN*/ PVOID BaseAddress, /*IN*/ SIZE_T NumberOfBytes, /*IN*/ PVOID PageAddress); NTOSAPI PVOID DDKAPI MmMapVideoDisplay( /*IN*/ PHYSICAL_ADDRESS PhysicalAddress, /*IN*/ SIZE_T NumberOfBytes, /*IN*/ MEMORY_CACHING_TYPE CacheType); NTOSAPI NTSTATUS DDKAPI MmMapViewInSessionSpace( /*IN*/ PVOID Section, /*OUT*/ PVOID *MappedBase, /*IN OUT*/ PSIZE_T ViewSize); NTOSAPI NTSTATUS DDKAPI MmMapViewInSystemSpace( /*IN*/ PVOID Section, /*OUT*/ PVOID *MappedBase, /*IN*/ PSIZE_T ViewSize); NTOSAPI NTSTATUS DDKAPI MmMarkPhysicalMemoryAsBad( /*IN*/ PPHYSICAL_ADDRESS StartAddress, /*IN OUT*/ PLARGE_INTEGER NumberOfBytes); NTOSAPI NTSTATUS DDKAPI MmMarkPhysicalMemoryAsGood( /*IN*/ PPHYSICAL_ADDRESS StartAddress, /*IN OUT*/ PLARGE_INTEGER NumberOfBytes); /* * PVOID * MmGetSystemAddressForMdlSafe( * IN PMDL Mdl, * IN MM_PAGE_PRIORITY Priority) */ #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \ ((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \ | MDL_SOURCE_IS_NONPAGED_POOL)) ? \ (_Mdl)->MappedSystemVa : \ (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \ KernelMode, MmCached, NULL, FALSE, _Priority) NTOSAPI PVOID DDKAPI MmGetSystemRoutineAddress( /*IN*/ PUNICODE_STRING SystemRoutineName); /* * ULONG * ADDRESS_AND_SIZE_TO_SPAN_PAGES( * IN PVOID Va, * IN ULONG Size) */ #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, \ _Size) \ ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \ + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT)) /* * VOID * MmInitializeMdl( * IN PMDL MemoryDescriptorList, * IN PVOID BaseVa, * IN SIZE_T Length) */ #define MmInitializeMdl(_MemoryDescriptorList, \ _BaseVa, \ _Length) \ { \ (_MemoryDescriptorList)->Next = (PMDL) NULL; \ (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \ (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \ (_MemoryDescriptorList)->MdlFlags = 0; \ (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \ (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \ (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \ } NTOSAPI BOOLEAN DDKAPI MmIsAddressValid( /*IN*/ PVOID VirtualAddress); NTOSAPI LOGICAL DDKAPI MmIsDriverVerifying( /*IN*/ PDRIVER_OBJECT DriverObject); NTOSAPI BOOLEAN DDKAPI MmIsThisAnNtAsSystem( VOID); NTOSAPI NTSTATUS DDKAPI MmIsVerifierEnabled( /*OUT*/ PULONG VerifierFlags); NTOSAPI PVOID DDKAPI MmLockPagableDataSection( /*IN*/ PVOID AddressWithinSection); NTOSAPI PVOID DDKAPI MmLockPagableImageSection( /*IN*/ PVOID AddressWithinSection); /* * PVOID * MmLockPagableCodeSection( * IN PVOID AddressWithinSection) */ #define MmLockPagableCodeSection MmLockPagableDataSection NTOSAPI VOID DDKAPI MmLockPagableSectionByHandle( /*IN*/ PVOID ImageSectionHandle); NTOSAPI PVOID DDKAPI MmMapIoSpace( /*IN*/ PHYSICAL_ADDRESS PhysicalAddress, /*IN*/ ULONG NumberOfBytes, /*IN*/ MEMORY_CACHING_TYPE CacheEnable); NTOSAPI PVOID DDKAPI MmMapLockedPages( /*IN*/ PMDL MemoryDescriptorList, /*IN*/ KPROCESSOR_MODE AccessMode); NTOSAPI VOID DDKAPI MmPageEntireDriver( /*IN*/ PVOID AddressWithinSection); NTOSAPI VOID DDKAPI MmProbeAndLockProcessPages( /*IN OUT*/ PMDL MemoryDescriptorList, /*IN*/ PEPROCESS Process, /*IN*/ KPROCESSOR_MODE AccessMode, /*IN*/ LOCK_OPERATION Operation); NTOSAPI NTSTATUS DDKAPI MmProtectMdlSystemAddress( /*IN*/ PMDL MemoryDescriptorList, /*IN*/ ULONG NewProtect); NTOSAPI VOID DDKAPI MmUnmapLockedPages( /*IN*/ PVOID BaseAddress, /*IN*/ PMDL MemoryDescriptorList); NTOSAPI NTSTATUS DDKAPI MmUnmapViewInSessionSpace( /*IN*/ PVOID MappedBase); NTOSAPI NTSTATUS DDKAPI MmUnmapViewInSystemSpace( /*IN*/ PVOID MappedBase); NTOSAPI VOID DDKAPI MmUnsecureVirtualMemory( /*IN*/ HANDLE SecureHandle); /* * VOID * MmPrepareMdlForReuse( * IN PMDL Mdl) */ #define MmPrepareMdlForReuse(_Mdl) \ { \ if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \ ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \ MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \ } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \ ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \ } \ } NTOSAPI VOID DDKAPI MmProbeAndLockPages( /*IN OUT*/ PMDL MemoryDescriptorList, /*IN*/ KPROCESSOR_MODE AccessMode, /*IN*/ LOCK_OPERATION Operation); NTOSAPI MM_SYSTEM_SIZE DDKAPI MmQuerySystemSize( VOID); NTOSAPI NTSTATUS DDKAPI MmRemovePhysicalMemory( /*IN*/ PPHYSICAL_ADDRESS StartAddress, /*IN OUT*/ PLARGE_INTEGER NumberOfBytes); NTOSAPI VOID DDKAPI MmResetDriverPaging( /*IN*/ PVOID AddressWithinSection); NTOSAPI HANDLE DDKAPI MmSecureVirtualMemory( /*IN*/ PVOID Address, /*IN*/ SIZE_T Size, /*IN*/ ULONG ProbeMode); NTOSAPI ULONG DDKAPI MmSizeOfMdl( /*IN*/ PVOID Base, /*IN*/ SIZE_T Length); NTOSAPI VOID DDKAPI MmUnlockPagableImageSection( /*IN*/ PVOID ImageSectionHandle); NTOSAPI VOID DDKAPI MmUnlockPages( /*IN*/ PMDL MemoryDescriptorList); NTOSAPI VOID DDKAPI MmUnmapIoSpace( /*IN*/ PVOID BaseAddress, /*IN*/ SIZE_T NumberOfBytes); NTOSAPI VOID DDKAPI MmUnmapReservedMapping( /*IN*/ PVOID BaseAddress, /*IN*/ ULONG PoolTag, /*IN*/ PMDL MemoryDescriptorList); NTOSAPI VOID DDKAPI MmUnmapVideoDisplay( /*IN*/ PVOID BaseAddress, /*IN*/ SIZE_T NumberOfBytes); /** Object manager routines **/ NTOSAPI NTSTATUS DDKAPI ObAssignSecurity( /*IN*/ PACCESS_STATE AccessState, /*IN*/ PSECURITY_DESCRIPTOR SecurityDescriptor, /*IN*/ PVOID Object, /*IN*/ POBJECT_TYPE Type); NTOSAPI VOID DDKAPI ObDereferenceSecurityDescriptor( PSECURITY_DESCRIPTOR SecurityDescriptor, ULONG Count); NTOSAPI VOID DDKFASTAPI ObfDereferenceObject( /*IN*/ PVOID Object); /* * VOID * ObDereferenceObject( * IN PVOID Object) */ #define ObDereferenceObject ObfDereferenceObject NTOSAPI NTSTATUS DDKAPI ObGetObjectSecurity( /*IN*/ PVOID Object, /*OUT*/ PSECURITY_DESCRIPTOR *SecurityDescriptor, /*OUT*/ PBOOLEAN MemoryAllocated); NTOSAPI NTSTATUS DDKAPI ObInsertObject( /*IN*/ PVOID Object, /*IN*/ PACCESS_STATE PassedAccessState /*OPTIONAL*/, /*IN*/ ACCESS_MASK DesiredAccess, /*IN*/ ULONG AdditionalReferences, /*OUT*/ PVOID* ReferencedObject /*OPTIONAL*/, /*OUT*/ PHANDLE Handle); NTOSAPI VOID DDKFASTAPI ObfReferenceObject( /*IN*/ PVOID Object); NTOSAPI NTSTATUS DDKAPI ObLogSecurityDescriptor( /*IN*/ PSECURITY_DESCRIPTOR InputSecurityDescriptor, /*OUT*/ PSECURITY_DESCRIPTOR *OutputSecurityDescriptor, /*IN*/ ULONG RefBias); /* * VOID * ObReferenceObject( * IN PVOID Object) */ #define ObReferenceObject ObfReferenceObject NTOSAPI VOID DDKAPI ObMakeTemporaryObject( /*IN*/ PVOID Object); NTOSAPI NTSTATUS DDKAPI ObOpenObjectByName( /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes, /*IN*/ POBJECT_TYPE ObjectType, /*IN OUT*/ PVOID ParseContext /*OPTIONAL*/, /*IN*/ KPROCESSOR_MODE AccessMode, /*IN*/ ACCESS_MASK DesiredAccess, /*IN*/ PACCESS_STATE PassedAccessState, /*OUT*/ PHANDLE Handle); NTOSAPI NTSTATUS DDKAPI ObOpenObjectByPointer( /*IN*/ PVOID Object, /*IN*/ ULONG HandleAttributes, /*IN*/ PACCESS_STATE PassedAccessState /*OPTIONAL*/, /*IN*/ ACCESS_MASK DesiredAccess /*OPTIONAL*/, /*IN*/ POBJECT_TYPE ObjectType /*OPTIONAL*/, /*IN*/ KPROCESSOR_MODE AccessMode, /*OUT*/ PHANDLE Handle); NTOSAPI NTSTATUS DDKAPI ObQueryObjectAuditingByHandle( /*IN*/ HANDLE Handle, /*OUT*/ PBOOLEAN GenerateOnClose); NTOSAPI NTSTATUS DDKAPI ObReferenceObjectByHandle( /*IN*/ HANDLE Handle, /*IN*/ ACCESS_MASK DesiredAccess, /*IN*/ POBJECT_TYPE ObjectType /*OPTIONAL*/, /*IN*/ KPROCESSOR_MODE AccessMode, /*OUT*/ PVOID *Object, /*OUT*/ POBJECT_HANDLE_INFORMATION HandleInformation /*OPTIONAL*/); NTOSAPI NTSTATUS DDKAPI ObReferenceObjectByName( /*IN*/ PUNICODE_STRING ObjectPath, /*IN*/ ULONG Attributes, /*IN*/ PACCESS_STATE PassedAccessState /*OPTIONAL*/, /*IN*/ ACCESS_MASK DesiredAccess /*OPTIONAL*/, /*IN*/ POBJECT_TYPE ObjectType, /*IN*/ KPROCESSOR_MODE AccessMode, /*IN OUT*/ PVOID ParseContext /*OPTIONAL*/, /*OUT*/ PVOID *Object); NTOSAPI NTSTATUS DDKAPI ObReferenceObjectByPointer( /*IN*/ PVOID Object, /*IN*/ ACCESS_MASK DesiredAccess, /*IN*/ POBJECT_TYPE ObjectType, /*IN*/ KPROCESSOR_MODE AccessMode); NTOSAPI VOID DDKAPI ObReferenceSecurityDescriptor( /*IN*/ PSECURITY_DESCRIPTOR SecurityDescriptor, /*IN*/ ULONG Count); NTOSAPI VOID DDKAPI ObReleaseObjectSecurity( /*IN*/ PSECURITY_DESCRIPTOR SecurityDescriptor, /*IN*/ BOOLEAN MemoryAllocated); /** Process manager routines **/ NTOSAPI NTSTATUS DDKAPI PsCreateSystemProcess( /*IN*/ PHANDLE ProcessHandle, /*IN*/ ACCESS_MASK DesiredAccess, /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes); NTOSAPI NTSTATUS DDKAPI PsCreateSystemThread( /*OUT*/ PHANDLE ThreadHandle, /*IN*/ ULONG DesiredAccess, /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes /*OPTIONAL*/, /*IN*/ HANDLE ProcessHandle /*OPTIONAL*/, /*OUT*/ PCLIENT_ID ClientId /*OPTIONAL*/, /*IN*/ PKSTART_ROUTINE StartRoutine, /*IN*/ PVOID StartContext); /* * PEPROCESS * PsGetCurrentProcess(VOID) */ #define PsGetCurrentProcess IoGetCurrentProcess NTOSAPI HANDLE DDKAPI PsGetCurrentProcessId( VOID); /* * PETHREAD * PsGetCurrentThread(VOID) */ #define PsGetCurrentThread() \ ((PETHREAD) KeGetCurrentThread()) NTOSAPI HANDLE DDKAPI PsGetCurrentThreadId( VOID); NTOSAPI BOOLEAN DDKAPI PsGetVersion( PULONG MajorVersion /*OPTIONAL*/, PULONG MinorVersion /*OPTIONAL*/, PULONG BuildNumber /*OPTIONAL*/, PUNICODE_STRING CSDVersion /*OPTIONAL*/); NTOSAPI NTSTATUS DDKAPI PsRemoveCreateThreadNotifyRoutine( /*IN*/ PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine); NTOSAPI NTSTATUS DDKAPI PsRemoveLoadImageNotifyRoutine( /*IN*/ PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine); NTOSAPI NTSTATUS DDKAPI PsSetCreateProcessNotifyRoutine( /*IN*/ PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine, /*IN*/ BOOLEAN Remove); NTOSAPI NTSTATUS DDKAPI PsSetCreateThreadNotifyRoutine( /*IN*/ PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine); NTOSAPI NTSTATUS DDKAPI PsSetLoadImageNotifyRoutine( /*IN*/ PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine); NTOSAPI NTSTATUS DDKAPI PsTerminateSystemThread( /*IN*/ NTSTATUS ExitStatus); /** Security reference monitor routines **/ NTOSAPI BOOLEAN DDKAPI SeAccessCheck( /*IN*/ PSECURITY_DESCRIPTOR SecurityDescriptor, /*IN*/ PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext, /*IN*/ BOOLEAN SubjectContextLocked, /*IN*/ ACCESS_MASK DesiredAccess, /*IN*/ ACCESS_MASK PreviouslyGrantedAccess, /*OUT*/ PPRIVILEGE_SET *Privileges /*OPTIONAL*/, /*IN*/ PGENERIC_MAPPING GenericMapping, /*IN*/ KPROCESSOR_MODE AccessMode, /*OUT*/ PACCESS_MASK GrantedAccess, /*OUT*/ PNTSTATUS AccessStatus); NTOSAPI NTSTATUS DDKAPI SeAssignSecurity( /*IN*/ PSECURITY_DESCRIPTOR ParentDescriptor /*OPTIONAL*/, /*IN*/ PSECURITY_DESCRIPTOR ExplicitDescriptor /*OPTIONAL*/, /*OUT*/ PSECURITY_DESCRIPTOR *NewDescriptor, /*IN*/ BOOLEAN IsDirectoryObject, /*IN*/ PSECURITY_SUBJECT_CONTEXT SubjectContext, /*IN*/ PGENERIC_MAPPING GenericMapping, /*IN*/ POOL_TYPE PoolType); NTOSAPI NTSTATUS DDKAPI SeAssignSecurityEx( /*IN*/ PSECURITY_DESCRIPTOR ParentDescriptor /*OPTIONAL*/, /*IN*/ PSECURITY_DESCRIPTOR ExplicitDescriptor /*OPTIONAL*/, /*OUT*/ PSECURITY_DESCRIPTOR *NewDescriptor, /*IN*/ GUID *ObjectType /*OPTIONAL*/, /*IN*/ BOOLEAN IsDirectoryObject, /*IN*/ ULONG AutoInheritFlags, /*IN*/ PSECURITY_SUBJECT_CONTEXT SubjectContext, /*IN*/ PGENERIC_MAPPING GenericMapping, /*IN*/ POOL_TYPE PoolType); NTOSAPI NTSTATUS DDKAPI SeDeassignSecurity( /*IN OUT*/ PSECURITY_DESCRIPTOR *SecurityDescriptor); NTOSAPI BOOLEAN DDKAPI SeSinglePrivilegeCheck( LUID PrivilegeValue, KPROCESSOR_MODE PreviousMode); NTOSAPI BOOLEAN DDKAPI SeValidSecurityDescriptor( /*IN*/ ULONG Length, /*IN*/ PSECURITY_DESCRIPTOR SecurityDescriptor); /** NtXxx routines **/ NTOSAPI NTSTATUS DDKAPI NtOpenProcess( /*OUT*/ PHANDLE ProcessHandle, /*IN*/ ACCESS_MASK DesiredAccess, /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes, /*IN*/ PCLIENT_ID ClientId /*OPTIONAL*/); NTOSAPI NTSTATUS DDKAPI NtQueryInformationProcess( /*IN*/ HANDLE ProcessHandle, /*IN*/ PROCESSINFOCLASS ProcessInformationClass, /*OUT*/ PVOID ProcessInformation, /*IN*/ ULONG ProcessInformationLength, /*OUT*/ PULONG ReturnLength /*OPTIONAL*/); /** NtXxx and ZwXxx routines **/ NTOSAPI NTSTATUS DDKAPI ZwCancelTimer( /*IN*/ HANDLE TimerHandle, /*OUT*/ PBOOLEAN CurrentState /*OPTIONAL*/); NTOSAPI NTSTATUS DDKAPI NtClose( /*IN*/ HANDLE Handle); NTOSAPI NTSTATUS DDKAPI ZwClose( /*IN*/ HANDLE Handle); NTOSAPI NTSTATUS DDKAPI ZwCreateDirectoryObject( /*OUT*/ PHANDLE DirectoryHandle, /*IN*/ ACCESS_MASK DesiredAccess, /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes); NTOSAPI NTSTATUS DDKAPI NtCreateEvent( /*OUT*/ PHANDLE EventHandle, /*IN*/ ACCESS_MASK DesiredAccess, /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes, /*IN*/ BOOLEAN ManualReset, /*IN*/ BOOLEAN InitialState); NTOSAPI NTSTATUS DDKAPI ZwCreateEvent( /*OUT*/ PHANDLE EventHandle, /*IN*/ ACCESS_MASK DesiredAccess, /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes, /*IN*/ BOOLEAN ManualReset, /*IN*/ BOOLEAN InitialState); NTOSAPI NTSTATUS DDKAPI ZwCreateFile( /*OUT*/ PHANDLE FileHandle, /*IN*/ ACCESS_MASK DesiredAccess, /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes, /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock, /*IN*/ PLARGE_INTEGER AllocationSize /*OPTIONAL*/, /*IN*/ ULONG FileAttributes, /*IN*/ ULONG ShareAccess, /*IN*/ ULONG CreateDisposition, /*IN*/ ULONG CreateOptions, /*IN*/ PVOID EaBuffer /*OPTIONAL*/, /*IN*/ ULONG EaLength); NTOSAPI NTSTATUS DDKAPI ZwCreateKey( /*OUT*/ PHANDLE KeyHandle, /*IN*/ ACCESS_MASK DesiredAccess, /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes, /*IN*/ ULONG TitleIndex, /*IN*/ PUNICODE_STRING Class /*OPTIONAL*/, /*IN*/ ULONG CreateOptions, /*OUT*/ PULONG Disposition /*OPTIONAL*/); NTOSAPI NTSTATUS DDKAPI ZwCreateTimer( /*OUT*/ PHANDLE TimerHandle, /*IN*/ ACCESS_MASK DesiredAccess, /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes /*OPTIONAL*/, /*IN*/ TIMER_TYPE TimerType); NTOSAPI NTSTATUS DDKAPI ZwDeleteKey( /*IN*/ HANDLE KeyHandle); NTOSAPI NTSTATUS DDKAPI ZwDeleteValueKey( /*IN*/ HANDLE KeyHandle, /*IN*/ PUNICODE_STRING ValueName); NTOSAPI NTSTATUS DDKAPI NtDeviceIoControlFile( /*IN*/ HANDLE DeviceHandle, /*IN*/ HANDLE Event /*OPTIONAL*/, /*IN*/ PIO_APC_ROUTINE UserApcRoutine /*OPTIONAL*/, /*IN*/ PVOID UserApcContext /*OPTIONAL*/, /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock, /*IN*/ ULONG IoControlCode, /*IN*/ PVOID InputBuffer, /*IN*/ ULONG InputBufferSize, /*OUT*/ PVOID OutputBuffer, /*IN*/ ULONG OutputBufferSize); NTOSAPI NTSTATUS DDKAPI ZwDeviceIoControlFile( /*IN*/ HANDLE DeviceHandle, /*IN*/ HANDLE Event /*OPTIONAL*/, /*IN*/ PIO_APC_ROUTINE UserApcRoutine /*OPTIONAL*/, /*IN*/ PVOID UserApcContext /*OPTIONAL*/, /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock, /*IN*/ ULONG IoControlCode, /*IN*/ PVOID InputBuffer, /*IN*/ ULONG InputBufferSize, /*OUT*/ PVOID OutputBuffer, /*IN*/ ULONG OutputBufferSize); NTOSAPI NTSTATUS DDKAPI ZwEnumerateKey( /*IN*/ HANDLE KeyHandle, /*IN*/ ULONG Index, /*IN*/ KEY_INFORMATION_CLASS KeyInformationClass, /*OUT*/ PVOID KeyInformation, /*IN*/ ULONG Length, /*OUT*/ PULONG ResultLength); NTOSAPI NTSTATUS DDKAPI ZwEnumerateValueKey( /*IN*/ HANDLE KeyHandle, /*IN*/ ULONG Index, /*IN*/ KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, /*OUT*/ PVOID KeyValueInformation, /*IN*/ ULONG Length, /*OUT*/ PULONG ResultLength); NTOSAPI NTSTATUS DDKAPI ZwFlushKey( /*IN*/ HANDLE KeyHandle); NTOSAPI NTSTATUS DDKAPI ZwMakeTemporaryObject( /*IN*/ HANDLE Handle); NTOSAPI NTSTATUS DDKAPI NtMapViewOfSection( /*IN*/ HANDLE SectionHandle, /*IN*/ HANDLE ProcessHandle, /*IN OUT*/ PVOID *BaseAddress, /*IN*/ ULONG ZeroBits, /*IN*/ ULONG CommitSize, /*IN OUT*/ PLARGE_INTEGER SectionOffset /*OPTIONAL*/, /*IN OUT*/ PSIZE_T ViewSize, /*IN*/ SECTION_INHERIT InheritDisposition, /*IN*/ ULONG AllocationType, /*IN*/ ULONG Protect); NTOSAPI NTSTATUS DDKAPI ZwMapViewOfSection( /*IN*/ HANDLE SectionHandle, /*IN*/ HANDLE ProcessHandle, /*IN OUT*/ PVOID *BaseAddress, /*IN*/ ULONG ZeroBits, /*IN*/ ULONG CommitSize, /*IN OUT*/ PLARGE_INTEGER SectionOffset /*OPTIONAL*/, /*IN OUT*/ PSIZE_T ViewSize, /*IN*/ SECTION_INHERIT InheritDisposition, /*IN*/ ULONG AllocationType, /*IN*/ ULONG Protect); NTOSAPI NTSTATUS DDKAPI NtOpenFile( /*OUT*/ PHANDLE FileHandle, /*IN*/ ACCESS_MASK DesiredAccess, /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes, /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock, /*IN*/ ULONG ShareAccess, /*IN*/ ULONG OpenOptions); NTOSAPI NTSTATUS DDKAPI ZwOpenFile( /*OUT*/ PHANDLE FileHandle, /*IN*/ ACCESS_MASK DesiredAccess, /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes, /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock, /*IN*/ ULONG ShareAccess, /*IN*/ ULONG OpenOptions); NTOSAPI NTSTATUS DDKAPI ZwOpenKey( /*OUT*/ PHANDLE KeyHandle, /*IN*/ ACCESS_MASK DesiredAccess, /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes); NTOSAPI NTSTATUS DDKAPI ZwOpenSection( /*OUT*/ PHANDLE SectionHandle, /*IN*/ ACCESS_MASK DesiredAccess, /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes); NTOSAPI NTSTATUS DDKAPI ZwOpenSymbolicLinkObject( /*OUT*/ PHANDLE LinkHandle, /*IN*/ ACCESS_MASK DesiredAccess, /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes); NTOSAPI NTSTATUS DDKAPI ZwOpenTimer( /*OUT*/ PHANDLE TimerHandle, /*IN*/ ACCESS_MASK DesiredAccess, /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes); NTOSAPI NTSTATUS DDKAPI ZwQueryInformationFile( /*IN*/ HANDLE FileHandle, /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock, /*OUT*/ PVOID FileInformation, /*IN*/ ULONG Length, /*IN*/ FILE_INFORMATION_CLASS FileInformationClass); NTOSAPI NTSTATUS DDKAPI ZwQueryKey( /*IN*/ HANDLE KeyHandle, /*IN*/ KEY_INFORMATION_CLASS KeyInformationClass, /*OUT*/ PVOID KeyInformation, /*IN*/ ULONG Length, /*OUT*/ PULONG ResultLength); NTOSAPI NTSTATUS DDKAPI ZwQuerySymbolicLinkObject( /*IN*/ HANDLE LinkHandle, /*IN OUT*/ PUNICODE_STRING LinkTarget, /*OUT*/ PULONG ReturnedLength /*OPTIONAL*/); NTOSAPI NTSTATUS DDKAPI ZwQueryValueKey( /*IN*/ HANDLE KeyHandle, /*IN*/ PUNICODE_STRING ValueName, /*IN*/ KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, /*OUT*/ PVOID KeyValueInformation, /*IN*/ ULONG Length, /*OUT*/ PULONG ResultLength); NTOSAPI NTSTATUS DDKAPI NtReadFile( /*IN*/ HANDLE FileHandle, /*IN*/ HANDLE Event /*OPTIONAL*/, /*IN*/ PIO_APC_ROUTINE ApcRoutine /*OPTIONAL*/, /*IN*/ PVOID ApcContext /*OPTIONAL*/, /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock, /*OUT*/ PVOID Buffer, /*IN*/ ULONG Length, /*IN*/ PLARGE_INTEGER ByteOffset /*OPTIONAL*/, /*IN*/ PULONG Key /*OPTIONAL*/); NTOSAPI NTSTATUS DDKAPI ZwReadFile( /*IN*/ HANDLE FileHandle, /*IN*/ HANDLE Event /*OPTIONAL*/, /*IN*/ PIO_APC_ROUTINE ApcRoutine /*OPTIONAL*/, /*IN*/ PVOID ApcContext /*OPTIONAL*/, /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock, /*OUT*/ PVOID Buffer, /*IN*/ ULONG Length, /*IN*/ PLARGE_INTEGER ByteOffset /*OPTIONAL*/, /*IN*/ PULONG Key /*OPTIONAL*/); NTOSAPI NTSTATUS DDKAPI NtSetEvent( /*IN*/ HANDLE EventHandle, /*IN*/ PULONG NumberOfThreadsReleased); NTOSAPI NTSTATUS DDKAPI ZwSetEvent( /*IN*/ HANDLE EventHandle, /*IN*/ PULONG NumberOfThreadsReleased); NTOSAPI NTSTATUS DDKAPI ZwSetInformationFile( /*IN*/ HANDLE FileHandle, /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock, /*IN*/ PVOID FileInformation, /*IN*/ ULONG Length, /*IN*/ FILE_INFORMATION_CLASS FileInformationClass); NTOSAPI NTSTATUS DDKAPI ZwSetInformationThread( /*IN*/ HANDLE ThreadHandle, /*IN*/ THREADINFOCLASS ThreadInformationClass, /*IN*/ PVOID ThreadInformation, /*IN*/ ULONG ThreadInformationLength); NTOSAPI NTSTATUS DDKAPI ZwSetTimer( /*IN*/ HANDLE TimerHandle, /*IN*/ PLARGE_INTEGER DueTime, /*IN*/ PTIMER_APC_ROUTINE TimerApcRoutine /*OPTIONAL*/, /*IN*/ PVOID TimerContext /*OPTIONAL*/, /*IN*/ BOOLEAN WakeTimer, /*IN*/ LONG Period /*OPTIONAL*/, /*OUT*/ PBOOLEAN PreviousState /*OPTIONAL*/); NTOSAPI NTSTATUS DDKAPI ZwSetValueKey( /*IN*/ HANDLE KeyHandle, /*IN*/ PUNICODE_STRING ValueName, /*IN*/ ULONG TitleIndex /*OPTIONAL*/, /*IN*/ ULONG Type, /*IN*/ PVOID Data, /*IN*/ ULONG DataSize); /* [Nt|Zw]MapViewOfSection.InheritDisposition constants */ #define AT_EXTENDABLE_FILE 0x00002000 #define SEC_NO_CHANGE 0x00400000 #define AT_RESERVED 0x20000000 #define AT_ROUND_TO_PAGE 0x40000000 NTOSAPI NTSTATUS DDKAPI NtUnmapViewOfSection( /*IN*/ HANDLE ProcessHandle, /*IN*/ PVOID BaseAddress); NTOSAPI NTSTATUS DDKAPI ZwUnmapViewOfSection( /*IN*/ HANDLE ProcessHandle, /*IN*/ PVOID BaseAddress); NTOSAPI NTSTATUS DDKAPI NtWaitForSingleObject( /*IN*/ HANDLE Object, /*IN*/ BOOLEAN Alertable, /*IN*/ PLARGE_INTEGER Time); NTOSAPI NTSTATUS DDKAPI ZwWaitForSingleObject( /*IN*/ HANDLE Object, /*IN*/ BOOLEAN Alertable, /*IN*/ PLARGE_INTEGER Time); NTOSAPI NTSTATUS DDKAPI NtWriteFile( /*IN*/ HANDLE FileHandle, /*IN*/ HANDLE Event /*OPTIONAL*/, /*IN*/ PIO_APC_ROUTINE ApcRoutine /*OPTIONAL*/, /*IN*/ PVOID ApcContext /*OPTIONAL*/, /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock, /*IN*/ PVOID Buffer, /*IN*/ ULONG Length, /*IN*/ PLARGE_INTEGER ByteOffset /*OPTIONAL*/, /*IN*/ PULONG Key /*OPTIONAL*/); NTOSAPI NTSTATUS DDKAPI ZwWriteFile( /*IN*/ HANDLE FileHandle, /*IN*/ HANDLE Event /*OPTIONAL*/, /*IN*/ PIO_APC_ROUTINE ApcRoutine /*OPTIONAL*/, /*IN*/ PVOID ApcContext /*OPTIONAL*/, /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock, /*IN*/ PVOID Buffer, /*IN*/ ULONG Length, /*IN*/ PLARGE_INTEGER ByteOffset /*OPTIONAL*/, /*IN*/ PULONG Key /*OPTIONAL*/); /** Power management support routines **/ NTOSAPI NTSTATUS DDKAPI PoCallDriver( /*IN*/ PDEVICE_OBJECT DeviceObject, /*IN OUT*/ PIRP Irp); NTOSAPI PULONG DDKAPI PoRegisterDeviceForIdleDetection( /*IN*/ PDEVICE_OBJECT DeviceObject, /*IN*/ ULONG ConservationIdleTime, /*IN*/ ULONG PerformanceIdleTime, /*IN*/ DEVICE_POWER_STATE State); NTOSAPI PVOID DDKAPI PoRegisterSystemState( /*IN*/ PVOID StateHandle, /*IN*/ EXECUTION_STATE Flags); NTOSAPI NTSTATUS DDKAPI PoRequestPowerIrp( /*IN*/ PDEVICE_OBJECT DeviceObject, /*IN*/ UCHAR MinorFunction, /*IN*/ POWER_STATE PowerState, /*IN*/ PREQUEST_POWER_COMPLETE CompletionFunction, /*IN*/ PVOID Context, /*OUT*/ PIRP *Irp /*OPTIONAL*/); NTOSAPI NTSTATUS DDKAPI PoRequestShutdownEvent( /*OUT*/ PVOID *Event); NTOSAPI VOID DDKAPI PoSetDeviceBusy( PULONG IdlePointer); NTOSAPI POWER_STATE DDKAPI PoSetPowerState( /*IN*/ PDEVICE_OBJECT DeviceObject, /*IN*/ POWER_STATE_TYPE Type, /*IN*/ POWER_STATE State); NTOSAPI VOID DDKAPI PoSetSystemState( /*IN*/ EXECUTION_STATE Flags); NTOSAPI VOID DDKAPI PoStartNextPowerIrp( /*IN*/ PIRP Irp); NTOSAPI VOID DDKAPI PoUnregisterSystemState( /*IN*/ PVOID StateHandle); /** WMI library support routines **/ NTOSAPI NTSTATUS DDKAPI WmiCompleteRequest( /*IN*/ PDEVICE_OBJECT DeviceObject, /*IN*/ PIRP Irp, /*IN*/ NTSTATUS Status, /*IN*/ ULONG BufferUsed, /*IN*/ CCHAR PriorityBoost); NTOSAPI NTSTATUS DDKAPI WmiFireEvent( /*IN*/ PDEVICE_OBJECT DeviceObject, /*IN*/ LPGUID Guid, /*IN*/ ULONG InstanceIndex, /*IN*/ ULONG EventDataSize, /*IN*/ PVOID EventData); NTOSAPI NTSTATUS DDKAPI WmiQueryTraceInformation( /*IN*/ TRACE_INFORMATION_CLASS TraceInformationClass, /*OUT*/ PVOID TraceInformation, /*IN*/ ULONG TraceInformationLength, /*OUT*/ PULONG RequiredLength /*OPTIONAL*/, /*IN*/ PVOID Buffer /*OPTIONAL*/); NTOSAPI NTSTATUS DDKAPI WmiSystemControl( /*IN*/ PWMILIB_CONTEXT WmiLibInfo, /*IN*/ PDEVICE_OBJECT DeviceObject, /*IN*/ PIRP Irp, /*OUT*/ PSYSCTL_IRP_DISPOSITION IrpDisposition); NTOSAPI NTSTATUS DDKCDECLAPI WmiTraceMessage( /*IN*/ TRACEHANDLE LoggerHandle, /*IN*/ ULONG MessageFlags, /*IN*/ LPGUID MessageGuid, /*IN*/ USHORT MessageNumber, /*IN*/ ...); #if 0 /* FIXME: Get va_list from where? */ NTOSAPI NTSTATUS DDKCDECLAPI WmiTraceMessageVa( /*IN*/ TRACEHANDLE LoggerHandle, /*IN*/ ULONG MessageFlags, /*IN*/ LPGUID MessageGuid, /*IN*/ USHORT MessageNumber, /*IN*/ va_list MessageArgList); #endif /** Kernel debugger routines **/ NTOSAPI VOID DDKAPI KdDisableDebugger( VOID); NTOSAPI VOID DDKAPI KdEnableDebugger( VOID); NTOSAPI VOID DDKAPI DbgBreakPoint( VOID); NTOSAPI VOID DDKAPI DbgBreakPointWithStatus( /*IN*/ ULONG Status); NTOSAPI ULONG DDKCDECLAPI DbgPrint( /*IN*/ PCH Format, /*IN*/ ...); NTOSAPI ULONG DDKCDECLAPI DbgPrintEx( /*IN*/ ULONG ComponentId, /*IN*/ ULONG Level, /*IN*/ PCH Format, /*IN*/ ...); NTOSAPI ULONG DDKCDECLAPI DbgPrintReturnControlC( /*IN*/ PCH Format, /*IN*/ ...); NTOSAPI NTSTATUS DDKAPI DbgQueryDebugFilterState( /*IN*/ ULONG ComponentId, /*IN*/ ULONG Level); NTOSAPI NTSTATUS DDKAPI DbgSetDebugFilterState( /*IN*/ ULONG ComponentId, /*IN*/ ULONG Level, /*IN*/ BOOLEAN State); #ifdef DBG #define KdPrint(_x_) DbgPrint _x_ #define KdPrintEx(_x_) DbgPrintEx _x_ #define KdBreakPoint() DbgBreakPoint() #define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s) #else /* !DBG */ #define KdPrint(_x_) #define KdPrintEx(_x_) #define KdBreakPoint() #define KdBreakPointWithStatus(s) #endif /* !DBG */ extern NTOSAPI PBOOLEAN KdDebuggerNotPresent; extern NTOSAPI PBOOLEAN KdDebuggerEnabled; #define KD_DEBUGGER_ENABLED *KdDebuggerEnabled #define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent #ifdef __cplusplus } #endif #endif /* __WINDDK_H */