AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi USB - Autostart dynamisch unterbinden

USB - Autostart dynamisch unterbinden

Ein Thema von Schwedenbitter · begonnen am 20. Sep 2009 · letzter Beitrag vom 27. Feb 2015
Antwort Antwort
Seite 1 von 4  1 23     Letzte » 
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#1

USB - Autostart dynamisch unterbinden

  Alt 20. Sep 2009, 22:32
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
Alex Winzer
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
903 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

Re: USB - Autostart dynamisch unterbinden

  Alt 21. Sep 2009, 09:50
Hallo

Schon mal dies probiert:

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

Gruß
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: USB - Autostart dynamisch unterbinden

  Alt 21. Sep 2009, 10:28
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
Alex Winzer
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: USB - Autostart dynamisch unterbinden

  Alt 22. Sep 2009, 16:17
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?

Gruß, Alex
Alex Winzer
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
903 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

Re: USB - Autostart dynamisch unterbinden

  Alt 23. Sep 2009, 17:43
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?
Angehängte Dateien
Dateityp: exe project1_134.exe (199,5 KB, 20x aufgerufen)
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: USB - Autostart dynamisch unterbinden

  Alt 23. Sep 2009, 22:09
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...
Alex Winzer
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
903 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

Re: USB - Autostart dynamisch unterbinden

  Alt 24. Sep 2009, 10:24
Ups,

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

Gruß
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: USB - Autostart dynamisch unterbinden

  Alt 24. Sep 2009, 12:37
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.
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]
Angehängte Dateien
Dateityp: exe usb_374.exe (171,5 KB, 21x aufgerufen)
Dateityp: zip usb_p_604.zip (2,5 KB, 41x aufgerufen)
Alex Winzer
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
903 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

Re: USB - Autostart dynamisch unterbinden

  Alt 24. Sep 2009, 17:24
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ß
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: USB - Autostart dynamisch unterbinden

  Alt 24. Sep 2009, 17:49
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?

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 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 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 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
Alex Winzer
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf