UcxIoDeviceControl 関数 (ucxcontroller.h)

USB ホスト コントローラー拡張機能 (UCX) がユーザー モードからの I/O 制御コード (IOCTL) 要求を処理できるようにします。

構文

BOOLEAN UcxIoDeviceControl(
  [in] WDFDEVICE  Device,
  [in] WDFREQUEST Request,
  [in] size_t     OutputBufferLength,
  [in] size_t     InputBufferLength,
  [in] ULONG      IoControlCode
);

パラメーター

[in] Device

WdfDeviceCreate の前回の呼び出しでクライアント ドライバーが取得したフレームワーク デバイス オブジェクトへのハンドル。

[in] Request

ユーザー モード IOCTL 要求を表すフレームワーク要求オブジェクトへのハンドル。

[in] OutputBufferLength

出力バッファーが使用可能な場合は、要求の出力バッファーの長さ (バイト単位)。

[in] InputBufferLength

入力バッファーが使用可能な場合の、要求の入力バッファーの長さ (バイト単位)。

[in] IoControlCode

要求に関連付けられているドライバー定義またはシステム定義の IOCTL。

戻り値

操作が成功した場合、メソッドは TRUE を返します。 それ以外の場合は FALSE を返します。

注釈

クライアント ドライバーは、このメソッドを呼び出して、UCX が次の表に示す IOCTL を処理できるようにします。 USB のユーザー モード IOCTL。 IOCTL コードが IOCTL_USB_DIAGNOSTIC_MODE_OFF または IOCTL_USB_DIAGNOSTIC_MODE_ON場合、UCX は要求を正常に完了します。 USB ホスト コントローラードライバーのキー名 ( IOCTL_USB_GET_ROOT_HUB_NAMEIOCTL_GET_HCD_DRIVERKEY_NAMEなど) を取得するために使用される IOCTLS の場合、UCX は Unicode 文字列を取得します。 ユーザー モード IOCTL が IOCTL_USB_USER_REQUESTされている場合は、入力バッファーと出力バッファーの長さが等しく、出力バッファーに USBUSER_REQUEST_HEADER 構造体が含まれている必要があります。 残りの IOCTL の場合、UCX は FALSE を返し、クライアント ドライバーは独自の処理ロジックを提供できます。

VOID
Controller_WdfEvtIoDeviceControl(
    WDFQUEUE    WdfQueue,
    WDFREQUEST  WdfRequest,
    size_t      OutputBufferLength,
    size_t      InputBufferLength,
    ULONG       IoControlCode
)
/*++

Routine Description:

    This routine is a callback function which is called by WDF when a driver
    receives an I/O control request from the queue this callback is registered
    with.

    The controller driver calls UcxIoDeviceControl() to allow UCX to try and
    handle the IOCTL.  If UCX cannot handle the IOCTL, the controller driver
    must handle it, perhaps by failing it.

    The default queue only expects to receive IOCTLs from user mode (via the
    interface defined by GUID_DEVINTERFACE_USB_HOST_CONTROLLER).

Arguments:

    WdfQueue - A handle to the framework I/O queue object.

    WdfRequest - A handle to the framework request object that contains the IOCTL.

    OutputBufferLength - Length of the IOCTL output buffer, if an output buffer
        is available.

    InputBufferLength - Length of the IOCTL input buffer, if an input buffer
        is available.

    IoControlCode - I/O control code associated with the request.

Return Value:

    None.

--*/
{
    KPROCESSOR_MODE requestorMode;

    //
    // Allow UCX to try and handle the request
    //
    if (UcxIoDeviceControl(WdfIoQueueGetDevice(WdfQueue),
                           WdfRequest,
                           OutputBufferLength,
                           InputBufferLength,
                           IoControlCode)) {
        DbgTrace(TL_VERBOSE, Controller, "IoControlCode 0x%x was handled by UCX", IoControlCode);
        goto WdfEvtIoDeviceControlEnd;
    }

    //
    // Check that the request is coming from user mode
    //
    requestorMode = WdfRequestGetRequestorMode(WdfRequest);

    if (requestorMode != UserMode) {
        DbgTrace(TL_WARNING, Controller, "Invalid RequestorMode %d", requestorMode);
    }

    //
    // UCX could not handle the request, so handle it here
    //
    switch (IoControlCode) {

    default:
        DbgTrace(TL_WARNING, Controller, "Unsupported IoControlCode 0x%x", IoControlCode);
        WdfRequestComplete(WdfRequest, STATUS_INVALID_DEVICE_REQUEST);
    }

WdfEvtIoDeviceControlEnd:

    return;
}

要件

要件
サポートされている最小のクライアント Windows 10
対象プラットフォーム Windows
ヘッダー ucxcontroller.h (Ucxclass.h を含む)
IRQL <=DISPATCH_LEVEL

こちらもご覧ください

USB のユーザー モード IOCTL