Fehlermeldung auf Host PC: Es befindet sich kein Datenträger im Laufwerk

  • Hallo,

    ich habe ein kleines Programm geschrieben, welches nur bestimmte @Comspec Befehle ausführt.

    Beim Start der produzierten exe-Datei (kompiliert als x86), kommt es ohne Zusammenhang des Windows-Betriebssystemes oder der Architektur zur Fehlermeldung:

    Code
    Fehlermeldung: Es befindet sich kein Datenträger im Laufwerk. Legen Sie einen Datenträger im Laufwerk Device\Harddisk3\DR3 ein.


    Google bringt mir als ersten (einzigen brauchbaren Hinweis):

    Code
    Die Ursache des Fehlers sind  ungenutzte "virtuelle" Laufwerke, also Laufwerksbuchstaben, die nicht (mehr) existierenden Wechselmedien-Laufwerken zugeordnet sind. Diese Laufwerksbuchstaben müssen in der Windows-Systemsteuerung
    
    
    -       bei Windows 7 unter „Computerverwaltung“ => „Datenträgerverwaltung“
    
    
    -       bei Windows XP unter „Verwaltung“ => „Computerverwaltung“ => „Datenträgerverwaltung“
    
    
    gelöscht werden.


    Bei meinen Testgeräten handelt es sich um reale PC, nicht um virtuelle Maschinen, welche keine virtuellen Laufwerke besitzen.

    Hinweis: Mein Host-System (Notebook) verfügt über ein virtuales Laufwerk. Kann es sein, dass sich beim erstellen der .Exe diverse Information meines Host-PC gefordert werden, wenn ich die Datei auf einem anderen Rechner starte. Wie gesagt ist es sehr komisch, dass bei einem Rechner der Fehler kommt und beim anderen nicht.
    Dieser Fehler tritt auch nur dann auf, wenn ich meine .exe starte.

    Habt Ihr eine Lösung zu diesem Problem parat? In der Suche nichts passendes gefunden und bin komplett ratlos.

  • Entschuldige: Mein Fehler.

    Edit bernd670: Code neu formatiert!

    3 Mal editiert, zuletzt von bernd670 (14. Mai 2015 um 10:04)

    • Offizieller Beitrag

    Hallo,

    kann es sein das dieses Phänomen nur bei 32Bit-Systemen auftritt??

    Der Aufruf

    [autoit]

    DllCall("kernel32.dll", "int", "Wow64DisableWow64FsRedirection", "int", 1)

    [/autoit]

    stimmt so nicht! Der letzte Wert muss ein Zeiger auf ein Int sein in dem das Ergebnis gespeichert wird.
    Also entweder so:

    [autoit]


    $OldValue
    DllCall("kernel32.dll", "int", "Wow64DisableWow64FsRedirection", "int", $oldValue)

    [/autoit]

    oder wenn das auch nicht geht so:

    [autoit]


    $tWow64DisOldVal = DllStructCreate("INT")
    DllCall("kernel32.dll", "int", "Wow64DisableWow64FsRedirection", "PTR*", DllStructGetPtr($tWow64DisOldVal))

    [/autoit]
  • Hallo bernd670,

    vielen Dank für Deine Hilfe. Der Code:

    AutoIt
    $tWow64DisOldVal = DllStructCreate("INT")
    DllCall("kernel32.dll", "int", "Wow64DisableWow64FsRedirection", "PTR*", DllStructGetPtr($tWow64DisOldVal))


    hat bewirkt, dass o. g. Fehlermeldung zumindest nicht mehr bei meinem Host x64 auftaucht. Muss also was damit zu tun haben. Allerdings taucht der Fehler bei einem meiner x86 Host Testgeräten immer noch auf und ich bin ratlos warum.

    Ich kompiliere ja als Target x86. Sogar den AV habe ich zum testen deaktiviert.

    Je nach Testgerät erscheint der Fehler unterschiedlich zur Hardware.

    Code
    Fehlermeldung: Es befindet sich kein Datenträger im Laufwerk. Legen Sie einen Datenträger im Laufwerk Device\Harddisk3\DR3 ein.
    
    
    oder 
    
    
    Fehlermeldung: Es befindet sich kein Datenträger im Laufwerk. Legen Sie einen Datenträger im Laufwerk Device\Harddisk3\DR1 ein.

    Ich habe im Quellcode doch überhaupt keinen Bezug darauf, dass Hardwareinformationen eingelesen werden sollen und Funktionen werden erst dann ausgeführt, wenn ich auf einen Button klicke.

    Die Fehlermeldung erscheint aber direkt nach dem Programmstart. Nach ca. 7mal auf "abbrechen" klicken, startet dann die GUI und die Funktionen können ohne Fehler ausgeführt werden.

    Gibt es noch irgendetwas, was ich versuchen könnte um den Fehller wegzubekommen?

    Einmal editiert, zuletzt von Raupi (14. Mai 2015 um 14:03)

    • Offizieller Beitrag

    Hast du es schon mal so probiert?

    Läuft auf meinem Win 7 x64 ohne Probleme, x86 kann ich leider nicht testen.

    Änderungen: 1. Zeile eingefügt u. 42-44 deaktiviert

    • Offizieller Beitrag

    ersetze mal alle

    [autoit]

    @WorkingDir

    [/autoit]

    durch

    [autoit]

    @ScriptDir

    [/autoit]

    und versuche es dann noch mal!

    • Offizieller Beitrag

    Dann bleibt eigentlich nur noch eins. bei allen Funktionen den Code in Kommentare setzen, testen ob dann das gleiche passiert. Wenn nicht nach und nach die Funktionen wieder aktivieren und jedes mal testen bis du weisst bei welcher Funktion es passiert!

  • Danke dir für den Tip.

    Das werde ich morgen Abend nach der Arbeit testen und das Resultat hier posten.
    Jetzt kommt Besuch und meine Frau ist schon wieder sauer dass ich nicht pünktlich zum helfen da bin.
    Immer dasselbe. Man sollte 2 geteilt werden können oder 2 Frauen haben. :D

    Vielen Dank nochmal für Deine Hilfe

  • Bei meinen Testgeräten handelt es sich um reale PC, nicht um virtuelle Maschinen, welche keine virtuellen Laufwerke besitzen.

    Kann es sein, dass Du da etwas verwechselst? Ein echter PC kan schon mal Laufwerksbuchstaben für Wechseldatenträger reservieren, z.B für externe CD Laufwerke, Tandberg Data Cardridge usw. Ich habe Dir einen Screenshot beigelegt.

    2.jpg


    Gruß

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Hallo Peter S. Taler,

    ja, das stimmt. Das CD/DVD Laufwerk ist vorhanden und leer (also keine CD/DVD ist enthalten). Das ist auf allen meinen mobilen Geräten der Fall. Aber dennoch kommt bei einem die Fehlermeldung und beim anderen nicht. Es ist zum verrückt werden.

    bernd670 hat vollkommen recht.

    Code
    Dann bleibt eigentlich nur noch eins. bei allen Funktionen den Code in Kommentare setzen

    Ich benötige eine Ausschlussdiagnose.

  • Ein anderes (totes) Laufwerk nicht noch zufällig? Von Nir Soft und oder uwe-sieber.de sollte es ein paar Tools geben die so etwas aufspüren (USB Wechseldatenträger) ? Wenn es aus dem Source keinen Ansatz gibt würde ich das mal prüfen. Win = mancmal eben doch windoof.

    Gruß

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Verrückt.

    Die Ausschlussdiagnose war leider komplett erfolglos. Hoch und runter, hin und her. Befehle einzeln getestet und vorab Messageboxen eingebaut und immer Kommt die Meldung schon, bevor irgend ein Code abgearbeitet wird. Es muss mit der .exe zusammenhängen. Vielleicht mache ich etwas beim kompilieren falsch. Weiß der Geier.

    Peter hingegen hatte den richtigen Riecher. :thumbup: Vielen Dank für den erneuten Hinweis.
    Nach dem Einsatz des Tool USB Oblivion 1.10.3.0 waren die verweisten USB- und Laufwerkinformationen der Registry gesäubert und mein kleines Programm bringt keine Fehlermeldungen mehr. Läuft wie geschmiert. 8o

    Dennoch bleibt die Frage für mich bestehen, warum mein kleines Programm den Fehler auslöst Ich kapiere das nicht.
    Keine Zeile im Code liest Laufwerksinformationen aus, die zu einem solchen Fehler führen könnten.

    Sollte ich mein Proggi mal fertiggestellt haben und zum freien Download anbieten, kann ich doch nicht gleichsam auf USB Oblivion 1.10.3.0 verweisen um die Fehlermeldungen zu eleminieren, falls diese beim Benutzer kommen sollten oder gar selbst ein Säuberungstool im Code verankern, dass es nicht zu solchen Meldungen kommt. X/

  • Danke - ich bin neu hier im Forum - freut mich dass ich helfen konnte.
    Kannst Du die Fehlermeldung nicht einfach mit einer MSG Box abfangen und als Text den Hinweis auf das Tool USB Oblivion 1.10.3.0) ?
    Wenn Du Dein Programml automatisch einsetzen willst, kann man die MSG Box auch nach geraumer Zeit schließen lassen. Autoit kann das (Siehe MSG Box Hilfe)

    Gruß

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Hallo

    Code
    Kannst Du die Fehlermeldung nicht einfach mit einer MSG Box abfangen und als Text den Hinweis auf das Tool USB Oblivion 1.10.3.0) ?

    Das Problem ist, dass mal die Fehlermeldung kommt und mal nicht. Je nach verweisten Einträgen der Host-PC's. Wie soll ich das abfangen. mit If>Then ginge das vielleicht schon doch ich weiß wirklich nicht wie. Bin auch schon auf die Suche gegangen aber habe nichts ensprechendes gefunden, wie das gehen sollte. Hast du einen Tip?

    Am besten wäre es, man könnte die Messageboxen unterdrücken. Also gar nicht erst aufpoppen lassen. Doch werden die Meldungen ja nicht von meinem Programm gesendet sondern von weiß der Geier woher auch immer ....

    • Offizieller Beitrag

    Ich würde mir darüber keine Gedanken machen der Fehler hat ja definitiv nicht mit deinem Programm zu tun.

  • Das Tool hat auch einen Modus in dem es unbeaufsichtigt ohne Benutzereingaben läuft:

    Spoiler anzeigen


    Usage

    USBOblivion[32|64].exe [params]
    Params

    • -enable - Do real clean (simulation otherwise);
    • -auto - Automatic run;
    • -nosave - Don't save backup .reg-file;
    • -lang:XX - Use language XX (hex-code);
    • -silent - Hidden mode (if possible);
    • -? - Show this help.


    Wenn du dir nicht die Mühe machen willst jeden PC manuell zu prüfen kannstb du es ja mit FileInastall einbinden und vor deinem eigentlichen Programm starten.

  • Ich würde mir darüber keine Gedanken machen der Fehler hat ja definitiv nicht mit deinem Programm zu tun.

    Hallo bernd670,
    das stimmt schon was Du sagst, nur warum die Meldung ausgerechnet nach Start meines Programms kommt, macht mich betroffen.
    Du bernd670, wo lässt sich denn ein Thread als gelöst markieren? Ich habe die Funktionen im Forum nicht gefunden, aber Threads gesehen, welche als gelöst markiert oder besser gesagt, als gelöst benannt waren.

    @autobert2:
    Danke für Deinen Vorschlag. Über das hatte ich heute Nachmittag auch schon in meiner Verzweiflung nachgedacht.
    Dann habe ich mich dennoch dazu entschieden, keine Fremd-Software einzubinden die diese Operationen ausführt, ohne dass der Benutzer davon Kenntnis hat.
    Stell Dir vor, einem Benutzer hat einen USB-Stick oder eine Festplatte eingesteckt und dann kommt eine Meldung von USBOblivion, dass alle USB-Geräte vor Beginn der Arbeit von USBOblivion entfernt werden müssen oder so was. Der Parameter -silent sollte zwar einfach ohne Nachfragen seine Arbeit machen, doch wenn das Programm seine Arbeit nicht machen kann kommmt eine Meldung. In den Tasks und Prozessen wäre das dann auch zu sehen. Ich habe nun zur Erklärung des Programms geschrieben, dass wenn ein Fehler auftauchen wie o. g. auftauchen sollte, die Software USBOblivion heruntergeladen und ausgeführt werden kann.