Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte » 

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi USB - Autostart dynamisch unterbinden (https://www.delphipraxis.net/140555-usb-autostart-dynamisch-unterbinden.html)

Schwedenbitter 20. Sep 2009 23:32


USB - Autostart dynamisch unterbinden
 
Hallo,

zwar habe ich schon Code gefunden, [1]wie man den CD-Autostart dynamisch unterdrückt. Ich gehe davon aus, dass das auch für andere Geräte klappen sollte. Ich habe aber ein differenzierteres Problem:

Ich möchte gern die komplette Steuerung für eine bestimmtes USB-Gerät übernehmen. Hier habe ich USBStor.pas gefunden und nutze diese, um herauszufinden, ob dieses Gerät (gerade) angeschlossen wurde. Das klappt soweit auch ganz gut. Allerdings stört mich noch, dass Windows wie bei anderen USB-Platten, - Sticks etc. auch ein Explorer-Fenster einblendet. Das möchte ich verhindern. Allerdings eben nur für das bestimmte Gerät.

Ich habe schon darüber nachgedacht, einfach eine Boolean-Variable statt einer TCheckBox zu nehmen. Diese setze ich dann auf False (=Autostart aus), wenn das Laufwerk angeschlossen ist und auf True, wenn nicht und werte das dann wie unter [1] aus. Das könnte zwar klappen, hätte dann aber den Nachteil, dass für die Geräte die nach dem Anstecken meines speziellen Teils angeschlossen werden, auch kein Fenster mehr käme. Das soll ja auch nicht sein.
Besser wäre es also abzufragen, von wem die Anforderung für den Autostart kommt. Hier komme ich nicht weiter.

Kann mir da bitte jemand einen Tipp geben?

Gruß, Alex

Alter Mann 21. Sep 2009 10:50

Re: USB - Autostart dynamisch unterbinden
 
Hallo

Schon mal dies probiert:

Bei DBT_DEVICEARRIVAL : ein abschließendes Msg.Result := 0; einfügen.

Gruß

Schwedenbitter 21. Sep 2009 11:28

Re: USB - Autostart dynamisch unterbinden
 
Zitat:

Zitat von Alter Mann
Bei DBT_DEVICEARRIVAL : ein abschließendes Msg.Result := 0; einfügen.

Danke für den Tipp! Hörte sich verlocken einfach an, klappt aber nicht :-( Der böse Explorer kommt wie eh und je.

Gruß, Alex

Schwedenbitter 22. Sep 2009 17:17

Re: USB - Autostart dynamisch unterbinden
 
Kann mir wirklich keiner helfen?

Ich weiß, dass es irgendwie gehen muss. Ich selbst nutze eine Software, die genau das macht und ich möchte das deshalb in meinem Programm auch haben.

Wo ich gerade dabei bin:
Wie bzw. eher wo schreibe ich diesen Code eigentlich hin. FormCreate ist mir klar; aber der Rest? :gruebel:

Gruß, Alex

Alter Mann 23. Sep 2009 18:43

Re: USB - Autostart dynamisch unterbinden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich bin ehrlich gesagt mir immer noch nicht ganz sicher was verhindert werden soll:
Ist das Fenster zur Auswahl der Aktion gemeint(Dateiordner öffnen, Wiedergabe, Durchsuchen etc.),
oder geht tatsächlich ein Explorerfenster auf?

Bei MSDN gibt es dazu folgenen Artikel:Deaktivieren der Autorun-Funktionalität in Windows.

Vielleicht hilft das ja weiter.

Gruß

PS Oder suchst Du so etwas wie im Anhang?

Schwedenbitter 23. Sep 2009 23:09

Re: USB - Autostart dynamisch unterbinden
 
Zitat:

Zitat von Alter Mann
PS Oder suchst Du so etwas wie im Anhang?

Keine Ahnung.
Ich konnte die Datei leider nicht ausführen. Es kommt die Fehlermeldung rtl70.bpl wurde nicht gefunden und ich solle die Anwendung neu installieren... :(

Alter Mann 24. Sep 2009 11:24

Re: USB - Autostart dynamisch unterbinden
 
Ups,

da war wohl ein harken an der falschen Stelle. Habe eine neue Version hochgeladen.

Gruß

Schwedenbitter 24. Sep 2009 13:37

Re: USB - Autostart dynamisch unterbinden
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo,

Danke für den Code. Scan findet leider nur das Laufwerk. In der Spalte Class steht "not found" und der Rest bleibt stest leer.

Ich habe mal meine - fast fertige - Version beigefügt. Da es unterschiedliche Messages sind, brauch ich wohl auch 2 Proceduren. Auf jeden Fall klappt das Unterbinden des Explorer jetzt. Ich meine nicht (nur) die Auswertung der Datei autorun.inf, sondern (auch) das Öffnen eines Explorer-Fensters, wenn Windows keine bekannten Dateien findet.

Ich habe nur noch ein Problem damit, dass Laufwerk rauszubekommen. Da das bei Dir offenbar funktioniert, wäre ich sehr an Deinem Code interessiert; zumindest an dem Abschnitt, mit dem Du den Buchstaben des neu angestöpselten Laufwerks ermittelst. Daran hapert es bei mir noch. Wie Du meinem Code entnehmen kann - falls Du ihn Dir ansiehst - schummle ich, indem ich ein zwingend erforderliches Verzeichnis suche.
Ganz sauber ist das aber leider auch nicht.

Gruß, Alex

[EDIT]
Ich habe gerade an einem anderen Rechner festgestellt, dass es nicht (mehr) klappt. :wall:
Ich habe keine Ahnung, woran das liegt. Schlimm nur, dass ich grad an einem anderen Rechner sitze, hier schon was am Code geändert habe und daher nicht mehr nachvollziehen kann, woran es liegt.
[/EDIT]

Alter Mann 24. Sep 2009 18:24

Re: USB - Autostart dynamisch unterbinden
 
Hallo

Zitat:

Scan findet leider nur das Laufwerk. In der Spalte Class steht "not found" und der Rest bleibt stest leer.
Ist auch kein Wunder, Scan ermittelt nur die Daten von USBSTOR-Laufwerken und zeigt
die VID/PID-Kombi und falls vorhanden die ID an. Benutze es mal mit einem USB-Cardreader/Stick.

Das mit dem Laufwerk ist relative Simpel, wenn man sich auf Wechseldatenträger beschränkt:
Delphi-Quellcode:
procedure ShowRemovableDrives;
var
  I : Integer;
  D : String;
  L : TListItem;
begin
  lvRemovable.Items.Clear;
  for I := Ord('D') to Ord('Z') do
  begin
    D := Char(I);
    if GetDriveType(pChar(D + ':\')) = DRIVE_REMOVABLE then
    begin
      L := lvRemovable.Items.Add;
      L.Caption := D + ':\';
    end;
  end;
end;
Wobei lvRemovable ein ListView ist.

Einzelheiten zum ermitteln der VID/PID und anderes findest du in der DP, Jahrgang 2004.
Also einfach die Suche anschmeißen und durchkämpfen.

Und zum Überprüfen ob auch ein Datenträger vorhanden ist, kann dies genommen werden:
Delphi-Quellcode:
FUNCTION DiskInDrive(Drive: CHAR): BOOLEAN;
{ Funktion, um zu prüfen, ob ein Datenträger eingelegt ist.
  Drive : Laufwerk (A..Z oder a..z)
  Ergebnis: TRUE, wenn Datenträger eingelegt ist
            FALSE, wenn kein Datenträger eingelegt ist
                   oder ein ungültiges Laufwerk angegeben wurde }
VAR
  ErrorMode: WORD;
BEGIN
  Result := FALSE;
  Drive := Char(Byte(Drive) AND $DF); // groß
  IF (Drive < 'A') OR (Drive > 'Z') THEN Exit;
  ErrorMode := SetErrorMode(SEM_FailCriticalErrors);
  TRY
    IF DiskSize(Ord(Drive) - $40) = -1 THEN
      Result := FALSE
    ELSE
      Result := TRUE;
  FINALLY
    SetErrorMode(ErrorMode);
  END;
END;
Zitat:

...
Da es unterschiedliche Messages sind, brauch ich wohl auch 2 Proceduren
...
Nicht unbedingt, packes es in eine einfache Componente und nutze WndProc.

Auch dazu gibt es genug Beispiele in der DP, zB:

Delphi-Quellcode:

procedure TWeisNichtWie.WndProc(var Msg : TMessage)
begin
  case Msg.Msg of
    WM_DEVICECHANGE : begin
                        WMDeviceChange(TWMDeviceChange(Msg));
                        Result := Msg.Result;
                      end;
    WM_AUTOPLAY    : Msg.Result := 1;
    else
    Msg.Result := DefWindowProc(Handle, Msg.Msg, Msg.wParam, Msg.lParam);
  end;
end;
Und schau dir dazu nochmals die USBStor.pas an(wegen des Handle usw.).

So und falls noch Fragen sind, immer Fragen.


Gruß

Schwedenbitter 24. Sep 2009 18:49

Re: USB - Autostart dynamisch unterbinden
 
Zitat:

Zitat von Alter Mann
Zitat:

Scan findet leider nur das Laufwerk. In der Spalte Class steht "not found" und der Rest bleibt stest leer.
Ist auch kein Wunder, Scan ermittelt nur die Daten von USBSTOR-Laufwerken und zeigt
die VID/PID-Kombi und falls vorhanden die ID an. Benutze es mal mit einem USB-Cardreader/Stick.

Es ist USBSTOR. Das geht jedenfalls aus den Eintragungen in der Registry so hervor. Außerdem hatte ich schon einmal die Unit USBstor.pas von Andrej Sandorf in der Mache. Dort werden die Daten zu Class, PID, VID etc. gefunden.
Oder hat das damit nichts zu tun? :gruebel:

Zitat:

Zitat von Alter Mann
Das mit dem Laufwerk ist relative Simpel, wenn man sich auf Wechseldatenträger beschränkt ...

Danke für den Code. Ich werde das dann wohl so nutzen. Ich bin nur traurig, dass ein Code, der so vielfach im Netz kurisert bzgl. des Laufwerksbuchstabens nicht funktioniert.

Zitat:

Zitat von Alter Mann
Einzelheiten zum ermitteln der VID/PID und anderes findest du in der DP, Jahrgang 2004. Also einfach die Suche anschmeißen und durchkämpfen.

Danke, werde ich dann machen.

Zitat:

Zitat von Alter Mann
Nicht unbedingt, packes es in eine einfache Componente und nutze WndProc. Auch dazu gibt es genug Beispiele in der DP ...

Das ist in der Tat schlau gemacht. Wenn ich das richtig deute, dann kann ich mir folglich hinter der deklarierten Procedure WMDeviceChange(Var Msg: TMessage); das "Message WM_DeviceChange;" sparen, weil ich bei Erhalt dieser Message die Procedure selbst aufrufe.

Zitat:

Zitat von Alter Mann
So und falls noch Fragen sind, immer Fragen.
Gruß

Danke für das nette Angebot. Ich hoffe, ich bekomme es mit den Hinweisen jetzt allein hin.

Gruß, Alex


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:53 Uhr.
Seite 1 von 4  1 23     Letzte » 

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz