function System_Class() {
    this.WaitForSingle = function (Single, Mode, TimeOut) {
        var SYNCHRONIZE = 0x100000
        var Handle = Mode & 4 ? Single : Api.ECall("kernel32", "OpenProcess", SYNCHRONIZE, 0, Single)
        if (!Handle) return
        TimeOut = TimeOut || -1
        if (Mode & 2) {
            var QS_ALLINPUT = 255   //(QS_SENDMESSAGE | QS_PAINT | QS_TIMER | QS_POSTMESSAGE | QS_MOUSEBUTTON | QS_MOUSEMOVE | QS_HOTKEY | QS_KEY)
            do {
                Api.iDoEvents()
                Single = Api.ECall("user32", "MsgWaitForMultipleObjects", 1, Api.VarPtr(Handle) + 8, false, TimeOut, QS_ALLINPUT)
            } while (Single != 0 && Single != 258)
        } else {
            Single = Api.ECall("kernel32", "WaitForSingleObject", Handle, TimeOut)
        }
        if (Mode & 4 == 0) Api.ECall("kernel32", "CloseHandle", Handle)
        return Single
    }
    this.ShutDown = function (seconds) {
        Api.Shell("shutdown -f -s -t " + seconds)
    }
    this.ShutDownEx = function (Mode) {
        Mode = Mode || 0 //SHUTDOWN = 0 RESTART = 1 POWEROFF = 2
        var SE_SHUTDOWN_PRIVILEGE = 19
        var i = parseInt(0)
        Api.ECall("ntdll", "RtlAdjustPrivilege", SE_SHUTDOWN_PRIVILEGE, 1, 0, Api.VarPtr(i) + 8) //提权
        Api.ECall("ntdll", "NtShutdownSystem", Mode)
    }
    this.Version = function () {
        var Ver = Api.Malloc(147)
        Ver.SetVal(0, 4)=148
        Api.ECall("ntdll", "RtlGetVersion", Ver.GetPtr(0))
        return Ver.Read(4, 4) + "." + Ver.Read(8, 4) + "." + Ver.Read(12, 4)
    }
    this.VersionEx = function () {  //不受软件设置兼容影响
        var Ver = Api.Malloc(11)
        Api.ECall("ntdll", "RtlGetNtVersionNumbers", Ver.GetPtr(0), Ver.GetPtr(4), Ver.GetPtr(8))
        return Ver.Read(0, 4) + "." + Ver.Read(4, 4) + "." + (Ver.Read(8, 4) & 0xFFFF)
    }
    this.IsUserAnAdmin = function () {
        return Api.ECall("Shell32", "IsUserAnAdmin")
    }
    this.Is64Bit = function () {
        var Ver = Api.Malloc(3)
        Api.ECall("kernel32", "IsWow64Process", Api.ECall("kernel32", "GetCurrentProcess"), Ver.GetPtr(0))
        return Ver.Read(0, 4)
    }
    this.CPUID = function () {
        var Asm = Api.Malloc()
        Asm.AddEx(0, 85, 139, 236, 129, 236, 192, 0, 0, 0, 83, 86, 87, 141, 189, 64, 255, 255, 255, 185, 48, 0, 0, 0,
            184, 204, 204, 204, 204, 243, 171, 184, 0, 0, 0, 0, 51, 210, 15, 162, 137, 85, 252, 137, 69, 248, 184, 1, 0, 0, 0,
            51, 201, 51, 210, 15, 162, 137, 85, 244, 137, 69, 240, 139, 69, 252, 137, 69, 236, 139, 69, 248, 137, 69, 232, 139,
            69, 244, 137, 69, 228, 139, 69, 240, 137, 69, 224, 141, 69, 236, 95, 94, 91, 139, 229, 93, 195)
        var ptr = Api.ECall("user32.dll", "CallWindowProcA", Asm.GetPtr(0), 0, 0, 0, 0)
        var Mem = new Array()
        for (i = 0; i <= 12; i += 4) {
            Asm = Api.ReadMem(ptr + i)
            if (Asm < 0) Asm += 0x100000000
            Mem.push(Asm.toString(16))
        }
        return Mem.join(" ").toUpperCase()
    }
    this.DPI = function () {
        return Api.ECall("gdi32", "GetDeviceCaps", Api.ECall("user32", "GetDC", 0), 88)
    }
    this.Volume = function (Vol) {
        var WM_APPCOMMAND = 0x319
        var APPCOMMAND_VOLUME_UP = 10
        var APPCOMMAND_VOLUME_DOWN = 9
        var APPCOMMAND_VOLUME_MUTE = 8
        return Api.ECall("user32", "SendMessageA", Globals("Form").hwnd, WM_APPCOMMAND, Vol ? 0x30292 : 0x200EB0,
            0x10000 * (Vol > 0 ? APPCOMMAND_VOLUME_UP : Vol < 0 ? APPCOMMAND_VOLUME_DOWN : APPCOMMAND_VOLUME_MUTE))
    }
    this.Shell = function (PathName, WindowStyle, TimeOut) {
        var Shell = Api.Shell(PathName, WindowStyle % 0x10)
        WindowStyle = parseInt(WindowStyle / 0x10)
        if (WindowStyle) {
            return this.WaitForSingle(Shell, WindowStyle, TimeOut)
        }
    }
    this.SetProcessLive = function (Pid, Live, Mode) {
        if (Mode & 1) {
            var mPid = Api.Malloc(3)
            Api.ECall("user32", "GetWindowThreadProcessId", Pid, mPid.GetPtr(0))
            Pid = mPid.Read(0, 4)
        }
        var Handle = Api.ECall("kernel32", "OpenProcess", 512, 0, Pid)
        if (Handle) {
            Api.ECall("kernel32", "SetPriorityClass", Handle, [64, 16384, 32, 32768, 128, 256][Live])
            Api.ECall("kernel32", "CloseHandle", Handle)
        }
    }
}