Exemplos de API HWREQCHK
Observação
Algumas informações estão relacionadas a um produto de pré-lançamento que pode ser substancialmente modificado antes de ser lançado comercialmente. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Importante
O recurso descrito neste tópico está disponível em versões de pré-lançamento do Windows Insider Preview. A versão mais antiga em que esses recursos aparecem é Windows Insider Preview, versão 10.0.25289.
Esses exemplos para a API HWREQCHK demonstram como ela pode ser aproveitada para obter informações sobre um dispositivo de hardware e sua determinada elegibilidade de atualização do Windows para versões específicas de Windows 11 ou posteriores.
Exemplo da API GetHardwareRequirementSystemInfo
O exemplo a seguir demonstra como obter as informações do sistema de dispositivos chamando GetHardwareRequirementSystemInfo, que são as mesmas informações usadas pelo mecanismo de avaliação de requisitos de hardware do Windows. O contexto é que ele pode ser usado por uma ferramenta "Posso atualizar?" para relatar as informações do sistema de dispositivos que levaram em conta a true
resposta ou false
da função EvaluateHardwareRequirement .
#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;
}
Exemplo da API EvaluateHardwareRequirement
Este exemplo demonstra o uso de EvaluateHardwareRequirement. É a função que consulta as propriedades do sistema de hardware do dispositivo a serem avaliadas em relação aos requisitos de hardware definidos. O método de exemplo , EvaluateHardwareRequirementExample, aceita uma estrutura HWREQCHK_DEVICE_HARDWARE_REQUIREMENT que contém as informações sobre qual requisito de hardware avaliar. Os outros exemplos demonstrarão diferentes maneiras pelas quais os desenvolvedores podem preencher o conteúdo da estrutura para determinar qual requisito eles desejam avaliar.
#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;
}
Exemplo da API GetLatestHardwareRequirement
O exemplo a seguir demonstra o uso de GetLatestHardwareRequirement. É a função que consulta e retorna o requisito de hardware mais recente para um determinado valor de enumeração HWREQCHK_PRODUCT_TYPE. Se a chamada for bem-sucedida, ela passará o conteúdo da estrutura HWREQCHK_DEVICE_HARDWARE_REQUIREMENT para o exemplo EvaluateHardwareRequirement acima.
#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;
}
Exemplo da API GetHardwareRequirements
Este exemplo demonstra o uso de GetHardwareRequirements para obter toda a lista de requisitos de hardware definidos e que podem ser avaliados. O exemplo enumera cada um dos requisitos disponíveis até que um requisito específico seja encontrado correspondendo aos argumentos fornecidos ao método de exemplo.
#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;
}