JSA里的FFI(4)——获取主板信息
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分隔的,不知道怎么写结构体
还有不确定读取字符串的写法是否正确
总之,这段代码能获取主板信息,但存在很多不确定是否有更好写法的地方
希望有更多朋友来尝试,讨论一下这种结构的数据该怎么读取更方便,谢谢😁
@金山办公
创作者俱乐部成员
@金山办公
创作者俱乐部成员