- Send IRP_MN_FILTER_RESOURCE_REQUIREMENTS to devices before IRP_MN_START_DEVICE. Allows the Windows Input Stack to load better, but we still have a load order bug. Patch by hpoussin.

svn path=/trunk/; revision=26324
This commit is contained in:
Alex Ionescu 2007-04-12 23:48:31 +00:00
parent 8eb6d672a1
commit 4337531281

View file

@ -57,6 +57,15 @@ IoSynchronousInvalidateDeviceRelations(
/* FUNCTIONS *****************************************************************/ /* FUNCTIONS *****************************************************************/
static NTSTATUS
IopAssignDeviceResources(
IN PDEVICE_NODE DeviceNode,
OUT ULONG *pRequiredSize);
static NTSTATUS
IopTranslateDeviceResources(
IN PDEVICE_NODE DeviceNode,
IN ULONG RequiredSize);
PDEVICE_NODE PDEVICE_NODE
FASTCALL FASTCALL
IopGetDeviceNode(PDEVICE_OBJECT DeviceObject) IopGetDeviceNode(PDEVICE_OBJECT DeviceObject)
@ -132,12 +141,46 @@ IopStartDevice(
{ {
IO_STATUS_BLOCK IoStatusBlock; IO_STATUS_BLOCK IoStatusBlock;
IO_STACK_LOCATION Stack; IO_STACK_LOCATION Stack;
ULONG RequiredLength;
PDEVICE_OBJECT Fdo; PDEVICE_OBJECT Fdo;
NTSTATUS Status; NTSTATUS Status;
DPRINT("Sending IRP_MN_START_DEVICE to driver\n");
Fdo = IoGetAttachedDeviceReference(DeviceNode->PhysicalDeviceObject); Fdo = IoGetAttachedDeviceReference(DeviceNode->PhysicalDeviceObject);
IopDeviceNodeSetFlag(DeviceNode, DNF_ASSIGNING_RESOURCES);
DPRINT("Sending IRP_MN_FILTER_RESOURCE_REQUIREMENTS to device stack\n");
Stack.Parameters.FilterResourceRequirements.IoResourceRequirementList = DeviceNode->ResourceRequirements;
Status = IopInitiatePnpIrp(
Fdo,
&IoStatusBlock,
IRP_MN_FILTER_RESOURCE_REQUIREMENTS,
&Stack);
/* FIXME: Take care of return code */
if (!NT_SUCCESS(Status))
{
DPRINT("IopInitiatePnpIrp(IRP_MN_FILTER_RESOURCE_REQUIREMENTS) failed\n");
}
Status = IopAssignDeviceResources(DeviceNode, &RequiredLength);
if (NT_SUCCESS(Status))
{
Status = IopTranslateDeviceResources(DeviceNode, RequiredLength);
if (NT_SUCCESS(Status))
{
IopDeviceNodeSetFlag(DeviceNode, DNF_RESOURCE_ASSIGNED);
}
else
{
DPRINT("IopTranslateDeviceResources() failed (Status 0x08lx)\n", Status);
}
}
else
{
DPRINT("IopAssignDeviceResources() failed (Status 0x08lx)\n", Status);
}
IopDeviceNodeClearFlag(DeviceNode, DNF_ASSIGNING_RESOURCES);
DPRINT("Sending IRP_MN_START_DEVICE to driver\n");
Stack.Parameters.StartDevice.AllocatedResources = DeviceNode->ResourceList; Stack.Parameters.StartDevice.AllocatedResources = DeviceNode->ResourceList;
Stack.Parameters.StartDevice.AllocatedResourcesTranslated = DeviceNode->ResourceListTranslated; Stack.Parameters.StartDevice.AllocatedResourcesTranslated = DeviceNode->ResourceListTranslated;
@ -948,7 +991,7 @@ IopInitiatePnpIrp(PDEVICE_OBJECT DeviceObject,
/* PNP IRPs are always initialized with a status code of /* PNP IRPs are always initialized with a status code of
STATUS_NOT_IMPLEMENTED */ STATUS_NOT_IMPLEMENTED */
Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED; Irp->IoStatus.Status = MinorFunction == IRP_MN_FILTER_RESOURCE_REQUIREMENTS ? STATUS_SUCCESS : STATUS_NOT_IMPLEMENTED; // hpoussin's hack of doom
Irp->IoStatus.Information = 0; Irp->IoStatus.Information = 0;
IrpSp = IoGetNextIrpStackLocation(Irp); IrpSp = IoGetNextIrpStackLocation(Irp);
@ -1270,8 +1313,6 @@ IopAssignDeviceResources(
* Actually, use the BootResources if provided, else the resource list #0 * Actually, use the BootResources if provided, else the resource list #0
*/ */
IopDeviceNodeSetFlag(DeviceNode, DNF_ASSIGNING_RESOURCES);
if (DeviceNode->BootResources) if (DeviceNode->BootResources)
{ {
/* Browse the boot resources to know if we have some custom structures */ /* Browse the boot resources to know if we have some custom structures */
@ -1306,8 +1347,6 @@ IopAssignDeviceResources(
} }
/* Ok, here, we have to use the device requirement list */ /* Ok, here, we have to use the device requirement list */
IopDeviceNodeSetFlag(DeviceNode, DNF_ASSIGNING_RESOURCES);
ResourceList = &DeviceNode->ResourceRequirements->List[0]; ResourceList = &DeviceNode->ResourceRequirements->List[0];
if (ResourceList->Version != 1 || ResourceList->Revision != 1) if (ResourceList->Version != 1 || ResourceList->Revision != 1)
{ {
@ -2126,26 +2165,6 @@ IopActionInterrogateDeviceStack(PDEVICE_NODE DeviceNode,
ZwClose(InstanceKey); ZwClose(InstanceKey);
IopDeviceNodeSetFlag(DeviceNode, DNF_ASSIGNING_RESOURCES);
Status = IopAssignDeviceResources(DeviceNode, &RequiredLength);
if (NT_SUCCESS(Status))
{
Status = IopTranslateDeviceResources(DeviceNode, RequiredLength);
if (NT_SUCCESS(Status))
{
IopDeviceNodeSetFlag(DeviceNode, DNF_RESOURCE_ASSIGNED);
}
else
{
DPRINT("IopTranslateDeviceResources() failed (Status 0x08lx)\n", Status);
}
}
else
{
DPRINT("IopAssignDeviceResources() failed (Status 0x08lx)\n", Status);
}
IopDeviceNodeClearFlag(DeviceNode, DNF_ASSIGNING_RESOURCES);
DeviceNode->Flags |= DNF_PROCESSED; DeviceNode->Flags |= DNF_PROCESSED;
/* Report the device to the user-mode pnp manager */ /* Report the device to the user-mode pnp manager */
@ -2345,10 +2364,6 @@ IopActionInitChildServices(PDEVICE_NODE DeviceNode,
PLDR_DATA_TABLE_ENTRY ModuleObject; PLDR_DATA_TABLE_ENTRY ModuleObject;
PDRIVER_OBJECT DriverObject; PDRIVER_OBJECT DriverObject;
/* FIXME: Remove this once the bug is fixed */
if (DeviceNode->ServiceName.Buffer == NULL)
DPRINT1("Weird DeviceNode %p having ServiceName->Buffer==NULL. Probable stack corruption or memory overwrite.\n", DeviceNode);
Status = IopLoadServiceModule(&DeviceNode->ServiceName, &ModuleObject); Status = IopLoadServiceModule(&DeviceNode->ServiceName, &ModuleObject);
if (NT_SUCCESS(Status) || Status == STATUS_IMAGE_ALREADY_LOADED) if (NT_SUCCESS(Status) || Status == STATUS_IMAGE_ALREADY_LOADED)
{ {