http://www.runan.net/program/tips/sdk_13_ExitWindowsEx.shtml
を移植してみました。
いろいろ試してみてください。
#uselib "kernel32.dll"
#cfunc GetCurrentProcess "GetCurrentProcess"
#uselib "user32.dll"
#func ExitWindowsEx "ExitWindowsEx" int, int
#uselib "advapi32.dll"
#func OpenProcessToken "OpenProcessToken" int, int, var
#func LookupPrivilegeValue "LookupPrivilegeValueA" sptr, sptr, var
#func AdjustTokenPrivileges "AdjustTokenPrivileges" int, int, var, int, int, int
#const EWX_LOGOFF 0 ; ログオフ
#const EWX_SHUTDOWN 1 ; シャットダウン
#const EWX_REBOOT 2 ; リブート
#const EWX_FORCE 4 ; 強制
#const EWX_POWEROFF 8 ; 電源を切る
#const TOKEN_QUERY 0x08
#const TOKEN_ADJUST_PRIVILEGES 0x20
#define SE_SHUTDOWN_NAME "SeShutdownPrivilege"
#const SE_PRIVILEGE_ENABLED 0x02
gosub *SetPrivileges ; 権限を指定
ExitWindowsEx EWX_REBOOT, 0 ; Windows を終了
end
*SetPrivileges
dim Luid, 2
dim tokenNew, 16
dim tokenPre, 16
hProcess = GetCurrentProcess()
OpenProcessToken hProcess, TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, hToken
LookupPrivilegeValue 0, SE_SHUTDOWN_NAME, Luid
tokenNew(0) = 1
memcpy tokenNew(1), Luid, 8
tokenNew(3) = SE_PRIVILEGE_ENABLED
AdjustTokenPrivileges hToken, 0, tokenNew, 16, varptr(tokenPre), varptr(ret)
return