http://blog.naver.com/hks9999/30091610378
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules
{3DE1907F-A61D-4593-8E05-24279AC12855}
v2.0|Action=Allow|Active=TRUE|Dir=In|Protocol=17|Profile=Public|App=C:\Users\hks9999\Desktop\easyviewer0416\easyviewer\Release\easyviewer.exe|Name=easyviewer.exe|Edge=FALSE|
//SHRegWriteString(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\SharedAccess\\Parameters\\FirewallPolicy\\StandardProfile\\AuthorizedApplications\\List",str,buf);
/*
sprintf(buffer,"{2168BD8F-5E16-4357-A72E-00DA93174A5C}");
sprintf(buf,"v2.10|Action=Allow|Active=TRUE|Dir=In|App=%s|Name=CLRT|Desc=CLRT|",str);
SHRegWriteString(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\SharedAccess\\Parameters\\FirewallPolicy\\FirewallRules",buffer,buf);
*/
//sprintf(buffer,"{AB70F024-3B51-474A-9C48-8EF495955097}",str);
//sprintf(buf,"v2.10|Action=Allow|Active=TRUE|Dir=In|Protocol=17|Profile=Public|Profile=Domain|Profile=Private|App=%s|Name=CLRT|Desc=CLRT|Defer=User|",str);
//SHRegWriteString(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\SharedAccess\\Parameters\\FirewallPolicy\\FirewallRules",buffer,buf);
//SHRegWriteString(HKEY_LOCAL_MACHINE,"SYSTEM\\ControlSet001\\Services\\SharedAccess\\Parameters\\FirewallPolicy\\FirewallRules",buffer,buf);
//sprintf(buf,"%s:*:Enabled:COLLECT_SAMPLE",str);
//SHRegWriteString(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\SharedAccess\\Parameters\\FirewallPolicy\\PublicProfile\\AuthorizedApplications\\List",str,buf);
몇시간동안 삽질도 많이 했다..-_-;
가할려고 이것저것 해봤지만
윈도우 XP서비스팩 2에서는 아래의 레지값의 추가만으로도 잘 동작한다. (서팩 3로 가능할듯)
sprintf(buf,"%s:*:Enabled:CLEAN_SET",str);
SHRegWriteString(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\SharedAccess\\Parameters\\FirewallPolicy\\StandardProfile\\AuthorizedApplications\\List",str,buf);
하지만...-_-
비스타, 윈도우 7에서는 강화가 된 것 같다.
FIREWALL API를 이용하는 수밖에 없을 것 같다...; 뭔가 시스템이 있는듯...
HANDLE hProcess;
STARTUPINFO sInfo;
memset(&sInfo,0x00,sizeof(STARTUPINFO));
PROCESS_INFORMATION pInfo;
memset(&pInfo,0x00,sizeof(PROCESS_INFORMATION));
sprintf(command,"netsh firewall add allowedprogram \"%s\" SAMPLE ENABLE",argv[0]);
ret=CreateProcess(NULL,command,NULL,NULL,NULL,CREATE_NO_WINDOW,NULL,NULL,&sInfo,&pInfo);
if(ret)
{
hProcess=pInfo.hProcess;
WaitForSingleObject(hProcess,0xffffffff);
CloseHandle(hProcess);
}
다음과 같이 netsh를 실행시키고 백그라운드에서 종료될 때까지 대기한다음 하는게 구현하기 편할 듯 하다...
설정한 방화벽 값을 삭제 시킬때는 netsh firewall delete \"%s\" 과 같이 하면 된다
[출처] 방화벽 규칙 등록에 관한 글|작성자 로즈마리