#include "rar.hpp"
static int SleepTime= …;
void InitSystemOptions(int SleepTime)
{ … }
#if !defined(SFX_MODULE)
void SetPriority(int Priority)
{ … }
#endif
clock_t MonoClock()
{ … }
void Wait()
{ … }
#if defined(_WIN_ALL) && !defined(SFX_MODULE)
void Shutdown(POWER_MODE Mode)
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
if (OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))
{
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,FALSE,&tkp,0,(PTOKEN_PRIVILEGES)NULL,0);
}
if (Mode==POWERMODE_OFF)
ExitWindowsEx(EWX_SHUTDOWN|EWX_FORCE,SHTDN_REASON_FLAG_PLANNED);
if (Mode==POWERMODE_SLEEP)
SetSuspendState(FALSE,FALSE,FALSE);
if (Mode==POWERMODE_HIBERNATE)
SetSuspendState(TRUE,FALSE,FALSE);
if (Mode==POWERMODE_RESTART)
ExitWindowsEx(EWX_REBOOT|EWX_FORCE,SHTDN_REASON_FLAG_PLANNED);
}
bool ShutdownCheckAnother(bool Open)
{
const wchar *EventName=L"rar -ioff";
static HANDLE hEvent=NULL;
bool Result=false;
if (Open)
hEvent=CreateEvent(NULL,FALSE,FALSE,EventName);
else
{
if (hEvent!=NULL)
CloseHandle(hEvent);
hEvent=CreateEvent(NULL,FALSE,FALSE,EventName);
Result=GetLastError()==ERROR_ALREADY_EXISTS;
if (hEvent!=NULL)
CloseHandle(hEvent);
}
return Result;
}
#endif
#if defined(_WIN_ALL)
HMODULE WINAPI LoadSysLibrary(const wchar *Name)
{
std::vector<wchar> SysDir(MAX_PATH);
if (GetSystemDirectory(SysDir.data(),(UINT)SysDir.size())==0)
return nullptr;
std::wstring FullName;
MakeName(SysDir.data(),Name,FullName);
return LoadLibrary(FullName.c_str());
}
bool IsUserAdmin()
{
SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
PSID AdministratorsGroup;
BOOL b = AllocateAndInitializeSid(&NtAuthority,2,SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &AdministratorsGroup);
if (b)
{
if (!CheckTokenMembership( NULL, AdministratorsGroup, &b))
b = FALSE;
FreeSid(AdministratorsGroup);
}
return b!=FALSE;
}
#endif
#ifdef USE_SSE
SSE_VERSION _SSE_Version=GetSSEVersion();
SSE_VERSION GetSSEVersion()
{
#ifdef _MSC_VER
int CPUInfo[4];
__cpuid(CPUInfo, 0);
uint MaxSupported=CPUInfo[0];
if (MaxSupported>=7)
{
__cpuid(CPUInfo, 7);
if ((CPUInfo[1] & 0x20)!=0)
return SSE_AVX2;
}
if (MaxSupported>=1)
{
__cpuid(CPUInfo, 1);
if ((CPUInfo[2] & 0x80000)!=0)
return SSE_SSE41;
if ((CPUInfo[2] & 0x200)!=0)
return SSE_SSSE3;
if ((CPUInfo[3] & 0x4000000)!=0)
return SSE_SSE2;
if ((CPUInfo[3] & 0x2000000)!=0)
return SSE_SSE;
}
#elif defined(__GNUC__)
if (__builtin_cpu_supports("avx2"))
return SSE_AVX2;
if (__builtin_cpu_supports("sse4.1"))
return SSE_SSE41;
if (__builtin_cpu_supports("ssse3"))
return SSE_SSSE3;
if (__builtin_cpu_supports("sse2"))
return SSE_SSE2;
if (__builtin_cpu_supports("sse"))
return SSE_SSE;
#endif
return SSE_NONE;
}
#endif