The current implementation includes a check on param->bytes >= bytes
specifically:
if (data && param->bytes >= bytes) {
...
}
So if bytes<param->bytes returns D3DERR_INVALIDCALL.
However, the MS version does not act that way: If the parameter is shorter than the length of the data, then the data that fits in the parameter is put and returns D3D_OK
Therefore, the check of the size should be eliminated and in memcpy instead of referring to bytes, it should refer to min(bytes, param->bytes)
Luis