IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Registre Sauvegarde clés (.reg) sous Windows 64 bits à partir application 32 bits


Sujet :

Langage Delphi

  1. #1
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 011
    Points : 2 078
    Points
    2 078
    Par défaut Registre Sauvegarde clés (.reg) sous Windows 64 bits à partir application 32 bits
    Bonjour,
    Avant de modifier des clés dans [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\NetworkList\ je veux sauvegarder.
    Avec Registry.Savekey (et SeBackupPrivilege ) ça marche.
    Mais je voudrai également sauvegarder au format ".reg" pour afficher dans un mémo les clés avant et après modification (sécurisant et pédagogique). Mais la je bloque.
    Pour cela j’utilise Reg.exe en paramètre de cmd.exe lancé par shellexecute

    (code simplifié )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    procedure TForm2.SauvegardeRegistre_Bug;
    var
      SEInfo: TShellExecuteInfo;
    begin
      FillChar(SEInfo, SizeOf(SEInfo), 0);
      SEInfo.cbSize := SizeOf(TShellExecuteInfo);
     
      with SEInfo do
      begin
        fMask := SEE_MASK_NOCLOSEPROCESS;
        Wnd := Application.Handle;
        lpVerb := PChar('runas');
        lpFile := PChar('cmd.exe');
        lpParameters :=
          PChar('/k REG.exe EXPORT "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList" "c:\aa\NetWorkListBug.txt" /y');
        nShow := SW_SHOWNORMAL;
      end;
      ShellExecuteEx(@SEInfo)
    end;
    Résultat :
    Un fichier de sauvegarde est créé mais il ne comporte qu’une ligne, alors qu’il devrait en comporter 68. Il n’y a pas de message d’erreur et dans la fenêtre de commande Il est indiqué « L’opération a réussi »
    Contenu du fichier de sauvegarde :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Windows Registry Editor Version 5.00
     
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList]
    "FirstNetwork"=dword:00000001
    Contexte :
    Windows 8.1 64 bits, Delphi XE starter lancé en mode administrateur,
    le programme comporte un manifest pour mode administrateur,
    Une fonction testée et opérationnelle attribue le privilège. 'SeBackupPrivilege'

    Vérifications effectuées :
    A –Syntaxe de la ligne de commande :
    - Lancement de reg.exe par un fichier .bat exécuté depuis l’invite de commande en mode administrateur ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    REG.exe EXPORT "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles" "NetWorkListOk.txt"'
    Resultat Ok
    Contenu du fichier de sauvegarde :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    Windows Registry Editor Version 5.00
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles]
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles\{1D982609-2A7A-4321-91F2-2ECE4004EE6A}]
    "ProfileName"="Réseau"
    "Description"="Réseau"
    "Managed"=dword:00000000
    "Category"=dword:00000000
    "DateCreated"=hex:dd,07,01,00,06,00,0c,00,10,00,2c,00,38,00,a4,00
    "NameType"=dword:00000006
    "DateLastConnected"=hex:dd,07,01,00,06,00,0c,00,11,00,0e,00,1a,00,66,02
     
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles\{2793008C-913B-4E46-A9B1-65F56B9B3A56}]
    "ProfileName"="WANADOO-3922  3"
    "Description"="Réseau"
    "Managed"=dword:00000000
    "Category"=dword:00000001
    "DateCreated"=hex:de,07,01,00,03,00,08,00,0d,00,19,00,28,00,0a,03
    "NameType"=dword:00000047
    "DateLastConnected"=hex:de,07,07,00,01,00,07,00,07,00,33,00,02,00,3b,03
    "CategoryType"=dword:00000000
    Etc ….
    B –Avec le même code Delphi sauvegarde d’une clé "moins sensible" :
    ( crée pour le test)
    (code simplifié )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    procedure TForm2.SauvegardeRegistre_Ok;
    var
      SEInfo: TShellExecuteInfo;
    begin
      FillChar(SEInfo, SizeOf(SEInfo), 0);
      SEInfo.cbSize := SizeOf(TShellExecuteInfo);
     
      with SEInfo do
      begin
        fMask := SEE_MASK_NOCLOSEPROCESS;
        Wnd := Application.Handle;
        lpVerb := PChar('runas');
        lpFile := PChar('cmd.exe');
        lpParameters :=
        PChar('/k REG.exe EXPORT "HKCU\MacCleTest" "c:\aa\Macle.txt" /y' );
        nShow := SW_SHOWNORMAL;
      end;
      ShellExecuteEx(@SEInfo)
    end;
    Résultat Ok la sauvegarde est complète.
    Contenu du ficjier de sauvegarde :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Windows Registry Editor Version 5.00
     
    [HKEY_CURRENT_USER\MacCleTest]
     
    [HKEY_CURRENT_USER\MacCleTest\Exemple Clee Binaire]
    @="00 01 02 03 04 05"
    "FGFG"="Bonjour"
    "ABC"="Au revoir !"
     
    [HKEY_CURRENT_USER\MacCleTest\MaSouclé]
    "ValSousCle1"="Delphi"
    De tout cela je pense qu’il s’agit d’un problème de droit(s) et(ou) privilège(s) et(ou) permission(s)
    Je ne voudrais pas avoir a modifier les permissions des clés du registre a sauvegarder (si tant est que cela soit suffisant ...)
    Voilà. Une idée pour permettre la sauvegarde complète au format .reg ?

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 694
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 694
    Points : 13 130
    Points
    13 130
    Par défaut
    Citation Envoyé par gaby277 Voir le message
    De tout cela je pense qu’il s’agit d’un problème de droit(s) et(ou) privilège(s) et(ou) permission(s)
    Rien de tout ça

    La réponse est simple quoiqu'un peu tordue tout de même : il y a plusieurs reg.exe, 32 et 64 bits.

    Depuis l'invité de commande (et sans spécifier de répertoire), tu vas appeler la 64 bits (C:\Windows\System32) et bien sauvegarder la clé 64 bits située à HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles.
    Mais depuis ton application qui est en 32 bits, c'est la version reg.exe 32 bits (C:\Windows\SysWOW64) qui sera invoquée et c'est la clé HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles qui est lue.

    Pour contourner cela, il faut empêcher la redirection par Wow64DisableWow64FsRedirection juste avant ShellExecute et la remettre dans l'état d'origine après par Wow64RevertWow64FsRedirection.

  3. #3
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par gaby277 Voir le message
    Vérifications effectuées :
    A –Syntaxe de la ligne de commande :
    - Lancement de reg.exe par un fichier .bat exécuté depuis l’invite de commande en mode administrateur ) :
    Code bat : Sélectionner tout - Visualiser dans une fenêtre à part
    REG.exe EXPORT "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles" "NetWorkListOk.txt"'
    Resultat Ok
    Avec une fenêtre enligne de commande avec droits standards, vous auriez obtenu : Erreur : Accès refusé.
    Avez vous vérifié que la commande donnée dans votre code Delphi fonctionne ?
    Code bat : Sélectionner tout - Visualiser dans une fenêtre à part
    runas cmd.exe /k REG.exe EXPORT "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList" "c:\aa\NetWorkListBug.txt" /y
    Syntaxiquement, ce ne me parait pas correct...
    Philippe.

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 694
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 694
    Points : 13 130
    Points
    13 130
    Par défaut
    Bien sûr il y a ce passage par cmd.exe qui est inutile (un essai avec un .bat sans doute) mais le problème de redirection existe aussi pour lui (System32 ou SysWOW64)

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 011
    Points : 2 078
    Points
    2 078
    Par défaut Registre Sauvegarde clés (..reg)» sous Windows 64 bits à partir appli 32 bits.
    Bonjour à tous,
    Pour AndNotOr :
    Merci encore une fois pour la rapidité , la pertinence la clarté et la concision de la réponse.
    En fait j’étais parti dans la mauvaise direction … et je n’aurai sans doute pas trouvé seul.
    Je vais approfondir un peu tout ça …
    Ce qui n’est pas totalement clair pour moi c’est pourquoi j’arrivai a sauvegarder ma clé de test (crée avec les menus de regedit) et pourquoi j’arrive également à la lire avec la desactivation de la redirection. Bon on verra demain !

    Pour que la réponse soit plus facilement réutilisable je modifie l'intitulé
    Au lieu de
    « Sauvegarde clé (droit(s), permission(s), privilege(s) »
     «Registre Sauvegarde clés (.reg)» sous Windows 64 bits à partir appli 32 bits.»
    et je complète mon code

    Modification par rapport a une appli 32 bits sous Windows 32 bits :
    Dans l’unité de la procedure (fonction) déclarer les 2 fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Function Wow64DisableWow64FsRedirection(Var Wow64FsEnableRedirection: LongBool): LongBool; StdCall;
      External 'Kernel32.dll' Name 'Wow64DisableWow64FsRedirection';
     
    Function Wow64EnableWow64FsRedirection(Wow64FsEnableRedirection: LongBool): LongBool; StdCall;
      External 'Kernel32.dll' Name 'Wow64EnableWow64FsRedirection';
    Dans la procédure (ou fonction) qui sauvegarde les clés déclarer la variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Wow64FsEnableRedirection: LongBool;
    Avant l’appel à Shellexecute interdire la redirection registre avec
    Wow64DisableWow64FsRedirection(Wow64FsEnableRedirection);

    Juste apres rétablir impérativement la redirection du registre avec
    Wow64EnableWow64FsRedirection(Wow64FsEnableRedirection)

    Je squelette de code devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    procedure TForm2.SauvegardeRegistreFormatPointReg;
    // Le projet doit être lancé en mode administrateur
    var
      SEInfo: TShellExecuteInfo;
      Wow64FsEnableRedirection: LongBool;
    begin
      FillChar(SEInfo, SizeOf(SEInfo), 0);
      SEInfo.cbSize := SizeOf(TShellExecuteInfo);
     
      with SEInfo do
      begin
        fMask := SEE_MASK_NOCLOSEPROCESS;
        Wnd := Application.Handle;
        //lpVerb := PChar('runas');
        lpFile := PChar('cmd.exe');
        lpParameters :=
          PChar('/k REG.exe EXPORT "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList" "c:\aa\NetWorkList.txt" /y');
          // "/k" -> la fenetre reste ouverte "/c" -> la fenetre de commande se referme automatiquement
        nShow := SW_SHOWNORMAL;
      end;
      Wow64DisableWow64FsRedirection(Wow64FsEnableRedirection);
      ShellExecuteEx(@SEInfo);
      Wow64EnableWow64FsRedirection(Wow64FsEnableRedirection);
    end;

    Pour PH. B..

    - Dans le fichier .bat que j’ai testé en ligne de commande adminitrateur
    La ligne de commande est
    REG.exe EXPORT "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles
    La sauvegarde est Ok
    Il n’y a pas de « runas ». Avec il y a une erreur de syntaxe.

    Ne sachant pas exactement ce qui vous parait anormal je précise pour mémoire
    le "/k" laisse ouverte l’invite de commande (pour voir les messages de succès ou d’erreurs- contrairement au "/c" , le "/y" efface le fichier de sauvegarde, s’il existe, sans besoin de confirmer

    Dans le code Delphi pour shellexecute le lpVerb := PChar('runas'); que j’avais ajouté n’est pas nécessaire.


    Je viens de constater qu'en fait il est plus simple de lancer regedit directement ! (j'avais essayé initialement puis renoncé compte-tenu que reg.exe semblait plus ou moins marcher). Donc pas besoin de passer par cmd.exe !. Mais bien sur toujours avec la désactivation de la redirection avant shellexecute.
    il suffit de
    lpFile := PChar('Regedit.exe');
    lpParameters :=
    PChar('/e "c:\aa\regeditDelphi.txt" "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList"');

    Il est tard, Demain je fais le ménage !

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 011
    Points : 2 078
    Points
    2 078
    Par défaut Registre Sauvegarde clés (.reg)» sous Windows 64 bits à partir appli 32 bits.»
    Edit 10/07/14
    Suite à la remarque de AndnotOr :
    -
    • Ne plus utiliser 'Wow64EnableWow64FsRedirection' car en cas d’appels imbriqués fonction non fiable
    • à remplacer par ‘Wow64DisableWow64FsRedirection’ + ‘Wow64RevertWow64FsRedirection’
    • Ne pas mixer dans un même code ancienne fonction et nouvelles

    j’ai
    Pour le code contenant la fonction « deprecated » :
    -
    • Ajouté une ligne d’avertissement indiquant que la fonction est « deprecated »
    • Supprimé le mixage entre nouvelles et ancienne fonction
    • Conservé ce code simple et fonctionnel. Mais à utiliser éventuellement en toute connaissance de cause


    Rajouté le code pour les nouvelles fonctions de désactivation et réactivation de la redirection
    Ce code est disponible sur plusieurs sites par exemple
    http://codeverge.com/embarcadero.del...-win64/1048409
    http://www.delphisource.net/445.html
    Fin edit 10/07/14

    Synthèse de la discussion (avec l’aide décisive de AndNotOr ) :
    La sauvegarde de clés de registre au format « .reg » ( format .txt lisible avec un éditeur de texte) peut être réalisée avec Regedit.exe ou Reg.exe lancé par shellexecute (ou shellexecuteEx).

    Pour sauvegarder avec « Reg.exe » 2 variantes de shellexecute :
    1. - on lance implicitement la ligne de commande « cmd.exe »
    2. - on lance directement Reg.exe et c’est Windows qui se charge de lancer « cmd.exe »

    Pour une appli 32 bits sous Windows 64 bits il faut désactiver la redirection du registre avant shellexecute et la rétablir immédiatement après.
    Nota :
    La sauvegarde de clés peut être également effectuée via Tregistry.saveKey mais le fichier de sortie est alors au format binaire.

    Les 3 variantes de code//

    Code commun aux 3 variantes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // déclaration des 2 fonctions de redirection
    function Wow64DisableWow64FsRedirection(var Wow64FsEnableRedirection: LongBool):
      LongBool; StdCall;
    External 'Kernel32.dll' Name 'Wow64DisableWow64FsRedirection';
    function Wow64EnableWow64FsRedirection(Wow64FsEnableRedirection: LongBool):
      LongBool; StdCall;
    External 'Kernel32.dll' Name 'Wow64EnableWow64FsRedirection';
    Variante 1 Sauvegarde avec Regedit.exe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    procedure TForm2.SauvegardeRegistreFormatPointRegAvecRegedit_exe;
    // Le projet doit etre lancé en mode administrateur
    // Attention ce code utilise une fonction "deprecated"  Wow64DisableWow64FsRedirection(Wow64FsEnableRedirection);
     
    var
      SEInfo: TShellExecuteInfo;
      Wow64FsEnableRedirection: LongBool;
    begin
      FillChar(SEInfo, SizeOf(SEInfo), 0);
      SEInfo.cbSize := SizeOf(TShellExecuteInfo);
     
      with SEInfo do
      begin
        fMask := SEE_MASK_NOCLOSEPROCESS;
        Wnd := Application.Handle;
        //lpVerb := PChar('runas');
        lpFile := PChar('Regedit.exe');
        lpParameters :=
          PChar('/e "c:\aa\SvgrdAvecRegedit.reg" "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList"');
        nShow := SW_SHOWNORMAL;
        // La clé "racine"  doit etre  sous la forme complete "HKEY_LOCAL_MACHINE"
        // pas abrégée "HKLM"
      end;
      Wow64DisableWow64FsRedirection(Wow64FsEnableRedirection);
      ShellExecuteEx(@SEInfo);
      Wow64DisableWow64FsRedirection(Wow64FsEnableRedirection);
    end;
    Variante 2 Sauvegarde avec Reg.exe par l'intermediaire de cmd.exe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    procedure TForm2.SauvegardeRegistreFormatPointRegAvecReg_exeViaCmd_exe;
    // Le projet doit être lancé en mode administrateur
    // lancer explicitement cmd.exe permet de voire en cas de problèmes les messages de Reg.exe
    // Attention ce code utilise une fonction "deprecated"  Wow64DisableWow64FsRedirection(Wow64FsEnableRedirection);
     
    var
      SEInfo: TShellExecuteInfo;
      Wow64FsEnableRedirection: LongBool;
    begin
      FillChar(SEInfo, SizeOf(SEInfo), 0);
      SEInfo.cbSize := SizeOf(TShellExecuteInfo);
     
      with SEInfo do
      begin
        fMask := SEE_MASK_NOCLOSEPROCESS;
        Wnd := Application.Handle;
        //lpVerb := PChar('runas');
        lpFile := PChar('cmd.exe');
        // Deux syntaxes possibles pour la clé racine complete HKEY_LOCAL_MACHINE
        // Ou abrégée HKLM
            lpParameters :=
              PChar('/k REG.exe EXPORT "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList" "c:\aa\SvgrdAvecCmdReg_exe.reg" /y');
        //lpParameters :=
        //  PChar('/k REG.exe EXPORT "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList" "c:\aa\SvgrdAvecCmdReg_exe.reg" /y');
        // si "/k" -> la fenetre de commande reste ouverte (pour visualisation des messages
        // de reg.exe à remplacer par  "/c" -> pour fermeture de la fenetre de commande
         // automatique apres execution
        nShow := SW_SHOWNORMAL;
      end;
      Wow64DisableWow64FsRedirection(Wow64FsEnableRedirection);
      ShellExecuteEx(@SEInfo);
      Wow64DisableWow64FsRedirection(Wow64FsEnableRedirection);;
    end;
    Variante 3 Sauvegarde avec Reg.exe lancé directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    procedure TForm2.SauvegardeRegistreFormatPointRegAvecReg_exeDirectement;
    // Le projet doit être lancé en mode administrateur
    // C'est Windows qui va lancer cmd.exe (le parametre /k ne peut pas etre utilisé)
    // Attention ce code utilise une fonction "deprecated"  Wow64DisableWow64FsRedirection(Wow64FsEnableRedirection);
    var
      SEInfo: TShellExecuteInfo;
      Wow64FsEnableRedirection: LongBool;
    begin
      FillChar(SEInfo, SizeOf(SEInfo), 0);
      SEInfo.cbSize := SizeOf(TShellExecuteInfo);
     
      with SEInfo do
      begin
        fMask := SEE_MASK_NOCLOSEPROCESS;
        Wnd := Application.Handle;
        //lpVerb := PChar('runas');
        lpFile := PChar('reg.exe');
        // Deux syntaxes possibles pour la clé racine complete HKEY_LOCAL_MACHINE
        // Ou abrégée HKLM
        //    lpParameters :=
        //      PChar('/k REG.exe EXPORT "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList" "c:\aa\NetWorkList.reg" /y');
        lpParameters :=
          PChar('EXPORT "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList" "c:\aa\SvgrdAvecReg_exeDirect.reg" /y');
        nShow := SW_SHOWNORMAL;
      end;
      Wow64DisableWow64FsRedirection(Wow64FsEnableRedirection);
      ShellExecuteEx(@SEInfo);
       Wow64DisableWow64FsRedirection(Wow64FsEnableRedirection);
    end;
    CODE POUR NOUVELLES FONCTIONS
    Pour utiliser les nouvelles fonctions dans les 3 variantes de code
    Supprimer la déclaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function Wow64DisableWow64FsRedirection(var Wow64FsEnableRedirection: LongBool):
      LongBool; StdCall;
    External 'Kernel32.dll' Name 'Wow64DisableWow64FsRedirection';
    Inclure le code des 3 nouvelles fonctions
    (A partie de XE2 iswin64 serait intégré – a vérifier)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
     
    //Declaration des fonctions
    function DisableWowRedirection: Boolean;
    type
      TWow64DisableWow64FsRedirection = function(var Wow64FsEnableRedirection:
        LongBool): LongBool; StdCall;
    function RevertWowRedirection: Boolean;
    type
      TWow64RevertWow64FsRedirection = function(var
        Wow64RevertWow64FsRedirection: LongBool): LongBool; StdCall;
    function IsWin64: Boolean;
    // Fin declaration
     
    function IsWin64: Boolean;
    // Avant XE2 apres il y a plus simple
    // Source :
    //developpez.net/forums/d642605/environnements-developpement/delphi/langage/d7-savoir-version-windows-64bits-32bits/ //Dacid
    var
      KernelModule: HMODULE;
      GetNativeSystemInfoFunc: procedure(var lpSystemInfo: TSystemInfo); stdcall;
      IsWow64ProcessFunc: function(hProcess: THandle; var Wow64Process: BOOL): BOOL;
      stdcall;
      Wow64Process: BOOL;
      SysInfo: TSystemInfo;
     
      function AreFsRedirectionFunctionsAvailable: Boolean;
      var
        Wow64DisableWow64FsRedirectionFunc: function(var OldValue: Pointer): BOOL;
        stdcall;
        Wow64RevertWow64FsRedirectionFunc: function(OldValue: Pointer): BOOL;
        stdcall;
      begin
        Wow64DisableWow64FsRedirectionFunc :=
          GetProcAddress(GetModuleHandle(kernel32),
          'Wow64DisableWow64FsRedirection');
        Wow64RevertWow64FsRedirectionFunc :=
          GetProcAddress(GetModuleHandle(kernel32),
          'Wow64RevertWow64FsRedirection');
        Result := Assigned(Wow64DisableWow64FsRedirectionFunc) and
          Assigned(Wow64RevertWow64FsRedirectionFunc);
      end;
     
    begin
      { Le systeme est considéré comme "Win64" si toutes ces conditions sont respectées:
        1. GetNativeSystemInfo est valide.
        2. IsWow64Process est valide et returne vrai pour ce processus.
        3. Wow64DisableWow64FsRedirection est valide.
        4. Wow64RevertWow64FsRedirection est valide.
        5. GetSystemWow64DirectoryA est valide.
        6. RegDeleteKeyExA est valide. // }
      Result := False;
      KernelModule := GetModuleHandle(kernel32);
      GetNativeSystemInfoFunc := GetProcAddress(KernelModule,
        'GetNativeSystemInfo');
      if Assigned(GetNativeSystemInfoFunc) then
      begin
        GetNativeSystemInfoFunc(SysInfo);
        IsWow64ProcessFunc := GetProcAddress(KernelModule, 'IsWow64Process');
        if Assigned(IsWow64ProcessFunc) and IsWow64ProcessFunc(GetCurrentProcess,
          Wow64Process) and Wow64Process then
        begin
          if AreFsRedirectionFunctionsAvailable and (GetProcAddress(KernelModule,
            'GetSystemWow64DirectoryA') <> nil) and
            (GetProcAddress(GetModuleHandle(advapi32), 'RegDeleteKeyExA') <> nil)
              then
            Result := True;
        end;
      end;
      FreeLibrary(KernelModule);
    end;
    //Example
    //lbl1.Caption := IsWin64Or32;
     
     
    function DisableWowRedirection: Boolean;
    // nouvelle version de désativation de la redirection
    //http://codeverge.com/embarcadero.delphi.win32/start-cmd-on-win64/1048409
    type
      TWow64DisableWow64FsRedirection = function(var Wow64FsEnableRedirection:
        LongBool): LongBool; StdCall;
    var
      hHandle: THandle;
      Wow64DisableWow64FsRedirection: TWow64DisableWow64FsRedirection;
     
    begin
      Result := true;
      if not IsWin64 then
        exit;
      try
        hHandle := GetModuleHandle('kernel32.dll');
        @Wow64DisableWow64FsRedirection := GetProcAddress(hHandle,
          'Wow64DisableWow64FsRedirection');
     
        if ((hHandle <> 0) and (@Wow64DisableWow64FsRedirection <> nil)) then
          Wow64DisableWow64FsRedirection(Wow64FsEnableRedirection);
     
      except
        result := false;
      end;
    end;
     
    function RevertWowRedirection: Boolean;
    // // nouvelle version de réactivation de la redirection
    type
      TWow64RevertWow64FsRedirection = function(var
        Wow64RevertWow64FsRedirection: LongBool): LongBool; StdCall;
     
    var
      hHandle: THandle;
      Wow64RevertWow64FsRedirection: TWow64RevertWow64FsRedirection;
    begin
      Result := true;
      if not IsWin64 then
        exit;
      try
        hHandle := GetModuleHandle('kernel32.dll');
        @Wow64RevertWow64FsRedirection := GetProcAddress(hHandle,
          'Wow64RevertWow64FsRedirection');
     
        if ((hHandle <> 0) and (@Wow64RevertWow64FsRedirection <> nil)) then
          // Wow64RevertWow64FsRedirection(Wow64Redirection);
          Wow64RevertWow64FsRedirection(Wow64FsEnableRedirection);
     
      except
        result := false;
      end;
    end;
    Remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Wow64DisableWow64FsRedirection(Wow64FsEnableRedirection);
      ShellExecuteEx(@SEInfo);
      Wow64EnableWow64FsRedirection(Wow64FsEnableRedirection);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      DisableWowRedirection;
      ShellExecuteEx(@SEInfo);
      RevertWowRedirection;
    (Code testé sous Windows 8.1 64 bits et Delphi XE starter)

  7. #7
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 694
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 694
    Points : 13 130
    Points
    13 130
    Par défaut
    Citation Envoyé par gaby277 Voir le message
    on lance directement Reg.exe et c’est Windows qui se charge de lancer « cmd.exe »
    Non, reg.exe est simplement une application console


    Citation Envoyé par gaby277 Voir le message
    Wow64EnableWow64FsRedirection
    Fonction dépréciée et à éviter. Il y a d'ailleurs une mise en garde à ce sujet. Il faut utiliser Wow64RevertWow64FsRedirection comme je l'avais mentionné précédemment.

  8. #8
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 011
    Points : 2 078
    Points
    2 078
    Par défaut Registre Sauvegarde clés (..reg)» sous Windows 64 bits à partir appli 32 bits.
    Bonjour à tous
    Bien je souscris ! Il faut être précis et ne pas utiliser des fonctions "deprecated" à la suite d'une Fatwa
    de Microsoft
    Mea-culpa.
    Je regarde et Je ferai les mises au point correspondantes des que j'aurai un moment.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Application 64 bits sur du 32 bits
    Par Xord3 dans le forum Windows 7
    Réponses: 5
    Dernier message: 16/09/2014, 00h35
  2. Développez une application 32 bits sur processeur 64 bits
    Par vg-matrix dans le forum Visual Studio
    Réponses: 1
    Dernier message: 28/03/2011, 17h21
  3. Sauvegarde avec Rsync sous windows
    Par Léponge85 dans le forum Windows XP
    Réponses: 0
    Dernier message: 19/11/2009, 14h09
  4. Réponses: 1
    Dernier message: 29/11/2005, 17h06
  5. windows XP 64 bits et application 16 bits
    Par JeanMarc_T2k dans le forum Windows XP
    Réponses: 2
    Dernier message: 21/11/2005, 11h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo