📄 vscsidisk.h
字号:
// VScsiDisk.h
//
// Generated by C DriverWizard 3.2.0 (Build 2485)
// Requires DDK Only
// File created on 5/18/2005
//
#ifndef __VSCSIDISK_H__
#define __VSCSIDISK_H__
// {655B51AC-B4A6-4ef7-A202-E3D80DAFAC73}
DEFINE_GUID(GUID_OSM_MINIPORT,
0x655b51ac, 0xb4a6, 0x4ef7, 0xa2, 0x2, 0xe3, 0xd8, 0xd, 0xaf, 0xac, 0x73);
// 0x4D36E97B, 0xE325, 0x11CE, 0xBF, 0xC1,0x08, 0x00,0x2B, 0xE1, 0x03, 0x18);
//define by zhu
#define BUS_FDO_NAME L"\\Device\\Virtual OSM MiniPort"
// device text
#define BUS_DEVICETEXT L"Virtual OSM MiniPort\0"
// device id
#define BUS_DEVICE_ID L"PCI\\Virtual OSM MiniPort\0\0"
// hardware id
#define BUS_HARDWARE_ID L"*Virtual OSM MiniPort\0PCI\\Virtual OSM MiniPort\0\0"
// compatible id
#define BUS_COMPATIBLE_ID L"GEN_SCSIADAPTER\0\0"
// Memory allocation pool tag
#define VSCSIDISK_POOL_TAG 'zeal'
// Make all pool allocations tagged
#undef ExAllocatePool
#define ExAllocatePool(type, size) \
ExAllocatePoolWithTag(type, size, VSCSIDISK_POOL_TAG);
// queue start io callback
typedef VOID (*PVSCSIDISK_QUEUE_STARTIO)(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
// irp queue type definition
typedef struct _VSCSIDISK_QUEUE
{
PVSCSIDISK_QUEUE_STARTIO StartIoRoutine;
PDEVICE_OBJECT DeviceObject;
LIST_ENTRY IrpQueue;
KSPIN_LOCK QueueLock;
PIRP CurrentIrp;
KEVENT StopEvent;
LONG StallCount;
NTSTATUS ErrorStatus;
KDPC VScsiDiskStartIoDpc;
BOOLEAN bUseVScsiDiskStartIoDpc;
} VSCSIDISK_QUEUE, *PVSCSIDISK_QUEUE;
// cancel-safe irp list type definition
typedef struct _VSCSIDISK_LIST
{
PDEVICE_OBJECT DeviceObject;
LIST_ENTRY IrpList;
KSPIN_LOCK ListLock;
NTSTATUS ErrorStatus;
} VSCSIDISK_LIST, *PVSCSIDISK_LIST;
// stall IRP list to syncronize Pnp, Power with
// the rest of IO
typedef struct _VSCSIDISK_IO_LOCK
{
PDEVICE_OBJECT DeviceObject; // our device object
KEVENT StallCompleteEvent; // io stalled event
LIST_ENTRY StallIrpList; // stalled irps
KSPIN_LOCK IoLock; // spin lock to syncronize io with stall/unstall
LONG StallCount; // number of times stall was requested
LONG ActiveIrpCount; // number of oustanding, not-stalled IRPs
NTSTATUS ErrorStatus;
PIRP CurrentIrp; // used by unstall code
} VSCSIDISK_IO_LOCK, *PVSCSIDISK_IO_LOCK;
// global (per driver) data block
typedef struct _VSCSIDISK_DATA
{
UNICODE_STRING RegistryPath; // saved registry path
ULONG InstanceCount; // FDO instance count
USHORT WdmVersion; // os version
} VSCSIDISK_DATA, *PVSCSIDISK_DATA;
extern VSCSIDISK_DATA g_Data;
// PnP states
typedef enum _VSCSIDISK_PNP_STATE
{
PnpStateNotStarted = 0,
PnpStateStarted,
PnpStateStopPending,
PnpStateStopped,
PnpStateRemovePending,
PnpStateRemoved,
PnpStateSurpriseRemoved
} VSCSIDISK_PNP_STATE;
// common part of device extension for FDOs and PDOs
typedef struct _VSCSIDISK_COMMON_DEVICE_EXTENSION
{
BOOLEAN IsPdo;
} VSCSIDISK_COMMON_DEVICE_EXTENSION, *PVSCSIDISK_COMMON_DEVICE_EXTENSION;
__inline BOOLEAN VScsiDiskIsPdo(
IN PDEVICE_OBJECT DeviceObject
)
{
PVSCSIDISK_COMMON_DEVICE_EXTENSION commonExtension;
commonExtension = (PVSCSIDISK_COMMON_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
return commonExtension->IsPdo;
}
typedef struct _VSCSIDISK_PDO_DEVICE_EXTENSION
#ifdef __cplusplus
: VSCSIDISK_COMMON_DEVICE_EXTENSION
{
#else
{
VSCSIDISK_COMMON_DEVICE_EXTENSION;
#endif
PDEVICE_OBJECT DeviceObject; // pointer to the DeviceObject
PDEVICE_OBJECT ParentDeviceObject; // pointer to parent FDO
VSCSIDISK_PNP_STATE PnpState; // PnP state variable
VSCSIDISK_PNP_STATE PreviousPnpState; // Previous PnP state variable
SYSTEM_POWER_STATE SystemPowerState; // current system power state
DEVICE_POWER_STATE DevicePowerState; // current device power state
LIST_ENTRY PdoListEntry; // list entry to keep track of all PDOs
BOOLEAN IsExist; // TRUE, if device is physically present on a bus
BOOLEAN DeleteOnRemove; // TRUE, if device has been reported missing to the OS
PWCHAR HardwareId; // MULTI_SZ array of hardware ids
ULONG DeviceId; // unique device id
} VSCSIDISK_PDO_DEVICE_EXTENSION, *PVSCSIDISK_PDO_DEVICE_EXTENSION;
// The device extension for the device object
typedef struct _VSCSIDISK_DEVICE_EXTENSION
#ifdef __cplusplus
: VSCSIDISK_COMMON_DEVICE_EXTENSION
{
#else
{
VSCSIDISK_COMMON_DEVICE_EXTENSION;
#endif
PDEVICE_OBJECT DeviceObject; // pointer to the DeviceObject
PDEVICE_OBJECT PhysicalDeviceObject; // underlying PDO
PDEVICE_OBJECT LowerDeviceObject; // top of the device stack
LIST_ENTRY PdoListHead; // list of all PDOs
FAST_MUTEX PdoListLock; // fast mutex to protect PdoList
LONG RemoveCount; // 1-based reference count
KEVENT RemoveEvent; // event to sync device removal
VSCSIDISK_IO_LOCK IoLock; // misc io lock
VSCSIDISK_PNP_STATE PnpState; // PnP state variable
VSCSIDISK_PNP_STATE PreviousPnpState; // Previous PnP state variable
SYSTEM_POWER_STATE SystemPowerState; // current system power state
DEVICE_POWER_STATE DevicePowerState; // current device power state
DEVICE_CAPABILITIES DeviceCaps; // device capabilities used to get S to D mappings
PIRP SystemPowerIrp; // Storage for system IRP during power transitions
PIRP DevicePowerIrp; // Storage for device IRP during power transitions
PIO_WORKITEM PowerWorkItem; // Work item used for power transitions
LONG bPowerStop; // Flag to signal that power code stopped io
LONG OpenHandleCount;
} VSCSIDISK_DEVICE_EXTENSION, *PVSCSIDISK_DEVICE_EXTENSION;
#ifdef __cplusplus
extern "C"
{
#endif
NTSTATUS __stdcall DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
);
NTSTATUS __stdcall VScsiDiskAddDevice(
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT PhysicalDeviceObject
);
VOID __stdcall VScsiDiskUnload(
IN PDRIVER_OBJECT DriverObject
);
NTSTATUS __stdcall VScsiDiskPnpDispatch(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS __stdcall VScsiDiskPowerDispatch(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS __stdcall VScsiDiskDeviceIoControlDispatch(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS __stdcall VScsiDiskInternalDeviceIoControlDispatch(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS __stdcall VScsiDiskCreateDispatch(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS __stdcall VScsiDiskCloseDispatch(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS __stdcall VScsiDiskCleanupDispatch(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS __stdcall VScsiDiskSystemControlDispatch(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
///////////////////////////////////////////////////////////////////////////////////////////////////
// Queue Functions
///////////////////////////////////////////////////////////////////////////////////////////////////
VOID VScsiDiskInitializeQueue(
IN PVSCSIDISK_QUEUE QueueExtension,
IN PVSCSIDISK_QUEUE_STARTIO StartIoRoutine,
IN PDEVICE_OBJECT DeviceObject,
IN BOOLEAN bUseVScsiDiskStartIoDpc
);
NTSTATUS VScsiDiskQueueIrp(
IN PVSCSIDISK_QUEUE QueueExtension,
IN PIRP Irp
);
VOID VScsiDiskStartNext(
IN PVSCSIDISK_QUEUE QueueExtension
);
VOID VScsiDiskFlushQueue(
IN PVSCSIDISK_QUEUE QueueExtension,
IN PFILE_OBJECT FileObject
);
VOID VScsiDiskInvalidateQueue(
IN PVSCSIDISK_QUEUE Queue,
IN NTSTATUS ErrorStatus
);
VOID VScsiDiskPauseQueue(
IN PVSCSIDISK_QUEUE QueueExtension
);
VOID VScsiDiskRestartQueue(
IN PVSCSIDISK_QUEUE QueueExtension
);
VOID VScsiDiskStartIoDpc(
IN PKDPC Dpc,
IN PVOID Context,
IN PVOID Unused1,
IN PVOID Unused2
);
VOID VScsiDiskQueueCancelRoutine(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
///////////////////////////////////////////////////////////////////////////////////////////////////
// List functions
///////////////////////////////////////////////////////////////////////////////////////////////////
VOID VScsiDiskInitializeList(
IN PVSCSIDISK_LIST List,
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS VScsiDiskInsertHead(
IN PVSCSIDISK_LIST List,
IN PIRP Irp
);
NTSTATUS VScsiDiskInsertTail(
IN PVSCSIDISK_LIST List,
IN PIRP Irp
);
PIRP VScsiDiskRemoveHead(
IN PVSCSIDISK_LIST List
);
PIRP VScsiDiskRemoveTail(
IN PVSCSIDISK_LIST List
);
VOID VScsiDiskFlushList(
IN PVSCSIDISK_LIST List,
IN PFILE_OBJECT FileObject
);
VOID VScsiDiskInvalidateList(
IN PVSCSIDISK_LIST List,
IN NTSTATUS ErrorStatus
);
VOID VScsiDiskListCancelRoutine(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
///////////////////////////////////////////////////////////////////////////////////////////////////
// VSCSIDISK_IO_LOCK
///////////////////////////////////////////////////////////////////////////////////////////////////
VOID VScsiDiskInitializeIoLock(
IN PVSCSIDISK_IO_LOCK IoLock,
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS VScsiDiskCheckIoLock(
IN PVSCSIDISK_IO_LOCK IoLock,
IN PIRP Irp
);
VOID VScsiDiskPendingIoCancelRoutine(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS VScsiDiskIncrementIoCount(
IN PVSCSIDISK_IO_LOCK IoLock
);
VOID VScsiDiskDecrementIoCount(
IN PVSCSIDISK_IO_LOCK IoLock
);
VOID VScsiDiskLockIo(
IN PVSCSIDISK_IO_LOCK IoLock
);
VOID VScsiDiskWaitForStopIo(
IN PVSCSIDISK_IO_LOCK IoLock
);
VOID VScsiDiskUnlockIo(
IN PVSCSIDISK_IO_LOCK IoLock
);
VOID VScsiDiskFlushPendingIo(
IN PVSCSIDISK_IO_LOCK IoLock,
IN PFILE_OBJECT FileObject
);
VOID VScsiDiskInvalidateIo(
IN PVSCSIDISK_IO_LOCK IoLock,
IN NTSTATUS ErrorStatus
);
#ifdef __cplusplus
}
#endif
BOOLEAN VScsiDiskIsStoppable(
IN PVSCSIDISK_DEVICE_EXTENSION DeviceExtension
);
BOOLEAN VScsiDiskIsRemovable(
IN PVSCSIDISK_DEVICE_EXTENSION DeviceExtension
);
BOOLEAN VScsiDiskAcquireRemoveLock(
IN PVSCSIDISK_DEVICE_EXTENSION DeviceExtension
);
VOID VScsiDiskReleaseRemoveLock(
IN PVSCSIDISK_DEVICE_EXTENSION DeviceExtension
);
VOID VScsiDiskWaitForSafeRemove(
IN PVSCSIDISK_DEVICE_EXTENSION DeviceExtension
);
NTSTATUS VScsiDiskSubmitIrpSync(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
VOID VScsiDiskStallQueues(
IN PVSCSIDISK_DEVICE_EXTENSION DeviceExtension
);
VOID VScsiDiskRestartQueues(
IN PVSCSIDISK_DEVICE_EXTENSION DeviceExtension
);
VOID VScsiDiskFlushQueues(
IN PVSCSIDISK_DEVICE_EXTENSION DeviceExtension,
IN PFILE_OBJECT FileObject
);
///////////////////////////////////////////////////////////////////////////////////////////////////
// Pnp
///////////////////////////////////////////////////////////////////////////////////////////////////
// define this PnP IRP. This IRP is only defined in ntddk.h normally
#if !defined(IRP_MN_QUERY_LEGACY_BUS_INFORMATION)
#define IRP_MN_QUERY_LEGACY_BUS_INFORMATION 0x18
#endif // IRP_MN_QUERY_LEGACY_BUS_INFORMATION
NTSTATUS VScsiDiskStartDevice(
IN PVSCSIDISK_DEVICE_EXTENSION DeviceExtension,
IN PIRP Irp
);
NTSTATUS VScsiDiskFreeResources(
IN PVSCSIDISK_DEVICE_EXTENSION DeviceExtension
);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -