Exemple #1
0
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;
}
Exemple #2
0
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;
}
Exemple #3
0
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;
}
Exemple #4
0
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;
}
Exemple #5
0
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;    
}
Exemple #6
0
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;
}
Exemple #7
0
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);
}