Windows2000/private/ntos/inc/class.h

240 lines
5.4 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 {
PDEVICE_OBJECT DeviceObject;// Back pointer to device object
PDEVICE_OBJECT PortDeviceObject;// Pointer to port device object
LARGE_INTEGER PartitionLength;// Length of partition in bytes
LARGE_INTEGER StartingOffset;// Number of bytes before start of partition
ULONG DMByteSkew;// Bytes to skew all requests, since DM Driver has been placed on an IDE drive.
ULONG DMSkew;// Sectors to skew all requests.
BOOLEAN DMActive;// Flag to indicate whether DM driver has been located on an IDE drive.
PCLASS_ERROR ClassError;// Pointer to the specific class error routine.
PIO_SCSI_CAPABILITIES PortCapabilities;// SCSI port driver capabilities
PDISK_GEOMETRY DiskGeometry;// Buffer for drive parameters returned in IO device control.
PDEVICE_OBJECT PhysicalDevice;// Back pointer to device object of physical device
PSENSE_DATA SenseData;// Request Sense Buffer
ULONG TimeOutValue;// Request timeout in seconds;
ULONG DeviceNumber;// System device number
ULONG SrbFlags;// Add default Srb Flags.
ULONG ErrorCount;// Total number of SCSI protocol errors on the device.
KSPIN_LOCK SplitRequestSpinLock;// Spinlock for split requests
// Zone header and spin lock for zoned SRB requests.
PZONE_HEADER SrbZone;
PKSPIN_LOCK SrbZoneSpinLock;
LONG LockCount;// Lock count for removable media.
UCHAR PortNumber; // Scsi port number
UCHAR PathId; // SCSI path id
UCHAR TargetId;// SCSI bus target id
UCHAR Lun;// SCSI bus logical unit number
UCHAR SectorShift;// Log2 of sector size
BOOLEAN WriteCache;// Flag to indicate that the device has write caching enabled.
BOOLEAN UseScsi1;// Build SCSI 1 or SCSI 2 CDBs
} 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_ */