在Win9x中退出系统大家一定不陌生吧?好象挺神乎的,其实说穿了不过就是调用了一个底层的API函数ExitWindowsEx()罢了。但这在Win2000中行不通。不信?你随便用VB,Delphi,C++Builder试一试,没反应吧?
这是因为Win2000其实就是WinNT 5.0,用的就是NT的内核。Windows NT可不象Win9x和Dos,可以随意进行底层操作,如在Win9x中可以随意关掉任何进程(如kernel32进程,这将导致死机),随意进行绝对磁盘扇区读写(如CIH病毒),Windows NT非常注重系统每个进程的权利(这一点很像Unix,但只有这样才能算得上是一个比较完整的操作系统!),一个普通的进程是不应具备有调用系统的权利(这也是为什么Win9x和Dos下病毒成灾的原因),强行调用ExitWindowsEx()只能是没有反应。所以唯一的做法是我们来赋予它足够的权限。
启动C++Builder,新建一个工程,添加三个按钮,Caption依次为“注销当前用户”、“退出Windows2000”和“重新启动Windows2000”,然后双击Button1,在中间加入以下代码:
{
HANDLE app;
DWORD num;
TOKEN_PRIVILEGES tok;
//定义变量
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&app);
tok.PrivilegeCount=1;
/*
OpenProcessToken()这个函数的作用是打开一个进程的访问令牌,其函数原形为
BOOL OpenProcessToken(
HANDLE ProcessHandle, // handle to process
DWORD DesiredAccess, // desired access to process
PHANDLE TokenHandle // pointer to handle of open access token
);
其中第二个参数是访问的请求方式,比较繁杂,欲了解详情请查看 Win32 Programmer's Reference
GetCurrentProcess()函数的作用是得到本进程的句柄


