Device Error Codes

The InvokeAction and QueryStateVariable methods return HRESULT values that might indicate a device error (that is, an error that is received from a UPnP-certified device). If an error is received from a device, the method (InvokeAction or QueryStateVariable) returns an HRESULT value that is based on the device error code, as explained in this topic. Because a conversion is applied to the device error code to produce an HRESULT value, you cannot read the device error code directly from the HRESULT value.

Conversion of a Device Error Code to an HRESULT

There are both standard and non-standard device error codes. The standard codes have the same meaning across all UPnP-certified devices and have values that are less than 600. The non-standard codes are vendor-specific and have values ranging from 600 through 899.

Whether or not the device error code is standard determines how the HRESULT value is generated:

  • A standard device error code is mapped to an HRESULT value.
  • A non-standard device error code is embedded in the HRESULT value by applying a formula.

Both of these procedures can be reversed to determine the device error code from a particular HRESULT value.

Deriving a Device Error Code from an HRESULT Value

If the HRESULT value is greater than or equal to UPNP_E_ACTION_SPECIFIC_BASE (0x80040300) and less than or equal to UPNP_E_ACTION_SPECIFIC_MAX (0x8004042B), the device error code is nonstandard — use the formula in the following section to determine the error code. Otherwise, the device error code is standard — use the table in the Mapping for Standard Device Error Codes section, which provides the mapping from the HRESULT value to the device error code.

For a text description of the error after a call to IUPnPService::InvokeAction, set the pvarRetVal parameter to an empty array. Upon return, this parameter will contain a text description of the error, if any occurred.

Formula for Nonstandard Device Error Codes

Use the following formula if UPNP_E_ACTION_SPECIFIC_BASEHRESULTUPNP_E_ACTION_SPECIFIC_MAX.

Device Error Code = (HRESULT - UPNP_E_ACTION_SPECIFIC_BASE) + FAULT_ACTION_SPECIFIC_BASE

Substituting the actual numeric values, the equation is: Device Error Code = (HRESULT - 0x80040300) + 0x0258

Mapping for Standard Device Error Codes

Use the following mapping if HRESULT < UPNP_E_ACTION_SPECIFIC_BASE.

HRESULT value Device Error Code Actual value
UPNP_E_INVALID_ACTION FAULT_INVALID_ACTION 401
UPNP_E_INVALID_ARGUMENTS FAULT_INVALID_ARG 402
UPNP_E_OUT_OF_SYNC FAULT_INVALID_SEQUENCE_NUMBER 403
UPNP_E_INVALID_VARIABLE FAULT_INVALID_VARIABLE 404
UPNP_E_ACTION_REQUEST_FAILED FAULT_DEVICE_INTERNAL_ERROR 501

 

More Information

Device error codes are specified in "UPnP Device Architecture version 1.0". The constants mentioned in this topic are defined in the files Upnp.h and Upnp.idl.