static FORCEINLINE NTSTATUS __EmulatedGetDeviceTable( IN PXENFILT_EMULATED_CONTEXT Context ) { HANDLE ServiceKey; HANDLE AliasesKey; ULONG Count; PEMULATED_DEVICE Table; PEMULATED_DEVICE Entry; ULONG Index; NTSTATUS status; status = RegistryOpenServiceKey(KEY_ALL_ACCESS, &ServiceKey); if (!NT_SUCCESS(status)) goto fail1; status = RegistryOpenSubKey(ServiceKey, "Aliases", KEY_ALL_ACCESS, &AliasesKey); if (!NT_SUCCESS(status)) goto fail2; Count = 0; status = RegistryEnumerateSubKeys(AliasesKey, EmulatedCountClasses, &Count); if (!NT_SUCCESS(status)) goto fail3; Table = NULL; if (Count == 0) goto done; Table = __EmulatedAllocate(sizeof (EMULATED_DEVICE) * (Count + 1)); status = STATUS_NO_MEMORY; if (Table == NULL) goto fail4; Entry = Table; status = RegistryEnumerateSubKeys(AliasesKey, EmulatedAddClasses, &Entry); if (!NT_SUCCESS(status)) goto fail5; ASSERT3U((ULONG)(Entry - Table), ==, Count); RtlZeroMemory(Entry, sizeof (EMULATED_DEVICE)); for (Index = 0; strlen(Table[Index].Alias) != 0; Index++) { Entry = &Table[Index]; Info("[%u]: %s %s -> %s\n", Index, Entry->Class, Entry->Device, Entry->Alias); } done: Context->Table = Table; RegistryCloseKey(AliasesKey); RegistryCloseKey(ServiceKey); return STATUS_SUCCESS; fail5: Error("fail5\n"); __EmulatedFree(Table); fail4: Error("fail4\n"); fail3: Error("fail3\n"); RegistryCloseKey(AliasesKey); fail2: Error("fail2\n"); RegistryCloseKey(ServiceKey); fail1: Error("fail1 (%08x)\n", status); return status; }
NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) { HANDLE ServiceKey; HANDLE ParametersKey; HANDLE AddressesKey; HANDLE AliasesKey; ULONG Index; NTSTATUS status; ASSERT3P(__DriverGetDriverObject(), ==, NULL); ExInitializeDriverRuntime(DrvRtPoolNxOptIn); __DbgPrintEnable(); Trace("====>\n"); __DriverSetDriverObject(DriverObject); if (*InitSafeBootMode > 0) goto done; Driver.DriverObject->DriverUnload = DriverUnload; Info("XENVIF %d.%d.%d (%d) (%02d.%02d.%04d)\n", MAJOR_VERSION, MINOR_VERSION, MICRO_VERSION, BUILD_NUMBER, DAY, MONTH, YEAR); status = RegistryInitialize(RegistryPath); if (!NT_SUCCESS(status)) goto fail1; status = RegistryOpenServiceKey(KEY_ALL_ACCESS, &ServiceKey); if (!NT_SUCCESS(status)) goto fail2; __DriverSetServiceKey(ServiceKey); (VOID) RegistryDeleteValue(ServiceKey, "NeedReboot"); status = RegistryOpenSubKey(ServiceKey, "Parameters", KEY_READ, &ParametersKey); if (NT_SUCCESS(status)) __DriverSetParametersKey(ParametersKey); status = RegistryCreateSubKey(ServiceKey, "Addresses", REG_OPTION_VOLATILE, &AddressesKey); if (!NT_SUCCESS(status)) goto fail3; __DriverSetAddressesKey(AddressesKey); status = RegistryOpenSubKey(ServiceKey, "Aliases", KEY_READ, &AliasesKey); if (!NT_SUCCESS(status)) goto fail4; __DriverSetAliasesKey(AliasesKey); DriverObject->DriverExtension->AddDevice = AddDevice; for (Index = 0; Index <= IRP_MJ_MAXIMUM_FUNCTION; Index++) { #pragma prefast(suppress:28169) // No __drv_dispatchType annotation #pragma prefast(suppress:28168) // No matching __drv_dispatchType annotation for IRP_MJ_CREATE DriverObject->MajorFunction[Index] = Dispatch; } done: Trace("<====\n"); return STATUS_SUCCESS; fail4: Error("fail4\n"); __DriverSetAddressesKey(NULL); RegistryCloseKey(AddressesKey); fail3: Error("fail3\n"); __DriverSetParametersKey(NULL); __DriverSetServiceKey(NULL); RegistryCloseKey(ServiceKey); fail2: Error("fail2\n"); RegistryTeardown(); fail1: Error("fail1 (%08x)\n", status); __DriverSetDriverObject(NULL); ASSERT(IsZeroMemory(&Driver, sizeof (XENVIF_DRIVER))); return status; }
NTSTATUS EmulatedUpdate( IN PXENFILT_EMULATED_INTERFACE Interface, IN PCHAR Alias ) { PXENFILT_EMULATED_CONTEXT Context = Interface->Context; PEMULATED_DEVICE Entry; HANDLE ServiceKey; HANDLE StatusKey; LONG Count; LONG Index; PANSI_STRING Old; PANSI_STRING New; ULONG Length; NTSTATUS status; if (Context->Table == NULL) goto done; for (Entry = Context->Table; strlen(Entry->Alias) != 0; Entry++) { if (strcmp(Entry->Alias, Alias) == 0) break; } if (strlen(Entry->Alias) == 0) goto done; Info("%s %s\n", Entry->Class, Entry->Device); Entry->Present = TRUE; status = RegistryOpenServiceKey(KEY_ALL_ACCESS, &ServiceKey); if (!NT_SUCCESS(status)) goto fail1; status = RegistryOpenSubKey(ServiceKey, "Status", KEY_ALL_ACCESS, &StatusKey); if (!NT_SUCCESS(status)) goto fail2; status = RegistryQuerySzValue(StatusKey, Entry->Class, &Old); if (!NT_SUCCESS(status)) Old = NULL; Count = 0; for (Index = 0; Old != NULL && Old[Index].Buffer != NULL; Index++) Count++; New = __EmulatedAllocate(sizeof (ANSI_STRING) * (Count + 2)); status = STATUS_NO_MEMORY; if (New == NULL) goto fail3; for (Index = 0; Index < Count; Index++) { Length = Old[Index].Length; New[Index].MaximumLength = (USHORT)Length + sizeof (CHAR); New[Index].Buffer = __EmulatedAllocate(New[Index].MaximumLength); status = STATUS_NO_MEMORY; if (New[Index].Buffer == NULL) goto fail4; RtlCopyMemory(New[Index].Buffer, Old[Index].Buffer, Length); New[Index].Length = (USHORT)Length; } Length = (ULONG)strlen(Entry->Device); New[Count].MaximumLength = (USHORT)Length + sizeof (CHAR); New[Count].Buffer = __EmulatedAllocate(New[Count].MaximumLength); status = STATUS_NO_MEMORY; if (New[Count].Buffer == NULL) goto fail5; RtlCopyMemory(New[Count].Buffer, Entry->Device, Length); New[Count].Length = (USHORT)Length; status = RegistryUpdateSzValue(StatusKey, Entry->Class, REG_MULTI_SZ, New); if (!NT_SUCCESS(status)) goto fail6; RegistryFreeSzValue(Old); for (Index = 0; Index < Count + 1; Index++) __EmulatedFree(New[Index].Buffer); __EmulatedFree(New); RegistryCloseKey(StatusKey); RegistryCloseKey(ServiceKey); done: return STATUS_SUCCESS; fail6: Error("fail6\n"); __EmulatedFree(New[Count].Buffer); fail5: Error("fail5\n"); Index = Count; fail4: Error("fail4\n"); while (--Index >= 0) __EmulatedFree(New[Index].Buffer); __EmulatedFree(New); fail3: Error("fail3\n"); RegistryFreeSzValue(Old); RegistryCloseKey(StatusKey); fail2: Error("fail2\n"); RegistryCloseKey(ServiceKey); fail1: Error("fail1 (%08x)\n", status); return status; }
NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) { HANDLE ServiceKey; HANDLE ParametersKey; ULONG Index; NTSTATUS status; ASSERT3P(__DriverGetDriverObject(), ==, NULL); ExInitializeDriverRuntime(DrvRtPoolNxOptIn); __EnableDbgPrint(); Trace("====>\n"); __DriverSetDriverObject(DriverObject); if (*InitSafeBootMode > 0) goto done; status = LogInitialize(); if (!NT_SUCCESS(status)) goto fail1; Info("%s (%s)\n", MAJOR_VERSION_STR "." MINOR_VERSION_STR "." MICRO_VERSION_STR "." BUILD_NUMBER_STR, DAY_STR "/" MONTH_STR "/" YEAR_STR); SystemGetInformation(); status = HypercallInitialize(&Driver.HypercallInterface); if (!NT_SUCCESS(status)) goto fail2; status = ModuleInitialize(); if (!NT_SUCCESS(status)) goto fail3; status = ProcessInitialize(); if (!NT_SUCCESS(status)) goto fail4; status = RegistryInitialize(RegistryPath); if (!NT_SUCCESS(status)) goto fail5; status = RegistryOpenServiceKey(KEY_READ, &ServiceKey); if (!NT_SUCCESS(status)) goto fail6; status = RegistryOpenSubKey(ServiceKey, "Parameters", KEY_READ, &ParametersKey); if (NT_SUCCESS(status)) __DriverSetParametersKey(ParametersKey); RegistryCloseKey(ServiceKey); Driver.DriverObject->DriverUnload = DriverUnload; Driver.DriverObject->DriverExtension->AddDevice = AddDevice; for (Index = 0; Index <= IRP_MJ_MAXIMUM_FUNCTION; Index++) { #pragma prefast(suppress:28169) // No __drv_dispatchType annotation #pragma prefast(suppress:28168) // No matching __drv_dispatchType annotation for IRP_MJ_CREATE Driver.DriverObject->MajorFunction[Index] = Dispatch; } done: Trace("<====\n"); return STATUS_SUCCESS; fail6: Error("fail6\n"); RegistryTeardown(); fail5: Error("fail5\n"); ProcessTeardown(); fail4: Error("fail4\n"); ModuleTeardown(); fail3: Error("fail3\n"); HypercallTeardown(&Driver.HypercallInterface); fail2: Error("fail2\n"); LogTeardown(); fail1: Error("fail1 (%08x)\n", status); __DriverSetDriverObject(NULL); ASSERT(IsZeroMemory(&Driver, sizeof (XEN_DRIVER))); return status; }