最新消息

欢迎来到 AIMWARE中文网

立即加入我们以访问我们的所有功能。 注册并登录后,您将能够创建主题、发布对现有主题的回复、为您的其他成员提供声誉、获得您自己的私人信使等等。 快捷而且完全免费,你还在等什么?

最新帖子

教程 代码随笔-通过FFI获取硬件信息

An

超级管理员
管理成员
超级管理员
版主
注册
2022-07-07
消息
32
反馈评分
11
点数
8
积分
1,978
    Windows 10 Chrome 124.0.0.0
  • #1
获取CPU型号:
GetCPUModel:
-- 导入 FFI 库,并确保其可用,如果不可用则抛出错误信息
local ffi = assert(ffi, "请在 Lua 安全设置中启用 FFI")

-- 使用 FFI 定义一系列 C 数据类型和函数签名
ffi.cdef[[
typedef unsigned long DWORD;
typedef unsigned char BYTE;
typedef int BOOL;
typedef const char* LPCSTR;
typedef void* HKEY;
typedef HKEY* PHKEY;

DWORD RegOpenKeyExA(HKEY hKey, LPCSTR lpSubKey, DWORD ulOptions, DWORD samDesired, PHKEY phkResult);
DWORD RegQueryValueExA(HKEY hKey, LPCSTR lpValueName, DWORD* lpReserved, DWORD* lpType, BYTE* lpData, DWORD* lpcbData);
DWORD RegCloseKey(HKEY hKey);
]]

-- 将 HKEY_LOCAL_MACHINE 常量转换为 HKEY 类型
local HkeyLocalMachine = ffi.cast("HKEY", ffi.cast("intptr_t", 0x80000002))
-- 定义用于查询值的选项常量
local KeyQueryValue = 0x0001

-- 定义获取 CPU 型号的函数
local function GetCpuModelWindows()
    local RegKey = ffi.new("HKEY[1]")  -- 创建用于存储注册表键的数组
    local Result = ffi.C.RegOpenKeyExA(HkeyLocalMachine, "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", 0, KeyQueryValue, RegKey)  -- 打开注册表键
    if Result ~= 0 then  -- 如果打开失败
        return nil  -- 返回空值
    end

    local BufferSize = ffi.new("DWORD[1]", 256)  -- 创建用于存储数据大小的数组
    local Buffer = ffi.new("BYTE[256]")  -- 创建用于存储数据的数组

    Result = ffi.C.RegQueryValueExA(RegKey[0], "ProcessorNameString", nil, nil, Buffer, BufferSize)  -- 查询注册表值
    ffi.C.RegCloseKey(RegKey[0])  -- 关闭注册表键

    if Result ~= 0 then  -- 如果查询失败
        return nil  -- 返回空值
    end

    return ffi.string(Buffer, BufferSize[0] - 1)  -- 返回 CPU 型号字符串
end

-- 打印 CPU 型号
print("CPU:" .. GetCpuModelWindows())

CPU.png
 

An

超级管理员
管理成员
超级管理员
版主
注册
2022-07-07
消息
32
反馈评分
11
点数
8
积分
1,978
    Windows 10 Chrome 124.0.0.0
  • #2
获取GPU型号:

GetGPUModel:
-- 确保FFI库已加载,如果未加载,则抛出错误提示
local ffi = assert(ffi, "请在 Lua 安全设置中启用 FFI")

-- 定义C语言数据结构和函数签名
ffi.cdef[[
    typedef const char* LPCSTR;
    typedef int BOOL;
    typedef struct {
        int cb;
        char DeviceName[32];
        char DeviceString[128];
        int StateFlags;
    } DISPLAY_DEVICEA;
    BOOL EnumDisplayDevicesA(LPCSTR lpDevice, int iDevNum, DISPLAY_DEVICEA* lpDisplayDevice, int dwFlags);
]]

-- 枚举设备附加到桌面的标志
local DISPLAY_DEVICE_ATTACHED_TO_DESKTOP = 0x00000001

-- 获取显卡信息的函数
function getGraphicsCardInfo()
    -- 创建一个 DISPLAY_DEVICEA 类型的变量
    local displayDevice = ffi.new("DISPLAY_DEVICEA")
    displayDevice.cb = ffi.sizeof(displayDevice) -- 设置结构体大小
    local iDevNum = 0 -- 设备编号初始化为0

    -- 循环遍历显示设备,直到EnumDisplayDevicesA函数返回0
    while ffi.C.EnumDisplayDevicesA(nil, iDevNum, displayDevice, 0) ~= 0 do
        -- 如果设备附加到桌面,则打印设备字符串
        if bit.band(displayDevice.StateFlags, DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) ~= 0 then
            print("GPU:" .. ffi.string(displayDevice.DeviceString)) -- 输出GPU信息
        end
        iDevNum = iDevNum + 1 -- 递增设备编号
        displayDevice = ffi.new("DISPLAY_DEVICEA") -- 创建新的 DISPLAY_DEVICEA 变量
        displayDevice.cb = ffi.sizeof(displayDevice) -- 设置结构体大小
    end
end

-- 调用函数获取显卡信息
getGraphicsCardInfo()

GPU.png
 
顶部 底部