moon-struct 0.1.1

Windows Kernel Struct offset
use wdk_sys::{ntddk::RtlGetVersion, NT_SUCCESS, RTL_OSVERSIONINFOW};

use crate::os_versions::{OSVersionInfo, VERSION_MAP};

extern crate alloc;

// 全局唯一的系统信息,首次访问时初始化
lazy_static! {
    pub static ref OS_INFO: &'static OSVersionInfo = {
        let mut os_version = RTL_OSVERSIONINFOW {
            dwOSVersionInfoSize: 0,
            dwMajorVersion: 0,
            dwMinorVersion: 0,
            dwBuildNumber: 0,
            dwPlatformId: 0,
            szCSDVersion: [0; 128],
        };

        let os_version_ptr: *mut RTL_OSVERSIONINFOW = &mut os_version;

        let status = unsafe { RtlGetVersion(os_version_ptr) };

        if !NT_SUCCESS(status) {
            return &VERSION_MAP[0];
        }

        for os_info in &VERSION_MAP {
            if os_info.major_version == os_version.dwMajorVersion
                && os_info.build_number == os_version.dwBuildNumber
            {
                return &os_info;
            }
        }

        &VERSION_MAP[0]
    };
}