Merci Chrisr et Marc56
J’avais bien compris que tout prg en 32 bits subit la redirection vers SYSWOW64 pour des besoins de transparence et de compatibilité.
Mais loin de moi de penser que microsoft bascule aussi tout appel externe au produit à l’un de ces répertoires.
Il faut donc une grosse bidouille pour accéder sous un prg 32 bit au répertoire system32 réservé en priorité aux prg 64bits.
J’ai tester les deux algos de redirection ils fonctionnent parfaitement bien.
Pour des pb de pédagogie j’ai gardé le deuxième ici comme exemple.
Code : Tout sélectionner
Global I32,I64
Procedure SYS32()
Repertoire$ = "c:\windows\system32\"
If ExamineDirectory(0, Repertoire$, "net*.*")
i32=0
While NextDirectoryEntry(0)
Debug DirectoryEntryName(0)
i32+1
Wend
FinishDirectory(0)
EndIf
prg=RunProgram("d:\dirtot.bat")
EndProcedure
Debug "*****************************************************"
Procedure SYS64()
Repertoire$ = "c:\windows\sysWOW64\"
If ExamineDirectory(0, Repertoire$, "net*.*")
i64=0
While NextDirectoryEntry(0)
Debug DirectoryEntryName(0)
I64+1
Wend
FinishDirectory(0)
EndIf
EndProcedure
sys32()
Debug "*****************************************************"
sys64()
Debug "i32="+Str(i32)+" i64="+Str(i64)
Debug "********************** APRES REDIRECTION *******************************"
CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
Procedure DisableWow64FsRedirection()
Protected IsWow64ProcessFlag, Flag
OpenLibrary(0, "Kernel32.dll")
If IsLibrary(0)
GetFunction(0, "IsWow64Process")
CallFunction(0, "IsWow64Process", GetCurrentProcess_(), @IsWow64ProcessFlag)
If IsWow64ProcessFlag <> 0 And SizeOf(Integer) = 4
GetFunction(0, "Wow64DisableWow64FsRedirection")
CallFunction(0, "Wow64DisableWow64FsRedirection", Flag)
EndIf
sys32()
Debug "*****************************************************"
sys64()
Debug "i32="+Str(i32)+" i64="+Str(i64)
CloseLibrary(0)
EndIf
EndProcedure
Procedure RevertWow64FsRedirection()
Protected IsWow64ProcessFlag, Flag
OpenLibrary(0, "Kernel32.dll")
If IsLibrary(0)
GetFunction(0, "IsWow64Process")
CallFunction(0, "IsWow64Process", GetCurrentProcess_(), @IsWow64ProcessFlag)
If IsWow64ProcessFlag <> 0 And SizeOf(Integer) = 4
GetFunction(0, "Wow64RevertWow64FsRedirection")
CallFunction(0, "Wow64RevertWow64FsRedirection", Flag)
EndIf
CloseLibrary(0)
EndIf
EndProcedure
;#KEY_WOW64_64KEY 0x0100 Access a 64-bit key from either a 32-bit Or 64-bit application.
;#KEY_WOW64_32KEY 0x0200 Access a 32-bit key from either a 32-bit Or 64-bit application.
CompilerEndIf
CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
DisableWow64FsRedirection()
CompilerEndIf
Par ailleurs j’ai continué à explorer les divers logiciels gratuits comme explorateur. Les résultats sont divers
Powerdesk donne les mêmes résultats sur les deux répertoires !!! explorer de windo10 donne des résultats différents sur les deux répertoires Total_Commander donne des résultats mitigés etc…
Cela ne m’étonne pas car avec la traduction que Chrisr a envoyé
Redirecteur de système de fichiers
• 31/05/2018
• 3 minutes de lecture
Le répertoire% windir% \ system32 est réservé aux applications 64 bits sur Windows 64 bits. La plupart des noms de fichiers DLL n’ont pas été modifiés lors de la création de versions 64 bits des dll. par conséquent, les versions 32 bits des dll sont stockées dans un répertoire différent. WOW64 masque cette différence à l’aide d’un redirecteur de système de fichiers.
Dans la plupart des cas, chaque fois qu’une application 32 bits tente d’accéder à% windir% \ system32,% windir% \ LastGood \ system32 ou% windir% \regedit.exe, l’accès est redirigé vers un chemin d’accès spécifique à l’architecture.
Notes
Ces chemins d’accès sont fournis à des fins de référence uniquement. Pour des fins de compatibilité, les applications ne doivent pas utiliser ces chemins directement. Au lieu de cela, ils doivent appeler les API décrites ci-dessous.
Table 1
Chemin d’accès d’origine Chemin Redirigé pour les processus x86 32 bits Chemin Redirigé pour les processus ARM 32 bits
% windir% \ system32 % windir% \ SysWOW64 % windir% \ SysArm32
% windir% \ LastGood \ system32 % windir% \ LastGood \ SysWOW64 % windir% \ LastGood \ SysArm32
% windir% \regedit.exe % windir% \ SysWOW64 \regedit.exe % windir% \ SysArm32 \regedit.exe
Si l’accès amène le système à afficher l’invite du contrôle de compte d’utilisateur, la redirection n’a pas lieu. Au lieu de cela, la version 64 bits du fichier demandé est lancée. Pour éviter ce problème, spécifiez le répertoire SysWOW64 pour éviter la redirection et assurez-vous d’accéder à la version 32 bits du fichier, ou exécutez l’application 32 bits avec des privilèges d’administrateur pour que l’invite UAC ne s’affiche pas.
•
o Windows Server 2003 et Windows XP : * * le contrôle de compte d’utilisateur n’est pas pris en charge.
Certains sous-répertoires sont exempts de redirection. L’accès à ces sous-répertoires n’est pas redirigé vers% windir% \ SysWOW64 :
% windir% \ system32 \ CatRoot
% windir% \ system32 \ Catroot2
% windir% \ system32 \ DriverStore
% windir% \ system32 \ drivers, \ etc.
% windir% \ system32 \ LogFiles
% windir% \ system32 \ spool
•
o Windows Server 2008, Windows Vista, Windows Server 2003 et Windows XP : * *% windir% \ system32 \ DriverStore est redirigé.
On voit que la bidouille est de rigueur.
A+