⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vscsidisk.h

📁 虚拟Scsi Disk源程序 版权归原作者
💻 H
📖 第 1 页 / 共 2 页
字号:
// 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 + -