PXENVBD_THREAD ScanThread;
KEVENT ScanEvent;
PXENBUS_STORE_WATCH ScanWatch;
+ BOOLEAN BootEmulated;
ULONG BuildIo;
ULONG StartIo;
return Emulated;
}
+BOOLEAN
+AdapterBootEmulated(
+ IN PXENVBD_ADAPTER Adapter
+ )
+{
+ return Adapter->BootEmulated;
+}
+
static FORCEINLINE VOID
__AdapterEnumerate(
IN PXENVBD_ADAPTER Adapter,
KeReleaseSpinLockFromDpcLevel(&Adapter->Lock);
}
+static FORCEINLINE VOID
+__AdapterSetBootEmulated(
+ IN PXENVBD_ADAPTER Adapter
+ )
+{
+ CHAR Key[] = "XEN:BOOT_EMULATED=";
+ PANSI_STRING Option;
+ PCHAR Value;
+ NTSTATUS status;
+
+ Adapter->BootEmulated = FALSE;
+
+ status = RegistryQuerySystemStartOption(Key, &Option);
+ if (!NT_SUCCESS(status))
+ return;
+
+ Value = Option->Buffer + sizeof (Key) - 1;
+
+ if (strcmp(Value, "TRUE") == 0)
+ Adapter->BootEmulated = TRUE;
+ else if (strcmp(Value, "FALSE") != 0)
+ Warning("UNRECOGNIZED VALUE OF %s: %s\n", Key, Value);
+
+ RegistryFreeSzValue(Option);
+}
+
__drv_requiresIRQL(PASSIVE_LEVEL)
static NTSTATUS
__AdapterQueryInterface(
if (!NT_SUCCESS(status))
goto fail10;
+ __AdapterSetBootEmulated(Adapter);
+
status = ThreadCreate(AdapterScanThread,
Adapter,
&Adapter->ScanThread);
Adapter->ScanThread = NULL;
fail11:
Error("fail11\n");
+ Adapter->BootEmulated = FALSE;
XENBUS_CACHE(Destroy,
&Adapter->CacheInterface,
Adapter->BounceCache);
TargetDestroy(Target);
}
+ Adapter->BootEmulated = FALSE;
+
XENBUS_CACHE(Destroy,
&Adapter->CacheInterface,
Adapter->BounceCache);