我在logon下注入了一个dll,在logon的时候弹出窗口进行重起操作,部分代码如下:
HINSTANCE hInst = LoadLibrary("shell32.dll"); SHUTDOWNDLG ShutDownDialog;
if(hInst != NULL)
{
ShutDownDialog = (SHUTDOWNDLG)GetProcAddress(hInst,(LPSTR)60);
(*ShutDownDialog)(0);
}
FreeLibrary(hInst);
为什么点击之后,系统返回到登录界面。如果登录系统的话,会提示系统正在关闭。

解决方案 »

  1.   

    GetProcAddress函数和操作系统有关,lz什么操作系统。
    有些操作系统需要先调用设置权限级别的api
      

  2.   

    我已经设定了权限,而且GetProcAddress可以被执行,只是在点击执行重起的死后没有什么反应
      

  3.   

    if ( ! OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, & hToken ) )
    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;
      

  4.   

    lz参考一下这段关机的代码//////////////////
    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;
    }
      

  5.   

    上面的代码在进入windows桌面后执行并没有什么问题,我试验过了。
    但是dll注入到winlogon里面后,此时windows桌面还没有出现,只是在登录后就弹出窗口进行系统重起或关闭,调用以上功能代码却不能正常的重起或关闭系统。
      

  6.   

    把 GetLastError()的内容FormatMessage出来看看是什么原因,调用ShutdownDlg或是ExitWindowsEx效果是一样的,估计是权限问题
      

  7.   

    权限设定了
    GetLastError()是53
    提升优先级?
      

  8.   

    Error 53 is ERROR_BAD_NETPATH ("The network path was not found."). So, if you specified machine name, then you should have SE_SHUTDOWN_NAME/SE_REMOTE_SHUTDOWN_NAME priviledge. 
      

  9.   

    SE_SHUTDOWN_NAME已经被设定了,可是重起的话,系统将死在正在用户设置的画面。
    但是,相同的代码如果是正常进入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");
    }