/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel * FILE: services/storage/include/class2.h * PURPOSE: SCSI class driver definitions * PROGRAMMER: Eric Kohl */ #pragma once #include #include #define MAXIMUM_RETRIES 15 #define RETRY_WAIT 2000000 /* 200 ms in units of 100 ns */ // // Indicates that the device has write caching enabled. // #define DEV_WRITE_CACHE 0x00000001 // // Build SCSI 1 or SCSI 2 CDBs // #define DEV_USE_SCSI1 0x00000002 // // Indicates whether is is safe to send StartUnit commands // to this device. It will only be off for some removeable devices. // #define DEV_SAFE_START_UNIT 0x00000004 // // Indicates whether it is unsafe to send SCSIOP_MECHANISM_STATUS commands to // this device. Some devices don't like these 12 byte commands // #define DEV_NO_12BYTE_CDB 0x00000008 struct _CLASS_INIT_DATA; typedef VOID (NTAPI *PCLASS_ERROR)(IN PDEVICE_OBJECT DeviceObject, IN PSCSI_REQUEST_BLOCK Srb, IN OUT NTSTATUS *Status, IN OUT BOOLEAN *Retry); typedef BOOLEAN (NTAPI *PCLASS_DEVICE_CALLBACK)(IN PINQUIRYDATA); typedef NTSTATUS (NTAPI *PCLASS_READ_WRITE)(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); typedef BOOLEAN (NTAPI *PCLASS_FIND_DEVICES)(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath, IN struct _CLASS_INIT_DATA *InitializationData, IN PDEVICE_OBJECT PortDeviceObject, IN ULONG PortNumber); typedef NTSTATUS (NTAPI *PCLASS_DEVICE_CONTROL)(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); typedef NTSTATUS (NTAPI *PCLASS_SHUTDOWN_FLUSH)(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); typedef NTSTATUS (NTAPI *PCLASS_CREATE_CLOSE)(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); typedef struct _CLASS_INIT_DATA { ULONG InitializationDataSize; ULONG DeviceExtensionSize; DEVICE_TYPE DeviceType; ULONG DeviceCharacteristics; PCLASS_ERROR ClassError; PCLASS_READ_WRITE ClassReadWriteVerification; PCLASS_DEVICE_CALLBACK ClassFindDeviceCallBack; PCLASS_FIND_DEVICES ClassFindDevices; PCLASS_DEVICE_CONTROL ClassDeviceControl; PCLASS_SHUTDOWN_FLUSH ClassShutdownFlush; PCLASS_CREATE_CLOSE ClassCreateClose; PDRIVER_STARTIO ClassStartIo; } CLASS_INIT_DATA, *PCLASS_INIT_DATA; typedef struct _DEVICE_EXTENSION { PDEVICE_OBJECT DeviceObject; PDEVICE_OBJECT PortDeviceObject; LARGE_INTEGER PartitionLength; LARGE_INTEGER StartingOffset; ULONG DMByteSkew; ULONG DMSkew; BOOLEAN DMActive; PCLASS_ERROR ClassError; PCLASS_READ_WRITE ClassReadWriteVerification; PCLASS_FIND_DEVICES ClassFindDevices; PCLASS_DEVICE_CONTROL ClassDeviceControl; PCLASS_SHUTDOWN_FLUSH ClassShutdownFlush; PCLASS_CREATE_CLOSE ClassCreateClose; PDRIVER_STARTIO ClassStartIo; PIO_SCSI_CAPABILITIES PortCapabilities; PDISK_GEOMETRY_EX DiskGeometry; PDEVICE_OBJECT PhysicalDevice; PSENSE_DATA SenseData; ULONG TimeOutValue; ULONG DeviceNumber; ULONG SrbFlags; ULONG ErrorCount; KSPIN_LOCK SplitRequestSpinLock; NPAGED_LOOKASIDE_LIST SrbLookasideListHead; LONG LockCount; UCHAR PortNumber; UCHAR PathId; UCHAR TargetId; UCHAR Lun; UCHAR SectorShift; UCHAR ReservedByte; USHORT DeviceFlags; PKEVENT MediaChangeEvent; HANDLE MediaChangeEventHandle; BOOLEAN MediaChangeNoMedia; ULONG MediaChangeCount; } DEVICE_EXTENSION, *PDEVICE_EXTENSION; typedef struct _COMPLETION_CONTEXT { PDEVICE_OBJECT DeviceObject; SCSI_REQUEST_BLOCK Srb; } COMPLETION_CONTEXT, *PCOMPLETION_CONTEXT; /* FUNCTIONS ****************************************************************/ IO_COMPLETION_ROUTINE ScsiClassAsynchronousCompletion; NTSTATUS NTAPI ScsiClassAsynchronousCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context); VOID NTAPI ScsiClassBuildRequest(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); NTSTATUS NTAPI ScsiClassClaimDevice(IN PDEVICE_OBJECT PortDeviceObject, IN PSCSI_INQUIRY_DATA LunInfo, IN BOOLEAN Release, OUT PDEVICE_OBJECT *NewPortDeviceObject OPTIONAL); NTSTATUS NTAPI ScsiClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject, IN PCCHAR ObjectNameBuffer, IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL, IN OUT PDEVICE_OBJECT *DeviceObject, IN PCLASS_INIT_DATA InitializationData); NTSTATUS NTAPI ScsiClassDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); PVOID NTAPI ScsiClassFindModePage(IN PCHAR ModeSenseBuffer, IN ULONG Length, IN UCHAR PageMode, IN BOOLEAN Use6Byte); ULONG NTAPI ScsiClassFindUnclaimedDevices(IN PCLASS_INIT_DATA InitializationData, OUT PSCSI_ADAPTER_BUS_INFO AdapterInformation); NTSTATUS NTAPI ScsiClassGetCapabilities(IN PDEVICE_OBJECT PortDeviceObject, OUT PIO_SCSI_CAPABILITIES *PortCapabilities); NTSTATUS NTAPI ScsiClassGetInquiryData(IN PDEVICE_OBJECT PortDeviceObject, OUT PSCSI_ADAPTER_BUS_INFO *ConfigInfo); ULONG NTAPI ScsiClassInitialize(IN PVOID Argument1, IN PVOID Argument2, IN PCLASS_INIT_DATA InitializationData); VOID NTAPI ScsiClassInitializeSrbLookasideList(IN PDEVICE_EXTENSION DeviceExtension, IN ULONG NumberElements); NTSTATUS NTAPI ScsiClassInternalIoControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); BOOLEAN NTAPI ScsiClassInterpretSenseInfo(IN PDEVICE_OBJECT DeviceObject, IN PSCSI_REQUEST_BLOCK Srb, IN UCHAR MajorFunctionCode, IN ULONG IoDeviceCode, IN ULONG RetryCount, OUT NTSTATUS *Status); NTSTATUS NTAPI ScsiClassIoComplete(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context); NTSTATUS NTAPI ScsiClassIoCompleteAssociated(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context); ULONG NTAPI ScsiClassModeSense(IN PDEVICE_OBJECT DeviceObject, IN PCHAR ModeSenseBuffer, IN ULONG Length, IN UCHAR PageMode); ULONG NTAPI ScsiClassQueryTimeOutRegistryValue(IN PUNICODE_STRING RegistryPath); NTSTATUS NTAPI ScsiClassReadDriveCapacity(IN PDEVICE_OBJECT DeviceObject); VOID NTAPI ScsiClassReleaseQueue(IN PDEVICE_OBJECT DeviceObject); NTSTATUS NTAPI ScsiClassSendSrbAsynchronous(PDEVICE_OBJECT DeviceObject, PSCSI_REQUEST_BLOCK Srb, PIRP Irp, PVOID BufferAddress, ULONG BufferLength, BOOLEAN WriteToDevice); NTSTATUS NTAPI ScsiClassSendSrbSynchronous(PDEVICE_OBJECT DeviceObject, PSCSI_REQUEST_BLOCK Srb, PVOID BufferAddress, ULONG BufferLength, BOOLEAN WriteToDevice); VOID NTAPI ScsiClassSplitRequest(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN ULONG MaximumBytes); NTSTATUS NTAPI ScsiClassCheckVerifyComplete( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ); /* EOF */