mirror of
https://github.com/reactos/reactos.git
synced 2024-08-30 15:18:33 +00:00
![Eric Kohl](/assets/img/avatar_default.png)
- Create PDO for the device - Send a SCSIOP_INQUIRY command to the new PDO - Delete the PDO if the inquiry command failed
148 lines
3.7 KiB
C
148 lines
3.7 KiB
C
/*
|
|
* 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
|
|
PortCreatePdo(
|
|
_In_ PFDO_DEVICE_EXTENSION FdoDeviceExtension,
|
|
_In_ ULONG Bus,
|
|
_In_ ULONG Target,
|
|
_In_ ULONG Lun,
|
|
_Out_ PPDO_DEVICE_EXTENSION *PdoDeviceExtension)
|
|
{
|
|
PPDO_DEVICE_EXTENSION DeviceExtension = NULL;
|
|
PDEVICE_OBJECT Pdo = NULL;
|
|
KLOCK_QUEUE_HANDLE LockHandle;
|
|
NTSTATUS Status;
|
|
|
|
DPRINT("PortCreatePdo(%p %p)\n",
|
|
FdoDeviceExtension, PdoDeviceExtension);
|
|
|
|
/* Create the port device */
|
|
Status = IoCreateDevice(FdoDeviceExtension->Device->DriverObject,
|
|
sizeof(PDO_DEVICE_EXTENSION),
|
|
NULL,
|
|
FILE_DEVICE_MASS_STORAGE,
|
|
FILE_DEVICE_SECURE_OPEN | FILE_AUTOGENERATED_DEVICE_NAME,
|
|
FALSE,
|
|
&Pdo);
|
|
if (!NT_SUCCESS(Status))
|
|
{
|
|
DPRINT1("IoCreateDevice() failed (Status 0x%lX)\n", Status);
|
|
return Status;
|
|
}
|
|
|
|
/* Initialize the device */
|
|
Pdo->Flags |= DO_DIRECT_IO;
|
|
Pdo->Flags |= DO_POWER_PAGABLE;
|
|
|
|
DeviceExtension = (PPDO_DEVICE_EXTENSION)Pdo->DeviceExtension;
|
|
RtlZeroMemory(DeviceExtension, sizeof(PDO_DEVICE_EXTENSION));
|
|
|
|
DeviceExtension->ExtensionType = PdoExtension;
|
|
|
|
DeviceExtension->Device = Pdo;
|
|
DeviceExtension->FdoExtension = FdoDeviceExtension;
|
|
DeviceExtension->PnpState = dsStopped;
|
|
|
|
/* Add the PDO to the PDO list*/
|
|
KeAcquireInStackQueuedSpinLock(&FdoDeviceExtension->PdoListLock,
|
|
&LockHandle);
|
|
InsertHeadList(&FdoDeviceExtension->PdoListHead,
|
|
&DeviceExtension->PdoListEntry);
|
|
FdoDeviceExtension->PdoCount++;
|
|
KeReleaseInStackQueuedSpinLock(&LockHandle);
|
|
|
|
DeviceExtension->Bus = Bus;
|
|
DeviceExtension->Target = Target;
|
|
DeviceExtension->Lun = Lun;
|
|
|
|
|
|
// FIXME: More initialization
|
|
|
|
|
|
/* The device has been initialized */
|
|
Pdo->Flags &= ~DO_DEVICE_INITIALIZING;
|
|
|
|
*PdoDeviceExtension = DeviceExtension;
|
|
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
|
|
NTSTATUS
|
|
PortDeletePdo(
|
|
_In_ PPDO_DEVICE_EXTENSION PdoExtension)
|
|
{
|
|
KLOCK_QUEUE_HANDLE LockHandle;
|
|
|
|
DPRINT("PortDeletePdo(%p)\n", PdoExtension);
|
|
|
|
/* Remove the PDO from the PDO list*/
|
|
KeAcquireInStackQueuedSpinLock(&PdoExtension->FdoExtension->PdoListLock,
|
|
&LockHandle);
|
|
RemoveEntryList(&PdoExtension->PdoListEntry);
|
|
PdoExtension->FdoExtension->PdoCount--;
|
|
KeReleaseInStackQueuedSpinLock(&LockHandle);
|
|
|
|
if (PdoExtension->InquiryBuffer)
|
|
{
|
|
ExFreePoolWithTag(PdoExtension->InquiryBuffer, TAG_INQUIRY_DATA);
|
|
PdoExtension->InquiryBuffer = NULL;
|
|
}
|
|
|
|
|
|
// FIXME: More uninitialization
|
|
|
|
|
|
/* Delete the PDO */
|
|
IoDeleteDevice(PdoExtension->Device);
|
|
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
PortPdoScsi(
|
|
_In_ PDEVICE_OBJECT DeviceObject,
|
|
_In_ PIRP Irp)
|
|
{
|
|
DPRINT1("PortPdoScsi(%p %p)\n", DeviceObject, Irp);
|
|
|
|
Irp->IoStatus.Information = 0;
|
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
PortPdoPnp(
|
|
_In_ PDEVICE_OBJECT DeviceObject,
|
|
_In_ PIRP Irp)
|
|
{
|
|
DPRINT1("PortPdoPnp(%p %p)\n", DeviceObject, Irp);
|
|
|
|
Irp->IoStatus.Information = 0;
|
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
/* EOF */
|