VOID DriverUnload( IN PDRIVER_OBJECT DriverObject ) { HANDLE UnplugKey; HANDLE ParametersKey; ASSERT3P(DriverObject, ==, __DriverGetDriverObject()); Trace("====>\n"); if (*InitSafeBootMode > 0) goto done; UnplugKey = __DriverGetUnplugKey(); RegistryCloseKey(UnplugKey); __DriverSetUnplugKey(NULL); ParametersKey = __DriverGetParametersKey(); if (ParametersKey != NULL) { RegistryCloseKey(ParametersKey); __DriverSetParametersKey(NULL); } RegistryTeardown(); done: __DriverSetDriverObject(NULL); ASSERT(IsZeroMemory(&Driver, sizeof (XENFILT_DRIVER))); Trace("<====\n"); }
static NTSTATUS EmulatedCountClasses( IN PVOID Context, IN HANDLE Key, IN PCHAR Name ) { HANDLE ClassKey; NTSTATUS status; status = RegistryOpenSubKey(Key, Name, KEY_ALL_ACCESS, &ClassKey); if (!NT_SUCCESS(status)) goto fail1; status = RegistryEnumerateValues(ClassKey, EmulatedCountDevices, Context); if (!NT_SUCCESS(status)) goto fail2; RegistryCloseKey(ClassKey); return STATUS_SUCCESS; fail2: RegistryCloseKey(ClassKey); fail1: return status; }
VOID DriverUnload( IN PDRIVER_OBJECT DriverObject ) { HANDLE ServiceKey; HANDLE AliasesKey; HANDLE AddressesKey; HANDLE ParametersKey; ASSERT3P(DriverObject, ==, __DriverGetDriverObject()); Trace("====>\n"); if (*InitSafeBootMode > 0) goto done; AliasesKey = __DriverGetAliasesKey(); __DriverSetAliasesKey(NULL); RegistryCloseKey(AliasesKey); AddressesKey = __DriverGetParametersKey(); __DriverSetAddressesKey(NULL); RegistryCloseKey(AddressesKey); ParametersKey = __DriverGetParametersKey(); if (ParametersKey != NULL) { __DriverSetParametersKey(NULL); RegistryCloseKey(ParametersKey); } ServiceKey = __DriverGetServiceKey(); __DriverSetServiceKey(NULL); RegistryCloseKey(ServiceKey); RegistryTeardown(); done: __DriverSetDriverObject(NULL); ASSERT(IsZeroMemory(&Driver, sizeof (XENVIF_DRIVER))); Trace("<====\n"); }
static NTSTATUS EmulatedAddClasses( IN PVOID Context, IN HANDLE Key, IN PCHAR Name ) { PEMULATED_DEVICE Entry = *(PEMULATED_DEVICE *)Context; HANDLE ClassKey; NTSTATUS status; status = RtlStringCchPrintfA(Entry->Class, MAXIMUM_CLASS_NAME_LENGTH, "%s", Name); ASSERT(NT_SUCCESS(status)); status = RegistryOpenSubKey(Key, Name, KEY_ALL_ACCESS, &ClassKey); if (!NT_SUCCESS(status)) goto fail1; status = RegistryEnumerateValues(ClassKey, EmulatedAddDevices, &Entry); if (!NT_SUCCESS(status)) goto fail2; RegistryCloseKey(ClassKey); *(PEMULATED_DEVICE *)Context = Entry; return STATUS_SUCCESS; fail2: RegistryCloseKey(ClassKey); fail1: return status; }
VOID DriverUnload( IN PDRIVER_OBJECT DriverObject ) { HANDLE ParametersKey; ASSERT3P(DriverObject, ==, __DriverGetDriverObject()); Trace("====>\n"); if (*InitSafeBootMode > 0) goto done; ParametersKey = __DriverGetParametersKey(); if (ParametersKey != NULL) { RegistryCloseKey(ParametersKey); __DriverSetParametersKey(NULL); } ProcessTeardown(); ModuleTeardown(); HypercallTeardown(&Driver.HypercallInterface); LogTeardown(); RegistryTeardown(); done: __DriverSetDriverObject(NULL); ASSERT(IsZeroMemory(&Driver, sizeof (XEN_DRIVER))); Trace("<====\n"); }
NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) { HANDLE ServiceKey; HANDLE ParametersKey; HANDLE UnplugKey; ULONG Index; NTSTATUS status; ASSERT3P(__DriverGetDriverObject(), ==, NULL); ExInitializeDriverRuntime(DrvRtPoolNxOptIn); __DbgPrintEnable(); Trace("====>\n"); __DriverSetDriverObject(DriverObject); DriverObject->DriverUnload = DriverUnload; if (*InitSafeBootMode > 0) goto done; XenTouch(); Info("XENFILT %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_READ, &ServiceKey); if (!NT_SUCCESS(status)) goto fail2; status = RegistryOpenSubKey(ServiceKey, "Parameters", KEY_READ, &ParametersKey); if (NT_SUCCESS(status)) __DriverSetParametersKey(ParametersKey); status = RegistryOpenSubKey(ServiceKey, "Unplug", KEY_READ, &UnplugKey); if (!NT_SUCCESS(status)) goto fail3; __DriverSetUnplugKey(UnplugKey); RegistryCloseKey(ServiceKey); 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; fail3: Error("fail3\n"); if (ParametersKey != NULL) { RegistryCloseKey(ParametersKey); __DriverSetParametersKey(NULL); } fail2: Error("fail2\n"); RegistryTeardown(); fail1: Error("fail1 (%08x)\n", status); __DriverSetDriverObject(NULL); ASSERT(IsZeroMemory(&Driver, sizeof (XENFILT_DRIVER))); return status; }
NTSTATUS RegistryOpenHardwareKey( IN PDEVICE_OBJECT DeviceObject, IN ACCESS_MASK DesiredAccess, OUT PHANDLE Key ) { HANDLE SubKey; ULONG Length; PKEY_NAME_INFORMATION Info; PWCHAR Cursor; UNICODE_STRING Unicode; NTSTATUS status; status = IoOpenDeviceRegistryKey(DeviceObject, PLUGPLAY_REGKEY_DEVICE, KEY_READ, &SubKey); if (!NT_SUCCESS(status)) goto fail1; Length = 0; status = ZwQueryKey(SubKey, KeyNameInformation, NULL, 0, &Length); if (status != STATUS_BUFFER_OVERFLOW && status != STATUS_BUFFER_TOO_SMALL) goto fail2; #pragma prefast(suppress:6102) Info = __RegistryAllocate(Length + sizeof (WCHAR)); status = STATUS_NO_MEMORY; if (Info == NULL) goto fail3; status = ZwQueryKey(SubKey, KeyNameInformation, Info, Length, &Length); if (!NT_SUCCESS(status)) goto fail4; Info->Name[Info->NameLength / sizeof (WCHAR)] = '\0'; Cursor = wcsrchr(Info->Name, L'\\'); ASSERT(Cursor != NULL); *Cursor = L'\0'; RtlInitUnicodeString(&Unicode, Info->Name); status = RegistryOpenKey(NULL, &Unicode, DesiredAccess, Key); if (!NT_SUCCESS(status)) goto fail5; __RegistryFree(Info); RegistryCloseKey(SubKey); return STATUS_SUCCESS; fail5: fail4: __RegistryFree(Info); fail3: fail2: RegistryCloseKey(SubKey); fail1: return status; }
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 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; }
static FORCEINLINE VOID __UnplugNics( IN PXENFILT_UNPLUG_CONTEXT Context ) { HANDLE UnplugKey; PANSI_STRING ServiceNames; ULONG Index; HANDLE ServiceKey; KIRQL Irql; NTSTATUS status; UnplugKey = DriverGetUnplugKey(); ServiceKey = NULL; ServiceNames = NULL; status = RegistryQuerySzValue(UnplugKey, "NICS", &ServiceNames); if (!NT_SUCCESS(status)) goto done; for (Index = 0; ServiceNames[Index].Buffer != NULL; Index++) { PANSI_STRING ServiceName = &ServiceNames[Index]; CHAR ServiceKeyName[sizeof (SERVICES_KEY "\\XXXXXXXX")]; ULONG Count; status = RtlStringCbPrintfA(ServiceKeyName, sizeof (ServiceKeyName), SERVICES_KEY "\\%Z", ServiceName); ASSERT(NT_SUCCESS(status)); status = RegistryOpenSubKey(NULL, ServiceKeyName, KEY_READ, &ServiceKey); if (!NT_SUCCESS(status)) goto done; status = RegistryQueryDwordValue(ServiceKey, "Count", &Count); if (NT_SUCCESS(status)) { if (Count == 0) goto done; } RegistryCloseKey(ServiceKey); ServiceKey = NULL; } AcquireHighLock(&Context->Lock, &Irql); ASSERT(!Context->UnpluggedNics); __UnplugNicsLocked(); Context->UnpluggedNics = TRUE; ReleaseHighLock(&Context->Lock, Irql); done: if (ServiceKey != NULL) RegistryCloseKey(ServiceKey); if (ServiceNames != NULL) RegistryFreeSzValue(ServiceNames); }