WELL... I'd go with readlink() on *NIX systems, but if it MUST run on windows and cope with windows links, then if you open the .lnk file, there should be a complete path to whatever you're looking in about 200-300 bytes in. If you just snarf the whole file (it's a links, it shouldn't be all that big) and then regex the bugger (UNTESTED!):