if (__FdoGetDevicePnpState(Fdo) != Stopped) {
- status = WmiInit(Fdo);
+ status = WmiRegister(Fdo);
if (!NT_SUCCESS(status))
goto fail5;
}
Irp->IoStatus.Status = STATUS_SUCCESS;
#pragma warning(suppress : 6031)
IoSetDeviceInterfaceState(&Fdo->InterfaceName, FALSE);
- WmiFinalise(Fdo);
+ WmiDeregister(Fdo);
IoSkipCurrentIrpStackLocation(Irp);
status = IoCallDriver(Fdo->LowerDeviceObject, Irp);
Irp->IoStatus.Status = STATUS_SUCCESS;
#pragma warning(suppress : 6031)
IoSetDeviceInterfaceState(&Fdo->InterfaceName, FALSE);
- WmiFinalise(Fdo);
+ WmiDeregister(Fdo);
IoSkipCurrentIrpStackLocation(Irp);
status = IoCallDriver(Fdo->LowerDeviceObject, Irp);
ASSERT3U(DeviceState, ==, PowerDeviceD0);
status = FdoD3ToD0(Fdo);
- SessionsResumeAll(Fdo);
+ WmiSessionsResumeAll(Fdo);
ASSERT(NT_SUCCESS(status));
done:
ASSERT3U(DeviceState, ==, PowerDeviceD3);
if (__FdoGetDevicePowerState(Fdo) == PowerDeviceD0){
- SessionsSuspendAll(Fdo);
+ WmiSessionsSuspendAll(Fdo);
FdoD0ToD3(Fdo);
}
if (!NT_SUCCESS(status))
goto fail13;
+ status = WmiInitialize(Fdo);
+ if (!NT_SUCCESS(status))
+ goto fail14;
+
KeInitializeSpinLock(&Fdo->StoreWatchLock);
InitializeListHead(&Fdo->StoreWatchList);
CsqReleaseLock,
CsqCompleteCanceledIrp);
if (!NT_SUCCESS(status))
- goto fail14;
+ goto fail15;
ProcessorCount = KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
status = STATUS_NO_MEMORY;
Fdo->EvtchnDpc = __FdoAllocate(sizeof (KDPC) * ProcessorCount);
if (Fdo->EvtchnDpc == NULL)
- goto fail15;
+ goto fail16;
for (Index = 0; Index < ProcessorCount; Index++) {
PROCESSOR_NUMBER ProcNumber;
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");
return status;
}
-
-
-
VOID
FdoDestroy(
IN PXENIFACE_FDO Fdo
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);
}
}
-
-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;
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
}
}
+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));
+}