potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

C++20&Win API ACPIテーブルIDを整数・文字列として列挙する

ACPIテーブルIDを整数・文字列として列挙する。

#include <format>
#include <iostream>
#include <vector>

#define STRICT
#define NOMINMAX
#include <Windows.h>

namespace SysInfoUtil
{
    std::vector<DWORD> EnumSystemACPITableIDs() noexcept
    {
        auto buffer_size = ::EnumSystemFirmwareTables('ACPI', nullptr, 0);
        if (buffer_size == 0)
            return {};
        std::vector<DWORD> buffer(buffer_size / sizeof(DWORD), 0);
        if (!::EnumSystemFirmwareTables('ACPI', buffer.data(), buffer_size))
            return {};
        return std::move(buffer);
    }
}

// 32ビット整数を4文字の文字列ビューとして扱います。
// 文字列ビューの寿命は与えられたポインタと一致します。
constexpr auto fourcc_ptr_to_sv(const unsigned long* pdw)
{
    return std::string_view(reinterpret_cast<const char*>(pdw), 4);
}

int main()
{
    std::cout.imbue(std::locale("Japanese", std::locale::ctype));

    for (auto id : SysInfoUtil::EnumSystemACPITableIDs())
    {
        std::cout << std::format("{}: {:d}", fourcc_ptr_to_sv(&id), id) << std::endl;
    }

    return 0;
}

補足

  • 'ACPI'は「多文字リテラル(multicharacter literal)」と呼ばれるそうです(cppreference 英語日本語)。非標準仕様ですが多くのコンパイラが対応しているそうです。