Чтение запросов в Windows UMDF драйвер вопрос
Я пытаюсь написать свой собственный драйвер Virtual Serial для Windows, используя UMDF2 framework. Я использовал пример проекта VirtualSerial2 из репозитория образцов драйверов Windows от Microsoft ( https://github.com/Microsoft/Windows-driver-samples/tree/master/serial/VirtualSerial2). Я могу скомпилировать код без ошибок. Я пытаюсь ввести данные в последовательный порт, используя отдельный поток в драйвере. Я делаю это, записывая данные в кольцевой буфер объекта устройства.
DWORD WINAPI ThreadFunc(void* arg) {
Sleep(100);
PDEVICE_CONTEXT DeviceContext = (PDEVICE_CONTEXT)arg;
QUEUE_CONTEXT * qc = (QUEUE_CONTEXT *)DeviceContext->DefaultQueue;
while (1)
{
RingBufferWrite(&(qc->RingBuffer), (BYTE*)"HELLO\r\n", 8);
Sleep(1000);
}
return 0;
}
Данные записываются в кольцевой буфер, но не отправляются через последовательный интерфейс (если я открываю последовательный порт с помощью Putty, я его не вижу), за исключением случаев, когда я отправляю какие-либо данные в окно терминала, и в этом случае все данные, которые находится в буфере сбрасывается на терминал. Из того, что я могу сказать, Driver Framework должен вызвать обратный вызов EvtIoRead объекта очереди для данных, считываемых из кольцевого буфера.
EvtIoRead(
_In_ WDFQUEUE Queue,
_In_ WDFREQUEST Request,
_In_ size_t Length
)
{
NTSTATUS status;
PQUEUE_CONTEXT queueContext = GetQueueContext(Queue);
WDFMEMORY memory;
size_t bytesCopied = 0;
...
status = RingBufferRead(&queueContext->RingBuffer,
(BYTE*)WdfMemoryGetBuffer(memory, NULL),
Length,
&bytesCopied);
Я хотел бы знать следующее: когда платформа драйвера отправляет запросы на чтение, которые в конечном итоге вызывают событие READ? Нужно ли уведомлять драйвер, что в буфере есть данные? Что-то в корне не так с моим пониманием того, как работают драйверы?
Любая помощь будет оценена.
С уважением