// remember to do -lpsapi

#include <windows.h>
#include <stdio.h>
#include <psapi.h>

char *killname = NULL;

void kill_process(DWORD pid) {
  char szProcessName[MAX_PATH] = "unknown";
  
  // Get a handle to the process.
  HANDLE p_handle = OpenProcess(PROCESS_TERMINATE         | 
				PROCESS_QUERY_INFORMATION |
				PROCESS_VM_READ,
				FALSE, pid);
  // Get the process name.
  if(p_handle != NULL) {
    HMODULE hMod;
    DWORD cbNeeded;
    
    if(EnumProcessModules(p_handle, &hMod, sizeof(hMod), &cbNeeded)) 
      GetModuleBaseName(p_handle, hMod, szProcessName, sizeof(szProcessName));
    else
      return;
  }
  else return;
  
  if(!strncasecmp(szProcessName, killname, MAX_PATH))
    TerminateProcess(p_handle, 1);
  
  CloseHandle(p_handle);
}

int main(int argc, char **argv) {
  DWORD pids[1024], cbNeeded, pid_count;
  unsigned int i;
  
  // check that we have the required params
  if(argc != 2) {
    MessageBox (NULL, "Usage:\nnamekill <name>\n\n"
		"kills all processes identified by <name>", "Error", MB_OK);
    exit(1);
  } else {
    killname = argv[1];
  }
  
  // Get the list of pids
  if(!EnumProcesses(pids, sizeof(pids), &cbNeeded))
    return 1;
  
  // Calculate how many pids were returned.
  pid_count = cbNeeded / sizeof(DWORD);
  
  for (i = 0; i < pid_count; ++i)
    kill_process(pids[i]);
  
  return 0;
}
