首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

在关机过程中驱动如何在屏幕下显示进度

2014-06-04 
在关机过程中驱动怎么在屏幕上显示进度。本帖最后由 LCX87654321 于 2012-02-05 11:51:00 编辑最近在搞一个

在关机过程中驱动怎么在屏幕上显示进度。
本帖最后由 LCX87654321 于 2012-02-05 11:51:00 编辑     最近在搞一个驱动程序,需要在关机的时候做一些额外的工作,因此关机的时候比较慢,为了不让用户在驱动工作的时候强行关闭电脑,需要在屏幕上显示驱动的进度,像“请等待,已完成20%”,“请勿关闭电脑”等这些提示。
    现在就是怎么在屏幕上显示进度伤透了脑筋。我之前想过两种方案,都不理想:
    1)在关机的时候调用GUI显示驱动bootvid来显示驱动的工作信息(这个驱动就是显示Windows开机启动界面的那个GUI驱动)。这个在Win XP工作的很好,但在Windows Vista和Windows 7下,虽然成功运行和显示了,但无法关机,Windows检测到有Power IRP没有结束,我查了IRP的信息,是跟显示有关的,可能是因为更改了显示模式而导致显示驱动错误?


NTSTATUS CShutdown(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
{
LARGE_INTEGER sleeptime;
INT i;
PAGED_CODE();

UNREFERENCED_PARAMETER(DeviceObject);
//如果是Windows Vista以后的操作系统,则不显示
if (!IS_WINDOWSVISTA_OR_LATER()) {
InbvAcquireDisplayOwnership();
InbvResetDisplay();
InbvSolidColorFill(0,0,639,479,4); 
InbvSetTextColor(15);
InbvInstallDisplayStringFilter((INBV_DISPLAY_STRING_FILTER)NULL);
InbvEnableDisplayString(TRUE);   
InbvSetScrollRegion(200,0,639,479); 
InbvDisplayString("LCXL Shadow is saving your work");
}

KdPrint(("SYS:CShutdown:LCXL driver is saving your work\n"));
//模拟进度
sleeptime.QuadPart = -10000000;//1s
for (i = 0; i < 10; i++) {
//等待1s
KeDelayExecutionThread(KernelMode, FALSE, &sleeptime);
if (!IS_WINDOWSVISTA_OR_LATER()) {
InbvDisplayString(".");
}
KdPrint(("SYS:CShutdown:(%d).\n", i));
}
if (!IS_WINDOWSVISTA_OR_LATER()) {
InbvDisplayString("\nOK\n");
}
KdPrint(("SYS:CShutdown:OK.\n"));
//完成IRP
return EpCompleteRequest(STATUS_SUCCESS, Irp, 0);
}

    2)替换msgina.dll 实现自己的系统登录界面。发现有这个方法之后,感觉这个也可行,到时候dll和驱动通信将信息显示在屏幕上,但是我查了MSDN,竟然只支持到Windows 2003,之后的操作系统就不支持了,所以这个也不是个好办法。

大家有什么办法没有?关于在关机过程中显示进度?欢迎任何建议和意见,谢谢大家!
[最优解释]
弄一个进程,运行在active console session的WinSta0\Winlogon
这个进程的窗口就可以看见,让它与驱动程序通信
[其他解释]
顶一下,希望高手帮小弟解决一下
[其他解释]
引用:
弄一个进程,运行在active console session的WinSta0\Winlogon
这个进程的窗口就可以看见,让它与驱动程序通信

又见到你了,之前我提的问题你也有回答过,呵呵。
这个运行在“WinSta0\Winlogon”怎么实现呢,列宁兄有可以参考的东西吗?
[其他解释]
STARTUPINFO.lpDesktop
[其他解释]
问题解决,结贴,正确思路确实是运行在WinSta0\Winlogon桌面下,不过在XP下似乎有点问题,不过在其他系统下没有问题

热点排行