Back to Parsec Vdd

C/C++ API Usage

docs/VDD_LIBRARY_USAGE.md

0.45.13.9 KB
Original Source

C/C++ API Usage

This document describes how to use the Parsec Virtual Display Driver (VDD) C/C++ API, as defined in core/parsec-vdd.h. For full project details, see the README and PARSEC_VDD_SPECS.md. For code example, see core/vdd-demo.cc.


Overview

Parsec VDD enables creation and management of virtual displays on Windows 10+ systems. The C/C++ API allows direct control over the driver, including querying status, adding/removing displays, and updating device state.

  • Up to 8 virtual displays per adapter (default).
  • Supports high resolutions and refresh rates (see the specs).
  • Can be used independently of the Parsec app.

Check out the README to install the driver.


API Reference

With C++ include, you should add using namespace parsec_vdd.

Device Status

c
enum DeviceStatus {
    DEVICE_OK = 0,             // Ready to use
    DEVICE_INACCESSIBLE,       // Inaccessible
    DEVICE_UNKNOWN,            // Unknown status
    DEVICE_UNKNOWN_PROBLEM,    // Unknown problem
    DEVICE_DISABLED,           // Device is disabled
    DEVICE_DRIVER_ERROR,       // Device encountered error
    DEVICE_RESTART_REQUIRED,   // Must restart PC to use (could ignore but would have issue)
    DEVICE_DISABLED_SERVICE,   // Service is disabled
    DEVICE_NOT_INSTALLED       // Driver is not installed
};

Query Device Status

c
DeviceStatus QueryDeviceStatus(const GUID *classGuid, const char *deviceId);
  • Checks the status of a device by class GUID and hardware ID.
  • Returns a DeviceStatus value.

Device Handle Management

Open Device Handle

c
HANDLE OpenDeviceHandle(const GUID *interfaceGuid);
  • Opens a handle to the device interface.
  • Returns INVALID_HANDLE_VALUE or a valid handle.

Close Device Handle

c
void CloseDeviceHandle(HANDLE handle);
  • Closes a previously opened device handle.

VDD Core Operations

Constants

ConstantValueDescription
VDD_DISPLAY_ID"PSCCDD0"Display device ID
VDD_DISPLAY_NAME"ParsecVDA"Display name
VDD_ADAPTER_GUID{00b41627-04c4-429e-a26e-0265cf50c8fa}Adapter GUID
VDD_CLASS_GUID{4d36e968-e325-11ce-bfc1-08002be10318}Device class GUID
VDD_HARDWARE_ID"Root\\Parsec\\VDA"Hardware ID
VDD_MAX_DISPLAYS8Maximum virtual displays

IOCTL Codes

c
enum VddCtlCode {
    VDD_IOCTL_ADD     = 0x0022e004,
    VDD_IOCTL_REMOVE  = 0x0022a008,
    VDD_IOCTL_UPDATE  = 0x0022a00c,
    VDD_IOCTL_VERSION = 0x0022e010,
    VDD_IOCTL_UNKONWN = 0x0022a00c,
};

Generic DeviceIoControl

c
DWORD VddIoControl(HANDLE vdd, VddCtlCode code, const void *data, size_t size);
  • Sends an IOCTL to the VDD device.

Query Driver Version

c
int VddVersion(HANDLE vdd);
  • Returns the minor version of the VDD driver.

Update/Ping VDD

c
void VddUpdate(HANDLE vdd);
  • Should be called periodically (<100ms) to keep displays alive.

Add Virtual Display

c
int VddAddDisplay(HANDLE vdd);
  • Adds a new virtual display.
  • Returns the index of the added display.

Remove Virtual Display

c
void VddRemoveDisplay(HANDLE vdd, int index);
  • Removes the display at the given index.

Example Usage

Check out core/vdd-demo.cc.


Display Modes & Specs

See PARSEC_VDD_SPECS.md for supported resolutions and refresh rates.

Further Reading