Registry Key wird automatisch gewechselt bei 64 Bit Systemen

  • Hallo Zusammen,
    ich habe mir ein AutoIt-Script geschrieben welches einen Pfad als Argument übergeben bekommt und diesen in der Registry ergänzen soll, so dieser noch nicht dort eingetragen ist.

    Der Registry-Key ist "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion"
    Der Wert welcher ergänzt werden soll ist "DevicePath"

    Windows sucht in den hier eingetragenen Verzeichnissen nach Treibern.

    Mein Script ließt aus der Registry, prüft ob der Pfad bereits eingetragen ist und ergänzt diesen, falls er nicht eingetragen ist.
    Aufgefallen ist mir, dass der Pfad unter folgenden Key gelesen und geschrieben wird, sobald es ein 64Bit System ist: HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion

    Nun zu meiner Frage: Weshalb wird in meinem Script der Schlüssel gewechselt und wie kann ich das unterbinden?
    Leider funktioniert die Treibersuch nicht, sobald der Reg-Key automatisch gewechselt wird.

    Dieses Problem konnte ich bei 64 Bit-Systemen beobachten (Win 7 und Win 8.1), bei einem 32 Bit System (Win 10) tritt dieses Problem nicht auf.

    Grüße,
    Crazy


    Anbei noch mein kleines Script:

    [autoit][/autoit][autoit][/autoit][autoit]

    #include <MsgBoxConstants.au3>
    $RegistryKey = "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion"
    $RegistryValue = "DevicePath"

    [/autoit][autoit][/autoit][autoit]

    ;Parameter prüfen
    If $CmdLine[0] = 1 Then
    $strNewPath = $CmdLine[1]
    Else
    MsgBox($MB_SYSTEMMODAL, "Test", "Wrong count of arguments (!=0).")
    Exit 1
    EndIf

    [/autoit][autoit][/autoit][autoit]

    ;Wert aus der Registry lesen
    $regValue = RegRead($RegistryKey, $RegistryValue)

    [/autoit][autoit][/autoit][autoit]

    ;Prüfen ob der einzutragene Pfad bereits in der Registry eingetragen wurde, wenn dem so ist Programm beenden
    $strArray = StringSplit($regValue, ";")
    For $i=1 To $strArray[0]
    MsgBox($MB_SYSTEMMODAL, "Test", "Comparing reg path '" & $strArray[$i] & "'")

    [/autoit][autoit][/autoit][autoit]

    If (StringCompare($strArray[$i], $strNewPath) == 0) Then
    MsgBox($MB_SYSTEMMODAL, "Test", "Path already usen.")
    Exit 2
    ElseIf (StringCompare($strArray[$i], """"& $strNewPath & """") == 0) Then
    MsgBox($MB_SYSTEMMODAL, "Test", "Path already usen.")
    Exit 2
    EndIf
    Next

    [/autoit][autoit][/autoit][autoit]

    ;Den Pfad an die vorhandenen Einträge anhängen
    $regValue &= ";" & $strNewPath
    RegWrite($RegistryKey, $RegistryValue, "REG_EXPAND_SZ", $regValue)

    [/autoit][autoit][/autoit][autoit]

    MsgBox($MB_SYSTEMMODAL, "Test", "Path added to driver search.")

    [/autoit][autoit][/autoit][autoit]

    Exit 0

    [/autoit]

    Einmal editiert, zuletzt von CrazyMetal (10. Dezember 2014 um 11:10)

  • Weshalb wird in meinem Script der Schlüssel gewechselt und wie kann ich das unterbinden?

    Weil du ein 64-Bit Windows betreibst, dein Skript aber als x86-Skript ausführst/kompilierst.
    Windows lenkt auf 64-Bit-Systemen Registry-Aufrufe von x86-Programmen automatisch auf Wow6432Node um, damit diese sich nicht mit denen x64-Programme ins Gehege kommen.
    Für das Programm (in deinem Fall dein AutoIt-Skript) sieht es dennoch so aus, als würde es in die normalen Pfade schreiben.

    Wie kann man das umgehen? - zwei Möglichkeiten:

    • Programm als x64-Skript ausführen/kompilieren
    • Mal die Hilfe zu RegWrite() lesen: >>Klickmich<<
  • [quote='CrazyMetal','http://autoit.de/index.php/Thread/46043-Registry-Key-wird-automatisch-gewechselt-bei-64-Bit-Systemen/?postID=365216#post365216']Weshalb wird in meinem Script der Schlüssel gewechselt und wie kann ich das unterbinden?[/quote
    Mal die Hilfe zu RegWrite() lesen: >>Klickmich<<


    Wer lesen kann ist klar im Vorteil ...

    Ja, für 2 Architekturen kompilieren ... .NET versaut einen dahingehend etwas (Stichwort: AnyCPU) :/
    Prima Danke, läuft.
    :thumbup:

    Gruß,
    Crazy