0

現在、仮想 COM ポートを公開するドライバーを作成しています。ドライバーでは、ポート FDO から内部 IOCTL をスタックに送信します。これは、PDO IO キューから処理されます。何らかの理由で、出力データが提供された出力メモリに書き込まれません。

IoCtl_Vcp_GetPortInfo (下記参照) が呼び出され、意図したとおりに動作することを windbg で確認しました。要求は 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)
4

1 に答える 1