I'm not micro or ubisoft, but I did the following:
Per default all actions have been mapped to keyboard + mouse because I assumed that these are always present.
Once a controller appeared on DirectInput I did the following:
if it was an unkown controller I popped up a config-dialog and let the user assing/test the config. The button/axis to event-mapping was saved (along with a hash of device-name, driver-hash and user-name) to an internal config.
if it was a known controller (e.g. the user has alredy configured it) I used the mapping of it to override the default key/mouse inputs.
That worked pretty well and allowed the user to use different input devices for their game. Even multiple input-devices at once.
Something I still remember was how hard it was to write stable and failsafe DirectInput code. If you are going to write such code I suggest to buy a hand full of different controllers. The cheaper they are, the more fun it is to get them working.
A little horror-story: a PS2-Pad to USB converter thing from asia returned strings in unicode-format every once in a while. All strings were defined as char*, so my buffers have *sometimes* been to small. I never found out under which circumstances the driver did this, but the problem never occured as long as visual studio was running
Same controller also disconnected and connected itself every couple of minutes (and switched between unicode and ascii device name reporting). Finding the occasional crash in my code was a *lot* of fun. I learned quite a bit about remote-debugging that way.