DirectInput provides a way to control device-specific effects. This is useful for hardware vendors who have extra effects that are not directly supported by DirectInput.
The hardware vendor must provide a GUID identifying the device-specific effect and may provide a custom structure for the type-specific parameters of the effect. Your application then must initialize a DIEFFECT structure and a type-specific structure, just as with any other effect. You then call the IDirectInputDevice2::CreateEffect method, passing the device-specific GUID and a pointer to the DIEFFECT structure.
When you obtain information about a device-specific effect in a DIEFFECTINFO structure, the low byte of the dwEffType member (DIEFT_GETTYPE(dwEfftype)) indicates which of the predefined DirectInput effect categories (constant force, ramp force, periodic, or condition) the effect falls into. If it does not fall into any of the predefined categories, then the value is DIEFT_HARDWARE.
If a device-specific effect falls into one of the predefined categories, then the lpvTypeSpecificParams member of the DIEFFECT structure must point to the corresponding DICONSTANTFORCE, DIRAMPFORCE, DIPERIODIC, or DICONDITION structure, and the cbTypeSpecificParams member must be equal to the size of that structure.
If the (DIEFT_GETTYPE(dwEfftype) == DIEFT_HARDWARE), then the values of the lpvTypeSpecificParams and cbTypeSpecificParams members depend on whether the effect requires custom type-specific parameters. If it does, then these values must refer to the appropriate structure defined in the manufacturer's header file and declared and initialized by your application. If the effect does not require custom parameters – that is, if the dwStaticParms member of the DIEFFECTINFO structure for the hardware effect does not have the DIEP_TYPESPECIFICPARAMS flag – then lpvTypeSpecificParams must be NULL and cbTypeSpecificParams must be zero.
DirectInput passes the GUID and the LPDIEFFECT to the device driver for verification. If the GUID is unknown, the device will return DIERR_DEVICENOTREG. If the GUID is known but the type-specific data is incorrect for that effect, the device will return DIERR_INVALIDPARAM.