You might try getting the Device Name and ID with calls to KernelIoControl
calls passing in IOCTL_HAL_GET_DEVICEID
. There's an example on MSDN. That might be able to determine the handheld model.
As for the printers, it's unlikely you can tell the difference - though it depends on how exactly they're connected. If it's serial there's no way. If it's USB, it's unlikely unless they use different drivers. If it's networked, then it's not going to happen. If it's Bluetooth, maybe the device name has a pattern based on model you can use.