General I/O Targets in UMDF

Warning

UMDF 2 is the latest version of UMDF and supersedes UMDF 1. All new UMDF drivers should be written using UMDF 2. No new features are being added to UMDF 1 and there is limited support for UMDF 1 on newer versions of Windows 10. Universal Windows drivers must use UMDF 2.

The archived UMDF 1 samples can be found in the Windows 11, version 22H2 - May 2022 Driver Samples Update.

For more info, see Getting Started with UMDF.

General I/O targets, which can be either local or remote, are I/O targets that do not support special, device-specific data formats, such as USB request blocks. Before drivers send data to a general I/O target, they must put data into a write buffer in a format that the I/O target and device can interpret. Likewise, when drivers read data from a general I/O target, the drivers must be able to interpret the contents of data buffers that they receive from the target.

Local I/O Targets
Drivers often send I/O requests to the next-lower driver in the driver stack. Therefore, each UMDF-based driver has a default I/O target for each device, which is the device's next-lower driver. The default I/O target for the lowest-level UMDF-based driver is the kernel-mode reflector.

Sometimes a UMDF-based driver must send I/O requests to a file-handle-based I/O target, such as a file or a network socket. Therefore, the framework also provides file-handle-based I/O target objects.

Both the default I/O target and file-handle-based I/O targets are called local I/O targets, because UMDF-based drivers use these targets to send I/O requests to devices that the driver stack supports.

Remote I/O Targets
Occasionally, a driver must send an I/O request to a different driver stack. Therefore, the framework also provides remote I/O targets, which consist of all of the I/O targets except local I/O targets.

A remote I/O target might be a device that the driver stack does not support, a file on that device, or a device interface for that device.

The following sections describe how to initialize and use a general I/O target: