#Define TOKEN_ADJUST_PRIVILEGES 0x0020 #Define TOKEN_QUERY 0x0008 #Define SE_PRIVILEGE_ENABLED 2 #Define VER_PLATFORM_WIN32s 0 #Define VER_PLATFORM_WIN32_WINDOWS 1 #Define VER_PLATFORM_WIN32_NT 2 Procedure ExitWindowsFox Parameters ExitMode Local iRc iRc = 0 Declare ExitWindowsEx In Win32Api Integer, Integer liPlatform = GetPlatform() If liPlatform != VER_PLATFORM_WIN32_NT iRc = ExitWindowsEx(ExitMode, 0) If ExitMode = EWX_LOGOFF Or ExitMode = EWX_POWEROFF Quit Endif Else iRc = SetProcPrivilege() If iRc <> 0 iRc = ExitWindowsEx(ExitMode, 0) Endif Endif Procedure SetProcPrivilege Local iRc iRc = 0 Declare Integer GetCurrentProcessId In kernel32.Dll Declare Integer OpenProcess In Kernel32.Dll Integer, Integer, Integer Declare Integer OpenProcessToken In AdvApi32.Dll Integer, Integer, Integer@ Declare Integer LookupPrivilegeValue In AdvApi32.Dll String, String, Integer@ lsLuid Declare Integer AdjustTokenPrivileges In AdvApi32.Dll Integer,Integer, String@ lsNewState, Integer, Integer,Integer liAccessToken = 0 lsLuidBuffer = Space(8) lsName = Space(15) liBufferLen = 15 liLuid = 0 liProc = 0 liProc = GetCurrentProcessId() hProc = OpenProcess(2035711, 0, liProc) iRc = OpenProcessToken(hProc, Bitor(TOKEN_ADJUST_PRIVILEGES, TOKEN_QUERY), @liAccessToken) If iRc <> 0 If iRc <> 0 LookupPrivilegeValue("", "SeShutdownPrivilege", @liLuid) lsLuidBuffer = LongToStr(liLuid) + Chr(0) + Chr(0) + Chr(0) + Chr(0) lsNewState = Space(16) lsNewState = LongToStr(1) + lsLuidBuffer + LongToStr(SE_PRIVILEGE_ENABLED) iRc = AdjustTokenPrivileges(liAccessToken, 0, @lsNewState, Len(lsNewState), 0, 0) Return iRc Else Return iRc Endif Else Return iRc Endif Endproc Procedure GetPlatform Local liPlatform, iRc liPlatform = 0 iRc = 0 Declare Integer GetVersionEx In Win32Api String@ lsOSVersionInfo = LongToStr(148) + Space(144) iRc = GetVersionEx(@lsOSVersionInfo) liPlatform = StrToLong(Substr(lsOSVersionInfo, 17, 4)) Return liPlatform Endproc Function LongToStr Parameters lnLongval Private i, lcRetstr lcRetstr = "" For i = 24 To 0 Step -8 lcRetstr = Chr(Int(lnLongval/(2^i))) + lcRetstr lnLongval = Mod(lnLongval, (2^i)) Next Return lcRetstr Function StrToLong Parameters lcLongstr Private i, lnRetval lnRetval = 0 For i = 0 To 24 Step 8 lnRetval = lnRetval + (Asc(lcLongstr) * (2^i)) lcLongstr = Right(lcLongstr, Len(lcLongstr) - 1) Next Return lnRetval