Ожидание клавы в BootExecute
От: vasketsov Россия http://ntprog.by.ru
Дата: 20.11.02 11:50
Оценка: 20 (3)
Так как встречаются вопросы на эту тему, а в поиске решения я не нашел, привожу примерный код.

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 таких точек и программа продолжит работу без вывода сообщения.
Васкецов Сергей
http://registry.km.ru
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.