I think you cannot universally code this "without using mount point" no matter what you do.
Here is the why.
For example, I use mount points for all removable devices I use on regular basis -- this is very convenient and allows me working with just one logical drive where I mount everything (almost like in Unix).
Every time I plug in such device, it is recognized as unique known device be the plug-in-play mechanism and is re-mounted in exact same way if it was mounted to a mount point last time. It is not shown as a disk drive until you remove the mount explicitly.
You cannot disable or change this in the application code (for a good reason). So, if you need your application to work on all systems, you should re-formulate your task: how to open a file on USB device, mounted This is not a problem per se, the problem is criteria what location of the file to look for, but any limitations are useless: it can be removable drive #1, removable drive #2, mount point #1, mount point #2, etc.
For drives, you can identify if it is removable or not:
UINT WINAPI GetDriveType(
__in_opt LPCTSTR lpRootPathName
);
If this API returns
DRIVE_REMOVABLE
it is removable.
You should ask yourself how do you want to define this location, no more no less.