[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 3/6] Refactor Wmi header, split initialize/teardown and register/deregister
Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx> --- src/xeniface/fdo.c | 44 +++++++++++++------ src/xeniface/wmi.c | 124 +++++++++++++++++++++++++++++++++++------------------ src/xeniface/wmi.h | 47 ++++++++++++-------- 3 files changed, 143 insertions(+), 72 deletions(-) diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c index b32e506..10ead15 100644 --- a/src/xeniface/fdo.c +++ b/src/xeniface/fdo.c @@ -896,7 +896,7 @@ FdoStartDevice( if (__FdoGetDevicePnpState(Fdo) != Stopped) { - status = WmiInit(Fdo); + status = WmiRegister(Fdo); if (!NT_SUCCESS(status)) goto fail5; } @@ -1046,7 +1046,7 @@ FdoSurpriseRemoval( Irp->IoStatus.Status = STATUS_SUCCESS; #pragma warning(suppress : 6031) IoSetDeviceInterfaceState(&Fdo->InterfaceName, FALSE); - WmiFinalise(Fdo); + WmiDeregister(Fdo); IoSkipCurrentIrpStackLocation(Irp); status = IoCallDriver(Fdo->LowerDeviceObject, Irp); @@ -1081,7 +1081,7 @@ done: Irp->IoStatus.Status = STATUS_SUCCESS; #pragma warning(suppress : 6031) IoSetDeviceInterfaceState(&Fdo->InterfaceName, FALSE); - WmiFinalise(Fdo); + WmiDeregister(Fdo); IoSkipCurrentIrpStackLocation(Irp); status = IoCallDriver(Fdo->LowerDeviceObject, Irp); @@ -1335,7 +1335,7 @@ __FdoSetDevicePowerUp( ASSERT3U(DeviceState, ==, PowerDeviceD0); status = FdoD3ToD0(Fdo); - SessionsResumeAll(Fdo); + WmiSessionsResumeAll(Fdo); ASSERT(NT_SUCCESS(status)); done: @@ -1368,7 +1368,7 @@ __FdoSetDevicePowerDown( ASSERT3U(DeviceState, ==, PowerDeviceD3); if (__FdoGetDevicePowerState(Fdo) == PowerDeviceD0){ - SessionsSuspendAll(Fdo); + WmiSessionsSuspendAll(Fdo); FdoD0ToD3(Fdo); } @@ -2322,6 +2322,10 @@ FdoCreate( if (!NT_SUCCESS(status)) goto fail13; + status = WmiInitialize(Fdo); + if (!NT_SUCCESS(status)) + goto fail14; + KeInitializeSpinLock(&Fdo->StoreWatchLock); InitializeListHead(&Fdo->StoreWatchList); @@ -2341,7 +2345,7 @@ FdoCreate( CsqReleaseLock, CsqCompleteCanceledIrp); if (!NT_SUCCESS(status)) - goto fail14; + goto fail15; #if (NTDDI_VERSION >= NTDDI_WIN7) ProcessorCount = KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS); @@ -2352,7 +2356,7 @@ FdoCreate( status = STATUS_NO_MEMORY; Fdo->EvtchnDpc = __FdoAllocate(sizeof (KDPC) * ProcessorCount); if (Fdo->EvtchnDpc == NULL) - goto fail15; + goto fail16; for (Index = 0; Index < ProcessorCount; Index++) { #if (NTDDI_VERSION >= NTDDI_WIN7) @@ -2379,9 +2383,29 @@ FdoCreate( return STATUS_SUCCESS; +fail16: + Error("fail6\n"); + + RtlZeroMemory(&Fdo->IrpQueue, sizeof (IO_CSQ)); + fail15: Error("fail15\n"); + RtlZeroMemory(&Fdo->GnttabCacheLock, sizeof (KSPIN_LOCK)); + ASSERT(IsListEmpty(&Fdo->IrpList)); + RtlZeroMemory(&Fdo->IrpList, sizeof (LIST_ENTRY)); + RtlZeroMemory(&Fdo->IrpQueueLock, sizeof (KSPIN_LOCK)); + + ASSERT(IsListEmpty(&Fdo->EvtchnList)); + RtlZeroMemory(&Fdo->EvtchnList, sizeof (LIST_ENTRY)); + RtlZeroMemory(&Fdo->EvtchnLock, sizeof (KSPIN_LOCK)); + + ASSERT(IsListEmpty(&Fdo->StoreWatchList)); + RtlZeroMemory(&Fdo->StoreWatchList, sizeof (LIST_ENTRY)); + RtlZeroMemory(&Fdo->StoreWatchLock, sizeof (KSPIN_LOCK)); + + WmiTeardown(Fdo); + fail14: Error("fail14\n"); @@ -2468,9 +2492,6 @@ fail1: return status; } - - - VOID FdoDestroy( IN PXENIFACE_FDO Fdo @@ -2552,8 +2573,7 @@ FdoDestroy( Fdo->PhysicalDeviceObject = NULL; Fdo->Dx = NULL; - RtlZeroMemory(&Fdo->SessionLock, sizeof(FAST_MUTEX)); - RtlZeroMemory(&Fdo->SessionHead, sizeof(LIST_ENTRY)); + WmiTeardown(Fdo); RtlZeroMemory(&Fdo->registryWriteEvent, sizeof(KEVENT)); RtlFreeUnicodeString(&Fdo->InterfaceName); diff --git a/src/xeniface/wmi.c b/src/xeniface/wmi.c index 0ae87d4..1ae84e1 100644 --- a/src/xeniface/wmi.c +++ b/src/xeniface/wmi.c @@ -1255,20 +1255,23 @@ void SuspendSessionLocked(XENIFACE_FDO *fdoData, } } - -void SessionsSuspendAll(XENIFACE_FDO *fdoData) { +VOID +WmiSessionsSuspendAll( + IN PXENIFACE_FDO Fdo + ) +{ XenStoreSession *session; - LockSessions(fdoData); + + LockSessions(Fdo); XenIfaceDebugPrint(TRACE,"Suspend all sessions\n"); - session = (XenStoreSession *)fdoData->SessionHead.Flink; - while (session != (XenStoreSession *)&fdoData->SessionHead) { - SuspendSessionLocked(fdoData, session); + session = (XenStoreSession *)Fdo->SessionHead.Flink; + while (session != (XenStoreSession *)&Fdo->SessionHead) { + SuspendSessionLocked(Fdo, session); session = (XenStoreSession *)session->listentry.Flink; } - UnlockSessions(fdoData); + UnlockSessions(Fdo); } - void SessionRenewWatchesLocked(XenStoreSession *session) { int i; XenStoreWatch *watch; @@ -1300,61 +1303,61 @@ void ResumeSessionLocked(XENIFACE_FDO *fdoData, SessionRenewWatchesLocked(session); } -void SessionsResumeAll(XENIFACE_FDO *fdoData) { +VOID +WmiSessionsResumeAll( + IN PXENIFACE_FDO Fdo + ) +{ XenStoreSession *session; - LockSessions(fdoData); + LockSessions(Fdo); XenIfaceDebugPrint(TRACE,"Resume all sessions\n"); - session = (XenStoreSession *)fdoData->SessionHead.Flink; - while (session != (XenStoreSession *)&fdoData->SessionHead) { - ResumeSessionLocked(fdoData, session ); - session=(XenStoreSession *)session->listentry.Flink; + session = (XenStoreSession *)Fdo->SessionHead.Flink; + while (session != (XenStoreSession *)&Fdo->SessionHead) { + ResumeSessionLocked(Fdo, session); + session = (XenStoreSession *)session->listentry.Flink; } - UnlockSessions(fdoData); + UnlockSessions(Fdo); } - NTSTATUS -WmiInit( - PXENIFACE_FDO FdoData +WmiRegister( + IN PXENIFACE_FDO Fdo ) { - NTSTATUS status = STATUS_SUCCESS; + NTSTATUS status; + XenIfaceDebugPrint(TRACE,"%s\n",__FUNCTION__); XenIfaceDebugPrint(INFO,"DRV: XenIface WMI Initialisation\n"); + status = IoWMIRegistrationControl(Fdo->Dx->DeviceObject, + WMIREG_ACTION_REGISTER); + if (!NT_SUCCESS(status)) + goto fail1; + Fdo->WmiReady = 1; + return STATUS_SUCCESS; - - IoWMISuggestInstanceName(FdoData->PhysicalDeviceObject, NULL, FALSE, - &FdoData->SuggestedInstanceName); - InitializeListHead(&FdoData->SessionHead); - FdoData->Sessions = 0; - ExInitializeFastMutex(&FdoData->SessionLock); - - status = IoWMIRegistrationControl(FdoData->Dx->DeviceObject, WMIREG_ACTION_REGISTER); - FdoData->WmiReady = 1; +fail1: + Error("fail1 (%08x)\n", status); return status; } -NTSTATUS -WmiFinalise( - PXENIFACE_FDO FdoData +VOID +WmiDeregister( + IN PXENIFACE_FDO Fdo ) { - NTSTATUS status = STATUS_SUCCESS; - if (FdoData->WmiReady) { - XenIfaceDebugPrint(INFO,"DRV: XenIface WMI Finalisation\n"); - XenIfaceDebugPrint(TRACE,"%s\n",__FUNCTION__); - SessionsRemoveAll(FdoData); + if (!Fdo->WmiReady) + return; - status =IoWMIRegistrationControl(FdoData->Dx->DeviceObject, WMIREG_ACTION_DEREGISTER); - RtlFreeUnicodeString(&FdoData->SuggestedInstanceName); - RtlZeroBytes(&FdoData->SuggestedInstanceName, sizeof(UNICODE_STRING)); + XenIfaceDebugPrint(INFO,"DRV: XenIface WMI Finalisation\n"); + XenIfaceDebugPrint(TRACE,"%s\n",__FUNCTION__); - FdoData->WmiReady = 0; - } - return status; + SessionsRemoveAll(Fdo); + (VOID) IoWMIRegistrationControl(Fdo->Dx->DeviceObject, + WMIREG_ACTION_DEREGISTER); + Fdo->WmiReady = 0; } NTSTATUS @@ -3090,4 +3093,41 @@ Updated Routine Description: } } +NTSTATUS +WmiInitialize( + IN PXENIFACE_FDO Fdo + ) +{ + NTSTATUS status; + + status = IoWMISuggestInstanceName(Fdo->PhysicalDeviceObject, + NULL, + FALSE, + &Fdo->SuggestedInstanceName); + if (!NT_SUCCESS(status)) + goto fail1; + + Fdo->Sessions = 0; + InitializeListHead(&Fdo->SessionHead); + ExInitializeFastMutex(&Fdo->SessionLock); + + return STATUS_SUCCESS; + +fail1: + Error("fail1 (%08x)\n", status); + return status; +} + +VOID +WmiTeardown( + IN PXENIFACE_FDO Fdo + ) +{ + ASSERT(Fdo->Sessions == 0); + + RtlZeroMemory(&Fdo->SessionLock, sizeof(FAST_MUTEX)); + RtlZeroMemory(&Fdo->SessionHead, sizeof(LIST_ENTRY)); + RtlFreeUnicodeString(&Fdo->SuggestedInstanceName); + RtlZeroMemory(&Fdo->SuggestedInstanceName, sizeof(UNICODE_STRING)); +} diff --git a/src/xeniface/wmi.h b/src/xeniface/wmi.h index b9dd256..2656b46 100644 --- a/src/xeniface/wmi.h +++ b/src/xeniface/wmi.h @@ -38,33 +38,44 @@ #include "wmi_generated.h" extern NTSTATUS -WmiProcessMinorFunction( - IN PXENIFACE_FDO Fdo, - IN PIRP Irp +WmiInitialize( + IN PXENIFACE_FDO Fdo ); extern VOID -WmiFireSuspendEvent( +WmiTeardown( IN PXENIFACE_FDO Fdo ); -NTSTATUS -WmiInit( - PXENIFACE_FDO FdoData -); +extern NTSTATUS +WmiRegister( + IN PXENIFACE_FDO Fdo + ); +extern VOID +WmiDeregister( + IN PXENIFACE_FDO Fdo + ); -NTSTATUS -WmiFinalise( - PXENIFACE_FDO FdoData -); +extern VOID +WmiSessionsResumeAll( + IN PXENIFACE_FDO Fdo + ); -void SessionsResumeAll( - XENIFACE_FDO *fdoData -); +extern VOID +WmiSessionsSuspendAll( + IN PXENIFACE_FDO Fdo + ); -void SessionsSuspendAll( - XENIFACE_FDO *fdoData -); +extern NTSTATUS +WmiProcessMinorFunction( + IN PXENIFACE_FDO Fdo, + IN PIRP Irp + ); + +extern VOID +WmiFireSuspendEvent( + IN PXENIFACE_FDO Fdo + ); #endif -- 1.9.4.msysgit.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 |