Enumerating WPD devices (Part 2)

In part 1 we obtained a list of available WPD devices (the device paths to be precise). In this part, we'll use this device path with the IPortableDeviceManager interface to get basic information about the device.

 // cdwDevices contains the number of connected devices
// and also provides the length of ppszDeviceListArray
for (DWORD i = 0; i < cdwDevices; i++)
{
    LPCWSTR pwszDevicePath = ppszDeviceListArray[i];

    // These methods require caller-allocated buffers
    const DWORD MAX_CHARS = 255;
    WCHAR wszInfo[MAX_CHARS + 1] = {0};

    printf("Device %d:\n", i + 1);
  
    // Retrieve the device friendly name
    hr = spDevMgr->GetDeviceFriendlyName(pwszDevicePath, wszInfo, MAX_CHARS);
    if (hr == S_OK)
    {
        printf("\tFriendly Name: %ws\n", wszInfo);
    }

    // Retrieve the device description
    hr = spDevMgr->GetDeviceDescription(pwszDevicePath, wszInfo, MAX_CHARS);
    if (hr == S_OK)
    {
        printf("\tDescription: %ws\n", wszInfo);
    }

    // Retrieve the device manufacturer
    hr = spDevMgr->GetDeviceManufacturer(pwszDevicePath, wszInfo, MAX_CHARS);
    if (hr == S_OK)
    {
        printf("\tManufacturer: %ws\n", wszInfo);
    }
}

 IPortableDeviceManager also exposes a GetDeviceProperty method meant for use by device vendors that add additional properties on the device node via their INF.

[Thanks to CooperP for the stimulus to revive this blog :)]