Improved disk driver stack.

svn path=/trunk/; revision=2507
This commit is contained in:
Eric Kohl 2002-01-14 01:45:03 +00:00
parent 89ff8f7de2
commit b25339ac84
10 changed files with 2264 additions and 501 deletions

View file

@ -1,4 +1,4 @@
/* $Id: atapi.c,v 1.2 2001/11/01 00:30:29 ekohl Exp $
/* $Id: atapi.c,v 1.3 2002/01/14 01:43:02 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS ATAPI miniport driver
@ -29,6 +29,7 @@
#include <debug.h>
#include "../include/srb.h"
#include "../include/ntddscsi.h"
#include "atapi.h"
#include "partitio.h"
@ -141,12 +142,15 @@ static int IDEPolledRead(IN WORD Address,
OUT BYTE *Buffer);
static NTSTATUS STDCALL IDEDispatchOpenClose(IN PDEVICE_OBJECT pDO, IN PIRP Irp);
static NTSTATUS STDCALL IDEDispatchReadWrite(IN PDEVICE_OBJECT pDO, IN PIRP Irp);
static NTSTATUS STDCALL IDEDispatchDeviceControl(IN PDEVICE_OBJECT pDO, IN PIRP Irp);
static NTSTATUS STDCALL
AtapiDispatchScsi(IN PDEVICE_OBJECT pDO,
AtapiDispatchScsi(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp);
static NTSTATUS STDCALL
AtapiDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp);
static VOID STDCALL
IDEStartIo(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp);
@ -246,7 +250,7 @@ DriverEntry(IN PDRIVER_OBJECT DriverObject,
DriverObject->MajorFunction[IRP_MJ_CLOSE] = IDEDispatchOpenClose;
DriverObject->MajorFunction[IRP_MJ_READ] = IDEDispatchReadWrite;
DriverObject->MajorFunction[IRP_MJ_WRITE] = IDEDispatchReadWrite;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IDEDispatchDeviceControl;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = AtapiDispatchDeviceControl;
DriverObject->MajorFunction[IRP_MJ_SCSI] = AtapiDispatchScsi;
Status = AtapiFindControllers(DriverObject);
@ -281,11 +285,12 @@ AtapiFindControllers(IN PDRIVER_OBJECT DriverObject)
{
for (Slot = 0; Slot < 256; Slot++)
{
Size = HalGetBusData(PCIConfiguration,
Bus,
Slot,
&PciConfig,
sizeof(PCI_COMMON_CONFIG));
Size = ScsiPortGetBusData(NULL,
PCIConfiguration,
Bus,
Slot,
&PciConfig,
sizeof(PCI_COMMON_CONFIG));
if (Size != 0)
{
if ((PciConfig.BaseClass == 0x01) &&
@ -446,7 +451,7 @@ AtapiFindControllers(IN PDRIVER_OBJECT DriverObject)
}
DPRINT1("AtapiFindControllers() done!\n");
for(;;);
//for(;;);
return(ReturnedStatus);
}
@ -538,7 +543,7 @@ AtapiCreateController(IN PDRIVER_OBJECT DriverObject,
return(Status);
}
AtapiFindDrives(ControllerExtension);
// AtapiFindDrives(ControllerExtension);
return(STATUS_SUCCESS);
}
@ -563,17 +568,20 @@ AtapiCreatePortDevice(IN PDRIVER_OBJECT DriverObject,
RtlInitUnicodeString(&DeviceName,
NameBuffer);
DPRINT1("Creating device: %wZ\n", &DeviceName);
/* Create the port device */
Status = IoCreateDevice(DriverObject,
sizeof(ATAPI_PORT_EXTENSION),
&DeviceName,
FILE_DEVICE_DISK,
FILE_DEVICE_CONTROLLER,
0,
TRUE,
&PortDeviceObject);
if (!NT_SUCCESS(Status))
{
DbgPrint("IoCreateDevice call failed\n");
DPRINT1("IoCreateDevice call failed! (Status 0x%lX)\n", Status);
// DbgPrint("IoCreateDevice call failed\n");
return(Status);
}
DPRINT1("Created device: %wZ\n", &DeviceName);
@ -628,11 +636,11 @@ AtapiFindDrives(PIDE_CONTROLLER_EXTENSION ControllerExtension)
/* select drive */
IDEWriteDriveHead(ControllerExtension->CommandPortBase,
IDE_DH_FIXED | (DriveIndex ? IDE_DH_DRV1 : 0));
KeStallExecutionProcessor(500);
ScsiPortStallExecution(500);
IDEWriteCylinderHigh(ControllerExtension->CommandPortBase, 0);
IDEWriteCylinderLow(ControllerExtension->CommandPortBase, 0);
IDEWriteCommand(ControllerExtension->CommandPortBase, 0x08); /* IDE_COMMAND_ATAPI_RESET */
// KeStallExecutionProcessor(1000*1000);
// ScsiPortStallExecution(1000*1000);
// IDEWriteDriveHead(ControllerExtension->CommandPortBase,
// IDE_DH_FIXED | (DriveIndex ? IDE_DH_DRV1 : 0));
// IDE_DH_FIXED);
@ -643,7 +651,7 @@ AtapiFindDrives(PIDE_CONTROLLER_EXTENSION ControllerExtension)
{
break;
}
KeStallExecutionProcessor(150);
ScsiPortStallExecution(150);
}
if (Retries >= IDE_RESET_BUSY_TIMEOUT * 1000)
{
@ -716,7 +724,7 @@ IDEResetController(IN WORD CommandPort,
IDEWriteDriveControl(ControlPort, IDE_DC_SRST);
// Wait for min. 25 microseconds
KeStallExecutionProcessor(IDE_RESET_PULSE_LENGTH);
ScsiPortStallExecution(IDE_RESET_PULSE_LENGTH);
// Negate drive reset line
IDEWriteDriveControl(ControlPort, 0);
@ -728,7 +736,7 @@ IDEResetController(IN WORD CommandPort,
{
break;
}
KeStallExecutionProcessor(10);
ScsiPortStallExecution(10);
}
CHECKPOINT;
if (Retries >= IDE_RESET_BUSY_TIMEOUT * 1000)
@ -1201,7 +1209,7 @@ IDECreateDevice(IN PDRIVER_OBJECT DriverObject,
// int 0 is success, non 0 is an error code
//
static int
static int
IDEPolledRead(IN WORD Address,
IN BYTE PreComp,
IN BYTE SectorCnt,
@ -1215,16 +1223,15 @@ IDEPolledRead(IN WORD Address,
BYTE Status;
int RetryCount;
/* Wait for STATUS.BUSY to clear */
/* Wait for STATUS.BUSY and STATUS.DRQ to clear */
for (RetryCount = 0; RetryCount < IDE_MAX_BUSY_RETRIES; RetryCount++)
{
Status = IDEReadStatus(Address);
if (!(Status & IDE_SR_BUSY) && !(Status & IDE_SR_DRQ))
// if (!(Status & IDE_SR_BUSY))
{
break;
}
KeStallExecutionProcessor(10);
ScsiPortStallExecution(10);
}
if (RetryCount == IDE_MAX_BUSY_RETRIES)
{
@ -1235,16 +1242,15 @@ IDEPolledRead(IN WORD Address,
/* Write Drive/Head to select drive */
IDEWriteDriveHead(Address, IDE_DH_FIXED | DrvHead);
/* Wait for STATUS.BUSY to clear and STATUS.DRQ to clear */
/* Wait for STATUS.BUSY and STATUS.DRQ to clear */
for (RetryCount = 0; RetryCount < IDE_MAX_BUSY_RETRIES; RetryCount++)
{
Status = IDEReadStatus(Address);
// if (!(Status & IDE_SR_BUSY) && (Status & IDE_SR_DRDY))
if (!(Status & IDE_SR_BUSY) && !(Status & IDE_SR_DRQ))
{
break;
}
KeStallExecutionProcessor(10);
ScsiPortStallExecution(10);
}
if (RetryCount >= IDE_MAX_BUSY_RETRIES)
{
@ -1283,7 +1289,7 @@ IDEPolledRead(IN WORD Address,
/* Issue the command */
IDEWriteCommand(Address, Command);
KeStallExecutionProcessor(50);
ScsiPortStallExecution(50);
while (1)
{
@ -1293,18 +1299,11 @@ IDEPolledRead(IN WORD Address,
Status = IDEReadStatus(Address);
if (!(Status & IDE_SR_BUSY))
{
/*
if (Status & IDE_SR_ERR)
{
BYTE Err = IDEReadError(Address);
CHECKPOINT1;
return Err;
return IDE_ER_ABRT;
}
else if (Status & IDE_SR_DRQ)
{
break;
}
*/
if (Status & IDE_SR_DRQ)
{
break;
@ -1315,7 +1314,7 @@ IDEPolledRead(IN WORD Address,
return IDE_ER_ABRT;
}
}
KeStallExecutionProcessor(10);
ScsiPortStallExecution(10);
}
if (RetryCount >= IDE_MAX_POLL_RETRIES)
{
@ -1470,7 +1469,38 @@ DPRINT("AdjOffset:%ld:%ld + Length:%ld = AdjExtent:%ld:%ld\n",
return STATUS_PENDING;
}
// IDEDispatchDeviceControl
// AtapiDispatchScsi
//
// DESCRIPTION:
// Answer requests for SCSI calls
//
// RUN LEVEL:
// PASSIVE_LEVEL
//
// ARGUMENTS:
// Standard dispatch arguments
//
// RETURNS:
// NTSTATUS
//
static NTSTATUS STDCALL
AtapiDispatchScsi(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
DPRINT1("AtapiDispatchScsi()\n");
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return(STATUS_SUCCESS);
}
// AtapiDispatchDeviceControl
//
// DESCRIPTION:
// Answer requests for device control calls
@ -1485,186 +1515,57 @@ DPRINT("AdjOffset:%ld:%ld + Length:%ld = AdjExtent:%ld:%ld\n",
// NTSTATUS
//
static NTSTATUS STDCALL
IDEDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
NTSTATUS RC;
ULONG ControlCode, InputLength, OutputLength;
PIO_STACK_LOCATION IrpStack;
PIDE_DEVICE_EXTENSION DeviceExtension;
PIDE_DEVICE_EXTENSION DiskDeviceExtension;
CCHAR Increment;
RC = STATUS_SUCCESS;
IrpStack = IoGetCurrentIrpStackLocation(Irp);
ControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode;
InputLength = IrpStack->Parameters.DeviceIoControl.InputBufferLength;
OutputLength = IrpStack->Parameters.DeviceIoControl.OutputBufferLength;
DeviceExtension = (PIDE_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
DiskDeviceExtension = (PIDE_DEVICE_EXTENSION)DeviceExtension->DiskExtension;
Increment = IO_NO_INCREMENT;
// A huge switch statement in a Windows program?! who would have thought?
switch (ControlCode)
{
case IOCTL_DISK_GET_DRIVE_GEOMETRY:
if (IrpStack->Parameters.DeviceIoControl.OutputBufferLength <
sizeof(DISK_GEOMETRY))
{
Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
}
else
{
PDISK_GEOMETRY Geometry;
Geometry = (PDISK_GEOMETRY) Irp->AssociatedIrp.SystemBuffer;
Geometry->MediaType = FixedMedia;
Geometry->Cylinders.QuadPart = DiskDeviceExtension->LogicalCylinders;
Geometry->TracksPerCylinder = DiskDeviceExtension->SectorsPerLogTrk /
DiskDeviceExtension->SectorsPerLogCyl;
Geometry->SectorsPerTrack = DiskDeviceExtension->SectorsPerLogTrk;
Geometry->BytesPerSector = DiskDeviceExtension->BytesPerSector;
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = sizeof(DISK_GEOMETRY);
}
break;
case IOCTL_DISK_GET_PARTITION_INFO:
if (IrpStack->Parameters.DeviceIoControl.OutputBufferLength <
sizeof(PARTITION_INFORMATION))
{
Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
}
else if (DeviceExtension != DiskDeviceExtension)
{
Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
}
else
{
PPARTITION_INFORMATION Buffer;
Buffer = (PPARTITION_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
Buffer->PartitionType = DeviceExtension->PartitionInfo.PartitionType;
Buffer->BootIndicator = DeviceExtension->PartitionInfo.BootIndicator;
Buffer->PartitionNumber = DeviceExtension->PartitionInfo.PartitionNumber;
Buffer->StartingOffset = DeviceExtension->PartitionInfo.StartingOffset;
Buffer->PartitionLength = DeviceExtension->PartitionInfo.PartitionLength;
Buffer->HiddenSectors = DeviceExtension->PartitionInfo.HiddenSectors;
Buffer->RecognizedPartition = TRUE;
Buffer->RewritePartition = FALSE;
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = sizeof(PARTITION_INFORMATION);
}
case IOCTL_DISK_SET_PARTITION_INFO:
RC = STATUS_INVALID_DEVICE_REQUEST;
Irp->IoStatus.Status = RC;
Irp->IoStatus.Information = 0;
break;
case IOCTL_DISK_GET_DRIVE_LAYOUT:
if (IrpStack->Parameters.DeviceIoControl.OutputBufferLength <
sizeof(DRIVE_LAYOUT_INFORMATION))
{
Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL;
}
else
{
PDRIVE_LAYOUT_INFORMATION PartitionList;
RC = IoReadPartitionTable(DiskDeviceExtension->DeviceObject,
DiskDeviceExtension->BytesPerSector,
FALSE,
&PartitionList);
if (!NT_SUCCESS(RC))
{
Irp->IoStatus.Status = RC;
}
else
{
ULONG BufferSize;
BufferSize = FIELD_OFFSET(DRIVE_LAYOUT_INFORMATION,
PartitionEntry[0]);
BufferSize += PartitionList->PartitionCount * sizeof(PARTITION_INFORMATION);
if (BufferSize > IrpStack->Parameters.DeviceIoControl.OutputBufferLength)
{
Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL;
}
else
{
RtlMoveMemory(Irp->AssociatedIrp.SystemBuffer,
PartitionList,
BufferSize);
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = BufferSize;
}
ExFreePool(PartitionList);
}
}
Increment = IO_DISK_INCREMENT;
break;
case IOCTL_DISK_SET_DRIVE_LAYOUT:
case IOCTL_DISK_VERIFY:
case IOCTL_DISK_FORMAT_TRACKS:
case IOCTL_DISK_PERFORMANCE:
case IOCTL_DISK_IS_WRITABLE:
case IOCTL_DISK_LOGGING:
case IOCTL_DISK_FORMAT_TRACKS_EX:
case IOCTL_DISK_HISTOGRAM_STRUCTURE:
case IOCTL_DISK_HISTOGRAM_DATA:
case IOCTL_DISK_HISTOGRAM_RESET:
case IOCTL_DISK_REQUEST_STRUCTURE:
case IOCTL_DISK_REQUEST_DATA:
// If we get here, something went wrong. inform the requestor
default:
RC = STATUS_INVALID_DEVICE_REQUEST;
Irp->IoStatus.Status = RC;
Irp->IoStatus.Information = 0;
break;
}
IoCompleteRequest(Irp, Increment);
return RC;
}
// AtapiDispatchScsi
//
// DESCRIPTION:
// Answer requests for Scsi calls
//
// RUN LEVEL:
// PASSIVE_LEVEL
//
// ARGUMENTS:
// Standard dispatch arguments
//
// RETURNS:
// NTSTATUS
//
static NTSTATUS STDCALL
AtapiDispatchScsi(IN PDEVICE_OBJECT pDO,
IN PIRP Irp)
AtapiDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
DPRINT1("AtapiDispatchScsi()\n");
PIO_STACK_LOCATION Stack;
DPRINT1("AtapiDispatchDeviceControl()\n");
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = FILE_OPENED;
Irp->IoStatus.Information = 0;
Stack = IoGetCurrentIrpStackLocation(Irp);
switch (Stack->Parameters.DeviceIoControl.IoControlCode)
{
case IOCTL_SCSI_GET_CAPABILITIES:
{
PIO_SCSI_CAPABILITIES Capabilities;
DPRINT1(" IOCTL_SCSI_GET_CAPABILITIES\n");
Capabilities = (PIO_SCSI_CAPABILITIES)(*((PIO_SCSI_CAPABILITIES*)Irp->AssociatedIrp.SystemBuffer));
Capabilities->Length = sizeof(IO_SCSI_CAPABILITIES);
Capabilities->MaximumTransferLength = 65536; /* FIXME: preliminary values!!! */
Capabilities->MaximumPhysicalPages = 1;
Capabilities->SupportedAsynchronousEvents = 0;
Capabilities->AlignmentMask = 0;
Capabilities->TaggedQueuing = FALSE;
Capabilities->AdapterScansDown = FALSE;
Capabilities->AdapterUsesPio = TRUE;
Irp->IoStatus.Information = sizeof(IO_SCSI_CAPABILITIES);
}
break;
case IOCTL_SCSI_GET_INQUIRY_DATA:
DPRINT1(" IOCTL_SCSI_GET_INQUIRY_DATA\n");
break;
default:
DPRINT1(" unknown ioctl code: 0x%lX\n",
Stack->Parameters.DeviceIoControl.IoControlCode);
break;
}
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
return(STATUS_SUCCESS);
}
// IDEStartIo
//
// DESCRIPTION:
@ -1837,7 +1738,7 @@ IDEStartController(IN OUT PVOID Context)
{
break;
}
KeStallExecutionProcessor(10);
ScsiPortStallExecution(10);
}
DPRINT ("status=%02x\n", Status);
DPRINT ("waited %ld usecs for busy to clear\n", Retries * 10);
@ -1873,7 +1774,7 @@ IDEStartController(IN OUT PVOID Context)
{
break;
}
KeStallExecutionProcessor(10);
ScsiPortStallExecution(10);
}
DPRINT ("waited %ld usecs for busy to clear after drive select\n", Retries * 10);
if (Retries >= IDE_MAX_BUSY_RETRIES)
@ -1921,7 +1822,7 @@ IDEStartController(IN OUT PVOID Context)
{
break;
}
KeStallExecutionProcessor(10);
ScsiPortStallExecution(10);
}
if (Retries >= IDE_MAX_BUSY_RETRIES)
{
@ -1977,7 +1878,7 @@ IDEBeginControllerReset(PIDE_CONTROLLER_EXTENSION ControllerExtension)
{
break;
}
KeStallExecutionProcessor(10);
ScsiPortStallExecution(10);
}
if (Retries == IDE_MAX_RESET_RETRIES)
{
@ -2105,7 +2006,7 @@ IDEIsr(IN PKINTERRUPT Interrupt,
!(IDEReadStatus(ControllerExtension->CommandPortBase) & IDE_SR_DRQ);
Retries++)
{
KeStallExecutionProcessor(10);
ScsiPortStallExecution(10);
}
// Copy the block of data
@ -2120,7 +2021,7 @@ IDEIsr(IN PKINTERRUPT Interrupt,
(IDEReadStatus(ControllerExtension->CommandPortBase) & IDE_SR_BUSY);
Retries++)
{
KeStallExecutionProcessor(10);
ScsiPortStallExecution(10);
}
// Check for data overrun
@ -2167,7 +2068,7 @@ IDEIsr(IN PKINTERRUPT Interrupt,
(IDEReadStatus(ControllerExtension->CommandPortBase) & IDE_SR_BUSY);
Retries++)
{
KeStallExecutionProcessor(10);
ScsiPortStallExecution(10);
}
// Check for data overrun
@ -2415,4 +2316,4 @@ IDEIoTimer(PDEVICE_OBJECT DeviceObject,
}
}
/* EOF */

View file

@ -72,49 +72,49 @@ extern "C" {
// Each macro takes an address of the command port block, and data
//
#define IDEReadError(Address) \
(READ_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_ERROR)))
(ScsiPortReadPortUchar((PUCHAR)((Address) + IDE_REG_ERROR)))
#define IDEWritePrecomp(Address, Data) \
(WRITE_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_PRECOMP), (Data)))
(ScsiPortWritePortUchar((PUCHAR)((Address) + IDE_REG_PRECOMP), (Data)))
#define IDEReadSectorCount(Address) \
(READ_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_SECTOR_CNT)))
(ScsiPortReadPortUchar((PUCHAR)((Address) + IDE_REG_SECTOR_CNT)))
#define IDEWriteSectorCount(Address, Data) \
(WRITE_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_SECTOR_CNT), (Data)))
(ScsiPortWritePortUchar((PUCHAR)((Address) + IDE_REG_SECTOR_CNT), (Data)))
#define IDEReadSectorNum(Address) \
(READ_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_SECTOR_NUM)))
(ScsiPortReadPortUchar((PUCHAR)((Address) + IDE_REG_SECTOR_NUM)))
#define IDEWriteSectorNum(Address, Data) \
(WRITE_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_SECTOR_NUM), (Data)))
(ScsiPortWritePortUchar((PUCHAR)((Address) + IDE_REG_SECTOR_NUM), (Data)))
#define IDEReadCylinderLow(Address) \
(READ_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_CYL_LOW)))
(ScsiPortReadPortUchar((PUCHAR)((Address) + IDE_REG_CYL_LOW)))
#define IDEWriteCylinderLow(Address, Data) \
(WRITE_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_CYL_LOW), (Data)))
(ScsiPortWritePortUchar((PUCHAR)((Address) + IDE_REG_CYL_LOW), (Data)))
#define IDEReadCylinderHigh(Address) \
(READ_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_CYL_HIGH)))
(ScsiPortReadPortUchar((PUCHAR)((Address) + IDE_REG_CYL_HIGH)))
#define IDEWriteCylinderHigh(Address, Data) \
(WRITE_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_CYL_HIGH), (Data)))
(ScsiPortWritePortUchar((PUCHAR)((Address) + IDE_REG_CYL_HIGH), (Data)))
#define IDEReadDriveHead(Address) \
(READ_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_DRV_HEAD)))
(ScsiPortReadPortUchar((PUCHAR)((Address) + IDE_REG_DRV_HEAD)))
#define IDEWriteDriveHead(Address, Data) \
(WRITE_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_DRV_HEAD), (Data)))
(ScsiPortWritePortUchar((PUCHAR)((Address) + IDE_REG_DRV_HEAD), (Data)))
#define IDEReadStatus(Address) \
(READ_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_STATUS)))
(ScsiPortReadPortUchar((PUCHAR)((Address) + IDE_REG_STATUS)))
#define IDEWriteCommand(Address, Data) \
(WRITE_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_COMMAND), (Data)))
(ScsiPortWritePortUchar((PUCHAR)((Address) + IDE_REG_COMMAND), (Data)))
//
// Data block read and write commands
//
#define IDEReadBlock(Address, Buffer, Count) \
(READ_PORT_BUFFER_USHORT((PUSHORT)((Address) + IDE_REG_DATA_PORT), (PUSHORT)(Buffer), (Count) / 2))
(ScsiPortReadPortBufferUshort((PUSHORT)((Address) + IDE_REG_DATA_PORT), (PUSHORT)(Buffer), (Count) / 2))
#define IDEWriteBlock(Address, Buffer, Count) \
(WRITE_PORT_BUFFER_USHORT((PUSHORT)((Address) + IDE_REG_DATA_PORT), (PUSHORT)(Buffer), (Count) / 2))
(ScsiPortWritePortBufferUshort((PUSHORT)((Address) + IDE_REG_DATA_PORT), (PUSHORT)(Buffer), (Count) / 2))
//
// Access macros for control registers
// Each macro takes an address of the control port blank and data
//
#define IDEWriteDriveControl(Address, Data) \
(WRITE_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_DEV_CNTRL), (Data)))
(ScsiPortWritePortUchar((PUCHAR)((Address) + IDE_REG_DEV_CNTRL), (Data)))
// IDE_DEVICE_EXTENSION
//

View file

@ -1,4 +1,4 @@
/* $Id: class2.c,v 1.1 2001/07/23 06:12:07 ekohl Exp $
/* $Id: class2.c,v 1.2 2002/01/14 01:43:26 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -11,11 +11,36 @@
#include "../include/scsi.h"
#include "../include/class2.h"
//#define NDEBUG
#include <debug.h>
#define UNIMPLEMENTED do {DbgPrint("%s:%d: Function not implemented", __FILE__, __LINE__); for(;;);} while (0)
//#define UNIMPLEMENTED do {DbgPrint("%s:%d: Function not implemented", __FILE__, __LINE__); for(;;);} while (0)
#define VERSION "0.0.1"
#define INQUIRY_DATA_SIZE 2048
static NTSTATUS STDCALL
ScsiClassCreateClose(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp);
static NTSTATUS STDCALL
ScsiClassReadWrite(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp);
static NTSTATUS STDCALL
ScsiClassScsiDispatch(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp);
static NTSTATUS STDCALL
ScsiClassDeviceDispatch(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp);
static NTSTATUS STDCALL
ScsiClassShutdownFlush(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp);
// ------------------------------------------------------- Public Interface
// DriverEntry
@ -39,7 +64,7 @@ NTSTATUS STDCALL
DriverEntry(IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath)
{
DbgPrint("ScsiPort Driver %s\n", VERSION);
DbgPrint("Class Driver %s\n", VERSION);
return(STATUS_SUCCESS);
}
@ -66,9 +91,9 @@ ScsiClassDebugPrint(IN ULONG DebugPrintLevel,
NTSTATUS STDCALL
ScsiClassAsynchronousCompletion(PDEVICE_OBJECT DeviceObject,
PIRP Irp,
PVOID Context)
ScsiClassAsynchronousCompletion(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context)
{
UNIMPLEMENTED;
}
@ -125,7 +150,8 @@ ULONG STDCALL
ScsiClassFindUnclaimedDevices(PCLASS_INIT_DATA InitializationData,
PSCSI_ADAPTER_BUS_INFO AdapterInformation)
{
UNIMPLEMENTED;
DPRINT("ScsiClassFindUnclaimedDevices() called!\n");
return(0);
}
@ -133,7 +159,42 @@ NTSTATUS STDCALL
ScsiClassGetCapabilities(PDEVICE_OBJECT PortDeviceObject,
PIO_SCSI_CAPABILITIES *PortCapabilities)
{
UNIMPLEMENTED;
IO_STATUS_BLOCK IoStatusBlock;
NTSTATUS Status;
KEVENT Event;
PIRP Irp;
KeInitializeEvent(&Event,
NotificationEvent,
FALSE);
Irp = IoBuildDeviceIoControlRequest(IOCTL_SCSI_GET_CAPABILITIES,
PortDeviceObject,
NULL,
0,
PortCapabilities,
sizeof(PVOID),
FALSE,
&Event,
&IoStatusBlock);
if (Irp == NULL)
{
return(STATUS_INSUFFICIENT_RESOURCES);
}
Status = IoCallDriver(PortDeviceObject,
Irp);
if (Status == STATUS_PENDING)
{
KeWaitForSingleObject(&Event,
Suspended,
KernelMode,
FALSE,
NULL);
return(IoStatusBlock.Status);
}
return(Status);
}
@ -141,7 +202,58 @@ NTSTATUS STDCALL
ScsiClassGetInquiryData(PDEVICE_OBJECT PortDeviceObject,
PSCSI_ADAPTER_BUS_INFO *ConfigInfo)
{
UNIMPLEMENTED;
PSCSI_ADAPTER_BUS_INFO Buffer;
IO_STATUS_BLOCK IoStatusBlock;
NTSTATUS Status;
KEVENT Event;
PIRP Irp;
Buffer = ExAllocatePool(NonPagedPool, /* FIXME: use paged pool */
INQUIRY_DATA_SIZE);
*ConfigInfo = Buffer;
if (Buffer == NULL)
{
return(STATUS_INSUFFICIENT_RESOURCES);
}
KeInitializeEvent(&Event,
NotificationEvent,
FALSE);
Irp = IoBuildDeviceIoControlRequest(IOCTL_SCSI_GET_INQUIRY_DATA,
PortDeviceObject,
NULL,
0,
Buffer,
INQUIRY_DATA_SIZE,
FALSE,
&Event,
&IoStatusBlock);
if (Irp == NULL)
{
return(STATUS_INSUFFICIENT_RESOURCES);
}
Status = IoCallDriver(PortDeviceObject,
Irp);
if (Status == STATUS_PENDING)
{
KeWaitForSingleObject(&Event,
Suspended,
KernelMode,
FALSE,
NULL);
Status = IoStatusBlock.Status;
}
if (!NT_SUCCESS(Status))
{
ExFreePool(Buffer);
*ConfigInfo = NULL;
}
return(Status);
}
@ -150,7 +262,66 @@ ScsiClassInitialize(PVOID Argument1,
PVOID Argument2,
PCLASS_INIT_DATA InitializationData)
{
UNIMPLEMENTED;
PDRIVER_OBJECT DriverObject = Argument1;
WCHAR NameBuffer[80];
UNICODE_STRING PortName;
ULONG PortNumber = 0;
PDEVICE_OBJECT PortDeviceObject;
PFILE_OBJECT FileObject;
BOOLEAN DiskFound = FALSE;
NTSTATUS Status;
DriverObject->MajorFunction[IRP_MJ_CREATE] = ScsiClassCreateClose;
DriverObject->MajorFunction[IRP_MJ_CLOSE] = ScsiClassCreateClose;
DriverObject->MajorFunction[IRP_MJ_READ] = ScsiClassReadWrite;
DriverObject->MajorFunction[IRP_MJ_WRITE] = ScsiClassReadWrite;
DriverObject->MajorFunction[IRP_MJ_SCSI] = ScsiClassScsiDispatch;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ScsiClassDeviceDispatch;
DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] = ScsiClassShutdownFlush;
DriverObject->MajorFunction[IRP_MJ_FLUSH_BUFFERS] = ScsiClassShutdownFlush;
if (InitializationData->ClassStartIo)
{
DriverObject->DriverStartIo = InitializationData->ClassStartIo;
}
/* look for ScsiPortX scsi port devices */
do
{
swprintf(NameBuffer,
L"\\Device\\ScsiPort%lu",
PortNumber);
RtlInitUnicodeString(&PortName,
NameBuffer);
DPRINT1("Checking scsi port %ld\n", PortNumber);
Status = IoGetDeviceObjectPointer(&PortName,
FILE_READ_ATTRIBUTES,
&FileObject,
&PortDeviceObject);
DPRINT1("Status 0x%08lX\n", Status);
if (NT_SUCCESS(Status))
{
DPRINT1("ScsiPort%lu found.\n", PortNumber);
/* Check scsi port for attached disk drives */
if (InitializationData->ClassFindDevices(DriverObject,
Argument2,
InitializationData,
PortDeviceObject,
PortNumber))
{
DiskFound = TRUE;
}
ObDereferenceObject(PortDeviceObject);
ObDereferenceObject(FileObject);
}
PortNumber++;
}
while (NT_SUCCESS(Status));
for(;;);
return((DiskFound == TRUE) ? STATUS_SUCCESS : STATUS_NO_SUCH_DEVICE);
}
@ -211,21 +382,21 @@ ScsiClassModeSense(PDEVICE_OBJECT DeviceObject,
ULONG STDCALL
ScsiClassQueryTimeOutRegistryValue(PUNICODE_STRING RegistryPath)
ScsiClassQueryTimeOutRegistryValue(IN PUNICODE_STRING RegistryPath)
{
UNIMPLEMENTED;
}
NTSTATUS STDCALL
ScsiClassReadDriveCapacity(PDEVICE_OBJECT DeviceObject)
ScsiClassReadDriveCapacity(IN PDEVICE_OBJECT DeviceObject)
{
UNIMPLEMENTED;
}
VOID STDCALL
ScsiClassReleaseQueue(PDEVICE_OBJECT DeviceObject)
ScsiClassReleaseQueue(IN PDEVICE_OBJECT DeviceObject)
{
UNIMPLEMENTED;
}
@ -262,4 +433,65 @@ ScsiClassSplitRequest(PDEVICE_OBJECT DeviceObject,
UNIMPLEMENTED;
}
/* Internal Routines **************/
static NTSTATUS STDCALL
ScsiClassCreateClose(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return(STATUS_SUCCESS);
}
static NTSTATUS STDCALL
ScsiClassReadWrite(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return(STATUS_SUCCESS);
}
static NTSTATUS STDCALL
ScsiClassScsiDispatch(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return(STATUS_SUCCESS);
}
static NTSTATUS STDCALL
ScsiClassDeviceDispatch(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return(STATUS_SUCCESS);
}
static NTSTATUS STDCALL
ScsiClassShutdownFlush(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return(STATUS_SUCCESS);
}
/* EOF */

View file

@ -1,4 +1,4 @@
/* $Id: disk.c,v 1.1 2001/07/24 10:21:15 ekohl Exp $
/* $Id: disk.c,v 1.2 2002/01/14 01:44:03 ekohl Exp $
*
*/
@ -6,82 +6,37 @@
#include <ddk/ntddk.h>
#include "../include/scsi.h"
#include "../include/class2.h"
#include "../include/ntddscsi.h"
//#define NDEBUG
#include <debug.h>
//#include "ide.h"
//#include "partitio.h"
#define VERSION "V0.0.1"
static NTSTATUS DiskCreateDevices(VOID);
static BOOLEAN DiskFindDiskDrives(PDEVICE_OBJECT PortDeviceObject, ULONG PortNumber);
//static NTSTATUS
//DiskCreateDevices(VOID);
/*
* DiskOpenClose
*
* DESCRIPTION:
* Answer requests for Open/Close calls: a null operation
*
* RUN LEVEL:
* PASSIVE_LEVEL
*
* ARGUMENTS:
* Standard dispatch arguments
*
* RETURNS:
* NTSTATUS
*/
#if 0
static NTSTATUS STDCALL
DiskOpenClose(IN PDEVICE_OBJECT pDO,
IN PIRP Irp)
{
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = FILE_OPENED;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
#endif
BOOLEAN STDCALL
DiskClassFindDevices(PDRIVER_OBJECT DriverObject,
PUNICODE_STRING RegistryPath,
PCLASS_INIT_DATA InitializationData,
PDEVICE_OBJECT PortDeviceObject,
ULONG PortNumber);
static NTSTATUS STDCALL
DiskClassReadWrite(IN PDEVICE_OBJECT pDO,
IN PIRP Irp)
{
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
NTSTATUS STDCALL
DiskClassDeviceControl(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp);
return STATUS_SUCCESS;
}
NTSTATUS STDCALL
DiskClassShutdownFlush(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp);
static NTSTATUS STDCALL
DiskClassDeviceControl(IN PDEVICE_OBJECT pDO,
IN PIRP Irp)
{
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
static NTSTATUS STDCALL
DiskClassShutdownFlush(IN PDEVICE_OBJECT pDO,
IN PIRP Irp)
{
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
// DriverEntry
@ -107,84 +62,112 @@ NTSTATUS STDCALL
DriverEntry(IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath)
{
NTSTATUS Status;
CLASS_INIT_DATA InitData;
DbgPrint("Disk Class Driver %s\n", VERSION);
DbgPrint("Disk Class Driver %s\n", VERSION);
/* Export other driver entry points... */
// DriverObject->DriverStartIo = IDEStartIo;
// DriverObject->MajorFunction[IRP_MJ_CREATE] = DiskClassOpenClose;
// DriverObject->MajorFunction[IRP_MJ_CLOSE] = DiskClassOpenClose;
DriverObject->MajorFunction[IRP_MJ_READ] = DiskClassReadWrite;
DriverObject->MajorFunction[IRP_MJ_WRITE] = DiskClassReadWrite;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DiskClassDeviceControl;
DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] = DiskClassShutdownFlush;
DriverObject->MajorFunction[IRP_MJ_FLUSH_BUFFERS] = DiskClassShutdownFlush;
InitData.InitializationDataSize = sizeof(CLASS_INIT_DATA);
InitData.DeviceExtensionSize = sizeof(DEVICE_EXTENSION); // + sizeof(DISK_DATA)
InitData.DeviceType = FILE_DEVICE_DISK;
InitData.DeviceCharacteristics = 0;
Status = DiskCreateDevices();
DPRINT("Status 0x%08X\n", Status);
InitData.ClassError = NULL; // DiskClassProcessError;
InitData.ClassReadWriteVerification = NULL; // DiskClassReadWriteVerification;
InitData.ClassFindDeviceCallBack = NULL; // DiskClassDeviceVerification;
InitData.ClassFindDevices = DiskClassFindDevices;
InitData.ClassDeviceControl = DiskClassDeviceControl;
InitData.ClassShutdownFlush = DiskClassShutdownFlush;
InitData.ClassCreateClose = NULL;
InitData.ClassStartIo = NULL;
DPRINT("Returning from DriverEntry\n");
return STATUS_SUCCESS;
return(ScsiClassInitialize(DriverObject,
RegistryPath,
&InitData));
}
// DiskClassFindDevices
//
// DESCRIPTION:
// This function searches for device that are attached to the given scsi port.
//
// RUN LEVEL:
// PASSIVE_LEVEL
//
// ARGUMENTS:
// IN PDRIVER_OBJECT DriverObject System allocated Driver Object for this driver
// IN PUNICODE_STRING RegistryPath Name of registry driver service key
// IN PCLASS_INIT_DATA InitializationData Pointer to the main initialization data
// IN PDEVICE_OBJECT PortDeviceObject Scsi port device object
// IN ULONG PortNumber Port number
//
// RETURNS:
// TRUE: At least one disk drive was found
// FALSE: No disk drive found
//
static NTSTATUS
DiskCreateDevices(VOID)
BOOLEAN STDCALL
DiskClassFindDevices(PDRIVER_OBJECT DriverObject,
PUNICODE_STRING RegistryPath,
PCLASS_INIT_DATA InitializationData,
PDEVICE_OBJECT PortDeviceObject,
ULONG PortNumber)
{
WCHAR NameBuffer[80];
UNICODE_STRING PortName;
ULONG PortNumber = 0;
PDEVICE_OBJECT PortDeviceObject;
PFILE_OBJECT FileObject;
BOOLEAN DiskFound = FALSE;
NTSTATUS Status;
DPRINT1("DiskCreateDevices() called.\n");
/* look for ScsiPortX scsi port devices */
do
{
swprintf(NameBuffer,
L"\\Device\\ScsiPort%ld",
PortNumber);
RtlInitUnicodeString(&PortName,
NameBuffer);
DPRINT1("Checking scsi port %ld\n", PortNumber);
Status = IoGetDeviceObjectPointer(&PortName,
FILE_READ_ATTRIBUTES,
&FileObject,
&PortDeviceObject);
DPRINT1("Status 0x%08lX\n", Status);
if (NT_SUCCESS(Status))
{
DPRINT1("ScsiPort%ld found.\n", PortNumber);
PIO_SCSI_CAPABILITIES PortCapabilities = NULL;
PSCSI_ADAPTER_BUS_INFO AdapterBusInfo;
PCHAR Buffer;
ULONG DeviceCount;
NTSTATUS Status;
// PCONFIGURATION_INFORMATION ConfigInfo;
/* Check scsi port for attached disk drives */
DiskFound = DiskFindDiskDrives(PortDeviceObject, PortNumber);
}
PortNumber++;
}
while (NT_SUCCESS(Status));
DPRINT1("DiskClassFindDevices() called.\n");
return(STATUS_SUCCESS);
/* Get port capabilities */
Status = ScsiClassGetCapabilities(PortDeviceObject,
&PortCapabilities);
if (!NT_SUCCESS(Status))
{
DPRINT("ScsiClassGetCapabilities() failed! (Status 0x%lX)\n", Status);
return(FALSE);
}
// DPRINT1("MaximumTransferLength: %lu\n", Capabilities.MaximumTransferLength);
/* Get inquiry data */
Status = ScsiClassGetInquiryData(PortDeviceObject,
(PSCSI_ADAPTER_BUS_INFO *)&Buffer);
if (!NT_SUCCESS(Status))
{
DPRINT("ScsiClassGetInquiryData() failed! (Status 0x%lX)\n", Status);
return(FALSE);
}
/* Get number of unclaimed devices */
AdapterBusInfo = (PSCSI_ADAPTER_BUS_INFO)Buffer;
DeviceCount = ScsiClassFindUnclaimedDevices(InitializationData,
AdapterBusInfo);
if (DeviceCount == 0)
{
DPRINT("ScsiClassFindUnclaimedDevices() returned 0!");
return(FALSE);
}
// ConfigInfo = IoGetConfigurationInformation();
// DPRINT1("Number of SCSI ports: %lu\n", ConfigInfo->ScsiPortCount);
ExFreePool(Buffer);
return(TRUE);
}
static BOOLEAN
DiskFindDiskDrives(PDEVICE_OBJECT PortDeviceObject,
ULONG PortNumber)
{
DPRINT1("DiskFindDiskDevices() called.\n");
return TRUE;
}
// IDECreateDevice
//
// DESCRIPTION:
// Creates a device by calling IoCreateDevice and a sylbolic link for Win32
// Creates a device by calling IoCreateDevice and a symbolic link for Win32
//
// RUN LEVEL:
// PASSIVE_LEVEL
@ -306,7 +289,7 @@ IDECreateDevice(IN PDRIVER_OBJECT DriverObject,
// IDEDispatchDeviceControl
// DiskClassDeviceControl
//
// DESCRIPTION:
// Answer requests for device control calls
@ -320,11 +303,14 @@ IDECreateDevice(IN PDRIVER_OBJECT DriverObject,
// RETURNS:
// NTSTATUS
//
#if 0
static NTSTATUS STDCALL
IDEDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
NTSTATUS STDCALL
DiskClassDeviceControl(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
DPRINT("DiskClassDeviceControl() called!\n");
#if 0
NTSTATUS RC;
ULONG ControlCode, InputLength, OutputLength;
PIO_STACK_LOCATION IrpStack;
@ -391,8 +377,43 @@ IDEDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject,
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return RC;
}
#endif
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return(STATUS_SUCCESS);
}
// DiskClassShutdownFlush
//
// DESCRIPTION:
// Answer requests for shutdown and flush calls
//
// RUN LEVEL:
// PASSIVE_LEVEL
//
// ARGUMENTS:
// Standard dispatch arguments
//
// RETURNS:
// NTSTATUS
//
NTSTATUS STDCALL
DiskClassShutdownFlush(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
DPRINT("DiskClassShutdownFlush() called!\n");
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return(STATUS_SUCCESS);
}
/* EOF */

View file

@ -1,4 +1,4 @@
/* $Id: class2.h,v 1.1 2001/07/23 06:12:34 ekohl Exp $
/* $Id: class2.h,v 1.2 2002/01/14 01:44:18 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -67,53 +67,89 @@ typedef struct _CLASS_INIT_DATA
typedef struct _DEVICE_EXTENSION
{
ULONG Dummy;
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 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;
/* FUNCTIONS ****************************************************************/
NTSTATUS
STDCALL
ScsiClassAsynchronousCompletion (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
PVOID Context
);
NTSTATUS STDCALL
ScsiClassAsynchronousCompletion(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context);
VOID
STDCALL
ScsiClassBuildRequest (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
VOID STDCALL
ScsiClassBuildRequest(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp);
NTSTATUS
STDCALL
ScsiClassClaimDevice (
IN PDEVICE_OBJECT PortDeviceObject,
IN PSCSI_INQUIRY_DATA LunInfo,
IN BOOLEAN Release,
OUT PDEVICE_OBJECT *NewPortDeviceObject OPTIONAL
);
NTSTATUS STDCALL
ScsiClassClaimDevice(IN PDEVICE_OBJECT PortDeviceObject,
IN PSCSI_INQUIRY_DATA LunInfo,
IN BOOLEAN Release,
OUT PDEVICE_OBJECT *NewPortDeviceObject OPTIONAL);
NTSTATUS
STDCALL
ScsiClassCreateDeviceObject (
IN PDRIVER_OBJECT DriverObject,
IN PCCHAR ObjectNameBuffer,
IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
IN OUT PDEVICE_OBJECT *DeviceObject,
IN PCLASS_INIT_DATA InitializationData
);
NTSTATUS STDCALL
ScsiClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject,
IN PCCHAR ObjectNameBuffer,
IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
IN OUT PDEVICE_OBJECT *DeviceObject,
IN PCLASS_INIT_DATA InitializationData);
NTSTATUS
STDCALL
ScsiClassDeviceControl (
PDEVICE_OBJECT DeviceObject,
PIRP Irp
);
NTSTATUS STDCALL
ScsiClassDeviceControl(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp);
ULONG STDCALL
ScsiClassFindUnclaimedDevices(IN PCLASS_INIT_DATA InitializationData,
OUT PSCSI_ADAPTER_BUS_INFO AdapterInformation);
NTSTATUS STDCALL
ScsiClassGetCapabilities(IN PDEVICE_OBJECT PortDeviceObject,
OUT PIO_SCSI_CAPABILITIES *PortCapabilities);
NTSTATUS STDCALL
ScsiClassGetInquiryData(IN PDEVICE_OBJECT PortDeviceObject,
OUT PSCSI_ADAPTER_BUS_INFO *ConfigInfo);
ULONG STDCALL
ScsiClassInitialize(IN PVOID Argument1,
IN PVOID Argument2,
IN PCLASS_INIT_DATA InitializationData);

View file

@ -1,4 +1,4 @@
/* $Id: ntddscsi.h,v 1.1 2001/07/23 06:12:34 ekohl Exp $
/* $Id: ntddscsi.h,v 1.2 2002/01/14 01:44:18 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -11,6 +11,44 @@
#define __STORAGE_INCLUDE_NTDDSCSI_H
/* IOCTL codes */
#define IOCTL_SCSI_PASS_THROUGH \
CTL_CODE(FILE_DEVICE_CONTROLLER, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_SCSI_MINIPORT \
CTL_CODE(FILE_DEVICE_CONTROLLER, 0x0402, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_SCSI_GET_INQUIRY_DATA \
CTL_CODE(FILE_DEVICE_CONTROLLER, 0x0403, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_SCSI_GET_CAPABILITIES \
CTL_CODE(FILE_DEVICE_CONTROLLER, 0x0404, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_SCSI_PASS_THROUGH_DIRECT \
CTL_CODE(FILE_DEVICE_CONTROLLER, 0x0405, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_SCSI_GET_ADDRESS \
CTL_CODE(FILE_DEVICE_CONTROLLER, 0x0406, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_SCSI_RESCAN_BUS \
CTL_CODE(FILE_DEVICE_CONTROLLER, 0x0407, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_SCSI_GET_DUMP_POINTERS \
CTL_CODE(FILE_DEVICE_CONTROLLER, 0x0408, METHOD_BUFFERED, FILE_ANY_ACCESS)
/* Used by IOCTL_SCSI_GET_CAPABILITIES */
typedef struct _IO_SCSI_CAPABILITIES
{
ULONG Length;
ULONG MaximumTransferLength;
ULONG MaximumPhysicalPages;
ULONG SupportedAsynchronousEvents;
ULONG AlignmentMask;
BOOLEAN TaggedQueuing;
BOOLEAN AdapterScansDown;
BOOLEAN AdapterUsesPio;
} IO_SCSI_CAPABILITIES, *PIO_SCSI_CAPABILITIES;
/* Used by IOCTL_SCSI_GET_INQUIRY_DATA */
typedef struct _SCSI_BUS_DATA
{
UCHAR NumberOfLogicalUnits;
@ -26,19 +64,6 @@ typedef struct _SCSI_ADAPTER_BUS_INFO
} SCSI_ADAPTER_BUS_INFO, *PSCSI_ADAPTER_BUS_INFO;
typedef struct _IO_SCSI_CAPABILITIES
{
ULONG Length;
ULONG MaximumTransferLength;
ULONG MaximumPhysicalPages;
ULONG SupportedAsynchronousEvents;
ULONG AlignmentMask;
BOOLEAN TaggedQueuing;
BOOLEAN AdapterScansDown;
BOOLEAN AdapterUsesPio;
} IO_SCSI_CAPABILITIES, *PIO_SCSI_CAPABILITIES;
typedef struct _SCSI_INQUIRY_DATA
{
UCHAR PathId;

File diff suppressed because it is too large Load diff

View file

@ -1,4 +1,4 @@
/* $Id: srb.h,v 1.1 2001/07/21 07:29:53 ekohl Exp $
/* $Id: srb.h,v 1.2 2002/01/14 01:44:19 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -10,6 +10,28 @@
#ifndef __STORAGE_INCLUDE_SRB_H
#define __STORAGE_INCLUDE_SRB_H
//
// Define SCSI maximum configuration parameters.
//
#define SCSI_MAXIMUM_LOGICAL_UNITS 8
#define SCSI_MAXIMUM_TARGETS_PER_BUS 32
#define SCSI_MAXIMUM_BUSES 8
#define SCSI_MINIMUM_PHYSICAL_BREAKS 16
#define SCSI_MAXIMUM_PHYSICAL_BREAKS 255
//
// This constant is for backward compatibility.
// This use to be the maximum number of targets supported.
//
#define SCSI_MAXIMUM_TARGETS 8
// begin_ntminitape
#define MAXIMUM_CDB_SIZE 12
typedef PHYSICAL_ADDRESS SCSI_PHYSICAL_ADDRESS, *PSCSI_PHYSICAL_ADDRESS;
@ -102,6 +124,119 @@ typedef struct _SCSI_REQUEST_BLOCK
#define SCSI_REQUEST_BLOCK_SIZE sizeof(SCSI_REQUEST_BLOCK)
//
// SRB Functions
//
#define SRB_FUNCTION_EXECUTE_SCSI 0x00
#define SRB_FUNCTION_CLAIM_DEVICE 0x01
#define SRB_FUNCTION_IO_CONTROL 0x02
#define SRB_FUNCTION_RECEIVE_EVENT 0x03
#define SRB_FUNCTION_RELEASE_QUEUE 0x04
#define SRB_FUNCTION_ATTACH_DEVICE 0x05
#define SRB_FUNCTION_RELEASE_DEVICE 0x06
#define SRB_FUNCTION_SHUTDOWN 0x07
#define SRB_FUNCTION_FLUSH 0x08
#define SRB_FUNCTION_ABORT_COMMAND 0x10
#define SRB_FUNCTION_RELEASE_RECOVERY 0x11
#define SRB_FUNCTION_RESET_BUS 0x12
#define SRB_FUNCTION_RESET_DEVICE 0x13
#define SRB_FUNCTION_TERMINATE_IO 0x14
#define SRB_FUNCTION_FLUSH_QUEUE 0x15
#define SRB_FUNCTION_REMOVE_DEVICE 0x16
//
// SRB Status
//
#define SRB_STATUS_PENDING 0x00
#define SRB_STATUS_SUCCESS 0x01
#define SRB_STATUS_ABORTED 0x02
#define SRB_STATUS_ABORT_FAILED 0x03
#define SRB_STATUS_ERROR 0x04
#define SRB_STATUS_BUSY 0x05
#define SRB_STATUS_INVALID_REQUEST 0x06
#define SRB_STATUS_INVALID_PATH_ID 0x07
#define SRB_STATUS_NO_DEVICE 0x08
#define SRB_STATUS_TIMEOUT 0x09
#define SRB_STATUS_SELECTION_TIMEOUT 0x0A
#define SRB_STATUS_COMMAND_TIMEOUT 0x0B
#define SRB_STATUS_MESSAGE_REJECTED 0x0D
#define SRB_STATUS_BUS_RESET 0x0E
#define SRB_STATUS_PARITY_ERROR 0x0F
#define SRB_STATUS_REQUEST_SENSE_FAILED 0x10
#define SRB_STATUS_NO_HBA 0x11
#define SRB_STATUS_DATA_OVERRUN 0x12
#define SRB_STATUS_UNEXPECTED_BUS_FREE 0x13
#define SRB_STATUS_PHASE_SEQUENCE_FAILURE 0x14
#define SRB_STATUS_BAD_SRB_BLOCK_LENGTH 0x15
#define SRB_STATUS_REQUEST_FLUSHED 0x16
#define SRB_STATUS_INVALID_LUN 0x20
#define SRB_STATUS_INVALID_TARGET_ID 0x21
#define SRB_STATUS_BAD_FUNCTION 0x22
#define SRB_STATUS_ERROR_RECOVERY 0x23
//
// SRB Status Masks
//
#define SRB_STATUS_QUEUE_FROZEN 0x40
#define SRB_STATUS_AUTOSENSE_VALID 0x80
#define SRB_STATUS(Status) (Status & ~(SRB_STATUS_AUTOSENSE_VALID | SRB_STATUS_QUEUE_FROZEN))
//
// SRB Flag Bits
//
#define SRB_FLAGS_QUEUE_ACTION_ENABLE 0x00000002
#define SRB_FLAGS_DISABLE_DISCONNECT 0x00000004
#define SRB_FLAGS_DISABLE_SYNCH_TRANSFER 0x00000008
#define SRB_FLAGS_BYPASS_FROZEN_QUEUE 0x00000010
#define SRB_FLAGS_DISABLE_AUTOSENSE 0x00000020
#define SRB_FLAGS_DATA_IN 0x00000040
#define SRB_FLAGS_DATA_OUT 0x00000080
#define SRB_FLAGS_NO_DATA_TRANSFER 0x00000000
#define SRB_FLAGS_UNSPECIFIED_DIRECTION (SRB_FLAGS_DATA_IN | SRB_FLAGS_DATA_OUT)
#define SRB_FLAGS_NO_QUEUE_FREEZE 0x00000100
#define SRB_FLAGS_ADAPTER_CACHE_ENABLE 0x00000200
#define SRB_FLAGS_IS_ACTIVE 0x00010000
#define SRB_FLAGS_ALLOCATED_FROM_ZONE 0x00020000
#define SRB_FLAGS_SGLIST_FROM_POOL 0x00040000
//
// Queue Action
//
#define SRB_SIMPLE_TAG_REQUEST 0x20
#define SRB_HEAD_OF_QUEUE_TAG_REQUEST 0x21
#define SRB_ORDERED_QUEUE_TAG_REQUEST 0x22
//
// Port driver error codes
//
#define SP_BUS_PARITY_ERROR 0x0001
#define SP_UNEXPECTED_DISCONNECT 0x0002
#define SP_INVALID_RESELECTION 0x0003
#define SP_BUS_TIME_OUT 0x0004
#define SP_PROTOCOL_ERROR 0x0005
#define SP_INTERNAL_ADAPTER_ERROR 0x0006
#define SP_REQUEST_TIMEOUT 0x0007
#define SP_IRQ_NOT_RESPONDING 0x0008
#define SP_BAD_FW_WARNING 0x0009
#define SP_BAD_FW_ERROR 0x000a
//
// Return values for SCSI_HW_FIND_ADAPTER.
//
#define SP_RETURN_NOT_FOUND 0
#define SP_RETURN_FOUND 1
#define SP_RETURN_ERROR 2
#define SP_RETURN_BAD_CONFIG 3
typedef enum _SCSI_NOTIFICATION_TYPE
{
@ -181,39 +316,25 @@ typedef struct _HW_INITIALIZATION_DATA
/* FUNCTIONS ****************************************************************/
VOID
ScsiDebugPrint (
IN ULONG DebugPrintLevel,
IN PCHAR DebugMessage,
...
);
ScsiDebugPrint(IN ULONG DebugPrintLevel,
IN PCHAR DebugMessage,
...);
VOID
STDCALL
ScsiPortCompleteRequest (
IN PVOID HwDeviceExtension,
IN UCHAR PathId,
IN UCHAR TargetId,
IN UCHAR Lun,
IN UCHAR SrbStatus
);
VOID STDCALL
ScsiPortCompleteRequest(IN PVOID HwDeviceExtension,
IN UCHAR PathId,
IN UCHAR TargetId,
IN UCHAR Lun,
IN UCHAR SrbStatus);
ULONG
STDCALL
ScsiPortConvertPhysicalAddressToUlong (
IN SCSI_PHYSICAL_ADDRESS Address
);
ULONG STDCALL
ScsiPortConvertPhysicalAddressToUlong(IN SCSI_PHYSICAL_ADDRESS Address);
SCSI_PHYSICAL_ADDRESS
STDCALL
ScsiPortConvertUlongToPhysicalAddress (
IN ULONG UlongAddress
);
SCSI_PHYSICAL_ADDRESS STDCALL
ScsiPortConvertUlongToPhysicalAddress(IN ULONG UlongAddress);
VOID
STDCALL
ScsiPortFlushDma (
IN PVOID HwDeviceExtension
);
VOID STDCALL
ScsiPortFlushDma(IN PVOID HwDeviceExtension);
VOID
STDCALL
@ -272,23 +393,20 @@ ScsiPortGetSrb (
IN LONG QueueTag
);
PVOID
STDCALL
PVOID STDCALL
ScsiPortGetUncachedExtension (
IN PVOID HwDeviceExtension,
IN PPORT_CONFIGURATION_INFORMATION ConfigInfo,
IN ULONG NumberOfBytes
);
PVOID
STDCALL
PVOID STDCALL
ScsiPortGetVirtualAddress (
IN PVOID HwDeviceExtension,
IN SCSI_PHYSICAL_ADDRESS PhysicalAddress
);
ULONG
STDCALL
ULONG STDCALL
ScsiPortInitialize (
IN PVOID Argument1,
IN PVOID Argument2,
@ -296,8 +414,7 @@ ScsiPortInitialize (
IN PVOID HwContext
);
VOID
STDCALL
VOID STDCALL
ScsiPortIoMapTransfer (
IN PVOID HwDeviceExtension,
IN PSCSI_REQUEST_BLOCK Srb,
@ -305,8 +422,7 @@ ScsiPortIoMapTransfer (
IN ULONG Length
);
VOID
STDCALL
VOID STDCALL
ScsiPortLogError (
IN PVOID HwDeviceExtension,
IN PSCSI_REQUEST_BLOCK Srb OPTIONAL,
@ -317,38 +433,137 @@ ScsiPortLogError (
IN ULONG UniqueId
);
VOID
STDCALL
ScsiPortMoveMemory (
OUT PVOID Destination,
IN PVOID Source,
IN ULONG Length
);
VOID STDCALL
ScsiPortMoveMemory(OUT PVOID Destination,
IN PVOID Source,
IN ULONG Length);
VOID
ScsiPortNotification (
IN SCSI_NOTIFICATION_TYPE NotificationType,
IN PVOID HwDeviceExtension,
...
);
ScsiPortNotification(IN SCSI_NOTIFICATION_TYPE NotificationType,
IN PVOID HwDeviceExtension,
...);
UCHAR
STDCALL
ScsiPortReadPortUchar (
IN PUCHAR Port
);
VOID STDCALL
ScsiPortReadPortBufferUchar(IN PUCHAR Port,
IN PUCHAR Value,
IN ULONG Count);
ULONG
STDCALL
ScsiPortReadPortUlong (
IN PULONG Port
);
VOID STDCALL
ScsiPortReadPortBufferUlong(IN PULONG Port,
IN PULONG Value,
IN ULONG Count);
USHORT
STDCALL
ScsiPortReadPortUshort (
IN PUSHORT Port
);
VOID STDCALL
ScsiPortReadPortBufferUshort(IN PUSHORT Port,
IN PUSHORT Value,
IN ULONG Count);
UCHAR STDCALL
ScsiPortReadPortUchar(IN PUCHAR Port);
ULONG STDCALL
ScsiPortReadPortUlong(IN PULONG Port);
USHORT STDCALL
ScsiPortReadPortUshort(IN PUSHORT Port);
VOID STDCALL
ScsiPortReadRegisterBufferUchar(IN PUCHAR Register,
IN PUCHAR Buffer,
IN ULONG Count);
VOID STDCALL
ScsiPortReadRegisterBufferUlong(IN PULONG Register,
IN PULONG Buffer,
IN ULONG Count);
VOID STDCALL
ScsiPortReadRegisterBufferUshort(IN PUSHORT Register,
IN PUSHORT Buffer,
IN ULONG Count);
UCHAR STDCALL
ScsiPortReadRegisterUchar(IN PUCHAR Register);
ULONG STDCALL
ScsiPortReadRegisterUlong(IN PULONG Register);
USHORT STDCALL
ScsiPortReadRegisterUshort(IN PUSHORT Register);
ULONG STDCALL
ScsiPortSetBusDataByOffset(IN PVOID DeviceExtension,
IN ULONG BusDataType,
IN ULONG SystemIoBusNumber,
IN ULONG SlotNumber,
IN PVOID Buffer,
IN ULONG Offset,
IN ULONG Length);
VOID STDCALL
ScsiPortStallExecution(IN ULONG MicroSeconds);
BOOLEAN STDCALL
ScsiPortValidateRange(IN PVOID HwDeviceExtension,
IN INTERFACE_TYPE BusType,
IN ULONG SystemIoBusNumber,
IN SCSI_PHYSICAL_ADDRESS IoAddress,
IN ULONG NumberOfBytes,
IN BOOLEAN InIoSpace);
VOID STDCALL
ScsiPortWritePortBufferUchar(IN PUCHAR Port,
IN PUCHAR Buffer,
IN ULONG Count);
VOID STDCALL
ScsiPortWritePortBufferUlong(IN PULONG Port,
IN PULONG Buffer,
IN ULONG Count);
VOID STDCALL
ScsiPortWritePortBufferUshort(IN PUSHORT Port,
IN PUSHORT Value,
IN ULONG Count);
VOID STDCALL
ScsiPortWritePortUchar(IN PUCHAR Port,
IN UCHAR Value);
VOID STDCALL
ScsiPortWritePortUlong(IN PULONG Port,
IN ULONG Value);
VOID STDCALL
ScsiPortWritePortUshort(IN PUSHORT Port,
IN USHORT Value);
VOID STDCALL
ScsiPortWriteRegisterBufferUchar(IN PUCHAR Register,
IN PUCHAR Buffer,
IN ULONG Count);
VOID STDCALL
ScsiPortWriteRegisterBufferUlong(IN PULONG Register,
IN PULONG Buffer,
IN ULONG Count);
VOID STDCALL
ScsiPortWriteRegisterBufferUshort(IN PUSHORT Register,
IN PUSHORT Buffer,
IN ULONG Count);
VOID STDCALL
ScsiPortWriteRegisterUchar(IN PUCHAR Register,
IN ULONG Value);
VOID STDCALL
ScsiPortWriteRegisterUlong(IN PULONG Register,
IN ULONG Value);
VOID STDCALL
ScsiPortWriteRegisterUshort(IN PUSHORT Register,
IN USHORT Value);
#endif /* __STORAGE_INCLUDE_SRB_H */

View file

@ -1,4 +1,4 @@
/* $Id: scsiport.c,v 1.1 2001/07/21 07:30:26 ekohl Exp $
/* $Id: scsiport.c,v 1.2 2002/01/14 01:45:03 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -15,6 +15,13 @@
#define VERSION "0.0.1"
static NTSTATUS STDCALL
ScsiPortCreateClose(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp);
// ------------------------------------------------------- Public Interface
// DriverEntry
@ -105,7 +112,11 @@ ScsiPortGetBusData(IN PVOID DeviceExtension,
IN PVOID Buffer,
IN ULONG Length)
{
UNIMPLEMENTED;
return(HalGetBusData(BusDataType,
SystemIoBusNumber,
SlotNumber,
Buffer,
Length));
}
@ -202,6 +213,29 @@ ScsiPortInitialize(IN PVOID Argument1,
IN struct _HW_INITIALIZATION_DATA *HwInitializationData,
IN PVOID HwContext)
{
PDRIVER_OBJECT DriverObject = (PDRIVER_OBJECT)Argument1;
PUNICODE_STRING RegistryPath = (PUNICODE_STRING)Argument2;
if ((HwInitializationData->HwInitialize == NULL) ||
(HwInitializationData->HwStartIo == NULL) ||
(HwInitializationData->HwInterrupt == NULL) ||
(HwInitializationData->HwFindAdapter == NULL) ||
(HwInitializationData->HwResetBus == NULL))
return(STATUS_INVALID_PARAMETER);
// DriverObject->DriverStartIo = HwInitializationData->HwStartIo;
// DriverObject->DriverStartIo = ScsiPortStartIo;
DriverObject->MajorFunction[IRP_MJ_CREATE] = ScsiPortCreateClose;
DriverObject->MajorFunction[IRP_MJ_CLOSE] = ScsiPortCreateClose;
// DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ScsiPortDeviceControl;
// DriverObject->MajorFunction[IRP_MJ_SCSI] = ScsiPortDispatch;
// DriverObject->MajorFunction[IRP_MJ_READ] = IDEDispatchReadWrite;
// DriverObject->MajorFunction[IRP_MJ_WRITE] = IDEDispatchReadWrite;
// DriverObject->MajorFunction[IRP_MJ_QUERY_INFORMATION] = IDEDispatchQueryInformation;
// DriverObject->MajorFunction[IRP_MJ_SET_INFORMATION] = IDEDispatchSetInformation;
UNIMPLEMENTED;
return(STATUS_SUCCESS);
}
@ -279,4 +313,20 @@ ScsiPortValidateRange(IN PVOID HwDeviceExtension,
return(TRUE);
}
/* internal functions ******/
static NTSTATUS STDCALL
ScsiPortCreateClose(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = FILE_OPENED;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
/* EOF */

View file

@ -1,4 +1,4 @@
; $Id: scsiport.edf,v 1.3 2001/08/23 15:26:57 ekohl Exp $
; $Id: scsiport.edf,v 1.4 2002/01/14 01:45:03 ekohl Exp $
;
; scsiport.def - export definition file for scsiport driver
;
@ -38,7 +38,7 @@ ScsiPortSetDataBusByOffset=ScsiPortSetBusDataByOffset@28
ScsiPortStallExecution=HAL.KeStallExecutionProcessor
ScsiPortValidateRange=ScsiPortValidateRange@28
ScsiPortWritePortUchar=HAL.WRITE_PORT_UCHAR
ScsiPortWritePortUshort=HA.WRITE_PORT_USHORT
ScsiPortWritePortUshort=HAL.WRITE_PORT_USHORT
ScsiPortWritePortUlong=HAL.WRITE_PORT_ULONG
ScsiPortWritePortBufferUchar=HAL.WRITE_PORT_BUFFER_UCHAR
ScsiPortWritePortBufferUshort=HAL.WRITE_PORT_BUFFER_USHORT