A workaround for Windows LNK files:
{
if(is_link($filename))
returntrue;$ext=substr(strrchr($filename,'.'),1);
if(strtolower($ext) =='lnk')
{
return (_readlink($filename) ?true:false);
}
returnfalse;
}
function_readlink($file)
{
if(file_exists($file))
{
if(is_link($file))
{
returnreadlink($file);
}// Get file content$handle=fopen($file,"rb");$buffer= array();
while(!feof($handle))
{$buffer[] =fread($handle,1);
}fclose($handle);// Test magic value and GUIDif(count($buffer) <20)
returnfalse;
if($buffer[0] !='L')
returnfalse;
if((ord($buffer[4]) !=0x01) ||
(ord($buffer[5]) !=0x14) ||
(ord($buffer[6]) !=0x02) ||
(ord($buffer[7]) !=0x00) ||
(ord($buffer[8]) !=0x00) ||
(ord($buffer[9]) !=0x00) ||
(ord($buffer[10]) !=0x00) ||
(ord($buffer[11]) !=0x00) ||
(ord($buffer[12]) !=0xC0) ||
(ord($buffer[13]) !=0x00) ||
(ord($buffer[14]) !=0x00) ||
(ord($buffer[15]) !=0x00) ||
(ord($buffer[16]) !=0x00) ||
(ord($buffer[17]) !=0x00) ||
(ord($buffer[18]) !=0x00) ||
(ord($buffer[19]) !=0x46))
{
returnfalse;
}$i=20;
if(count($buffer)
returnfalse;$flags=ord($buffer[$i]);$flags=$flags| (ord($buffer[++$i]) <<8);$flags=$flags| (ord($buffer[++$i]) <<16);$flags=$flags| (ord($buffer[++$i]) <<24);$hasShellItemIdList= ($flags&0x00000001) ?true:false;$pointsToFileOrDir= ($flags&0x00000002) ?true:false;
if(!$pointsToFileOrDir)
returnfalse;
if($hasShellItemIdList)
{$i=76;
if(count($buffer)
returnfalse;$a=ord($buffer[$i]);$a=$a| (ord($buffer[++$i]) <<8);
}$i=78+4+$a;
if(count($buffer)
returnfalse;$b=ord($buffer[$i]);$b=$b| (ord($buffer[++$i]) <<8);$b=$b| (ord($buffer[++$i]) <<16);$b=$b| (ord($buffer[++$i]) <<24);$i=78+$a+$b;
if(count($buffer)
returnfalse;$c=ord($buffer[$i]);$c=$c| (ord($buffer[++$i]) <<8);$c=$c| (ord($buffer[++$i]) <<16);$c=$c| (ord($buffer[++$i]) <<24);$i=78+$a+$b+$c;
if(count($buffer)
returnfalse;$linkedTarget="";
for(;$i
{
if(!ord($buffer[$i]))
break;$linkedTarget.=$buffer[$i];
}
if(empty($linkedTarget))
returnfalse;
return$linkedTarget;
}
returnfalse;
}
if(_is_link('test.lnk'))
{
echo_readlink('test.lnk');
}?>