175 lines
4.8 KiB
Plaintext
175 lines
4.8 KiB
Plaintext
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.
|