delphishellexecutefindfirst

Cannot see/execute "c:\windows\system32\rdpclip.exe" from Delphi code, but can see it and execute it using the same user login in File Explorer


I am trying to execute c:\windows\system32\rdpclip.exe from my Delphi program (Delphi CE 10.4) on Windows 10.

I can see and execute this file just fine from Windows Explorer or from a CMD window, but when I try to use FileExists('c:\windows\system32\rdpclip.exe') it comes back with error 2 (file not found). If I use ShellExecute() to start it, I get file not found as well.

I can see and execute c:\windows\system32\cmd.exe from my Delphi code just fine. No special attributes are set on rdpclip.exe - they are the same as those on cmd.exe. The user ID is a member of local administrators, and UAC control is set to "Disable" running all admins in admin approval mode.

I also found that if I list the contents of the c:\windows\system32 folder using FindFirst()/FindNext(), a lot of files (including rdpclip.exe) are not listed, while others are (for example, rdpsa.exe shows up in the list, while rdpclip.exe does not).

rdpclip.exe shows up in File Explorer, and can be started manually from the "Run" prompt in Windows. It is NOT visible in my Delphi program using ShellExecute() or FindFirst()/FindNext().

Other files in the same folder (cmd.exe, rdpsa.exe) are visible, and can be executed from the same Delphi program, using the same line of code (just changing the file name).

The expectation was, of course, that my Delphi program would behave the same way as File Explorer in Windows behaves.

File attributes are no different on all of those files, and effective access control shows that the current user has read/execute to all of the files in question.


Solution

  • The reason why your program is not finding rdpclip.exe file is beacuse on 64 bit version of windows folder Windows\System32 doesn't actually hold any 32 bit libraries or programs as one might expect but instead it contains all 64 bit libraries and programs.

    32 bit libraries and programs can actually be located in Windows\SysWOW64 folder instead. So when any 32 bit application is trying to access System32 folder it is automatically redirected into Sys64WOW folder. And if you check the Sys64WOW folder you will see that there is no rdpclip.exe file located there.

    I recommend you read more about File System Redirector to better understand your problem.


    EDIT: You can avoid System32 folder redirection by using Sysnative as it is explained in Could not find system file when it actually exists