2016-07-27 6 views
0

В настоящее время я пишу драйвер, который предоставляет виртуальные COM-порты. В драйвере я отправляю внутренний IOCTL из порта FDO в стек, который обрабатывается из очереди ввода-вывода PDO. По какой-то причине выходные данные не записываются в предоставленную выходную память.WDF Внутренний IOCTL Не возвращающийся вывод

Я подтвердил через windbg, что IoCtl_Vcp_GetPortInfo (см. Ниже) вызывается и работает по назначению. Запрос завершен с помощью STATUS_SUCCESS. В то время, когда я вызываю WdfRequestComplete, выходной буфер имеет достоверные данные. Однако, когда управление возвращается к GetPortInfo (см. Ниже), предоставленный буфер не был перезаписан. Я подтвердил это с помощью аппаратной точки останова для доступа для принимающего буфера. Он не читается и не записывается во время WdfIoTargetSendInteralIoctlSynchronous call.

Код ответственный за отправку IOCTL ниже:

NTSTATUS GetPortInfo(WDFDEVICE device, _Out_ PVCH_PORT_INFO port_info) 
{ 
     NTSTATUS status; 
     WDFIOTARGET io_target; 
     WDF_MEMORY_DESCRIPTOR output_descriptor; 
     PVOID buffer = ExAllocatePoolWithTag(NonPagedPool, sizeof(VCH_PORT_INFO), VCH_POOL_TAG); 

     //WDF_MEMORY_DESCRIPTOR_INIT_BUFFER(&output_descriptor, port_info, sizeof(VCH_PORT_INFO)); 
     WDF_MEMORY_DESCRIPTOR_INIT_BUFFER(&output_descriptor, buffer, sizeof(VCH_PORT_INFO)); 

     io_target = WdfDeviceGetIoTarget(device); 
     status = WdfIoTargetSendInternalIoctlSynchronously(io_target, NULL, IOCTL_VCP_INTERNAL_GET_PORT_INFO, NULL, &output_descriptor, NULL, NULL); 
     DbgBreakPoint(); 
     if (!NT_SUCCESS(status)) 
       return status; 

     memcpy(port_info, buffer, sizeof(VCH_PORT_INFO)); 
     ExFreePoolWithTag(buffer, VCH_POOL_TAG); 

     return STATUS_SUCCESS; 
} 

код, который обрабатывает IOCTL:

NTSTATUS IoCtl_Vcp_GetPortInfo(WDFDEVICE device, WDFREQUEST request) 
{ 
     NTSTATUS status; 
     PVCH_PORT_INFO buffer; 
     PPORT_PDO_DESCRIPTOR descriptor = PortPdoGetContext(device); 

     status = WdfRequestRetrieveOutputBuffer(request, sizeof(VCH_PORT_INFO), (PVOID*)&buffer, NULL); 
     if (!NT_SUCCESS(status)) 
       return status; 

     buffer->Address = descriptor->Address; 
     buffer->ForceComIndex = FALSE; // TODO: Implement 
     buffer->Writeable = descriptor->Writeable; 
     DbgBreakPoint(); 
     return STATUS_SUCCESS; 
} 

Определение кода IOCTL:

#define DEVICE_TYPE_VIRTUAL_COM_PORT 0xC51 
#define IOCTL_VCP_INTERNAL_GET_PORT_INFO CTL_CODE(DEVICE_TYPE_VIRTUAL_COM_PORT, 0x30, METHOD_BUFFERED, FILE_READ_DATA) 

ответ

0

Настройка запроса информация о завершении с количеством выходных байтов исправляет проблему.