[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 2/2] Use XENBUS_MONITOR service to request reboot rather than SetupAPI
This means more code can be removed from XENNET's co-installer and we get a more meaningful message displayed to the user. Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx> --- src/xenvif/driver.c | 91 +++++++++++++++++++++++++++++------------------------ 1 file changed, 50 insertions(+), 41 deletions(-) diff --git a/src/xenvif/driver.c b/src/xenvif/driver.c index 8e61420..27d4911 100644 --- a/src/xenvif/driver.c +++ b/src/xenvif/driver.c @@ -45,7 +45,6 @@ typedef struct _XENVIF_DRIVER { PDRIVER_OBJECT DriverObject; HANDLE ParametersKey; - HANDLE StatusKey; BOOLEAN NeedReboot; } XENVIF_DRIVER, *PXENVIF_DRIVER; @@ -117,20 +116,58 @@ DriverGetParametersKey( return __DriverGetParametersKey(); } -static FORCEINLINE VOID -__DriverSetStatusKey( - IN HANDLE Key - ) -{ - Driver.StatusKey = Key; -} +#define SERVICES_PATH "\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Services" -static FORCEINLINE HANDLE -__DriverGetStatusKey( +#define SERVICE_KEY(_Name) \ + SERVICES_PATH ## "\\" ## #_Name + +#define REQUEST_KEY \ + SERVICE_KEY(XENBUS_MONITOR) ## "\\Request" + +static FORCEINLINE VOID +__DriverRequestReboot( VOID ) { - return Driver.StatusKey; + HANDLE RequestKey; + ANSI_STRING Ansi[2]; + NTSTATUS status; + + Info("====>\n"); + + ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL); + + status = RegistryOpenSubKey(NULL, + REQUEST_KEY, + KEY_ALL_ACCESS, + &RequestKey); + if (!NT_SUCCESS(status)) + goto fail1; + + RtlZeroMemory(Ansi, sizeof (Ansi)); + + RtlInitAnsiString(&Ansi[0], "XENVIF"); + + status = RegistryUpdateSzValue(RequestKey, + "Reboot", + REG_SZ, + Ansi); + if (!NT_SUCCESS(status)) + goto fail2; + + RegistryCloseKey(RequestKey); + + Info("<====\n"); + + return; + +fail2: + Error("fail2\n"); + + RegistryCloseKey(RequestKey); + +fail1: + Error("fail1 (%08x)\n", status); } VOID @@ -138,16 +175,11 @@ DriverRequestReboot( VOID ) { - Info("<===>\n"); - - ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL); - if (Driver.NeedReboot) return; - (VOID) RegistryUpdateDwordValue(__DriverGetStatusKey(), - "NeedReboot", - 1); + __DriverRequestReboot(); + Driver.NeedReboot = TRUE; } @@ -159,7 +191,6 @@ DriverUnload( ) { HANDLE ParametersKey; - HANDLE StatusKey; ASSERT3P(DriverObject, ==, __DriverGetDriverObject()); @@ -167,11 +198,6 @@ DriverUnload( Driver.NeedReboot = FALSE; - StatusKey = __DriverGetStatusKey(); - __DriverSetStatusKey(NULL); - - RegistryCloseKey(StatusKey); - ParametersKey = __DriverGetParametersKey(); __DriverSetParametersKey(NULL); @@ -278,7 +304,6 @@ DriverEntry( { HANDLE ServiceKey; HANDLE ParametersKey; - HANDLE StatusKey; ULONG Index; NTSTATUS status; @@ -319,15 +344,6 @@ DriverEntry( __DriverSetParametersKey(ParametersKey); - status = RegistryCreateSubKey(ServiceKey, - "Status", - REG_OPTION_VOLATILE, - &StatusKey); - if (!NT_SUCCESS(status)) - goto fail4; - - __DriverSetStatusKey(StatusKey); - RegistryCloseKey(ServiceKey); DriverObject->DriverExtension->AddDevice = AddDevice; @@ -342,13 +358,6 @@ DriverEntry( return STATUS_SUCCESS; -fail4: - Error("fail4\n"); - - __DriverSetParametersKey(NULL); - - RegistryCloseKey(ParametersKey); - fail3: Error("fail3\n"); -- 2.1.1 _______________________________________________ win-pv-devel mailing list win-pv-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |