HWREQCHK API の例

注意

一部の情報はプレリリース製品に関連しており、商用リリース前に大幅に変更される可能性があります。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。

重要

このトピックで説明する機能は、Windows Insider Previewのプレリリース バージョンで使用できます。 これらの機能が表示される最も古いバージョンは、Windows Insider Previewバージョン 10.0.25289 です。

HWREQCHK API のこれらの例は、ハードウェア デバイスに関する情報と、特定のバージョンの Windows 11 以降に対する Windows アップグレードの適格性を特定するためにどのように活用できるかを示しています。

GetHardwareRequirementSystemInfo API の例

次の例では、Windows ハードウェア要件評価エンジンで使用されるのと同じ情報である GetHardwareRequirementSystemInfo を呼び出してデバイス システム情報を取得する方法を示します。 コンテキストは、EvaluateHardwareRequirement 関数からの または false 応答に組み込trueまれたデバイス システム情報を報告するために、"アップグレードできますか?" ツールによって使用される可能性があります。

#include <windows.h>
#include <objbase.h>
#include <wil/resource.h>
#include <hwreqchkapi.h>
#define PRINT_TRUE_FALSE(cond) (cond ? L"TRUE" : L"FALSE")   

HRESULT
GetHardwareRequirementSystemInfoExample()
/*++
    Routine Description:
        Get the Hardware Requirements System Info that is used to evaluate against the requirements
    Example:
        Demonstrates GetHardwareRequirementSystemInfo API
    Arguments:
        N/A
    Return Value:
        HRESULT - S_OK or a FAILED HRESULT if unsuccessful getting the defined list of hardware requirements
--*/
{
    HWREQCHK_DEVICE_HARDWARE_SYSINFO sysinfo{};
    HRESULT result = GetHardwareRequirementSystemInfo(&sysinfo);
    if (SUCCEEDED(result))
    {
        wprintf(L"     SSE2 Processor Support: %ls\n", PRINT_TRUE_FALSE(sysinfo.SSE2ProcessorSupport));
        wprintf(L"       NX Processor Support: %ls\n", PRINT_TRUE_FALSE(sysinfo.NXProcessorSupport));
        wprintf(L"          PrefetchW Support: %ls\n", PRINT_TRUE_FALSE(sysinfo.PrefetchWSupport));
        wprintf(L" CompareExchange128 Support: %ls\n",
                                                PRINT_TRUE_FALSE(sysinfo.CompareExchange128Support));
        wprintf(L"           LahfSahf Support: %ls\n", PRINT_TRUE_FALSE(sysinfo.LahfSahfSupport));
        wprintf(L"             CPU Core Count: %lu\n", sysinfo.CpuCoreCount);
        wprintf(L"         SecureBoot Capable: %ls\n", PRINT_TRUE_FALSE(sysinfo.SecureBootCapable));
        wprintf(L"                TPM Version: %lu\n", sysinfo.TpmVersion   );
        wprintf(L"                    CPU Mhz: %lu\n", sysinfo.CpuMhz);
        wprintf(L"                      RamMB: %lu\n", sysinfo.RamMB);
        wprintf(L"           SystemDiskSizeMB: %lu\n", sysinfo.SystemDiskSizeMB);
        wprintf(L"               Architecture: %lu\n", sysinfo.Architecture);
        wprintf(L"                 CPU Vendor: %lu\n", sysinfo.CpuVendor      );
        wprintf(L"                 CPU Family: %lu\n", sysinfo.CpuFamily);
        wprintf(L"                  CPU Model: %lu\n", sysinfo.CpuModel);
        wprintf(L"               CPU Stepping: %lu\n", sysinfo.CpuStepping);
        wprintf(L"   ArmV81 Processor Support: %ls\n", PRINT_TRUE_FALSE(sysinfo.ArmV81ProcessorSupport));
        wprintf(L"                   Platform: %lu\n", sysinfo.Platform   );
        wprintf(L"                   IsServer: %ls\n", PRINT_TRUE_FALSE(sysinfo.IsServer  ));
        wprintf(L"              Lockdown Mode: %lu\n", sysinfo.LockdownMode);
        wprintf(L"                 Product OS: %lu\n", sysinfo.ProductOS  );
        wprintf(L"               Product Name: %ls\n", sysinfo.ProductName);
        wprintf(L"             Processor Name: %ls\n", sysinfo.ProcessorName);
    }
    else
    {
        wprintf(L"Failed calling GetHardwareRequirementSystemInfo. Error:0x%.8x\n", result);
    }
    return result;
}

EvaluateHardwareRequirement API の例

この例では、 EvaluateHardwareRequirement の使用方法を示します。 これは、定義されたハードウェア要件に照らして評価するために、デバイス ハードウェア システムのプロパティに対してクエリを実行する関数です。 EvaluateHardwareRequirementExample メソッドの例では、評価対象のハードウェア要件に関する情報を含むHWREQCHK_DEVICE_HARDWARE_REQUIREMENT構造体を受け入れます。 他の例では、開発者が構造体の内容を入力して、評価対象の要件を決定するさまざまな方法を示します。

#include <windows.h>
#include <objbase.h>
#include <wil/resource.h>
#include <hwreqchkapi.h>

HRESULT
EvaluateHardwareRequirementExample(
    _In_ const HWREQCHK_DEVICE_HARDWARE_REQUIREMENT& deviceHardwareRequirement)
/*++
    Routine Description:
        Evaluate the specific hardware requirement using the information supplied in the HWREQCHK_DEVICE_HARDWARE_REQUIREMENT structure
    Example:
        Demonstrates EvaluateHardwareRequirement API
    Arguments:
        deviceHardwareRequirement - Specifies the specific device hardware requirement structure that is used to invoke the EvaluateHardwareRequirement API
    Return Value:
        HRESULT - S_OK or a Failed HRESULT if unsuccessful invoking the EvaluateHardwareRequirement API
--*/
{
    //
    // Automatically free HWREQCHK_DEVICE_HARDWARE_EVALUATION (via CoTaskMemFree) 
    // objects when it goes out of scope. See WIL (https://github.com/Microsoft/wil/wiki).
    //
    wil::unique_cotaskmem_array_ptr<HWREQCHK_DEVICE_HARDWARE_EVALUATION>
                                            deviceHardwareRequirementEvaluations;
    BOOL evaluationResult = FALSE;
    static const std::map<const std::wstring, const std::wstring> constraintRuleMapping =
    {
        { L"SSE2ProcessorSupport", L"Processor must support the SSE2 instruction set"} ,
        { L"NXProcessorSupport", L"Processor must support data execution prevention" },
        { L"CompareExchange128", L"Processor must support the CMPXCHG16B instruction also referred to as CompareExchange128" },
        { L"LahfSahfSupport", L"Processor must support the LAHF and SAHF instructions" },
        { L"PrefetchWSupport", L"Processor must support the PrefetchW instructions" },
        { L"CpuCores", L"The minimum number of CPU cores that must exist on the device" },
        { L"CpuFms", L"TPM must be version 2.0 exactly(no higher, no lower)" },
        { L"Tpm", L"TPM must be version 2.0 exactly" },
        { L"UefiSecureBoot", L"Secure boot must be supported on the device"},
        { L"Memory", L"The minimum amount of memory in MB that must exist on the device" },
        { L"IotMemory", L"The minimum amount of memory in MB that must exist on the device" },
        { L"ServerMemory", L"The minimum amount of memory in MB that must exist on the device" },
        { L"SystemDriveSize", L"The minimum amout of total system disk size" },
        { L"IotSystemDriveSize", L"The minimum amout of total system disk size" },
        { L"CpuFms", L"The CPU must be a supported Family, Model and Stepping (FMS) processor signature" },
        { L"BlockedByHomeSkuSModeStateSV", L"SMode must be disabled unless the OS SKU is a 'Home'SKU" }
    };

    HRESULT result = EvaluateHardwareRequirement(
        &deviceHardwareRequirement,
        &evaluationResult,
        &deviceHardwareRequirementEvaluations,
        deviceHardwareRequirementEvaluations.size_address<ULONG>());
    if (FAILED(result))
    {
        wprintf(L"The requirement failed the EvaluateHardwareRequirement API. Error:0x%.8x\n", result);
    }
    else
    {
        //
        // On Success, the 'evaluationResult' variable will either be TRUE (evaluation succeeded)
        // or it will be FALSE (evaluation failed).
        //
        if (evaluationResult != FALSE)
        {
            wprintf(L"The hardware requirement evaluation succeeded. The device does meet the hardware requirements\n");        
        }
        else
        {
            wprintf(L"The hardware requirement evaluation did not pass. The device does not meet the hardware requirements.\n");
        }

        // Loop through each constraint evaluation performed
        for (const auto& deviceHardwareRequirementEvaluation : deviceHardwareRequirementEvaluations)
        {    
            auto findConstraint = constraintRuleMapping.find(deviceHardwareRequirementEvaluation.RuleName);
            std::wstring constraintDescription = L"Constraint Not Found";
            if (findConstraint != constraintRuleMapping.end())
            {
                constraintDescription = findConstraint->second;
            }

            // Display the Rules that were evaluated as part of the requirements.
            // NOTE: RuleName is a non-localized value coming from the internally defined JSON contents.
            wprintf(L"\tConstraint Name: %-64ls Succeeded: %-8ls\n\t\tDescription: %ls\n",
                deviceHardwareRequirementEvaluation.RuleName,
                deviceHardwareRequirementEvaluation.Succeeded ? L"TRUE" : L"FALSE",
                constraintDescription.c_str());
        }

    if (evaluationResult == FALSE)
        {
            // The device failed to meet the hardware requirements, dump the system
            // info by calling the other example GetHardwareRequirementSystemInfoExample,
            // which calls the API GetHardwareRequirementSystemInfo and dumps the contents.
            GetHardwareRequirementSystemInfoExample();
        }
    }
    return result;
}

GetLatestHardwareRequirement API の例

次の例は、 GetLatestHardwareRequirement の使用を示しています。 これは、特定の HWREQCHK_PRODUCT_TYPE 列挙値に対する最新のハードウェア要件を照会して返す関数です。 呼び出しが成功すると、 HWREQCHK_DEVICE_HARDWARE_REQUIREMENT 構造体の内容が上記の EvaluateHardwareRequirement の例に渡されます。

#include <windows.h>
#include <objbase.h>
#include <wil/resource.h>
#include <hwreqchkapi.h>

HRESULT
GetLatestHardwareRequirementExample(
    _In_ HWREQCHK_PRODUCT_TYPE productType)
/*++
    Routine Description:
        Get the latest hardware requirement defined and then use 
        the information supplied in the HWREQCHK_DEVICE_HARDWARE_REQUIREMENT
        to evaluate hardware requirements against it.
    Example:
        Demonstrates the use of the GetLatestHardwareRequirement API. If successful, the
        EvaluateHardwareRequirementExample method is invoked to ‘evaluate’
        the latest hardware requirement.
    Arguments:
        productType - A valid HWREQCHK_PRODUCT_TYPE enumeration value to get the latest hardware requirement
    Return Value:
        HRESULT - S_OK or a FAILED HRESULT if unsuccessful getting the defined list of hardware requirements
--*/
{
    HWREQCHK_DEVICE_HARDWARE_REQUIREMENT deviceHardwareRequirement {};

    // Get the currently defined latest hardware requirement for the product type value
    // specified in the productEnum variable.
    HRESULT result = GetLatestHardwareRequirement(productType, &deviceHardwareRequirement);
    if (FAILED(result))
    {
        wprintf(L"The call to GetLatestHardwareRequirement failed. Error:0x%.8x\n", result);
    }
    else
    {
        // 
        // Use the default hardware requirement returned from the GetLatestHardwareRequirement API
        // to verify the hardware device requirements for the latest defined OS
        // by calling the EvaluateHardwareRequirementExample method.
        //
        result = EvaluateHardwareRequirementExample(deviceHardwareRequirement);
    }

    return result;
}

GetHardwareRequirements API の例

この例では、 GetHardwareRequirements を使用して、定義され、評価できるハードウェア要件の一覧全体を取得する方法を示します。 この例では、メソッドの例に指定された引数と一致する特定の要件が見つかるまで、使用可能な各要件を列挙します。

#include <windows.h>
#include <objbase.h>
#include <wil/resource.h>
#include <hwreqchkapi.h>

HRESULT
GetHardwareRequirementsExample(
    _In_ HWREQCHK_TARGET_RELEASE targetRelease,
    _In_ HWREQCHK_PRODUCT_TYPE productType)
/*++
    Routine Description:
        Gets all of the defined hardware requirements and evaluates one or more of the requirements
    Example:
        Demonstrates the use of the GetHardwareRequirements API. If successful and a
        match is found for the supplied requirement & product enum arguments, then the  
        EvaluateHardwareRequirementExample method is invoked to ‘evaluate’
        the hardware requirement.
    Arguments:
        targetRelease  - A valid HWREQCHK_TARGET_RELEASE enumeration value 
                         used to filter the list of returned requirement(s)
        productType    – A valid HWREQCHK_PRODUCT_TYPE enumeration value 
                         used to filter the list of returned requirement(s)
    Return Value:
        HRESULT        - S_OK or a FAILED HRESULT if unsuccessful getting the 
                         defined list of hardware requirements
--*/
{
    const HRESULT errNotFound = HRESULT_FROM_WIN32(ERROR_NOT_FOUND);

    //
    // Automatically free HWREQCHK_DEVICE_HARDWARE_REQUIREMENT (via CoTaskMemFree) 
    // objects when it goes out of scope. See WIL (https://github.com/Microsoft/wil/wiki).
    //
    wil::unique_cotaskmem_array_ptr<HWREQCHK_DEVICE_HARDWARE_REQUIREMENT> deviceHardwareRequirements;

    // Get the currently defined hardware requirements
    HRESULT result = GetHardwareRequirements(
                             &deviceHardwareRequirements, 
                             deviceHardwareRequirements.size_address<ULONG>());
    if (FAILED(result))
    {
        wprintf(L"The call to GetHardwareRequirements failed. Error:0x%.8x\n", result);
    }
    else
    {
        for (const auto& deviceHardwareRequirement : deviceHardwareRequirements)
        {
            result = errNotFound;

            // Look for a requirement matching the TargetRelease and ProductType enumeration values
            if (deviceHardwareRequirement.TargetRelease == targetRelease &&
                deviceHardwareRequirement.ProductType == productType)
            {
                // We found a match. Now evaluate the requirement by
                // calling the EvaluateHardwareRequirementExample method
                result = EvaluateHardwareRequirementExample(deviceHardwareRequirement);
                if (FAILED(result))
                {
                    wprintf(L"Error invoking the example method EvaluateHardwareRequirementExample\n");
                }
                break  ;
            }
        }
    }

    if (result == errNotFound  )
    {
        wprintf(L"Unable to locate a matching target-release '%d' and product-type '%d'\n",    
                targetRelease, producttype);
    }

    return result;
}

HWREQCHK API の概要

HWREQCHK API 関数

Windows 実装ライブラリ (WIL) Wiki