Так как встречаются вопросы на эту тему, а в поиске решения я не нашел, привожу примерный код.
NTSTATUS NTAPI BootPrint(IN PWSTR szMessage)
{
UNICODE_STRING us;
RtlInitUnicodeString(&us,szMessage);
return ZwDisplayString(&us);
}
ULONG Counter; //число циклов ожидания
LARGE_INTEGER WaitTimeout; //время одного ожидания
HANDLE hFile;
UNICODE_STRING us;
IO_STATUS_BLOCK iosb;
BOOLEAN bAborted = FALSE;
RtlInitUnicodeString(&us, L"\\Device\\KeyboardClass0");
OBJECT_ATTRIBUTES oa = {sizeof(OBJECT_ATTRIBUTES), NULL, &us, OBJ_CASE_INSENSITIVE};
BootPrint(L"Press any key to abort\n");
NTSTATUS ns = ZwCreateFile(&hFile, GENERIC_READ | SYNCHRONIZE | FILE_READ_ATTRIBUTES, &oa, &iosb, 0, 0x80, 0, 1, 1, 0, 0);
if (ns >= 0)
{
UCHAR buf[12];
LARGE_INTEGER f;
while ((Counter--) && (!bAborted))
{
ns = ZwReadFile(hFile, 0, 0, 0, &iosb, buf, 12, &f, 0);
if (ns != STATUS_PENDING)
bAborted = TRUE;
else
{
BootPrint(L".");
ns = ZwWaitForSingleObject(hFile, FALSE, &WaitTimeout);
if (ns != STATUS_TIMEOUT)
bAborted = TRUE;
}
}
ZwClose(hFile);
}
if (bAborted)
BootPrint(L"Aborted\n");
При выполнении этого кода при значениях Counter=5 и WaitTimeout.QuadPart=-10000000 будет происходить следующее: на экран будет выведена надпись "Press any key to abort", после чего каждую секунду будет появляться по одной точке, либо пока не будет нажата какая-либо клавиша на клавиатуре (и на экране отобразится строка "Aborted"), либо пока не истечет лимит на 5 таких точек и программа продолжит работу без вывода сообщения.