PDRIVER_OBJECT DriverObject;
HANDLE ParametersKey;
HANDLE AddressesKey;
+ HANDLE SettingsKey;
BOOLEAN NeedReboot;
} XENVIF_DRIVER, *PXENVIF_DRIVER;
return __DriverGetAddressesKey();
}
+static FORCEINLINE VOID
+__DriverSetSettingsKey(
+ IN HANDLE Key
+ )
+{
+ Driver.SettingsKey = Key;
+}
+
+static FORCEINLINE HANDLE
+__DriverGetSettingsKey(
+ VOID
+ )
+{
+ return Driver.SettingsKey;
+}
+
+HANDLE
+DriverGetSettingsKey(
+ VOID
+ )
+{
+ return __DriverGetSettingsKey();
+}
+
#define MAXNAMELEN 256
static FORCEINLINE VOID
IN PDRIVER_OBJECT DriverObject
)
{
+ HANDLE SettingsKey;
HANDLE AddressesKey;
HANDLE ParametersKey;
Driver.NeedReboot = FALSE;
+ SettingsKey = __DriverGetSettingsKey();
+ __DriverSetSettingsKey(NULL);
+
+ RegistryCloseKey(SettingsKey);
+
AddressesKey = __DriverGetAddressesKey();
__DriverSetAddressesKey(NULL);
HANDLE ServiceKey;
HANDLE ParametersKey;
HANDLE AddressesKey;
+ HANDLE SettingsKey;
ULONG Index;
NTSTATUS status;
__DriverSetAddressesKey(AddressesKey);
+ status = RegistryCreateSubKey(ServiceKey,
+ "Settings",
+ REG_OPTION_NON_VOLATILE,
+ &SettingsKey);
+ if (!NT_SUCCESS(status))
+ goto fail5;
+
+ __DriverSetSettingsKey(SettingsKey);
+
RegistryCloseKey(ServiceKey);
DriverObject->DriverExtension->AddDevice = AddDevice;
return STATUS_SUCCESS;
+fail5:
+ Error("fail5\n");
+
+ __DriverSetAddressesKey(NULL);
+
+ RegistryCloseKey(AddressesKey);
+
fail4:
Error("fail4\n");
VOID
);
+extern HANDLE
+DriverGetSettingsKey(
+ VOID
+ );
+
extern VOID
DriverRequestReboot(
VOID
PIO_STACK_LOCATION StackLocation;
HANDLE SoftwareKey;
HANDLE HardwareKey;
+ ULONG HasSettings;
GUID Guid;
NTSTATUS status;
for (Index = 0; Index < Table->NumEntries; Index++) {
PMIB_IF_ROW2 Row = &Table->Table[Index];
- if (!(Row->InterfaceAndOperStatusFlags.HardwareInterface) ||
- !(Row->InterfaceAndOperStatusFlags.ConnectorPresent))
- continue;
+ Trace("%s: CHECKING %ws (%ws)\n",
+ __PdoGetName(Pdo),
+ Row->Alias,
+ Row->Description);
- if (Row->OperStatus != IfOperStatusUp)
+ if (!Row->InterfaceAndOperStatusFlags.ConnectorPresent)
continue;
if (Row->PhysicalAddressLength != sizeof (ETHERNET_ADDRESS))
sizeof (ETHERNET_ADDRESS)) != 0)
continue;
- (VOID) SettingsSave(SoftwareKey,
+ if (Row->OperStatus != IfOperStatusUp)
+ continue;
+
+ (VOID) SettingsSave(__PdoGetName(Pdo),
Row->Alias,
Row->Description,
&Row->InterfaceGuid,
goto fail9;
}
- //
- // If there is a stack bound then restore any settings that
- // may have been saved from an aliasing emulated device.
- //
- status = PdoGetInterfaceGuid(Pdo, SoftwareKey, &Guid);
- if (NT_SUCCESS(status)) {
- for (Index = 0; Index < Table->NumEntries; Index++) {
- PMIB_IF_ROW2 Row = &Table->Table[Index];
-
- if (!IsEqualGUID(&Row->InterfaceGuid, &Guid))
- continue;
-
- (VOID) SettingsRestore(SoftwareKey,
- Row->Alias,
- Row->Description,
- &Row->InterfaceGuid,
- &Row->InterfaceLuid);
- break;
+ status = RegistryQueryDwordValue(SoftwareKey,
+ "HasSettings",
+ &HasSettings);
+ if (!NT_SUCCESS(status))
+ HasSettings = 0;
+
+ if (HasSettings == 0) {
+ //
+ // If there is a stack bound then restore any settings that
+ // may have been saved from an aliasing emulated device.
+ //
+ status = PdoGetInterfaceGuid(Pdo, SoftwareKey, &Guid);
+ if (NT_SUCCESS(status)) {
+ for (Index = 0; Index < Table->NumEntries; Index++) {
+ PMIB_IF_ROW2 Row = &Table->Table[Index];
+
+ if (!IsEqualGUID(&Row->InterfaceGuid, &Guid))
+ continue;
+
+ (VOID) SettingsRestore(__PdoGetName(Pdo),
+ Row->Alias,
+ Row->Description,
+ &Row->InterfaceGuid,
+ &Row->InterfaceLuid);
+ break;
+ }
+
+ HasSettings = 1;
+
+ (VOID) RegistryUpdateDwordValue(SoftwareKey,
+ "HasSettings",
+ HasSettings);
}
}
RegistryCloseKey(SaveKey);
- if (!Save)
- (VOID) RegistryDeleteSubKey(SettingsKey, SaveKeyName);
-
RegistryCloseKey(Key);
__SettingsFree(KeyName);
RegistryCloseKey(SaveKey);
- if (!Save)
- (VOID) RegistryDeleteSubKey(SettingsKey, (PCHAR)SaveKeyName);
-
__SettingsFree(ValuePrefix);
RegistryCloseKey(Key);
NTSTATUS
SettingsSave(
- IN HANDLE SoftwareKey,
- IN PWCHAR Alias,
- IN PWCHAR Description,
- IN LPGUID InterfaceGuid,
- IN PNET_LUID InterfaceLuid
- )
+ IN PCHAR SubKeyName,
+ IN PWCHAR Alias,
+ IN PWCHAR Description,
+ IN LPGUID InterfaceGuid,
+ IN PNET_LUID InterfaceLuid
+ )
{
HANDLE SettingsKey;
+ HANDLE SubKey;
NTSTATUS status;
Info("FROM %ws (%ws)\n", Alias, Description);
- status = RegistryCreateSubKey(SoftwareKey,
- "Settings",
+ SettingsKey = DriverGetSettingsKey();
+
+ status = RegistryCreateSubKey(SettingsKey,
+ SubKeyName,
REG_OPTION_NON_VOLATILE,
- &SettingsKey);
+ &SubKey);
if (!NT_SUCCESS(status))
goto fail1;
- SettingsCopy(SettingsKey, InterfaceGuid, InterfaceLuid, TRUE);
+ SettingsCopy(SubKey, InterfaceGuid, InterfaceLuid, TRUE);
- RegistryCloseKey(SettingsKey);
+ RegistryCloseKey(SubKey);
return STATUS_SUCCESS;
NTSTATUS
SettingsRestore(
- IN HANDLE SoftwareKey,
- IN PWCHAR Alias,
- IN PWCHAR Description,
- IN LPGUID InterfaceGuid,
- IN PNET_LUID InterfaceLuid
- )
+ IN PCHAR SubKeyName,
+ IN PWCHAR Alias,
+ IN PWCHAR Description,
+ IN LPGUID InterfaceGuid,
+ IN PNET_LUID InterfaceLuid
+ )
{
HANDLE SettingsKey;
+ HANDLE SubKey;
NTSTATUS status;
- status = RegistryOpenSubKey(SoftwareKey,
- "Settings",
- KEY_ALL_ACCESS,
- &SettingsKey);
+ SettingsKey = DriverGetSettingsKey();
+
+ status = RegistryOpenSubKey(SettingsKey,
+ SubKeyName,
+ KEY_READ,
+ &SubKey);
if (!NT_SUCCESS(status)) {
if (status == STATUS_OBJECT_NAME_NOT_FOUND)
goto done;
Info("TO %ws (%ws)\n", Alias, Description);
- SettingsCopy(SettingsKey, InterfaceGuid, InterfaceLuid, FALSE);
-
- RegistryCloseKey(SettingsKey);
+ SettingsCopy(SubKey, InterfaceGuid, InterfaceLuid, FALSE);
- (VOID) RegistryDeleteSubKey(SoftwareKey, "Settings");
+ RegistryCloseKey(SubKey);
done:
return STATUS_SUCCESS;
extern NTSTATUS
SettingsSave(
- IN HANDLE SoftwareKey,
- IN PWCHAR Alias,
- IN PWCHAR Description,
- IN LPGUID InterfaceGuid,
- IN PNET_LUID InterfaceLuid
- );
+ IN PCHAR SubKeyName,
+ IN PWCHAR Alias,
+ IN PWCHAR Description,
+ IN LPGUID InterfaceGuid,
+ IN PNET_LUID InterfaceLuid
+ );
extern NTSTATUS
SettingsRestore(
- IN HANDLE SoftwareKey,
- IN PWCHAR Alias,
- IN PWCHAR Description,
- IN LPGUID InterfaceGuid,
- IN PNET_LUID InterfaceLuid
- );
+ IN PCHAR SubKeyName,
+ IN PWCHAR Alias,
+ IN PWCHAR Description,
+ IN LPGUID InterfaceGuid,
+ IN PNET_LUID InterfaceLuid
+ );
#endif // _XENVIF_SETTINGS_H