/*
 * Copyright (c) 2019-2021 The Khronos Group Inc.
 * Copyright (c) 2019-2021 Valve Corporation
 * Copyright (c) 2019-2021 LunarG, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * Author: Lenny Komow <lenny@lunarg.com>
 * Author: Charles Giessen <charles@lunarg.com>
 */

#pragma once

typedef struct LoaderEnumAdapters2 {
    ULONG adapter_count;
    struct {
        UINT handle;
        LUID luid;
        ULONG source_count;
        BOOL present_move_regions_preferred;
    } * adapters;
} LoaderEnumAdapters2;

typedef _Check_return_ NTSTATUS(APIENTRY *PFN_LoaderEnumAdapters2)(const LoaderEnumAdapters2 *);

typedef enum AdapterInfoType {
    LOADER_QUERY_TYPE_REGISTRY = 48,
} AdapterInfoType;

typedef struct LoaderQueryAdapterInfo {
    UINT handle;
    AdapterInfoType type;
    VOID *private_data;
    UINT private_data_size;
} LoaderQueryAdapterInfo;

typedef _Check_return_ NTSTATUS(APIENTRY *PFN_LoaderQueryAdapterInfo)(const LoaderQueryAdapterInfo *);

typedef enum LoaderQueryRegistryType {
    LOADER_QUERY_REGISTRY_ADAPTER_KEY = 1,
} LoaderQueryRegistryType;

typedef enum LoaderQueryRegistryStatus {
    LOADER_QUERY_REGISTRY_STATUS_SUCCESS = 0,
    LOADER_QUERY_REGISTRY_STATUS_BUFFER_OVERFLOW = 1,
} LoaderQueryRegistryStatus;

typedef struct LoaderQueryRegistryFlags {
    union {
        struct {
            UINT translate_path : 1;
            UINT mutable_value : 1;
            UINT reserved : 30;
        };
        UINT value;
    };
} LoaderQueryRegistryFlags;

typedef struct LoaderQueryRegistryInfo {
    LoaderQueryRegistryType query_type;
    LoaderQueryRegistryFlags query_flags;
    WCHAR value_name[MAX_PATH];
    ULONG value_type;
    ULONG physical_adapter_index;
    ULONG output_value_size;
    LoaderQueryRegistryStatus status;
    union {
        DWORD output_dword;
        UINT64 output_qword;
        WCHAR output_string[1];
        BYTE output_binary[1];
    };
} LoaderQueryRegistryInfo;
