Use separate shared operation for devices, device struct now filled in by specific functions
This allows for MSVC to 'continue' compiling and for developers not to suffer when adding a field to device_id struct