我在logon下注入了一个dll,在logon的时候弹出窗口进行重起操作,部分代码如下:
HINSTANCE hInst = LoadLibrary("shell32.dll"); SHUTDOWNDLG ShutDownDialog;
if(hInst != NULL)
{
ShutDownDialog = (SHUTDOWNDLG)GetProcAddress(hInst,(LPSTR)60);
(*ShutDownDialog)(0);
}
FreeLibrary(hInst);
为什么点击之后,系统返回到登录界面。如果登录系统的话,会提示系统正在关闭。
HINSTANCE hInst = LoadLibrary("shell32.dll"); SHUTDOWNDLG ShutDownDialog;
if(hInst != NULL)
{
ShutDownDialog = (SHUTDOWNDLG)GetProcAddress(hInst,(LPSTR)60);
(*ShutDownDialog)(0);
}
FreeLibrary(hInst);
为什么点击之后,系统返回到登录界面。如果登录系统的话,会提示系统正在关闭。
有些操作系统需要先调用设置权限级别的api
goto FAILED_MESSAGE; TOKEN_PRIVILEGES tkp;
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 ); if ( GetLastError() != ERROR_SUCCESS )
goto FAILED_MESSAGE;
if ( ! InitiateSystemShutdown( NULL, strInfo,0, TRUE, bRestart ) )
goto FAILED_MESSAGE;
BOOL CAutoshutdownDlg::MySystemShutdown()
{
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);
if (GetLastError() != ERROR_SUCCESS)
return FALSE;
// Shut down the system and force all applications to close.
if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE,
0x00020000 |
0x00000003 |
0x80000000))
return FALSE;
return TRUE;
}
但是dll注入到winlogon里面后,此时windows桌面还没有出现,只是在登录后就弹出窗口进行系统重起或关闭,调用以上功能代码却不能正常的重起或关闭系统。
GetLastError()是53
提升优先级?
但是,相同的代码如果是正常进入windows之后被执行的话就会正常重起。
现在的要求是,在安全模式下,登录系统,输入完用户密码后再次弹出一个窗口(此时系统还没有被完全启动,即系统桌面还没有出现)进行系统重起。我现在是在注册表中Winlogon/Notify下增加了一个key,StartShell时,调用重起功能的函数。
我的代码如下:
HANDLE hToken;
TOKEN_PRIVILEGES tkp; if ( !OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
{
AfxMessageBox ( "Can't Restart.OpenProcessToken" );
return ;
} LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid); tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), (PTOKEN_PRIVILEGES)NULL, NULL); if (GetLastError() != ERROR_SUCCESS) {
AfxMessageBox ( "Can't Restart.AdjustTokenPrivileges");
::CloseHandle(hToken);
}
if (!ExitWindowsEx(EWX_LOGOFF | EWX_REBOOT | EWX_FORCE, 0 )) {
AfxMessageBox ( "Can't Restart.ExitWindowsEx");
}