현재 가상 COM 포트를 노출하는 드라이버를 작성하고 있습니다. 드라이버에서 포트 FDO의 내부 IOCTL을 스택 아래로 보내고, 이는 PDO IO 대기열에서 처리됩니다. 어떤 이유로 출력 데이터가 제공된 출력 메모리에 기록되지 않습니다.WDF 내부 IOCTL 출력을 반환하지 않습니다.
나는 windbg을 통해 IoCtl_Vcp_GetPortInfo (아래 참조)가 호출되고 있으며 의도 한대로 작동하는지 확인했습니다. 요청은 STATUS_SUCCESS로 완료됩니다. WdfRequestComplete를 호출 할 때 출력 버퍼에는 유효한 데이터가 있습니다. 그러나 제어가 GetPortInfo (아래 참조)로 반환되면 제공된 버퍼가 덮어 쓰여지지 않습니다. 수신 버퍼에 대한 액세스시 하드웨어 중단 점을 확인했습니다. WdfIoTargetSendInteralIoctlSynchronously 호출 중에 읽거나 쓰지 않습니다.
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)