2012-02-17 6 views
1

У меня были некоторые проблемы с привилегиями при вызове функции Windows API ExitWindowsEX.Код на C++ отлично работает, но не работает при вызове с Java (JNI)

Так что я написал следующий код, чтобы получить привилегию:

Это отлично работает в C++

#include <cstdlib> 
#include <windows.h> 
#include <iostream> 


using namespace std; 

/* 
* 
*/ 

int MyExitWindows(int flag, int reason); 

int main(int argc, char** argv) { 
    MyExitWindows(EWX_SHUTDOWN, 0); 
} 

int MyExitWindows(int flag, int reason) { 
    HANDLE hToken; 
    TOKEN_PRIVILEGES tkp; 

    // Get a token for this process.  

    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 
    return GetLastError(); 

    // Get the LUID for the shutdown privilege.  

    LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid); 

    tkp.PrivilegeCount = 1; // one privilege to set   
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 

    // Get the shutdown privilege for this process.  

    AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, 
      (PTOKEN_PRIVILEGES) NULL, 0); 

    // Cannot test the return value of AdjustTokenPrivileges.  

    ExitWindowsEx(flag, reason); 
    if (GetLastError() != ERROR_SUCCESS) { 
    return GetLastError(); 
    } 

    return 0; 
} 

Но это не работает, когда я называю его из Java

#include <jni.h> 
#include <cstdlib> 
#include <windows.h> 
#include "com_ehsunbehravesh_jshutdown_system_Shutdowner.h" 

using namespace std; 

int MyExitWindows(int flag, int reason); 

JNIEXPORT jint JNICALL Java_com_ehsunbehravesh_jshutdown_system_Shutdowner_exitWindowsEx 
(JNIEnv *env, jobject obj, jlong flag, jlong reason) { 
    return MyExitWindows(flag, reason); 
} 

int MyExitWindows(int flag, int reason) { 
    HANDLE hToken; 
    TOKEN_PRIVILEGES tkp; 

    // Get a token for this process.  

    int cpid = GetCurrentProcessId(); 
    printf("%d", cpid); 
    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 
    return GetLastError(); 

    // Get the LUID for the shutdown privilege.  

    LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid); 

    tkp.PrivilegeCount = 1; // one privilege to set   
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 

    // Get the shutdown privilege for this process.  

    AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, 
      (PTOKEN_PRIVILEGES) NULL, 0); 

    // Cannot test the return value of AdjustTokenPrivileges.  

    ExitWindowsEx(flag, reason); 
    if (GetLastError() != ERROR_SUCCESS) { 
    return GetLastError(); 
    } 

    return 0; 
} 
+1

Можете ли вы рассказать о том, что вы подразумеваете под «не работает», пожалуйста? Сбой? Код ошибки возвращается из вызова API (который?) Нет ошибки/сбоя, но ничего не видно? – Flexo

+0

'jlong' является 64-битным, и я уверен, что' int' не будет больше 32-бит в C. (Не то, чтобы он также вызывал у вас проблему) –

+0

1. Моя функция возвращает 0, и это означает никакая ошибка не возвращается 'GetLastError()' 2. До тех пор, пока я знаю, что у меня нет ошибки в литье типов 3. Я не работаю, я имею в виду, что 'ExitWindowsEx' работает, как будто у него нет полной привилегии (завершение работы выхода из системы) и перезагрузка не работает) – ehsun7b

ответ

0

Есть ли причина, по которой вы не используете System.exit(int)?

Java пытается контролировать закрытие приложения, возможно, он пытается помешать вам делать это по-другому.

+1

Предположительно потому, что WindowsExitEx имеет другую цель: он выключает Windows или перезагружается. –

Смежные вопросы