我想获取exitwindowsex的函数地址,大家看看我的做法
typedef BOOL (WINAPI *pEXITWINDOWSEX)(UINT,DWORD);pEXITWINDOWSEX ppp=(pEXITWINDOWSEX)::GetProcAddress(GetModuleHandle("user32.dll"),"ExitWindowsEx");ppp(EWX_SHUTDOWN|EWX_FORCE,0);
结果怎么不能关机呢,无反应呢
typedef BOOL (WINAPI *pEXITWINDOWSEX)(UINT,DWORD);pEXITWINDOWSEX ppp=(pEXITWINDOWSEX)::GetProcAddress(GetModuleHandle("user32.dll"),"ExitWindowsEx");ppp(EWX_SHUTDOWN|EWX_FORCE,0);
结果怎么不能关机呢,无反应呢
typedef enum _SHUTDOWN_ACTION{
ShutdownNoReboot,
ShutdownReboot,
ShutdownPowerOff
} SHUTDOWN_ACTION, *PSHUTDOWN_ACTION; typedef NTSYSAPI LONG (NTAPI *fnNtShutdownSystem)(SHUTDOWN_ACTION);
void CShutDownDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
HMODULE hModule = LoadLibrary("ntdll.dll");
if (hModule)
{
fnNtShutdownSystem fn = (fnNtShutdownSystem)GetProcAddress(hModule, "NtShutdownSystem");
if (fn)
{
fn(ShutdownPowerOff);
}
else
{
MessageBox("程序出错了!","警告",MB_OK|MB_ICONSTOP);
} }
}
试试这个
HANDLE hToken;
TOKEN_PRIVILEGES tkp; // Get a token for this process. if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return( FALSE ); // 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);
换成
typedef BOOL (*pEXITWINDOWSEX)(UINT, DWORD);应该没有WINAPI