#include <windows.h>

#include <stdio.h>
#include <string.h>

char *fileList[] = {
  // hacky thing to make the strchr work for 'root' files
  "\\NAL.EXE",
  "\\NALDESK.EXE",
  "\\NALEXP32.DLL",
  "\\NALEXPEX.DLL",
  "\\NALEXPLD.EXE",
  "\\NALSTART.EXE",
  "\\NALWIN32.EXE",
  "\\NLS32.DLL",
  "\\NLSAPI32.DLL",
  "\\ZENPOL32.DLL",
  "\\ZENVER.EXE",
  "\\ZENVER.TXT",

  "NALLIB\\DBLGEN6.DLL",
  "NALLIB\\DBODBC6.DLL",
  "NALLIB\\DBPORT6.DLL",
  "NALLIB\\NALNRD32.DLL",
  "NALLIB\\NALNRD95.DLL",
  "NALLIB\\ZENAPPWS.DLL",
  "NALLIB\\ZWSNMP32.DLL",

  "\\NLS\\ENGLISH\\NALBMP32.DLL",
  "\\NLS\\ENGLISH\\NALEXP32.CHM",
  "\\NLS\\ENGLISH\\NALEXP32.CNT",
  "\\NLS\\ENGLISH\\NALEXPRS.DLL",
  "\\NLS\\ENGLISH\\NALRES32.DLL",
  "\\NLS\\ENGLISH\\ZENAPPRS.DLL",

  "WINNT\\NALNTSRV.EXE",
  "WINNT\\NALSRVLD.EXE",
  "WINNT\\ZENAPP32.DLL",
  "WINNT\\NLS\\ENGLISH\\NALNTRES.DLL",

  "-END-"
};

int curNum;

void moveFile(char *from, char *to) {
  char fileName[64];

  sprintf(fileName, "C:\\TEMP\\NALUP%d.tmp", curNum);
  curNum++;

  // Copy file locally
  CopyFile(from, fileName, TRUE);

  // Set up replacement

  // Won't get overwritten if they're read-only or anything
  SetFileAttributes(fileName, FILE_ATTRIBUTE_NORMAL);
  SetFileAttributes(to, FILE_ATTRIBUTE_NORMAL);

  // If deleting the old file (on reboot) fails, skip it
  if(!MoveFileEx(to, NULL, MOVEFILE_DELAY_UNTIL_REBOOT))
    return;

  MoveFileEx(fileName, to, MOVEFILE_DELAY_UNTIL_REBOOT);
}

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
  char fromFile[64], toFile[64];
  int i;
  char *winDir, *zenVer;

  // Do nothing if you're a ZEN4-er
  zenVer = getenv("ZEN");
  if(zenVer == NULL || zenVer[0] == '4') {
    if(stricmp(lpCmdLine, "Silent"))
      MessageBox(NULL, "Using Zen 4 - not updated", "NAL Update", MB_OK);

    return 0;
  }

  winDir = getenv("windir");

  // Just in case...
  CreateDirectory("C:\\TEMP", NULL);

  // This file shouldn't be here anyway, but if so, kill it
  sprintf(fromFile, "%s\\SYSTEM32\\NALEXPRS.DLL", winDir);
  MoveFileEx(fromFile, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);

  i = 0; curNum = 1;
  do {
    sprintf(fromFile, "Y:\\%s", fileList[i]);
    sprintf(toFile, "%s\\SYSTEM32\\%s", winDir, strchr(fileList[i],'\\') + 1);

    moveFile(fromFile, toFile);
    i++;
  } while(strcmp(fileList[i], "-END-"));

  /* Give message unless 'Silent' passed */
  if(stricmp(lpCmdLine, "Silent"))
    MessageBox(NULL, "Update complete - reboot now", "NAL Update", MB_OK);

  return 0;
}

