我们的程序跑在MS嵌入式操作系统XPE(Windows XP Embedded)下面。机器启用了EWF + HORM功能,所以开机总是从休眠文件中快速启动。
但关机仍显得比较慢,还要显示“Windows正在保存设置”好几秒,事实上这个动作毫无意义。最快的关机是直接拔掉电源线(使用CF卡而非硬盘,应该不会对机器产生负作用)
现在的问题是,我要用什么API关掉系统,实现与拔掉电源一样的效果?试过用ExitWindowsEx的几个选项都不能快速关机。
XPE系统与XP基本一致,API是相同的。

解决方案 »

  1.   

    mov al, $FE
    out $64, al
    ret
      

  2.   

    给CPU一个RESET信号就可以了
    不同的CPU IO指令不同
    记得写在驱动里
      

  3.   

    使用未公开的内核API可以达到上述功能: const int SE_SHUTDOWN_PRIVILEGE = 0x13;
    typedef int (__stdcall *PFN_RtlAdjustPrivilege)( INT, BOOL, BOOL, INT*);
    typedef int (__stdcall *PFN_ZwShutdownSystem)(INT); HMODULE hModule = ::LoadLibrary(_T("ntdll.dll"));
    if( hModule != NULL)
    {
    PFN_RtlAdjustPrivilege pfnRtl = (PFN_RtlAdjustPrivilege)GetProcAddress( hModule, "RtlAdjustPrivilege");
    PFN_ZwShutdownSystem pfnShutdown = (PFN_ZwShutdownSystem)GetProcAddress( hModule,"ZwShutdownSystem");
    if( pfnRtl != NULL &&
    pfnShutdown != NULL )
    {
    int en = 0;
    int nRet= pfnRtl( SE_SHUTDOWN_PRIVILEGE, TRUE, TRUE, &en);
    if( nRet == 0x0C000007C )
    nRet = pfnRtl(SE_SHUTDOWN_PRIVILEGE, TRUE, FALSE, &en);
    //SH_SHUTDOWN = 0; 
    //SH_RESTART = 1; 
    //SH_POWEROFF = 2; 
    const int POWEROFF = 2;
    nRet = pfnShutdown(POWEROFF);
    }
    }