typedef struct _XENVIF_DRIVER {
PDRIVER_OBJECT DriverObject;
HANDLE ParametersKey;
+ HANDLE AddressesKey;
BOOLEAN NeedReboot;
} XENVIF_DRIVER, *PXENVIF_DRIVER;
return __DriverGetParametersKey();
}
+static FORCEINLINE VOID
+__DriverSetAddressesKey(
+ IN HANDLE Key
+ )
+{
+ Driver.AddressesKey = Key;
+}
+
+static FORCEINLINE HANDLE
+__DriverGetAddressesKey(
+ VOID
+ )
+{
+ return Driver.AddressesKey;
+}
+
+HANDLE
+DriverGetAddressesKey(
+ VOID
+ )
+{
+ return __DriverGetAddressesKey();
+}
+
#define MAXNAMELEN 128
static FORCEINLINE VOID
IN PDRIVER_OBJECT DriverObject
)
{
+ HANDLE AddressesKey;
HANDLE ParametersKey;
ASSERT3P(DriverObject, ==, __DriverGetDriverObject());
Driver.NeedReboot = FALSE;
+ AddressesKey = __DriverGetAddressesKey();
+ __DriverSetAddressesKey(NULL);
+
+ RegistryCloseKey(AddressesKey);
+
ParametersKey = __DriverGetParametersKey();
__DriverSetParametersKey(NULL);
{
HANDLE ServiceKey;
HANDLE ParametersKey;
+ HANDLE AddressesKey;
ULONG Index;
NTSTATUS status;
__DriverSetParametersKey(ParametersKey);
+ status = RegistryCreateSubKey(ServiceKey,
+ "Addresses",
+ REG_OPTION_VOLATILE,
+ &AddressesKey);
+ if (!NT_SUCCESS(status))
+ goto fail4;
+
+ __DriverSetAddressesKey(AddressesKey);
+
RegistryCloseKey(ServiceKey);
DriverObject->DriverExtension->AddDevice = AddDevice;
return STATUS_SUCCESS;
+fail4:
+ Error("fail4\n");
+
+ __DriverSetParametersKey(NULL);
+
+ RegistryCloseKey(ParametersKey);
+
fail3:
Error("fail3\n");
IN PCHAR Buffer
)
{
+ ANSI_STRING Ansi[2];
NTSTATUS status;
status = __PdoParseAddress(Buffer, &Pdo->PermanentAddress);
if (!NT_SUCCESS(status))
goto fail1;
- Info("%s: %s\n", __PdoGetName(Pdo), Buffer);
+ RtlZeroMemory(Ansi, sizeof (ANSI_STRING) * 2);
+ RtlInitAnsiString(&Ansi[0], Buffer);
+
+ status = RegistryUpdateSzValue(DriverGetAddressesKey(),
+ __PdoGetName(Pdo),
+ REG_SZ,
+ Ansi);
+ if (!NT_SUCCESS(status))
+ goto fail2;
+
+ Info("%s: %Z\n", __PdoGetName(Pdo), &Ansi[0]);
return STATUS_SUCCESS;
+fail2:
+ Error("fail2\n");
+
fail1:
Error("fail1 (%08x)\n", status);
return __PdoGetPermanentAddress(Pdo);
}
+static FORCEINLINE VOID
+__PdoClearPermanentAddress(
+ IN PXENVIF_PDO Pdo
+ )
+{
+ (VOID) RegistryDeleteValue(DriverGetAddressesKey(),
+ __PdoGetName(Pdo));
+
+ RtlZeroMemory(&Pdo->PermanentAddress, sizeof (ETHERNET_ADDRESS));
+}
+
static FORCEINLINE NTSTATUS
__PdoSetSoftwareKey(
IN PXENVIF_PDO Pdo
{
PANSI_STRING DriverDesc;
CHAR Buffer[MAXNAMELEN];
- ANSI_STRING FriendlyName[2];
+ ANSI_STRING Ansi[2];
NTSTATUS status;
status = RegistryQuerySzValue(__PdoGetSoftwareKey(Pdo),
if (!NT_SUCCESS(status))
goto fail2;
- RtlZeroMemory(FriendlyName, sizeof (ANSI_STRING) * 2);
- RtlInitAnsiString(&FriendlyName[0], Buffer);
+ RtlZeroMemory(Ansi, sizeof (ANSI_STRING) * 2);
+ RtlInitAnsiString(&Ansi[0], Buffer);
status = RegistryUpdateSzValue(__PdoGetHardwareKey(Pdo),
"FriendlyName",
REG_SZ,
- FriendlyName);
+ Ansi);
if (!NT_SUCCESS(status))
goto fail3;
- Info("%Z\n", &FriendlyName[0]);
+ Info("%s: %Z\n", __PdoGetName(Pdo), &Ansi[0]);
RegistryFreeSzValue(DriverDesc);
fail6:
Error("fail6\n");
- RtlZeroMemory(&Pdo->PermanentAddress, sizeof (ETHERNET_ADDRESS));
+ __PdoClearPermanentAddress(Pdo);
fail5:
Error("fail5\n");
RtlFreeUnicodeString(&Pdo->ContainerID);
RtlZeroMemory(&Pdo->ContainerID, sizeof (UNICODE_STRING));
- RtlZeroMemory(&Pdo->PermanentAddress, sizeof (ETHERNET_ADDRESS));
+ __PdoClearPermanentAddress(Pdo);
ThreadAlert(Pdo->DevicePowerThread);
ThreadJoin(Pdo->DevicePowerThread);