I am developing a Windows device-driver and need to delay execution of a system shutdown for about 10 secs. I am using following code inside DispatchPower() function of my driver:
NTSTATUS DispatchPower(
__in struct _DEVICE_OBJECT *DeviceObject,
__in struct _IRP *Irp
)
{
switch(stack->MinorFunction)
{
case IRP_MN_SET_POWER:
delay_time.QuadPart = WDF_REL_TIMEOUT_IN_SEC(10);
KeDelayExecutionThread(KernelMode, FALSE, &delay_time);
}
}
But it seems KeDelayExecutionThread() returns immediately without waiting? Any suggestions?
Thanks,
Not certain, but here are some advices:
Check the return value of
KeDelayExecutionThread. According to the docs it seems that this function may return preliminary with eitherSTATUS_ALERTEDorSTATUS_USER_APC. Well, since you’re performing a non-alertable state this should not happen, but OTOH I don’t quite understand what is the difference betweenSTATUS_ALERTEDandSTATUS_USER_APC. Besides from this it may return you an error status, which may be informative.According to the docs you must run at IRQL <=
APC_LEVEL. You should check your actual IRQL (KeGetCurrentIrql).Anyway, IMHO it’s a pretty weird design to block a thread in the kernel-mode. Usually this hangs the whole system. If you want to delay the IRP processing you’d better return
STATUS_PENDINGin the dispatch routine, and then, via timer DPC complete this IRP.If you’re not familiar with this read the MSDN about the following:
KeInitializeDpc,KeInitializeTimer,KeSetTimer.