mirror of
https://github.com/reactos/reactos.git
synced 2025-07-01 09:31:22 +00:00
[HIDCLASS]
- Check if attaching to device stack failed. In that case fail the request [HIDUSB] - Always set SupriseRemovalOk [USBCCGP] [HIDCLASS] [USBHUB] [USBSTOR] - Check if the pdo is still in the pdo list. Only call IoDeleteDevice in that case svn path=/branches/usb-bringup-trunk/; revision=55429
This commit is contained in:
parent
82848d85df
commit
cf494ea401
9 changed files with 144 additions and 96 deletions
|
@ -79,11 +79,18 @@ HidClassAddDevice(
|
||||||
RtlZeroMemory(FDODeviceExtension, sizeof(HIDCLASS_FDO_EXTENSION));
|
RtlZeroMemory(FDODeviceExtension, sizeof(HIDCLASS_FDO_EXTENSION));
|
||||||
|
|
||||||
/* initialize device extension */
|
/* initialize device extension */
|
||||||
|
FDODeviceExtension->Common.IsFDO = TRUE;
|
||||||
|
FDODeviceExtension->Common.DriverExtension = DriverExtension;
|
||||||
FDODeviceExtension->Common.HidDeviceExtension.PhysicalDeviceObject = PhysicalDeviceObject;
|
FDODeviceExtension->Common.HidDeviceExtension.PhysicalDeviceObject = PhysicalDeviceObject;
|
||||||
FDODeviceExtension->Common.HidDeviceExtension.MiniDeviceExtension = (PVOID)((ULONG_PTR)FDODeviceExtension + sizeof(HIDCLASS_FDO_EXTENSION));
|
FDODeviceExtension->Common.HidDeviceExtension.MiniDeviceExtension = (PVOID)((ULONG_PTR)FDODeviceExtension + sizeof(HIDCLASS_FDO_EXTENSION));
|
||||||
FDODeviceExtension->Common.HidDeviceExtension.NextDeviceObject = IoAttachDeviceToDeviceStack(NewDeviceObject, PhysicalDeviceObject);
|
FDODeviceExtension->Common.HidDeviceExtension.NextDeviceObject = IoAttachDeviceToDeviceStack(NewDeviceObject, PhysicalDeviceObject);
|
||||||
FDODeviceExtension->Common.IsFDO = TRUE;
|
if (FDODeviceExtension->Common.HidDeviceExtension.NextDeviceObject == NULL)
|
||||||
FDODeviceExtension->Common.DriverExtension = DriverExtension;
|
{
|
||||||
|
/* no PDO */
|
||||||
|
IoDeleteDevice(NewDeviceObject);
|
||||||
|
DPRINT1("[HIDCLASS] failed to attach to device stack\n");
|
||||||
|
return STATUS_DEVICE_REMOVED;
|
||||||
|
}
|
||||||
|
|
||||||
/* sanity check */
|
/* sanity check */
|
||||||
ASSERT(FDODeviceExtension->Common.HidDeviceExtension.NextDeviceObject);
|
ASSERT(FDODeviceExtension->Common.HidDeviceExtension.NextDeviceObject);
|
||||||
|
|
|
@ -354,7 +354,7 @@ HidClassPDO_PnP(
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PPNP_BUS_INFORMATION BusInformation;
|
PPNP_BUS_INFORMATION BusInformation;
|
||||||
PDEVICE_RELATIONS DeviceRelation;
|
PDEVICE_RELATIONS DeviceRelation;
|
||||||
ULONG Index;
|
ULONG Index, bFound;
|
||||||
|
|
||||||
//
|
//
|
||||||
// get device extension
|
// get device extension
|
||||||
|
@ -535,6 +535,7 @@ HidClassPDO_PnP(
|
||||||
//
|
//
|
||||||
// remove us from the fdo's pdo list
|
// remove us from the fdo's pdo list
|
||||||
//
|
//
|
||||||
|
bFound = FALSE;
|
||||||
for(Index = 0; Index < PDODeviceExtension->FDODeviceExtension->DeviceRelations->Count; Index++)
|
for(Index = 0; Index < PDODeviceExtension->FDODeviceExtension->DeviceRelations->Count; Index++)
|
||||||
{
|
{
|
||||||
if (PDODeviceExtension->FDODeviceExtension->DeviceRelations->Objects[Index] == DeviceObject)
|
if (PDODeviceExtension->FDODeviceExtension->DeviceRelations->Objects[Index] == DeviceObject)
|
||||||
|
@ -542,6 +543,7 @@ HidClassPDO_PnP(
|
||||||
//
|
//
|
||||||
// remove us
|
// remove us
|
||||||
//
|
//
|
||||||
|
bFound = TRUE;
|
||||||
PDODeviceExtension->FDODeviceExtension->DeviceRelations->Objects[Index] = NULL;
|
PDODeviceExtension->FDODeviceExtension->DeviceRelations->Objects[Index] = NULL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -551,8 +553,11 @@ HidClassPDO_PnP(
|
||||||
Irp->IoStatus.Status = STATUS_SUCCESS;
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||||
|
|
||||||
/* Delete our device object*/
|
if (bFound)
|
||||||
IoDeleteDevice(DeviceObject);
|
{
|
||||||
|
/* Delete our device object*/
|
||||||
|
IoDeleteDevice(DeviceObject);
|
||||||
|
}
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1662,19 +1662,10 @@ HidPnp(
|
||||||
Status = Irp->IoStatus.Status;
|
Status = Irp->IoStatus.Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NT_SUCCESS(Status))
|
//
|
||||||
{
|
// don't need to safely remove
|
||||||
//
|
//
|
||||||
// driver supports D1 & D2
|
IoStack->Parameters.DeviceCapabilities.Capabilities->SurpriseRemovalOK = TRUE;
|
||||||
//
|
|
||||||
IoStack->Parameters.DeviceCapabilities.Capabilities->DeviceD1 = TRUE;
|
|
||||||
IoStack->Parameters.DeviceCapabilities.Capabilities->DeviceD2 = TRUE;
|
|
||||||
|
|
||||||
//
|
|
||||||
// don't need to safely remove
|
|
||||||
//
|
|
||||||
IoStack->Parameters.DeviceCapabilities.Capabilities->SurpriseRemovalOK = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// done
|
// done
|
||||||
|
|
|
@ -307,7 +307,7 @@ PDO_HandlePnp(
|
||||||
PIO_STACK_LOCATION IoStack;
|
PIO_STACK_LOCATION IoStack;
|
||||||
PPDO_DEVICE_EXTENSION PDODeviceExtension;
|
PPDO_DEVICE_EXTENSION PDODeviceExtension;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
ULONG Index;
|
ULONG Index, bFound;
|
||||||
|
|
||||||
//
|
//
|
||||||
// get current stack location
|
// get current stack location
|
||||||
|
@ -355,6 +355,7 @@ PDO_HandlePnp(
|
||||||
//
|
//
|
||||||
// remove us from the fdo's pdo list
|
// remove us from the fdo's pdo list
|
||||||
//
|
//
|
||||||
|
bFound = FALSE;
|
||||||
for(Index = 0; Index < PDODeviceExtension->FDODeviceExtension->FunctionDescriptorCount; Index++)
|
for(Index = 0; Index < PDODeviceExtension->FDODeviceExtension->FunctionDescriptorCount; Index++)
|
||||||
{
|
{
|
||||||
if (PDODeviceExtension->FDODeviceExtension->ChildPDO[Index] == DeviceObject)
|
if (PDODeviceExtension->FDODeviceExtension->ChildPDO[Index] == DeviceObject)
|
||||||
|
@ -363,6 +364,7 @@ PDO_HandlePnp(
|
||||||
// remove us
|
// remove us
|
||||||
//
|
//
|
||||||
PDODeviceExtension->FDODeviceExtension->ChildPDO[Index] = NULL;
|
PDODeviceExtension->FDODeviceExtension->ChildPDO[Index] = NULL;
|
||||||
|
bFound = TRUE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -373,10 +375,13 @@ PDO_HandlePnp(
|
||||||
Irp->IoStatus.Status = STATUS_SUCCESS;
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||||
|
|
||||||
//
|
if (bFound)
|
||||||
// Delete the device object
|
{
|
||||||
//
|
//
|
||||||
IoDeleteDevice(DeviceObject);
|
// Delete the device object
|
||||||
|
//
|
||||||
|
IoDeleteDevice(DeviceObject);
|
||||||
|
}
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
case IRP_MN_QUERY_CAPABILITIES:
|
case IRP_MN_QUERY_CAPABILITIES:
|
||||||
|
|
|
@ -743,7 +743,7 @@ CUSBRequest::BuildControlTransferQueueHead(
|
||||||
//
|
//
|
||||||
// no buffer, setup in descriptor
|
// no buffer, setup in descriptor
|
||||||
//
|
//
|
||||||
m_TransferDescriptors[1]->Token.Bits.PIDCode = PID_CODE_IN_TOKEN;
|
m_TransferDescriptors[1]->Token.Bits.PIDCode = PID_CODE_OUT_TOKEN;
|
||||||
m_TransferDescriptors[1]->Token.Bits.TotalBytesToTransfer = 0;
|
m_TransferDescriptors[1]->Token.Bits.TotalBytesToTransfer = 0;
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
|
@ -486,6 +486,7 @@ USBHUB_PdoHandlePnp(
|
||||||
ULONG_PTR Information = 0;
|
ULONG_PTR Information = 0;
|
||||||
PHUB_CHILDDEVICE_EXTENSION UsbChildExtension;
|
PHUB_CHILDDEVICE_EXTENSION UsbChildExtension;
|
||||||
ULONG Index;
|
ULONG Index;
|
||||||
|
ULONG bFound;
|
||||||
PDEVICE_RELATIONS DeviceRelation;
|
PDEVICE_RELATIONS DeviceRelation;
|
||||||
|
|
||||||
UsbChildExtension = (PHUB_CHILDDEVICE_EXTENSION)DeviceObject->DeviceExtension;
|
UsbChildExtension = (PHUB_CHILDDEVICE_EXTENSION)DeviceObject->DeviceExtension;
|
||||||
|
@ -577,19 +578,21 @@ USBHUB_PdoHandlePnp(
|
||||||
|
|
||||||
DPRINT1("IRP_MJ_PNP / IRP_MN_REMOVE_DEVICE\n");
|
DPRINT1("IRP_MJ_PNP / IRP_MN_REMOVE_DEVICE\n");
|
||||||
|
|
||||||
/* Remove the device */
|
|
||||||
Status = HubInterface->RemoveUsbDevice(HubDeviceExtension->UsbDInterface.BusContext, UsbChildExtension->UsbDeviceHandle, 0);
|
|
||||||
|
|
||||||
/* FIXME handle error */
|
|
||||||
ASSERT(Status == STATUS_SUCCESS);
|
|
||||||
|
|
||||||
/* remove us from pdo list */
|
/* remove us from pdo list */
|
||||||
|
bFound = FALSE;
|
||||||
for(Index = 0; Index < USB_MAXCHILDREN; Index++)
|
for(Index = 0; Index < USB_MAXCHILDREN; Index++)
|
||||||
{
|
{
|
||||||
if (HubDeviceExtension->ChildDeviceObject[Index] == DeviceObject)
|
if (HubDeviceExtension->ChildDeviceObject[Index] == DeviceObject)
|
||||||
{
|
{
|
||||||
|
/* Remove the device */
|
||||||
|
Status = HubInterface->RemoveUsbDevice(HubDeviceExtension->UsbDInterface.BusContext, UsbChildExtension->UsbDeviceHandle, 0);
|
||||||
|
|
||||||
|
/* FIXME handle error */
|
||||||
|
ASSERT(Status == STATUS_SUCCESS);
|
||||||
|
|
||||||
/* remove us */
|
/* remove us */
|
||||||
HubDeviceExtension->ChildDeviceObject[Index] = NULL;
|
HubDeviceExtension->ChildDeviceObject[Index] = NULL;
|
||||||
|
bFound = TRUE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -598,8 +601,12 @@ USBHUB_PdoHandlePnp(
|
||||||
Irp->IoStatus.Status = STATUS_SUCCESS;
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||||
|
|
||||||
/* Delete the device object */
|
if (bFound)
|
||||||
IoDeleteDevice(DeviceObject);
|
{
|
||||||
|
/* Delete the device object */
|
||||||
|
IoDeleteDevice(DeviceObject);
|
||||||
|
}
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
case IRP_MN_QUERY_DEVICE_RELATIONS:
|
case IRP_MN_QUERY_DEVICE_RELATIONS:
|
||||||
|
|
|
@ -622,75 +622,84 @@ CUSBQueue::TransferDescriptorCompletionCallback(
|
||||||
|
|
||||||
DPRINT("CUSBQueue::TransferDescriptorCompletionCallback transfer descriptor %x\n", TransferDescriptorLogicalAddress);
|
DPRINT("CUSBQueue::TransferDescriptorCompletionCallback transfer descriptor %x\n", TransferDescriptorLogicalAddress);
|
||||||
|
|
||||||
//
|
do
|
||||||
// find transfer descriptor in control list
|
|
||||||
//
|
|
||||||
Status = FindTransferDescriptorInEndpoint(m_ControlHeadEndpointDescriptor, TransferDescriptorLogicalAddress, &EndpointDescriptor, &PreviousEndpointDescriptor);
|
|
||||||
if (NT_SUCCESS(Status))
|
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
// cleanup endpoint
|
// find transfer descriptor in control list
|
||||||
//
|
//
|
||||||
CleanupEndpointDescriptor(EndpointDescriptor, PreviousEndpointDescriptor);
|
Status = FindTransferDescriptorInEndpoint(m_ControlHeadEndpointDescriptor, TransferDescriptorLogicalAddress, &EndpointDescriptor, &PreviousEndpointDescriptor);
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// cleanup endpoint
|
||||||
|
//
|
||||||
|
CleanupEndpointDescriptor(EndpointDescriptor, PreviousEndpointDescriptor);
|
||||||
|
|
||||||
|
//
|
||||||
|
// done
|
||||||
|
//
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// done
|
// find transfer descriptor in bulk list
|
||||||
|
//
|
||||||
|
Status = FindTransferDescriptorInEndpoint(m_BulkHeadEndpointDescriptor, TransferDescriptorLogicalAddress, &EndpointDescriptor, &PreviousEndpointDescriptor);
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// cleanup endpoint
|
||||||
|
//
|
||||||
|
CleanupEndpointDescriptor(EndpointDescriptor, PreviousEndpointDescriptor);
|
||||||
|
|
||||||
|
//
|
||||||
|
// done
|
||||||
|
//
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// find transfer descriptor in interrupt list
|
||||||
|
//
|
||||||
|
Status = FindTransferDescriptorInInterruptHeadEndpoints(TransferDescriptorLogicalAddress, &EndpointDescriptor, &PreviousEndpointDescriptor);
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// cleanup endpoint
|
||||||
|
//
|
||||||
|
CleanupEndpointDescriptor(EndpointDescriptor, PreviousEndpointDescriptor);
|
||||||
|
|
||||||
|
//
|
||||||
|
// done
|
||||||
|
//
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// last try: find the descriptor in isochronous list
|
||||||
|
//
|
||||||
|
Status = FindTransferDescriptorInIsochronousHeadEndpoints(TransferDescriptorLogicalAddress, &EndpointDescriptor, &PreviousEndpointDescriptor);
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// cleanup endpoint
|
||||||
|
//
|
||||||
|
DPRINT1("ISO endpoint complete\n");
|
||||||
|
ASSERT(FALSE);
|
||||||
|
CleanupEndpointDescriptor(EndpointDescriptor, PreviousEndpointDescriptor);
|
||||||
|
|
||||||
|
//
|
||||||
|
// done
|
||||||
|
//
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// no more completed descriptors found
|
||||||
//
|
//
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
//
|
}while(TRUE);
|
||||||
// find transfer descriptor in bulk list
|
|
||||||
//
|
|
||||||
Status = FindTransferDescriptorInEndpoint(m_BulkHeadEndpointDescriptor, TransferDescriptorLogicalAddress, &EndpointDescriptor, &PreviousEndpointDescriptor);
|
|
||||||
if (NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// cleanup endpoint
|
|
||||||
//
|
|
||||||
CleanupEndpointDescriptor(EndpointDescriptor, PreviousEndpointDescriptor);
|
|
||||||
|
|
||||||
//
|
|
||||||
// done
|
|
||||||
//
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// find transfer descriptor in interrupt list
|
|
||||||
//
|
|
||||||
Status = FindTransferDescriptorInInterruptHeadEndpoints(TransferDescriptorLogicalAddress, &EndpointDescriptor, &PreviousEndpointDescriptor);
|
|
||||||
if (NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// cleanup endpoint
|
|
||||||
//
|
|
||||||
CleanupEndpointDescriptor(EndpointDescriptor, PreviousEndpointDescriptor);
|
|
||||||
|
|
||||||
//
|
|
||||||
// done
|
|
||||||
//
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// last try: find the descriptor in isochronous list
|
|
||||||
//
|
|
||||||
Status = FindTransferDescriptorInIsochronousHeadEndpoints(TransferDescriptorLogicalAddress, &EndpointDescriptor, &PreviousEndpointDescriptor);
|
|
||||||
if (NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// cleanup endpoint
|
|
||||||
//
|
|
||||||
DPRINT1("ISO endpoint complete\n");
|
|
||||||
ASSERT(FALSE);
|
|
||||||
CleanupEndpointDescriptor(EndpointDescriptor, PreviousEndpointDescriptor);
|
|
||||||
|
|
||||||
//
|
|
||||||
// done
|
|
||||||
//
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// hardware reported dead endpoint completed
|
// hardware reported dead endpoint completed
|
||||||
|
|
|
@ -773,6 +773,7 @@ USBSTOR_PdoHandlePnp(
|
||||||
PPDO_DEVICE_EXTENSION DeviceExtension;
|
PPDO_DEVICE_EXTENSION DeviceExtension;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PDEVICE_CAPABILITIES Caps;
|
PDEVICE_CAPABILITIES Caps;
|
||||||
|
ULONG bDelete;
|
||||||
|
|
||||||
//
|
//
|
||||||
// get current stack location
|
// get current stack location
|
||||||
|
@ -845,13 +846,31 @@ USBSTOR_PdoHandlePnp(
|
||||||
{
|
{
|
||||||
DPRINT1("IRP_MN_REMOVE_DEVICE\n");
|
DPRINT1("IRP_MN_REMOVE_DEVICE\n");
|
||||||
|
|
||||||
|
if(*DeviceExtension->PDODeviceObject != NULL)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// clear entry in FDO pdo list
|
||||||
|
//
|
||||||
|
*DeviceExtension->PDODeviceObject = NULL;
|
||||||
|
bDelete = TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// device object already marked for deletion
|
||||||
|
//
|
||||||
|
bDelete = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/* Complete the IRP */
|
/* Complete the IRP */
|
||||||
Irp->IoStatus.Status = STATUS_SUCCESS;
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||||
|
|
||||||
/* Delete the device object */
|
if (bDelete)
|
||||||
IoDeleteDevice(DeviceObject);
|
{
|
||||||
|
/* Delete the device object */
|
||||||
|
IoDeleteDevice(DeviceObject);
|
||||||
|
}
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
case IRP_MN_QUERY_CAPABILITIES:
|
case IRP_MN_QUERY_CAPABILITIES:
|
||||||
|
@ -880,7 +899,10 @@ USBSTOR_PdoHandlePnp(
|
||||||
// if we're not claimed it's ok
|
// if we're not claimed it's ok
|
||||||
//
|
//
|
||||||
if (DeviceExtension->Claimed)
|
if (DeviceExtension->Claimed)
|
||||||
|
{
|
||||||
Status = STATUS_UNSUCCESSFUL;
|
Status = STATUS_UNSUCCESSFUL;
|
||||||
|
DPRINT1("[USBSTOR] Request %x fails because device is still claimed\n", IoStack->MinorFunction);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
Status = STATUS_SUCCESS;
|
Status = STATUS_SUCCESS;
|
||||||
break;
|
break;
|
||||||
|
@ -961,6 +983,7 @@ USBSTOR_CreatePDO(
|
||||||
RtlZeroMemory(PDODeviceExtension, sizeof(PDO_DEVICE_EXTENSION));
|
RtlZeroMemory(PDODeviceExtension, sizeof(PDO_DEVICE_EXTENSION));
|
||||||
PDODeviceExtension->Common.IsFDO = FALSE;
|
PDODeviceExtension->Common.IsFDO = FALSE;
|
||||||
PDODeviceExtension->LowerDeviceObject = DeviceObject;
|
PDODeviceExtension->LowerDeviceObject = DeviceObject;
|
||||||
|
PDODeviceExtension->PDODeviceObject = ChildDeviceObject;
|
||||||
|
|
||||||
//
|
//
|
||||||
// set device flags
|
// set device flags
|
||||||
|
|
|
@ -79,6 +79,7 @@ typedef struct
|
||||||
UCHAR Claimed; // indicating if it has been claimed by upper driver
|
UCHAR Claimed; // indicating if it has been claimed by upper driver
|
||||||
ULONG BlockLength; // length of block
|
ULONG BlockLength; // length of block
|
||||||
ULONG LastLogicBlockAddress; // last block address
|
ULONG LastLogicBlockAddress; // last block address
|
||||||
|
PDEVICE_OBJECT *PDODeviceObject; // entry in pdo list
|
||||||
}PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION;
|
}PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION;
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue