BSOne.SFC/Tocsg.Module/UsbMon/DUsbMonMain.pas

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.