Skip to content

Commit 94e61c3

Browse files
committed
[USBSTOR] Move PDO's Inquiry data and FDO's SCSI context
to their Device Extensions. This way the driver can better handle low memory situations
1 parent a9b97ae commit 94e61c3

File tree

5 files changed

+113
-148
lines changed

5 files changed

+113
-148
lines changed

drivers/usb/usbstor/disk.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -283,8 +283,7 @@ USBSTOR_HandleQueryProperty(
283283
ASSERT(FDODeviceExtension);
284284
ASSERT(FDODeviceExtension->Common.IsFDO);
285285

286-
InquiryData = PDODeviceExtension->InquiryData;
287-
ASSERT(InquiryData);
286+
InquiryData = (PINQUIRYDATA)&PDODeviceExtension->InquiryData;
288287

289288
// compute extra parameters length
290289
FieldLengthVendor = USBSTOR_GetFieldLength(InquiryData->VendorId, 8);
@@ -507,7 +506,7 @@ USBSTOR_HandleDeviceControl(
507506

508507
// Note: INQUIRYDATA structure is larger than INQUIRYDATABUFFERSIZE
509508
RtlZeroMemory(InquiryData, sizeof(INQUIRYDATA));
510-
RtlCopyMemory(InquiryData, PDODeviceExtension->InquiryData, INQUIRYDATABUFFERSIZE);
509+
RtlCopyMemory(InquiryData, &PDODeviceExtension->InquiryData, sizeof(PDODeviceExtension->InquiryData));
511510

512511
InquiryData->Versions = 0x04;
513512
InquiryData->ResponseDataFormat = 0x02; // some devices set this to 1

drivers/usb/usbstor/error.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -77,15 +77,15 @@ USBSTOR_ResetPipeWorkItemRoutine(
7777
IN PVOID Ctx)
7878
{
7979
NTSTATUS Status;
80-
PIRP_CONTEXT Context = (PIRP_CONTEXT)Ctx;
81-
PFDO_DEVICE_EXTENSION FDODeviceExtension = (PFDO_DEVICE_EXTENSION)FdoDevice->DeviceExtension;
80+
PFDO_DEVICE_EXTENSION FDODeviceExtension = (PFDO_DEVICE_EXTENSION)Ctx;
81+
PIRP_CONTEXT Context = &FDODeviceExtension->CurrentIrpContext;
8282

8383
// clear stall on the corresponding pipe
8484
Status = USBSTOR_ResetPipeWithHandle(FDODeviceExtension->LowerDeviceObject, Context->Urb.UrbBulkOrInterruptTransfer.PipeHandle);
8585
DPRINT1("USBSTOR_ResetPipeWithHandle Status %x\n", Status);
8686

8787
// now resend the csw as the stall got cleared
88-
USBSTOR_SendCSWRequest(Context, Context->Irp);
88+
USBSTOR_SendCSWRequest(FDODeviceExtension, Context->Irp);
8989
}
9090

9191
VOID
@@ -133,15 +133,14 @@ USBSTOR_ResetDeviceWorkItemRoutine(
133133
VOID
134134
NTAPI
135135
USBSTOR_QueueResetPipe(
136-
IN PFDO_DEVICE_EXTENSION FDODeviceExtension,
137-
IN PIRP_CONTEXT Context)
136+
IN PFDO_DEVICE_EXTENSION FDODeviceExtension)
138137
{
139138
DPRINT("USBSTOR_QueueResetPipe\n");
140139

141140
IoQueueWorkItem(FDODeviceExtension->ResetDeviceWorkItem,
142141
USBSTOR_ResetPipeWorkItemRoutine,
143142
CriticalWorkQueue,
144-
Context);
143+
FDODeviceExtension);
145144
}
146145

147146
VOID

drivers/usb/usbstor/pdo.c

Lines changed: 10 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,7 @@ USBSTOR_PdoHandleQueryDeviceText(
137137
IoStack = IoGetCurrentIrpStackLocation(Irp);
138138

139139
DeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
140-
ASSERT(DeviceExtension->InquiryData);
141-
InquiryData = DeviceExtension->InquiryData;
140+
InquiryData = (PINQUIRYDATA)&DeviceExtension->InquiryData;
142141

143142
switch (IoStack->Parameters.QueryDeviceText.DeviceTextType)
144143
{
@@ -191,8 +190,7 @@ USBSTOR_PdoHandleQueryDeviceId(
191190
UNICODE_STRING DeviceId;
192191

193192
DeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
194-
ASSERT(DeviceExtension->InquiryData);
195-
InquiryData = DeviceExtension->InquiryData;
193+
InquiryData = (PINQUIRYDATA)&DeviceExtension->InquiryData;
196194

197195
DeviceType = USBSTOR_GetDeviceType(InquiryData);
198196

@@ -282,7 +280,7 @@ USBSTOR_PdoHandleQueryHardwareId(
282280
PDODeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
283281
FDODeviceExtension = (PFDO_DEVICE_EXTENSION)PDODeviceExtension->LowerDeviceObject->DeviceExtension;
284282
ASSERT(FDODeviceExtension->DeviceDescriptor);
285-
InquiryData = PDODeviceExtension->InquiryData;
283+
InquiryData = (PINQUIRYDATA)&PDODeviceExtension->InquiryData;
286284

287285
DeviceType = USBSTOR_GetDeviceType(InquiryData);
288286
GenericType = USBSTOR_GetGenericType(InquiryData);
@@ -404,7 +402,7 @@ USBSTOR_PdoHandleQueryCompatibleId(
404402
PDODeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
405403
FDODeviceExtension = (PFDO_DEVICE_EXTENSION)PDODeviceExtension->LowerDeviceObject->DeviceExtension;
406404
ASSERT(FDODeviceExtension->DeviceDescriptor);
407-
DeviceType = USBSTOR_GetDeviceType(PDODeviceExtension->InquiryData);
405+
DeviceType = USBSTOR_GetDeviceType((PINQUIRYDATA)&PDODeviceExtension->InquiryData);
408406

409407
// format instance id
410408
Length = sprintf(Buffer, "USBSTOR\\%s", DeviceType) + 1;
@@ -573,10 +571,6 @@ USBSTOR_PdoHandlePnp(
573571
bDelete = FALSE;
574572
}
575573

576-
// clean up the device extension
577-
ASSERT(DeviceExtension->InquiryData);
578-
ExFreePoolWithTag(DeviceExtension->InquiryData, USB_STOR_TAG);
579-
580574
Irp->IoStatus.Status = STATUS_SUCCESS;
581575
IoCompleteRequest(Irp, IO_NO_INCREMENT);
582576

@@ -804,19 +798,10 @@ USBSTOR_FillInquiryData(
804798
IN PDEVICE_OBJECT PDODeviceObject)
805799
{
806800
NTSTATUS Status = STATUS_INSUFFICIENT_RESOURCES;
807-
PPDO_DEVICE_EXTENSION PDODeviceExtension;
801+
PPDO_DEVICE_EXTENSION PDODeviceExtension = (PPDO_DEVICE_EXTENSION)PDODeviceObject->DeviceExtension;
808802
CDB Cdb;
809803
ULONG DataTransferLength = INQUIRYDATABUFFERSIZE;
810-
PINQUIRYDATA InquiryData;
811-
812-
PDODeviceExtension = (PPDO_DEVICE_EXTENSION)PDODeviceObject->DeviceExtension;
813-
InquiryData = ExAllocatePoolWithTag(NonPagedPool, INQUIRYDATABUFFERSIZE, USB_STOR_TAG);
814-
815-
if (!InquiryData)
816-
{
817-
DPRINT1("USBSTOR_FillInquiryData failed with %x\n", Status);
818-
return Status;
819-
}
804+
PINQUIRYDATA InquiryData = (PINQUIRYDATA)&PDODeviceExtension->InquiryData;
820805

821806
RtlZeroMemory(&Cdb, sizeof(Cdb));
822807
Cdb.CDB6INQUIRY.OperationCode = SCSIOP_INQUIRY;
@@ -827,7 +812,6 @@ USBSTOR_FillInquiryData(
827812
if (!NT_SUCCESS(Status))
828813
{
829814
DPRINT1("USBSTOR_FillInquiryData failed with %x\n", Status);
830-
ExFreePoolWithTag(InquiryData, USB_STOR_TAG);
831815
return Status;
832816
}
833817

@@ -846,7 +830,6 @@ USBSTOR_FillInquiryData(
846830

847831
DPRINT("Revision %c%c%c%c\n", InquiryData->ProductRevisionLevel[0], InquiryData->ProductRevisionLevel[1], InquiryData->ProductRevisionLevel[2], InquiryData->ProductRevisionLevel[3]);
848832

849-
PDODeviceExtension->InquiryData = InquiryData;
850833
return Status;
851834
}
852835

@@ -859,6 +842,7 @@ USBSTOR_CreatePDO(
859842
NTSTATUS Status;
860843
PPDO_DEVICE_EXTENSION PDODeviceExtension;
861844
PFDO_DEVICE_EXTENSION FDODeviceExtension;
845+
PINQUIRYDATA InquiryData;
862846

863847
FDODeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
864848

@@ -874,6 +858,7 @@ USBSTOR_CreatePDO(
874858
PDO->StackSize = DeviceObject->StackSize;
875859

876860
PDODeviceExtension = (PPDO_DEVICE_EXTENSION)PDO->DeviceExtension;
861+
InquiryData = (PINQUIRYDATA)&PDODeviceExtension->InquiryData;
877862

878863
// initialize device extension
879864
RtlZeroMemory(PDODeviceExtension, sizeof(PDO_DEVICE_EXTENSION));
@@ -899,8 +884,8 @@ USBSTOR_CreatePDO(
899884
return Status;
900885
}
901886

902-
if (PDODeviceExtension->InquiryData->DeviceType != DIRECT_ACCESS_DEVICE &&
903-
PDODeviceExtension->InquiryData->DeviceType != READ_ONLY_DIRECT_ACCESS_DEVICE)
887+
if (InquiryData->DeviceType != DIRECT_ACCESS_DEVICE &&
888+
InquiryData->DeviceType != READ_ONLY_DIRECT_ACCESS_DEVICE)
904889
{
905890
return STATUS_NOT_SUPPORTED;
906891
}

0 commit comments

Comments
 (0)