ID: 48746 Comment by: phpstuff at cresstone dot com Reported By: ddkees at illinois dot edu Status: Feedback Bug Type: Directory function related Operating System: win32 only - Windows Server 2003 PHP Version: 5.3.0 Assigned To: pajoye New Comment:
Ok, this snap seems to get everything except mounted volumes for me. test output is now: C:\mnt\test>php phptest.php directory: bool(true) junction.exe junction: bool(true) mklink junction: bool(true) mounted volume: bool(false) I've found 3 ways to create volume junction points on Win 7: Through the mountvol command, thourgh the mklink command, and though the diskmgmt.msc GUI. They all result in the same behavior. I also just found that mklink can create symlinks to volumes, which, alas, also fail. (symlinks to directories & files work fine) 'dir' command for symlinks vs. junctions to volumes looks like this: 2009.08.27 15.18 <SYMLINKD> test2 [\\?\Volume{c7981ed5-d602-11dd-ac24-806e6f6e6963}\] 2009.08.27 15.19 <JUNCTION> test3 [\\?\Volume{c7981ed5-d602-11dd-ac24-806e6f6e6963}\] For the record, the following command sequence can be used to re-create my test setup... c:\mnt & c:\mnt\test are regular directories. C:\mnt\test>mkdir directory C:\mnt\test>junction junction directory Junction v1.05 - Windows junction creator and reparse point viewer Copyright (C) 2000-2007 Mark Russinovich Systems Internals - http://www.sysinternals.com Created: C:\mnt\test\junction Targetted at: C:\mnt\test\directory C:\mnt\test>mklink /j mklink_junction directory Junction created for mklink_junction <<===>> directory C:\mnt\test>mklink /j mounted_volume \\?\Volume{c7981ed5-d602-11dd-ac24-806e6f6e6963}\ Junction created for mounted_volume <<===>> \\?\Volume{c7981ed5-d602-11dd-ac24-806e6f6e6963}\ C:\mnt\test>dir Volume in drive C is coreI7_System Volume Serial Number is 38E2-2B62 Directory of C:\mnt\test 2009.08.27 15.29 <DIR> . 2009.08.27 15.29 <DIR> .. 2009.08.27 15.27 <DIR> directory 2009.08.27 15.27 <JUNCTION> junction [\??\C:\mnt\test\directory] 2009.08.27 15.28 <JUNCTION> mklink_junction [C:\mnt\test\directory] 2009.08.27 15.29 <JUNCTION> mounted_volume [\\?\Volume{c7981ed5-d602-11dd-ac24-806e6f6e6963} \] 2009.08.27 15.23 451 phptest.php 1 File(s) 451 bytes 6 Dir(s) 28,746,731,520 bytes free C:\mnt\test>php phptest.php directory: bool(true) junction.exe junction: bool(true) mklink junction: bool(true) mounted volume: bool(false) Thanks for your work on this, unfortunately, my inability to keep track of drive letters means I use a lot of mounted volumes... Previous Comments: ------------------------------------------------------------------------ [2009-08-27 09:50:22] paj...@php.net And confirmed your last cases using Win7/Vista/2k8. In this case junction are prepended with \??\. Fix applied, the next snap should have it. ------------------------------------------------------------------------ [2009-08-27 09:39:02] s...@php.net Automatic comment from SVN on behalf of pajoye Revision: http://svn.php.net/viewvc/?view=revision&revision=287800 Log: - Fix for #48746, fix mounted volume and junctions when used from vista or later, they are actually prepended with \??\ ------------------------------------------------------------------------ [2009-08-27 09:24:03] paj...@php.net To do not miss a case again, can you please tell me how you create each mounted volume or junction? If mnt is a mounted volume or not, etc. Junction created with junction.exe works fine here on xp, 2k3, win7, vista and 2k8, using normal parent directories (mounted volume or not). For example (XP): c:\mnt mounted volume (HDD) c:\mnt\directory (mkdir directory) c:\mnt\junction_abs (created with junction junction c:\mnt\directory) c:\mnt\junction (created with junction junction directory from c:\mnt) Using this script from c:\mnt\test (c:\mnt being a mounted volume): <?php var_dump(file_exists('directory')); var_dump(file_exists('junction_abs')); var_dump(file_exists('junction')); C:\mnt\test>\php-sdk\snap_5_2\vc6\x86\php52\Debug\php.exe t.php bool(true) bool(true) bool(true) ------------------------------------------------------------------------ [2009-08-27 08:42:54] paj...@php.net "\??\" may be the cause (\\?\ is well documented not \??\). But I wonder why junction.exe jucntion work just fine on our tests system (xp and 2k3). Thanks for testing, I go back to code&test. ------------------------------------------------------------------------ [2009-08-27 03:40:39] phpstuff at cresstone dot com >From my testing, this snapshot works for directory junction points created with mklink. However still no go on mounted volumes or directory junction points created with junction.exe. Re-creating any faulting junctions with mklink seems like a good workaround, but mounted volumes are still left in the cold. Looking at the output of the dir command, the only visible difference between mklink and junction.exe is the prepended "\??\", which is also present on mounted volumes by necessity. Full test log follows: C:\mnt\test>dir Volume in drive C is coreI7_System Volume Serial Number is 38E2-2B62 Directory of C:\mnt\test 2009.08.26 23.32 <DIR> . 2009.08.26 23.32 <DIR> .. 2009.08.11 16.35 <DIR> directory 2009.08.11 14.47 <JUNCTION> junction [\??\C:\mnt\test\directory] 2009.08.20 13.26 <JUNCTION> mklink_junction [C:\mnt\test\directory] 2009.08.26 23.26 <JUNCTION> mounted_volume [\??\Volume{e13ba66a-14db-11de-8e96-001fd0ae05ac} \] 2009.08.26 23.32 283 phptest.php 1 File(s) 283 bytes 6 Dir(s) 28,765,544,448 bytes free C:\mnt\test>php -v PHP 5.3.1-dev (cli) (built: Aug 27 2009 03:52:14) Copyright (c) 1997-2009 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies C:\mnt\test>type phptest.php <?php echo "directory:\t\t"; var_dump(file_exists("directory")); echo "junction.exe junction:\t"; var_dump(file_exists("junction")); echo "mklink junction:\t"; var_dump(file_exists("mklink_junction")); echo "mounted volume:\t\t"; var_dump(file_exists("mounted_volume")); ?> C:\mnt\test>php phptest.php directory: bool(true) junction.exe junction: bool(false) mklink junction: bool(true) mounted volume: bool(false) ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at http://bugs.php.net/48746 -- Edit this bug report at http://bugs.php.net/?id=48746&edit=1