xref: /reactos/drivers/storage/port/storport/pdo.c (revision e419195d)
1 /*
2  * PROJECT:     ReactOS Storport Driver
3  * LICENSE:     GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4  * PURPOSE:     Storport PDO code
5  * COPYRIGHT:   Copyright 2017 Eric Kohl (eric.kohl@reactos.org)
6  */
7 
8 /* INCLUDES *******************************************************************/
9 
10 #include "precomp.h"
11 
12 #define NDEBUG
13 #include <debug.h>
14 
15 
16 /* FUNCTIONS ******************************************************************/
17 
18 NTSTATUS
19 PortCreatePdo(
20     _In_ PFDO_DEVICE_EXTENSION FdoDeviceExtension,
21     _In_ ULONG Bus,
22     _In_ ULONG Target,
23     _In_ ULONG Lun,
24     _Out_ PPDO_DEVICE_EXTENSION *PdoDeviceExtension)
25 {
26     PPDO_DEVICE_EXTENSION DeviceExtension = NULL;
27     PDEVICE_OBJECT Pdo = NULL;
28     KLOCK_QUEUE_HANDLE LockHandle;
29     NTSTATUS Status;
30 
31     DPRINT("PortCreatePdo(%p %p)\n",
32            FdoDeviceExtension, PdoDeviceExtension);
33 
34     /* Create the port device */
35     Status = IoCreateDevice(FdoDeviceExtension->Device->DriverObject,
36                             sizeof(PDO_DEVICE_EXTENSION),
37                             NULL,
38                             FILE_DEVICE_MASS_STORAGE,
39                             FILE_DEVICE_SECURE_OPEN | FILE_AUTOGENERATED_DEVICE_NAME,
40                             FALSE,
41                             &Pdo);
42     if (!NT_SUCCESS(Status))
43     {
44         DPRINT1("IoCreateDevice() failed (Status 0x%lX)\n", Status);
45         return Status;
46     }
47 
48     /* Initialize the device */
49     Pdo->Flags |= DO_DIRECT_IO;
50     Pdo->Flags |= DO_POWER_PAGABLE;
51 
52     DeviceExtension = (PPDO_DEVICE_EXTENSION)Pdo->DeviceExtension;
53     RtlZeroMemory(DeviceExtension, sizeof(PDO_DEVICE_EXTENSION));
54 
55     DeviceExtension->ExtensionType = PdoExtension;
56 
57     DeviceExtension->Device = Pdo;
58     DeviceExtension->FdoExtension = FdoDeviceExtension;
59     DeviceExtension->PnpState = dsStopped;
60 
61     /* Add the PDO to the PDO list*/
62     KeAcquireInStackQueuedSpinLock(&FdoDeviceExtension->PdoListLock,
63                                    &LockHandle);
64     InsertHeadList(&FdoDeviceExtension->PdoListHead,
65                    &DeviceExtension->PdoListEntry);
66     FdoDeviceExtension->PdoCount++;
67     KeReleaseInStackQueuedSpinLock(&LockHandle);
68 
69     DeviceExtension->Bus = Bus;
70     DeviceExtension->Target = Target;
71     DeviceExtension->Lun = Lun;
72 
73 
74     // FIXME: More initialization
75 
76 
77     /* The device has been initialized */
78     Pdo->Flags &= ~DO_DEVICE_INITIALIZING;
79 
80     *PdoDeviceExtension = DeviceExtension;
81 
82     return STATUS_SUCCESS;
83 }
84 
85 
86 NTSTATUS
87 PortDeletePdo(
88     _In_ PPDO_DEVICE_EXTENSION PdoExtension)
89 {
90     KLOCK_QUEUE_HANDLE LockHandle;
91 
92     DPRINT("PortDeletePdo(%p)\n", PdoExtension);
93 
94     /* Remove the PDO from the PDO list*/
95     KeAcquireInStackQueuedSpinLock(&PdoExtension->FdoExtension->PdoListLock,
96                                    &LockHandle);
97     RemoveEntryList(&PdoExtension->PdoListEntry);
98     PdoExtension->FdoExtension->PdoCount--;
99     KeReleaseInStackQueuedSpinLock(&LockHandle);
100 
101     if (PdoExtension->InquiryBuffer)
102     {
103         ExFreePoolWithTag(PdoExtension->InquiryBuffer, TAG_INQUIRY_DATA);
104         PdoExtension->InquiryBuffer = NULL;
105     }
106 
107 
108     // FIXME: More uninitialization
109 
110 
111     /* Delete the PDO */
112     IoDeleteDevice(PdoExtension->Device);
113 
114     return STATUS_SUCCESS;
115 }
116 
117 
118 NTSTATUS
119 NTAPI
120 PortPdoScsi(
121     _In_ PDEVICE_OBJECT DeviceObject,
122     _In_ PIRP Irp)
123 {
124     DPRINT1("PortPdoScsi(%p %p)\n", DeviceObject, Irp);
125 
126     Irp->IoStatus.Information = 0;
127     Irp->IoStatus.Status = STATUS_SUCCESS;
128     IoCompleteRequest(Irp, IO_NO_INCREMENT);
129     return STATUS_SUCCESS;
130 }
131 
132 
133 NTSTATUS
134 NTAPI
135 PortPdoPnp(
136     _In_ PDEVICE_OBJECT DeviceObject,
137     _In_ PIRP Irp)
138 {
139     DPRINT1("PortPdoPnp(%p %p)\n", DeviceObject, Irp);
140 
141     Irp->IoStatus.Information = 0;
142     Irp->IoStatus.Status = STATUS_SUCCESS;
143     IoCompleteRequest(Irp, IO_NO_INCREMENT);
144     return STATUS_SUCCESS;
145 }
146 
147 /* EOF */
148