JSA里的FFI(4)——获取主板信息

wils
wils

创作者俱乐部成员

昨天看到了文档,可能现在的FFI是泄漏的版本,测试版才有ffi对象,所以非常期待新版本

https://365.kdocs.cn/l/chPoECaMqzhw


论坛里总有朋友问JSA如何获取主板信息,说实话过去就算获取了也没法用来限制使用

不过现在有了ffi,好像弄个dll也不错。。。不过这都是题外话


期待新版本ffi对象的同时,先用FFI试试直接获取主板序列号等信息

function aa()
{
    const kernel32 = FFI.LoadLibrary('kernel32')
    const GetSystemFirmwareTable = kernel32.LoadFunction('', 'GetSystemFirmwareTable', '', 'uint32', ['uint32', 'uint32', 'pointer', 'uint32'])
    const need = GetSystemFirmwareTable.Call(0x52534D42, 0, null, 0)
    const buff = new ArrayBuffer(need)
    GetSystemFirmwareTable.Call(0x52534D42, 0, buff, need)
    const view = new Uint8Array(buff)
    let offset = 8
    while (true) {
        let typ = view[offset]
        if (typ === 0x7F) break
        let len = offset + view[offset + 1]
        if (typ === 2) {
            while (true) {
                let s = FFI.RefPointer(buff.slice(len)).DerefString()
                if (s === '') break
                console.log(s)
                len += s.length + 1
            }
            console.log()
            break
        }
        while (view[len] !== 0 || view[len + 1] !== 0) {
            len += 1
        }
        offset = len + 2
    }
}
  • 前面的套路都一样,加载kernel32,加载方法GetSystemFirmwareTable,然后调用

  • 第一次调用size设为0,会返回所需要的空间,第二次size设为所需要的大小

  • 然后用ArrayBuffer接受获取到的信息,用Uint8Array读取

  • 后面写的就有点别扭了,不知道怎么写会更好

  • 这种找数据的方法似乎有点麻烦,不知道直接Malloc分配空间是否更合适

  • 不确定是否可以用文档里说的结构体来读取数据,但信息是用\0\0分隔的,不知道怎么写结构体

  • 还有不确定读取字符串的写法是否正确


总之,这段代码能获取主板信息,但存在很多不确定是否有更好写法的地方

希望有更多朋友来尝试,讨论一下这种结构的数据该怎么读取更方便,谢谢😁

海南省
浏览 412
1
5
分享
5 +1
8
1 +1
全部评论 8
 
王子陶
王子陶

@金山办公

看起来是缺了个office6/data/js/ffi.js文件,被合并代码的同事改坏了,导致ffi对象不可用。如果比较急,可以加我qq:2451355023,我发给你文件。如果不急,可以等下一个版本,应该10.22会发布。
· 广东省
回复
wils
wils

创作者俱乐部成员

不急,等下一个版本 感谢wps越来越好用
· 海南省
回复
 
覃欢
覃欢

@金山办公

官网最新版应该支持了 可以试一试
· 广东省
1
回复
wils
wils

创作者俱乐部成员

非常感谢
· 海南省
回复