ll_libload kernel, "kernel32.dll"
ll_getproc GetCurrentProcess, "GetCurrentProcess", kernel
ll_getproc GetVersionEx, "GetVersionExA", kernel
ll_libload user, "user32.dll"
ll_getproc ExitWindowsEx, "ExitWindowsEx", user
ll_libload advapi, "advapi32.dll"
ll_getproc AdjustTokenPrivileges, "AdjustTokenPrivileges", advapi
ll_getproc LookupPrivilegeValue, "LookupPrivilegeValueA", advapi
ll_getproc OpenProcessToken, "OpenProcessToken", advapi
#module
#deffunc getosver int
mref type, 0
mref stt, 64
mref rstr, 65
dim i, 37
i = 148
ll_getptr i : ll_ret prm
ll_callfunc prm, 1, GetVersionEx@
stt = i.4
if type = 0 : return
if i.4 = 2 : rstr = "NT " : else : rstr = ""
rstr += "" + i.1
if type > 1 : rstr += "." + i.2
if type > 2 : rstr += "." + i.3
if type > 3 {
rstr += " "
repeat 32, 5
strlen i.1, rstr
wpoke rstr, i.1 + 0, i.cnt & 0xFFFF
wpoke rstr, i.1 + 2, i.cnt >> 16
loop
}
return
#deffunc exitwin int, int
mref type, 0 : mref option, 1
types = 0x0000, 0x0001, 0x0002, 0x0008
options = 0x0000, 0x0004, 0x0010
flags = types.type + options.option
// NT系OSなら特権を有効化
getosver
if stat = 2 {
ll_callfnv GetCurrentProcess@ : ll_ret i
prm = i, 0x0028 // TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY
ll_getptr token : ll_ret prm.2
ll_callfunc prm, 3, OpenProcessToken@
prm = 0
ll_getptr s : s = "SeShutdownPrivilege" : ll_ret prm.1 // SE_SHUTDOWN_NAME
ll_getptr luid : ll_ret prm.2
ll_callfunc prm, 3, LookupPrivilegeValue@
prm = token, 0, 0, 0, 0, 0
tp = 1, luid, 0, 2 // Count, LUID_AND_ATTRIBUTES(LUID, Attribute), SE_PRIVILEGE_ENABLED
ll_getptr tp : ll_ret prm.2
ll_callfunc prm, 6, AdjustTokenPrivileges@
}
prm = flags, 0
return
#global
items = "ログオフ\n終了\n再起動"
objsize 100, 20
pos 10, 10 : combox menu, , items
pos 10, 40 : chkbox "強制実行", force
pos 10, 70 : button "実行する", *running
stop
*running
notesel items
noteget item, menu
dialog item + "してよろしいですか?", 2
if stat = 6 : exitwin menu, force
stop
|