unit DUsbMonMain; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, ThdUsbMon, Tocsg.Trace; type TDlgUsbMonMain = class(TForm) pnTop: TPanel; btnPreventUsb: TButton; rdReadOnly: TRadioButton; rdBlock: TRadioButton; mmLog: TMemo; rdMonitor: TRadioButton; edDrive: TEdit; btnDismount: TButton; btnDrvInfo: TButton; procedure btnPreventUsbClick(Sender: TObject); procedure btnDismountClick(Sender: TObject); procedure btnDrvInfoClick(Sender: TObject); private { Private declarations } ThdUsbMon_: TThdUsbMon; Trace_: TTgTrace; public { Public declarations } Constructor Create(aOwner: TComponent); override; Destructor Destroy; override; procedure process_WM_USBCONTROL_NOTIFY(var msg: TMessage); Message WM_USBCONTROL_NOTIFY; end; var DlgUsbMonMain: TDlgUsbMonMain; implementation uses Tocsg.Driver, Tocsg.Convert, Tocsg.Path, Tocsg.Disk; {$R *.dfm} Constructor TDlgUsbMonMain.Create(aOwner: TComponent); begin Inherited Create(aOwner); Trace_ := TTgTrace.Create(GetRunExePathDir, CutFileExt(GetRunExeName) + '.log'); Trace_.Level := 10; ThdUsbMon_ := nil; end; Destructor TDlgUsbMonMain.Destroy; begin if ThdUsbMon_ <> nil then FreeAndNil(ThdUsbMon_); Inherited; FreeAndNil(Trace_); end; procedure TDlgUsbMonMain.btnDismountClick(Sender: TObject); begin edDrive.Text := Trim(edDrive.Text); if (edDrive.Text = '') and (not DirectoryExists(edDrive.Text)) then begin ShowMessage('실패 1'); exit; end; // ShowMessage(GetVolumeName(edDrive.Text)); // exit; if EjectDrive(edDrive.Text, nil, true, true) = FAIL_EJECT then ShowMessage('실패 2') else ShowMessage('성공'); end; procedure TDlgUsbMonMain.btnDrvInfoClick(Sender: TObject); var DriveInfo: TDriveInfo; begin edDrive.Text := Trim(edDrive.Text); if (edDrive.Text = '') and (not DirectoryExists(edDrive.Text)) then begin ShowMessage('실패 1'); exit; end; GetDriveDetail(edDrive.Text, @DriveInfo, true); mmLog.Lines.Add('Drive : ' + DriveInfo.sDrive); mmLog.Lines.Add('Drive Type : ' + GetDriveTypeToStr(GetDriveType(PChar(DriveInfo.sDrive)))); mmLog.Lines.Add('Serial : ' + DriveInfo.sSerial); mmLog.Lines.Add('Class : ' + DriveInfo.sClass); mmLog.Lines.Add('ClassGuid : ' + DriveInfo.sClassGuid); mmLog.Lines.Add('Description : ' + DriveInfo.sDesc); mmLog.Lines.Add('FriendlyName : ' + DriveInfo.sFriendlyName); mmLog.Lines.Add(Format('Size : %s (%d)', [ByteSizeToStr(DriveInfo.llSize), DriveInfo.llSize])); mmLog.Lines.Add('DiskNum : ' + IntToStr(DriveInfo.nDiskNum)); end; procedure TDlgUsbMonMain.btnPreventUsbClick(Sender: TObject); var ActionKind: TUsbProcKind; begin if ThdUsbMon_ = nil then begin if rdMonitor.Checked then ActionKind := upkMonitor else if rdReadOnly.Checked then ActionKind := upkReadOnly else ActionKind := upkBlock; mmLog.Clear; ThdUsbMon_ := TThdUsbMon.Create(Handle, ActionKind); ThdUsbMon_.StartThread; end else begin if MessageBox(Handle, PChar('중지하시겠습니까?'), PChar(Caption), MB_ICONQUESTION or MB_YESNO) = IDNO then exit; FreeAndNil(ThdUsbMon_); end; rdMonitor.Enabled := ThdUsbMon_ = nil; rdReadOnly.Enabled := rdMonitor.Enabled; rdBlock.Enabled := rdMonitor.Enabled; if rdMonitor.Enabled then btnPreventUsb.Caption := 'USB 제어 시작' else btnPreventUsb.Caption := 'USB 제어 중지'; Application.ProcessMessages; end; procedure TDlgUsbMonMain.process_WM_USBCONTROL_NOTIFY(var msg: TMessage); procedure WriteLog(sLog: String); begin mmLog.Lines.Add(Format('[%s] %s', [DateTimeToStr(Now), sLog])); end; var pEnt: PUsbEnt; begin pEnt := PUsbEnt(msg.LParam); case msg.WParam of ACTION_USBCONTROL_ARRIVAL : begin WriteLog(Format('연결됨 : Drive=%s, Size=%s, DevName=%s', [pEnt.DriveInfo.sDrive, ByteSizeToStr(pEnt.DriveInfo.llSize), pEnt.DriveInfo.sFriendlyName])); end; ACTION_USBCONTROL_REMOVE : begin WriteLog(Format('해제됨 : Drive=%s, Size=%s, DevName=%s', [pEnt.DriveInfo.sDrive, ByteSizeToStr(pEnt.DriveInfo.llSize), pEnt.DriveInfo.sFriendlyName])); end; ACTION_USBCONTROL_READONLY : begin WriteLog(Format('읽기전용 적용! : Drive=%s, Size=%s, DevName=%s', [pEnt.DriveInfo.sDrive, ByteSizeToStr(pEnt.DriveInfo.llSize), pEnt.DriveInfo.sFriendlyName])); end; ACTION_USBCONTROL_READONLY_RETRAY : ; ACTION_USBCONTROL_BLOCK : begin WriteLog(Format('차단!! : Drive=%s, Size=%s, DevName=%s', [pEnt.DriveInfo.sDrive, ByteSizeToStr(pEnt.DriveInfo.llSize), pEnt.DriveInfo.sFriendlyName])); end; end; end; end.