在关机过程中驱动怎么在屏幕上显示进度。
本帖最后由 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);
}