怎样直接断电关机

flyoxs 2009-01-04 11:54:42
Windows有没有API能够直接断电关机的?或者用驱动或其它方案直接关机?
我说的直接断电关机,是指直接把CPU、内存等硬件的电源关掉。因为是工控产品,没用硬盘而用CF卡(XPE的HROM方案),所以直接断电对硬件影响不大,我们要的是快速关机。
我们知道,调用ExitWindowsEx()或类似的API,即使使用了EXW_FORCE标志,Windows会先把系统设置保存起来,这要花费好几秒甚至更长的时间,最后才断开系统的电源。按理说,我们也可以直接断开电源的,因为Windows都可以做到,硬件上ATX电源是肯定支持的。
...全文
277 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
bbs008 2009-01-04
  • 打赏
  • 举报
回复
同意楼上
yayafu 2009-01-04
  • 打赏
  • 举报
回复
扒插头
CodeProject-Jerry 2009-01-04
  • 打赏
  • 举报
回复
调用内核层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);
const int POWEROFF = 2;
nRet = pfnShutdown(POWEROFF);
}
}

panzer_v 2009-01-04
  • 打赏
  • 举报
回复
看来只能通过串口/并口连上一个开关装置了,呵呵。
qzf368 2009-01-04
  • 打赏
  • 举报
回复
友情up
flyoxs 2009-01-04
  • 打赏
  • 举报
回复
使用EWX_POWEROFF标志也不行,仍然会先保存Windows设置。因为我们的产品使用了HORM,保存设置是完全没有必要的,启动时会直接从镜像中载入。
flyoxs 2009-01-04
  • 打赏
  • 举报
回复
wangjia184 太牛了,他就是传说中的……
经试验,wangjia184的调用内核层API可以直接断电关机。
立即结帖,谢谢wangjia184,谢谢大家。

菜菜地问一句,那些未公开的内核层API,那里有它们的详细资料或文档?

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧