newlib-cygwin/winsup/w32api/include/ddk/winddk.h

9250 lines
208 KiB
C

/*
* winddk.h
*
* Windows Device Driver Kit
*
* This file is part of the w32api package.
*
* Contributors:
* Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
*
* 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 <pshpack1.h>
typedef struct _EISA_MEMORY_CONFIGURATION {
EISA_MEMORY_TYPE ConfigurationByte;
UCHAR DataSize;
USHORT AddressLowWord;
UCHAR AddressHighByte;
USHORT MemorySize;
} EISA_MEMORY_CONFIGURATION, *PEISA_MEMORY_CONFIGURATION;
#include <poppack.h>
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 <pshpack1.h>
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 <poppack.h>
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 <pshpack1.h>
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 <poppack.h>
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 <pshpack4.h>
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 <poppack.h>
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 <pshpack4.h>
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 <poppack.h>
/* 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()->ProcessorNumber)
#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*/ PLONG VOLATILE Addend);
NTOSAPI
LONG
DDKFASTAPI
InterlockedDecrement(
/*IN*/ PLONG 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);
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
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);
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*/);
#if defined(_X86_)
NTOSAPI
VOID
FASTCALL
KfLowerIrql(
/*IN*/ KIRQL NewIrql);
NTOSAPI
KIRQL
FASTCALL
KfRaiseIrql(
/*IN*/ KIRQL NewIrql);
#define KeLowerIrql(a) KfLowerIrql(a)
#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
#else
NTOSAPI
VOID
DDKAPI
KeLowerIrql(
/*IN*/ KIRQL NewIrql);
NTOSAPI
KIRQL
DDKAPI
KeRaiseIrql(
/*IN*/ KIRQL NewIrql);
#endif
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 */