[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 6/8] Move reboot request code into driver.c
It doesn't really belong in pdo.c Also this patch adds a check in PdoStartDevice() to fail if a reboot has already been requested. This is because Windows 10 apparently has a couple of goes at starting the PDO even after it failed to start the first time (because we requested a reboot). Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx> --- src/xenvif/driver.c | 22 +++++++++++++++++--- src/xenvif/driver.h | 9 ++++++-- src/xenvif/pdo.c | 59 +++++++++++++++++++++-------------------------------- 3 files changed, 49 insertions(+), 41 deletions(-) diff --git a/src/xenvif/driver.c b/src/xenvif/driver.c index 46fe7f1..95a56e3 100644 --- a/src/xenvif/driver.c +++ b/src/xenvif/driver.c @@ -48,6 +48,7 @@ typedef struct _XENVIF_DRIVER { PDRIVER_OBJECT DriverObject; HANDLE ParametersKey; HANDLE StatusKey; + BOOLEAN NeedReboot; } XENVIF_DRIVER, *PXENVIF_DRIVER; static XENVIF_DRIVER Driver; @@ -116,12 +117,27 @@ __DriverGetStatusKey( return Driver.StatusKey; } -HANDLE -DriverGetStatusKey( +VOID +DriverRequestReboot( + VOID + ) +{ + Info("<===>\n"); + + ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL); + + (VOID) RegistryUpdateDwordValue(__DriverGetStatusKey(), + "NeedReboot", + 1); + Driver.NeedReboot = TRUE; +} + +BOOLEAN +DriverIsRebootRequested( VOID ) { - return __DriverGetStatusKey(); + return Driver.NeedReboot; } DRIVER_UNLOAD DriverUnload; diff --git a/src/xenvif/driver.h b/src/xenvif/driver.h index cecefd0..53b85af 100644 --- a/src/xenvif/driver.h +++ b/src/xenvif/driver.h @@ -42,8 +42,13 @@ DriverGetParametersKey( VOID ); -extern HANDLE -DriverGetStatusKey( +extern VOID +DriverRequestReboot( + VOID + ); + +BOOLEAN +DriverIsRebootRequested( VOID ); diff --git a/src/xenvif/pdo.c b/src/xenvif/pdo.c index 0cf83b9..9e3003e 100644 --- a/src/xenvif/pdo.c +++ b/src/xenvif/pdo.c @@ -1113,26 +1113,6 @@ PdoS3ToS4( Trace("(%s) <====\n", __PdoGetName(Pdo)); } -static VOID -PdoRequestReboot( - IN PXENVIF_PDO Pdo - ) -{ - HANDLE StatusKey; - - UNREFERENCED_PARAMETER(Pdo); - - Info("<===>\n"); - - ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL); - - StatusKey = DriverGetStatusKey(); - - (VOID) RegistryUpdateDwordValue(StatusKey, - "NeedReboot", - 1); -} - static DECLSPEC_NOINLINE NTSTATUS PdoStartDevice( IN PXENVIF_PDO Pdo, @@ -1147,35 +1127,39 @@ PdoStartDevice( HANDLE Key; NTSTATUS status; + status = STATUS_UNSUCCESSFUL; + if (DriverIsRebootRequested()) + goto fail1; + status = RegistryOpenSoftwareKey(__PdoGetDeviceObject(Pdo), KEY_ALL_ACCESS, &Key); if (!NT_SUCCESS(status)) - goto fail1; + goto fail2; status = __PdoSetCurrentAddress(Pdo, Key); if (!NT_SUCCESS(status)) - goto fail2; + goto fail3; status = __PdoSetLuid(Pdo, Key); if (!NT_SUCCESS(status)) - goto fail3; + goto fail4; status = LinkGetRoutineAddress("netio.sys", "GetIfTable2", (PVOID *)&__GetIfTable2); if (!NT_SUCCESS(status)) - goto fail4; + goto fail5; status = LinkGetRoutineAddress("netio.sys", "FreeMibTable", (PVOID *)&__FreeMibTable); if (!NT_SUCCESS(status)) - goto fail5; + goto fail6; status = __GetIfTable2(&Table); if (!NT_SUCCESS(status)) - goto fail6; + goto fail7; for (Index = 0; Index < Table->NumEntries; Index++) { PMIB_IF_ROW2 Row = &Table->Table[Index]; @@ -1194,14 +1178,14 @@ PdoStartDevice( if (memcmp(Row->PhysicalAddress, &Pdo->PermanentAddress, sizeof (ETHERNET_ADDRESS)) == 0) - goto fail7; + goto fail8; } StackLocation = IoGetCurrentIrpStackLocation(Irp); status = PdoD3ToD0(Pdo); if (!NT_SUCCESS(status)) - goto fail8; + goto fail9; __PdoSetDevicePnpState(Pdo, Started); @@ -1214,39 +1198,42 @@ PdoStartDevice( return STATUS_SUCCESS; +fail9: + Error("fail9\n"); + + __FreeMibTable(Table); + goto fail6; + fail8: Error("fail8\n"); + DriverRequestReboot(); __FreeMibTable(Table); - goto fail6; fail7: Error("fail7\n"); - PdoRequestReboot(Pdo); - __FreeMibTable(Table); - fail6: Error("fail6\n"); fail5: Error("fail5\n"); + RtlZeroMemory(&Pdo->Luid, sizeof (NET_LUID)); + fail4: Error("fail4\n"); - RtlZeroMemory(&Pdo->Luid, sizeof (NET_LUID)); + RtlZeroMemory(&Pdo->CurrentAddress, sizeof (ETHERNET_ADDRESS)); fail3: Error("fail3\n"); - RtlZeroMemory(&Pdo->CurrentAddress, sizeof (ETHERNET_ADDRESS)); + RegistryCloseKey(Key); fail2: Error("fail2\n"); - RegistryCloseKey(Key); - fail1: Error("fail1 (%08x)\n", status); -- 2.1.1 _______________________________________________ win-pv-devel mailing list win-pv-devel@xxxxxxxxxxxxxxxxxxxx http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |