|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 3/3] Rework PdoStartDevice()
Moves MIB table parsing, detection of aliased device and copying of network
settings to a seperate function, to avoid any failures to the START_DEVICE
IRP if network alias detection and settings copying code fails. The only failure
of note is STATUS_PNP_REBOOT_REQUIRED, indicating the VM requires a reboot to
replace emulated devices.
Windows Update will reject driver updates if sufficient install failures or
failures within 2 days of install are detected (> 5% of installs). Completing
the START_DEVICE IRP with any failure other than STATUS_PNP_REBOOT_REQUIRED will
cause an installation failure (Code 10) and lead to driver updates being removed
from Windows Update.
Signed-off-by: Owen Smith <owen.smith@xxxxxxxxx>
---
src/xenvif/pdo.c | 146 +++++++++++++++++++++++++----------------------
1 file changed, 77 insertions(+), 69 deletions(-)
diff --git a/src/xenvif/pdo.c b/src/xenvif/pdo.c
index f23b047..0cef2d5 100644
--- a/src/xenvif/pdo.c
+++ b/src/xenvif/pdo.c
@@ -95,8 +95,6 @@ struct _XENVIF_PDO {
PXENVIF_VIF_CONTEXT VifContext;
XENVIF_VIF_INTERFACE VifInterface;
-
- BOOLEAN HasAlias;
};
static FORCEINLINE PVOID
@@ -1272,64 +1270,34 @@ PdoUnplugRequested(
return State;
}
-static DECLSPEC_NOINLINE NTSTATUS
-PdoStartDevice(
+static FORCEINLINE NTSTATUS
+PdoParseMibTable(
IN PXENVIF_PDO Pdo,
- IN PIRP Irp
+ IN HANDLE SoftwareKey
)
{
NTSTATUS (*__GetIfTable2)(PMIB_IF_TABLE2 *);
VOID (*__FreeMibTable)(PVOID);
PMIB_IF_TABLE2 Table;
ULONG Index;
- PIO_STACK_LOCATION StackLocation;
- HANDLE SoftwareKey;
- HANDLE HardwareKey;
GUID Guid;
NTSTATUS status;
- status = STATUS_UNSUCCESSFUL;
- if (Pdo->HasAlias)
- goto fail1;
-
- if (DriverSafeMode())
- goto fail2;
-
- status = RegistryOpenSoftwareKey(__PdoGetDeviceObject(Pdo),
- KEY_READ,
- &SoftwareKey);
- if (!NT_SUCCESS(status))
- goto fail3;
-
- status = RegistryOpenHardwareKey(__PdoGetDeviceObject(Pdo),
- KEY_ALL_ACCESS,
- &HardwareKey);
- if (!NT_SUCCESS(status))
- goto fail4;
-
- (VOID) PdoSetFriendlyName(Pdo,
- SoftwareKey,
- HardwareKey);
-
- status = __PdoSetCurrentAddress(Pdo, SoftwareKey);
- if (!NT_SUCCESS(status))
- goto fail5;
-
status = LinkGetRoutineAddress("netio.sys",
"GetIfTable2",
(PVOID *)&__GetIfTable2);
if (!NT_SUCCESS(status))
- goto fail6;
+ goto fail1;
status = LinkGetRoutineAddress("netio.sys",
"FreeMibTable",
(PVOID *)&__FreeMibTable);
if (!NT_SUCCESS(status))
- goto fail7;
+ goto fail2;
status = __GetIfTable2(&Table);
if (!NT_SUCCESS(status))
- goto fail8;
+ goto fail3;
//
// Look for a network interface with the same permanent address
@@ -1364,16 +1332,8 @@ PdoStartDevice(
&Row->InterfaceGuid,
&Row->InterfaceLuid);
- Pdo->HasAlias = TRUE;
- break;
- }
-
- if (Pdo->HasAlias || !PdoUnplugRequested(Pdo)) {
- PdoUnplugRequest(Pdo, TRUE);
- DriverRequestReboot();
-
status = STATUS_PNP_REBOOT_REQUIRED;
- goto fail9;
+ goto fail4;
}
//
@@ -1416,11 +1376,76 @@ PdoStartDevice(
&Luid);
}
+ __FreeMibTable(Table);
+
+ return STATUS_SUCCESS;
+
+fail4:
+ Error("fail4\n");
+
+ __FreeMibTable(Table);
+
+fail3:
+ Error("fail3\n");
+
+fail2:
+ Error("fail2\n");
+
+fail1:
+ Error("fail1 (%08x)\n", status);
+
+ return status;
+}
+
+static DECLSPEC_NOINLINE NTSTATUS
+PdoStartDevice(
+ IN PXENVIF_PDO Pdo,
+ IN PIRP Irp
+ )
+{
+ PIO_STACK_LOCATION StackLocation;
+ HANDLE SoftwareKey;
+ HANDLE HardwareKey;
+ NTSTATUS status;
+
+ status = STATUS_UNSUCCESSFUL;
+ if (DriverSafeMode())
+ goto fail1;
+
+ status = RegistryOpenSoftwareKey(__PdoGetDeviceObject(Pdo),
+ KEY_READ,
+ &SoftwareKey);
+ if (!NT_SUCCESS(status))
+ goto fail2;
+
+ status = RegistryOpenHardwareKey(__PdoGetDeviceObject(Pdo),
+ KEY_ALL_ACCESS,
+ &HardwareKey);
+ if (!NT_SUCCESS(status))
+ goto fail3;
+
+ (VOID) PdoSetFriendlyName(Pdo,
+ SoftwareKey,
+ HardwareKey);
+
+ status = __PdoSetCurrentAddress(Pdo, SoftwareKey);
+ if (!NT_SUCCESS(status))
+ goto fail4;
+
+ status = PdoParseMibTable(Pdo, SoftwareKey);
+ if (status == STATUS_PNP_REBOOT_REQUIRED || !PdoUnplugRequested(Pdo)) {
+ PdoUnplugRequest(Pdo, TRUE);
+ DriverRequestReboot();
+
+ status = STATUS_PNP_REBOOT_REQUIRED;
+ goto fail5;
+ }
+
StackLocation = IoGetCurrentIrpStackLocation(Irp);
status = PdoD3ToD0(Pdo);
if (!NT_SUCCESS(status))
- goto fail10;
+ goto fail6;
PdoUnplugRequest(Pdo, TRUE);
@@ -1429,45 +1454,29 @@ PdoStartDevice(
Irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
- __FreeMibTable(Table);
-
RegistryCloseKey(HardwareKey);
RegistryCloseKey(SoftwareKey);
return STATUS_SUCCESS;
-fail10:
- Error("fail10\n");
-
-fail9:
- Error("fail9\n");
-
- __FreeMibTable(Table);
-
-fail8:
- Error("fail8\n");
-
-fail7:
- Error("fail7\n");
-
fail6:
Error("fail6\n");
- RtlZeroMemory(&Pdo->CurrentAddress, sizeof (ETHERNET_ADDRESS));
-
fail5:
Error("fail5\n");
- RegistryCloseKey(HardwareKey);
+ RtlZeroMemory(&Pdo->CurrentAddress, sizeof (ETHERNET_ADDRESS));
fail4:
Error("fail4\n");
- RegistryCloseKey(SoftwareKey);
+ RegistryCloseKey(HardwareKey);
fail3:
Error("fail3\n");
+ RegistryCloseKey(SoftwareKey);
+
fail2:
Error("fail2\n");
@@ -2892,7 +2901,6 @@ PdoDestroy(
PXENVIF_FDO Fdo = __PdoGetFdo(Pdo);
Pdo->UnplugRequested = FALSE;
- Pdo->HasAlias = FALSE;
ASSERT3U(__PdoGetDevicePnpState(Pdo), ==, Deleted);
--
2.41.0.windows.3
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |