mirror of
https://github.com/reactos/reactos.git
synced 2025-05-06 18:31:26 +00:00
[NTOSKRNL]
- Add a stub for IRP_MN_REMOVE_DEVICE in PnpRoot - Revert 2 incorrect changes from r46983 (DNF_ENUMERATED added to the DNF_ADDED assertion and setting the DNF_RESOURCE_REPORTED flag in IopStartDevice2) - Set the DNF_LEGACY_DRIVER flag if the AddDevice handler is missing - Add a helper function called IopSendRemoveDevice which sends IRP_MN_REMOVE_DEVICE to a device object - Call IopSendRemoveDevice if IRP_MN_START_DEVICE fails - Set the DNF_STARTED and DNF_ADDED flags for legacy drivers - Enable the DNF_ADDED assertion in IopStartDevice2 svn path=/trunk/; revision=46997
This commit is contained in:
parent
c0d168b15a
commit
1e1d4a34ac
2 changed files with 41 additions and 18 deletions
|
@ -66,19 +66,20 @@ IopInitializeDevice(PDEVICE_NODE DeviceNode,
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
if (!DriverObject->DriverExtension->AddDevice)
|
if (!DriverObject->DriverExtension->AddDevice)
|
||||||
|
{
|
||||||
|
DeviceNode->Flags |= DNF_LEGACY_DRIVER;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (DeviceNode->Flags & DNF_LEGACY_DRIVER)
|
||||||
|
{
|
||||||
|
DeviceNode->Flags |= DNF_ADDED + DNF_STARTED;
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
/* This is a Plug and Play driver */
|
/* This is a Plug and Play driver */
|
||||||
DPRINT("Plug and Play driver found\n");
|
DPRINT("Plug and Play driver found\n");
|
||||||
ASSERT(DeviceNode->PhysicalDeviceObject);
|
ASSERT(DeviceNode->PhysicalDeviceObject);
|
||||||
|
|
||||||
/* Check if this plug-and-play driver is used as a legacy one for this device node */
|
|
||||||
if (IopDeviceNodeHasFlag(DeviceNode, DNF_LEGACY_DRIVER))
|
|
||||||
{
|
|
||||||
IopDeviceNodeSetFlag(DeviceNode, DNF_ADDED);
|
|
||||||
return STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
DPRINT("Calling %wZ->AddDevice(%wZ)\n",
|
DPRINT("Calling %wZ->AddDevice(%wZ)\n",
|
||||||
&DriverObject->DriverName,
|
&DriverObject->DriverName,
|
||||||
&DeviceNode->InstancePath);
|
&DeviceNode->InstancePath);
|
||||||
|
@ -122,6 +123,21 @@ IopInitializeDevice(PDEVICE_NODE DeviceNode,
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
IopSendRemoveDevice(IN PDEVICE_OBJECT DeviceObject)
|
||||||
|
{
|
||||||
|
IO_STACK_LOCATION Stack;
|
||||||
|
PVOID Dummy;
|
||||||
|
|
||||||
|
RtlZeroMemory(&Stack, sizeof(IO_STACK_LOCATION));
|
||||||
|
Stack.MajorFunction = IRP_MJ_PNP;
|
||||||
|
Stack.MinorFunction = IRP_MN_REMOVE_DEVICE;
|
||||||
|
|
||||||
|
/* Drivers should never fail a IRP_MN_REMOVE_DEVICE request */
|
||||||
|
IopSynchronousCall(DeviceObject, &Stack, &Dummy);
|
||||||
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
NTAPI
|
NTAPI
|
||||||
IopStartDevice2(IN PDEVICE_OBJECT DeviceObject)
|
IopStartDevice2(IN PDEVICE_OBJECT DeviceObject)
|
||||||
|
@ -156,10 +172,11 @@ IopStartDevice2(IN PDEVICE_OBJECT DeviceObject)
|
||||||
Status = IopSynchronousCall(DeviceObject, &Stack, &Dummy);
|
Status = IopSynchronousCall(DeviceObject, &Stack, &Dummy);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
/* We failed start */
|
/* Send an IRP_MN_REMOVE_DEVICE request */
|
||||||
DeviceNode->Flags |= DNF_START_FAILED;
|
IopSendRemoveDevice(DeviceObject);
|
||||||
|
|
||||||
/* TODO: Undo all the stuff we did up to this point */
|
/* Set the appropriate flag */
|
||||||
|
DeviceNode->Flags |= DNF_START_FAILED;
|
||||||
|
|
||||||
DPRINT1("Warning: PnP Start failed (%wZ)\n", &DeviceNode->InstancePath);
|
DPRINT1("Warning: PnP Start failed (%wZ)\n", &DeviceNode->InstancePath);
|
||||||
return;
|
return;
|
||||||
|
@ -168,9 +185,6 @@ IopStartDevice2(IN PDEVICE_OBJECT DeviceObject)
|
||||||
/* Otherwise, mark us as started */
|
/* Otherwise, mark us as started */
|
||||||
DeviceNode->Flags |= DNF_STARTED;
|
DeviceNode->Flags |= DNF_STARTED;
|
||||||
|
|
||||||
/* We reported the resources */
|
|
||||||
DeviceNode->Flags |= DNF_RESOURCE_REPORTED;
|
|
||||||
|
|
||||||
/* We now need enumeration */
|
/* We now need enumeration */
|
||||||
DeviceNode->Flags |= DNF_NEED_ENUMERATION_ONLY;
|
DeviceNode->Flags |= DNF_NEED_ENUMERATION_ONLY;
|
||||||
}
|
}
|
||||||
|
@ -184,10 +198,7 @@ IopStartAndEnumerateDevice(IN PDEVICE_NODE DeviceNode)
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
/* Sanity check */
|
/* Sanity check */
|
||||||
// ASSERT((DeviceNode->Flags & DNF_ADDED) || (DeviceNode->Flags & DNF_ENUMERATED));
|
ASSERT((DeviceNode->Flags & DNF_ADDED));
|
||||||
if (!(DeviceNode->Flags & DNF_ADDED) && !(DeviceNode->Flags & DNF_ENUMERATED))
|
|
||||||
DPRINT1("Warning: Starting a device node without DNF_ADDED or DNF_ENUMERATED (%wZ)\n",
|
|
||||||
&DeviceNode->InstancePath);
|
|
||||||
ASSERT((DeviceNode->Flags & (DNF_RESOURCE_ASSIGNED |
|
ASSERT((DeviceNode->Flags & (DNF_RESOURCE_ASSIGNED |
|
||||||
DNF_RESOURCE_REPORTED |
|
DNF_RESOURCE_REPORTED |
|
||||||
DNF_NO_RESOURCE_REQUIRED)));
|
DNF_NO_RESOURCE_REQUIRED)));
|
||||||
|
@ -243,6 +254,12 @@ IopStartDevice(
|
||||||
UNICODE_STRING KeyName;
|
UNICODE_STRING KeyName;
|
||||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||||
|
|
||||||
|
if (DeviceNode->Flags & (DNF_STARTED | DNF_START_REQUEST_PENDING))
|
||||||
|
{
|
||||||
|
/* Nothing to do here */
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
Status = IopAssignDeviceResources(DeviceNode);
|
Status = IopAssignDeviceResources(DeviceNode);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
goto ByeBye;
|
goto ByeBye;
|
||||||
|
@ -542,8 +559,9 @@ IopCreateDeviceNode(PDEVICE_NODE ParentNode,
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This is for drivers passed on the command line to ntoskrnl.exe */
|
|
||||||
IopDeviceNodeSetFlag(Node, DNF_LEGACY_DRIVER);
|
IopDeviceNodeSetFlag(Node, DNF_LEGACY_DRIVER);
|
||||||
|
IopDeviceNodeSetFlag(Node, DNF_ADDED);
|
||||||
|
IopDeviceNodeSetFlag(Node, DNF_STARTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
Node->PhysicalDeviceObject = PhysicalDeviceObject;
|
Node->PhysicalDeviceObject = PhysicalDeviceObject;
|
||||||
|
|
|
@ -1069,6 +1069,11 @@ PnpRootPdoPnpControl(
|
||||||
DPRINT("IRP_MJ_PNP / IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n");
|
DPRINT("IRP_MJ_PNP / IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case IRP_MN_REMOVE_DEVICE:
|
||||||
|
DPRINT1("IRP_MN_REMOVE_DEVICE is UNIMPLEMENTED!\n");
|
||||||
|
Status = STATUS_SUCCESS;
|
||||||
|
break;
|
||||||
|
|
||||||
case IRP_MN_QUERY_ID: /* 0x13 */
|
case IRP_MN_QUERY_ID: /* 0x13 */
|
||||||
Status = PdoQueryId(DeviceObject, Irp, IrpSp);
|
Status = PdoQueryId(DeviceObject, Irp, IrpSp);
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in a new issue