374 lines
5.9 KiB
C
374 lines
5.9 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1991 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
class.h
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
These are the structures and defines that are used in the
|
|||
|
SCSI class drivers.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Mike Glass (mglass)
|
|||
|
Jeff Havens (jhavens)
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#ifndef _CLASS_
|
|||
|
|
|||
|
#include <ntdddisk.h>
|
|||
|
#include <ntddcdrm.h>
|
|||
|
#include <ntddtape.h>
|
|||
|
#include <ntddchgr.h>
|
|||
|
#include <ntddstor.h>
|
|||
|
#include "ntddscsi.h"
|
|||
|
#include <stdio.h>
|
|||
|
|
|||
|
// begin_ntminitape
|
|||
|
|
|||
|
#if DBG
|
|||
|
|
|||
|
#define DebugPrint(x) ScsiDebugPrint x
|
|||
|
|
|||
|
#else
|
|||
|
|
|||
|
#define DebugPrint(x)
|
|||
|
|
|||
|
#endif // DBG
|
|||
|
|
|||
|
// end_ntminitape
|
|||
|
|
|||
|
#ifdef POOL_TAGGING
|
|||
|
#undef ExAllocatePool
|
|||
|
#undef ExAllocatePoolWithQuota
|
|||
|
#define ExAllocatePool(a,b) ExAllocatePoolWithTag(a,b,'HscS')
|
|||
|
#define ExAllocatePoolWithQuota(a,b) ExAllocatePoolWithQuotaTag(a,b,'HscS')
|
|||
|
#endif
|
|||
|
|
|||
|
#define MAXIMUM_RETRIES 4
|
|||
|
|
|||
|
typedef
|
|||
|
VOID
|
|||
|
(*PCLASS_ERROR) (
|
|||
|
IN PDEVICE_OBJECT DeviceObject,
|
|||
|
IN PSCSI_REQUEST_BLOCK Srb,
|
|||
|
IN OUT NTSTATUS *Status,
|
|||
|
IN OUT BOOLEAN *Retry
|
|||
|
);
|
|||
|
|
|||
|
typedef struct _DEVICE_EXTENSION {
|
|||
|
|
|||
|
//
|
|||
|
// Back pointer to device object
|
|||
|
//
|
|||
|
|
|||
|
PDEVICE_OBJECT DeviceObject;
|
|||
|
|
|||
|
//
|
|||
|
// Pointer to port device object
|
|||
|
//
|
|||
|
|
|||
|
PDEVICE_OBJECT PortDeviceObject;
|
|||
|
|
|||
|
//
|
|||
|
// Length of partition in bytes
|
|||
|
//
|
|||
|
|
|||
|
LARGE_INTEGER PartitionLength;
|
|||
|
|
|||
|
//
|
|||
|
// Number of bytes before start of partition
|
|||
|
//
|
|||
|
|
|||
|
LARGE_INTEGER StartingOffset;
|
|||
|
|
|||
|
//
|
|||
|
// Bytes to skew all requests, since DM Driver has been placed on an IDE drive.
|
|||
|
//
|
|||
|
|
|||
|
ULONG DMByteSkew;
|
|||
|
|
|||
|
//
|
|||
|
// Sectors to skew all requests.
|
|||
|
//
|
|||
|
|
|||
|
ULONG DMSkew;
|
|||
|
|
|||
|
//
|
|||
|
// Flag to indicate whether DM driver has been located on an IDE drive.
|
|||
|
//
|
|||
|
|
|||
|
BOOLEAN DMActive;
|
|||
|
|
|||
|
//
|
|||
|
// Pointer to the specific class error routine.
|
|||
|
//
|
|||
|
|
|||
|
PCLASS_ERROR ClassError;
|
|||
|
|
|||
|
//
|
|||
|
// SCSI port driver capabilities
|
|||
|
//
|
|||
|
|
|||
|
PIO_SCSI_CAPABILITIES PortCapabilities;
|
|||
|
|
|||
|
//
|
|||
|
// Buffer for drive parameters returned in IO device control.
|
|||
|
//
|
|||
|
|
|||
|
PDISK_GEOMETRY DiskGeometry;
|
|||
|
|
|||
|
//
|
|||
|
// Back pointer to device object of physical device
|
|||
|
//
|
|||
|
|
|||
|
PDEVICE_OBJECT PhysicalDevice;
|
|||
|
|
|||
|
//
|
|||
|
// Request Sense Buffer
|
|||
|
//
|
|||
|
|
|||
|
PSENSE_DATA SenseData;
|
|||
|
|
|||
|
//
|
|||
|
// Request timeout in seconds;
|
|||
|
//
|
|||
|
|
|||
|
ULONG TimeOutValue;
|
|||
|
|
|||
|
//
|
|||
|
// System device number
|
|||
|
//
|
|||
|
|
|||
|
ULONG DeviceNumber;
|
|||
|
|
|||
|
//
|
|||
|
// Add default Srb Flags.
|
|||
|
//
|
|||
|
|
|||
|
ULONG SrbFlags;
|
|||
|
|
|||
|
//
|
|||
|
// Total number of SCSI protocol errors on the device.
|
|||
|
//
|
|||
|
|
|||
|
ULONG ErrorCount;
|
|||
|
|
|||
|
//
|
|||
|
// Spinlock for split requests
|
|||
|
//
|
|||
|
|
|||
|
KSPIN_LOCK SplitRequestSpinLock;
|
|||
|
|
|||
|
//
|
|||
|
// Zone header and spin lock for zoned SRB requests.
|
|||
|
//
|
|||
|
|
|||
|
PZONE_HEADER SrbZone;
|
|||
|
|
|||
|
PKSPIN_LOCK SrbZoneSpinLock;
|
|||
|
|
|||
|
//
|
|||
|
// Lock count for removable media.
|
|||
|
//
|
|||
|
|
|||
|
LONG LockCount;
|
|||
|
|
|||
|
//
|
|||
|
// Scsi port number
|
|||
|
//
|
|||
|
|
|||
|
UCHAR PortNumber;
|
|||
|
|
|||
|
//
|
|||
|
// SCSI path id
|
|||
|
//
|
|||
|
|
|||
|
UCHAR PathId;
|
|||
|
|
|||
|
//
|
|||
|
// SCSI bus target id
|
|||
|
//
|
|||
|
|
|||
|
UCHAR TargetId;
|
|||
|
|
|||
|
//
|
|||
|
// SCSI bus logical unit number
|
|||
|
//
|
|||
|
|
|||
|
UCHAR Lun;
|
|||
|
|
|||
|
//
|
|||
|
// Log2 of sector size
|
|||
|
//
|
|||
|
|
|||
|
UCHAR SectorShift;
|
|||
|
|
|||
|
//
|
|||
|
// Flag to indicate that the device has write caching enabled.
|
|||
|
//
|
|||
|
|
|||
|
BOOLEAN WriteCache;
|
|||
|
|
|||
|
//
|
|||
|
// Build SCSI 1 or SCSI 2 CDBs
|
|||
|
//
|
|||
|
|
|||
|
BOOLEAN UseScsi1;
|
|||
|
|
|||
|
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
|
|||
|
|
|||
|
//
|
|||
|
// Define context structure for asynchronous completions.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _COMPLETION_CONTEXT {
|
|||
|
PDEVICE_OBJECT DeviceObject;
|
|||
|
SCSI_REQUEST_BLOCK Srb;
|
|||
|
}COMPLETION_CONTEXT, *PCOMPLETION_CONTEXT;
|
|||
|
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
ScsiClassGetCapabilities(
|
|||
|
IN PDEVICE_OBJECT PortDeviceObject,
|
|||
|
OUT PIO_SCSI_CAPABILITIES *PortCapabilities
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
ScsiClassGetInquiryData(
|
|||
|
IN PDEVICE_OBJECT PortDeviceObject,
|
|||
|
IN PSCSI_ADAPTER_BUS_INFO *ConfigInfo
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
ScsiClassReadDriveCapacity(
|
|||
|
IN PDEVICE_OBJECT DeviceObject
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
ScsiClassReleaseQueue(
|
|||
|
IN PDEVICE_OBJECT DeviceObject
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
ScsiClassRemoveDevice(
|
|||
|
IN PDEVICE_OBJECT PortDeviceObject,
|
|||
|
IN UCHAR PathId,
|
|||
|
IN UCHAR TargetId,
|
|||
|
IN UCHAR Lun
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
ScsiClassAsynchronousCompletion(
|
|||
|
PDEVICE_OBJECT DeviceObject,
|
|||
|
PIRP Irp,
|
|||
|
PVOID Context
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
ScsiClassSplitRequest(
|
|||
|
IN PDEVICE_OBJECT DeviceObject,
|
|||
|
IN PIRP Irp,
|
|||
|
IN ULONG MaximumBytes
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
ScsiClassDeviceControl(
|
|||
|
PDEVICE_OBJECT DeviceObject,
|
|||
|
PIRP Irp
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
ScsiClassIoComplete(
|
|||
|
IN PDEVICE_OBJECT DeviceObject,
|
|||
|
IN PIRP Irp,
|
|||
|
IN PVOID Context
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
ScsiClassIoCompleteAssociated(
|
|||
|
IN PDEVICE_OBJECT DeviceObject,
|
|||
|
IN PIRP Irp,
|
|||
|
IN PVOID Context
|
|||
|
);
|
|||
|
|
|||
|
BOOLEAN
|
|||
|
ScsiClassInterpretSenseInfo(
|
|||
|
IN PDEVICE_OBJECT DeviceObject,
|
|||
|
IN PSCSI_REQUEST_BLOCK Srb,
|
|||
|
IN UCHAR MajorFunctionCode,
|
|||
|
IN ULONG IoDeviceCode,
|
|||
|
IN ULONG RetryCount,
|
|||
|
OUT NTSTATUS *Status
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
ScsiClassSendSrbSynchronous(
|
|||
|
PDEVICE_OBJECT DeviceObject,
|
|||
|
PSCSI_REQUEST_BLOCK Srb,
|
|||
|
PVOID BufferAddress,
|
|||
|
ULONG BufferLength,
|
|||
|
BOOLEAN WriteToDevice
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
ScsiClassSendSrbAsynchronous(
|
|||
|
PDEVICE_OBJECT DeviceObject,
|
|||
|
PSCSI_REQUEST_BLOCK Srb,
|
|||
|
PIRP Irp,
|
|||
|
PVOID BufferAddress,
|
|||
|
ULONG BufferLength,
|
|||
|
BOOLEAN WriteToDevice
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
ScsiClassBuildRequest(
|
|||
|
PDEVICE_OBJECT DeviceObject,
|
|||
|
PIRP Irp
|
|||
|
);
|
|||
|
|
|||
|
ULONG
|
|||
|
ScsiClassModeSense(
|
|||
|
IN PDEVICE_OBJECT DeviceObject,
|
|||
|
IN PCHAR ModeSenseBuffer,
|
|||
|
IN ULONG Length,
|
|||
|
IN UCHAR PageMode
|
|||
|
);
|
|||
|
|
|||
|
BOOLEAN
|
|||
|
ScsiClassModeSelect(
|
|||
|
IN PDEVICE_OBJECT DeviceObject,
|
|||
|
IN PCHAR ModeSelectBuffer,
|
|||
|
IN ULONG Length,
|
|||
|
IN BOOLEAN SavePage
|
|||
|
);
|
|||
|
|
|||
|
PVOID
|
|||
|
ScsiClassFindModePage(
|
|||
|
IN PCHAR ModeSenseBuffer,
|
|||
|
IN ULONG Length,
|
|||
|
IN UCHAR PageMode
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
ScsiClassClaimDevice(
|
|||
|
IN PDEVICE_OBJECT PortDeviceObject,
|
|||
|
IN PSCSI_INQUIRY_DATA LunInfo,
|
|||
|
IN BOOLEAN Release,
|
|||
|
OUT PDEVICE_OBJECT *NewPortDeviceObject OPTIONAL
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
ScsiClassInternalIoControl (
|
|||
|
IN PDEVICE_OBJECT DeviceObject,
|
|||
|
IN PIRP Irp
|
|||
|
);
|
|||
|
|
|||
|
#endif /* _CLASS_ */
|