blob: 5857e21829f937190ea46e5a5405ef7bb05615f6 [file] [log] [blame]
#include "os.h"
#ifdef _WIN32
#include <windows.h>
#endif /* _WIN32 */
#ifndef NO_SystemReboot
JNIEXPORT jboolean JNICALL OS_NATIVE(SystemReboot)
(JNIEnv *env, jclass that )
{
#ifdef _WIN32
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return FALSE;
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
// Cannot test the return value of AdjustTokenPrivileges.
if (GetLastError() != ERROR_SUCCESS)
return FALSE;
SetProcessShutdownParameters(0x100/*Application reserved last shutdown range*/,0);
return ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0);
#else /* _WIN32 */
return FALSE;
#endif /* _WIN32 */
}
#endif
JNIEXPORT jboolean JNICALL OS_NATIVE(IsUserAdmin)
(JNIEnv *env, jclass that )
{
#ifdef _WIN32
/*++
Routine Description: This routine returns TRUE if the caller's process
is a member of the Administrators local group. Caller is NOT expected
to be impersonating anyone and is expected to be able to open its own
process and process token.
Arguments: None.
Return Value:
TRUE - Caller has Administrators local group.
FALSE - Caller does not have Administrators local group. --
*/
BOOL b;
SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
PSID AdministratorsGroup;
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;
#else
return TRUE;
#endif
}