Announcement

Collapse
No announcement yet.

USB-Drive sicher entfernen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • USB-Drive sicher entfernen

    Und weils so schön ist, noch ne Frage ^^


    Ich möchte aus einem VB.net Programm heraus USB-Devices sicher entfernen.
    Also nicht mit der Maus die "Hardware sicher entfernen"-Funktion im Windows-Infobereich nutzen, sondern per Prozedur.

    zb.:
    Code:
    pDeactivateDevice("I")
    Nach diesem Prozeduraufruf soll zb der USB-Stick, welcher unter dem Laufwerksbuchstaben "I" gelaufen ist ausgeworden werden.


    Ein möglicher Lösungsansatz wäre meiner Meinung nach die Funktion "CM_Request_Device_Eject" der "setupapi.dll"... aber da ist wie immer das Problem, dass mir ein Fallbeispiel für VB.net fehlt um das richtig umzusetzen bzw. die Richtigen Parameter herauszufinden.


    Ich hoffe, euch fällt da was dazu ein.

    MfG,
    Athlone

  • #2
    Hat wirklich niemand eine Idee?
    Ist ziemlich wichtig.

    Comment


    • #3
      Hallo Athlone,

      da musst mal Google bemühen!

      Zum Einlesen in die Thematik empfehle ich dir http://www.uwe-sieber.de.
      Dort wirst du ganz schnell feststellen, dass dies gar nicht so einfach ist.

      Wenn dir aber der Aufruf des Hot Plug Managers auch reicht, also als würdest unten auf "Hardware sicher entfernen" klicken, dann kannst du dies z.B. wie folgt erreichen.

      Code:
          Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
              Shell("RunDll32.exe shell32.dll,Control_RunDLL hotplug.dll")
          End Sub
      mfg laptel

      Comment


      • #4
        Danke für die Antwort.
        Leider reicht mir bzw. meinem Chef das nicht aus, es soll kein Benutzereingriff nötig sein.

        Comment


        • #5
          google habe ich die letzten Tage reichlich bemüht, leider habe ich bisher nur - wie schon erwähnt - die "CM_Request_Device_EjectA"-Funktion der "setupapi.dll" gefunden. Diese habe ich versucht auf VB.net umzubauen:
          Code:
          CMAPI CONFIGRET WINAPI
            CM_Request_Device_Eject(
              IN DEVINST  dnDevInst,
              OUT PPNP_VETO_TYPE  pVetoType,
              OUT LPTSTR  pszVetoName,
              IN ULONG  ulNameLength,
              IN ULONG  ulFlags
              );
          Code:
          Declare Function CM_Request_Device_EjectA Lib "setupapi.dll" (ByVal dnDevInst As IntPtr, _
                                                                          Optional ByVal pVetoType As PNP_VETO_TYPE = PNP_VETO_TYPE.TypeUnknown, _
                                                                          Optional ByVal pszVetoName As System.Text.StringBuilder = Nothing, _
                                                                          Optional ByVal ulNameLength As Integer = MAX_PATH, _
                                                                          Optional ByVal ulFlags As Integer = Nothing) As Integer
          nun ist meiner ansicht nach das Problem der Parameter "dnDevInst", dies soll ein Handle des Laufwerks sein, welches man entfernen möchte.
          Wiederum über Google bin ich auf eine Funktion "CreateFile" aus der "kernel32.dll" gestoßen, welche laut MSDN ein Handle eines Laufwerks zurückgeben kann.
          Von mir umgebaut sieht diese Funktion dann so aus:
          Code:
          Declare Auto Function CreateFile Lib "kernel32.dll" (ByVal lpFileName As String, _
                                                                   ByVal dwDesiredAccess As Int32, _
                                                                   ByVal dwShareMode As Int32, _
                                                                   ByVal lpSecurityAttributes As IntPtr, _
                                                                   ByVal dwCreationDisposition As Int32, _
                                                                   ByVal dwFlagsAndAttributes As Int32, _
                                                                   ByVal hTemplateFile As IntPtr) As IntPt
          Beispielcode dazu:
          Code:
          Const GENERIC_READ = &H80000000
                  Const OPEN_EXISTING = 3
                  Const FILE_SHARE_READ = &H1
                  Const FILE_SHARE_WRITE = &H2
                  Const FILE_ATTRIBUTE_NORMAL = &H80
                  Const FILE_FLAG_NO_BUFFERING = &H20000000
          Dim fh As IntPtr = CreateFile("\\.\C:", _
                                                GENERIC_READ, _
                                                FILE_SHARE_READ, _
                                                IntPtr.Zero, _
                                                OPEN_EXISTING, _
                                                FILE_ATTRIBUTE_NORMAL Or FILE_FLAG_NO_BUFFERING, _
                                                0)
          Leider bekomme ich dabei grundsätzlich -1 zurück.
          Ich nehme an, dass ich noch irgendwelche falschen Datentypen nutze, nur weiß ich nicht welche...

          Comment


          • #6
            Und dies hast auch schon gesehen?

            USB Medium abmelden (sicheres Entfernen)

            Für mich stellt sich halt von vornherein die Frage, wie du erkennen möchtest, welches das richtige Laufwerk/USB Stick wäre. In Abhängigkeit der Konfiguration bei den Nutzern des Programms, kannst du ja keine festen Laufwerksbuchstaben verwenden.

            Den von mir gepostetten Link hast du mal überflogen!

            1. Problem: "USB-Laufwerke können sich bei Windows als 'Wechseldatenträger' oder als 'Lokaler Datenträger' zu erkennen geben"

            2. Problem: "Netz- und Subst-Laufwerke bleiben unter XP bei all dem unberücksichtigt - XP hat also keine Hemmungen, den Buchstaben einer Netz-Freigabe nochmal für ein USB-Laufwerk zu vergeben..."

            OK, ab Dez. 07 gab es da wohl nen Patch für XP. Vista sollte es somit nicht betreffen. Aber was ist mit Win2000?

            Ich denk mal, das Auswerfen an sich wird nicht das größte Problem darstellen, sondern welchen Datenträger dein Programm einfach so auswerfen darf. So wäre es z.B. nicht günstig, wenn man einfach alle USB-Storages auswirft, während auf einen solchen Datenträger ein Sicherung durchgeführt wird.
            Was weißt du, was der User neben deinem Programm noch so alles macht!?

            mfg laptel

            Comment


            • #7
              Dieses Tool wird nur von uns eingesetzt, ob nun Firmenintern oder bei Firmen, bei denen wir uns um Hard und Software kümmern.
              Da auch wirklich nur wir da dann Änderungen vornehmen was die Laufwerksbuchstabenvergabe angeht, können wir auch wirklich sicher sein, dass wir mit dem Buchstaben auch das richtige Laufwerk erreichen

              Desshalb mache ich mir um den Aspekt nicht wirklich Gedanken.

              Den Code von dem "USB Medium abmelden" werd ich mir morgen wärend der Arbeit durchschauen, ob ich den verwenden kann... unter umständen verwenden wir auch schlicht das freewaretool von Uwe Sieber, da das tatsächlich im Funktionsumfang in etwa dem entspricht, was wir suchen.
              Zuletzt editiert von Athlone; 19.06.2008, 19:43.

              Comment

              Working...
              X