1 void ElevationOfPrivilege() 2 { 3 BOOL retn; 4 HANDLE hToken; 5 retn = OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken); 6 if(retn != TRUE) 7 { 8 //cout<<"获取令牌句柄失败!"<<endl; 9 return; 10 } 11 12 TOKEN_PRIVILEGES tp; //新特权结构体 13 LUID Luid; 14 retn = LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&Luid); 15 16 if(retn != TRUE) 17 { 18 //cout<<"获取Luid失败"<<endl; 19 return; 20 } 21 //给TP和TP里的LUID结构体赋值 22 tp.PrivilegeCount = 1; 23 tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 24 tp.Privileges[0].Luid = Luid; 25 26 AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL); 27 if(GetLastError() != ERROR_SUCCESS) 28 { 29 //cout<<"修改特权不彻底或失败!"<<endl; 30 } 31 else 32 { 33 //cout<<"修改为功!"<<endl; 34 } 35 }
1 BOOL ExitWindowsEx( 2 UINT uFlags, 3 DWORD dwReason 4 );
1 uFlags 2 // 3 //指定关闭的类型。此参数必须有下列值的组合: 4 //EWX_FORCE 5 //强制终止进程。当此标志设置,Windows不会发送消息WM_QUERYENDSESSION和WM_ENDSESSION的消息给目前在系统中运行的程序。这可能会致使应用程序丢失数据。所以,你应该只在紧急状况下使用此标志。 6 //EWX_LOGOFF 7 //关闭全部进程,而后注销用户。 8 //EWX_POWEROFF 9 //关闭系统并关闭电源。该系统必须支持断电。 10 //Windows要求: 11 //Windows NT中调用进程必须有 SE_SHUTDOWN_NAME 特权。 12 //Windows 9X中:能够直接调用。 13 //EWX_REBOOT 14 //关闭系统,而后从新启动系统。 15 //Windows要求: 16 //Windows NT中:调用进程必须有SE_SHUTDOWN_NAME特权。 17 //Windows 9X中:能够直接调用。 18 //EWX_SHUTDOWN 19 //关闭系统,安全地关闭电源。全部文件缓冲区已经刷新到磁盘上,全部正在运行的进程已经中止。 20 //Windows要求: 21 //Windows NT中:调用进程必须有SE_SHUTDOWN_NAME特权。 22 //Windows 9X中:能够直接调用。 23 //dwReserved 24 // 25 //系统保留,这参数被忽略。通常取0。 26 //返回值 27 //若是函数成功,返回值为非零。 28 //若是函数失败,返回值是零。想得到更多错误信息,请调用GetLastError函数。