diff --git a/build/Source/FirewallControl.pas b/build/Source/FirewallControl.pas new file mode 100644 index 0000000000..903db3ba7a --- /dev/null +++ b/build/Source/FirewallControl.pas @@ -0,0 +1,1244 @@ +{ +License Agreement + +This content is subject to the Mozilla Public License Version 1.1 (the "License"); +You may not use this plugin except in compliance with the License. You may +obtain a copy of the License at http://www.mozilla.org/MPL. + +Alternatively, you may redistribute this library, use and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2.1 of the License, +or (at your option) any later version. You may obtain a copy +of the LGPL at www.gnu.org/copyleft. + +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +for the specific language governing rights and limitations under the License. + +The original code is FirewallControl.pas, released April 16, 2007. + +The initial developer of the original code is Rainer Döpke +(Formerly: Rainer Budde) (http://www.speed-soft.de). + +SimpleFC - NSIS Firewall Control Plugin is written, published and maintaned by +Rainer Döpke (rainer@speed-soft.de). +} +unit FirewallControl; + +interface + +uses + NetFwTypeLib_TLB, ComObj, ActiveX, Variants, SysUtils, ServiceControl; + +type + NET_FW_IP_VERSION = ( + NET_FW_IP_VERSION_V4 = $00000000, + NET_FW_IP_VERSION_V6 = $00000001, + NET_FW_IP_VERSION_ANY = $00000002, + NET_FW_IP_VERSION_MAX = $00000003 + ); + + NET_FW_IP_PROTOCOL = ( + NET_FW_IP_PROTOCOL_ICMP_V4 = $00000001, + NET_FW_IP_PROTOCOL_ICMP_V6 = $0000003A, + NET_FW_IP_PROTOCOL_TCP = $00000006, + NET_FW_IP_PROTOCOL_UDP = $00000011, + NET_FW_IP_PROTOCOL_ANY = $00000100 + ); + + NET_FW_ACTION = ( + NET_FW_ACTION_BLOCK = $00000000, + NET_FW_ACTION_ALLOW = $00000001, + NET_FW_ACTION_MAX = $00000002 + ); + + NET_FW_SCOPE = ( + NET_FW_SCOPE_ALL = $00000000, + NET_FW_SCOPE_LOCAL_SUBNET = $00000001, + NET_FW_SCOPE_CUSTOM = $00000002, + NET_FW_SCOPE_MAX = $00000003 + ); + + NET_FW_PROFILE_TYPE2 = ( + NET_FW_PROFILE2_DOMAIN = $00000001, + NET_FW_PROFILE2_PRIVATE = $00000002, + NET_FW_PROFILE2_PUBLIC = $00000004, + NET_FW_PROFILE2_ALL = $7FFFFFFF + ); + + NET_FW_RULE_DIRECTION = ( + NET_FW_RULE_DIR_IN = $00000001, + NET_FW_RULE_DIR_OUT = $00000002, + NET_FW_RULE_DIR_MAX = $00000003 + ); + + NET_FW_ICMP_TYPE = ( + NET_FW_ICMP_V4_OUTBOUND_DESTINATION_UNREACHABLE = $00000003, + NET_FW_ICMP_V4_OUTBOUND_SOURCE_QUENCH = $00000004, + NET_FW_ICMP_V4_REDIRECT = $00000005, + NET_FW_ICMP_V4_INBOUND_ECHO_REQUEST = $00000008, + NET_FW_ICMP_V4_INBOUND_ROUTER_REQUEST = $00000009, + NET_FW_ICMP_V4_OUTBOUND_TIME_EXCEEDED = $0000000B, + NET_FW_ICMP_V4_OUTBOUND_PARAMETER_PROBLEM = $0000000C, + NET_FW_ICMP_V4_INBOUND_TIMESTAMP_REQUEST = $0000000D, + NET_FW_ICMP_V4_INBOUND_MASK_REQUEST = $00000011, + NET_FW_ICMP_V6_OUTBOUND_DESTINATION_UNREACHABLE = $00000001, + NET_FW_ICMP_V6_OUTBOUND_PACKET_TOO_BIG = $00000002, + NET_FW_ICMP_V6_OUTBOUND_TIME_EXCEEDED = $00000003, + NET_FW_ICMP_V6_OUTBOUND_PARAMETER_PROBLEM = $00000004, + NET_FW_ICMP_V6_INBOUND_ECHO_REQUEST = $00000080, + NET_FW_ICMP_V6_REDIRECT = $00000089 + ); + + { Functions for Windows Firewall } + function AddPort(Port: Integer; Name: String; Protocol: NET_FW_IP_PROTOCOL; + Scope: NET_FW_SCOPE; IpVersion: NET_FW_IP_VERSION; RemoteAddresses: String; + Enabled: Boolean): HRESULT; + function RemovePort(Port: Integer; Protocol: NET_FW_IP_PROTOCOL): HRESULT; + function AddApplication(Name: String; BinaryPath: String; Scope: NET_FW_SCOPE; + IpVersion: NET_FW_IP_VERSION; RemoteAdresses: String; Enabled: Boolean): HRESULT; + function RemoveApplication(BinaryPath: String): HRESULT; + function IsPortAdded(Port: Integer; Protocol: NET_FW_IP_PROTOCOL; + var Added: Boolean): HRESULT; + function IsApplicationAdded(BinaryPath: String; var Added: Boolean): HRESULT; + function IsPortEnabled(Port: Integer; Protocol: NET_FW_IP_PROTOCOL; + var Enabled: Boolean): HRESULT; + function IsApplicationEnabled(BinaryPath: String; var Enabled: Boolean): HRESULT; + function EnableDisablePort(Port: Integer; Protocol: NET_FW_IP_PROTOCOL; + Enabled: Boolean): HRESULT; + function EnableDisableApplication(BinaryPath: String; Enabled: Boolean): HRESULT; + function IsFirewallEnabled(var Enabled: Boolean): HRESULT; + function EnableDisableFirewall(Enabled: Boolean): HRESULT; + function AllowDisallowExceptionsNotAllowed(NotAllowed: Boolean): HRESULT; + function AreExceptionsNotAllowed(var NotAllowed: Boolean): HRESULT; + function EnableDisableNotifications(Enabled: Boolean): HRESULT; + function AreNotificationsEnabled(var Enabled: Boolean): HRESULT; + function IsFirewallServiceRunning(var IsRunning: Boolean): Boolean; + function StartStopFirewallService(StartService: Boolean): Boolean; + function RestoreDefaults: HRESULT; + function AllowDisallowIcmpOutboundDestinationUnreachable(Allow: Boolean): HRESULT; + function AllowDisallowIcmpRedirect(Allow: Boolean): HRESULT; + function AllowDisallowIcmpInboundEchoRequest(Allow: Boolean): HRESULT; + function AllowDisallowIcmpOutboundTimeExceeded(Allow: Boolean): HRESULT; + function AllowDisallowIcmpOutboundParameterProblem(Allow: Boolean): HRESULT; + function AllowDisallowIcmpOutboundSourceQuench(Allow: Boolean): HRESULT; + function AllowDisallowIcmpInboundRouterRequest(Allow: Boolean): HRESULT; + function AllowDisallowIcmpInboundTimestampRequest(Allow: Boolean): HRESULT; + function AllowDisallowIcmpInboundMaskRequest(Allow: Boolean): HRESULT; + function AllowDisallowIcmpOutboundPacketTooBig(Allow: Boolean): HRESULT; + function IsIcmpTypeAllowed(IpVersion: NET_FW_IP_VERSION; LocalAddress: String; + IcmpType: NET_FW_ICMP_TYPE; var Allowed: Boolean; var Restricted: Boolean): HRESULT; + + { Functions for Windows Firewall with advanced security } + function AdvAddRule(Name: String; Description: String; + Protocol: NET_FW_IP_PROTOCOL; Direction: NET_FW_RULE_DIRECTION; + Enabled: Boolean; Profile: NET_FW_PROFILE_TYPE2; Action: NET_FW_ACTION; + ApplicationName: String; ServiceName: String; IcmpTypesAndCodes: String; + Group: String; LocalPorts: String; RemotePorts: String; + LocalAddress: String; RemoteAddress: String): HRESULT; + function AdvRemoveRule(Name: String): HRESULT; + function AdvExistsRule(Name: String; var Exists: Boolean): HRESULT; + +implementation + +const + FW_MGR_CLASS_NAME = 'HNetCfg.FwMgr'; + FW_OPENPORT_CLASS_NAME = 'HNetCfg.FwOpenPort'; + FW_AUTHORIZED_APPLICATION = 'HNetCfg.FwAuthorizedApplication'; + FW_POLICY2_NAME = 'HNetCfg.FwPolicy2'; + FW_RULE_NAME = 'HNetCfg.FWRule'; + FW_SERVICE_XP_WIN2003 = 'SharedAccess'; + FW_SERVICE_VISTA = 'MpsSvc'; + +function CreateWideString(Value: String): PWideChar; +var + WideValue: PWideChar; +begin + GetMem(WideValue, Length(Value) * SizeOf(WideChar) + 1); + StringToWideChar(Value, WideValue, Length(Value) * SizeOf(WideChar) + 1); + + Result := WideValue; +end; + +procedure FreeWideString(Value: PWideChar); +begin + FreeMem(Value); +end; + +function AdvAddRule(Name: String; Description: String; + Protocol: NET_FW_IP_PROTOCOL; Direction: NET_FW_RULE_DIRECTION; + Enabled: Boolean; Profile: NET_FW_PROFILE_TYPE2; Action: NET_FW_ACTION; + ApplicationName: String; ServiceName: String; IcmpTypesAndCodes: String; + Group: String; LocalPorts: String; RemotePorts: String; + LocalAddress: String; RemoteAddress: String): HRESULT; +const + NET_FW_GROUPING = '@firewallapi.dll,-23255'; +var + FwPolicy2Disp: IDispatch; + FwPolicy2: INetFwPolicy2; + FwRuleDisp: IDispatch; + FwRule: INetFwRule; +begin + Result := S_OK; + + try + FwPolicy2Disp := CreateOleObject(FW_POLICY2_NAME); + try + FwPolicy2 := INetFwPolicy2(FwPolicy2Disp); + + FwRuleDisp := CreateOleObject(FW_RULE_NAME); + try + FwRule := INetFwRule(FwRuleDisp); + FwRule.Name := Name; + FwRule.Description := Description; + FwRule.Protocol := Integer(Protocol); + FwRule.Direction := Integer(Direction); + FwRule.Enabled := Enabled; + FwRule.Profiles := Integer(Profile); + FwRule.Action := TOleEnum(Action); + + if ApplicationName <> '' then + FwRule.ApplicationName := ApplicationName; + + if ServiceName <> '' then + FwRule.ServiceName := ServiceName; + + if IcmpTypesAndCodes <> '' then + FwRule.IcmpTypesAndCodes := IcmpTypesAndCodes; + + if Group <> '' then + FwRule.Grouping := Group + else + FwRule.Grouping := NET_FW_GROUPING; + + if LocalPorts <> '' then + FwRule.LocalPorts := LocalPorts; + + if RemotePorts <> '' then + FwRule.RemotePorts := RemotePorts; + + if LocalAddress <> '' then + FwRule.LocalAddresses := LocalAddress; + + if RemoteAddress <> '' then + FwRule.RemoteAddresses := RemoteAddress; + + FwPolicy2.Rules.Add(FwRule); + finally + FwRuleDisp := Unassigned; + end; + finally + FwPolicy2Disp := Unassigned; + end; + + except + on E:EOleSysError do + begin + Result := E.ErrorCode; + end; + end; +end; + +function AdvRemoveRule(Name: String): HRESULT; +var + FwPolicy2Disp: IDispatch; + FwPolicy2: INetFwPolicy2; +begin + Result := S_OK; + + try + FwPolicy2Disp := CreateOleObject(FW_POLICY2_NAME); + try + FwPolicy2 := INetFwPolicy2(FwPolicy2Disp); + FwPolicy2.Rules.Remove(Name); + finally + FwPolicy2Disp := Unassigned; + end; + + except + on E:EOleSysError do + Result := E.ErrorCode; + end; +end; + +function AdvExistsRule(Name: String; var Exists: Boolean): HRESULT; +var + FwPolicy2Disp: IDispatch; + FwPolicy2: INetFwPolicy2; + FwRule: INetFwRule; + FwRuleInstances: IEnumVariant; + TempFwRuleObj: OleVariant; + TempObjValue: Cardinal; + EnumerateNext: Boolean; +begin + Result := S_OK; + EnumerateNext := True; + + try + FwPolicy2Disp := CreateOleObject(FW_POLICY2_NAME); + try + FwPolicy2 := INetFwPolicy2(FwPolicy2Disp); + + FwRuleInstances := FwPolicy2.Rules.Get__NewEnum as IEnumVariant; + + while EnumerateNext and not Exists do + if FwRuleInstances.Next(1, TempFwRuleObj, TempObjValue) <> 0 then + EnumerateNext := False + else + begin + FwRule := IUnknown(TempFwRuleObj) as INetFwRule; + + Exists := LowerCase(FwRule.Name) = LowerCase(Name); + end; + finally + FwPolicy2Disp := Unassigned; + end; + + except + on E:EOleSysError do + Result := E.ErrorCode; + end; +end; + +function AddPort(Port: Integer; Name: String; Protocol: NET_FW_IP_PROTOCOL; + Scope: NET_FW_SCOPE; IpVersion: NET_FW_IP_VERSION; RemoteAddresses: String; + Enabled: Boolean): HRESULT; +var + FwMgrDisp: IDispatch; + FwMgr: INetFwMgr; + FwProfile: INetFwProfile; + FwOpenPortDisp: IDispatch; + FwOpenPort: INetFwOpenPort; + RemoteAddressesW: PWideChar; +begin + Result := S_OK; + + try + FwMgrDisp := CreateOleObject(FW_MGR_CLASS_NAME); + try + FwMgr := INetFwMgr(FwMgrDisp); + + FwProfile := FwMgr.LocalPolicy.CurrentProfile; + + FwOpenPortDisp := CreateOleObject(FW_OPENPORT_CLASS_NAME); + try + FwOpenPort := INetFwOpenPort(FwOpenPortDisp); + + GetMem(RemoteAddressesW, Length(RemoteAddresses) * SizeOf(WideChar) + 1); + try + StringToWideChar(RemoteAddresses, RemoteAddressesW, Length(RemoteAddresses) * SizeOf(WideChar) + 1); + + FwOpenPort.Port := Port; + FwOpenPort.Name := Name; + FwOpenPort.Protocol := TOleEnum(Protocol); + + if (Scope = NET_FW_SCOPE_ALL) or (Scope = NET_FW_SCOPE_LOCAL_SUBNET) then + FwOpenPort.Scope := TOleEnum(Scope) + else + FwOpenPort.RemoteAddresses := RemoteAddressesW; + + FwOpenPort.IpVersion := TOleEnum(IpVersion); + FwOpenPort.Enabled := Enabled; + + FwProfile.GloballyOpenPorts.Add(FwOpenPort); + + finally + FreeMem(RemoteAddressesW); + end; + + finally + FwOpenPortDisp := Unassigned; + end; + finally + FwMgrDisp := Unassigned; + end; + except + on E:EOleSysError do + Result := E.ErrorCode; + end; +end; + +function RemovePort(Port: Integer; Protocol: NET_FW_IP_PROTOCOL): HRESULT; +var + FwMgrDisp: IDispatch; + FwMgr: INetFwMgr; + FwProfile: INetFwProfile; +begin + Result := S_OK; + + try + FwMgrDisp := CreateOleObject(FW_MGR_CLASS_NAME); + try + FwMgr := INetFwMgr(FwMgrDisp); + + FwProfile := FwMgr.LocalPolicy.CurrentProfile; + FwProfile.GloballyOpenPorts.Remove(Port, TOleEnum(Protocol)); + finally + FwMgrDisp := Unassigned; + end; + except + on E:EOleSysError do + Result := E.ErrorCode; + end; +end; + +function AddApplication(Name: String; BinaryPath: String; Scope: NET_FW_SCOPE; + IpVersion: NET_FW_IP_VERSION; RemoteAdresses: String; + Enabled: Boolean): HRESULT; +var + FwMgrDisp: IDispatch; + FwMgr: INetFwMgr; + FwProfile: INetFwProfile; + FwAppDisp: IDispatch; + FwApp: INetFwAuthorizedApplication; + RemoteAddressesW: PWideChar; +begin + Result := S_OK; + + try + FwMgrDisp := CreateOleObject(FW_MGR_CLASS_NAME); + try + FwMgr := INetFwMgr(FwMgrDisp); + + FwProfile := FwMgr.LocalPolicy.CurrentProfile; + + FwAppDisp := CreateOleObject(FW_AUTHORIZED_APPLICATION); + try + FwApp := INetFwAuthorizedApplication(FwAppDisp); + + GetMem(RemoteAddressesW, Length(RemoteAdresses) * SizeOf(WideChar) + 1); + try + StringToWideChar(RemoteAdresses, RemoteAddressesW, Length(RemoteAdresses) * SizeOf(WideChar) + 1); + + FwApp.Name := Name; + FwApp.ProcessImageFileName := BinaryPath; + + if (Scope = NET_FW_SCOPE_ALL) or (Scope = NET_FW_SCOPE_LOCAL_SUBNET) then + FwApp.Scope := TOleEnum(Scope) + else + FwApp.RemoteAddresses := RemoteAddressesW; + + FwApp.IpVersion := TOleEnum(IpVersion); + FwApp.Enabled := Enabled; + + FwProfile.AuthorizedApplications.Add(FwApp); + + finally + FreeMem(RemoteAddressesW) + end; + finally + FwAppDisp := Unassigned; + end; + finally + FwMgrDisp := Unassigned; + end; + except + on E:EOleSysError do + Result := E.ErrorCode; + end; +end; + +function RemoveApplication(BinaryPath: String): HRESULT; +var + FwMgrDisp: IDispatch; + FwMgr: INetFwMgr; + FwProfile: INetFwProfile; +begin + Result := S_OK; + + try + FwMgrDisp := CreateOleObject(FW_MGR_CLASS_NAME); + try + FwMgr := INetFwMgr(FwMgrDisp); + + FwProfile := FwMgr.LocalPolicy.CurrentProfile; + FwProfile.AuthorizedApplications.Remove(BinaryPath); + finally + FwMgrDisp := Unassigned; + end; + except + on E:EOleSysError do + Result := E.ErrorCode; + end; +end; + +function IsPortAdded(Port: Integer; Protocol: NET_FW_IP_PROTOCOL; + var Added: Boolean): HRESULT; +var + FwMgrDisp: IDispatch; + FwMgr: INetFwMgr; + FwProfile: INetFwProfile; + FwOpenPort: INetFwOpenPort; + FwOpenPortInstances: IEnumVariant; + TempFwPortObj: OleVariant; + TempObjValue: Cardinal; + EnumerateNext: Boolean; +begin + Result := S_OK; + Added := False; + EnumerateNext := True; + + try + FwMgrDisp := CreateOleObject(FW_MGR_CLASS_NAME); + try + FwMgr := INetFwMgr(FwMgrDisp); + + FwProfile := FwMgr.LocalPolicy.CurrentProfile; + FwOpenPortInstances := FwProfile.GloballyOpenPorts.Get__NewEnum as IEnumVariant; + + while EnumerateNext and not Added do + if FwOpenPortInstances.Next(1, TempFwPortObj, TempObjValue) <> 0 then + EnumerateNext := False + else + begin + FwOpenPort := IUnknown(TempFwPortObj) as INetFwOpenPort; + + Added := (FwOpenPort.Port = Port) and (FwOpenPort.Protocol = TOleEnum(Protocol)) + end; + + finally + FwMgrDisp := Unassigned; + end; + except + on E:EOleSysError do + Result := E.ErrorCode; + end; +end; + +function IsApplicationAdded(BinaryPath: String; var Added: Boolean): HRESULT; +var + FwMgrDisp: IDispatch; + FwMgr: INetFwMgr; + FwProfile: INetFwProfile; + FwApp: INetFwAuthorizedApplication; + FwAppInstances: IEnumVariant; + TempFwApp: OleVariant; + TempObjValue: Cardinal; + EnumerateNext: Boolean; +begin + Result := S_OK; + Added := False; + EnumerateNext := True; + + try + FwMgrDisp := CreateOleObject(FW_MGR_CLASS_NAME); + try + FwMgr := INetFwMgr(FwMgrDisp); + + FwProfile := FwMgr.LocalPolicy.CurrentProfile; + FwAppInstances := FwProfile.AuthorizedApplications.Get__NewEnum as IEnumVariant; + + while EnumerateNext and not Added do + if FwAppInstances.Next(1, TempFwApp, TempObjValue) <> 0 then + EnumerateNext := False + else + begin + FwApp := IUnknown(TempFwApp) as INetFwAuthorizedApplication; + + Added := LowerCase(FwApp.ProcessImageFileName) = LowerCase(BinaryPath) + end; + + finally + FwMgrDisp := Unassigned; + end; + except + on E:EOleSysError do + Result := E.ErrorCode; + end; +end; + +function IsPortEnabled(Port: Integer; Protocol: NET_FW_IP_PROTOCOL; + var Enabled: Boolean): HRESULT; +var + FwMgrDisp: IDispatch; + FwMgr: INetFwMgr; + FwProfile: INetFwProfile; + FwOpenPort: INetFwOpenPort; + FwOpenPortInstances: IEnumVariant; + TempFwPortObj: OleVariant; + TempObjValue: Cardinal; + EnumerateNext: Boolean; +begin + Result := S_OK; + Enabled := False; + EnumerateNext := True; + + try + FwMgrDisp := CreateOleObject(FW_MGR_CLASS_NAME); + try + FwMgr := INetFwMgr(FwMgrDisp); + + FwProfile := FwMgr.LocalPolicy.CurrentProfile; + FwOpenPortInstances := FwProfile.GloballyOpenPorts.Get__NewEnum as IEnumVariant; + + while EnumerateNext do + if FwOpenPortInstances.Next(1, TempFwPortObj, TempObjValue) <> 0 then + EnumerateNext := False + else + begin + FwOpenPort := IUnknown(TempFwPortObj) as INetFwOpenPort; + + if (FwOpenPort.Port = Port) and (FwOpenPort.Protocol = TOleEnum(Protocol)) then + begin + Enabled := FwOpenPort.Enabled; + EnumerateNext := False; + end; + + end; + + finally + FwMgrDisp := Unassigned; + end; + except + on E:EOleSysError do + Result := E.ErrorCode; + end; +end; + +function IsApplicationEnabled(BinaryPath: String; + var Enabled: Boolean): HRESULT; +var + FwMgrDisp: IDispatch; + FwMgr: INetFwMgr; + FwProfile: INetFwProfile; + FwApp: INetFwAuthorizedApplication; + FwAppInstances: IEnumVariant; + TempFwApp: OleVariant; + TempObjValue: Cardinal; + EnumerateNext: Boolean; +begin + Result := S_OK; + Enabled := False; + EnumerateNext := True; + + try + FwMgrDisp := CreateOleObject(FW_MGR_CLASS_NAME); + try + FwMgr := INetFwMgr(FwMgrDisp); + + FwProfile := FwMgr.LocalPolicy.CurrentProfile; + FwAppInstances := FwProfile.AuthorizedApplications.Get__NewEnum as IEnumVariant; + + while EnumerateNext do + if FwAppInstances.Next(1, TempFwApp, TempObjValue) <> 0 then + EnumerateNext := False + else + begin + FwApp := IUnknown(TempFwApp) as INetFwAuthorizedApplication; + + if LowerCase(FwApp.ProcessImageFileName) = LowerCase(BinaryPath) then + begin + Enabled := FwApp.Enabled; + EnumerateNext := False; + end; + + end; + + finally + FwMgrDisp := Unassigned; + end; + except + on E:EOleSysError do + Result := E.ErrorCode; + end; +end; + +function EnableDisablePort(Port: Integer; Protocol: NET_FW_IP_PROTOCOL; + Enabled: Boolean): HRESULT; +var + FwMgrDisp: IDispatch; + FwMgr: INetFwMgr; + FwProfile: INetFwProfile; + FwOpenPort: INetFwOpenPort; + FwOpenPortInstances: IEnumVariant; + TempFwPortObj: OleVariant; + TempObjValue: Cardinal; + EnumerateNext: Boolean; +begin + Result := S_FALSE; + EnumerateNext := True; + + try + FwMgrDisp := CreateOleObject(FW_MGR_CLASS_NAME); + try + FwMgr := INetFwMgr(FwMgrDisp); + + FwProfile := FwMgr.LocalPolicy.CurrentProfile; + FwOpenPortInstances := FwProfile.GloballyOpenPorts.Get__NewEnum as IEnumVariant; + + while EnumerateNext do + if FwOpenPortInstances.Next(1, TempFwPortObj, TempObjValue) <> 0 then + EnumerateNext := False + else + begin + FwOpenPort := IUnknown(TempFwPortObj) as INetFwOpenPort; + + if (FwOpenPort.Port = Port) and (FwOpenPort.Protocol = TOleEnum(Protocol)) then + begin + FwOpenPort.Enabled := Enabled; + EnumerateNext := False; + Result := S_OK; + end; + end; + + finally + FwMgrDisp := Unassigned; + end; + except + on E:EOleSysError do + Result := E.ErrorCode; + end; +end; + +function EnableDisableApplication(BinaryPath: String; Enabled: Boolean): HRESULT; +var + FwMgrDisp: IDispatch; + FwMgr: INetFwMgr; + FwProfile: INetFwProfile; + FwApp: INetFwAuthorizedApplication; + FwAppInstances: IEnumVariant; + TempFwApp: OleVariant; + TempObjValue: Cardinal; + EnumerateNext: Boolean; +begin + Result := S_FALSE; + EnumerateNext := True; + + try + FwMgrDisp := CreateOleObject(FW_MGR_CLASS_NAME); + try + FwMgr := INetFwMgr(FwMgrDisp); + + FwProfile := FwMgr.LocalPolicy.CurrentProfile; + FwAppInstances := FwProfile.AuthorizedApplications.Get__NewEnum as IEnumVariant; + + while EnumerateNext do + if FwAppInstances.Next(1, TempFwApp, TempObjValue) <> 0 then + EnumerateNext := False + else + begin + FwApp := IUnknown(TempFwApp) as INetFwAuthorizedApplication; + + if LowerCase(FwApp.ProcessImageFileName) = LowerCase(BinaryPath) then + begin + FwApp.Enabled := Enabled; + EnumerateNext := False; + Result := S_OK; + end; + + end; + + finally + FwMgrDisp := Unassigned; + end; + except + on E:EOleSysError do + Result := E.ErrorCode; + end; +end; + +function IsFirewallEnabled(var Enabled: Boolean): HRESULT; +var + FwMgrDisp: IDispatch; + FwMgr: INetFwMgr; + FwProfile: INetFwProfile; +begin + Result := S_OK; + + try + FwMgrDisp := CreateOleObject(FW_MGR_CLASS_NAME); + try + FwMgr := INetFwMgr(FwMgrDisp); + + FwProfile := FwMgr.LocalPolicy.CurrentProfile; + Enabled := FwProfile.FirewallEnabled + finally + FwMgrDisp := Unassigned; + end; + except + on E:EOleSysError do + Result := E.ErrorCode; + end; +end; + +function EnableDisableFirewall(Enabled: Boolean): HRESULT; +var + FwMgrDisp: IDispatch; + FwMgr: INetFwMgr; + FwProfile: INetFwProfile; +begin + Result := S_OK; + + try + FwMgrDisp := CreateOleObject(FW_MGR_CLASS_NAME); + try + FwMgr := INetFwMgr(FwMgrDisp); + + FwProfile := FwMgr.LocalPolicy.CurrentProfile; + FwProfile.FirewallEnabled := Enabled; + finally + FwMgrDisp := Unassigned; + end; + except + on E:EOleSysError do + Result := E.ErrorCode; + end; +end; + +function AllowDisallowExceptionsNotAllowed(NotAllowed: Boolean): HRESULT; +var + FwMgrDisp: IDispatch; + FwMgr: INetFwMgr; + FwProfile: INetFwProfile; +begin + Result := S_OK; + + try + FwMgrDisp := CreateOleObject(FW_MGR_CLASS_NAME); + try + FwMgr := INetFwMgr(FwMgrDisp); + + FwProfile := FwMgr.LocalPolicy.CurrentProfile; + FwProfile.ExceptionsNotAllowed := NotAllowed; + finally + FwMgrDisp := Unassigned; + end; + except + on E:EOleSysError do + Result := E.ErrorCode; + end; +end; + +function AreExceptionsNotAllowed(var NotAllowed: Boolean): HRESULT; +var + FwMgrDisp: IDispatch; + FwMgr: INetFwMgr; + FwProfile: INetFwProfile; +begin + Result := S_OK; + + try + FwMgrDisp := CreateOleObject(FW_MGR_CLASS_NAME); + try + FwMgr := INetFwMgr(FwMgrDisp); + + FwProfile := FwMgr.LocalPolicy.CurrentProfile; + NotAllowed := FwProfile.ExceptionsNotAllowed; + finally + FwMgrDisp := Unassigned; + end; + except + on E:EOleSysError do + Result := E.ErrorCode; + end; +end; + +function EnableDisableNotifications(Enabled: Boolean): HRESULT; +var + FwMgrDisp: IDispatch; + FwMgr: INetFwMgr; + FwProfile: INetFwProfile; +begin + Result := S_OK; + + try + FwMgrDisp := CreateOleObject(FW_MGR_CLASS_NAME); + try + FwMgr := INetFwMgr(FwMgrDisp); + + FwProfile := FwMgr.LocalPolicy.CurrentProfile; + FwProfile.NotificationsDisabled := not Enabled; + finally + FwMgrDisp := Unassigned; + end; + except + on E:EOleSysError do + Result := E.ErrorCode; + end; +end; + +function AreNotificationsEnabled(var Enabled: Boolean): HRESULT; +var + FwMgrDisp: IDispatch; + FwMgr: INetFwMgr; + FwProfile: INetFwProfile; +begin + Result := S_OK; + + try + FwMgrDisp := CreateOleObject(FW_MGR_CLASS_NAME); + try + FwMgr := INetFwMgr(FwMgrDisp); + + FwProfile := FwMgr.LocalPolicy.CurrentProfile; + Enabled := not FwProfile.NotificationsDisabled; + finally + FwMgrDisp := Unassigned; + end; + except + on E:EOleSysError do + Result := E.ErrorCode; + end; +end; + +function IsFirewallServiceRunning(var IsRunning: Boolean): Boolean; +begin + IsRunning := False; + + try + if ServiceControl.ExistsService(FW_SERVICE_VISTA) = 0 then + if ServiceControl.ServiceIsRunning(FW_SERVICE_VISTA, IsRunning) = 0 then + begin + Result := True; + Exit; + end; + + if ServiceControl.ExistsService(FW_SERVICE_XP_WIN2003) = 0 then + if ServiceControl.ServiceIsRunning(FW_SERVICE_XP_WIN2003, IsRunning) = 0 then + begin + Result := True; + Exit; + end; + + Result := True; + except + Result := False; + end; +end; + +function StartStopFirewallService(StartService: Boolean): Boolean; +begin + Result := False; + + try + if ServiceControl.ExistsService(FW_SERVICE_VISTA) = 0 then + begin + if StartService then + begin + if ServiceControl.StartService(FW_SERVICE_VISTA, '') = 0 then + begin + Result := True; + Exit; + end; + end + else + if ServiceControl.StopService(FW_SERVICE_VISTA) = 0 then + begin + Result := True; + Exit; + end; + end; + + if ServiceControl.ExistsService(FW_SERVICE_XP_WIN2003) = 0 then + begin + if StartService then + begin + if ServiceControl.StartService(FW_SERVICE_XP_WIN2003, '') = 0 then + begin + Result := True; + Exit; + end; + end + else + if ServiceControl.StopService(FW_SERVICE_XP_WIN2003) = 0 then + begin + Result := True; + Exit; + end; + end; + + except + Result := False; + end; + +end; + +function RestoreDefaults: HRESULT; +var + FwMgrDisp: IDispatch; + FwMgr: INetFwMgr; +begin + Result := S_OK; + + try + FwMgrDisp := CreateOleObject(FW_MGR_CLASS_NAME); + try + FwMgr := INetFwMgr(FwMgrDisp); + FwMgr.RestoreDefaults; + finally + FwMgrDisp := Unassigned; + end; + except + on E:EOleSysError do + Result := E.ErrorCode; + end; +end; + +function AllowDisallowIcmpOutboundDestinationUnreachable(Allow: Boolean): HRESULT; +var + FwMgrDisp: IDispatch; + FwMgr: INetFwMgr; + FwProfile: INetFwProfile; +begin + Result := S_OK; + + try + FwMgrDisp := CreateOleObject(FW_MGR_CLASS_NAME); + try + FwMgr := INetFwMgr(FwMgrDisp); + + FwProfile := FwMgr.LocalPolicy.CurrentProfile; + FwProfile.IcmpSettings.AllowOutboundDestinationUnreachable := Allow; + finally + FwMgrDisp := Unassigned; + end; + except + on E:EOleSysError do + Result := E.ErrorCode; + end; +end; + +function AllowDisallowIcmpRedirect(Allow: Boolean): HRESULT; +var + FwMgrDisp: IDispatch; + FwMgr: INetFwMgr; + FwProfile: INetFwProfile; +begin + Result := S_OK; + + try + FwMgrDisp := CreateOleObject(FW_MGR_CLASS_NAME); + try + FwMgr := INetFwMgr(FwMgrDisp); + + FwProfile := FwMgr.LocalPolicy.CurrentProfile; + FwProfile.IcmpSettings.AllowRedirect := Allow; + finally + FwMgrDisp := Unassigned; + end; + except + on E:EOleSysError do + Result := E.ErrorCode; + end; +end; + +function AllowDisallowIcmpInboundEchoRequest(Allow: Boolean): HRESULT; +var + FwMgrDisp: IDispatch; + FwMgr: INetFwMgr; + FwProfile: INetFwProfile; +begin + Result := S_OK; + + try + FwMgrDisp := CreateOleObject(FW_MGR_CLASS_NAME); + try + FwMgr := INetFwMgr(FwMgrDisp); + + FwProfile := FwMgr.LocalPolicy.CurrentProfile; + FwProfile.IcmpSettings.AllowInboundEchoRequest := Allow; + finally + FwMgrDisp := Unassigned; + end; + except + on E:EOleSysError do + Result := E.ErrorCode; + end; +end; + +function AllowDisallowIcmpOutboundTimeExceeded(Allow: Boolean): HRESULT; +var + FwMgrDisp: IDispatch; + FwMgr: INetFwMgr; + FwProfile: INetFwProfile; +begin + Result := S_OK; + + try + FwMgrDisp := CreateOleObject(FW_MGR_CLASS_NAME); + try + FwMgr := INetFwMgr(FwMgrDisp); + + FwProfile := FwMgr.LocalPolicy.CurrentProfile; + FwProfile.IcmpSettings.AllowOutboundTimeExceeded := Allow; + finally + FwMgrDisp := Unassigned; + end; + except + on E:EOleSysError do + Result := E.ErrorCode; + end; +end; + +function AllowDisallowIcmpOutboundParameterProblem(Allow: Boolean): HRESULT; +var + FwMgrDisp: IDispatch; + FwMgr: INetFwMgr; + FwProfile: INetFwProfile; +begin + Result := S_OK; + + try + FwMgrDisp := CreateOleObject(FW_MGR_CLASS_NAME); + try + FwMgr := INetFwMgr(FwMgrDisp); + + FwProfile := FwMgr.LocalPolicy.CurrentProfile; + FwProfile.IcmpSettings.AllowOutboundParameterProblem := Allow; + finally + FwMgrDisp := Unassigned; + end; + except + on E:EOleSysError do + Result := E.ErrorCode; + end; +end; + +function AllowDisallowIcmpOutboundSourceQuench(Allow: Boolean): HRESULT; +var + FwMgrDisp: IDispatch; + FwMgr: INetFwMgr; + FwProfile: INetFwProfile; +begin + Result := S_OK; + + try + FwMgrDisp := CreateOleObject(FW_MGR_CLASS_NAME); + try + FwMgr := INetFwMgr(FwMgrDisp); + + FwProfile := FwMgr.LocalPolicy.CurrentProfile; + FwProfile.IcmpSettings.AllowOutboundSourceQuench := Allow; + finally + FwMgrDisp := Unassigned; + end; + except + on E:EOleSysError do + Result := E.ErrorCode; + end; +end; + +function AllowDisallowIcmpInboundRouterRequest(Allow: Boolean): HRESULT; +var + FwMgrDisp: IDispatch; + FwMgr: INetFwMgr; + FwProfile: INetFwProfile; +begin + Result := S_OK; + + try + FwMgrDisp := CreateOleObject(FW_MGR_CLASS_NAME); + try + FwMgr := INetFwMgr(FwMgrDisp); + + FwProfile := FwMgr.LocalPolicy.CurrentProfile; + FwProfile.IcmpSettings.AllowInboundRouterRequest := Allow; + finally + FwMgrDisp := Unassigned; + end; + except + on E:EOleSysError do + Result := E.ErrorCode; + end; +end; + +function AllowDisallowIcmpInboundTimestampRequest(Allow: Boolean): HRESULT; +var + FwMgrDisp: IDispatch; + FwMgr: INetFwMgr; + FwProfile: INetFwProfile; +begin + Result := S_OK; + + try + FwMgrDisp := CreateOleObject(FW_MGR_CLASS_NAME); + try + FwMgr := INetFwMgr(FwMgrDisp); + + FwProfile := FwMgr.LocalPolicy.CurrentProfile; + FwProfile.IcmpSettings.AllowInboundTimestampRequest := Allow; + finally + FwMgrDisp := Unassigned; + end; + except + on E:EOleSysError do + Result := E.ErrorCode; + end; +end; + +function AllowDisallowIcmpInboundMaskRequest(Allow: Boolean): HRESULT; +var + FwMgrDisp: IDispatch; + FwMgr: INetFwMgr; + FwProfile: INetFwProfile; +begin + Result := S_OK; + + try + FwMgrDisp := CreateOleObject(FW_MGR_CLASS_NAME); + try + FwMgr := INetFwMgr(FwMgrDisp); + + FwProfile := FwMgr.LocalPolicy.CurrentProfile; + FwProfile.IcmpSettings.AllowInboundMaskRequest := Allow; + finally + FwMgrDisp := Unassigned; + end; + except + on E:EOleSysError do + Result := E.ErrorCode; + end; +end; + +function AllowDisallowIcmpOutboundPacketTooBig(Allow: Boolean): HRESULT; +var + FwMgrDisp: IDispatch; + FwMgr: INetFwMgr; + FwProfile: INetFwProfile; +begin + Result := S_OK; + + try + FwMgrDisp := CreateOleObject(FW_MGR_CLASS_NAME); + try + FwMgr := INetFwMgr(FwMgrDisp); + + FwProfile := FwMgr.LocalPolicy.CurrentProfile; + FwProfile.IcmpSettings.AllowOutboundPacketTooBig := Allow; + finally + FwMgrDisp := Unassigned; + end; + except + on E:EOleSysError do + Result := E.ErrorCode; + end; +end; + +function IsIcmpTypeAllowed(IpVersion: NET_FW_IP_VERSION; LocalAddress: String; + IcmpType: NET_FW_ICMP_TYPE; var Allowed: Boolean; var Restricted: Boolean): HRESULT; +var + FwMgrDisp: IDispatch; + FwMgr: INetFwMgr; + TempAllowed: OleVariant; + Temprestricted: OleVariant; +begin + Result := S_OK; + + try + FwMgrDisp := CreateOleObject(FW_MGR_CLASS_NAME); + try + FwMgr := INetFwMgr(FwMgrDisp); + FwMgr.IsIcmpTypeAllowed(TOleEnum(IpVersion), LocalAddress, Byte(IcmpType), TempAllowed, TempRestricted); + + Allowed := Boolean(TempAllowed); + Restricted := Boolean(TempRestricted); + finally + FwMgrDisp := Unassigned; + end; + except + on E:EOleSysError do + Result := E.ErrorCode; + end; +end; + +end. diff --git a/build/Source/NSIS.pas b/build/Source/NSIS.pas new file mode 100644 index 0000000000..be80e1bd83 --- /dev/null +++ b/build/Source/NSIS.pas @@ -0,0 +1,126 @@ +{ + Original Code from + (C) 2001 - Peter Windridge + + Code in seperate unit and some changes + 2003 by Bernhard Mayer + + Fixed and formatted by Brett Dever + http://editor.nfscheats.com/ + + simply include this unit in your plugin project and export + functions as needed +} + + +unit nsis; + +interface + +uses + windows; + +type + VarConstants = ( + INST_0, // $0 + INST_1, // $1 + INST_2, // $2 + INST_3, // $3 + INST_4, // $4 + INST_5, // $5 + INST_6, // $6 + INST_7, // $7 + INST_8, // $8 + INST_9, // $9 + INST_R0, // $R0 + INST_R1, // $R1 + INST_R2, // $R2 + INST_R3, // $R3 + INST_R4, // $R4 + INST_R5, // $R5 + INST_R6, // $R6 + INST_R7, // $R7 + INST_R8, // $R8 + INST_R9, // $R9 + INST_CMDLINE, // $CMDLINE + INST_INSTDIR, // $INSTDIR + INST_OUTDIR, // $OUTDIR + INST_EXEDIR, // $EXEDIR + INST_LANG, // $LANGUAGE + __INST_LAST + ); + TVariableList = INST_0..__INST_LAST; + pstack_t = ^stack_t; + stack_t = record + next: pstack_t; + text: PChar; + end; + +var + g_stringsize: integer; + g_stacktop: ^pstack_t; + g_variables: PChar; + g_hwndParent: HWND; + +procedure Init(const hwndParent: HWND; const string_size: integer; const variables: PChar; const stacktop: pointer); +function PopString(): string; +procedure PushString(const str: string=''); +function GetUserVariable(const varnum: TVariableList): string; +procedure SetUserVariable(const varnum: TVariableList; const value: string); +procedure NSISDialog(const text, caption: string; const buttons: integer); + +implementation + +procedure Init(const hwndParent: HWND; const string_size: integer; const variables: PChar; const stacktop: pointer); +begin + g_stringsize := string_size; + g_hwndParent := hwndParent; + g_stacktop := stacktop; + g_variables := variables; +end; + +function PopString(): string; +var + th: pstack_t; +begin + if integer(g_stacktop^) <> 0 then begin + th := g_stacktop^; + Result := PChar(@th.text); + g_stacktop^ := th.next; + GlobalFree(HGLOBAL(th)); + end; +end; + +procedure PushString(const str: string=''); +var + th: pstack_t; +begin + if integer(g_stacktop) <> 0 then begin + th := pstack_t(GlobalAlloc(GPTR, SizeOf(stack_t) + g_stringsize)); + lstrcpyn(@th.text, PChar(str), g_stringsize); + th.next := g_stacktop^; + g_stacktop^ := th; + end; +end; + +function GetUserVariable(const varnum: TVariableList): string; +begin + if (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then + Result := g_variables + integer(varnum) * g_stringsize + else + Result := ''; +end; + +procedure SetUserVariable(const varnum: TVariableList; const value: string); +begin + if (value <> '') and (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then + lstrcpy(g_variables + integer(varnum) * g_stringsize, PChar(value)) +end; + +procedure NSISDialog(const text, caption: string; const buttons: integer); +begin + MessageBox(g_hwndParent, PChar(text), PChar(caption), buttons); +end; + +begin +end. diff --git a/build/Source/NetFwTypeLib_TLB.dcr b/build/Source/NetFwTypeLib_TLB.dcr new file mode 100644 index 0000000000..36f26e234a Binary files /dev/null and b/build/Source/NetFwTypeLib_TLB.dcr differ diff --git a/build/Source/NetFwTypeLib_TLB.pas b/build/Source/NetFwTypeLib_TLB.pas new file mode 100644 index 0000000000..0607de78f9 --- /dev/null +++ b/build/Source/NetFwTypeLib_TLB.pas @@ -0,0 +1,850 @@ +unit NetFwTypeLib_TLB; + +// ************************************************************************ // +// WARNUNG +// ------- +// Die in dieser Datei deklarierten Typen wurden aus Daten einer Typbibliothek +// generiert. Wenn diese Typbibliothek explizit oder indirekt (über eine +// andere Typbibliothek) reimportiert wird oder wenn die Anweisung +// 'Aktualisieren' im Typbibliotheks-Editor während des Bearbeitens der +// Typbibliothek aktiviert ist, wird der Inhalt dieser Datei neu generiert und +// alle manuell vorgenommenen Änderungen gehen verloren. +// ************************************************************************ // + +// PASTLWTR : $Revision: 1.130.1.0.1.0.1.6 $ +// Datei generiert am 20.05.2007 16:34:09 aus der unten beschriebenen Typbibliothek. + +// ************************************************************************ // +// Type Lib: FirewallAPI.dll (1) +// LIBID: {58FBCF7C-E7A9-467C-80B3-FC65E8FCCA08} +// LCID: 0 +// Helpfile: +// DepndLst: +// (1) v2.0 stdole, (C:\WINDOWS\system32\stdole2.tlb) +// (2) v4.0 StdVCL, (C:\WINDOWS\system32\stdvcl40.dll) +// Fehler +// Hinweis: Element 'Type' von 'INetFwService' geändert in 'Type_' +// Hinweis: Parameter 'Type' im INetFwService.Type geändert in 'Type_' +// Hinweis: Element 'Type' von 'INetFwProfile' geändert in 'Type_' +// Hinweis: Parameter 'Type' im INetFwProfile.Type geändert in 'Type_' +// Hinweis: Parameter 'Type' im INetFwMgr.IsIcmpTypeAllowed geändert in 'Type_' +// Hinweis: Element 'Type' von 'INetFwService' geändert in 'Type_' +// Hinweis: Element 'Type' von 'INetFwProfile' geändert in 'Type_' +// ************************************************************************ // +// *************************************************************************// +// HINWEIS: +// Von $IFDEF_LIVE_SERVER_AT_DESIGN_TIME überwachte Einträge, werden von +// Eigenschaften verwendet, die Objekte zurückgeben, die explizit mit einen Funktionsaufruf +// vor dem Zugriff über die Eigenschaft erzeugt werden müssen. Diese Einträge wurden deaktiviert, +// um deren unbeabsichtigte Benutzung im Objektinspektor zu verhindern. Sie können sie +// aktivieren, indem Sie LIVE_SERVER_AT_DESIGN_TIME definieren oder sie selektiv +// aus den $IFDEF-Blöcken entfernen. Solche Einträge müssen jedoch programmseitig +// mit einer Methode der geeigneten CoClass vor der Verwendung +// erzeugt werden. +{$TYPEDADDRESS OFF} // Unit muß ohne Typüberprüfung für Zeiger compiliert werden. +{$WARN SYMBOL_PLATFORM OFF} +{$WRITEABLECONST ON} +{$VARPROPSETTER ON} +interface + +uses Windows, ActiveX, Classes, Graphics, StdVCL, Variants; + + +// *********************************************************************// +// In dieser Typbibliothek deklarierte GUIDS . Es werden folgende +// Präfixe verwendet: +// Typbibliotheken : LIBID_xxxx +// CoClasses : CLASS_xxxx +// DISPInterfaces : DIID_xxxx +// Nicht-DISP-Schnittstellen: IID_xxxx +// *********************************************************************// +const + // Haupt- und Nebenversionen der Typbibliothek + NetFwTypeLibMajorVersion = 1; + NetFwTypeLibMinorVersion = 0; + + LIBID_NetFwTypeLib: TGUID = '{58FBCF7C-E7A9-467C-80B3-FC65E8FCCA08}'; + + IID_INetFwRemoteAdminSettings: TGUID = '{D4BECDDF-6F73-4A83-B832-9C66874CD20E}'; + IID_INetFwIcmpSettings: TGUID = '{A6207B2E-7CDD-426A-951E-5E1CBC5AFEAD}'; + IID_INetFwOpenPort: TGUID = '{E0483BA0-47FF-4D9C-A6D6-7741D0B195F7}'; + IID_INetFwOpenPorts: TGUID = '{C0E9D7FA-E07E-430A-B19A-090CE82D92E2}'; + IID_INetFwService: TGUID = '{79FD57C8-908E-4A36-9888-D5B3F0A444CF}'; + IID_INetFwServices: TGUID = '{79649BB4-903E-421B-94C9-79848E79F6EE}'; + IID_INetFwAuthorizedApplication: TGUID = '{B5E64FFA-C2C5-444E-A301-FB5E00018050}'; + IID_INetFwAuthorizedApplications: TGUID = '{644EFD52-CCF9-486C-97A2-39F352570B30}'; + IID_INetFwServiceRestriction: TGUID = '{8267BBE3-F890-491C-B7B6-2DB1EF0E5D2B}'; + IID_INetFwRules: TGUID = '{9C4C6277-5027-441E-AFAE-CA1F542DA009}'; + IID_INetFwRule: TGUID = '{AF230D27-BABA-4E42-ACED-F524F22CFCE2}'; + IID_INetFwProfile: TGUID = '{174A0DDA-E9F9-449D-993B-21AB667CA456}'; + IID_INetFwPolicy: TGUID = '{D46D2478-9AC9-4008-9DC7-5563CE5536CC}'; + IID_INetFwPolicy2: TGUID = '{98325047-C671-4174-8D81-DEFCD3F03186}'; + IID_INetFwMgr: TGUID = '{F7898AF5-CAC4-4632-A2EC-DA06E5111AF2}'; + +// *********************************************************************// +// Deklaration von in der Typbibliothek definierten Enumerationen +// *********************************************************************// +// Konstanten für enum NET_FW_IP_VERSION_ +type + NET_FW_IP_VERSION_ = TOleEnum; +const + NET_FW_IP_VERSION_V4 = $00000000; + NET_FW_IP_VERSION_V6 = $00000001; + NET_FW_IP_VERSION_ANY = $00000002; + NET_FW_IP_VERSION_MAX = $00000003; + +// Konstanten für enum NET_FW_SCOPE_ +type + NET_FW_SCOPE_ = TOleEnum; +const + NET_FW_SCOPE_ALL = $00000000; + NET_FW_SCOPE_LOCAL_SUBNET = $00000001; + NET_FW_SCOPE_CUSTOM = $00000002; + NET_FW_SCOPE_MAX = $00000003; + +// Konstanten für enum NET_FW_IP_PROTOCOL_ +type + NET_FW_IP_PROTOCOL_ = TOleEnum; +const + NET_FW_IP_PROTOCOL_TCP = $00000006; + NET_FW_IP_PROTOCOL_UDP = $00000011; + NET_FW_IP_PROTOCOL_ANY = $00000100; + +// Konstanten für enum NET_FW_SERVICE_TYPE_ +type + NET_FW_SERVICE_TYPE_ = TOleEnum; +const + NET_FW_SERVICE_FILE_AND_PRINT = $00000000; + NET_FW_SERVICE_UPNP = $00000001; + NET_FW_SERVICE_REMOTE_DESKTOP = $00000002; + NET_FW_SERVICE_NONE = $00000003; + NET_FW_SERVICE_TYPE_MAX = $00000004; + +// Konstanten für enum NET_FW_RULE_DIRECTION_ +type + NET_FW_RULE_DIRECTION_ = TOleEnum; +const + NET_FW_RULE_DIR_IN = $00000001; + NET_FW_RULE_DIR_OUT = $00000002; + NET_FW_RULE_DIR_MAX = $00000003; + +// Konstanten für enum NET_FW_ACTION_ +type + NET_FW_ACTION_ = TOleEnum; +const + NET_FW_ACTION_BLOCK = $00000000; + NET_FW_ACTION_ALLOW = $00000001; + NET_FW_ACTION_MAX = $00000002; + +// Konstanten für enum NET_FW_PROFILE_TYPE_ +type + NET_FW_PROFILE_TYPE_ = TOleEnum; +const + NET_FW_PROFILE_DOMAIN = $00000000; + NET_FW_PROFILE_STANDARD = $00000001; + NET_FW_PROFILE_CURRENT = $00000002; + NET_FW_PROFILE_TYPE_MAX = $00000003; + +// Konstanten für enum NET_FW_PROFILE_TYPE2_ +type + NET_FW_PROFILE_TYPE2_ = TOleEnum; +const + NET_FW_PROFILE2_DOMAIN = $00000001; + NET_FW_PROFILE2_PRIVATE = $00000002; + NET_FW_PROFILE2_PUBLIC = $00000004; + NET_FW_PROFILE2_ALL = $7FFFFFFF; + +// Konstanten für enum NET_FW_MODIFY_STATE_ +type + NET_FW_MODIFY_STATE_ = TOleEnum; +const + NET_FW_MODIFY_STATE_OK = $00000000; + NET_FW_MODIFY_STATE_GP_OVERRIDE = $00000001; + NET_FW_MODIFY_STATE_INBOUND_BLOCKED = $00000002; + +type + +// *********************************************************************// +// Forward-Deklaration von in der Typbibliothek definierten Typen +// *********************************************************************// + INetFwRemoteAdminSettings = interface; + INetFwRemoteAdminSettingsDisp = dispinterface; + INetFwIcmpSettings = interface; + INetFwIcmpSettingsDisp = dispinterface; + INetFwOpenPort = interface; + INetFwOpenPortDisp = dispinterface; + INetFwOpenPorts = interface; + INetFwOpenPortsDisp = dispinterface; + INetFwService = interface; + INetFwServiceDisp = dispinterface; + INetFwServices = interface; + INetFwServicesDisp = dispinterface; + INetFwAuthorizedApplication = interface; + INetFwAuthorizedApplicationDisp = dispinterface; + INetFwAuthorizedApplications = interface; + INetFwAuthorizedApplicationsDisp = dispinterface; + INetFwServiceRestriction = interface; + INetFwServiceRestrictionDisp = dispinterface; + INetFwRules = interface; + INetFwRulesDisp = dispinterface; + INetFwRule = interface; + INetFwRuleDisp = dispinterface; + INetFwProfile = interface; + INetFwProfileDisp = dispinterface; + INetFwPolicy = interface; + INetFwPolicyDisp = dispinterface; + INetFwPolicy2 = interface; + INetFwPolicy2Disp = dispinterface; + INetFwMgr = interface; + INetFwMgrDisp = dispinterface; + +// *********************************************************************// +// Schnittstelle: INetFwRemoteAdminSettings +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {D4BECDDF-6F73-4A83-B832-9C66874CD20E} +// *********************************************************************// + INetFwRemoteAdminSettings = interface(IDispatch) + ['{D4BECDDF-6F73-4A83-B832-9C66874CD20E}'] + function Get_IpVersion: NET_FW_IP_VERSION_; safecall; + procedure Set_IpVersion(IpVersion: NET_FW_IP_VERSION_); safecall; + function Get_Scope: NET_FW_SCOPE_; safecall; + procedure Set_Scope(Scope: NET_FW_SCOPE_); safecall; + function Get_RemoteAddresses: WideString; safecall; + procedure Set_RemoteAddresses(const remoteAddrs: WideString); safecall; + function Get_Enabled: WordBool; safecall; + procedure Set_Enabled(Enabled: WordBool); safecall; + property IpVersion: NET_FW_IP_VERSION_ read Get_IpVersion write Set_IpVersion; + property Scope: NET_FW_SCOPE_ read Get_Scope write Set_Scope; + property RemoteAddresses: WideString read Get_RemoteAddresses write Set_RemoteAddresses; + property Enabled: WordBool read Get_Enabled write Set_Enabled; + end; + +// *********************************************************************// +// DispIntf: INetFwRemoteAdminSettingsDisp +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {D4BECDDF-6F73-4A83-B832-9C66874CD20E} +// *********************************************************************// + INetFwRemoteAdminSettingsDisp = dispinterface + ['{D4BECDDF-6F73-4A83-B832-9C66874CD20E}'] + property IpVersion: NET_FW_IP_VERSION_ dispid 1; + property Scope: NET_FW_SCOPE_ dispid 2; + property RemoteAddresses: WideString dispid 3; + property Enabled: WordBool dispid 4; + end; + +// *********************************************************************// +// Schnittstelle: INetFwIcmpSettings +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {A6207B2E-7CDD-426A-951E-5E1CBC5AFEAD} +// *********************************************************************// + INetFwIcmpSettings = interface(IDispatch) + ['{A6207B2E-7CDD-426A-951E-5E1CBC5AFEAD}'] + function Get_AllowOutboundDestinationUnreachable: WordBool; safecall; + procedure Set_AllowOutboundDestinationUnreachable(allow: WordBool); safecall; + function Get_AllowRedirect: WordBool; safecall; + procedure Set_AllowRedirect(allow: WordBool); safecall; + function Get_AllowInboundEchoRequest: WordBool; safecall; + procedure Set_AllowInboundEchoRequest(allow: WordBool); safecall; + function Get_AllowOutboundTimeExceeded: WordBool; safecall; + procedure Set_AllowOutboundTimeExceeded(allow: WordBool); safecall; + function Get_AllowOutboundParameterProblem: WordBool; safecall; + procedure Set_AllowOutboundParameterProblem(allow: WordBool); safecall; + function Get_AllowOutboundSourceQuench: WordBool; safecall; + procedure Set_AllowOutboundSourceQuench(allow: WordBool); safecall; + function Get_AllowInboundRouterRequest: WordBool; safecall; + procedure Set_AllowInboundRouterRequest(allow: WordBool); safecall; + function Get_AllowInboundTimestampRequest: WordBool; safecall; + procedure Set_AllowInboundTimestampRequest(allow: WordBool); safecall; + function Get_AllowInboundMaskRequest: WordBool; safecall; + procedure Set_AllowInboundMaskRequest(allow: WordBool); safecall; + function Get_AllowOutboundPacketTooBig: WordBool; safecall; + procedure Set_AllowOutboundPacketTooBig(allow: WordBool); safecall; + property AllowOutboundDestinationUnreachable: WordBool read Get_AllowOutboundDestinationUnreachable write Set_AllowOutboundDestinationUnreachable; + property AllowRedirect: WordBool read Get_AllowRedirect write Set_AllowRedirect; + property AllowInboundEchoRequest: WordBool read Get_AllowInboundEchoRequest write Set_AllowInboundEchoRequest; + property AllowOutboundTimeExceeded: WordBool read Get_AllowOutboundTimeExceeded write Set_AllowOutboundTimeExceeded; + property AllowOutboundParameterProblem: WordBool read Get_AllowOutboundParameterProblem write Set_AllowOutboundParameterProblem; + property AllowOutboundSourceQuench: WordBool read Get_AllowOutboundSourceQuench write Set_AllowOutboundSourceQuench; + property AllowInboundRouterRequest: WordBool read Get_AllowInboundRouterRequest write Set_AllowInboundRouterRequest; + property AllowInboundTimestampRequest: WordBool read Get_AllowInboundTimestampRequest write Set_AllowInboundTimestampRequest; + property AllowInboundMaskRequest: WordBool read Get_AllowInboundMaskRequest write Set_AllowInboundMaskRequest; + property AllowOutboundPacketTooBig: WordBool read Get_AllowOutboundPacketTooBig write Set_AllowOutboundPacketTooBig; + end; + +// *********************************************************************// +// DispIntf: INetFwIcmpSettingsDisp +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {A6207B2E-7CDD-426A-951E-5E1CBC5AFEAD} +// *********************************************************************// + INetFwIcmpSettingsDisp = dispinterface + ['{A6207B2E-7CDD-426A-951E-5E1CBC5AFEAD}'] + property AllowOutboundDestinationUnreachable: WordBool dispid 1; + property AllowRedirect: WordBool dispid 2; + property AllowInboundEchoRequest: WordBool dispid 3; + property AllowOutboundTimeExceeded: WordBool dispid 4; + property AllowOutboundParameterProblem: WordBool dispid 5; + property AllowOutboundSourceQuench: WordBool dispid 6; + property AllowInboundRouterRequest: WordBool dispid 7; + property AllowInboundTimestampRequest: WordBool dispid 8; + property AllowInboundMaskRequest: WordBool dispid 9; + property AllowOutboundPacketTooBig: WordBool dispid 10; + end; + +// *********************************************************************// +// Schnittstelle: INetFwOpenPort +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {E0483BA0-47FF-4D9C-A6D6-7741D0B195F7} +// *********************************************************************// + INetFwOpenPort = interface(IDispatch) + ['{E0483BA0-47FF-4D9C-A6D6-7741D0B195F7}'] + function Get_Name: WideString; safecall; + procedure Set_Name(const Name: WideString); safecall; + function Get_IpVersion: NET_FW_IP_VERSION_; safecall; + procedure Set_IpVersion(IpVersion: NET_FW_IP_VERSION_); safecall; + function Get_Protocol: NET_FW_IP_PROTOCOL_; safecall; + procedure Set_Protocol(ipProtocol: NET_FW_IP_PROTOCOL_); safecall; + function Get_Port: Integer; safecall; + procedure Set_Port(portNumber: Integer); safecall; + function Get_Scope: NET_FW_SCOPE_; safecall; + procedure Set_Scope(Scope: NET_FW_SCOPE_); safecall; + function Get_RemoteAddresses: WideString; safecall; + procedure Set_RemoteAddresses(const remoteAddrs: WideString); safecall; + function Get_Enabled: WordBool; safecall; + procedure Set_Enabled(Enabled: WordBool); safecall; + function Get_BuiltIn: WordBool; safecall; + property Name: WideString read Get_Name write Set_Name; + property IpVersion: NET_FW_IP_VERSION_ read Get_IpVersion write Set_IpVersion; + property Protocol: NET_FW_IP_PROTOCOL_ read Get_Protocol write Set_Protocol; + property Port: Integer read Get_Port write Set_Port; + property Scope: NET_FW_SCOPE_ read Get_Scope write Set_Scope; + property RemoteAddresses: WideString read Get_RemoteAddresses write Set_RemoteAddresses; + property Enabled: WordBool read Get_Enabled write Set_Enabled; + property BuiltIn: WordBool read Get_BuiltIn; + end; + +// *********************************************************************// +// DispIntf: INetFwOpenPortDisp +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {E0483BA0-47FF-4D9C-A6D6-7741D0B195F7} +// *********************************************************************// + INetFwOpenPortDisp = dispinterface + ['{E0483BA0-47FF-4D9C-A6D6-7741D0B195F7}'] + property Name: WideString dispid 1; + property IpVersion: NET_FW_IP_VERSION_ dispid 2; + property Protocol: NET_FW_IP_PROTOCOL_ dispid 3; + property Port: Integer dispid 4; + property Scope: NET_FW_SCOPE_ dispid 5; + property RemoteAddresses: WideString dispid 6; + property Enabled: WordBool dispid 7; + property BuiltIn: WordBool readonly dispid 8; + end; + +// *********************************************************************// +// Schnittstelle: INetFwOpenPorts +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {C0E9D7FA-E07E-430A-B19A-090CE82D92E2} +// *********************************************************************// + INetFwOpenPorts = interface(IDispatch) + ['{C0E9D7FA-E07E-430A-B19A-090CE82D92E2}'] + function Get_Count: Integer; safecall; + procedure Add(const Port: INetFwOpenPort); safecall; + procedure Remove(portNumber: Integer; ipProtocol: NET_FW_IP_PROTOCOL_); safecall; + function Item(portNumber: Integer; ipProtocol: NET_FW_IP_PROTOCOL_): INetFwOpenPort; safecall; + function Get__NewEnum: IUnknown; safecall; + property Count: Integer read Get_Count; + property _NewEnum: IUnknown read Get__NewEnum; + end; + +// *********************************************************************// +// DispIntf: INetFwOpenPortsDisp +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {C0E9D7FA-E07E-430A-B19A-090CE82D92E2} +// *********************************************************************// + INetFwOpenPortsDisp = dispinterface + ['{C0E9D7FA-E07E-430A-B19A-090CE82D92E2}'] + property Count: Integer readonly dispid 1; + procedure Add(const Port: INetFwOpenPort); dispid 2; + procedure Remove(portNumber: Integer; ipProtocol: NET_FW_IP_PROTOCOL_); dispid 3; + function Item(portNumber: Integer; ipProtocol: NET_FW_IP_PROTOCOL_): INetFwOpenPort; dispid 4; + property _NewEnum: IUnknown readonly dispid -4; + end; + +// *********************************************************************// +// Schnittstelle: INetFwService +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {79FD57C8-908E-4A36-9888-D5B3F0A444CF} +// *********************************************************************// + INetFwService = interface(IDispatch) + ['{79FD57C8-908E-4A36-9888-D5B3F0A444CF}'] + function Get_Name: WideString; safecall; + function Get_Type_: NET_FW_SERVICE_TYPE_; safecall; + function Get_Customized: WordBool; safecall; + function Get_IpVersion: NET_FW_IP_VERSION_; safecall; + procedure Set_IpVersion(IpVersion: NET_FW_IP_VERSION_); safecall; + function Get_Scope: NET_FW_SCOPE_; safecall; + procedure Set_Scope(Scope: NET_FW_SCOPE_); safecall; + function Get_RemoteAddresses: WideString; safecall; + procedure Set_RemoteAddresses(const remoteAddrs: WideString); safecall; + function Get_Enabled: WordBool; safecall; + procedure Set_Enabled(Enabled: WordBool); safecall; + function Get_GloballyOpenPorts: INetFwOpenPorts; safecall; + property Name: WideString read Get_Name; + property Type_: NET_FW_SERVICE_TYPE_ read Get_Type_; + property Customized: WordBool read Get_Customized; + property IpVersion: NET_FW_IP_VERSION_ read Get_IpVersion write Set_IpVersion; + property Scope: NET_FW_SCOPE_ read Get_Scope write Set_Scope; + property RemoteAddresses: WideString read Get_RemoteAddresses write Set_RemoteAddresses; + property Enabled: WordBool read Get_Enabled write Set_Enabled; + property GloballyOpenPorts: INetFwOpenPorts read Get_GloballyOpenPorts; + end; + +// *********************************************************************// +// DispIntf: INetFwServiceDisp +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {79FD57C8-908E-4A36-9888-D5B3F0A444CF} +// *********************************************************************// + INetFwServiceDisp = dispinterface + ['{79FD57C8-908E-4A36-9888-D5B3F0A444CF}'] + property Name: WideString readonly dispid 1; + property Type_: NET_FW_SERVICE_TYPE_ readonly dispid 2; + property Customized: WordBool readonly dispid 3; + property IpVersion: NET_FW_IP_VERSION_ dispid 4; + property Scope: NET_FW_SCOPE_ dispid 5; + property RemoteAddresses: WideString dispid 6; + property Enabled: WordBool dispid 7; + property GloballyOpenPorts: INetFwOpenPorts readonly dispid 8; + end; + +// *********************************************************************// +// Schnittstelle: INetFwServices +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {79649BB4-903E-421B-94C9-79848E79F6EE} +// *********************************************************************// + INetFwServices = interface(IDispatch) + ['{79649BB4-903E-421B-94C9-79848E79F6EE}'] + function Get_Count: Integer; safecall; + function Item(svcType: NET_FW_SERVICE_TYPE_): INetFwService; safecall; + function Get__NewEnum: IUnknown; safecall; + property Count: Integer read Get_Count; + property _NewEnum: IUnknown read Get__NewEnum; + end; + +// *********************************************************************// +// DispIntf: INetFwServicesDisp +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {79649BB4-903E-421B-94C9-79848E79F6EE} +// *********************************************************************// + INetFwServicesDisp = dispinterface + ['{79649BB4-903E-421B-94C9-79848E79F6EE}'] + property Count: Integer readonly dispid 1; + function Item(svcType: NET_FW_SERVICE_TYPE_): INetFwService; dispid 2; + property _NewEnum: IUnknown readonly dispid -4; + end; + +// *********************************************************************// +// Schnittstelle: INetFwAuthorizedApplication +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {B5E64FFA-C2C5-444E-A301-FB5E00018050} +// *********************************************************************// + INetFwAuthorizedApplication = interface(IDispatch) + ['{B5E64FFA-C2C5-444E-A301-FB5E00018050}'] + function Get_Name: WideString; safecall; + procedure Set_Name(const Name: WideString); safecall; + function Get_ProcessImageFileName: WideString; safecall; + procedure Set_ProcessImageFileName(const imageFileName: WideString); safecall; + function Get_IpVersion: NET_FW_IP_VERSION_; safecall; + procedure Set_IpVersion(IpVersion: NET_FW_IP_VERSION_); safecall; + function Get_Scope: NET_FW_SCOPE_; safecall; + procedure Set_Scope(Scope: NET_FW_SCOPE_); safecall; + function Get_RemoteAddresses: WideString; safecall; + procedure Set_RemoteAddresses(const remoteAddrs: WideString); safecall; + function Get_Enabled: WordBool; safecall; + procedure Set_Enabled(Enabled: WordBool); safecall; + property Name: WideString read Get_Name write Set_Name; + property ProcessImageFileName: WideString read Get_ProcessImageFileName write Set_ProcessImageFileName; + property IpVersion: NET_FW_IP_VERSION_ read Get_IpVersion write Set_IpVersion; + property Scope: NET_FW_SCOPE_ read Get_Scope write Set_Scope; + property RemoteAddresses: WideString read Get_RemoteAddresses write Set_RemoteAddresses; + property Enabled: WordBool read Get_Enabled write Set_Enabled; + end; + +// *********************************************************************// +// DispIntf: INetFwAuthorizedApplicationDisp +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {B5E64FFA-C2C5-444E-A301-FB5E00018050} +// *********************************************************************// + INetFwAuthorizedApplicationDisp = dispinterface + ['{B5E64FFA-C2C5-444E-A301-FB5E00018050}'] + property Name: WideString dispid 1; + property ProcessImageFileName: WideString dispid 2; + property IpVersion: NET_FW_IP_VERSION_ dispid 3; + property Scope: NET_FW_SCOPE_ dispid 4; + property RemoteAddresses: WideString dispid 5; + property Enabled: WordBool dispid 6; + end; + +// *********************************************************************// +// Schnittstelle: INetFwAuthorizedApplications +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {644EFD52-CCF9-486C-97A2-39F352570B30} +// *********************************************************************// + INetFwAuthorizedApplications = interface(IDispatch) + ['{644EFD52-CCF9-486C-97A2-39F352570B30}'] + function Get_Count: Integer; safecall; + procedure Add(const app: INetFwAuthorizedApplication); safecall; + procedure Remove(const imageFileName: WideString); safecall; + function Item(const imageFileName: WideString): INetFwAuthorizedApplication; safecall; + function Get__NewEnum: IUnknown; safecall; + property Count: Integer read Get_Count; + property _NewEnum: IUnknown read Get__NewEnum; + end; + +// *********************************************************************// +// DispIntf: INetFwAuthorizedApplicationsDisp +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {644EFD52-CCF9-486C-97A2-39F352570B30} +// *********************************************************************// + INetFwAuthorizedApplicationsDisp = dispinterface + ['{644EFD52-CCF9-486C-97A2-39F352570B30}'] + property Count: Integer readonly dispid 1; + procedure Add(const app: INetFwAuthorizedApplication); dispid 2; + procedure Remove(const imageFileName: WideString); dispid 3; + function Item(const imageFileName: WideString): INetFwAuthorizedApplication; dispid 4; + property _NewEnum: IUnknown readonly dispid -4; + end; + +// *********************************************************************// +// Schnittstelle: INetFwServiceRestriction +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {8267BBE3-F890-491C-B7B6-2DB1EF0E5D2B} +// *********************************************************************// + INetFwServiceRestriction = interface(IDispatch) + ['{8267BBE3-F890-491C-B7B6-2DB1EF0E5D2B}'] + procedure RestrictService(const serviceName: WideString; const appName: WideString; + RestrictService: WordBool; serviceSidRestricted: WordBool); safecall; + function ServiceRestricted(const serviceName: WideString; const appName: WideString): WordBool; safecall; + function Get_Rules: INetFwRules; safecall; + property Rules: INetFwRules read Get_Rules; + end; + +// *********************************************************************// +// DispIntf: INetFwServiceRestrictionDisp +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {8267BBE3-F890-491C-B7B6-2DB1EF0E5D2B} +// *********************************************************************// + INetFwServiceRestrictionDisp = dispinterface + ['{8267BBE3-F890-491C-B7B6-2DB1EF0E5D2B}'] + procedure RestrictService(const serviceName: WideString; const appName: WideString; + RestrictService: WordBool; serviceSidRestricted: WordBool); dispid 1; + function ServiceRestricted(const serviceName: WideString; const appName: WideString): WordBool; dispid 2; + property Rules: INetFwRules readonly dispid 3; + end; + +// *********************************************************************// +// Schnittstelle: INetFwRules +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {9C4C6277-5027-441E-AFAE-CA1F542DA009} +// *********************************************************************// + INetFwRules = interface(IDispatch) + ['{9C4C6277-5027-441E-AFAE-CA1F542DA009}'] + function Get_Count: Integer; safecall; + procedure Add(const rule: INetFwRule); safecall; + procedure Remove(const Name: WideString); safecall; + function Item(const Name: WideString): INetFwRule; safecall; + function Get__NewEnum: IUnknown; safecall; + property Count: Integer read Get_Count; + property _NewEnum: IUnknown read Get__NewEnum; + end; + +// *********************************************************************// +// DispIntf: INetFwRulesDisp +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {9C4C6277-5027-441E-AFAE-CA1F542DA009} +// *********************************************************************// + INetFwRulesDisp = dispinterface + ['{9C4C6277-5027-441E-AFAE-CA1F542DA009}'] + property Count: Integer readonly dispid 1; + procedure Add(const rule: INetFwRule); dispid 2; + procedure Remove(const Name: WideString); dispid 3; + function Item(const Name: WideString): INetFwRule; dispid 4; + property _NewEnum: IUnknown readonly dispid -4; + end; + +// *********************************************************************// +// Schnittstelle: INetFwRule +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {AF230D27-BABA-4E42-ACED-F524F22CFCE2} +// *********************************************************************// + INetFwRule = interface(IDispatch) + ['{AF230D27-BABA-4E42-ACED-F524F22CFCE2}'] + function Get_Name: WideString; safecall; + procedure Set_Name(const Name: WideString); safecall; + function Get_Description: WideString; safecall; + procedure Set_Description(const desc: WideString); safecall; + function Get_ApplicationName: WideString; safecall; + procedure Set_ApplicationName(const imageFileName: WideString); safecall; + function Get_serviceName: WideString; safecall; + procedure Set_serviceName(const serviceName: WideString); safecall; + function Get_Protocol: Integer; safecall; + procedure Set_Protocol(Protocol: Integer); safecall; + function Get_LocalPorts: WideString; safecall; + procedure Set_LocalPorts(const portNumbers: WideString); safecall; + function Get_RemotePorts: WideString; safecall; + procedure Set_RemotePorts(const portNumbers: WideString); safecall; + function Get_LocalAddresses: WideString; safecall; + procedure Set_LocalAddresses(const localAddrs: WideString); safecall; + function Get_RemoteAddresses: WideString; safecall; + procedure Set_RemoteAddresses(const remoteAddrs: WideString); safecall; + function Get_IcmpTypesAndCodes: WideString; safecall; + procedure Set_IcmpTypesAndCodes(const IcmpTypesAndCodes: WideString); safecall; + function Get_Direction: NET_FW_RULE_DIRECTION_; safecall; + procedure Set_Direction(dir: NET_FW_RULE_DIRECTION_); safecall; + function Get_Interfaces: OleVariant; safecall; + procedure Set_Interfaces(Interfaces: OleVariant); safecall; + function Get_InterfaceTypes: WideString; safecall; + procedure Set_InterfaceTypes(const InterfaceTypes: WideString); safecall; + function Get_Enabled: WordBool; safecall; + procedure Set_Enabled(Enabled: WordBool); safecall; + function Get_Grouping: WideString; safecall; + procedure Set_Grouping(const context: WideString); safecall; + function Get_Profiles: Integer; safecall; + procedure Set_Profiles(profileTypesBitmask: Integer); safecall; + function Get_EdgeTraversal: WordBool; safecall; + procedure Set_EdgeTraversal(Enabled: WordBool); safecall; + function Get_Action: NET_FW_ACTION_; safecall; + procedure Set_Action(Action: NET_FW_ACTION_); safecall; + property Name: WideString read Get_Name write Set_Name; + property Description: WideString read Get_Description write Set_Description; + property ApplicationName: WideString read Get_ApplicationName write Set_ApplicationName; + property serviceName: WideString read Get_serviceName write Set_serviceName; + property Protocol: Integer read Get_Protocol write Set_Protocol; + property LocalPorts: WideString read Get_LocalPorts write Set_LocalPorts; + property RemotePorts: WideString read Get_RemotePorts write Set_RemotePorts; + property LocalAddresses: WideString read Get_LocalAddresses write Set_LocalAddresses; + property RemoteAddresses: WideString read Get_RemoteAddresses write Set_RemoteAddresses; + property IcmpTypesAndCodes: WideString read Get_IcmpTypesAndCodes write Set_IcmpTypesAndCodes; + property Direction: NET_FW_RULE_DIRECTION_ read Get_Direction write Set_Direction; + property Interfaces: OleVariant read Get_Interfaces write Set_Interfaces; + property InterfaceTypes: WideString read Get_InterfaceTypes write Set_InterfaceTypes; + property Enabled: WordBool read Get_Enabled write Set_Enabled; + property Grouping: WideString read Get_Grouping write Set_Grouping; + property Profiles: Integer read Get_Profiles write Set_Profiles; + property EdgeTraversal: WordBool read Get_EdgeTraversal write Set_EdgeTraversal; + property Action: NET_FW_ACTION_ read Get_Action write Set_Action; + end; + +// *********************************************************************// +// DispIntf: INetFwRuleDisp +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {AF230D27-BABA-4E42-ACED-F524F22CFCE2} +// *********************************************************************// + INetFwRuleDisp = dispinterface + ['{AF230D27-BABA-4E42-ACED-F524F22CFCE2}'] + property Name: WideString dispid 1; + property Description: WideString dispid 2; + property ApplicationName: WideString dispid 3; + property serviceName: WideString dispid 4; + property Protocol: Integer dispid 5; + property LocalPorts: WideString dispid 6; + property RemotePorts: WideString dispid 7; + property LocalAddresses: WideString dispid 8; + property RemoteAddresses: WideString dispid 9; + property IcmpTypesAndCodes: WideString dispid 10; + property Direction: NET_FW_RULE_DIRECTION_ dispid 11; + property Interfaces: OleVariant dispid 12; + property InterfaceTypes: WideString dispid 13; + property Enabled: WordBool dispid 14; + property Grouping: WideString dispid 15; + property Profiles: Integer dispid 16; + property EdgeTraversal: WordBool dispid 17; + property Action: NET_FW_ACTION_ dispid 18; + end; + +// *********************************************************************// +// Schnittstelle: INetFwProfile +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {174A0DDA-E9F9-449D-993B-21AB667CA456} +// *********************************************************************// + INetFwProfile = interface(IDispatch) + ['{174A0DDA-E9F9-449D-993B-21AB667CA456}'] + function Get_Type_: NET_FW_PROFILE_TYPE_; safecall; + function Get_FirewallEnabled: WordBool; safecall; + procedure Set_FirewallEnabled(Enabled: WordBool); safecall; + function Get_ExceptionsNotAllowed: WordBool; safecall; + procedure Set_ExceptionsNotAllowed(notAllowed: WordBool); safecall; + function Get_NotificationsDisabled: WordBool; safecall; + procedure Set_NotificationsDisabled(disabled: WordBool); safecall; + function Get_UnicastResponsesToMulticastBroadcastDisabled: WordBool; safecall; + procedure Set_UnicastResponsesToMulticastBroadcastDisabled(disabled: WordBool); safecall; + function Get_RemoteAdminSettings: INetFwRemoteAdminSettings; safecall; + function Get_IcmpSettings: INetFwIcmpSettings; safecall; + function Get_GloballyOpenPorts: INetFwOpenPorts; safecall; + function Get_Services: INetFwServices; safecall; + function Get_AuthorizedApplications: INetFwAuthorizedApplications; safecall; + property Type_: NET_FW_PROFILE_TYPE_ read Get_Type_; + property FirewallEnabled: WordBool read Get_FirewallEnabled write Set_FirewallEnabled; + property ExceptionsNotAllowed: WordBool read Get_ExceptionsNotAllowed write Set_ExceptionsNotAllowed; + property NotificationsDisabled: WordBool read Get_NotificationsDisabled write Set_NotificationsDisabled; + property UnicastResponsesToMulticastBroadcastDisabled: WordBool read Get_UnicastResponsesToMulticastBroadcastDisabled write Set_UnicastResponsesToMulticastBroadcastDisabled; + property RemoteAdminSettings: INetFwRemoteAdminSettings read Get_RemoteAdminSettings; + property IcmpSettings: INetFwIcmpSettings read Get_IcmpSettings; + property GloballyOpenPorts: INetFwOpenPorts read Get_GloballyOpenPorts; + property Services: INetFwServices read Get_Services; + property AuthorizedApplications: INetFwAuthorizedApplications read Get_AuthorizedApplications; + end; + +// *********************************************************************// +// DispIntf: INetFwProfileDisp +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {174A0DDA-E9F9-449D-993B-21AB667CA456} +// *********************************************************************// + INetFwProfileDisp = dispinterface + ['{174A0DDA-E9F9-449D-993B-21AB667CA456}'] + property Type_: NET_FW_PROFILE_TYPE_ readonly dispid 1; + property FirewallEnabled: WordBool dispid 2; + property ExceptionsNotAllowed: WordBool dispid 3; + property NotificationsDisabled: WordBool dispid 4; + property UnicastResponsesToMulticastBroadcastDisabled: WordBool dispid 5; + property RemoteAdminSettings: INetFwRemoteAdminSettings readonly dispid 6; + property IcmpSettings: INetFwIcmpSettings readonly dispid 7; + property GloballyOpenPorts: INetFwOpenPorts readonly dispid 8; + property Services: INetFwServices readonly dispid 9; + property AuthorizedApplications: INetFwAuthorizedApplications readonly dispid 10; + end; + +// *********************************************************************// +// Schnittstelle: INetFwPolicy +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {D46D2478-9AC9-4008-9DC7-5563CE5536CC} +// *********************************************************************// + INetFwPolicy = interface(IDispatch) + ['{D46D2478-9AC9-4008-9DC7-5563CE5536CC}'] + function Get_CurrentProfile: INetFwProfile; safecall; + function GetProfileByType(profileType: NET_FW_PROFILE_TYPE_): INetFwProfile; safecall; + property CurrentProfile: INetFwProfile read Get_CurrentProfile; + end; + +// *********************************************************************// +// DispIntf: INetFwPolicyDisp +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {D46D2478-9AC9-4008-9DC7-5563CE5536CC} +// *********************************************************************// + INetFwPolicyDisp = dispinterface + ['{D46D2478-9AC9-4008-9DC7-5563CE5536CC}'] + property CurrentProfile: INetFwProfile readonly dispid 1; + function GetProfileByType(profileType: NET_FW_PROFILE_TYPE_): INetFwProfile; dispid 2; + end; + +// *********************************************************************// +// Schnittstelle: INetFwPolicy2 +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {98325047-C671-4174-8D81-DEFCD3F03186} +// *********************************************************************// + INetFwPolicy2 = interface(IDispatch) + ['{98325047-C671-4174-8D81-DEFCD3F03186}'] + function Get_CurrentProfileTypes: Integer; safecall; + function Get_FirewallEnabled(profileType: NET_FW_PROFILE_TYPE2_): WordBool; safecall; + procedure Set_FirewallEnabled(profileType: NET_FW_PROFILE_TYPE2_; Enabled: WordBool); safecall; + function Get_ExcludedInterfaces(profileType: NET_FW_PROFILE_TYPE2_): OleVariant; safecall; + procedure Set_ExcludedInterfaces(profileType: NET_FW_PROFILE_TYPE2_; Interfaces: OleVariant); safecall; + function Get_BlockAllInboundTraffic(profileType: NET_FW_PROFILE_TYPE2_): WordBool; safecall; + procedure Set_BlockAllInboundTraffic(profileType: NET_FW_PROFILE_TYPE2_; Block: WordBool); safecall; + function Get_NotificationsDisabled(profileType: NET_FW_PROFILE_TYPE2_): WordBool; safecall; + procedure Set_NotificationsDisabled(profileType: NET_FW_PROFILE_TYPE2_; disabled: WordBool); safecall; + function Get_UnicastResponsesToMulticastBroadcastDisabled(profileType: NET_FW_PROFILE_TYPE2_): WordBool; safecall; + procedure Set_UnicastResponsesToMulticastBroadcastDisabled(profileType: NET_FW_PROFILE_TYPE2_; + disabled: WordBool); safecall; + function Get_Rules: INetFwRules; safecall; + function Get_ServiceRestriction: INetFwServiceRestriction; safecall; + procedure EnableRuleGroup(profileTypesBitmask: Integer; const group: WideString; + enable: WordBool); safecall; + function IsRuleGroupEnabled(profileTypesBitmask: Integer; const group: WideString): WordBool; safecall; + procedure RestoreLocalFirewallDefaults; safecall; + function Get_DefaultInboundAction(profileType: NET_FW_PROFILE_TYPE2_): NET_FW_ACTION_; safecall; + procedure Set_DefaultInboundAction(profileType: NET_FW_PROFILE_TYPE2_; Action: NET_FW_ACTION_); safecall; + function Get_DefaultOutboundAction(profileType: NET_FW_PROFILE_TYPE2_): NET_FW_ACTION_; safecall; + procedure Set_DefaultOutboundAction(profileType: NET_FW_PROFILE_TYPE2_; Action: NET_FW_ACTION_); safecall; + function Get_IsRuleGroupCurrentlyEnabled(const group: WideString): WordBool; safecall; + function Get_LocalPolicyModifyState: NET_FW_MODIFY_STATE_; safecall; + property CurrentProfileTypes: Integer read Get_CurrentProfileTypes; + property FirewallEnabled[profileType: NET_FW_PROFILE_TYPE2_]: WordBool read Get_FirewallEnabled write Set_FirewallEnabled; + property ExcludedInterfaces[profileType: NET_FW_PROFILE_TYPE2_]: OleVariant read Get_ExcludedInterfaces write Set_ExcludedInterfaces; + property BlockAllInboundTraffic[profileType: NET_FW_PROFILE_TYPE2_]: WordBool read Get_BlockAllInboundTraffic write Set_BlockAllInboundTraffic; + property NotificationsDisabled[profileType: NET_FW_PROFILE_TYPE2_]: WordBool read Get_NotificationsDisabled write Set_NotificationsDisabled; + property UnicastResponsesToMulticastBroadcastDisabled[profileType: NET_FW_PROFILE_TYPE2_]: WordBool read Get_UnicastResponsesToMulticastBroadcastDisabled write Set_UnicastResponsesToMulticastBroadcastDisabled; + property Rules: INetFwRules read Get_Rules; + property ServiceRestriction: INetFwServiceRestriction read Get_ServiceRestriction; + property DefaultInboundAction[profileType: NET_FW_PROFILE_TYPE2_]: NET_FW_ACTION_ read Get_DefaultInboundAction write Set_DefaultInboundAction; + property DefaultOutboundAction[profileType: NET_FW_PROFILE_TYPE2_]: NET_FW_ACTION_ read Get_DefaultOutboundAction write Set_DefaultOutboundAction; + property IsRuleGroupCurrentlyEnabled[const group: WideString]: WordBool read Get_IsRuleGroupCurrentlyEnabled; + property LocalPolicyModifyState: NET_FW_MODIFY_STATE_ read Get_LocalPolicyModifyState; + end; + +// *********************************************************************// +// DispIntf: INetFwPolicy2Disp +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {98325047-C671-4174-8D81-DEFCD3F03186} +// *********************************************************************// + INetFwPolicy2Disp = dispinterface + ['{98325047-C671-4174-8D81-DEFCD3F03186}'] + property CurrentProfileTypes: Integer readonly dispid 1; + property FirewallEnabled[profileType: NET_FW_PROFILE_TYPE2_]: WordBool dispid 2; + property ExcludedInterfaces[profileType: NET_FW_PROFILE_TYPE2_]: OleVariant dispid 3; + property BlockAllInboundTraffic[profileType: NET_FW_PROFILE_TYPE2_]: WordBool dispid 4; + property NotificationsDisabled[profileType: NET_FW_PROFILE_TYPE2_]: WordBool dispid 5; + property UnicastResponsesToMulticastBroadcastDisabled[profileType: NET_FW_PROFILE_TYPE2_]: WordBool dispid 6; + property Rules: INetFwRules readonly dispid 7; + property ServiceRestriction: INetFwServiceRestriction readonly dispid 8; + procedure EnableRuleGroup(profileTypesBitmask: Integer; const group: WideString; + enable: WordBool); dispid 9; + function IsRuleGroupEnabled(profileTypesBitmask: Integer; const group: WideString): WordBool; dispid 10; + procedure RestoreLocalFirewallDefaults; dispid 11; + property DefaultInboundAction[profileType: NET_FW_PROFILE_TYPE2_]: NET_FW_ACTION_ dispid 12; + property DefaultOutboundAction[profileType: NET_FW_PROFILE_TYPE2_]: NET_FW_ACTION_ dispid 13; + property IsRuleGroupCurrentlyEnabled[const group: WideString]: WordBool readonly dispid 14; + property LocalPolicyModifyState: NET_FW_MODIFY_STATE_ readonly dispid 15; + end; + +// *********************************************************************// +// Schnittstelle: INetFwMgr +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {F7898AF5-CAC4-4632-A2EC-DA06E5111AF2} +// *********************************************************************// + INetFwMgr = interface(IDispatch) + ['{F7898AF5-CAC4-4632-A2EC-DA06E5111AF2}'] + function Get_LocalPolicy: INetFwPolicy; safecall; + function Get_CurrentProfileType: NET_FW_PROFILE_TYPE_; safecall; + procedure RestoreDefaults; safecall; + procedure IsPortAllowed(const imageFileName: WideString; IpVersion: NET_FW_IP_VERSION_; + portNumber: Integer; const localAddress: WideString; + ipProtocol: NET_FW_IP_PROTOCOL_; out allowed: OleVariant; + out restricted: OleVariant); safecall; + procedure IsIcmpTypeAllowed(IpVersion: NET_FW_IP_VERSION_; const localAddress: WideString; + Type_: Byte; out allowed: OleVariant; out restricted: OleVariant); safecall; + property LocalPolicy: INetFwPolicy read Get_LocalPolicy; + property CurrentProfileType: NET_FW_PROFILE_TYPE_ read Get_CurrentProfileType; + end; + +// *********************************************************************// +// DispIntf: INetFwMgrDisp +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {F7898AF5-CAC4-4632-A2EC-DA06E5111AF2} +// *********************************************************************// + INetFwMgrDisp = dispinterface + ['{F7898AF5-CAC4-4632-A2EC-DA06E5111AF2}'] + property LocalPolicy: INetFwPolicy readonly dispid 1; + property CurrentProfileType: NET_FW_PROFILE_TYPE_ readonly dispid 2; + procedure RestoreDefaults; dispid 3; + procedure IsPortAllowed(const imageFileName: WideString; IpVersion: NET_FW_IP_VERSION_; + portNumber: Integer; const localAddress: WideString; + ipProtocol: NET_FW_IP_PROTOCOL_; out allowed: OleVariant; + out restricted: OleVariant); dispid 4; + procedure IsIcmpTypeAllowed(IpVersion: NET_FW_IP_VERSION_; const localAddress: WideString; + Type_: Byte; out allowed: OleVariant; out restricted: OleVariant); dispid 5; + end; + +implementation + +uses ComObj; + +end. diff --git a/build/Source/ServiceControl.pas b/build/Source/ServiceControl.pas new file mode 100644 index 0000000000..1dd21a5886 --- /dev/null +++ b/build/Source/ServiceControl.pas @@ -0,0 +1,987 @@ +{ +License Agreement + +This content is subject to the Mozilla Public License Version 1.1 (the "License"); +You may not use this plugin except in compliance with the License. You may +obtain a copy of the License at http://www.mozilla.org/MPL. + +Alternatively, you may redistribute this library, use and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation; either version 2.1 of the License, +or (at your option) any later version. You may obtain a copy +of the LGPL at www.gnu.org/copyleft. + +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +for the specific language governing rights and limitations under the License. + +The original code is ServiceControl.pas, released April 16, 2007. + +The initial developer of the original code is Rainer Budde (http://www.speed-soft.de). + +SimpleSC - NSIS Service Control Plugin is written, published and maintaned by +Rainer Budde (rainer@speed-soft.de). +} +unit ServiceControl; + +interface + +uses + Windows, SysUtils, WinSvc; + + function InstallService(ServiceName, DisplayName: String; ServiceType: DWORD; StartType: DWORD; BinaryPathName: String; Dependencies: String; Username: String; Password: String): Integer; + function RemoveService(ServiceName: String): Integer; + function GetServiceName(DisplayName: String; var Name: String): Integer; + function GetServiceDisplayName(ServiceName: String; var Name: String): Integer; + function GetServiceStatus(ServiceName: String; var Status: DWORD): Integer; + function GetServiceBinaryPath(ServiceName: String; var BinaryPath: String): Integer; + function GetServiceStartType(ServiceName: String; var StartType: DWORD): Integer; + function GetServiceDescription(ServiceName: String; var Description: String): Integer; + function GetServiceLogon(ServiceName: String; var Username: String): Integer; + function SetServiceStartType(ServiceName: String; StartType: DWORD): Integer; + function SetServiceDescription(ServiceName: String; Description: String): Integer; + function SetServiceLogon(ServiceName: String; Username: String; Password: String): Integer; + function SetServiceBinaryPath(ServiceName: String; BinaryPath: String): Integer; + function ServiceIsRunning(ServiceName: String; var IsRunning: Boolean): Integer; + function ServiceIsStopped(ServiceName: String; var IsStopped: Boolean): Integer; + function ServiceIsPaused(ServiceName: String; var IsPaused: Boolean): Integer; + function StartService(ServiceName: String; ServiceArguments: String): Integer; + function StopService(ServiceName: String): Integer; + function PauseService(ServiceName: String): Integer; + function ContinueService(ServiceName: String): Integer; + function RestartService(ServiceName: String; ServiceArguments: String): Integer; + function ExistsService(ServiceName: String): Integer; + function GetErrorMessage(ErrorCode: Integer): String; + +implementation + +function WaitForStatus(ServiceName: String; Status: DWord): Integer; +var + CurrentStatus: DWord; + StatusResult: Integer; + StatusReached: Boolean; + TimeOutReached: Boolean; + StartTickCount: Cardinal; +const + STATUS_TIMEOUT = 30000; + WAIT_TIMEOUT = 250; +begin + Result := 0; + + StatusReached := False; + TimeOutReached := False; + + StartTickCount := GetTickCount; + + while not StatusReached and not TimeOutReached do + begin + StatusResult := GetServiceStatus(ServiceName, CurrentStatus); + + if StatusResult = 0 then + begin + if Status = CurrentStatus then + StatusReached := True + else + Sleep(WAIT_TIMEOUT); + end + else + Result := StatusResult; + + if (StartTickCount + STATUS_TIMEOUT) < GetTickCount then + begin + TimeOutReached := True; + Result := ERROR_SERVICE_REQUEST_TIMEOUT; + end; + end; + +end; + +function ExistsService(ServiceName: String): Integer; +var + ManagerHandle: SC_HANDLE; + ServiceHandle: SC_HANDLE; +begin + Result := 0; + + ManagerHandle := OpenSCManager('', nil, SC_MANAGER_CONNECT); + + if ManagerHandle > 0 then + begin + ServiceHandle := OpenService(ManagerHandle, PChar(ServiceName), SERVICE_QUERY_CONFIG); + + if ServiceHandle > 0 then + CloseServiceHandle(ServiceHandle) + else + Result := System.GetLastError; + + CloseServiceHandle(ManagerHandle); + end + else + Result := System.GetLastError; +end; + +function StartService(ServiceName: String; ServiceArguments: String): Integer; +type + TArguments = Array of PChar; +var + ManagerHandle: SC_HANDLE; + ServiceHandle: SC_HANDLE; + ServiceArgVectors: TArguments; + NumServiceArgs: DWORD; +const + ArgDelimitterQuote: String = '"'; + ArgDelimitterWhiteSpace: String = ' '; + + procedure GetServiceArguments(ServiceArguments: String; var NumServiceArgs: DWORD; var ServiceArgVectors: TArguments); + var + Param: String; + Split: Boolean; + Quoted: Boolean; + CharIsDelimitter: Boolean; + begin + ServiceArgVectors := nil; + NumServiceArgs := 0; + + Quoted := False; + + while Length(ServiceArguments) > 0 do + begin + Split := False; + CharIsDelimitter := False; + + if ServiceArguments[1] = ' ' then + if not Quoted then + begin + CharIsDelimitter := True; + Split := True; + end; + + if ServiceArguments[1] = '"' then + begin + Quoted := not Quoted; + CharIsDelimitter := True; + + if not Quoted then + Split := True; + end; + + if not CharIsDelimitter then + Param := Param + ServiceArguments[1]; + + if Split or (Length(ServiceArguments) = 1) then + begin + SetLength(ServiceArgVectors, Length(ServiceArgVectors) + 1); + GetMem(ServiceArgVectors[Length(ServiceArgVectors) -1], Length(Param) + 1); + StrPCopy(ServiceArgVectors[Length(ServiceArgVectors) -1], Param); + + Param := ''; + + Delete(ServiceArguments, 1, 1); + ServiceArguments := Trim(ServiceArguments); + end + else + Delete(ServiceArguments, 1, 1); + + end; + + if Length(ServiceArgVectors) > 0 then + NumServiceArgs := Length(ServiceArgVectors); + end; + + procedure FreeServiceArguments(ServiceArgVectors: TArguments); + var + i: Integer; + begin + if Length(ServiceArgVectors) > 0 then + for i := 0 to Length(ServiceArgVectors) -1 do + FreeMem(ServiceArgVectors[i]); + end; + +begin + ManagerHandle := OpenSCManager('', nil, SC_MANAGER_CONNECT); + + if ManagerHandle > 0 then + begin + ServiceHandle := OpenService(ManagerHandle, PChar(ServiceName), SERVICE_START); + + if ServiceHandle > 0 then + begin + GetServiceArguments(ServiceArguments, NumServiceArgs, ServiceArgVectors); + + if WinSvc.StartService(ServiceHandle, NumServiceArgs, ServiceArgVectors[0]) then + Result := WaitForStatus(ServiceName, SERVICE_RUNNING) + else + Result := System.GetLastError; + + FreeServiceArguments(ServiceArgVectors); + + CloseServiceHandle(ServiceHandle); + end + else + Result := System.GetLastError; + + + CloseServiceHandle(ManagerHandle); + end + else + Result := System.GetLastError; +end; + +function StopService(ServiceName: String): Integer; +var + ManagerHandle: SC_HANDLE; + ServiceHandle: SC_HANDLE; + ServiceStatus: TServiceStatus; + Dependencies: PEnumServiceStatus; + BytesNeeded: Cardinal; + ServicesReturned: Cardinal; + ServicesEnumerated: Boolean; + EnumerationSuccess: Boolean; + i: Cardinal; +begin + Result := 0; + + BytesNeeded := 0; + ServicesReturned := 0; + + Dependencies := nil; + ServicesEnumerated := False; + + ManagerHandle := OpenSCManager('', nil, SC_MANAGER_CONNECT or SC_MANAGER_ENUMERATE_SERVICE); + + if ManagerHandle > 0 then + begin + ServiceHandle := OpenService(ManagerHandle, PChar(ServiceName), SERVICE_STOP or SERVICE_ENUMERATE_DEPENDENTS); + + if ServiceHandle > 0 then + begin + if not EnumDependentServices(ServiceHandle, SERVICE_ACTIVE, Dependencies^, 0, BytesNeeded, ServicesReturned) then + begin + ServicesEnumerated := True; + GetMem(Dependencies, BytesNeeded); + + EnumerationSuccess := EnumDependentServices(ServiceHandle, SERVICE_ACTIVE, Dependencies^, BytesNeeded, BytesNeeded, ServicesReturned); + + if EnumerationSuccess and (ServicesReturned > 0) then + begin + for i := 1 to ServicesReturned do + begin + Result := StopService(Dependencies.lpServiceName); + + if Result <> 0 then + Break; + + Inc(Dependencies); + end; + end + else + Result := System.GetLastError; + end; + + if (ServicesEnumerated and (Result = 0)) or not ServicesEnumerated then + begin + if ControlService(ServiceHandle, SERVICE_CONTROL_STOP, ServiceStatus) then + Result := WaitForStatus(ServiceName, SERVICE_STOPPED) + else + Result := System.GetLastError + end; + + CloseServiceHandle(ServiceHandle); + end + else + Result := System.GetLastError; + + CloseServiceHandle(ManagerHandle); + end + else + Result := System.GetLastError; +end; + +function PauseService(ServiceName: String): Integer; +var + ManagerHandle: SC_HANDLE; + ServiceHandle: SC_HANDLE; + ServiceStatus: TServiceStatus; +begin + ManagerHandle := OpenSCManager('', nil, SC_MANAGER_CONNECT); + + if ManagerHandle > 0 then + begin + ServiceHandle := OpenService(ManagerHandle, PChar(ServiceName), SERVICE_PAUSE_CONTINUE); + + if ServiceHandle > 0 then + begin + + if ControlService(ServiceHandle, SERVICE_CONTROL_PAUSE, ServiceStatus) then + Result := WaitForStatus(ServiceName, SERVICE_PAUSED) + else + Result := System.GetLastError; + + CloseServiceHandle(ServiceHandle); + end + else + Result := System.GetLastError; + + CloseServiceHandle(ManagerHandle); + end + else + Result := System.GetLastError; +end; + +function ContinueService(ServiceName: String): Integer; +var + ManagerHandle: SC_HANDLE; + ServiceHandle: SC_HANDLE; + ServiceStatus: TServiceStatus; +begin + ManagerHandle := OpenSCManager('', nil, SC_MANAGER_CONNECT); + + if ManagerHandle > 0 then + begin + ServiceHandle := OpenService(ManagerHandle, PChar(ServiceName), SERVICE_PAUSE_CONTINUE); + + if ServiceHandle > 0 then + begin + + if ControlService(ServiceHandle, SERVICE_CONTROL_CONTINUE, ServiceStatus) then + Result := WaitForStatus(ServiceName, SERVICE_RUNNING) + else + Result := System.GetLastError; + + CloseServiceHandle(ServiceHandle); + end + else + Result := System.GetLastError; + + CloseServiceHandle(ManagerHandle); + end + else + Result := System.GetLastError; +end; + +function GetServiceName(DisplayName: String; var Name: String): Integer; +var + ManagerHandle: SC_HANDLE; + ServiceName: PChar; + ServiceBuffer: Cardinal; +begin + Result := 0; + + ServiceBuffer := 255; + ServiceName := StrAlloc(ServiceBuffer+1); + + ManagerHandle := OpenSCManager('', nil, SC_MANAGER_CONNECT); + + if ManagerHandle > 0 then + begin + if WinSvc.GetServiceKeyName(ManagerHandle, PChar(DisplayName), ServiceName, ServiceBuffer) then + Name := ServiceName + else + Result := System.GetLastError; + + CloseServiceHandle(ManagerHandle); + end + else + Result := System.GetLastError; +end; + +function GetServiceDisplayName(ServiceName: String; var Name: String): Integer; +var + ManagerHandle: SC_HANDLE; + DisplayName: PChar; + ServiceBuffer: Cardinal; +begin + Result := 0; + + ServiceBuffer := 255; + DisplayName := StrAlloc(ServiceBuffer+1); + + ManagerHandle := OpenSCManager('', nil, SC_MANAGER_CONNECT); + + if ManagerHandle > 0 then + begin + if WinSvc.GetServiceDisplayName(ManagerHandle, PChar(ServiceName), DisplayName, ServiceBuffer) then + Name := DisplayName + else + Result := System.GetLastError; + + CloseServiceHandle(ManagerHandle); + end + else + Result := System.GetLastError; +end; + +function GetServiceStatus(ServiceName: String; var Status: DWORD): Integer; +var + ManagerHandle: SC_HANDLE; + ServiceHandle: SC_HANDLE; + ServiceStatus: TServiceStatus; +begin + Result := 0; + + ManagerHandle := OpenSCManager('', nil, SC_MANAGER_CONNECT); + + if ManagerHandle > 0 then + begin + ServiceHandle := OpenService(ManagerHandle, PChar(ServiceName), SERVICE_QUERY_STATUS); + + if ServiceHandle > 0 then + begin + if QueryServiceStatus(ServiceHandle, ServiceStatus) then + Status := ServiceStatus.dwCurrentState + else + Result := System.GetLastError; + + CloseServiceHandle(ServiceHandle); + end + else + Result := System.GetLastError; + + CloseServiceHandle(ManagerHandle); + end + else + Result := System.GetLastError; +end; + +function GetServiceBinaryPath(ServiceName: String; var BinaryPath: String): Integer; +var + ManagerHandle: SC_HANDLE; + ServiceHandle: SC_HANDLE; + BytesNeeded: DWORD; + ServiceConfig: PQueryServiceConfig; +begin + Result := 0; + ServiceConfig := nil; + + ManagerHandle := OpenSCManager('', nil, SC_MANAGER_CONNECT); + + if ManagerHandle > 0 then + begin + ServiceHandle := OpenService(ManagerHandle, PChar(ServiceName), SERVICE_QUERY_CONFIG); + + if ServiceHandle > 0 then + begin + + if not QueryServiceConfig(ServiceHandle, ServiceConfig, 0, BytesNeeded) and (System.GetLastError = ERROR_INSUFFICIENT_BUFFER) then + begin + GetMem(ServiceConfig, BytesNeeded); + + if QueryServiceConfig(ServiceHandle, ServiceConfig, BytesNeeded, BytesNeeded) then + BinaryPath := ServiceConfig^.lpBinaryPathName + else + Result := System.GetLastError; + + FreeMem(ServiceConfig); + end + else + Result := System.GetLastError; + + CloseServiceHandle(ServiceHandle); + end + else + Result := System.GetLastError; + + CloseServiceHandle(ManagerHandle); + end + else + Result := System.GetLastError; +end; + +function GetServiceStartType(ServiceName: String; var StartType: DWORD): Integer; +var + ManagerHandle: SC_HANDLE; + ServiceHandle: SC_HANDLE; + BytesNeeded: DWORD; + ServiceConfig: PQueryServiceConfig; +begin + Result := 0; + ServiceConfig := nil; + + ManagerHandle := OpenSCManager('', nil, SC_MANAGER_CONNECT); + + if ManagerHandle > 0 then + begin + ServiceHandle := OpenService(ManagerHandle, PChar(ServiceName), SERVICE_QUERY_CONFIG); + + if ServiceHandle > 0 then + begin + + if not QueryServiceConfig(ServiceHandle, ServiceConfig, 0, BytesNeeded) and (System.GetLastError = ERROR_INSUFFICIENT_BUFFER) then + begin + GetMem(ServiceConfig, BytesNeeded); + + if QueryServiceConfig(ServiceHandle, ServiceConfig, BytesNeeded, BytesNeeded) then + StartType := ServiceConfig^.dwStartType + else + Result := System.GetLastError; + + FreeMem(ServiceConfig); + end + else + Result := System.GetLastError; + + CloseServiceHandle(ServiceHandle); + end + else + Result := System.GetLastError; + + CloseServiceHandle(ManagerHandle); + end + else + Result := System.GetLastError; +end; + +function GetServiceDescription(ServiceName: String; var Description: String): Integer; +const + SERVICE_CONFIG_DESCRIPTION = 1; +type + TServiceDescription = record + lpDescription: PAnsiChar; + end; + PServiceDescription = ^TServiceDescription; +var + QueryServiceConfig2: function(hService: SC_HANDLE; dwInfoLevel: DWORD; pBuffer: Pointer; cbBufSize: DWORD; var cbBytesNeeded: Cardinal): BOOL; stdcall; + ManagerHandle: SC_HANDLE; + ServiceHandle: SC_HANDLE; + LockHandle: SC_LOCK; + ServiceDescription: PServiceDescription; + BytesNeeded: Cardinal; +begin + Result := 0; + + ManagerHandle := OpenSCManager('', nil, SC_MANAGER_LOCK); + + if ManagerHandle > 0 then + begin + ServiceHandle := OpenService(ManagerHandle, PChar(ServiceName), SERVICE_QUERY_CONFIG); + + if ServiceHandle > 0 then + begin + LockHandle := LockServiceDatabase(ManagerHandle); + + if LockHandle <> nil then + begin + @QueryServiceConfig2 := GetProcAddress(GetModuleHandle(advapi32), 'QueryServiceConfig2A'); + + if Assigned(@QueryServiceConfig2) then + begin + + if not QueryServiceConfig2(ServiceHandle, SERVICE_CONFIG_DESCRIPTION, nil, 0, BytesNeeded) and (System.GetLastError = ERROR_INSUFFICIENT_BUFFER) then + begin + GetMem(ServiceDescription, BytesNeeded); + + if QueryServiceConfig2(ServiceHandle, SERVICE_CONFIG_DESCRIPTION, ServiceDescription, BytesNeeded, BytesNeeded) then + Description := ServiceDescription.lpDescription + else + Result := System.GetLastError; + + FreeMem(ServiceDescription); + end + else + Result := System.GetLastError; + + end + else + Result := System.GetLastError; + + UnlockServiceDatabase(LockHandle); + end + else + Result := System.GetLastError; + + CloseServiceHandle(ServiceHandle); + end + else + Result := System.GetLastError; + + CloseServiceHandle(ManagerHandle); + end + else + Result := System.GetLastError; +end; + +function GetServiceLogon(ServiceName: String; var Username: String): Integer; +var + ManagerHandle: SC_HANDLE; + ServiceHandle: SC_HANDLE; + BytesNeeded: DWORD; + ServiceConfig: PQueryServiceConfig; +begin + Result := 0; + ServiceConfig := nil; + + ManagerHandle := OpenSCManager('', nil, SC_MANAGER_CONNECT); + + if ManagerHandle > 0 then + begin + ServiceHandle := OpenService(ManagerHandle, PChar(ServiceName), SERVICE_QUERY_CONFIG); + + if ServiceHandle > 0 then + begin + + if not QueryServiceConfig(ServiceHandle, ServiceConfig, 0, BytesNeeded) and (System.GetLastError = ERROR_INSUFFICIENT_BUFFER) then + begin + GetMem(ServiceConfig, BytesNeeded); + + if QueryServiceConfig(ServiceHandle, ServiceConfig, BytesNeeded, BytesNeeded) then + Username := ServiceConfig^.lpServiceStartName + else + Result := System.GetLastError; + + FreeMem(ServiceConfig); + end + else + Result := System.GetLastError; + + CloseServiceHandle(ServiceHandle); + end + else + Result := System.GetLastError; + + CloseServiceHandle(ManagerHandle); + end + else + Result := System.GetLastError; +end; + +function SetServiceDescription(ServiceName: String; Description: String): Integer; +const + SERVICE_CONFIG_DESCRIPTION = 1; +var + ChangeServiceConfig2: function(hService: SC_HANDLE; dwInfoLevel: DWORD; lpInfo: Pointer): BOOL; stdcall; + ManagerHandle: SC_HANDLE; + ServiceHandle: SC_HANDLE; + LockHandle: SC_LOCK; +begin + Result := 0; + + ManagerHandle := OpenSCManager('', nil, SC_MANAGER_LOCK); + + if ManagerHandle > 0 then + begin + ServiceHandle := OpenService(ManagerHandle, PChar(ServiceName), SERVICE_CHANGE_CONFIG); + + if ServiceHandle > 0 then + begin + LockHandle := LockServiceDatabase(ManagerHandle); + + if LockHandle <> nil then + begin + @ChangeServiceConfig2 := GetProcAddress(GetModuleHandle(advapi32), 'ChangeServiceConfig2A'); + + if Assigned(@ChangeServiceConfig2) then + begin + if not ChangeServiceConfig2(ServiceHandle, SERVICE_CONFIG_DESCRIPTION, @Description) then + Result := System.GetLastError; + end + else + Result := System.GetLastError; + + UnlockServiceDatabase(LockHandle); + end + else + Result := System.GetLastError; + + CloseServiceHandle(ServiceHandle); + end + else + Result := System.GetLastError; + + CloseServiceHandle(ManagerHandle); + end + else + Result := System.GetLastError; +end; + +function SetServiceStartType(ServiceName: String; StartType: DWORD): Integer; +var + ManagerHandle: SC_HANDLE; + ServiceHandle: SC_HANDLE; + LockHandle: SC_LOCK; +begin + Result := 0; + + ManagerHandle := OpenSCManager('', nil, SC_MANAGER_LOCK); + + if ManagerHandle > 0 then + begin + ServiceHandle := OpenService(ManagerHandle, PChar(ServiceName), SERVICE_CHANGE_CONFIG); + + if ServiceHandle > 0 then + begin + LockHandle := LockServiceDatabase(ManagerHandle); + + if LockHandle <> nil then + begin + if not ChangeServiceConfig(ServiceHandle, SERVICE_NO_CHANGE, StartType, SERVICE_NO_CHANGE, nil, nil, nil, nil, nil, nil, nil) then + Result := System.GetLastError; + + UnlockServiceDatabase(LockHandle); + end + else + Result := System.GetLastError; + + CloseServiceHandle(ServiceHandle); + end + else + Result := System.GetLastError; + + CloseServiceHandle(ManagerHandle); + end + else + Result := System.GetLastError; +end; + +function SetServiceLogon(ServiceName: String; Username: String; Password: String): Integer; +var + ManagerHandle: SC_HANDLE; + ServiceHandle: SC_HANDLE; + LockHandle: SC_LOCK; +begin + Result := 0; + + ManagerHandle := OpenSCManager('', nil, SC_MANAGER_LOCK); + + if Pos('\', Username) = 0 then + Username := '.\' + Username; + + if ManagerHandle > 0 then + begin + ServiceHandle := OpenService(ManagerHandle, PChar(ServiceName), SERVICE_CHANGE_CONFIG); + + if ServiceHandle > 0 then + begin + LockHandle := LockServiceDatabase(ManagerHandle); + + if LockHandle <> nil then + begin + if not ChangeServiceConfig(ServiceHandle, SERVICE_NO_CHANGE, SERVICE_NO_CHANGE, SERVICE_NO_CHANGE, nil, nil, nil, nil, PChar(Username), PChar(Password), nil) then + Result := System.GetLastError; + + UnlockServiceDatabase(LockHandle); + end + else + Result := System.GetLastError; + + CloseServiceHandle(ServiceHandle); + end + else + Result := System.GetLastError; + + CloseServiceHandle(ManagerHandle); + end + else + Result := System.GetLastError; +end; + +function SetServiceBinaryPath(ServiceName: String; BinaryPath: String): Integer; +var + ManagerHandle: SC_HANDLE; + ServiceHandle: SC_HANDLE; + LockHandle: SC_LOCK; +begin + Result := 0; + + ManagerHandle := OpenSCManager('', nil, SC_MANAGER_LOCK); + + if ManagerHandle > 0 then + begin + ServiceHandle := OpenService(ManagerHandle, PChar(ServiceName), SERVICE_CHANGE_CONFIG); + + if ServiceHandle > 0 then + begin + LockHandle := LockServiceDatabase(ManagerHandle); + + if LockHandle <> nil then + begin + if not ChangeServiceConfig(ServiceHandle, SERVICE_NO_CHANGE, SERVICE_NO_CHANGE, SERVICE_NO_CHANGE, PChar(BinaryPath), nil, nil, nil, nil, nil, nil) then + Result := System.GetLastError; + + UnlockServiceDatabase(LockHandle); + end + else + Result := System.GetLastError; + + CloseServiceHandle(ServiceHandle); + end + else + Result := System.GetLastError; + + CloseServiceHandle(ManagerHandle); + end + else + Result := System.GetLastError; +end; + +function ServiceIsRunning(ServiceName: String; var IsRunning: Boolean): Integer; +var + Status: DWORD; +begin + Result := GetServiceStatus(ServiceName, Status); + + if Result = 0 then + IsRunning := Status = SERVICE_RUNNING + else + IsRunning := False; +end; + +function ServiceIsStopped(ServiceName: String; var IsStopped: Boolean): Integer; +var + Status: DWORD; +begin + Result := GetServiceStatus(ServiceName, Status); + + if Result = 0 then + IsStopped := Status = SERVICE_STOPPED + else + IsStopped := False; +end; + +function ServiceIsPaused(ServiceName: String; var IsPaused: Boolean): Integer; +var + Status: DWORD; +begin + Result := GetServiceStatus(ServiceName, Status); + + if Result = 0 then + IsPaused := Status = SERVICE_PAUSED + else + IsPaused := False; +end; + +function RestartService(ServiceName: String; ServiceArguments: String): Integer; +begin + Result := StopService(ServiceName); + + if Result = 0 then + Result := StartService(ServiceName, ServiceArguments); +end; + +function InstallService(ServiceName, DisplayName: String; ServiceType: DWORD; + StartType: DWORD; BinaryPathName: String; Dependencies: String; + Username: String; Password: String): Integer; +var + ManagerHandle: SC_HANDLE; + ServiceHandle: SC_HANDLE; + PDependencies: PChar; + PUsername: PChar; + PPassword: PChar; +const + ReplaceDelimitter: String = '/'; + + function Replace(Value: String): String; + begin + while Pos(ReplaceDelimitter, Value) <> 0 do + begin + Result := Result + Copy(Value, 1, Pos(ReplaceDelimitter, Value) -1) + Chr(0); + Delete(Value, 1, Pos(ReplaceDelimitter, Value)); + end; + + Result := Result + Value + Chr(0) + Chr(0); + end; + +begin + Result := 0; + + if Dependencies = '' then + PDependencies := nil + else + PDependencies := PChar(Replace(Dependencies)); + + if UserName = '' then + PUsername := nil + else + PUsername := PChar(Username); + + if Password = '' then + PPassword := nil + else + PPassword := PChar(Password); + + ManagerHandle := OpenSCManager('', nil, SC_MANAGER_ALL_ACCESS); + + if ManagerHandle > 0 then + begin + ServiceHandle := CreateService(ManagerHandle, + PChar(ServiceName), + PChar(DisplayName), + SERVICE_START or SERVICE_QUERY_STATUS or _DELETE, + ServiceType, + StartType, + SERVICE_ERROR_NORMAL, + PChar(BinaryPathName), + nil, + nil, + PDependencies, + PUsername, + PPassword); + + if ServiceHandle <> 0 then + CloseServiceHandle(ServiceHandle) + else + Result := System.GetLastError; + + CloseServiceHandle(ManagerHandle); + end + else + Result := System.GetLastError; +end; + +function RemoveService(ServiceName: String): Integer; +var + ManagerHandle: SC_HANDLE; + ServiceHandle: SC_HANDLE; + LockHandle: SC_LOCK; + IsStopped: Boolean; + Deleted: Boolean; +begin + IsStopped := False; + + Result := ServiceIsStopped(ServiceName, IsStopped); + + if Result = 0 then + if not IsStopped then + Result := StopService(ServiceName); + + if Result = 0 then + begin + ManagerHandle := OpenSCManager('', nil, SC_MANAGER_ALL_ACCESS); + + if ManagerHandle > 0 then + begin + ServiceHandle := OpenService(ManagerHandle, PChar(ServiceName), SERVICE_ALL_ACCESS); + + if ServiceHandle > 0 then + begin + LockHandle := LockServiceDatabase(ManagerHandle); + + if LockHandle <> nil then + begin + Deleted := DeleteService(ServiceHandle); + + if not Deleted then + Result := System.GetLastError; + + UnlockServiceDatabase(LockHandle); + end + else + Result := System.GetLastError; + + CloseServiceHandle(ServiceHandle); + end + else + Result := System.GetLastError; + + CloseServiceHandle(ManagerHandle); + end + else + Result := System.GetLastError; + end; +end; + +function GetErrorMessage(ErrorCode: Integer): String; +begin + Result := SysErrorMessage(ErrorCode); +end; + +end. diff --git a/build/Source/SimpleFC.cfg b/build/Source/SimpleFC.cfg new file mode 100644 index 0000000000..39c843799c --- /dev/null +++ b/build/Source/SimpleFC.cfg @@ -0,0 +1,35 @@ +-$A8 +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J- +-$K- +-$L+ +-$M- +-$N+ +-$O- +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$YD +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-LE"c:\programme\borland\delphi6\Projects\Bpl" +-LN"c:\programme\borland\delphi6\Projects\Bpl" diff --git a/build/Source/SimpleFC.dof b/build/Source/SimpleFC.dof new file mode 100644 index 0000000000..d094196888 --- /dev/null +++ b/build/Source/SimpleFC.dof @@ -0,0 +1,90 @@ +[FileVersion] +Version=6.0 +[Compiler] +A=8 +B=0 +C=1 +D=1 +E=0 +F=0 +G=1 +H=1 +I=1 +J=0 +K=0 +L=1 +M=0 +N=1 +O=0 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=1 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription= +[Directories] +OutputDir= +UnitOutputDir= +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath= +Packages=vcl;rtl;vclx;VclSmp;vclshlctrls;dbrtl;adortl;vcldb;qrpt;bdertl;vcldbx;dsnap;cds;bdecds;teeui;teedb;tee;teeqr;ibxpress;visualclx;visualdbclx;vclie;xmlrtl;inet;inetdbbde;inetdbxpress;inetdb;nmfast;dbexpress;dbxcds;dclOffice2k;soaprtl;Jcl;VirtualTreesD6;VirtualShellToolsD6;VirtualExplorerListviewExD6;ThemeManagerD6;JclVcl;JvCoreD6R;JvSystemD6R;JvStdCtrlsD6R;JvAppFrmD6R;JvBandsD6R;JvDBD6R;JvDlgsD6R;JvBDED6R;JvCmpD6R;JvCryptD6R;JvCtrlsD6R;JvCustomD6R;JvDockingD6R;JvDotNetCtrlsD6R;JvEDID6R;JvGlobusD6R;JvHMID6R;JvInterpreterD6R;JvJansD6R;JvManagedThreadsD6R;JvMMD6R;JvNetD6R;JvPageCompsD6R;JvPluginD6R;JvPrintPreviewD6R;JvRuntimeDesignD6R;JvTimeFrameworkD6R;JvUIBD6R;JvValidatorsD6R;JvWizardD6R;JvXPCtrlsD6R;FModPackage;NetBrowserPackage;ThreadCopyPackage;TMSMenusD6;DSPack_D6;SNTPServer +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +Launcher= +UseLauncher=0 +DebugCWD= +[Language] +ActiveLang= +ProjectLang= +RootDir= +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1031 +CodePage=1252 +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= +[HistoryLists\hlUnitAliases] +Count=1 +Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; diff --git a/build/Source/SimpleFC.dpr b/build/Source/SimpleFC.dpr new file mode 100644 index 0000000000..5899d702fb --- /dev/null +++ b/build/Source/SimpleFC.dpr @@ -0,0 +1,629 @@ +library SimpleFC; + +uses + NSIS, Windows, FirewallControl, SysUtils; + +function ResultToStr(Value: Boolean): String; +begin + if Value then + result := '0' + else + result := '1'; +end; + +function BoolToStr(Value: Boolean): String; +begin + if Value then + result := '1' + else + result := '0'; +end; + +function StrToBool(Value: String): Boolean; +begin + if Value = '1' then + result := True + else + result := False; +end; + +procedure AddPort(const hwndParent: HWND; const string_size: integer; + const variables: PChar; const stacktop: pointer); cdecl; +var + Port: Integer; + Name: String; + Protocol: NET_FW_IP_PROTOCOL; + Scope: NET_FW_SCOPE; + Enabled: Boolean; + IpVersion: NET_FW_IP_VERSION; + RemoteAddresses: String; + FirewallResult: String; +begin + Init(hwndParent, string_size, variables, stacktop); + + Port := StrToInt(PopString); + Name := PopString; + Protocol := NET_FW_IP_PROTOCOL(StrToInt(PopString)); + Scope := NET_FW_SCOPE(StrToInt(PopString)); + IpVersion := NET_FW_IP_VERSION(StrToInt(PopString)); + RemoteAddresses := PopString; + Enabled := StrToBool(PopString); + + FirewallResult := ResultToStr(FirewallControl.AddPort(Port, + Name, + Protocol, + Scope, + IpVersion, + RemoteAddresses, + Enabled) = 0); + PushString(FirewallResult); +end; + +procedure RemovePort(const hwndParent: HWND; const string_size: integer; + const variables: PChar; const stacktop: pointer); cdecl; +var + Port: Integer; + Protocol: NET_FW_IP_PROTOCOL; + FirewallResult: String; +begin + Init(hwndParent, string_size, variables, stacktop); + + Port := StrToInt(PopString); + Protocol := NET_FW_IP_PROTOCOL(StrToInt(PopString)); + + FirewallResult := ResultToStr(FirewallControl.RemovePort(Port, Protocol) = 0); + PushString(FirewallResult); +end; + +procedure AddApplication(const hwndParent: HWND; const string_size: integer; + const variables: PChar; const stacktop: pointer); cdecl; +var + Name: String; + BinaryPath: String; + IpVersion: NET_FW_IP_VERSION; + Scope: NET_FW_SCOPE; + RemoteAdresses: String; + Enabled: Boolean; + FirewallResult: String; +begin + Init(hwndParent, string_size, variables, stacktop); + + Name := PopString; + BinaryPath := PopString; + Scope := NET_FW_SCOPE(StrToInt(PopString)); + IpVersion := NET_FW_IP_VERSION(StrToInt(PopString)); + RemoteAdresses := PopString; + Enabled := StrToBool(PopString); + + FirewallResult := ResultToStr(FirewallControl.AddApplication(Name, + BinaryPath, + Scope, + IpVersion, + RemoteAdresses, + Enabled) = 0); + PushString(FirewallResult); +end; + +procedure RemoveApplication(const hwndParent: HWND; const string_size: integer; + const variables: PChar; const stacktop: pointer); cdecl; +var + BinaryPath: String; + FirewallResult: String; +begin + Init(hwndParent, string_size, variables, stacktop); + + BinaryPath := PopString; + + FirewallResult := ResultToStr(FirewallControl.RemoveApplication(BinaryPath) = 0); + PushString(FirewallResult); +end; + +procedure IsPortAdded(const hwndParent: HWND; const string_size: integer; + const variables: PChar; const stacktop: pointer); cdecl; +var + Port: Integer; + Protocol: NET_FW_IP_PROTOCOL; + Added: Boolean; + FirewallResult: String; +begin + Init(hwndParent, string_size, variables, stacktop); + + Port := StrToInt(PopString); + Protocol := NET_FW_IP_PROTOCOL(StrToInt(PopString)); + + FirewallResult := ResultToStr(FirewallControl.IsPortAdded(Port, Protocol, Added) = 0); + PushString(BoolToStr(Added)); + PushString(FirewallResult); +end; + +procedure IsApplicationAdded(const hwndParent: HWND; const string_size: integer; + const variables: PChar; const stacktop: pointer); cdecl; +var + BinaryPath: String; + Added: Boolean; + FirewallResult: String; +begin + Init(hwndParent, string_size, variables, stacktop); + + BinaryPath := PopString; + + FirewallResult := ResultToStr(FirewallControl.IsApplicationAdded(BinaryPath, Added) = 0); + PushString(BoolToStr(Added)); + PushString(FirewallResult); +end; + +procedure IsPortEnabled(const hwndParent: HWND; const string_size: integer; + const variables: PChar; const stacktop: pointer); cdecl; +var + Port: Integer; + Protocol: NET_FW_IP_PROTOCOL; + Enabled: Boolean; + FirewallResult: String; +begin + Init(hwndParent, string_size, variables, stacktop); + + Port := StrToInt(PopString); + Protocol := NET_FW_IP_PROTOCOL(StrToInt(PopString)); + + FirewallResult := ResultToStr(FirewallControl.IsPortEnabled(Port, Protocol, Enabled) = 0); + PushString(BoolToStr(Enabled)); + PushString(FirewallResult); +end; + +procedure IsApplicationEnabled(const hwndParent: HWND; const string_size: integer; + const variables: PChar; const stacktop: pointer); cdecl; +var + BinaryPath: String; + Enabled: Boolean; + FirewallResult: String; +begin + Init(hwndParent, string_size, variables, stacktop); + + BinaryPath := PopString; + + FirewallResult := ResultToStr(FirewallControl.IsApplicationEnabled(BinaryPath, Enabled) = 0); + PushString(BoolToStr(Enabled)); + PushString(FirewallResult); +end; + +procedure EnableDisablePort(const hwndParent: HWND; const string_size: integer; + const variables: PChar; const stacktop: pointer); cdecl; +var + Port: Integer; + Protocol: NET_FW_IP_PROTOCOL; + Enabled: Boolean; + FirewallResult: String; +begin + Init(hwndParent, string_size, variables, stacktop); + + Port := StrToInt(PopString); + Protocol := NET_FW_IP_PROTOCOL(StrToInt(PopString)); + Enabled := StrToBool(PopString); + + FirewallResult := ResultToStr(FirewallControl.EnableDisablePort(Port, Protocol, Enabled) = 0); + PushString(FirewallResult); +end; + +procedure EnableDisableApplication(const hwndParent: HWND; const string_size: integer; + const variables: PChar; const stacktop: pointer); cdecl; +var + BinaryPath: String; + Enabled: Boolean; + FirewallResult: String; +begin + Init(hwndParent, string_size, variables, stacktop); + + BinaryPath := PopString; + Enabled := StrToBool(PopString); + + FirewallResult := ResultToStr(FirewallControl.EnableDisableApplication(BinaryPath, Enabled) = 0); + PushString(FirewallResult); +end; + +procedure IsFirewallEnabled(const hwndParent: HWND; const string_size: integer; + const variables: PChar; const stacktop: pointer); cdecl; +var + Enabled: Boolean; + FirewallResult: String; +begin + Init(hwndParent, string_size, variables, stacktop); + + FirewallResult := ResultToStr(FirewallControl.IsFirewallEnabled(Enabled) = 0); + PushString(BoolToStr(Enabled)); + PushString(FirewallResult); +end; + +procedure EnableDisableFirewall(const hwndParent: HWND; const string_size: integer; + const variables: PChar; const stacktop: pointer); cdecl; +var + Enabled: Boolean; + FirewallResult: String; +begin + Init(hwndParent, string_size, variables, stacktop); + + Enabled := StrToBool(PopString); + + FirewallResult := ResultToStr(FirewallControl.EnableDisableFirewall(Enabled) = 0); + PushString(FirewallResult); +end; + +procedure AllowDisallowExceptionsNotAllowed(const hwndParent: HWND; const string_size: integer; + const variables: PChar; const stacktop: pointer); cdecl; +var + NotAllowed: Boolean; + FirewallResult: String; +begin + Init(hwndParent, string_size, variables, stacktop); + + NotAllowed := StrToBool(PopString); + + FirewallResult := ResultToStr(FirewallControl.AllowDisallowExceptionsNotAllowed(NotAllowed) = 0); + PushString(FirewallResult); +end; + +procedure AreExceptionsNotAllowed(const hwndParent: HWND; const string_size: integer; + const variables: PChar; const stacktop: pointer); cdecl; +var + NotAllowed: Boolean; + FirewallResult: String; +begin + Init(hwndParent, string_size, variables, stacktop); + + FirewallResult := ResultToStr(FirewallControl.AreExceptionsNotAllowed(NotAllowed) = 0); + PushString(BoolToStr(NotAllowed)); + PushString(FirewallResult); +end; + +procedure EnableDisableNotifications(const hwndParent: HWND; const string_size: integer; + const variables: PChar; const stacktop: pointer); cdecl; +var + Enabled: Boolean; + FirewallResult: String; +begin + Init(hwndParent, string_size, variables, stacktop); + + Enabled := StrToBool(PopString); + + FirewallResult := ResultToStr(FirewallControl.EnableDisableNotifications(Enabled) = 0); + PushString(BoolToStr(Enabled)); + PushString(FirewallResult); +end; + +procedure AreNotificationsEnabled(const hwndParent: HWND; const string_size: integer; + const variables: PChar; const stacktop: pointer); cdecl; +var + Enabled: Boolean; + FirewallResult: String; +begin + Init(hwndParent, string_size, variables, stacktop); + + FirewallResult := ResultToStr(FirewallControl.AreNotificationsEnabled(Enabled) = 0); + PushString(BoolToStr(Enabled)); + PushString(FirewallResult); +end; + +procedure StartStopFirewallService(const hwndParent: HWND; const string_size: integer; + const variables: PChar; const stacktop: pointer); cdecl; +var + Enabled: Boolean; + FirewallResult: String; +begin + Init(hwndParent, string_size, variables, stacktop); + + Enabled := StrToBool(PopString); + + FirewallResult := ResultToStr(FirewallControl.StartStopFirewallService(Enabled)); + PushString(FirewallResult); +end; + +procedure IsFirewallServiceRunning(const hwndParent: HWND; const string_size: integer; + const variables: PChar; const stacktop: pointer); cdecl; +var + IsRunning: Boolean; + FirewallResult: String; +begin + Init(hwndParent, string_size, variables, stacktop); + + FirewallResult := ResultToStr(FirewallControl.IsFirewallServiceRunning(IsRunning)); + PushString(BoolToStr(IsRunning)); + PushString(FirewallResult); +end; + +procedure RestoreDefaults(const hwndParent: HWND; const string_size: integer; + const variables: PChar; const stacktop: pointer); cdecl; +var + FirewallResult: String; +begin + Init(hwndParent, string_size, variables, stacktop); + + FirewallResult := ResultToStr(FirewallControl.RestoreDefaults = 0); + PushString(FirewallResult); +end; + +procedure AllowDisallowIcmpOutboundDestinationUnreachable(const hwndParent: HWND; const string_size: integer; + const variables: PChar; const stacktop: pointer); cdecl; +var + Allow: Boolean; + FirewallResult: String; +begin + Init(hwndParent, string_size, variables, stacktop); + + Allow := StrToBool(PopString); + + FirewallResult := ResultToStr(FirewallControl.AllowDisallowIcmpOutboundDestinationUnreachable(Allow) = 0); + PushString(FirewallResult); +end; + +procedure AllowDisallowIcmpRedirect(const hwndParent: HWND; const string_size: integer; + const variables: PChar; const stacktop: pointer); cdecl; +var + Allow: Boolean; + FirewallResult: String; +begin + Init(hwndParent, string_size, variables, stacktop); + + Allow := StrToBool(PopString); + + FirewallResult := ResultToStr(FirewallControl.AllowDisallowIcmpRedirect(Allow) = 0); + PushString(FirewallResult); +end; + +procedure AllowDisallowIcmpInboundEchoRequest(const hwndParent: HWND; const string_size: integer; + const variables: PChar; const stacktop: pointer); cdecl; +var + Allow: Boolean; + FirewallResult: String; +begin + Init(hwndParent, string_size, variables, stacktop); + + Allow := StrToBool(PopString); + + FirewallResult := ResultToStr(FirewallControl.AllowDisallowIcmpInboundEchoRequest(Allow) = 0); + PushString(FirewallResult); +end; + +procedure AllowDisallowIcmpOutboundTimeExceeded(const hwndParent: HWND; const string_size: integer; + const variables: PChar; const stacktop: pointer); cdecl; +var + Allow: Boolean; + FirewallResult: String; +begin + Init(hwndParent, string_size, variables, stacktop); + + Allow := StrToBool(PopString); + + FirewallResult := ResultToStr(FirewallControl.AllowDisallowIcmpOutboundTimeExceeded(Allow) = 0); + PushString(FirewallResult); +end; + +procedure AllowDisallowIcmpOutboundParameterProblem(const hwndParent: HWND; const string_size: integer; + const variables: PChar; const stacktop: pointer); cdecl; +var + Allow: Boolean; + FirewallResult: String; +begin + Init(hwndParent, string_size, variables, stacktop); + + Allow := StrToBool(PopString); + + FirewallResult := ResultToStr(FirewallControl.AllowDisallowIcmpOutboundParameterProblem(Allow) = 0); + PushString(FirewallResult); +end; + +procedure AllowDisallowIcmpOutboundSourceQuench(const hwndParent: HWND; const string_size: integer; + const variables: PChar; const stacktop: pointer); cdecl; +var + Allow: Boolean; + FirewallResult: String; +begin + Init(hwndParent, string_size, variables, stacktop); + + Allow := StrToBool(PopString); + + FirewallResult := ResultToStr(FirewallControl.AllowDisallowIcmpOutboundSourceQuench(Allow) = 0); + PushString(FirewallResult); +end; + +procedure AllowDisallowIcmpInboundRouterRequest(const hwndParent: HWND; const string_size: integer; + const variables: PChar; const stacktop: pointer); cdecl; +var + Allow: Boolean; + FirewallResult: String; +begin + Init(hwndParent, string_size, variables, stacktop); + + Allow := StrToBool(PopString); + + FirewallResult := ResultToStr(FirewallControl.AllowDisallowIcmpInboundRouterRequest(Allow) = 0); + PushString(FirewallResult); +end; + +procedure AllowDisallowIcmpInboundTimestampRequest(const hwndParent: HWND; const string_size: integer; + const variables: PChar; const stacktop: pointer); cdecl; +var + Allow: Boolean; + FirewallResult: String; +begin + Init(hwndParent, string_size, variables, stacktop); + + Allow := StrToBool(PopString); + + FirewallResult := ResultToStr(FirewallControl.AllowDisallowIcmpInboundTimestampRequest(Allow) = 0); + PushString(FirewallResult); +end; + +procedure AllowDisallowIcmpInboundMaskRequest(const hwndParent: HWND; const string_size: integer; + const variables: PChar; const stacktop: pointer); cdecl; +var + Allow: Boolean; + FirewallResult: String; +begin + Init(hwndParent, string_size, variables, stacktop); + + Allow := StrToBool(PopString); + + FirewallResult := ResultToStr(FirewallControl.AllowDisallowIcmpInboundMaskRequest(Allow) = 0); + PushString(FirewallResult); +end; + +procedure AllowDisallowIcmpOutboundPacketTooBig(const hwndParent: HWND; const string_size: integer; + const variables: PChar; const stacktop: pointer); cdecl; +var + Allow: Boolean; + FirewallResult: String; +begin + Init(hwndParent, string_size, variables, stacktop); + + Allow := StrToBool(PopString); + + FirewallResult := ResultToStr(FirewallControl.AllowDisallowIcmpOutboundPacketTooBig(Allow) = 0); + PushString(FirewallResult); +end; + +procedure IsIcmpTypeAllowed(const hwndParent: HWND; const string_size: integer; + const variables: PChar; const stacktop: pointer); cdecl; +var + IpVersion: NET_FW_IP_VERSION; + LocalAddress: String; + IcmpType: NET_FW_ICMP_TYPE; + Allowed: Boolean; + Restricted: Boolean; + FirewallResult: String; +begin + Init(hwndParent, string_size, variables, stacktop); + + IpVersion := NET_FW_IP_VERSION(StrToInt(PopString)); + LocalAddress := PopString; + IcmpType := NET_FW_ICMP_TYPE(StrToInt(PopString)); + + FirewallResult := ResultToStr(FirewallControl.IsIcmpTypeAllowed(IpVersion, + LocalAddress, + IcmpType, + Allowed, + Restricted) = 0); + PushString(BoolToStr(Allowed)); + PushString(BoolToStr(Restricted)); + PushString(FirewallResult); +end; + +procedure AdvAddRule(const hwndParent: HWND; const string_size: integer; + const variables: PChar; const stacktop: pointer); cdecl; +var + Name: String; + Description: String; + Protocol: NET_FW_IP_PROTOCOL; + IcmpTypesAndCodes: String; + ApplicationName: String; + ServiceName: String; + Direction: NET_FW_RULE_DIRECTION; + Enabled: Boolean; + Group: String; + Profile: NET_FW_PROFILE_TYPE2; + Action: NET_FW_ACTION; + LocalPorts: String; + RemotePorts: String; + LocalAddress: String; + RemoteAddress: String; + FirewallResult: String; +begin + Init(hwndParent, string_size, variables, stacktop); + + Name := PopString; + Description := PopString; + Protocol := NET_FW_IP_PROTOCOL(StrToInt(PopString)); + Direction := NET_FW_RULE_DIRECTION(StrToInt(PopString)); + Enabled := StrToBool(PopString); + Profile := NET_FW_PROFILE_TYPE2(StrToInt(PopString)); + Action := NET_FW_ACTION(StrToInt(PopString)); + ApplicationName := PopString; + ServiceName := PopString; + IcmpTypesAndCodes := PopString; + Group := PopString; + LocalPorts := PopString; + RemotePorts := PopString; + LocalAddress := PopString; + RemoteAddress := PopString; + + FirewallResult := ResultToStr(FirewallControl.AdvAddRule(Name, + Description, + Protocol, + Direction, + Enabled, + Profile, + Action, + ApplicationName, + ServiceName, + IcmpTypesAndCodes, + Group, + LocalPorts, + RemotePorts, + LocalAddress, + RemoteAddress) = 0); + PushString(FirewallResult); +end; + +procedure AdvRemoveRule(const hwndParent: HWND; const string_size: integer; + const variables: PChar; const stacktop: pointer); cdecl; +var + Name: String; + FirewallResult: String; +begin + Init(hwndParent, string_size, variables, stacktop); + + Name := PopString; + + FirewallResult := ResultToStr(FirewallControl.AdvRemoveRule(Name) = 0); + PushString(FirewallResult); +end; + +procedure AdvExistsRule(const hwndParent: HWND; const string_size: integer; + const variables: PChar; const stacktop: pointer); cdecl; +var + Name: String; + Exists: Boolean; + FirewallResult: String; +begin + Init(hwndParent, string_size, variables, stacktop); + + Name := PopString; + + FirewallResult := ResultToStr(FirewallControl.AdvExistsRule(Name, Exists) = 0); + PushString(BoolToStr(Exists)); + PushString(FirewallResult); +end; + +exports AddPort; +exports RemovePort; +exports AddApplication; +exports RemoveApplication; +exports IsPortAdded; +exports IsApplicationAdded; +exports IsPortEnabled; +exports IsApplicationEnabled; +exports EnableDisablePort; +exports EnableDisableApplication; +exports IsFirewallEnabled; +exports EnableDisableFirewall; +exports AllowDisallowExceptionsNotAllowed; +exports AreExceptionsNotAllowed; +exports EnableDisableNotifications; +exports AreNotificationsEnabled; +exports StartStopFirewallService; +exports IsFirewallServiceRunning; +exports RestoreDefaults; +exports AllowDisallowIcmpOutboundDestinationUnreachable; +exports AllowDisallowIcmpRedirect; +exports AllowDisallowIcmpInboundEchoRequest; +exports AllowDisallowIcmpOutboundTimeExceeded; +exports AllowDisallowIcmpOutboundParameterProblem; +exports AllowDisallowIcmpOutboundSourceQuench; +exports AllowDisallowIcmpInboundRouterRequest; +exports AllowDisallowIcmpInboundTimestampRequest; +exports AllowDisallowIcmpInboundMaskRequest; +exports AllowDisallowIcmpOutboundPacketTooBig; +exports IsIcmpTypeAllowed; +exports AdvAddRule; +exports AdvRemoveRule; +exports AdvExistsRule; + +end.