Initial community commit
This commit is contained in:
parent
537bcbc862
commit
fc06254474
16440 changed files with 4239995 additions and 2 deletions
217
Src/external_dependencies/openmpt-trunk/include/unrar/system.cpp
vendored
Normal file
217
Src/external_dependencies/openmpt-trunk/include/unrar/system.cpp
vendored
Normal file
|
@ -0,0 +1,217 @@
|
|||
#include "rar.hpp"
|
||||
|
||||
static int SleepTime=0;
|
||||
|
||||
void InitSystemOptions(int SleepTime)
|
||||
{
|
||||
::SleepTime=SleepTime;
|
||||
}
|
||||
|
||||
|
||||
#if !defined(SFX_MODULE)
|
||||
void SetPriority(int Priority)
|
||||
{
|
||||
#ifdef _WIN_ALL
|
||||
uint PriorityClass;
|
||||
int PriorityLevel;
|
||||
if (Priority<1 || Priority>15)
|
||||
return;
|
||||
|
||||
if (Priority==1)
|
||||
{
|
||||
PriorityClass=IDLE_PRIORITY_CLASS;
|
||||
PriorityLevel=THREAD_PRIORITY_IDLE;
|
||||
|
||||
// Background mode for Vista, can be slow for many small files.
|
||||
// if (WinNT()>=WNT_VISTA)
|
||||
// SetPriorityClass(GetCurrentProcess(),PROCESS_MODE_BACKGROUND_BEGIN);
|
||||
}
|
||||
else
|
||||
if (Priority<7)
|
||||
{
|
||||
PriorityClass=IDLE_PRIORITY_CLASS;
|
||||
PriorityLevel=Priority-4;
|
||||
}
|
||||
else
|
||||
if (Priority==7)
|
||||
{
|
||||
PriorityClass=BELOW_NORMAL_PRIORITY_CLASS;
|
||||
PriorityLevel=THREAD_PRIORITY_ABOVE_NORMAL;
|
||||
}
|
||||
else
|
||||
if (Priority<10)
|
||||
{
|
||||
PriorityClass=NORMAL_PRIORITY_CLASS;
|
||||
PriorityLevel=Priority-7;
|
||||
}
|
||||
else
|
||||
if (Priority==10)
|
||||
{
|
||||
PriorityClass=ABOVE_NORMAL_PRIORITY_CLASS;
|
||||
PriorityLevel=THREAD_PRIORITY_NORMAL;
|
||||
}
|
||||
else
|
||||
{
|
||||
PriorityClass=HIGH_PRIORITY_CLASS;
|
||||
PriorityLevel=Priority-13;
|
||||
}
|
||||
SetPriorityClass(GetCurrentProcess(),PriorityClass);
|
||||
SetThreadPriority(GetCurrentThread(),PriorityLevel);
|
||||
|
||||
#ifdef RAR_SMP
|
||||
ThreadPool::SetPriority(PriorityLevel);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
// Monotonic clock. Like clock(), returns time passed in CLOCKS_PER_SEC items.
|
||||
// In Android 5+ and Unix usual clock() returns time spent by all threads
|
||||
// together, so we cannot use it to measure time intervals anymore.
|
||||
clock_t MonoClock()
|
||||
{
|
||||
return clock();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void Wait()
|
||||
{
|
||||
return; // OPENMPT ADDITION
|
||||
if (ErrHandler.UserBreak)
|
||||
ErrHandler.Exit(RARX_USERBREAK);
|
||||
#if defined(_WIN_ALL) && !defined(SFX_MODULE)
|
||||
if (SleepTime!=0)
|
||||
{
|
||||
static clock_t LastTime=MonoClock();
|
||||
if (MonoClock()-LastTime>10*CLOCKS_PER_SEC/1000)
|
||||
{
|
||||
Sleep(SleepTime);
|
||||
LastTime=MonoClock();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(_WIN_ALL)
|
||||
// Reset system sleep timer to prevent system going sleep.
|
||||
SetThreadExecutionState(ES_SYSTEM_REQUIRED);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#if defined(_WIN_ALL) && !defined(SFX_MODULE)
|
||||
void Shutdown(POWER_MODE Mode)
|
||||
{
|
||||
return; // OPENMPT ADDITION
|
||||
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; // Return false if no other RAR -ioff are running.
|
||||
if (Open) // Create or open the event.
|
||||
hEvent=CreateEvent(NULL,FALSE,FALSE,EventName);
|
||||
else
|
||||
{
|
||||
if (hEvent!=NULL)
|
||||
CloseHandle(hEvent); // Close our event.
|
||||
// Check if other copies still own the event. While race conditions
|
||||
// are possible, they are improbable and their harm is minimal.
|
||||
hEvent=CreateEvent(NULL,FALSE,FALSE,EventName);
|
||||
Result=GetLastError()==ERROR_ALREADY_EXISTS;
|
||||
if (hEvent!=NULL)
|
||||
CloseHandle(hEvent);
|
||||
}
|
||||
return Result;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
#if defined(_WIN_ALL)
|
||||
// Load library from Windows System32 folder. Use this function to prevent
|
||||
// loading a malicious code from current folder or same folder as exe.
|
||||
HMODULE WINAPI LoadSysLibrary(const wchar *Name)
|
||||
{
|
||||
wchar SysDir[NM];
|
||||
if (GetSystemDirectory(SysDir,ASIZE(SysDir))==0)
|
||||
return NULL;
|
||||
MakeName(SysDir,Name,SysDir,ASIZE(SysDir));
|
||||
return LoadLibrary(SysDir);
|
||||
}
|
||||
|
||||
|
||||
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()
|
||||
{
|
||||
int CPUInfo[4];
|
||||
__cpuid(CPUInfo, 0x80000000);
|
||||
|
||||
// Maximum supported cpuid function. For example, Pentium M 755 returns 4 here.
|
||||
uint MaxSupported=CPUInfo[0] & 0x7fffffff;
|
||||
|
||||
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;
|
||||
}
|
||||
return SSE_NONE;
|
||||
}
|
||||
#endif
|
Loading…
Add table
Add a link
Reference in a new issue