IN XENVKBD_FRONTEND_STATE State
)
{
- BOOLEAN Failed;
+ NTSTATUS status;
KIRQL Irql;
KeAcquireSpinLock(&Frontend->Lock, &Irql);
FrontendStateName(Frontend->State),
FrontendStateName(State));
- Failed = FALSE;
- while (Frontend->State != State && !Failed) {
- NTSTATUS status;
-
+ status = STATUS_SUCCESS;
+ while (Frontend->State != State && NT_SUCCESS(status)) {
switch (Frontend->State) {
case FRONTEND_UNKNOWN:
switch (State) {
status = FrontendClose(Frontend);
if (NT_SUCCESS(status)) {
Frontend->State = FRONTEND_CLOSED;
- } else {
- Failed = TRUE;
}
break;
Frontend->State = FRONTEND_CLOSED;
}
break;
+ case FRONTEND_UNKNOWN:
+ Frontend->State = FRONTEND_UNKNOWN;
+ break;
default:
ASSERT(FALSE);
break;
Info("%s: <=====\n", __FrontendGetPath(Frontend));
- return (!Failed) ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL;
+ return status;
}
static FORCEINLINE VOID
{
PXENVKBD_HID_CONTEXT Context = Interface->Context;
KIRQL Irql;
- BOOLEAN Exclusive;
NTSTATUS status;
Trace("====>\n");
AcquireMrswLockExclusive(&Context->Lock, &Irql);
- Exclusive = TRUE;
if (Context->Enabled)
goto done;
KeMemoryBarrier();
status = FrontendSetState(Context->Frontend, FRONTEND_ENABLED);
- if (!NT_SUCCESS(status))
- goto fail1;
+ if (!NT_SUCCESS(status)) {
+ if (status != STATUS_DEVICE_NOT_READY)
+ goto fail1;
+ }
done:
- ASSERT(Exclusive);
ReleaseMrswLockExclusive(&Context->Lock, Irql, FALSE);
Trace("<====\n");
Context->Argument = NULL;
Context->Callback = NULL;
- if (Exclusive)
- ReleaseMrswLockExclusive(&Context->Lock, Irql, FALSE);
- else
- ReleaseMrswLockShared(&Context->Lock);
+ ReleaseMrswLockExclusive(&Context->Lock, Irql, FALSE);
return status;
}
BOOLEAN Connected;
BOOLEAN Enabled;
BOOLEAN AbsPointer;
+ BOOLEAN VkbdStandalone;
XENVKBD_HID_KEYBOARD KeyboardReport;
XENVKBD_HID_ABSMOUSE AbsMouseReport;
} else {
Ring->AbsPointer = FALSE;
}
+
+ status = XENBUS_STORE(Read,
+ &Ring->StoreInterface,
+ NULL,
+ FrontendGetBackendPath(Ring->Frontend),
+ "feature-vkbd-standalone",
+ &Buffer);
+ if (NT_SUCCESS(status)) {
+ Ring->VkbdStandalone = (BOOLEAN)strtoul(Buffer, NULL, 2);
+
+ XENBUS_STORE(Free,
+ &Ring->StoreInterface,
+ Buffer);
+ } else {
+ Ring->VkbdStandalone = FALSE;
+ }
}
NTSTATUS
Ring->AbsMouseReport.ReportId = 2;
RingReadFeatures(Ring);
+ status = STATUS_DEVICE_NOT_READY;
+ if (!Ring->VkbdStandalone)
+ goto fail6;
+
Ring->Mdl = __AllocatePage();
status = STATUS_NO_MEMORY;
if (Ring->Mdl == NULL)
- goto fail6;
+ goto fail7;
ASSERT(Ring->Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
Ring->Shared = Ring->Mdl->MappedSystemVa;
FALSE,
&Ring->Entry);
if (!NT_SUCCESS(status))
- goto fail7;
+ goto fail8;
Ring->Channel = XENBUS_EVTCHN(Open,
&Ring->EvtchnInterface,
status = STATUS_UNSUCCESSFUL;
if (Ring->Channel == NULL)
- goto fail8;
+ goto fail9;
XENBUS_EVTCHN(Unmask,
&Ring->EvtchnInterface,
Ring,
&Ring->DebugCallback);
if (!NT_SUCCESS(status))
- goto fail9;
+ goto fail10;
Ring->Connected = TRUE;
return STATUS_SUCCESS;
-fail9:
- Error("fail9\n");
+fail10:
+ Error("fail10\n");
XENBUS_EVTCHN(Close,
&Ring->EvtchnInterface,
Ring->Events = 0;
-fail8:
- Error("fail8\n");
+fail9:
+ Error("fail9\n");
(VOID) XENBUS_GNTTAB(RevokeForeignAccess,
&Ring->GnttabInterface,
Ring->Entry);
Ring->Entry = NULL;
-fail7:
- Error("fail7\n");
+fail8:
+ Error("fail8\n");
Ring->Shared = NULL;
__FreePage(Ring->Mdl);
Ring->Mdl = NULL;
+fail7:
+ Error("fail7\n");
+
fail6:
Error("fail6\n");
if (!NT_SUCCESS(status))
goto fail4;
+ status = XENBUS_STORE(Printf,
+ &Ring->StoreInterface,
+ Transaction,
+ FrontendGetPath(Ring->Frontend),
+ "request-vkbd-standalone",
+ "%u",
+ Ring->VkbdStandalone);
+ if (!NT_SUCCESS(status))
+ goto fail5;
+
Trace("<=====\n");
return STATUS_SUCCESS;
+fail5:
+ Error("fail5\n");
fail4:
Error("fail4\n");
fail3:
Ring->Dpcs = 0;
Ring->AbsPointer = FALSE;
+ Ring->VkbdStandalone = FALSE;
RtlZeroMemory(&Ring->Dpc, sizeof (KDPC));