![]() |
USB - Autostart dynamisch unterbinden
Hallo,
zwar habe ich schon Code gefunden, ![]() Ich möchte gern die komplette Steuerung für eine bestimmtes USB-Gerät übernehmen. ![]() 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 |
Re: USB - Autostart dynamisch unterbinden
Hallo
Schon mal dies probiert: Bei DBT_DEVICEARRIVAL : ein abschließendes Msg.Result := 0; einfügen. Gruß |
Re: USB - Autostart dynamisch unterbinden
Zitat:
Gruß, Alex |
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 ![]() Gruß, Alex |
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: ![]() Vielleicht hilft das ja weiter. Gruß PS Oder suchst Du so etwas wie im Anhang? |
Re: USB - Autostart dynamisch unterbinden
Zitat:
Ich konnte die Datei leider nicht ausführen. Es kommt die Fehlermeldung rtl70.bpl wurde nicht gefunden und ich solle die Anwendung neu installieren... :( |
Re: USB - Autostart dynamisch unterbinden
Ups,
da war wohl ein harken an der falschen Stelle. Habe eine neue Version hochgeladen. Gruß |
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] |
Re: USB - Autostart dynamisch unterbinden
Hallo
Zitat:
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:
Wobei lvRemovable ein ListView ist.
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; Einzelheiten zum ermitteln der VID/PID und anderes findest du in der DP, Jahrgang 2004. Also einfach die ![]() 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:
Auch dazu gibt es genug Beispiele in der DP, zB:
Delphi-Quellcode:
Und schau dir dazu nochmals die USBStor.pas an(wegen des Handle usw.).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; So und falls noch Fragen sind, immer Fragen. Gruß |
Re: USB - Autostart dynamisch unterbinden
Zitat:
Oder hat das damit nichts zu tun? :gruebel: Zitat:
Zitat:
Zitat:
Zitat:
Gruß, Alex |
Re: USB - Autostart dynamisch unterbinden
Hallo Schwedenbitter,
zwei Fragen seien gestattet: Betriebssystem und Delphi-Version? Das ganze wurde damals für D7 geschrieben. Gruß |
Re: USB - Autostart dynamisch unterbinden
@Alter Mann
Zitat:
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:
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.
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; 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 |
Re: USB - Autostart dynamisch unterbinden
Zitat:
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 |
Re: USB - Autostart dynamisch unterbinden
Hast du es auch schon mit einem "richtigem"
![]() |
Re: USB - Autostart dynamisch unterbinden
Danke für den Hinweis. Das kannte ich bislang nicht:
Zitat:
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 |
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: |
Re: USB - Autostart dynamisch unterbinden
Zitat:
Das wiederum wird vom BS offenbar nur dann "ernst genommen", wenn mein Fenster nicht minimiert und nicht im Hintergrund ist. Zitat:
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:
Gruß, Alex
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; |
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 ![]() |
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 |
Re: USB - Autostart dynamisch unterbinden
@soulies
Zitat:
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:
Das hier funktioniert leider nicht:
Delphi-Quellcode:
Was mache ich verkehrt? Bin streng nach zusammengesammeltem Beispielcode vorgegangen :lol:
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. Noch irgendwelche sonstigen Ideen? Gruß und Dank, Alex |
Re: USB - Autostart dynamisch unterbinden
Zitat:
-- Andreas |
Re: USB - Autostart dynamisch unterbinden
Zitat:
Ich hatte auch mal darüber nachgedacht, im Schlüssel HKCU\Software\Microsoft\Windows\CurrentVersion\Pol icies\Explorer den Wert von NoDriveTypeAutoRun auf ![]() Gruß, Alex |
Re: USB - Autostart dynamisch unterbinden
hoi,
Zitat:
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 |
Re: USB - Autostart dynamisch unterbinden
Zitat:
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:
Danke! Gruß, Alex |
Re: USB - Autostart dynamisch unterbinden
Hi,
mal eine Frage zu der Olympus-Software: läuft da eventuell ein Dienst? Gruß |
Re: USB - Autostart dynamisch unterbinden
Zitat:
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. |
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ß |
Re: USB - Autostart dynamisch unterbinden
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Das mit dem Anlegen einer autorun.inf hilft auch nicht. Gruß und Danke, Alex |
Re: USB - Autostart dynamisch unterbinden
Zitat:
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 |
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 ![]() 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 |
Re: USB - Autostart dynamisch unterbinden
Zitat:
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. |
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. |
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 03:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz