From 94e61c3080fe83efcc613d0d77ade45cb0848808 Mon Sep 17 00:00:00 2001 From: Victor Perevertkin Date: Fri, 12 Jun 2020 16:51:42 +0300 Subject: [PATCH] [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 --- drivers/usb/usbstor/disk.c | 5 +- drivers/usb/usbstor/error.c | 11 ++-- drivers/usb/usbstor/pdo.c | 35 ++++------- drivers/usb/usbstor/scsi.c | 109 ++++++++++++++-------------------- drivers/usb/usbstor/usbstor.h | 101 +++++++++++++++---------------- 5 files changed, 113 insertions(+), 148 deletions(-) diff --git a/drivers/usb/usbstor/disk.c b/drivers/usb/usbstor/disk.c index b73ca91292c..1e5bd1299fb 100644 --- a/drivers/usb/usbstor/disk.c +++ b/drivers/usb/usbstor/disk.c @@ -283,8 +283,7 @@ USBSTOR_HandleQueryProperty( ASSERT(FDODeviceExtension); ASSERT(FDODeviceExtension->Common.IsFDO); - InquiryData = PDODeviceExtension->InquiryData; - ASSERT(InquiryData); + InquiryData = (PINQUIRYDATA)&PDODeviceExtension->InquiryData; // compute extra parameters length FieldLengthVendor = USBSTOR_GetFieldLength(InquiryData->VendorId, 8); @@ -507,7 +506,7 @@ USBSTOR_HandleDeviceControl( // Note: INQUIRYDATA structure is larger than INQUIRYDATABUFFERSIZE RtlZeroMemory(InquiryData, sizeof(INQUIRYDATA)); - RtlCopyMemory(InquiryData, PDODeviceExtension->InquiryData, INQUIRYDATABUFFERSIZE); + RtlCopyMemory(InquiryData, &PDODeviceExtension->InquiryData, sizeof(PDODeviceExtension->InquiryData)); InquiryData->Versions = 0x04; InquiryData->ResponseDataFormat = 0x02; // some devices set this to 1 diff --git a/drivers/usb/usbstor/error.c b/drivers/usb/usbstor/error.c index 3964b2c7b4d..1c773ab6709 100644 --- a/drivers/usb/usbstor/error.c +++ b/drivers/usb/usbstor/error.c @@ -77,15 +77,15 @@ USBSTOR_ResetPipeWorkItemRoutine( IN PVOID Ctx) { NTSTATUS Status; - PIRP_CONTEXT Context = (PIRP_CONTEXT)Ctx; - PFDO_DEVICE_EXTENSION FDODeviceExtension = (PFDO_DEVICE_EXTENSION)FdoDevice->DeviceExtension; + PFDO_DEVICE_EXTENSION FDODeviceExtension = (PFDO_DEVICE_EXTENSION)Ctx; + PIRP_CONTEXT Context = &FDODeviceExtension->CurrentIrpContext; // clear stall on the corresponding pipe Status = USBSTOR_ResetPipeWithHandle(FDODeviceExtension->LowerDeviceObject, Context->Urb.UrbBulkOrInterruptTransfer.PipeHandle); DPRINT1("USBSTOR_ResetPipeWithHandle Status %x\n", Status); // now resend the csw as the stall got cleared - USBSTOR_SendCSWRequest(Context, Context->Irp); + USBSTOR_SendCSWRequest(FDODeviceExtension, Context->Irp); } VOID @@ -133,15 +133,14 @@ USBSTOR_ResetDeviceWorkItemRoutine( VOID NTAPI USBSTOR_QueueResetPipe( - IN PFDO_DEVICE_EXTENSION FDODeviceExtension, - IN PIRP_CONTEXT Context) + IN PFDO_DEVICE_EXTENSION FDODeviceExtension) { DPRINT("USBSTOR_QueueResetPipe\n"); IoQueueWorkItem(FDODeviceExtension->ResetDeviceWorkItem, USBSTOR_ResetPipeWorkItemRoutine, CriticalWorkQueue, - Context); + FDODeviceExtension); } VOID diff --git a/drivers/usb/usbstor/pdo.c b/drivers/usb/usbstor/pdo.c index 50996e396c6..e89eb45d382 100644 --- a/drivers/usb/usbstor/pdo.c +++ b/drivers/usb/usbstor/pdo.c @@ -137,8 +137,7 @@ USBSTOR_PdoHandleQueryDeviceText( IoStack = IoGetCurrentIrpStackLocation(Irp); DeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - ASSERT(DeviceExtension->InquiryData); - InquiryData = DeviceExtension->InquiryData; + InquiryData = (PINQUIRYDATA)&DeviceExtension->InquiryData; switch (IoStack->Parameters.QueryDeviceText.DeviceTextType) { @@ -191,8 +190,7 @@ USBSTOR_PdoHandleQueryDeviceId( UNICODE_STRING DeviceId; DeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - ASSERT(DeviceExtension->InquiryData); - InquiryData = DeviceExtension->InquiryData; + InquiryData = (PINQUIRYDATA)&DeviceExtension->InquiryData; DeviceType = USBSTOR_GetDeviceType(InquiryData); @@ -282,7 +280,7 @@ USBSTOR_PdoHandleQueryHardwareId( PDODeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; FDODeviceExtension = (PFDO_DEVICE_EXTENSION)PDODeviceExtension->LowerDeviceObject->DeviceExtension; ASSERT(FDODeviceExtension->DeviceDescriptor); - InquiryData = PDODeviceExtension->InquiryData; + InquiryData = (PINQUIRYDATA)&PDODeviceExtension->InquiryData; DeviceType = USBSTOR_GetDeviceType(InquiryData); GenericType = USBSTOR_GetGenericType(InquiryData); @@ -404,7 +402,7 @@ USBSTOR_PdoHandleQueryCompatibleId( PDODeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; FDODeviceExtension = (PFDO_DEVICE_EXTENSION)PDODeviceExtension->LowerDeviceObject->DeviceExtension; ASSERT(FDODeviceExtension->DeviceDescriptor); - DeviceType = USBSTOR_GetDeviceType(PDODeviceExtension->InquiryData); + DeviceType = USBSTOR_GetDeviceType((PINQUIRYDATA)&PDODeviceExtension->InquiryData); // format instance id Length = sprintf(Buffer, "USBSTOR\\%s", DeviceType) + 1; @@ -573,10 +571,6 @@ USBSTOR_PdoHandlePnp( bDelete = FALSE; } - // clean up the device extension - ASSERT(DeviceExtension->InquiryData); - ExFreePoolWithTag(DeviceExtension->InquiryData, USB_STOR_TAG); - Irp->IoStatus.Status = STATUS_SUCCESS; IoCompleteRequest(Irp, IO_NO_INCREMENT); @@ -804,19 +798,10 @@ USBSTOR_FillInquiryData( IN PDEVICE_OBJECT PDODeviceObject) { NTSTATUS Status = STATUS_INSUFFICIENT_RESOURCES; - PPDO_DEVICE_EXTENSION PDODeviceExtension; + PPDO_DEVICE_EXTENSION PDODeviceExtension = (PPDO_DEVICE_EXTENSION)PDODeviceObject->DeviceExtension; CDB Cdb; ULONG DataTransferLength = INQUIRYDATABUFFERSIZE; - PINQUIRYDATA InquiryData; - - PDODeviceExtension = (PPDO_DEVICE_EXTENSION)PDODeviceObject->DeviceExtension; - InquiryData = ExAllocatePoolWithTag(NonPagedPool, INQUIRYDATABUFFERSIZE, USB_STOR_TAG); - - if (!InquiryData) - { - DPRINT1("USBSTOR_FillInquiryData failed with %x\n", Status); - return Status; - } + PINQUIRYDATA InquiryData = (PINQUIRYDATA)&PDODeviceExtension->InquiryData; RtlZeroMemory(&Cdb, sizeof(Cdb)); Cdb.CDB6INQUIRY.OperationCode = SCSIOP_INQUIRY; @@ -827,7 +812,6 @@ USBSTOR_FillInquiryData( if (!NT_SUCCESS(Status)) { DPRINT1("USBSTOR_FillInquiryData failed with %x\n", Status); - ExFreePoolWithTag(InquiryData, USB_STOR_TAG); return Status; } @@ -846,7 +830,6 @@ USBSTOR_FillInquiryData( DPRINT("Revision %c%c%c%c\n", InquiryData->ProductRevisionLevel[0], InquiryData->ProductRevisionLevel[1], InquiryData->ProductRevisionLevel[2], InquiryData->ProductRevisionLevel[3]); - PDODeviceExtension->InquiryData = InquiryData; return Status; } @@ -859,6 +842,7 @@ USBSTOR_CreatePDO( NTSTATUS Status; PPDO_DEVICE_EXTENSION PDODeviceExtension; PFDO_DEVICE_EXTENSION FDODeviceExtension; + PINQUIRYDATA InquiryData; FDODeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; @@ -874,6 +858,7 @@ USBSTOR_CreatePDO( PDO->StackSize = DeviceObject->StackSize; PDODeviceExtension = (PPDO_DEVICE_EXTENSION)PDO->DeviceExtension; + InquiryData = (PINQUIRYDATA)&PDODeviceExtension->InquiryData; // initialize device extension RtlZeroMemory(PDODeviceExtension, sizeof(PDO_DEVICE_EXTENSION)); @@ -899,8 +884,8 @@ USBSTOR_CreatePDO( return Status; } - if (PDODeviceExtension->InquiryData->DeviceType != DIRECT_ACCESS_DEVICE && - PDODeviceExtension->InquiryData->DeviceType != READ_ONLY_DIRECT_ACCESS_DEVICE) + if (InquiryData->DeviceType != DIRECT_ACCESS_DEVICE && + InquiryData->DeviceType != READ_ONLY_DIRECT_ACCESS_DEVICE) { return STATUS_NOT_SUPPORTED; } diff --git a/drivers/usb/usbstor/scsi.c b/drivers/usb/usbstor/scsi.c index 946065649dd..d32aa0941cd 100644 --- a/drivers/usb/usbstor/scsi.c +++ b/drivers/usb/usbstor/scsi.c @@ -65,10 +65,10 @@ USBSTOR_IssueBulkOrInterruptRequest( IN ULONG TransferBufferLength, IN PVOID TransferBuffer, IN PMDL TransferBufferMDL, - IN PIO_COMPLETION_ROUTINE CompletionRoutine, - IN PIRP_CONTEXT Context) + IN PIO_COMPLETION_ROUTINE CompletionRoutine) { PIO_STACK_LOCATION NextStack; + PIRP_CONTEXT Context = &FDODeviceExtension->CurrentIrpContext; RtlZeroMemory(&Context->Urb, sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER)); @@ -88,7 +88,7 @@ USBSTOR_IssueBulkOrInterruptRequest( IoSetCompletionRoutine(Irp, CompletionRoutine, - Context, + FDODeviceExtension, TRUE, TRUE, TRUE); @@ -107,9 +107,9 @@ USBSTOR_IsCSWValid( return FALSE; } - if (Context->csw.Tag != PtrToUlong(&Context->csw)) + if (Context->csw.Tag != PtrToUlong(Context->Irp)) { - DPRINT1("[USBSTOR] Expected Tag %Ix but got %x\n", PtrToUlong(&Context->csw), Context->csw.Tag); + DPRINT1("[USBSTOR] Expected Tag %Ix but got %x\n", PtrToUlong(Context->Irp), Context->csw.Tag); return FALSE; } @@ -120,8 +120,7 @@ static NTSTATUS USBSTOR_IssueRequestSense( IN PFDO_DEVICE_EXTENSION FDODeviceExtension, - IN PIRP Irp, - IN PIRP_CONTEXT Context); + IN PIRP Irp); IO_COMPLETION_ROUTINE USBSTOR_CSWCompletionRoutine; @@ -138,13 +137,12 @@ USBSTOR_CSWCompletionRoutine( PFDO_DEVICE_EXTENSION FDODeviceExtension; PSCSI_REQUEST_BLOCK Request; - Context = (PIRP_CONTEXT)Ctx; - DPRINT("USBSTOR_CSWCompletionRoutine Irp %p Ctx %p Status %x\n", Irp, Ctx, Irp->IoStatus.Status); IoStack = IoGetCurrentIrpStackLocation(Irp); PDODeviceExtension = (PPDO_DEVICE_EXTENSION)IoStack->DeviceObject->DeviceExtension; - FDODeviceExtension = Context->FDODeviceExtension; + FDODeviceExtension = (PFDO_DEVICE_EXTENSION)Ctx; + Context = &FDODeviceExtension->CurrentIrpContext; Request = IoStack->Parameters.Scsi.Srb; ASSERT(Request); @@ -158,7 +156,7 @@ USBSTOR_CSWCompletionRoutine( ++Context->StallRetryCount; // clear stall and resend cbw - USBSTOR_QueueResetPipe(FDODeviceExtension, Context); + USBSTOR_QueueResetPipe(FDODeviceExtension); return STATUS_MORE_PROCESSING_REQUIRED; } @@ -211,7 +209,7 @@ USBSTOR_CSWCompletionRoutine( Request->SenseInfoBufferLength && Request->SenseInfoBuffer) { - USBSTOR_IssueRequestSense(FDODeviceExtension, Irp, Context); + USBSTOR_IssueRequestSense(FDODeviceExtension, Irp); return STATUS_MORE_PROCESSING_REQUIRED; } @@ -224,7 +222,6 @@ USBSTOR_CSWCompletionRoutine( USBSTOR_QueueTerminateRequest(PDODeviceExtension->LowerDeviceObject, Irp); USBSTOR_QueueNextRequest(PDODeviceExtension->LowerDeviceObject); - ExFreePoolWithTag(Context, USB_STOR_TAG); return STATUS_CONTINUE_COMPLETION; ResetRecovery: @@ -238,24 +235,22 @@ ResetRecovery: USBSTOR_QueueTerminateRequest(PDODeviceExtension->LowerDeviceObject, Irp); USBSTOR_QueueResetDevice(FDODeviceExtension); - ExFreePoolWithTag(Context, USB_STOR_TAG); return STATUS_CONTINUE_COMPLETION; } NTSTATUS USBSTOR_SendCSWRequest( - PIRP_CONTEXT Context, + PFDO_DEVICE_EXTENSION FDODeviceExtension, PIRP Irp) { - return USBSTOR_IssueBulkOrInterruptRequest(Context->FDODeviceExtension, + return USBSTOR_IssueBulkOrInterruptRequest(FDODeviceExtension, Irp, - Context->FDODeviceExtension->InterfaceInformation->Pipes[Context->FDODeviceExtension->BulkInPipeIndex].PipeHandle, + FDODeviceExtension->InterfaceInformation->Pipes[FDODeviceExtension->BulkInPipeIndex].PipeHandle, USBD_TRANSFER_DIRECTION_IN, sizeof(CSW), - &Context->csw, + &FDODeviceExtension->CurrentIrpContext.csw, NULL, - USBSTOR_CSWCompletionRoutine, - Context); + USBSTOR_CSWCompletionRoutine); } IO_COMPLETION_ROUTINE USBSTOR_DataCompletionRoutine; @@ -270,17 +265,19 @@ USBSTOR_DataCompletionRoutine( PIRP_CONTEXT Context; PIO_STACK_LOCATION IoStack; PSCSI_REQUEST_BLOCK Request; + PFDO_DEVICE_EXTENSION FDODeviceExtension; PPDO_DEVICE_EXTENSION PDODeviceExtension; DPRINT("USBSTOR_DataCompletionRoutine Irp %p Ctx %p Status %x\n", Irp, Ctx, Irp->IoStatus.Status); - Context = (PIRP_CONTEXT)Ctx; + FDODeviceExtension = (PFDO_DEVICE_EXTENSION)Ctx; + Context = &FDODeviceExtension->CurrentIrpContext; IoStack = IoGetCurrentIrpStackLocation(Irp); Request = IoStack->Parameters.Scsi.Srb; PDODeviceExtension = (PPDO_DEVICE_EXTENSION)IoStack->DeviceObject->DeviceExtension; // for Sense Request a partial MDL was already freed (if existed) - if (Request == Context->FDODeviceExtension->ActiveSrb && + if (Request == FDODeviceExtension->ActiveSrb && Context->Urb.UrbBulkOrInterruptTransfer.TransferBufferMDL != Irp->MdlAddress) { IoFreeMdl(Context->Urb.UrbBulkOrInterruptTransfer.TransferBufferMDL); @@ -298,7 +295,7 @@ USBSTOR_DataCompletionRoutine( } Request->DataTransferLength = Context->Urb.UrbBulkOrInterruptTransfer.TransferBufferLength; - USBSTOR_SendCSWRequest(Context, Irp); + USBSTOR_SendCSWRequest(FDODeviceExtension, Irp); } else if (USBD_STATUS(Context->Urb.UrbHeader.Status) == USBD_STATUS(USBD_STATUS_STALL_PID)) { @@ -308,7 +305,7 @@ USBSTOR_DataCompletionRoutine( Request->DataTransferLength = Context->Urb.UrbBulkOrInterruptTransfer.TransferBufferLength; // clear stall and resend cbw - USBSTOR_QueueResetPipe(Context->FDODeviceExtension, Context); + USBSTOR_QueueResetPipe(FDODeviceExtension); } else { @@ -317,9 +314,8 @@ USBSTOR_DataCompletionRoutine( Request->SrbStatus = SRB_STATUS_BUS_RESET; USBSTOR_QueueTerminateRequest(PDODeviceExtension->LowerDeviceObject, Irp); - USBSTOR_QueueResetDevice(Context->FDODeviceExtension); + USBSTOR_QueueResetDevice(FDODeviceExtension); - ExFreePoolWithTag(Context, USB_STOR_TAG); return STATUS_CONTINUE_COMPLETION; } @@ -339,6 +335,7 @@ USBSTOR_CBWCompletionRoutine( PIO_STACK_LOCATION IoStack; PSCSI_REQUEST_BLOCK Request; PPDO_DEVICE_EXTENSION PDODeviceExtension; + PFDO_DEVICE_EXTENSION FDODeviceExtension; USBD_PIPE_HANDLE PipeHandle; ULONG TransferFlags; PMDL Mdl = NULL; @@ -346,7 +343,8 @@ USBSTOR_CBWCompletionRoutine( DPRINT("USBSTOR_CBWCompletionRoutine Irp %p Ctx %p Status %x\n", Irp, Ctx, Irp->IoStatus.Status); - Context = (PIRP_CONTEXT)Ctx; + FDODeviceExtension = (PFDO_DEVICE_EXTENSION)Ctx; + Context = &FDODeviceExtension->CurrentIrpContext; IoStack = IoGetCurrentIrpStackLocation(Irp); Request = IoStack->Parameters.Scsi.Srb; PDODeviceExtension = (PPDO_DEVICE_EXTENSION)IoStack->DeviceObject->DeviceExtension; @@ -358,10 +356,10 @@ USBSTOR_CBWCompletionRoutine( // a request without the buffer AND not a sense request // for a sense request we provide just a TransferBuffer, an Mdl will be allocated by usbport (see below) - if (!Irp->MdlAddress && Request == Context->FDODeviceExtension->ActiveSrb) + if (!Irp->MdlAddress && Request == FDODeviceExtension->ActiveSrb) { Request->SrbStatus = SRB_STATUS_SUCCESS; - USBSTOR_SendCSWRequest(Context, Irp); + USBSTOR_SendCSWRequest(FDODeviceExtension, Irp); return STATUS_MORE_PROCESSING_REQUIRED; } @@ -369,12 +367,12 @@ USBSTOR_CBWCompletionRoutine( if ((Request->SrbFlags & SRB_FLAGS_UNSPECIFIED_DIRECTION) == SRB_FLAGS_DATA_IN) { - PipeHandle = Context->FDODeviceExtension->InterfaceInformation->Pipes[Context->FDODeviceExtension->BulkInPipeIndex].PipeHandle; + PipeHandle = FDODeviceExtension->InterfaceInformation->Pipes[FDODeviceExtension->BulkInPipeIndex].PipeHandle; TransferFlags = USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK; } else if ((Request->SrbFlags & SRB_FLAGS_UNSPECIFIED_DIRECTION) == SRB_FLAGS_DATA_OUT) { - PipeHandle = Context->FDODeviceExtension->InterfaceInformation->Pipes[Context->FDODeviceExtension->BulkOutPipeIndex].PipeHandle; + PipeHandle = FDODeviceExtension->InterfaceInformation->Pipes[FDODeviceExtension->BulkOutPipeIndex].PipeHandle; TransferFlags = USBD_TRANSFER_DIRECTION_OUT; } else @@ -385,7 +383,7 @@ USBSTOR_CBWCompletionRoutine( } // if it is not a Sense Request - if (Request == Context->FDODeviceExtension->ActiveSrb) + if (Request == FDODeviceExtension->ActiveSrb) { if (MmGetMdlVirtualAddress(Irp->MdlAddress) == Request->DataBuffer) { @@ -420,29 +418,27 @@ USBSTOR_CBWCompletionRoutine( TransferBuffer = Request->DataBuffer; } - USBSTOR_IssueBulkOrInterruptRequest(Context->FDODeviceExtension, + USBSTOR_IssueBulkOrInterruptRequest(FDODeviceExtension, Irp, PipeHandle, TransferFlags, Request->DataTransferLength, TransferBuffer, Mdl, - USBSTOR_DataCompletionRoutine, - Context); + USBSTOR_DataCompletionRoutine); return STATUS_MORE_PROCESSING_REQUIRED; ResetRecovery: - Request = Context->FDODeviceExtension->ActiveSrb; + Request = FDODeviceExtension->ActiveSrb; IoStack->Parameters.Scsi.Srb = Request; Irp->IoStatus.Information = 0; Irp->IoStatus.Status = STATUS_IO_DEVICE_ERROR; Request->SrbStatus = SRB_STATUS_BUS_RESET; USBSTOR_QueueTerminateRequest(PDODeviceExtension->LowerDeviceObject, Irp); - USBSTOR_QueueResetDevice(Context->FDODeviceExtension); + USBSTOR_QueueResetDevice(FDODeviceExtension); - ExFreePoolWithTag(Context, USB_STOR_TAG); return STATUS_CONTINUE_COMPLETION; } @@ -461,12 +457,12 @@ static NTSTATUS USBSTOR_SendCBWRequest( IN PFDO_DEVICE_EXTENSION FDODeviceExtension, - IN PIRP Irp, - IN PIRP_CONTEXT Context) + IN PIRP Irp) { PPDO_DEVICE_EXTENSION PDODeviceExtension; PIO_STACK_LOCATION IoStack; PSCSI_REQUEST_BLOCK Request; + PIRP_CONTEXT Context = &FDODeviceExtension->CurrentIrpContext; RtlZeroMemory(&Context->cbw, sizeof(CBW)); RtlZeroMemory(&Context->Urb, sizeof(URB)); @@ -475,8 +471,9 @@ USBSTOR_SendCBWRequest( PDODeviceExtension = IoStack->DeviceObject->DeviceExtension; Request = IoStack->Parameters.Scsi.Srb; + // Make a CBW structure from SCSI request block Context->cbw.Signature = CBW_SIGNATURE; - Context->cbw.Tag = PtrToUlong(&Context->cbw); + Context->cbw.Tag = PtrToUlong(Irp); Context->cbw.DataTransferLength = Request->DataTransferLength; Context->cbw.Flags = ((UCHAR)Request->SrbFlags & SRB_FLAGS_UNSPECIFIED_DIRECTION) << 1; Context->cbw.LUN = PDODeviceExtension->LUN; @@ -489,7 +486,6 @@ USBSTOR_SendCBWRequest( // initialize rest of context Context->Irp = Irp; - Context->FDODeviceExtension = FDODeviceExtension; Context->StallRetryCount = 0; return USBSTOR_IssueBulkOrInterruptRequest( @@ -500,16 +496,14 @@ USBSTOR_SendCBWRequest( sizeof(CBW), &Context->cbw, NULL, - USBSTOR_CBWCompletionRoutine, - Context); + USBSTOR_CBWCompletionRoutine); } static NTSTATUS USBSTOR_IssueRequestSense( IN PFDO_DEVICE_EXTENSION FDODeviceExtension, - IN PIRP Irp, - IN PIRP_CONTEXT Context) + IN PIRP Irp) { PIO_STACK_LOCATION IoStack; PSCSI_REQUEST_BLOCK CurrentSrb; @@ -518,7 +512,7 @@ USBSTOR_IssueRequestSense( DPRINT("USBSTOR_IssueRequestSense: \n"); CurrentSrb = FDODeviceExtension->ActiveSrb; - SenseSrb = &Context->SenseSrb; + SenseSrb = &FDODeviceExtension->CurrentIrpContext.SenseSrb; IoStack = IoGetCurrentIrpStackLocation(Irp); IoStack->Parameters.Scsi.Srb = SenseSrb; @@ -541,7 +535,7 @@ USBSTOR_IssueRequestSense( SrbGetCdb(SenseSrb)->CDB6GENERIC.OperationCode = SCSIOP_REQUEST_SENSE; SrbGetCdb(SenseSrb)->AsByte[4] = CurrentSrb->SenseInfoBufferLength; - return USBSTOR_SendCBWRequest(FDODeviceExtension, Irp, Context); + return USBSTOR_SendCBWRequest(FDODeviceExtension, Irp); } NTSTATUS @@ -549,13 +543,10 @@ USBSTOR_HandleExecuteSCSI( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { - NTSTATUS Status; PIO_STACK_LOCATION IoStack; PSCSI_REQUEST_BLOCK Request; - PPDO_DEVICE_EXTENSION PDODeviceExtension; - PIRP_CONTEXT Context; + PPDO_DEVICE_EXTENSION PDODeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - PDODeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; ASSERT(PDODeviceExtension->Common.IsFDO == FALSE); IoStack = IoGetCurrentIrpStackLocation(Irp); @@ -564,17 +555,7 @@ USBSTOR_HandleExecuteSCSI( DPRINT("USBSTOR_HandleExecuteSCSI Operation Code %x, Length %lu\n", SrbGetCdb(Request)->CDB10.OperationCode, Request->DataTransferLength); // check that we're sending to the right LUN - ASSERT(SrbGetCdb(Request)->CDB10.LogicalUnitNumber == (PDODeviceExtension->LUN & MAX_LUN)); - Context = ExAllocatePoolWithTag(NonPagedPool, sizeof(IRP_CONTEXT), USB_STOR_TAG); + ASSERT(SrbGetCdb(Request)->CDB10.LogicalUnitNumber == PDODeviceExtension->LUN); - if (!Context) - { - Status = STATUS_INSUFFICIENT_RESOURCES; - } - else - { - Status = USBSTOR_SendCBWRequest(PDODeviceExtension->LowerDeviceObject->DeviceExtension, Irp, Context); - } - - return Status; + return USBSTOR_SendCBWRequest(PDODeviceExtension->LowerDeviceObject->DeviceExtension, Irp); } diff --git a/drivers/usb/usbstor/usbstor.h b/drivers/usb/usbstor/usbstor.h index 9e8b50e5701..71e90708311 100644 --- a/drivers/usb/usbstor/usbstor.h +++ b/drivers/usb/usbstor/usbstor.h @@ -61,6 +61,52 @@ #define MAX_LUN 0xF #define USBSTOR_DEFAULT_MAX_TRANSFER_LENGTH 0x10000 +#define CBW_SIGNATURE 0x43425355 +#define CSW_SIGNATURE 0x53425355 + +#include + +typedef struct +{ + ULONG Signature; // CBW signature + ULONG Tag; // CBW Tag of operation + ULONG DataTransferLength; // data transfer length + UCHAR Flags; // CBW Flags endpoint direction + UCHAR LUN; // lun unit + UCHAR CommandBlockLength; // Command block length + UCHAR CommandBlock[16]; +} CBW, *PCBW; + +C_ASSERT(sizeof(CBW) == 31); + +#define CSW_STATUS_COMMAND_PASSED 0x00 +#define CSW_STATUS_COMMAND_FAILED 0x01 +#define CSW_STATUS_PHASE_ERROR 0x02 + +typedef struct +{ + ULONG Signature; // CSW signature + ULONG Tag; // CSW tag + ULONG DataResidue; // CSW data transfer diff + UCHAR Status; // CSW status +} CSW, *PCSW; + +#include + +typedef struct +{ + PIRP Irp; + ULONG ErrorIndex; + ULONG StallRetryCount; // the number of retries after receiving USBD_STATUS_STALL_PID status + union + { + CBW cbw; + CSW csw; + }; + URB Urb; + SCSI_REQUEST_BLOCK SenseSrb; +} IRP_CONTEXT, *PIRP_CONTEXT; + typedef struct __COMMON_DEVICE_EXTENSION__ { BOOLEAN IsFDO; @@ -99,6 +145,7 @@ typedef struct KSPIN_LOCK CommonLock; PIO_WORKITEM ResetDeviceWorkItem; ULONG Flags; + IRP_CONTEXT CurrentIrpContext; }FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION; typedef struct @@ -108,57 +155,12 @@ typedef struct UCHAR LUN; // lun id BOOLEAN Claimed; // indicating if it has been claimed by upper driver PDEVICE_OBJECT LowerDeviceObject; // points to FDO - PINQUIRYDATA InquiryData; // USB SCSI inquiry data PDEVICE_OBJECT *PDODeviceObject; // entry in pdo list PDEVICE_OBJECT Self; // self + // the whole structure is not stored + UCHAR InquiryData[INQUIRYDATABUFFERSIZE]; // USB SCSI inquiry data }PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION; -#define CBW_SIGNATURE 0x43425355 -#define CSW_SIGNATURE 0x53425355 - -#include -typedef struct -{ - ULONG Signature; // CBW signature - ULONG Tag; // CBW Tag of operation - ULONG DataTransferLength; // data transfer length - UCHAR Flags; // CBW Flags endpoint direction - UCHAR LUN; // lun unit - UCHAR CommandBlockLength; // Command block length - UCHAR CommandBlock[16]; -}CBW, *PCBW; - -C_ASSERT(sizeof(CBW) == 31); - -#define CSW_STATUS_COMMAND_PASSED 0x00 -#define CSW_STATUS_COMMAND_FAILED 0x01 -#define CSW_STATUS_PHASE_ERROR 0x02 - -typedef struct -{ - ULONG Signature; // CSW signature - ULONG Tag; // CSW tag - ULONG DataResidue; // CSW data transfer diff - UCHAR Status; // CSW status -}CSW, *PCSW; - -#include - -typedef struct -{ - PIRP Irp; - PFDO_DEVICE_EXTENSION FDODeviceExtension; - ULONG ErrorIndex; - ULONG StallRetryCount; // the number of retries after receiving USBD_STATUS_STALL_PID status - union - { - CBW cbw; - CSW csw; - }; - URB Urb; - SCSI_REQUEST_BLOCK SenseSrb; -} IRP_CONTEXT, *PIRP_CONTEXT; - typedef struct _ERRORHANDLER_WORKITEM_DATA { PDEVICE_OBJECT DeviceObject; @@ -267,7 +269,7 @@ USBSTOR_HandleExecuteSCSI( NTSTATUS USBSTOR_SendCSWRequest( - PIRP_CONTEXT Context, + PFDO_DEVICE_EXTENSION FDODeviceExtension, PIRP Irp); @@ -351,8 +353,7 @@ USBSTOR_TimerRoutine( VOID NTAPI USBSTOR_QueueResetPipe( - IN PFDO_DEVICE_EXTENSION FDODeviceExtension, - IN PIRP_CONTEXT Context); + IN PFDO_DEVICE_EXTENSION FDODeviceExtension); VOID NTAPI