ExitWindowsEX()函数用来退出、重启或注销系统。
函数原型:
BOOL ExitWindowsEx(
UINT uFlags, // 关闭参数
DWORD dwReserved // 系统保留,一般取0
);
编辑本段参数uFlag
参数:uFlags 指定关闭的类型。此参数必须有下列值的组合:EWX_FORCE
EWX_FORCE 强制终止进程。当此标志设置,Windows不会发送消息WM_QUERYENDSESSION和WM_ENDSESSION的消息给目前在系统中运行的程序。这可能会导致应用程序丢失数据。因此,你应该只在紧急情况下使用此标志。EWX_LOGOFF
EWX_LOGOFF 关闭所有进程,然后注销用户。EWX_POWEROFF
EWX_POWEROFF 关闭系统并关闭电源。该系统必须支持断电。 Windows要求: Windows NT中调用进程必须有 SE_SHUTDOWN_NAME 特权。 Windows 9X中:可以直接调用。EWX_REBOOT
EWX_REBOOT 关闭系统,然后重新启动系统。 Windows要求: Windows NT中:调用进程必须有SE_SHUTDOWN_NAME特权。 Windows 9X中:可以直接调用。EWX_SHUTDOWN
EWX_SHUTDOWN 关闭系统,安全地关闭电源。所有文件缓冲区已经刷新到磁盘上,所有正在运行的进程已经停止。 Windows要求: Windows NT中:调用进程必须有SE_SHUTDOWN_NAME特权。 Windows 9X中:可以直接调用。编辑本段参数dwReserved
参数:dwReserved 保留,这参数被忽略。一般取0。 返回值 如果函数成功,返回值为非零。如果函数失败,返回值是零。想获得更多错误信息,请调用GetLastError函数。
# include <windows.h>
# include <mmsystem.h>
# include <stdio.h>
int main()
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
DWORD dwVersion;
dwVersion = GetVersion(); // 得到WINDOWS NT或Win32的版本号
char buff[255];
sprintf(buff,"%x",dwVersion);
if(dwVersion < 0x80000000) // 用于判断WIN系列,从而设置相应的权限
{
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);
//ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0);
ExitWindowsEx(EWX_SHUTDOWN , 0);
//MessageBox(NULL,buff,"dwVersion < 0x80000000",MB_OK);
}
else
{
//ExitWindowsEx(EWX_FORCE | EWX_SHUTDOWN, 0);
ExitWindowsEx( EWX_SHUTDOWN, 0);
//MessageBox(NULL,buff,"dwVersion >= 0x80000000",MB_OK);
}
return 0;
}