mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 01:15:09 +00:00
Improved disk driver stack.
svn path=/trunk/; revision=2507
This commit is contained in:
parent
89ff8f7de2
commit
b25339ac84
10 changed files with 2264 additions and 501 deletions
|
@ -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 */
|
||||
|
|
|
@ -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
|
||||
//
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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
|
@ -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 */
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue