Skip to content

Latest commit

 

History

History
142 lines (100 loc) · 3.94 KB

File metadata and controls

142 lines (100 loc) · 3.94 KB

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

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

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

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

Close Device Handle

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

VDD Core Operations

Constants

Constant Value Description
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_DISPLAYS 8 Maximum virtual displays

IOCTL Codes

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

Generic DeviceIoControl

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

Query Driver Version

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

Update/Ping VDD

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

Add Virtual Display

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

Remove Virtual Display

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