Delphi-PRAXiS

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 22: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 09: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 10: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 16: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 17: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 22: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 10: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 12: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 17: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 17: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

Alter Mann 24. Sep 2009 22:47

Re: USB - Autostart dynamisch unterbinden
 
Hallo Schwedenbitter,

zwei Fragen seien gestattet:

Betriebssystem und Delphi-Version?

Das ganze wurde damals für D7 geschrieben.

Gruß

Schwedenbitter 25. Sep 2009 09:04

Re: USB - Autostart dynamisch unterbinden
 
@Alter Mann

Zitat:

Zitat von Alter Mann
Betriebssystem und Delphi-Version?

Die Rechner laufen alle mit Win XP Prof. und ich nutze TurboDelphi.

Ich habe es jetzt - Dank Deiner Hilfe - tatsächlich geschafft, dass WMDeviceChange wegzurationalisieren und alles aus "WndProc" heraus zu erledigen. :-D Case klappt leider nicht, weil WM_AutoPlay keine Konstante ist. Da meckert bei mir der Compiler. Aber das lässt sich ja lösen:
Delphi-Quellcode:
Type
   TForm1            = Class(TForm)
                              CheckListBox1   : TCheckListBox;
                              Label1         : TLabel;
                              Procedure ReadRoot;
                              Procedure FormCreate(Sender: TObject);
                           Private
                              Procedure WMHandleUSB(Var Msg: TMessage);
                       End;

Var
   Form1         : TForm1;
   DVR         : Boolean;
   Root         : String;
   WM_AutoPlay   : Cardinal;

[...]

Procedure ShowMe(Value: HWND);
Var
   Th1,Th2      : Cardinal;
Begin
   Th1:=GetCurrentThreadId;
   Th2:=GetWindowThreadProcessId(GetForegroundWindow,nil);
   AttachThreadInput(Th2,Th1,True);
   Try
      SetForegroundWindow(Value);
   Finally
      AttachThreadInput(Th2,Th1,False);
   End;
End;

[...]

Procedure TForm1.FormCreate(Sender: TObject);
Begin
   ReadRoot;
   WM_AutoPlay:=RegisterWindowMessage('QueryCancelAutoPlay');
   Self.WindowProc:=WMHandleUSB;
End;

Procedure TForm1.WMHandleUSB(Var Msg: TMessage);
Begin
   If Msg.Msg = WM_DeviceChange Then
   Begin
      Case Msg.WParam Of
      $8000   :   If PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype=$00000002 Then
               Begin
                  ReadRoot;
                  If DVR Then
                  Begin
                     Application.Restore;
                     ShowMe(Application.Handle);
                  End;
               End;
     $8004   :   If PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype=$00000002 Then
               Begin
                  ReadRoot;
               End;
      End;
   End
   Else
   If Msg.Msg = WM_AutoPlay Then
   Begin
      If DVR Then
      Begin
         Msg.Result:=1;   //disable autoplay
         DVR:=False;
      End
      Else
         Msg.Result:=0;   // enable autoplay
   End
   Else
     Inherited WndProc(Msg);
End;
In ReadRoot suche ich alle Wechseldatenträger, prüfe ob ein Medium eingelegt und mein Spezialverzeichnis vorhanden ist. Falls alles passt, habe ich meinen Digital Voice Recorder. Danke für die super Hilfe. PID und VID wäre vermutlich eleganter. Aber ich brauche es so nicht und das Binary ist damit am Ende auch kleiner, weil nicht zig fette Units gelinkt sind.

Jetzt habe ich nur noch ein einziges Problem:

Das mit dem Unterdrücken des AutoPlay/Autostart (... wie auch immer) klappt nur, wenn das Fenster im Vordergrund ist. Darauf wiesen die Autoren ja auch schon selbst hin. Aus diesem Grunde nutze ich die Procedure ShowMe();, um das zum machen. Manchmal klappt das auch. Manchmal ist aber ShowMe() zu langsam für das Autostart, so dass der Explorer trotzdem kommt.

Kann ich da noch bitte einen Tipp haben, wie ich sicher stellen kann, dass mein Fenster immer vor dem Autostart Restored und OnTop ist?

Gruß, Alex

Schwedenbitter 30. Sep 2009 15:19

Re: USB - Autostart dynamisch unterbinden
 
Zitat:

Zitat von Schwedenbitter
Jetzt habe ich nur noch ein einziges Problem:
Das mit dem Unterdrücken des AutoPlay/Autostart (... wie auch immer) klappt nur, wenn das Fenster im Vordergrund ist.

Leider muss es offensichtlich das MainForm sein.
Da ich aber in meinem Programm aus mehreren Gründen genau das nicht öffnen kann, habe ich es mit allen möglichen Message-Boxen aus der Unit Dialogs und mit Hilfsforms probiert. Leider alles ohne Erfolg. Selbst wenn ich dann mit unheimlichen Aufwand das MainForm benutze, dann ist das nicht mehr schnell genug (Siehe oben).

Gibt es wirklich keine andere Möglichkeit, das Einblenden des Explorer-Fensters mit den Mitteln von Delphi zu unterbinden?

Gruß, Alex

himitsu 30. Sep 2009 15:25

Re: USB - Autostart dynamisch unterbinden
 
Hast du es auch schon mit einem "richtigem" Hier im Forum suchenMessage-Only-Window versucht?

Schwedenbitter 30. Sep 2009 16:28

Re: USB - Autostart dynamisch unterbinden
 
Danke für den Hinweis. Das kannte ich bislang nicht:

Zitat:

Zitat von himitsu
Hast du es auch schon mit einem "richtigem" Hier im Forum suchenMessage-Only-Window versucht?

Ich kann mit dem Hinweis nur nichts anfangen.
Zunächst habe ich mir die Suchergebnisse angesehen. Das ist nichts, was ich schon einmal gemacht hätte und auch die zahlreichen Beispielcodes laufen bei mir nicht.
Aber was ist dann der Sinn. Die Messages kommen ja an. Die werden - wenn ich das richtig deute - vom System gebroadcastet. Außerdem klappt mein Test-Code ja schon dann nicht mehr, wenn das Fenster neben einem weiteren im Hintergrund ist.

Falls Du mir das zumindest etwas genauer erklären würdest, dann könnte ich mit meinem bescheidenen Wissen vielleicht abschätzen, ob es sich lohnt, dass ich mich in die Materie einarbeite.

Gruß, Alex

himitsu 30. Sep 2009 16:41

Re: USB - Autostart dynamisch unterbinden
 
Ein Message-Only-Window ist quasi wie ein MainWindow, nur daß es unsichtbar ist und praktisch nur zum Empfangen von Nachrichten da ist und dort sollten auch alle globalen Nachichten ankommen, egal ob es im Vordergrund ist oder nicht (abgesehn davon, daß dieses eh nie im Vordergrund ist :nerd: )

Dann (ich weiß allerding grad nicht genau wie diese heißen) sendet Windows doch erstmal eine "Darf ich runterfahren"-Nachricht an alle Hauptfenster, welche man mit Nein beantworten könnte.
Und erst danach sollte die "So, ich fahr dann mal runter und du kannst da jetzt nix mehr dran ändern"-Nachricht :gruebel:

Schwedenbitter 30. Sep 2009 17:28

Re: USB - Autostart dynamisch unterbinden
 
Zitat:

Zitat von himitsu
... und dort sollten auch alle globalen Nachichten ankommen, egal ob es im Vordergrund ist oder nicht (abgesehn davon, daß dieses eh nie im Vordergrund ist :nerd: )

Das ist ja nicht mein Problem. Die Nachricht kommt ja bei mir an. Selbst wenn mein Programm im Tray liegt. Ich muss aber die Nachricht "beantworten", indem ich Msg.Result:=1 mitgebe, wenn das AutoPlay unterbunden und Msg.Result:=0 wenn es erlaubt werden soll.
Das wiederum wird vom BS offenbar nur dann "ernst genommen", wenn mein Fenster nicht minimiert und nicht im Hintergrund ist.

Zitat:

Zitat von himitsu
Dann (ich weiß allerding grad nicht genau wie diese heißen) sendet Windows doch erstmal eine "Darf ich runterfahren"-Nachricht an alle Hauptfenster, welche man mit Nein beantworten könnte.
Und erst danach sollte die "So, ich fahr dann mal runter und du kannst da jetzt nix mehr dran ändern"-Nachricht :gruebel:

Das verstehe ich jetzt nicht.
Mir geht es nicht darum, dass Runterfahren zu unterbinden. Ich möchte das AutoPlay ein für alle Male weghaben. Und zwar unabhängig davon, ob mein Programmfenster sichtbar, minimiert oder sonstwas ist.

Evtl. klappt es ja tatsächlich mit einem Message-Only-Window. Das bekomme ich jetzt so hin. Aber auch ich muss leider die Frage stellen, wie kann ich dem Fenster eine WindowProc zuweisen?
Delphi-Quellcode:
Var
   Form1            : TForm1;
   MessageWindow   :hWnd;

Implementation

{$R *.dfm}

Function InstallMessageWindow: hWnd;
Var
   S            : String;
   Ver         : TOSVersionInfoA;
Begin
   Ver.dwOSVersionInfoSize:=SizeOf(TOSVersionInfoA);
   If GetVersionEx(Ver) And (Ver.dwMajorVersion >= 5) Then
      S:='Message'
   Else
      S:='STATIC';
   Result:=CreateWindowExA(0, PChar(S), nil, WS_POPUP, 0, 0, 0, 0, 0, 0, GetCurrentProcessID, nil);
End;

Procedure TForm1.FormCreate(Sender: TObject);
Begin
   MessageWindow:=InstallMessageWindow;
   If MessageWindow <> Invalid_Handle_Value Then
      ShowMessage('OK');
End;
Gruß, Alex

himitsu 30. Sep 2009 17:43

Re: USB - Autostart dynamisch unterbinden
 
achsooo, hatte es so verstanden, daß diese Nachricht bei dir nur ankommt, wenn dein Fenster nicht minimiert ist. :oops:

[edit]
via MSDN-Library durchsuchenSetWindowLong

soulies 30. Sep 2009 19:55

Re: USB - Autostart dynamisch unterbinden
 
@Schwedenbitter

hoi,

ich konnte noch nicht so ganz rausfinden um was für ein 'USB Gerät' es sich handelt ...

Vllt gibt's anderen Lösungen für das Problem.


cya

Schwedenbitter 30. Sep 2009 20:48

Re: USB - Autostart dynamisch unterbinden
 
@soulies
Zitat:

Zitat von soulies
ich konnte noch nicht so ganz rausfinden um was für ein 'USB Gerät' es sich handelt ...

Es ist ein digitales Diktiergerät von Olympus. Ich bin aber weder mit dem Gerät noch mit der mitgelieferten Software zufrieden. Also muss/will ich selbst ran :lol: Ich erweitere mal so ganz nebenbei das Ding um ein paar Features.

Die von Olympus haben das mit dem AutoPlay aber irgendwie hinbekommen. Denn wenn deren DeviceDetector(tm) geladen ist, dann kümmert der und eben nur der sich um das im übrigen als USBSTOR geführte Gerät/Laufwerk. Ist das Programm nicht geladen, bekommt man wieder das "heiß geliebte" Explorer-Fenster. Es muss also gehen.
Die Frage ist daher nicht ob, sonder "nur" wie?

Zitat:

Zitat von soulies
Vllt gibt's anderen Lösungen für das Problem.

Da fällt mir nur gpedit.msc und dann ... ein. Das nervt aber, wenn man das auf zig Rechnern machen muss und elegant ist es eben auch nicht.

Das hier funktioniert leider nicht:
Delphi-Quellcode:
Type
   PDevBroadcastHdr   = ^TDevBroadcastHdr;
   TDevBroadcastHdr   = Packed Record
                              dbcd_size: DWORD;
                              dbcd_devicetype: DWORD;
                              dbcd_reserved: DWORD;
                       End;

   TForm1      = Class(TForm)
                     CheckBox1   : TCheckBox;
                     Procedure FormCreate(Sender: TObject);
                     Procedure CheckBox1Click(Sender: TObject);
                 End;

Var
   Form1            : TForm1;
   WM_AutoPlay      : Cardinal;
   Erlauben         : Boolean = False;   
   MsgWindow      : hWnd;

Implementation

{$R *.dfm}

Function InstallMessageWindow: hWnd;
Var
   S            : String;
   Ver         : TOSVersionInfoA;
Begin
   Ver.dwOSVersionInfoSize:=SizeOf(TOSVersionInfoA);
   If GetVersionEx(Ver) And (Ver.dwMajorVersion >= 5) Then
      S:='Message'
   Else
      S:='STATIC';
   Result:=CreateWindowExA(0, PChar(S), nil, WS_POPUP, 0, 0, 0, 0, 0, 0, GetCurrentProcessID, nil);
End;

Procedure WindowProcedure(Var Msg: TMessage);
Begin
   If Msg.Msg = WM_DeviceChange Then
   Begin
      Case Msg.WParam Of
      $8000   :   If PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype=$00000002 Then
               Begin
                  Application.Restore;
                  ShowMe(Application.Handle);   // auf Teufel komm raus nach vorn zwingen
               End;
      $8004   :   If PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype=$00000002 Then
               Begin
                  Application.Minimize;
               End;
      End;
   End
   Else If Msg.Msg=WM_AutoPlay Then
   Begin
      If Erlauben Then
         Msg.Result := 0 //enable auto-play
      Else
         Msg.Result := 1; //disable
   End;
//   Else Inherited WndProc(Msg);   // Wie hier weiter???
End;


procedure TForm1.CheckBox1Click(Sender: TObject);
begin
   Erlauben:=CheckBox1.Checked;
end;

Procedure TForm1.FormCreate(Sender: TObject);
Begin
   WM_AutoPlay:=RegisterWindowMessage('QueryCancelAutoPlay');
   MsgWindow:=InstallMessageWindow;
   If MsgWindow <> Invalid_Handle_Value Then
   Begin
      If SetWindowLongA(MsgWindow, GWL_WNDPROC, Integer(@WindowProcedure)) <> 0 Then
      ShowMessage('OK');
   End;
End;

End.
Was mache ich verkehrt? Bin streng nach zusammengesammeltem Beispielcode vorgegangen :lol:

Noch irgendwelche sonstigen Ideen?

Gruß und Dank, Alex

neo4a 1. Okt 2009 06:52

Re: USB - Autostart dynamisch unterbinden
 
Zitat:

Zitat:

Vllt gibt's anderen Lösungen für das Problem.
Da fällt mir nur gpedit.msc und dann ... ein. Das nervt aber, wenn man das auf zig Rechnern machen muss und elegant ist es eben auch nicht.
Wenn Du es hinbringst, die Registry-Einträge so einzustellen, dass beim Einstecken Deines USB-Gerätes nur Dein Programm aktiviert wird, dann gibt es auch Wege/Bibliotheken, diese notwendigen Registry-Manipulationen nur virtuell vorzunehmen. D.h., dass diese Änderungen der Registry dann auch nur zur Laufzeit Deines Programms wirksam sind.

--
Andreas

Schwedenbitter 1. Okt 2009 09:40

Re: USB - Autostart dynamisch unterbinden
 
Zitat:

Zitat von neo4a
Wenn Du es hinbringst, die Registry-Einträge so einzustellen, dass beim Einstecken Deines USB-Gerätes nur Dein Programm aktiviert wird ...

Danke! Dein Tipp hört sich gut an. Deiner Formulierung kann ich nur nicht entnehmen, ob das eine Vermutung ist oder Du positiv weißt, dass so etwas klappt/klappen kann. Wenn Du es weißt, würde ich mich mal über ein Stichwort oder einen weiteren Hinweis sehr freuen.

Ich hatte auch mal darüber nachgedacht, im Schlüssel HKCU\Software\Microsoft\Windows\CurrentVersion\Pol icies\Explorer den Wert von NoDriveTypeAutoRun auf 0x95 zu setzen. Dann käme kein Fenster mehr und Deine Idee mit der vorübergehenden Änderung der Registry wäre dann echt toll. Es scheitert aber daran, dass zumindest XP nach dem Ändern einen Neustart braucht.

Gruß, Alex

soulies 1. Okt 2009 14:58

Re: USB - Autostart dynamisch unterbinden
 
hoi,

Zitat:

Es ist ein digitales Diktiergerät von Olympus
und wenn Du es verbindest verteilt Windows einen neuen Laufwerksbuchstaben dafür so das Du
darauf zugreifen kannst (wie ein Laufwerk) ?

wenn dem so ist kannst ja mal folgdendes versuchen:
Du erstellst auf dem Diktiergerät eine 'Autorun.inf' - ohne Inhalt.

Gerät trennen - und wieder verbinden - dann sollte eigentlich das Explorerfenster auch nicht mehr erscheinen.

vom Prinzip her: Datei vorhanden = Explorer nein , Datei nicht vorhanden = Explorer ja

Es ist ein Versuch wert ob das funkt und vllt. kann man so für Dich das Problem auch lösen.


cya

Schwedenbitter 1. Okt 2009 16:56

Re: USB - Autostart dynamisch unterbinden
 
Zitat:

Zitat von soulies
Wenn Du es verbindest verteilt Windows einen neuen Laufwerksbuchstaben dafür so das Du darauf zugreifen kannst (wie ein Laufwerk)?

Genau! Die Herrschaften von Olympus können sogar noch mehr: Über Ihre Software teilen die dem Gerät die aktuelle Systemzeit mit, damit es Synchronisiert wird und sagen ihm auch, wie es heißen soll (= 4 stellige ID). Letzteres spiegelt sich dann im Dateinamen wieder z.B AAA_0001.DSS etc. pp.
Ich weiß, das passt hier nicht her: Kann man den Traffic irgendwie mitschneiden?

Das ganze ist nur sehr lahm und im VPN überhaupt nicht zu gebrauchen und es stören noch andere Ding. Wir haben einige dieser Geräte und dennoch wurden meine regelmäßigen Anfragen bislang nicht erhört: spreche eben kein Japanisch :lol:

Zitat:

Zitat von soulies
Du erstellst auf dem Diktiergerät eine 'Autorun.inf' - ohne Inhalt.

Werde es probieren

Danke!

Gruß, Alex

Alter Mann 1. Okt 2009 17:04

Re: USB - Autostart dynamisch unterbinden
 
Hi,

mal eine Frage zu der Olympus-Software: läuft da eventuell ein Dienst?

Gruß

Schwedenbitter 1. Okt 2009 17:16

Re: USB - Autostart dynamisch unterbinden
 
Zitat:

Zitat von Alter Mann
... läuft da eventuell ein Dienst?

Ja. Soll das des Rätsels Lösung sein?

Fragt sich nur, warum er den Autostart dann nur unterbindet, wenn ein zusätzliches Programm von Olympus im Tray liegt und er es ansonsten zulässt.

Alter Mann 1. Okt 2009 17:29

Re: USB - Autostart dynamisch unterbinden
 
Ich habe damals (2004) auch auf zwei Dienste zurückgegriffen, primär aber das die User
mir nicht meine Überwachung abschießen können.

Wenn der Dienst als SYSTEM läuft, läuft er in einem anderen Kontext und erhält
damit die Nachrichten früher, kann diese als 'bearbeitet' an das System zurück geben und
die vorgesehene Anwendung im User-Kontext starten.

Aber wie schon einmal geschrieben, das war 2004...

Gruß

Schwedenbitter 1. Okt 2009 18:35

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

Zitat von Alter Mann
Wenn der Dienst als SYSTEM läuft, läuft er in einem anderen Kontext und erhält damit die Nachrichten früher, kann diese als 'bearbeitet' an das System zurück geben und die vorgesehene Anwendung im User-Kontext starten.

Das ist mir dann aber zu kompliziert. Ich wollte nicht, dass der AutoRun mein Lebenswerk wird.

Das mit dem Anlegen einer autorun.inf hilft auch nicht.

Gruß und Danke, Alex

neo4a 2. Okt 2009 06:32

Re: USB - Autostart dynamisch unterbinden
 
Zitat:

Zitat von Schwedenbitter
Zitat:

Zitat von neo4a
Wenn Du es hinbringst, die Registry-Einträge so einzustellen, dass beim Einstecken Deines USB-Gerätes nur Dein Programm aktiviert wird ...

Danke! Dein Tipp hört sich gut an. Deiner Formulierung kann ich nur nicht entnehmen, ob das eine Vermutung ist oder Du positiv weißt, dass so etwas klappt/klappen kann. Wenn Du es weißt, würde ich mich mal über ein Stichwort oder einen weiteren Hinweis sehr freuen.

Ich kenne da BoxedApp und noch eine etwas günstigere $50-Variante (hab aber den Namen nicht parat), die eine solche Funktionalität bieten. Allerdings habe ich ja nun gelesen, dass bei Dir ein spezieller Dienst arbeitet, was die Sache ändert.

Mich interessiert für ein zukünftiges Projekt, ob man dynamisch zur Laufzeit eigener Programme z.B. den Bild/Kamera-Import-Assistenten abfangen und durch eine eigene Lösung ersetzen kann. Das soll ohne Installation oder gar Neustart funktionieren und auch das Default-Verhalten von Windows nach Beendigung des Programms wieder herstellen. (Ohne den Dienst hätten die Olympus-Leute nämlich prinzipiell gezeigt, dass es technisch geht.)

--
Andreas

Schwedenbitter 1. Mär 2010 13:17

Re: USB - Autostart dynamisch unterbinden
 
Nur der Vollständigkeit halber:

Es gibt eine ähnliche "Lösung", die aber sehr zeitig ansetzen muss. Es wird einfach die Shift-Taste simuliert. Allerdings ist damit dann die Zeit für das Auslesen des Datenträger-Inhalts mehr als begrenzt. Denn drückt man zu spät Shift, kommt das Fenster. Oder man drückt eben immer Shift, hat dann aber andere Laufwerke auch nicht mehr auf dem Schirm. WICHTIG: Für das Loslassen der Shift-Taste muss auch gesorgt werden!

Hier der Link.

Insgesamt bin ich aber an dem Thema immer noch interessiert. Falls also jemand eine einfach Lösung ohne Dienst etc. hat, dann bitte her damit.

Gruß, Alex

Astat 1. Mär 2010 19:43

Re: USB - Autostart dynamisch unterbinden
 
Zitat:

Zitat von Schwedenbitter
Insgesamt bin ich aber an dem Thema immer noch interessiert. Falls also jemand eine einfach Lösung ohne Dienst etc. hat, dann bitte her damit.

Hallo Schwedenbitter, anbei Hook Template zum Abfangen und Ändern der WM_DEVICECHANGE message.
Das Teil setzt soweit unten an, dass die Windowsmessages hier Aufschlagen bevor diese an die zuständige WndProc
gesendet werden.


Verwendung:
DLL einfach mit CreateHook aufrufen.


PS. Dient als Template, habs nicht vollständig durchgetestet, Feintuning eventuell Manuelle Parametrisierung
sowie IPC noch notwendig.




Delphi-Quellcode:

library Project1;

  {$IMAGEBASE $03900000}

uses
  windows,
  messages;

Type
   PDevBroadcastHdr  = ^TDevBroadcastHdr;
   TDevBroadcastHdr  = Packed Record
                          dbcd_size      : DWORD;
                          dbcd_devicetype : DWORD;
                          dbcd_reserved  : DWORD;
                        end;

var
  hWndProcHook: HHOOK=0;

// wParam:
//       [in] Specifies whether the message was sent by the current thread.
//       If the message was sent by the current thread, it is nonzero;
//       otherwise, it is zero.
// lParam:
//       [in] Pointer to a CWPSTRUCT structure that contains details about
//       the message.
//
// PCWPSTRUCT:
// lParam
//       Specifies additional information about the message.
//       The exact meaning depends on the message value.
// wParam
//       Specifies additional information about the message.
//       The exact meaning depends on the message value.
// message
//        Specifies the message.
// hwnd
//     Handle to the window to receive the message.

function CallWndProc(Code: integer; wParam: WPARAM; lParam: LPARAM): LResult; stdcall;
var
  pCWP: PCWPSTRUCT;
begin
  if Code >= 0 then begin
     Result := CallNextHookEx(hWndProcHook, Code, wParam, lParam);
  end else begin
     Result := CallNextHookEx(0, Code, wParam, lParam);
     EXIT;
  end;

  pCWP := pointer(lParam);

  if pCWP^.message = WM_DEVICECHANGE then begin
    case pCWP^.wParam of
    $8000   :
      if PDevBroadcastHdr(pCWP^.lParam)^.dbcd_devicetype = $00000002 then
      begin
        //-- Fenster der Hostapplication suchen und an dieses posten,
        //-- oder Host Application speichert Handle vor dem Laden der DLL in
        //-- shared memory oder Registry.
        //-- Elegant wäre hier eine IPC mit einem PIPE Client oder Socket Client

      end;
    $8004   :
      if PDevBroadcastHdr(pCWP^.lParam)^.dbcd_devicetype = $00000002 then
      begin
         //-- Ergo wie oben
      end;
    else
      pCWP.message := WM_NULL; //-- Message vernichten
    end;
  end;

(**
  case pCWP.message of
    WM_NULL             : wprocTranslator(pCWP.message,'WM_NULL');
    WM_CREATE           : wprocTranslator(pCWP.message,'WM_CREATE') ;
    WM_DESTROY          : wprocTranslator(pCWP.message,'WM_DESTROY') ;
    WM_MOVE             : wprocTranslator(pCWP.message,'WM_MOVE') ;
    WM_SIZE             : wprocTranslator(pCWP.message,'WM_SIZE') ;
    WM_ACTIVATE         : wprocTranslator(pCWP.message,'WM_ACTIVATE') ;
    WM_SETFOCUS         : wprocTranslator(pCWP.message,'WM_SETFOCUS') ;
    WM_KILLFOCUS        : wprocTranslator(pCWP.message,'WM_KILLFOCUS') ;
    WM_ENABLE           : wprocTranslator(pCWP.message,'WM_ENABLE') ;
    WM_SETREDRAW        : wprocTranslator(pCWP.message,'WM_SETREDRAW') ;
    WM_SETTEXT          : wprocTranslator(pCWP.message,'WM_SETTEXT') ;
    WM_GETTEXT          : wprocTranslator(pCWP.message,'WM_GETTEXT') ;
    WM_GETTEXTLENGTH    : wprocTranslator(pCWP.message,'WM_GETTEXTLENGTH') ;
    WM_PAINT            : wprocTranslator(pCWP.message,'WM_PAINT') ;
    WM_CLOSE            : wprocTranslator(pCWP.message,'WM_CLOSE') ;
    WM_QUERYENDSESSION  : wprocTranslator(pCWP.message,'WM_QUERYENDSESSION') ;
    WM_QUIT             : wprocTranslator(pCWP.message,'WM_QUIT') ;
    WM_QUERYOPEN        : wprocTranslator(pCWP.message,'WM_QUERYOPEN') ;
    WM_ERASEBKGND       : wprocTranslator(pCWP.message,'WM_ERASEBKGND') ;
    WM_SYSCOLORCHANGE   : wprocTranslator(pCWP.message,'WM_SYSCOLORCHANGE') ;
    WM_ENDSESSION       : wprocTranslator(pCWP.message,'WM_ENDSESSION') ;
    WM_SYSTEMERROR      : wprocTranslator(pCWP.message,'WM_SYSTEMERROR') ;
    WM_SHOWWINDOW       : wprocTranslator(pCWP.message,'WM_SHOWWINDOW') ;
    WM_CTLCOLOR         : wprocTranslator(pCWP.message,'WM_CTLCOLOR') ;
    WM_WININICHANGE     : wprocTranslator(pCWP.message,'WM_WININICHANGE') ;
    WM_DEVMODECHANGE    : wprocTranslator(pCWP.message,'WM_DEVMODECHANGE') ;
    WM_ACTIVATEAPP      : wprocTranslator(pCWP.message,'WM_ACTIVATEAPP') ;
    WM_FONTCHANGE       : wprocTranslator(pCWP.message,'WM_FONTCHANGE') ;
    WM_TIMECHANGE       : wprocTranslator(pCWP.message,'WM_TIMECHANGE') ;
    WM_CANCELMODE       : wprocTranslator(pCWP.message,'WM_CANCELMODE') ;
    WM_SETCURSOR        : wprocTranslator(pCWP.message,'WM_SETCURSOR') ;
    WM_MOUSEACTIVATE    : wprocTranslator(pCWP.message,'WM_MOUSEACTIVATE') ;
    WM_CHILDACTIVATE    : wprocTranslator(pCWP.message,'WM_CHILDACTIVATE') ;
    WM_QUEUESYNC        : wprocTranslator(pCWP.message,'WM_QUEUESYNC') ;
    WM_GETMINMAXINFO    : wprocTranslator(pCWP.message,'WM_GETMINMAXINFO') ;
    WM_PAINTICON        : wprocTranslator(pCWP.message,'WM_PAINTICON') ;
    WM_ICONERASEBKGND   : wprocTranslator(pCWP.message,'WM_ICONERASEBKGND') ;
    WM_NEXTDLGCTL       : wprocTranslator(pCWP.message,'WM_NEXTDLGCTL') ;
    WM_SPOOLERSTATUS    : wprocTranslator(pCWP.message,'WM_SPOOLERSTATUS') ;
    WM_DRAWITEM         : wprocTranslator(pCWP.message,'WM_DRAWITEM') ;
    WM_MEASUREITEM      : wprocTranslator(pCWP.message,'WM_MEASUREITEM') ;
    WM_DELETEITEM       : wprocTranslator(pCWP.message,'WM_DELETEITEM') ;
    WM_VKEYTOITEM       : wprocTranslator(pCWP.message,'WM_VKEYTOITEM') ;
    WM_CHARTOITEM       : wprocTranslator(pCWP.message,'WM_CHARTOITEM') ;
    WM_SETFONT          : wprocTranslator(pCWP.message,'WM_SETFONT') ;
    WM_GETFONT          : wprocTranslator(pCWP.message,'WM_GETFONT') ;
    WM_SETHOTKEY        : wprocTranslator(pCWP.message,'WM_SETHOTKEY') ;
    WM_GETHOTKEY        : wprocTranslator(pCWP.message,'WM_GETHOTKEY') ;
    WM_QUERYDRAGICON    : wprocTranslator(pCWP.message,'WM_QUERYDRAGICON') ;
    WM_COMPAREITEM      : wprocTranslator(pCWP.message,'WM_COMPAREITEM') ;
    WM_GETOBJECT        : wprocTranslator(pCWP.message,'WM_GETOBJECT') ;
    WM_COMPACTING       : wprocTranslator(pCWP.message,'WM_COMPACTING') ;
    WM_COMMNOTIFY       : wprocTranslator(pCWP.message,'WM_COMMNOTIFY') ;
    WM_WINDOWPOSCHANGING : wprocTranslator(pCWP.message,'WM_WINDOWPOSCHANGING') ;
    WM_WINDOWPOSCHANGED : wprocTranslator(pCWP.message,'WM_WINDOWPOSCHANGED') ;
    WM_POWER            : wprocTranslator(pCWP.message,'WM_POWER') ;
    WM_COPYDATA         : wprocTranslator(pCWP.message,'WM_COPYDATA') ;
    WM_CANCELJOURNAL    : wprocTranslator(pCWP.message,'WM_CANCELJOURNAL') ;
    WM_NOTIFY           : wprocTranslator(pCWP.message,'WM_NOTIFY') ;
    WM_INPUTLANGCHANGEREQUEST : wprocTranslator(pCWP.message,'WM_INPUTLANGCHANGEREQUEST') ;
    WM_INPUTLANGCHANGE  : wprocTranslator(pCWP.message,'WM_INPUTLANGCHANGE') ;
    WM_TCARD            : wprocTranslator(pCWP.message,'WM_TCARD') ;
    WM_HELP             : wprocTranslator(pCWP.message,'WM_HELP') ;
    WM_USERCHANGED      : wprocTranslator(pCWP.message,'WM_USERCHANGED') ;
    WM_NOTIFYFORMAT     : wprocTranslator(pCWP.message,'WM_NOTIFYFORMAT') ;
    WM_CONTEXTMENU      : wprocTranslator(pCWP.message,'WM_CONTEXTMENU') ;
    WM_STYLECHANGING    : wprocTranslator(pCWP.message,'WM_STYLECHANGING') ;
    WM_STYLECHANGED     : wprocTranslator(pCWP.message,'WM_STYLECHANGED') ;
    WM_DISPLAYCHANGE    : wprocTranslator(pCWP.message,'WM_DISPLAYCHANGE') ;
    WM_GETICON          : wprocTranslator(pCWP.message,'WM_GETICON') ;
    WM_SETICON          : wprocTranslator(pCWP.message,'WM_SETICON') ;
    WM_NCCREATE         : wprocTranslator(pCWP.message,'WM_NCCREATE') ;
    WM_NCDESTROY        : wprocTranslator(pCWP.message,'WM_NCDESTROY') ;
    WM_NCCALCSIZE       : wprocTranslator(pCWP.message,'WM_NCCALCSIZE') ;
    WM_NCHITTEST        : wprocTranslator(pCWP.message,'WM_NCHITTEST') ;
    WM_NCPAINT          : wprocTranslator(pCWP.message,'WM_NCPAINT') ;
    WM_NCACTIVATE       : wprocTranslator(pCWP.message,'WM_NCACTIVATE') ;
    WM_GETDLGCODE       : wprocTranslator(pCWP.message,'WM_GETDLGCODE') ;
    WM_NCMOUSEMOVE      : wprocTranslator(pCWP.message,'WM_NCMOUSEMOVE') ;
    WM_NCLBUTTONDOWN    : wprocTranslator(pCWP.message,'WM_NCLBUTTONDOWN') ;
    WM_NCLBUTTONUP      : wprocTranslator(pCWP.message,'WM_NCLBUTTONUP') ;
    WM_NCLBUTTONDBLCLK  : wprocTranslator(pCWP.message,'WM_NCLBUTTONDBLCLK') ;
    WM_NCRBUTTONDOWN    : wprocTranslator(pCWP.message,'WM_NCRBUTTONDOWN') ;
    WM_NCRBUTTONUP      : wprocTranslator(pCWP.message,'WM_NCRBUTTONUP') ;
    WM_NCRBUTTONDBLCLK  : wprocTranslator(pCWP.message,'WM_NCRBUTTONDBLCLK') ;
    WM_NCMBUTTONDOWN    : wprocTranslator(pCWP.message,'WM_NCMBUTTONDOWN') ;
    WM_NCMBUTTONUP      : wprocTranslator(pCWP.message,'WM_NCMBUTTONUP') ;
    WM_NCMBUTTONDBLCLK  : wprocTranslator(pCWP.message,'WM_NCMBUTTONDBLCLK') ;
    WM_KEYFIRST         : wprocTranslator(pCWP.message,'WM_KEYFIRST') ;
    WM_KEYUP            : wprocTranslator(pCWP.message,'WM_KEYUP') ;
    WM_CHAR             : wprocTranslator(pCWP.message,'WM_CHAR') ;
    WM_DEADCHAR         : wprocTranslator(pCWP.message,'WM_DEADCHAR') ;
    WM_SYSKEYDOWN       : wprocTranslator(pCWP.message,'WM_SYSKEYDOWN') ;
    WM_SYSKEYUP         : wprocTranslator(pCWP.message,'WM_SYSKEYUP') ;
    WM_SYSCHAR          : wprocTranslator(pCWP.message,'WM_SYSCHAR') ;
    WM_SYSDEADCHAR      : wprocTranslator(pCWP.message,'WM_SYSDEADCHAR') ;
    WM_KEYLAST          : wprocTranslator(pCWP.message,'WM_KEYLAST') ;
    WM_INITDIALOG       : wprocTranslator(pCWP.message,'WM_INITDIALOG') ;
    WM_COMMAND          :
    begin
      if HiWord(wParam) = BN_CLICKED then begin
         GetWindowText(pCWP^.lParam,szWndText,sizeof(szWndText));
         wprocTranslator(pCWP^.message,'BN_CLICKED: ' + szWndText);
      end;
    end;
    WM_SYSCOMMAND       : wprocTranslator(pCWP.message,'WM_SYSCOMMAND') ;
    WM_TIMER            : wprocTranslator(pCWP.message,'WM_TIMER') ;
    WM_HSCROLL          : wprocTranslator(pCWP.message,'WM_HSCROLL') ;
    WM_VSCROLL          : wprocTranslator(pCWP.message,'WM_VSCROLL') ;
    WM_INITMENU         : wprocTranslator(pCWP.message,'WM_INITMENU') ;
    WM_INITMENUPOPUP    : wprocTranslator(pCWP.message,'WM_INITMENUPOPUP');
    WM_MENUSELECT       : wprocTranslator(pCWP.message,'WM_MENUSELECT') ;
    WM_MENUCHAR         : wprocTranslator(pCWP.message,'WM_MENUCHAR') ;
    WM_ENTERIDLE        : wprocTranslator(pCWP.message,'WM_ENTERIDLE') ;
    WM_MENURBUTTONUP    : wprocTranslator(pCWP.message,'WM_MENURBUTTONUP') ;
    WM_MENUDRAG         : wprocTranslator(pCWP.message,'WM_MENUDRAG') ;
    WM_MENUGETOBJECT    : wprocTranslator(pCWP.message,'WM_MENUGETOBJECT') ;
    WM_UNINITMENUPOPUP  : wprocTranslator(pCWP.message,'WM_UNINITMENUPOPUP') ;
    WM_MENUCOMMAND      : wprocTranslator(pCWP.message,'WM_MENUCOMMAND') ;
    WM_CTLCOLORMSGBOX   : wprocTranslator(pCWP.message,'WM_CTLCOLORMSGBOX') ;
    WM_CTLCOLOREDIT     : wprocTranslator(pCWP.message,'WM_CTLCOLOREDIT') ;
    WM_CTLCOLORLISTBOX  : wprocTranslator(pCWP.message,'WM_CTLCOLORLISTBOX') ;
    WM_CTLCOLORBTN      : wprocTranslator(pCWP.message,'WM_CTLCOLORBTN') ;
    WM_CTLCOLORDLG      : wprocTranslator(pCWP.message,'WM_CTLCOLORDLG') ;
    WM_CTLCOLORSCROLLBAR : wprocTranslator(pCWP.message,'WM_CTLCOLORSCROLLBAR') ;
    WM_CTLCOLORSTATIC   : wprocTranslator(pCWP.message,'WM_CTLCOLORSTATIC') ;
    WM_MOUSEFIRST       : wprocTranslator(pCWP.message,'WM_MOUSEFIRST') ;
    WM_LBUTTONDOWN      : wprocTranslator(pCWP.message,'WM_LBUTTONDOWN') ;
    WM_LBUTTONUP        : wprocTranslator(pCWP.message,'WM_LBUTTONUP') ;
    WM_LBUTTONDBLCLK    : wprocTranslator(pCWP.message,'WM_LBUTTONDBLCLK') ;
    WM_RBUTTONDOWN      : wprocTranslator(pCWP.message,'WM_RBUTTONDOWN') ;
    WM_RBUTTONUP        : wprocTranslator(pCWP.message,'WM_RBUTTONUP') ;
    WM_RBUTTONDBLCLK    : wprocTranslator(pCWP.message,'WM_RBUTTONDBLCLK') ;
    WM_MBUTTONDOWN      : wprocTranslator(pCWP.message,'WM_MBUTTONDOWN') ;
    WM_MBUTTONUP        : wprocTranslator(pCWP.message,'WM_MBUTTONUP') ;
    WM_MBUTTONDBLCLK    : wprocTranslator(pCWP.message,'WM_MBUTTONDBLCLK') ;
    WM_MOUSEWHEEL       : wprocTranslator(pCWP.message,'WM_MOUSEWHEEL') ;
    WM_PARENTNOTIFY     : wprocTranslator(pCWP.message,'WM_PARENTNOTIFY') ;
    WM_ENTERMENULOOP    : wprocTranslator(pCWP.message,'WM_ENTERMENULOOP') ;
    WM_EXITMENULOOP     : wprocTranslator(pCWP.message,'WM_EXITMENULOOP') ;
    WM_NEXTMENU         : wprocTranslator(pCWP.message,'WM_NEXTMENU') ;
    WM_SIZING           : wprocTranslator(pCWP.message,'WM_SIZING') ;
    WM_CAPTURECHANGED   : wprocTranslator(pCWP.message,'WM_CAPTURECHANGED') ;
    WM_MOVING           : wprocTranslator(pCWP.message,'WM_MOVING') ;
    WM_POWERBROADCAST   : wprocTranslator(pCWP.message,'WM_POWERBROADCAST') ;
    WM_DEVICECHANGE     : wprocTranslator(pCWP.message,'WM_DEVICECHANGE') ;
    WM_IME_STARTCOMPOSITION : wprocTranslator(pCWP.message,'WM_IME_STARTCOMPOSITION') ;
    WM_IME_ENDCOMPOSITION  : wprocTranslator(pCWP.message,'WM_IME_ENDCOMPOSITION') ;
    WM_IME_COMPOSITION     : wprocTranslator(pCWP.message,'WM_IME_COMPOSITION') ;
    WM_IME_SETCONTEXT      : wprocTranslator(pCWP.message,'WM_IME_SETCONTEXT') ;
    WM_IME_NOTIFY          : wprocTranslator(pCWP.message,'WM_IME_NOTIFY') ;
    WM_IME_CONTROL         : wprocTranslator(pCWP.message,'WM_IME_CONTROL') ;
    WM_IME_COMPOSITIONFULL : wprocTranslator(pCWP.message,'WM_IME_COMPOSITIONFULL') ;
    WM_IME_SELECT          : wprocTranslator(pCWP.message,'WM_IME_SELECT') ;
    WM_IME_CHAR            : wprocTranslator(pCWP.message,'WM_IME_CHAR') ;
    WM_IME_REQUEST         : wprocTranslator(pCWP.message,'WM_IME_REQUEST') ;
    WM_IME_KEYDOWN         : wprocTranslator(pCWP.message,'WM_IME_KEYDOWN') ;
    WM_IME_KEYUP           : wprocTranslator(pCWP.message,'WM_IME_KEYUP') ;
    WM_MDICREATE        : wprocTranslator(pCWP.message,'WM_MDICREATE') ;
    WM_MDIDESTROY       : wprocTranslator(pCWP.message,'WM_MDIDESTROY') ;
    WM_MDIACTIVATE      : wprocTranslator(pCWP.message,'WM_MDIACTIVATE') ;
    WM_MDIRESTORE       : wprocTranslator(pCWP.message,'WM_MDIRESTORE') ;
    WM_MDINEXT          : wprocTranslator(pCWP.message,'WM_MDINEXT') ;
    WM_MDIMAXIMIZE      : wprocTranslator(pCWP.message,'WM_MDIMAXIMIZE') ;
    WM_MDITILE          : wprocTranslator(pCWP.message,'WM_MDITILE') ;
    WM_MDICASCADE       : wprocTranslator(pCWP.message,'WM_MDICASCADE') ;
    WM_MDIICONARRANGE   : wprocTranslator(pCWP.message,'WM_MDIICONARRANGE') ;
    WM_MDIGETACTIVE     : wprocTranslator(pCWP.message,'WM_MDIGETACTIVE') ;
    WM_MDISETMENU       : wprocTranslator(pCWP.message,'WM_MDISETMENU') ;
    WM_ENTERSIZEMOVE    : wprocTranslator(pCWP.message,'WM_ENTERSIZEMOVE') ;
    WM_EXITSIZEMOVE     : wprocTranslator(pCWP.message,'WM_EXITSIZEMOVE') ;
    WM_DROPFILES        : wprocTranslator(pCWP.message,'WM_DROPFILES') ;
    WM_MDIREFRESHMENU   : wprocTranslator(pCWP.message,'WM_MDIREFRESHMENU') ;
    WM_MOUSEHOVER       : wprocTranslator(pCWP.message,'WM_MOUSEHOVER') ;
    WM_MOUSELEAVE       : wprocTranslator(pCWP.message,'WM_MOUSELEAVE') ;
    WM_CUT              : wprocTranslator(pCWP.message,'WM_CUT') ;
    WM_COPY             : wprocTranslator(pCWP.message,'WM_COPY') ;
    WM_PASTE            : wprocTranslator(pCWP.message,'WM_PASTE') ;
    WM_CLEAR            : wprocTranslator(pCWP.message,'WM_CLEAR') ;
    WM_UNDO             : wprocTranslator(pCWP.message,'WM_UNDO') ;
    WM_RENDERFORMAT     : wprocTranslator(pCWP.message,'WM_RENDERFORMAT') ;
    WM_RENDERALLFORMATS : wprocTranslator(pCWP.message,'WM_RENDERALLFORMATS') ;
    WM_DESTROYCLIPBOARD : wprocTranslator(pCWP.message,'WM_DESTROYCLIPBOARD') ;
    WM_DRAWCLIPBOARD    : wprocTranslator(pCWP.message,'WM_DRAWCLIPBOARD') ;
    WM_PAINTCLIPBOARD   : wprocTranslator(pCWP.message,'WM_PAINTCLIPBOARD') ;
    WM_VSCROLLCLIPBOARD : wprocTranslator(pCWP.message,'WM_VSCROLLCLIPBOARD') ;
    WM_SIZECLIPBOARD    : wprocTranslator(pCWP.message,'WM_SIZECLIPBOARD') ;
    WM_ASKCBFORMATNAME  : wprocTranslator(pCWP.message,'WM_ASKCBFORMATNAME') ;
    WM_CHANGECBCHAIN    : wprocTranslator(pCWP.message,'WM_CHANGECBCHAIN') ;
    WM_HSCROLLCLIPBOARD : wprocTranslator(pCWP.message,'WM_HSCROLLCLIPBOARD') ;
    WM_QUERYNEWPALETTE  : wprocTranslator(pCWP.message,'WM_QUERYNEWPALETTE') ;
    WM_PALETTEISCHANGING : wprocTranslator(pCWP.message,'WM_PALETTEISCHANGING') ;
    WM_PALETTECHANGED   : wprocTranslator(pCWP.message,'WM_PALETTECHANGED') ;
    WM_HOTKEY           : wprocTranslator(pCWP.message,'WM_HOTKEY') ;
    WM_PRINT            : wprocTranslator(pCWP.message,'WM_PRINT') ;
    WM_PRINTCLIENT      : wprocTranslator(pCWP.message,'WM_PRINTCLIENT') ;
    WM_HANDHELDFIRST    : wprocTranslator(pCWP.message,'WM_HANDHELDFIRST') ;
    WM_HANDHELDLAST     : wprocTranslator(pCWP.message,'WM_HANDHELDLAST') ;
    WM_PENWINFIRST      : wprocTranslator(pCWP.message,'WM_PENWINFIRST') ;
    WM_PENWINLAST       : wprocTranslator(pCWP.message,'WM_PENWINLAST') ;
    WM_COALESCE_FIRST   : wprocTranslator(pCWP.message,'WM_COALESCE_FIRST') ;
    WM_COALESCE_LAST    : wprocTranslator(pCWP.message,'WM_COALESCE_LAST') ;
    WM_DDE_FIRST        : wprocTranslator(pCWP.message,'WM_DDE_FIRST') ;
    WM_DDE_TERMINATE    : wprocTranslator(pCWP.message,'WM_DDE_TERMINATE') ;
    WM_DDE_ADVISE       : wprocTranslator(pCWP.message,'WM_DDE_ADVISE') ;
    WM_DDE_UNADVISE     : wprocTranslator(pCWP.message,'WM_DDE_UNADVISE') ;
    WM_DDE_ACK          : wprocTranslator(pCWP.message,'WM_DDE_ACK') ;
    WM_DDE_DATA         : wprocTranslator(pCWP.message,'WM_DDE_DATA') ;
    WM_DDE_REQUEST      : wprocTranslator(pCWP.message,'WM_DDE_REQUEST') ;
    WM_DDE_POKE         : wprocTranslator(pCWP.message,'WM_DDE_POKE') ;
    WM_DDE_EXECUTE      : wprocTranslator(pCWP.message,'WM_DDE_EXECUTE') ;
    WM_APP              : wprocTranslator(pCWP.message,'WM_APP') ;
    WM_USER             : wprocTranslator(pCWP.message,'WM_USER') ;
  end;
  **)
end;


function CreateHook: integer; stdcall;
begin
  hWndProcHook := SetWindowsHookEx(WH_CALLWNDPROC, @CallWndProc, hInstance, 0);
  result := hWndProcHook;
end;

function DeleteHook: integer; stdcall;
begin
  result := Ord(UnhookWindowsHookEx(hWndProcHook));
end;

function StartUp:integer; stdcall;
begin
  result:=0;
end;

procedure DLLEntryPoint(dwReason: DWORD);
begin
  case dwReason of
    DLL_PROCESS_ATTACH: ; //-- IPC init
    DLL_PROCESS_DETACH: ; //-- IPC release
  end;
end;

exports
  CreateHook,
  DeleteHook;

begin
  IsMultithread := true;
  DisableThreadLibraryCalls(hInstance);
  DllProc := @DLLEntryPoint;
  DLLEntryPoint(DLL_PROCESS_ATTACH);
end.

devidespe 23. Feb 2015 13:19

AW: USB - Autostart dynamisch unterbinden
 
Hallo,

ich wollte dieses etwas "angestaubte" Thema noch einmal aufgreifen, da ich zurzeit eine Lösung suche. Nach dem Durcharbeiten des gesamten Threads habe ich verschiedene Sources und Varianten probiert, die aber allesamt nicht zu Erfolg führten.

Der letzte Post scheint sehr vielversprechend zu sein, allerdings benötige ich eine Lösung ohne DLL, also direkt in die Sources eines Formulares eingebettet. Das Problem ist, dass es bei einigen USB-Sticks jedes mal und ohne Probleme funktioniert, Autostart zu unterbinden. Allerdings habe ich hier einige Sticks, bei denen das nur beim ersten Anstecken funktioniert, wenn ich den Stick entferne und nach 5 Sekunden erneut anstecke, wird Autostart ausgelöst. Und das obwohl das Mainform permanent im Vordergrund ist und die Applikation über vollständige Admin-Rechte verfügt. Betriebssystem ist Windows 7 SP1 32 Bit. Woran könnte das liegen?

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
  public
  end;

  PDevBroadcastHdr = ^TDevBroadcastHdr;
  TDevBroadcastHdr = Packed Record
                       dbcd_size : DWORD;
                       dbcd_devicetype : DWORD;
                       dbcd_reserved : DWORD;
                     end;

var hWndProcHook: HHOOK=0;
    Form1: TForm1;

implementation

{$R *.dfm}

function CallWndProc(Code: integer; wParam: WPARAM; lParam: LPARAM): LResult; stdcall;
var pCWP: PCWPSTRUCT;
begin
  if Code >= 0 then
  begin
    Result := CallNextHookEx(hWndProcHook, Code, wParam, lParam);
  end else
  begin
    Result := CallNextHookEx(0, Code, wParam, lParam);
    EXIT;
  end;

  pCWP := pointer(lParam);

  if pCWP^.message = WM_DEVICECHANGE then
  begin
    case pCWP^.wParam of
     $8000 :
       if PDevBroadcastHdr(pCWP^.lParam)^.dbcd_devicetype = $00000002 then
       begin
         //-- Fenster der Hostapplication suchen und an dieses posten,
         //-- oder Host Application speichert Handle vor dem Laden der DLL in
         //-- shared memory oder Registry.
         //-- Elegant wäre hier eine IPC mit einem PIPE Client oder Socket Client
       end;
     $8004 :
       if PDevBroadcastHdr(pCWP^.lParam)^.dbcd_devicetype = $00000002 then
       begin
         //-- Ergo wie oben
       end;
     else
       pCWP.message := WM_NULL; //-- Message vernichten
    end;
  end;
end;

function CreateHook: integer; stdcall;
begin
  hWndProcHook := SetWindowsHookEx(WH_CALLWNDPROC, @CallWndProc, hInstance, 0);
  result := hWndProcHook;
end;

function DeleteHook: integer; stdcall;
begin
  result := Ord(UnhookWindowsHookEx(hWndProcHook));
end;

function StartUp:integer; stdcall;
begin
  result:=0;
end;

procedure DLLEntryPoint(dwReason: DWORD);
begin
  case dwReason of
    DLL_PROCESS_ATTACH: ; //-- IPC init
    DLL_PROCESS_DETACH: ; //-- IPC release
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var HookResult : integer;
begin
  IsMultithread := true;
  DisableThreadLibraryCalls(hInstance);
  DllProc := @DLLEntryPoint;
  DLLEntryPoint(DLL_PROCESS_ATTACH);

  HookResult:=CreateHook;
end;

end.

devidespe 27. Feb 2015 14:04

AW: USB - Autostart dynamisch unterbinden
 
Hmm, hat das jemand austesten können? Funktioniert die Unterdrückung des USB-Autostarts?


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:24 Uhr.

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