@@ -57,6 +57,7 @@ TMain = class(TForm)
5757 private
5858 procedure LoadRegRules ;
5959 procedure WMCopyData (var Msg: TWMCopyData); message WM_COPYDATA;
60+ procedure HandleParams ;
6061 { Private declarations }
6162 public
6263 { Public declarations }
@@ -67,14 +68,15 @@ TMain = class(TForm)
6768 RuleNames, RulePaths: TStringList;
6869 CloseDuplicate: boolean;
6970 BlockedCount: integer;
71+ UnblockedCount: integer;
7072
7173 // Ïåðåâîä / Tranlate
7274 ID_SEARCH: string;
7375
7476 ID_ABOUT, ID_LAST_UPDATE: string;
7577
76- ID_RULE_SUCCESSFULLY_CREATED, ID_RULE_ALREADY_EXISTS, ID_RULE_SUCCESSFULLY_REMOVED,
77- ID_CHOOSE_RULE, ID_RULES_SUCCESSFULLY_CREATED, ID_FAILED_CREATE_RULES,
78+ ID_RULE_SUCCESSFULLY_CREATED, ID_RULE_ALREADY_EXISTS, ID_RULE_SUCCESSFULLY_REMOVED, ID_RULE_NOT_FOUND, ID_CHOOSE_RULE,
79+ ID_RULES_SUCCESSFULLY_CREATED, ID_FAILED_CREATE_RULES, ID_RULES_SUCCESSFULLY_REMOVED, ID_FAILED_REMOVE_RULES ,
7880 ID_REMOVED_RULES_FOR_NONEXISTENT_APPS, ID_RULES_FOR_NONEXISTENT_APPS_NOT_FOUND: string;
7981
8082const
@@ -247,7 +249,7 @@ procedure TMain.LoadRegRules;
247249 Reg:=TRegistry.Create;
248250 SubKeyNames:=TStringList.Create;
249251 Reg.RootKey:=HKEY_LOCAL_MACHINE;
250- Reg.OpenKeyReadOnly(' SYSTEM\ControlSet001 \services\SharedAccess\Parameters\FirewallPolicy\FirewallRules' );
252+ Reg.OpenKeyReadOnly(' SYSTEM\CurrentControlSet \services\SharedAccess\Parameters\FirewallPolicy\FirewallRules' );
251253 Reg.GetValueNames(Rules);
252254 for i:=0 to Rules.Count - 1 do begin
253255 RegName:=Reg.ReadString(Rules.Strings[i]);
@@ -278,6 +280,60 @@ procedure SendMessageToHandle(TrgWND: HWND; MsgToHandle: string);
278280 SendMessage(TrgWND, WM_COPYDATA, Integer(Application.Handle), Integer(@CDS));
279281end ;
280282
283+ procedure TMain.HandleParams ;
284+ var
285+ i: Integer;
286+ WND: HWND;
287+ Msg: String;
288+ begin
289+ // Ïîâòîðíûé çàïóñê, ïåðåäà÷à ParamStr
290+ if ParamCount >= 2 then begin
291+ if AnsiLowerCase(ExtractFileExt(ParamStr(2 ))) = ' .exe' then begin
292+
293+ // Handles /block
294+ if AnsiLowerCase(ParamStr(1 )) = ' /block' then begin
295+ if Pos(AnsiLowerCase(ExpandFileName(ParamStr(2 ))), AnsiLowerCase(RulePaths.Text)) = 0 then begin
296+ AddRulesForApp(ExpandFileName(ParamStr(2 )));
297+ StatusBar.SimpleText:=' ' + Format(ID_RULE_SUCCESSFULLY_CREATED, [CutStr(ExtractFileName(ParamStr(2 )), 22 )]);
298+ Inc(BlockedCount);
299+ Msg:=' %ADDED%' ;
300+
301+ end else begin
302+ StatusBar.SimpleText:=' ' + Format(ID_RULE_ALREADY_EXISTS, [CutStr(ExtractFileName(ParamStr(2 )), 22 )]);
303+ Msg:=' %EXISTS%' ;
304+ end ;
305+
306+ // Handles /unblock
307+ end else if AnsiLowerCase(ParamStr(1 )) = ' /unblock' then begin
308+ if Pos(AnsiLowerCase(ExpandFileName(ParamStr(2 ))), AnsiLowerCase(RulePaths.Text)) > 0 then begin
309+ for i:=0 to RuleNames.Count - 1 do begin
310+ if AnsiLowerCase(ExpandFileName(ParamStr(2 ))) = AnsiLowerCase(RulePaths.Strings[i]) then begin
311+ RemoveAppRules(RuleNames.Strings[i]);
312+ StatusBar.SimpleText:=' ' + Format(ID_RULE_SUCCESSFULLY_REMOVED, [CutStr(ExtractFileName(ParamStr(2 )), 22 )]);
313+ Inc(UnblockedCount);
314+ Msg:=' %REMOVED%' ;
315+
316+ Break;
317+ end ;
318+ end ;
319+
320+ end else begin
321+ StatusBar.SimpleText:=' ' + Format(ID_RULE_NOT_FOUND, [CutStr(ExtractFileName(ParamStr(2 )), 22 )]);
322+ Msg:=' %MISSING%' ;
323+ end ;
324+ end ;
325+
326+ if Msg <> ' ' then begin
327+ WND:=FindWindow(' TMain' , ' Firewall Easy' );
328+ if WND <> 0 then begin
329+ CloseDuplicate:=true;
330+ SendMessageToHandle(WND, Msg);
331+ end ;
332+ end ;
333+ end ;
334+ end ;
335+ end ;
336+
281337function GetLocaleInformation (flag: integer): string;
282338var
283339 pcLCA: array [0 ..20 ] of Char;
@@ -289,7 +345,7 @@ function GetLocaleInformation(flag: integer): string;
289345
290346procedure TMain.FormCreate (Sender: TObject);
291347var
292- WND: HWND; Ini: TIniFile; Reg: TRegistry;
348+ Ini: TIniFile; Reg: TRegistry;
293349begin
294350 // Ïåðåâîä / Translate
295351 if FileExists(ExtractFilePath(ParamStr(0 )) + ' Languages\' + GetLocaleInformation(LOCALE_SENGLANGUAGE) + ' .ini' ) then
@@ -320,9 +376,12 @@ procedure TMain.FormCreate(Sender: TObject);
320376 ID_RULE_SUCCESSFULLY_CREATED:=Ini.ReadString(' Main' , ' ID_RULE_SUCCESSFULLY_CREATED' , ' ' );
321377 ID_RULE_ALREADY_EXISTS:=Ini.ReadString(' Main' , ' ID_RULE_ALREADY_EXISTS' , ' ' );
322378 ID_RULE_SUCCESSFULLY_REMOVED:=Ini.ReadString(' Main' , ' ID_RULE_SUCCESSFULLY_REMOVED' , ' ' );
379+ ID_RULE_NOT_FOUND:=Ini.ReadString(' Main' , ' ID_RULE_NOT_FOUND' , ' ' );
323380 ID_CHOOSE_RULE:=Ini.ReadString(' Main' , ' ID_CHOOSE_RULE' , ' ' );
324381 ID_RULES_SUCCESSFULLY_CREATED:=Ini.ReadString(' Main' , ' ID_RULES_SUCCESSFULLY_CREATED' , ' ' );
325382 ID_FAILED_CREATE_RULES:=Ini.ReadString(' Main' , ' ID_FAILED_CREATE_RULES' , ' ' );
383+ ID_RULES_SUCCESSFULLY_REMOVED:=Ini.ReadString(' Main' , ' ID_RULES_SUCCESSFULLY_REMOVED' , ' ' );
384+ ID_FAILED_REMOVE_RULES:=Ini.ReadString(' Main' , ' ID_FAILED_REMOVE_RULES' , ' ' );
326385 ID_REMOVED_RULES_FOR_NONEXISTENT_APPS:=Ini.ReadString(' Main' , ' ID_REMOVED_RULES_FOR_NONEXISTENT_APPS' , ' ' );
327386 ID_RULES_FOR_NONEXISTENT_APPS_NOT_FOUND:=Ini.ReadString(' Main' , ' ID_RULES_FOR_NONEXISTENT_APPS_NOT_FOUND' , ' ' );
328387
@@ -337,30 +396,25 @@ procedure TMain.FormCreate(Sender: TObject);
337396 Reg:=TRegistry.Create;
338397 Reg.RootKey:=HKEY_CLASSES_ROOT;
339398 if (Reg.OpenKeyReadOnly(' \exefile\shell\FirewallEasy' ) = false) and (Reg.OpenKey(' \exefile\shell\FirewallEasy' , true)) then begin
340- Reg.WriteString(' ' , Ini.ReadString(' Main' , ' ID_BLOCK_ACCESS ' , ' ' ));
399+ Reg.WriteString(' MUIVerb ' , Ini.ReadString(' Main' , ' ID_CONTEXT_MENU ' , ' ' ));
341400 Reg.WriteString(' Icon' , ParamStr(0 ));
342- Reg.OpenKey(' \exefile\shell\FirewallEasy\command' , true);
343- Reg.WriteString(' ' , ParamStr(0 ) + ' "%1"' );
401+ Reg.WriteString(' SubCommands' , ' ' );
402+ Reg.OpenKey(' \exefile\shell\FirewallEasy\Shell\Block' , true);
403+ Reg.WriteString(' MUIVerb' , Ini.ReadString(' Main' , ' ID_BLOCK_ACCESS' , ' ' ));
404+ Reg.WriteString(' HasLUAShield' , ' ' );
405+ Reg.OpenKey(' \exefile\shell\FirewallEasy\Shell\Block\Command' , true);
406+ Reg.WriteString(' ' , ' "' + ParamStr(0 ) + ' " /block "%1"' );
407+ Reg.OpenKey(' \exefile\shell\FirewallEasy\Shell\Unblock' , true);
408+ Reg.WriteString(' MUIVerb' , Ini.ReadString(' Main' , ' ID_UNBLOCK_ACCESS' , ' ' ));
409+ Reg.WriteString(' HasLUAShield' , ' ' );
410+ Reg.OpenKey(' \exefile\shell\FirewallEasy\Shell\Unblock\Command' , true);
411+ Reg.WriteString(' ' , ' "' + ParamStr(0 ) + ' " /unblock "%1"' );
344412 end ;
345413 Reg.CloseKey;
346414 Reg.Free;
347415 Ini.Free;
348416
349- // Ïîâòîðíûé çàïóñê, ïåðåäà÷à ParamStr(1)
350- if ParamCount > 0 then
351- if AnsiLowerCase(ExtractFileExt(ParamStr(1 ))) = ' .exe' then begin
352- if Pos(ParamStr(1 ), RulePaths.Text) = 0 then begin
353- AddRulesForApp(ParamStr(1 ));
354- StatusBar.SimpleText:=' ' + Format(ID_RULE_SUCCESSFULLY_CREATED, [CutStr(ExtractFileName(ParamStr(1 )), 22 )]);
355- Inc(BlockedCount);
356- WND:=FindWindow(' TMain' , ' Firewall Easy' );
357- if WND <> 0 then begin
358- CloseDuplicate:=true;
359- SendMessageToHandle(WND, ' %ADDED%' );
360- end ;
361-
362- end else StatusBar.SimpleText:=' ' + Format(ID_RULE_ALREADY_EXISTS, [CutStr(ExtractFileName(ParamStr(1 )), 22 )]);
363- end ;
417+ HandleParams;
364418
365419 if CloseDuplicate = false then
366420 Caption:=' Firewall Easy' ;
@@ -406,12 +460,24 @@ procedure TMain.ListViewKeyUp(Sender: TObject; var Key: Word;
406460end ;
407461
408462procedure TMain.WMCopyData (var Msg: TWMCopyData);
463+ var
464+ Input: string;
409465begin
410- if PChar(TWMCopyData(Msg).CopyDataStruct.lpData) = ' %ADDED%' then begin
466+ Input:=PChar(TWMCopyData(Msg).CopyDataStruct.lpData);
467+
468+ if Input = ' %ADDED%' then begin
411469 Inc(BlockedCount);
412470 LoadRegRules;
413471 StatusBar.SimpleText:=' ' + ID_RULES_SUCCESSFULLY_CREATED + ' ' + IntToStr(BlockedCount);
414- end ;
472+ end else if Input = ' %REMOVED%' then begin
473+ Inc(UnblockedCount);
474+ LoadRegRules;
475+ StatusBar.SimpleText:=' ' + ID_RULES_SUCCESSFULLY_REMOVED + ' ' + IntToStr(UnblockedCount);
476+ end else if Input = ' %EXISTS%' then
477+ StatusBar.SimpleText:=' ' + ID_FAILED_CREATE_RULES
478+ else if Input = ' %MISSING%' then
479+ StatusBar.SimpleText:=' ' + ID_FAILED_REMOVE_RULES;
480+
415481 Msg.Result:=Integer(True);
416482end ;
417483
@@ -527,8 +593,8 @@ procedure TMain.ExportBtnClick(Sender: TObject);
527593
528594procedure TMain.AboutBtnClick (Sender: TObject);
529595begin
530- Application.MessageBox(PChar(Caption + ' 0.7.1 ' + #13 #10 +
531- ID_LAST_UPDATE + ' 31.03.2024 ' + #13 #10 +
596+ Application.MessageBox(PChar(Caption + ' 0.8 ' + #13 #10 +
597+ ID_LAST_UPDATE + ' 25.05.2025 ' + #13 #10 +
532598 ' https://r57zone.github.io' + #13 #10 +
533599 ' [email protected] ' ), PChar(ID_ABOUT), MB_ICONINFORMATION);
534600end ;
0 commit comments