Einzelnen Beitrag anzeigen

devidespe

Registriert seit: 7. Sep 2006
Ort: Berlin
434 Beiträge
 
Delphi 10.4 Sydney
 
#32

AW: USB - Autostart dynamisch unterbinden

  Alt 23. Feb 2015, 13:19
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.
Devid
57 65 72 20 6C 65 73 65 6E 20 6B 61 6E 6E 2C 20 69 73 74 20 6B 6C 61 72 20 69 6D 20 56 6F 72 74 65 69 6C 21
  Mit Zitat antworten Zitat