mirror of
https://github.com/reactos/reactos.git
synced 2025-04-05 05:01:03 +00:00
[STORPORT] Start the implementation of the storport driver and add it to the build.
CORE-13866
This commit is contained in:
parent
637276f1ab
commit
b2c6c07d0f
10 changed files with 1746 additions and 1 deletions
|
@ -1,2 +1,2 @@
|
|||
|
||||
add_subdirectory(buslogic)
|
||||
add_subdirectory(storport)
|
||||
|
|
20
drivers/storage/port/storport/CMakeLists.txt
Normal file
20
drivers/storage/port/storport/CMakeLists.txt
Normal file
|
@ -0,0 +1,20 @@
|
|||
|
||||
spec2def(storport.sys storport.spec ADD_IMPORTLIB)
|
||||
|
||||
list(APPEND SOURCE
|
||||
fdo.c
|
||||
misc.c
|
||||
pdo.c
|
||||
storport.c
|
||||
stubs.c
|
||||
precomp.h)
|
||||
|
||||
add_library(storport SHARED
|
||||
${SOURCE}
|
||||
storport.rc
|
||||
${CMAKE_CURRENT_BINARY_DIR}/storport.def)
|
||||
|
||||
add_pch(storport precomp.h SOURCE)
|
||||
set_module_type(storport kernelmodedriver)
|
||||
add_importlibs(storport ntoskrnl hal)
|
||||
add_cd_file(TARGET storport DESTINATION reactos/system32/drivers NO_CAB FOR all)
|
155
drivers/storage/port/storport/fdo.c
Normal file
155
drivers/storage/port/storport/fdo.c
Normal file
|
@ -0,0 +1,155 @@
|
|||
/*
|
||||
* PROJECT: ReactOS Storport Driver
|
||||
* LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
|
||||
* PURPOSE: Storport FDO code
|
||||
* COPYRIGHT: Copyright 2017 Eric Kohl (eric.kohl@reactos.org)
|
||||
*/
|
||||
|
||||
/* INCLUDES *******************************************************************/
|
||||
|
||||
#include "precomp.h"
|
||||
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
|
||||
/* FUNCTIONS ******************************************************************/
|
||||
|
||||
static
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
PortFdoStartDevice(
|
||||
_In_ PFDO_DEVICE_EXTENSION DeviceExtension,
|
||||
_In_ PIRP Irp)
|
||||
{
|
||||
DPRINT1("PortFdoStartDevice(%p %p)\n",
|
||||
DeviceExtension, Irp);
|
||||
|
||||
ASSERT(DeviceExtension->ExtensionType == FdoExtension);
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
static
|
||||
NTSTATUS
|
||||
PortFdoQueryBusRelations(
|
||||
_In_ PFDO_DEVICE_EXTENSION DeviceExtension,
|
||||
_Out_ PULONG_PTR Information)
|
||||
{
|
||||
NTSTATUS Status = STATUS_SUCCESS;;
|
||||
|
||||
DPRINT1("PortFdoQueryBusRelations(%p %p)\n",
|
||||
DeviceExtension, Information);
|
||||
|
||||
*Information = 0;
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
PortFdoPnp(
|
||||
_In_ PDEVICE_OBJECT DeviceObject,
|
||||
_In_ PIRP Irp)
|
||||
{
|
||||
PFDO_DEVICE_EXTENSION DeviceExtension;
|
||||
PIO_STACK_LOCATION Stack;
|
||||
ULONG_PTR Information = 0;
|
||||
NTSTATUS Status = STATUS_NOT_SUPPORTED;
|
||||
|
||||
DPRINT1("PortFdoPnp(%p %p)\n",
|
||||
DeviceObject, Irp);
|
||||
|
||||
DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
|
||||
ASSERT(DeviceExtension);
|
||||
ASSERT(DeviceExtension->ExtensionType == FdoExtension);
|
||||
|
||||
Stack = IoGetCurrentIrpStackLocation(Irp);
|
||||
|
||||
switch (Stack->MinorFunction)
|
||||
{
|
||||
case IRP_MN_START_DEVICE: /* 0x00 */
|
||||
DPRINT1("IRP_MJ_PNP / IRP_MN_START_DEVICE\n");
|
||||
/* Call lower driver */
|
||||
Status = ForwardIrpAndWait(DeviceExtension->LowerDevice, Irp);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
Status = PortFdoStartDevice(DeviceExtension, Irp);
|
||||
}
|
||||
break;
|
||||
|
||||
case IRP_MN_QUERY_REMOVE_DEVICE: /* 0x01 */
|
||||
DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_REMOVE_DEVICE\n");
|
||||
break;
|
||||
|
||||
case IRP_MN_REMOVE_DEVICE: /* 0x02 */
|
||||
DPRINT1("IRP_MJ_PNP / IRP_MN_REMOVE_DEVICE\n");
|
||||
break;
|
||||
|
||||
case IRP_MN_CANCEL_REMOVE_DEVICE: /* 0x03 */
|
||||
DPRINT1("IRP_MJ_PNP / IRP_MN_CANCEL_REMOVE_DEVICE\n");
|
||||
break;
|
||||
|
||||
case IRP_MN_STOP_DEVICE: /* 0x04 */
|
||||
DPRINT1("IRP_MJ_PNP / IRP_MN_STOP_DEVICE\n");
|
||||
break;
|
||||
|
||||
case IRP_MN_QUERY_STOP_DEVICE: /* 0x05 */
|
||||
DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_STOP_DEVICE\n");
|
||||
break;
|
||||
|
||||
case IRP_MN_CANCEL_STOP_DEVICE: /* 0x06 */
|
||||
DPRINT1("IRP_MJ_PNP / IRP_MN_CANCEL_STOP_DEVICE\n");
|
||||
break;
|
||||
|
||||
case IRP_MN_QUERY_DEVICE_RELATIONS: /* 0x07 */
|
||||
DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS\n");
|
||||
switch (Stack->Parameters.QueryDeviceRelations.Type)
|
||||
{
|
||||
case BusRelations:
|
||||
DPRINT1(" IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / BusRelations\n");
|
||||
Status = PortFdoQueryBusRelations(DeviceExtension, &Information);
|
||||
break;
|
||||
|
||||
case RemovalRelations:
|
||||
DPRINT1(" IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / RemovalRelations\n");
|
||||
return ForwardIrpAndForget(DeviceExtension->LowerDevice, Irp);
|
||||
|
||||
default:
|
||||
DPRINT1(" IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / Unknown type 0x%lx\n",
|
||||
Stack->Parameters.QueryDeviceRelations.Type);
|
||||
return ForwardIrpAndForget(DeviceExtension->LowerDevice, Irp);
|
||||
}
|
||||
break;
|
||||
|
||||
case IRP_MN_FILTER_RESOURCE_REQUIREMENTS: /* 0x0d */
|
||||
DPRINT1("IRP_MJ_PNP / IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n");
|
||||
return ForwardIrpAndForget(DeviceExtension->LowerDevice, Irp);
|
||||
|
||||
case IRP_MN_QUERY_PNP_DEVICE_STATE: /* 0x14 */
|
||||
DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_PNP_DEVICE_STATE\n");
|
||||
break;
|
||||
|
||||
case IRP_MN_DEVICE_USAGE_NOTIFICATION: /* 0x16 */
|
||||
DPRINT1("IRP_MJ_PNP / IRP_MN_DEVICE_USAGE_NOTIFICATION\n");
|
||||
break;
|
||||
|
||||
case IRP_MN_SURPRISE_REMOVAL: /* 0x17 */
|
||||
DPRINT1("IRP_MJ_PNP / IRP_MN_SURPRISE_REMOVAL\n");
|
||||
break;
|
||||
|
||||
default:
|
||||
DPRINT1("IRP_MJ_PNP / Unknown IOCTL 0x%lx\n", Stack->MinorFunction);
|
||||
return ForwardIrpAndForget(DeviceExtension->LowerDevice, Irp);
|
||||
}
|
||||
|
||||
Irp->IoStatus.Information = Information;
|
||||
Irp->IoStatus.Status = Status;
|
||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* EOF */
|
71
drivers/storage/port/storport/misc.c
Normal file
71
drivers/storage/port/storport/misc.c
Normal file
|
@ -0,0 +1,71 @@
|
|||
/*
|
||||
* PROJECT: ReactOS Storport Driver
|
||||
* LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
|
||||
* PURPOSE: Storport helper functions
|
||||
* COPYRIGHT: Copyright 2017 Eric Kohl (eric.kohl@reactos.org)
|
||||
*/
|
||||
|
||||
/* INCLUDES *******************************************************************/
|
||||
|
||||
#include "precomp.h"
|
||||
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
|
||||
/* FUNCTIONS ******************************************************************/
|
||||
|
||||
static
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
ForwardIrpAndWaitCompletion(
|
||||
_In_ PDEVICE_OBJECT DeviceObject,
|
||||
_In_ PIRP Irp,
|
||||
_In_ PVOID Context)
|
||||
{
|
||||
if (Irp->PendingReturned)
|
||||
KeSetEvent((PKEVENT)Context, IO_NO_INCREMENT, FALSE);
|
||||
return STATUS_MORE_PROCESSING_REQUIRED;
|
||||
}
|
||||
|
||||
|
||||
NTSTATUS
|
||||
ForwardIrpAndWait(
|
||||
_In_ PDEVICE_OBJECT LowerDevice,
|
||||
_In_ PIRP Irp)
|
||||
{
|
||||
KEVENT Event;
|
||||
NTSTATUS Status;
|
||||
|
||||
ASSERT(LowerDevice);
|
||||
|
||||
KeInitializeEvent(&Event, NotificationEvent, FALSE);
|
||||
IoCopyCurrentIrpStackLocationToNext(Irp);
|
||||
|
||||
IoSetCompletionRoutine(Irp, ForwardIrpAndWaitCompletion, &Event, TRUE, TRUE, TRUE);
|
||||
|
||||
Status = IoCallDriver(LowerDevice, Irp);
|
||||
if (Status == STATUS_PENDING)
|
||||
{
|
||||
Status = KeWaitForSingleObject(&Event, Suspended, KernelMode, FALSE, NULL);
|
||||
if (NT_SUCCESS(Status))
|
||||
Status = Irp->IoStatus.Status;
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
ForwardIrpAndForget(
|
||||
_In_ PDEVICE_OBJECT LowerDevice,
|
||||
_In_ PIRP Irp)
|
||||
{
|
||||
ASSERT(LowerDevice);
|
||||
|
||||
IoSkipCurrentIrpStackLocation(Irp);
|
||||
return IoCallDriver(LowerDevice, Irp);
|
||||
}
|
||||
|
||||
/* EOF */
|
32
drivers/storage/port/storport/pdo.c
Normal file
32
drivers/storage/port/storport/pdo.c
Normal file
|
@ -0,0 +1,32 @@
|
|||
/*
|
||||
* PROJECT: ReactOS Storport Driver
|
||||
* LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
|
||||
* PURPOSE: Storport PDO code
|
||||
* COPYRIGHT: Copyright 2017 Eric Kohl (eric.kohl@reactos.org)
|
||||
*/
|
||||
|
||||
/* INCLUDES *******************************************************************/
|
||||
|
||||
#include "precomp.h"
|
||||
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
|
||||
/* FUNCTIONS ******************************************************************/
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
PortPdoPnp(
|
||||
_In_ PDEVICE_OBJECT DeviceObject,
|
||||
_In_ PIRP Irp)
|
||||
{
|
||||
DPRINT1("PortPdoPnp()\n");
|
||||
|
||||
Irp->IoStatus.Information = 0;
|
||||
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/* EOF */
|
113
drivers/storage/port/storport/precomp.h
Normal file
113
drivers/storage/port/storport/precomp.h
Normal file
|
@ -0,0 +1,113 @@
|
|||
/*
|
||||
* PROJECT: ReactOS Storport Driver
|
||||
* LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
|
||||
* PURPOSE: Storport driver common header file
|
||||
* COPYRIGHT: Copyright 2017 Eric Kohl (eric.kohl@reactos.org)
|
||||
*/
|
||||
|
||||
#ifndef _STORPORT_PCH_
|
||||
#define _STORPORT_PCH_
|
||||
|
||||
#include <wdm.h>
|
||||
#include <ntddk.h>
|
||||
#include <stdio.h>
|
||||
#include <storport.h>
|
||||
#include <ntddscsi.h>
|
||||
#include <ntdddisk.h>
|
||||
#include <mountdev.h>
|
||||
|
||||
typedef enum
|
||||
{
|
||||
dsStopped,
|
||||
dsStarted,
|
||||
dsPaused,
|
||||
dsRemoved,
|
||||
dsSurpriseRemoved
|
||||
} DEVICE_STATE;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
InvalidExtension = 0,
|
||||
DriverExtension,
|
||||
FdoExtension,
|
||||
PdoExtension
|
||||
} EXTENSION_TYPE;
|
||||
|
||||
typedef struct _DRIVER_OBJECT_EXTENSION
|
||||
{
|
||||
EXTENSION_TYPE ExtensionType;
|
||||
|
||||
PDRIVER_OBJECT DriverObject;
|
||||
|
||||
KSPIN_LOCK AdapterListLock;
|
||||
LIST_ENTRY AdapterListHead;
|
||||
ULONG AdapterCount;
|
||||
|
||||
} DRIVER_OBJECT_EXTENSION, *PDRIVER_OBJECT_EXTENSION;
|
||||
|
||||
typedef struct _FDO_DEVICE_EXTENSION
|
||||
{
|
||||
EXTENSION_TYPE ExtensionType;
|
||||
|
||||
PDEVICE_OBJECT Device;
|
||||
PDEVICE_OBJECT LowerDevice;
|
||||
PDEVICE_OBJECT PhysicalDevice;
|
||||
|
||||
DEVICE_STATE PnpState;
|
||||
|
||||
LIST_ENTRY AdapterListEntry;
|
||||
} FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION;
|
||||
|
||||
|
||||
typedef struct _PDO_DEVICE_EXTENSION
|
||||
{
|
||||
EXTENSION_TYPE ExtensionType;
|
||||
|
||||
PDEVICE_OBJECT AttachedFdo;
|
||||
|
||||
DEVICE_STATE PnpState;
|
||||
|
||||
} PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION;
|
||||
|
||||
|
||||
/* fdo.c */
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
PortFdoPnp(
|
||||
_In_ PDEVICE_OBJECT DeviceObject,
|
||||
_In_ PIRP Irp);
|
||||
|
||||
|
||||
/* misc.c */
|
||||
|
||||
NTSTATUS
|
||||
ForwardIrpAndWait(
|
||||
_In_ PDEVICE_OBJECT LowerDevice,
|
||||
_In_ PIRP Irp);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
ForwardIrpAndForget(
|
||||
_In_ PDEVICE_OBJECT LowerDevice,
|
||||
_In_ PIRP Irp);
|
||||
|
||||
|
||||
/* pdo.c */
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
PortPdoPnp(
|
||||
_In_ PDEVICE_OBJECT DeviceObject,
|
||||
_In_ PIRP Irp);
|
||||
|
||||
|
||||
/* storport.c */
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
DriverEntry(
|
||||
_In_ PDRIVER_OBJECT DriverObject,
|
||||
_In_ PUNICODE_STRING RegistryPath);
|
||||
|
||||
#endif /* _STORPORT_PCH_ */
|
975
drivers/storage/port/storport/storport.c
Normal file
975
drivers/storage/port/storport/storport.c
Normal file
|
@ -0,0 +1,975 @@
|
|||
/*
|
||||
* PROJECT: ReactOS Storport Driver
|
||||
* LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
|
||||
* PURPOSE: Storport driver main file
|
||||
* COPYRIGHT: Copyright 2017 Eric Kohl (eric.kohl@reactos.org)
|
||||
*/
|
||||
|
||||
/* INCLUDES *******************************************************************/
|
||||
|
||||
#include "precomp.h"
|
||||
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
|
||||
/* GLOBALS ********************************************************************/
|
||||
|
||||
ULONG PortNumber = 0;
|
||||
|
||||
|
||||
/* FUNCTIONS ******************************************************************/
|
||||
|
||||
static
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
PortAddDevice(
|
||||
_In_ PDRIVER_OBJECT DriverObject,
|
||||
_In_ PDEVICE_OBJECT PhysicalDeviceObject)
|
||||
{
|
||||
PDRIVER_OBJECT_EXTENSION DriverObjectExtension;
|
||||
PFDO_DEVICE_EXTENSION DeviceExtension = NULL;
|
||||
WCHAR NameBuffer[80];
|
||||
UNICODE_STRING DeviceName;
|
||||
PDEVICE_OBJECT Fdo = NULL;
|
||||
KLOCK_QUEUE_HANDLE LockHandle;
|
||||
NTSTATUS Status;
|
||||
|
||||
DPRINT1("PortAddDevice(%p %p)\n",
|
||||
DriverObject, PhysicalDeviceObject);
|
||||
|
||||
ASSERT(DriverObject);
|
||||
ASSERT(PhysicalDeviceObject);
|
||||
|
||||
swprintf(NameBuffer,
|
||||
L"\\Device\\RaidPort%lu",
|
||||
PortNumber);
|
||||
RtlInitUnicodeString(&DeviceName, NameBuffer);
|
||||
PortNumber++;
|
||||
|
||||
DPRINT1("Creating device: %wZ\n", &DeviceName);
|
||||
|
||||
/* Create the port device */
|
||||
Status = IoCreateDevice(DriverObject,
|
||||
sizeof(FDO_DEVICE_EXTENSION),
|
||||
&DeviceName,
|
||||
FILE_DEVICE_CONTROLLER,
|
||||
FILE_DEVICE_SECURE_OPEN,
|
||||
FALSE,
|
||||
&Fdo);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("IoCreateDevice() failed (Status 0x%08lx)\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
DPRINT1("Created device: %wZ (%p)\n", &DeviceName, Fdo);
|
||||
|
||||
/* Initialize the device */
|
||||
Fdo->Flags |= DO_DIRECT_IO;
|
||||
Fdo->Flags |= DO_POWER_PAGABLE;
|
||||
|
||||
/* Initialize the device extension */
|
||||
DeviceExtension = (PFDO_DEVICE_EXTENSION)Fdo->DeviceExtension;
|
||||
RtlZeroMemory(DeviceExtension, sizeof(FDO_DEVICE_EXTENSION));
|
||||
|
||||
DeviceExtension->ExtensionType = FdoExtension;
|
||||
|
||||
DeviceExtension->Device = Fdo;
|
||||
DeviceExtension->PhysicalDevice = PhysicalDeviceObject;
|
||||
|
||||
DeviceExtension->PnpState = dsStopped;
|
||||
|
||||
/* Attach the FDO to the device stack */
|
||||
Status = IoAttachDeviceToDeviceStackSafe(Fdo,
|
||||
PhysicalDeviceObject,
|
||||
&DeviceExtension->LowerDevice);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("IoAttachDeviceToDeviceStackSafe() failed (Status 0x%08lx)\n", Status);
|
||||
IoDeleteDevice(Fdo);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Insert the FDO to the drivers FDO list */
|
||||
DriverObjectExtension = IoGetDriverObjectExtension(DriverObject,
|
||||
(PVOID)DriverEntry);
|
||||
ASSERT(DriverObjectExtension->ExtensionType == DriverExtension);
|
||||
|
||||
KeAcquireInStackQueuedSpinLock(&DriverObjectExtension->AdapterListLock,
|
||||
&LockHandle);
|
||||
|
||||
InsertHeadList(&DriverObjectExtension->AdapterListHead,
|
||||
&DeviceExtension->AdapterListEntry);
|
||||
DriverObjectExtension->AdapterCount++;
|
||||
|
||||
KeReleaseInStackQueuedSpinLock(&LockHandle);
|
||||
|
||||
/* The device has been initialized */
|
||||
Fdo->Flags &= ~DO_DEVICE_INITIALIZING;
|
||||
|
||||
DPRINT1("PortAddDevice() done (Status 0x%08lx)\n", Status);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
static
|
||||
VOID
|
||||
NTAPI
|
||||
PortUnload(
|
||||
_In_ PDRIVER_OBJECT DriverObject)
|
||||
{
|
||||
DPRINT1("PortUnload(%p)\n",
|
||||
DriverObject);
|
||||
}
|
||||
|
||||
|
||||
static
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
PortDispatchCreate(
|
||||
IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PIRP Irp)
|
||||
{
|
||||
DPRINT1("PortDispatchCreate(%p %p)\n",
|
||||
DeviceObject, Irp);
|
||||
|
||||
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||
Irp->IoStatus.Information = FILE_OPENED;
|
||||
|
||||
IoCompleteRequest( Irp, IO_NO_INCREMENT );
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
static
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
PortDispatchClose(
|
||||
IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PIRP Irp)
|
||||
{
|
||||
DPRINT1("PortDispatchClose(%p %p)\n",
|
||||
DeviceObject, Irp);
|
||||
|
||||
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||
Irp->IoStatus.Information = 0;
|
||||
|
||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
static
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
PortDispatchDeviceControl(
|
||||
IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PIRP Irp)
|
||||
{
|
||||
DPRINT1("PortDispatchDeviceControl(%p %p)\n",
|
||||
DeviceObject, Irp);
|
||||
|
||||
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||
Irp->IoStatus.Information = 0;
|
||||
|
||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
static
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
PortDispatchScsi(
|
||||
IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PIRP Irp)
|
||||
{
|
||||
DPRINT1("PortDispatchScsi(%p %p)\n",
|
||||
DeviceObject, Irp);
|
||||
|
||||
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||
Irp->IoStatus.Information = 0;
|
||||
|
||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
static
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
PortDispatchSystemControl(
|
||||
IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PIRP Irp)
|
||||
{
|
||||
DPRINT1("PortDispatchSystemControl(%p %p)\n",
|
||||
DeviceObject, Irp);
|
||||
|
||||
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||
Irp->IoStatus.Information = 0;
|
||||
|
||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
static
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
PortDispatchPnp(
|
||||
IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PIRP Irp)
|
||||
{
|
||||
PFDO_DEVICE_EXTENSION DeviceExtension;
|
||||
|
||||
DPRINT1("PortDispatchPnp(%p %p)\n",
|
||||
DeviceObject, Irp);
|
||||
|
||||
DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
|
||||
DPRINT1("ExtensionType: %u\n", DeviceExtension->ExtensionType);
|
||||
|
||||
switch (DeviceExtension->ExtensionType)
|
||||
{
|
||||
case FdoExtension:
|
||||
return PortFdoPnp(DeviceObject,
|
||||
Irp);
|
||||
|
||||
case PdoExtension:
|
||||
return PortPdoPnp(DeviceObject,
|
||||
Irp);
|
||||
|
||||
default:
|
||||
Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
|
||||
Irp->IoStatus.Information = 0;
|
||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||
return STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
PortDispatchPower(
|
||||
IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PIRP Irp)
|
||||
{
|
||||
DPRINT1("PortDispatchPower(%p %p)\n",
|
||||
DeviceObject, Irp);
|
||||
|
||||
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||
Irp->IoStatus.Information = 0;
|
||||
|
||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/* PUBLIC FUNCTIONS ***********************************************************/
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
DriverEntry(
|
||||
_In_ PDRIVER_OBJECT DriverObject,
|
||||
_In_ PUNICODE_STRING RegistryPath)
|
||||
{
|
||||
DPRINT1("DriverEntry(%p %p)\n", DriverObject, RegistryPath);
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
STORPORT_API
|
||||
PUCHAR
|
||||
NTAPI
|
||||
StorPortAllocateRegistryBuffer(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ PULONG Length)
|
||||
{
|
||||
DPRINT1("StorPortAllocateRegistryBuffer()\n");
|
||||
UNIMPLEMENTED;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
STORPORT_API
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
StorPortBusy(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ ULONG RequestsToComplete)
|
||||
{
|
||||
DPRINT1("StorPortBuzy()\n");
|
||||
UNIMPLEMENTED;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
STORPORT_API
|
||||
VOID
|
||||
NTAPI
|
||||
StorPortCompleteRequest(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ UCHAR PathId,
|
||||
_In_ UCHAR TargetId,
|
||||
_In_ UCHAR Lun,
|
||||
_In_ UCHAR SrbStatus)
|
||||
{
|
||||
DPRINT1("StorPortCompleteRequest()\n");
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
STORPORT_API
|
||||
ULONG
|
||||
NTAPI
|
||||
StorPortConvertPhysicalAddressToUlong(
|
||||
_In_ STOR_PHYSICAL_ADDRESS Address)
|
||||
{
|
||||
DPRINT1("StorPortConvertPhysicalAddressToUlong()\n");
|
||||
|
||||
return Address.u.LowPart;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
STORPORT_API
|
||||
STOR_PHYSICAL_ADDRESS
|
||||
NTAPI
|
||||
StorPortConvertUlongToPhysicalAddress(
|
||||
_In_ ULONG_PTR UlongAddress)
|
||||
{
|
||||
STOR_PHYSICAL_ADDRESS Address;
|
||||
|
||||
DPRINT1("StorPortConvertUlongToPhysicalAddress()\n");
|
||||
|
||||
Address.QuadPart = UlongAddress;
|
||||
return Address;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
STORPORT_API
|
||||
VOID
|
||||
StorPortDebugPrint(
|
||||
_In_ ULONG DebugPrintLevel,
|
||||
_In_ PCHAR DebugMessage,
|
||||
...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, DebugMessage);
|
||||
vDbgPrintExWithPrefix("STORMINI: ", 0x58, DebugPrintLevel, DebugMessage, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
STORPORT_API
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
StorPortDeviceBusy(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ UCHAR PathId,
|
||||
_In_ UCHAR TargetId,
|
||||
_In_ UCHAR Lun,
|
||||
_In_ ULONG RequestsToComplete)
|
||||
{
|
||||
DPRINT1("StorPortDeviceBusy()\n");
|
||||
UNIMPLEMENTED;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
STORPORT_API
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
StorPortDeviceReady(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ UCHAR PathId,
|
||||
_In_ UCHAR TargetId,
|
||||
_In_ UCHAR Lun)
|
||||
{
|
||||
DPRINT1("StorPortDeviceReady()\n");
|
||||
UNIMPLEMENTED;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
STORPORT_API
|
||||
VOID
|
||||
NTAPI
|
||||
StorPortFreeDeviceBase(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ PVOID MappedAddress)
|
||||
{
|
||||
DPRINT1("StorPortFreeDeviceBase()\n");
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
STORPORT_API
|
||||
VOID
|
||||
NTAPI
|
||||
StorPortFreeRegistryBuffer(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ PUCHAR Buffer)
|
||||
{
|
||||
DPRINT1("StorPortFreeRegistryBuffer()\n");
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
STORPORT_API
|
||||
ULONG
|
||||
NTAPI
|
||||
StorPortGetBusData(
|
||||
_In_ PVOID DeviceExtension,
|
||||
_In_ ULONG BusDataType,
|
||||
_In_ ULONG SystemIoBusNumber,
|
||||
_In_ ULONG SlotNumber,
|
||||
_Out_ _When_(Length != 0, _Out_writes_bytes_(Length)) PVOID Buffer,
|
||||
_In_ ULONG Length)
|
||||
{
|
||||
DPRINT1("StorPortGetBusData()\n");
|
||||
UNIMPLEMENTED;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
STORPORT_API
|
||||
PVOID
|
||||
NTAPI
|
||||
StorPortGetDeviceBase(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ INTERFACE_TYPE BusType,
|
||||
_In_ ULONG SystemIoBusNumber,
|
||||
_In_ STOR_PHYSICAL_ADDRESS IoAddress,
|
||||
_In_ ULONG NumberOfBytes,
|
||||
_In_ BOOLEAN InIoSpace)
|
||||
{
|
||||
DPRINT1("StorPortGetDeviceBase()\n");
|
||||
UNIMPLEMENTED;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
STORPORT_API
|
||||
PVOID
|
||||
NTAPI
|
||||
StorPortGetLogicalUnit(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ UCHAR PathId,
|
||||
_In_ UCHAR TargetId,
|
||||
_In_ UCHAR Lun)
|
||||
{
|
||||
DPRINT1("StorPortGetLogicalUnit()\n");
|
||||
UNIMPLEMENTED;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
STORPORT_API
|
||||
STOR_PHYSICAL_ADDRESS
|
||||
NTAPI
|
||||
StorPortGetPhysicalAddress(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_opt_ PSCSI_REQUEST_BLOCK Srb,
|
||||
_In_ PVOID VirtualAddress,
|
||||
_Out_ ULONG *Length)
|
||||
{
|
||||
STOR_PHYSICAL_ADDRESS PhysicalAddress;
|
||||
|
||||
DPRINT1("StorPortGetPhysicalAddress(%p %p %p %p)\n",
|
||||
HwDeviceExtension, Srb, VirtualAddress, Length);
|
||||
UNIMPLEMENTED;
|
||||
|
||||
*Length = 0;
|
||||
PhysicalAddress.QuadPart = (LONGLONG)0;
|
||||
|
||||
return PhysicalAddress;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
STORPORT_API
|
||||
PSTOR_SCATTER_GATHER_LIST
|
||||
NTAPI
|
||||
StorPortGetScatterGatherList(
|
||||
_In_ PVOID DeviceExtension,
|
||||
_In_ PSCSI_REQUEST_BLOCK Srb)
|
||||
{
|
||||
DPRINT1("StorPortGetScatterGatherList()\n");
|
||||
UNIMPLEMENTED;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
STORPORT_API
|
||||
PSCSI_REQUEST_BLOCK
|
||||
NTAPI
|
||||
StorPortGetSrb(
|
||||
_In_ PVOID DeviceExtension,
|
||||
_In_ UCHAR PathId,
|
||||
_In_ UCHAR TargetId,
|
||||
_In_ UCHAR Lun,
|
||||
_In_ LONG QueueTag)
|
||||
{
|
||||
DPRINT("StorPortGetSrb()\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
STORPORT_API
|
||||
PVOID
|
||||
NTAPI
|
||||
StorPortGetUncachedExtension(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ PPORT_CONFIGURATION_INFORMATION ConfigInfo,
|
||||
_In_ ULONG NumberOfBytes)
|
||||
{
|
||||
DPRINT1("StorPortGetUncachedExtension(%p %p %lu)\n",
|
||||
HwDeviceExtension, ConfigInfo, NumberOfBytes);
|
||||
UNIMPLEMENTED;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
STORPORT_API
|
||||
PVOID
|
||||
NTAPI
|
||||
StorPortGetVirtualAddress(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ STOR_PHYSICAL_ADDRESS PhysicalAddress)
|
||||
{
|
||||
DPRINT1("StorPortGetVirtualAddress(%p %I64x)\n",
|
||||
HwDeviceExtension, PhysicalAddress.QuadPart);
|
||||
UNIMPLEMENTED;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
STORPORT_API
|
||||
ULONG
|
||||
NTAPI
|
||||
StorPortInitialize(
|
||||
_In_ PVOID Argument1,
|
||||
_In_ PVOID Argument2,
|
||||
_In_ struct _HW_INITIALIZATION_DATA *HwInitializationData,
|
||||
_In_opt_ PVOID HwContext)
|
||||
{
|
||||
PDRIVER_OBJECT DriverObject = (PDRIVER_OBJECT)Argument1;
|
||||
PUNICODE_STRING RegistryPath = (PUNICODE_STRING)Argument2;
|
||||
PDRIVER_OBJECT_EXTENSION DriverObjectExtension;
|
||||
NTSTATUS Status = STATUS_SUCCESS;
|
||||
|
||||
DPRINT1("StorPortInitialize(%p %p %p %p)\n",
|
||||
Argument1, Argument2, HwInitializationData, HwContext);
|
||||
|
||||
DPRINT1("HwInitializationDataSize: %lu\n", HwInitializationData->HwInitializationDataSize);
|
||||
DPRINT1("AdapterInterfaceType: %u\n", HwInitializationData->AdapterInterfaceType);
|
||||
DPRINT1("HwInitialize: %p\n", HwInitializationData->HwInitialize);
|
||||
DPRINT1("HwStartIo: %p\n", HwInitializationData->HwStartIo);
|
||||
DPRINT1("HwInterrupt: %p\n", HwInitializationData->HwInterrupt);
|
||||
DPRINT1("HwFindAdapter: %p\n", HwInitializationData->HwFindAdapter);
|
||||
DPRINT1("HwResetBus: %p\n", HwInitializationData->HwResetBus);
|
||||
DPRINT1("HwDmaStarted: %p\n", HwInitializationData->HwDmaStarted);
|
||||
DPRINT1("HwAdapterState: %p\n", HwInitializationData->HwAdapterState);
|
||||
DPRINT1("DeviceExtensionSize: %lu\n", HwInitializationData->DeviceExtensionSize);
|
||||
DPRINT1("SpecificLuExtensionSize: %lu\n", HwInitializationData->SpecificLuExtensionSize);
|
||||
DPRINT1("SrbExtensionSize: %lu\n", HwInitializationData->SrbExtensionSize);
|
||||
DPRINT1("NumberOfAccessRanges: %lu\n", HwInitializationData->NumberOfAccessRanges);
|
||||
|
||||
/* Check parameters */
|
||||
if ((DriverObject == NULL) ||
|
||||
(RegistryPath == NULL) ||
|
||||
(HwInitializationData == NULL))
|
||||
{
|
||||
DPRINT1("Invalid parameter!\n");
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
/* Check initialization data */
|
||||
if ((HwInitializationData->HwInitializationDataSize < sizeof(HW_INITIALIZATION_DATA)) ||
|
||||
(HwInitializationData->HwInitialize == NULL) ||
|
||||
(HwInitializationData->HwStartIo == NULL) ||
|
||||
(HwInitializationData->HwFindAdapter == NULL) ||
|
||||
(HwInitializationData->HwResetBus == NULL))
|
||||
{
|
||||
DPRINT1("Revision mismatch!\n");
|
||||
return STATUS_REVISION_MISMATCH;
|
||||
}
|
||||
|
||||
DriverObjectExtension = IoGetDriverObjectExtension(DriverObject,
|
||||
(PVOID)DriverEntry);
|
||||
if (DriverObjectExtension == NULL)
|
||||
{
|
||||
DPRINT1("No driver object extension!\n");
|
||||
|
||||
Status = IoAllocateDriverObjectExtension(DriverObject,
|
||||
(PVOID)DriverEntry,
|
||||
sizeof(DRIVER_OBJECT_EXTENSION),
|
||||
(PVOID *)&DriverObjectExtension);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("IoAllocateDriverObjectExtension() failed (Status 0x%08lx)\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
DPRINT1("Driver object extension created!\n");
|
||||
|
||||
/* Initialize the driver object extension */
|
||||
RtlZeroMemory(DriverObjectExtension,
|
||||
sizeof(DRIVER_OBJECT_EXTENSION));
|
||||
|
||||
DriverObjectExtension->ExtensionType = DriverExtension;
|
||||
DriverObjectExtension->DriverObject = DriverObject;
|
||||
|
||||
InitializeListHead(&DriverObjectExtension->AdapterListHead);
|
||||
KeInitializeSpinLock(&DriverObjectExtension->AdapterListLock);
|
||||
|
||||
|
||||
/* Set handlers */
|
||||
DriverObject->DriverExtension->AddDevice = PortAddDevice;
|
||||
// DriverObject->DriverStartIo = PortStartIo;
|
||||
DriverObject->DriverUnload = PortUnload;
|
||||
DriverObject->MajorFunction[IRP_MJ_CREATE] = PortDispatchCreate;
|
||||
DriverObject->MajorFunction[IRP_MJ_CLOSE] = PortDispatchClose;
|
||||
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = PortDispatchDeviceControl;
|
||||
DriverObject->MajorFunction[IRP_MJ_SCSI] = PortDispatchScsi;
|
||||
DriverObject->MajorFunction[IRP_MJ_POWER] = PortDispatchPower;
|
||||
DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = PortDispatchSystemControl;
|
||||
DriverObject->MajorFunction[IRP_MJ_PNP] = PortDispatchPnp;
|
||||
}
|
||||
|
||||
DPRINT1("StorPortInitialize() done (Status 0x%08lx)\n", Status);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
STORPORT_API
|
||||
VOID
|
||||
NTAPI
|
||||
StorPortLogError(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_opt_ PSCSI_REQUEST_BLOCK Srb,
|
||||
_In_ UCHAR PathId,
|
||||
_In_ UCHAR TargetId,
|
||||
_In_ UCHAR Lun,
|
||||
_In_ ULONG ErrorCode,
|
||||
_In_ ULONG UniqueId)
|
||||
{
|
||||
DPRINT1("ScsiPortLogError() called\n");
|
||||
DPRINT1("PathId: 0x%02x TargetId: 0x%02x Lun: 0x%02x ErrorCode: 0x%08lx UniqueId: 0x%08lx\n",
|
||||
PathId, TargetId, Lun, ErrorCode, UniqueId);
|
||||
|
||||
DPRINT1("ScsiPortLogError() done\n");
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
STORPORT_API
|
||||
VOID
|
||||
NTAPI
|
||||
StorPortMoveMemory(
|
||||
_Out_writes_bytes_(Length) PVOID Destination,
|
||||
_In_reads_bytes_(Length) PVOID Source,
|
||||
_In_ ULONG Length)
|
||||
{
|
||||
RtlMoveMemory(Destination, Source, Length);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
STORPORT_API
|
||||
VOID
|
||||
StorPortNotification(
|
||||
_In_ SCSI_NOTIFICATION_TYPE NotificationType,
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
...)
|
||||
{
|
||||
DPRINT1("StorPortNotification()\n");
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
STORPORT_API
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
StorPortPause(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ ULONG TimeOut)
|
||||
{
|
||||
DPRINT1("StorPortPause()\n");
|
||||
UNIMPLEMENTED;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
STORPORT_API
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
StorPortPauseDevice(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ UCHAR PathId,
|
||||
_In_ UCHAR TargetId,
|
||||
_In_ UCHAR Lun,
|
||||
_In_ ULONG TimeOut)
|
||||
{
|
||||
DPRINT1("StorPortPauseDevice()\n");
|
||||
UNIMPLEMENTED;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
STORPORT_API
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
StorPortReady(
|
||||
_In_ PVOID HwDeviceExtension)
|
||||
{
|
||||
DPRINT1("StorPortReady()\n");
|
||||
UNIMPLEMENTED;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
STORPORT_API
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
StorPortRegistryRead(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ PUCHAR ValueName,
|
||||
_In_ ULONG Global,
|
||||
_In_ ULONG Type,
|
||||
_In_ PUCHAR Buffer,
|
||||
_In_ PULONG BufferLength)
|
||||
{
|
||||
DPRINT1("StorPortRegistryRead()\n");
|
||||
UNIMPLEMENTED;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
STORPORT_API
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
StorPortRegistryWrite(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ PUCHAR ValueName,
|
||||
_In_ ULONG Global,
|
||||
_In_ ULONG Type,
|
||||
_In_ PUCHAR Buffer,
|
||||
_In_ ULONG BufferLength)
|
||||
{
|
||||
DPRINT1("StorPortRegistryWrite()\n");
|
||||
UNIMPLEMENTED;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
STORPORT_API
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
StorPortResume(
|
||||
_In_ PVOID HwDeviceExtension)
|
||||
{
|
||||
DPRINT1("StorPortResume()\n");
|
||||
UNIMPLEMENTED;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
STORPORT_API
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
StorPortResumeDevice(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ UCHAR PathId,
|
||||
_In_ UCHAR TargetId,
|
||||
_In_ UCHAR Lun)
|
||||
{
|
||||
DPRINT1("StorPortResumeDevice()\n");
|
||||
UNIMPLEMENTED;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
STORPORT_API
|
||||
ULONG
|
||||
NTAPI
|
||||
StorPortSetBusDataByOffset(
|
||||
_In_ PVOID DeviceExtension,
|
||||
_In_ ULONG BusDataType,
|
||||
_In_ ULONG SystemIoBusNumber,
|
||||
_In_ ULONG SlotNumber,
|
||||
_In_reads_bytes_(Length) PVOID Buffer,
|
||||
_In_ ULONG Offset,
|
||||
_In_ ULONG Length)
|
||||
{
|
||||
DPRINT1("StorPortSetBusDataByOffset()\n");
|
||||
UNIMPLEMENTED;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
STORPORT_API
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
StorPortSetDeviceQueueDepth(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ UCHAR PathId,
|
||||
_In_ UCHAR TargetId,
|
||||
_In_ UCHAR Lun,
|
||||
_In_ ULONG Depth)
|
||||
{
|
||||
DPRINT1("StorPortSetDeviceQueueDepth()\n");
|
||||
UNIMPLEMENTED;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
STORPORT_API
|
||||
VOID
|
||||
NTAPI
|
||||
StorPortStallExecution(
|
||||
_In_ ULONG Delay)
|
||||
{
|
||||
KeStallExecutionProcessor(Delay);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
STORPORT_API
|
||||
VOID
|
||||
NTAPI
|
||||
StorPortSynchronizeAccess(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ PSTOR_SYNCHRONIZED_ACCESS SynchronizedAccessRoutine,
|
||||
_In_opt_ PVOID Context)
|
||||
{
|
||||
DPRINT1("StorPortSynchronizeAccess()\n");
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
STORPORT_API
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
StorPortValidateRange(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ INTERFACE_TYPE BusType,
|
||||
_In_ ULONG SystemIoBusNumber,
|
||||
_In_ STOR_PHYSICAL_ADDRESS IoAddress,
|
||||
_In_ ULONG NumberOfBytes,
|
||||
_In_ BOOLEAN InIoSpace)
|
||||
{
|
||||
DPRINT1("StorPortValidateRange()\n");
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* EOF */
|
5
drivers/storage/port/storport/storport.rc
Normal file
5
drivers/storage/port/storport/storport.rc
Normal file
|
@ -0,0 +1,5 @@
|
|||
#define REACTOS_VERSION_DLL
|
||||
#define REACTOS_STR_FILE_DESCRIPTION "Storport Driver"
|
||||
#define REACTOS_STR_INTERNAL_NAME "storport"
|
||||
#define REACTOS_STR_ORIGINAL_FILENAME "storport.sys"
|
||||
#include <reactos/version.rc>
|
63
drivers/storage/port/storport/storport.spec
Normal file
63
drivers/storage/port/storport/storport.spec
Normal file
|
@ -0,0 +1,63 @@
|
|||
# DllInitialize
|
||||
@ stdcall ScsiPortMoveMemory(ptr ptr long) StorPortMoveMemory
|
||||
@ cdecl ScsiPortNotification() StorPortNotification
|
||||
@ stdcall StorPortAllocateRegistryBuffer(ptr ptr)
|
||||
@ stdcall StorPortBusy(ptr long)
|
||||
@ stdcall StorPortCompleteRequest(ptr long long long long)
|
||||
@ stdcall StorPortConvertPhysicalAddressToUlong(long long)
|
||||
@ stdcall StorPortConvertUlongToPhysicalAddress(long)
|
||||
@ cdecl StorPortDebugPrint()
|
||||
@ stdcall StorPortDeviceBusy(ptr long long long long)
|
||||
@ stdcall StorPortDeviceReady(ptr long long long)
|
||||
# StorPortExtendedFunction
|
||||
@ stdcall StorPortFreeDeviceBase(ptr ptr)
|
||||
@ stdcall StorPortFreeRegistryBuffer(ptr ptr)
|
||||
@ stdcall StorPortGetBusData(ptr long long long ptr long)
|
||||
@ stdcall StorPortGetDeviceBase(ptr long long long long long long)
|
||||
@ stdcall StorPortGetLogicalUnit(ptr long long long)
|
||||
@ stdcall StorPortGetPhysicalAddress(ptr ptr ptr long)
|
||||
@ stdcall StorPortGetScatterGatherList(ptr ptr)
|
||||
@ stdcall StorPortGetSrb(ptr long long long long)
|
||||
@ stdcall StorPortGetUncachedExtension(ptr ptr long)
|
||||
@ stdcall StorPortGetVirtualAddress(ptr long long)
|
||||
@ stdcall StorPortInitialize(ptr ptr ptr ptr)
|
||||
@ stdcall StorPortLogError(ptr ptr long long long long long)
|
||||
@ stdcall StorPortMoveMemory(ptr ptr long)
|
||||
@ cdecl StorPortNotification()
|
||||
@ stdcall StorPortQuerySystemTime(ptr) NTOSKRNL.KeQuerySystemTime
|
||||
@ stdcall StorPortPause(ptr long)
|
||||
@ stdcall StorPortPauseDevice(ptr long long long long)
|
||||
@ stdcall StorPortReadPortBufferUchar(ptr ptr ptr long)
|
||||
@ stdcall StorPortReadPortBufferUlong(ptr ptr ptr long)
|
||||
@ stdcall StorPortReadPortBufferUshort(ptr ptr ptr long)
|
||||
@ stdcall StorPortReadPortUchar(ptr ptr)
|
||||
@ stdcall StorPortReadPortUlong(ptr ptr)
|
||||
@ stdcall StorPortReadPortUshort(ptr ptr)
|
||||
@ stdcall StorPortReadRegisterBufferUchar(ptr ptr ptr long)
|
||||
@ stdcall StorPortReadRegisterBufferUlong(ptr ptr ptr long)
|
||||
@ stdcall StorPortReadRegisterBufferUshort(ptr ptr ptr long)
|
||||
@ stdcall StorPortReadRegisterUchar(ptr ptr)
|
||||
@ stdcall StorPortReadRegisterUlong(ptr ptr)
|
||||
@ stdcall StorPortReadRegisterUshort(ptr ptr)
|
||||
@ stdcall StorPortReady(ptr)
|
||||
@ stdcall StorPortRegistryRead(ptr ptr long long ptr ptr)
|
||||
@ stdcall StorPortRegistryWrite(ptr ptr long long ptr long)
|
||||
@ stdcall StorPortResume(ptr)
|
||||
@ stdcall StorPortResumeDevice(ptr long long long)
|
||||
@ stdcall StorPortSetBusDataByOffset(ptr long long long ptr long long)
|
||||
@ stdcall StorPortSetDeviceQueueDepth(ptr long long long long)
|
||||
@ stdcall StorPortStallExecution(long)
|
||||
@ stdcall StorPortSynchronizeAccess(ptr ptr ptr)
|
||||
@ stdcall StorPortValidateRange(ptr long long long long long long)
|
||||
@ stdcall StorPortWritePortBufferUchar(ptr ptr ptr long)
|
||||
@ stdcall StorPortWritePortBufferUlong(ptr ptr ptr long)
|
||||
@ stdcall StorPortWritePortBufferUshort(ptr ptr ptr long)
|
||||
@ stdcall StorPortWritePortUchar(ptr ptr long)
|
||||
@ stdcall StorPortWritePortUlong(ptr ptr long)
|
||||
@ stdcall StorPortWritePortUshort(ptr ptr long)
|
||||
@ stdcall StorPortWriteRegisterBufferUchar(ptr ptr ptr long)
|
||||
@ stdcall StorPortWriteRegisterBufferUlong(ptr ptr ptr long)
|
||||
@ stdcall StorPortWriteRegisterBufferUshort(ptr ptr ptr long)
|
||||
@ stdcall StorPortWriteRegisterUchar(ptr ptr long)
|
||||
@ stdcall StorPortWriteRegisterUlong(ptr ptr long)
|
||||
@ stdcall StorPortWriteRegisterUshort(ptr ptr long)
|
311
drivers/storage/port/storport/stubs.c
Normal file
311
drivers/storage/port/storport/stubs.c
Normal file
|
@ -0,0 +1,311 @@
|
|||
/*
|
||||
* PROJECT: ReactOS Storport Driver
|
||||
* LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
|
||||
* PURPOSE: Storport driver stub functions
|
||||
* COPYRIGHT: Copyright 2017 Eric Kohl (eric.kohl@reactos.org)
|
||||
*/
|
||||
|
||||
/* INCLUDES *******************************************************************/
|
||||
|
||||
#include "precomp.h"
|
||||
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
|
||||
/* FUNCTIONS ******************************************************************/
|
||||
|
||||
STORPORT_API
|
||||
VOID
|
||||
NTAPI
|
||||
StorPortReadPortBufferUchar(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ PUCHAR Port,
|
||||
_In_ PUCHAR Buffer,
|
||||
_In_ ULONG Count)
|
||||
{
|
||||
READ_PORT_BUFFER_UCHAR(Port, Buffer, Count);
|
||||
}
|
||||
|
||||
|
||||
STORPORT_API
|
||||
VOID
|
||||
NTAPI
|
||||
StorPortReadPortBufferUlong(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ PULONG Port,
|
||||
_In_ PULONG Buffer,
|
||||
_In_ ULONG Count)
|
||||
{
|
||||
READ_PORT_BUFFER_ULONG(Port, Buffer, Count);
|
||||
}
|
||||
|
||||
|
||||
STORPORT_API
|
||||
VOID
|
||||
NTAPI
|
||||
StorPortReadPortBufferUshort(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ PUSHORT Port,
|
||||
_In_ PUSHORT Buffer,
|
||||
_In_ ULONG Count)
|
||||
{
|
||||
READ_PORT_BUFFER_USHORT(Port, Buffer, Count);
|
||||
}
|
||||
|
||||
|
||||
STORPORT_API
|
||||
UCHAR
|
||||
NTAPI
|
||||
StorPortReadPortUchar(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ PUCHAR Port)
|
||||
{
|
||||
return READ_PORT_UCHAR(Port);
|
||||
}
|
||||
|
||||
|
||||
STORPORT_API
|
||||
ULONG
|
||||
NTAPI
|
||||
StorPortReadPortUlong(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ PULONG Port)
|
||||
{
|
||||
return READ_PORT_ULONG(Port);
|
||||
}
|
||||
|
||||
|
||||
STORPORT_API
|
||||
USHORT
|
||||
NTAPI
|
||||
StorPortReadPortUshort(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ PUSHORT Port)
|
||||
{
|
||||
return READ_PORT_USHORT(Port);
|
||||
}
|
||||
|
||||
|
||||
STORPORT_API
|
||||
VOID
|
||||
NTAPI
|
||||
StorPortReadRegisterBufferUchar(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ PUCHAR Register,
|
||||
_In_ PUCHAR Buffer,
|
||||
_In_ ULONG Count)
|
||||
{
|
||||
READ_REGISTER_BUFFER_UCHAR(Register, Buffer, Count);
|
||||
}
|
||||
|
||||
|
||||
STORPORT_API
|
||||
VOID
|
||||
NTAPI
|
||||
StorPortReadRegisterBufferUlong(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ PULONG Register,
|
||||
_In_ PULONG Buffer,
|
||||
_In_ ULONG Count)
|
||||
{
|
||||
READ_REGISTER_BUFFER_ULONG(Register, Buffer, Count);
|
||||
}
|
||||
|
||||
|
||||
STORPORT_API
|
||||
VOID
|
||||
NTAPI
|
||||
StorPortReadRegisterBufferUshort(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ PUSHORT Register,
|
||||
_In_ PUSHORT Buffer,
|
||||
_In_ ULONG Count)
|
||||
{
|
||||
READ_REGISTER_BUFFER_USHORT(Register, Buffer, Count);
|
||||
}
|
||||
|
||||
|
||||
STORPORT_API
|
||||
UCHAR
|
||||
NTAPI
|
||||
StorPortReadRegisterUchar(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ PUCHAR Register)
|
||||
{
|
||||
return READ_REGISTER_UCHAR(Register);
|
||||
}
|
||||
|
||||
|
||||
STORPORT_API
|
||||
ULONG
|
||||
NTAPI
|
||||
StorPortReadRegisterUlong(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ PULONG Register)
|
||||
{
|
||||
return READ_REGISTER_ULONG(Register);
|
||||
}
|
||||
|
||||
|
||||
STORPORT_API
|
||||
USHORT
|
||||
NTAPI
|
||||
StorPortReadRegisterUshort(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ PUSHORT Register)
|
||||
{
|
||||
return READ_REGISTER_USHORT(Register);
|
||||
}
|
||||
|
||||
|
||||
STORPORT_API
|
||||
VOID
|
||||
NTAPI
|
||||
StorPortWritePortBufferUchar(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ PUCHAR Port,
|
||||
_In_ PUCHAR Buffer,
|
||||
_In_ ULONG Count)
|
||||
{
|
||||
WRITE_PORT_BUFFER_UCHAR(Port, Buffer, Count);
|
||||
}
|
||||
|
||||
|
||||
STORPORT_API
|
||||
VOID
|
||||
NTAPI
|
||||
StorPortWritePortBufferUlong(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ PULONG Port,
|
||||
_In_ PULONG Buffer,
|
||||
_In_ ULONG Count)
|
||||
{
|
||||
WRITE_PORT_BUFFER_ULONG(Port, Buffer, Count);
|
||||
}
|
||||
|
||||
|
||||
STORPORT_API
|
||||
VOID
|
||||
NTAPI
|
||||
StorPortWritePortBufferUshort(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ PUSHORT Port,
|
||||
_In_ PUSHORT Buffer,
|
||||
_In_ ULONG Count)
|
||||
{
|
||||
WRITE_PORT_BUFFER_USHORT(Port, Buffer, Count);
|
||||
}
|
||||
|
||||
|
||||
STORPORT_API
|
||||
VOID
|
||||
NTAPI
|
||||
StorPortWritePortUchar(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ PUCHAR Port,
|
||||
_In_ UCHAR Value)
|
||||
{
|
||||
WRITE_PORT_UCHAR(Port, Value);
|
||||
}
|
||||
|
||||
|
||||
STORPORT_API
|
||||
VOID
|
||||
NTAPI
|
||||
StorPortWritePortUlong(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ PULONG Port,
|
||||
_In_ ULONG Value)
|
||||
{
|
||||
WRITE_PORT_ULONG(Port, Value);
|
||||
}
|
||||
|
||||
|
||||
STORPORT_API
|
||||
VOID
|
||||
NTAPI
|
||||
StorPortWritePortUshort(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ PUSHORT Port,
|
||||
_In_ USHORT Value)
|
||||
{
|
||||
WRITE_PORT_USHORT(Port, Value);
|
||||
}
|
||||
|
||||
|
||||
STORPORT_API
|
||||
VOID
|
||||
NTAPI
|
||||
StorPortWriteRegisterBufferUchar(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ PUCHAR Register,
|
||||
_In_ PUCHAR Buffer,
|
||||
_In_ ULONG Count)
|
||||
{
|
||||
WRITE_REGISTER_BUFFER_UCHAR(Register, Buffer, Count);
|
||||
}
|
||||
|
||||
|
||||
STORPORT_API
|
||||
VOID
|
||||
NTAPI
|
||||
StorPortWriteRegisterBufferUlong(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ PULONG Register,
|
||||
_In_ PULONG Buffer,
|
||||
_In_ ULONG Count)
|
||||
{
|
||||
WRITE_REGISTER_BUFFER_ULONG(Register, Buffer, Count);
|
||||
}
|
||||
|
||||
|
||||
STORPORT_API
|
||||
VOID
|
||||
NTAPI
|
||||
StorPortWriteRegisterBufferUshort(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ PUSHORT Register,
|
||||
_In_ PUSHORT Buffer,
|
||||
_In_ ULONG Count)
|
||||
{
|
||||
WRITE_REGISTER_BUFFER_USHORT(Register, Buffer, Count);
|
||||
}
|
||||
|
||||
|
||||
STORPORT_API
|
||||
VOID
|
||||
NTAPI
|
||||
StorPortWriteRegisterUchar(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ PUCHAR Register,
|
||||
_In_ UCHAR Value)
|
||||
{
|
||||
WRITE_REGISTER_UCHAR(Register, Value);
|
||||
}
|
||||
|
||||
|
||||
STORPORT_API
|
||||
VOID
|
||||
NTAPI
|
||||
StorPortWriteRegisterUlong(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ PULONG Register,
|
||||
_In_ ULONG Value)
|
||||
{
|
||||
WRITE_REGISTER_ULONG(Register, Value);
|
||||
}
|
||||
|
||||
|
||||
STORPORT_API
|
||||
VOID
|
||||
NTAPI
|
||||
StorPortWriteRegisterUshort(
|
||||
_In_ PVOID HwDeviceExtension,
|
||||
_In_ PUSHORT Register,
|
||||
_In_ USHORT Value)
|
||||
{
|
||||
WRITE_REGISTER_USHORT(Register, Value);
|
||||
}
|
||||
|
||||
/* EOF */
|
Loading…
Reference in a new issue