// ======================================================
// Приложение WAST
// ------------------------------------------------------
// Запуск приложений Windows из
// коммандной строки MS-DOS
//
// Используется совместно с загружаемым драйвером
// wastdrv.dll и VxD-драйвером VXDSRV.386 версии 1.1.
// Запускается автоматически при загрузке Windows.
// Автоматический запуск можно отменить, изменив
// конфигурацию драйвера WASTDRVR при помощи приложения
// Control Panel
// ------------------------------------------------------
// Copyright (C) 1995 Александр Фролов, Сергей Ноженко
// ======================================================
#define STRICT
#include <windows.h>
#include <dir.h>

#include "wast.hpp"

BOOL InitApp(HINSTANCE);

static char szDriverName[] = "wastdrv.dll";

struct LOADPARMS
{
  WORD   segEnv;      // среда
  LPSTR  lpszCmdLine; // коммандная строка
  LPWORD lpwShow;     // режим отображения
  LPWORD lpwReserved; // зарезервировано
};
struct LOADPARMS parms;

WORD  awShow[2] = { 2, SW_SHOW };
LPSTR lpszCmd, lpszParm;
char  szCurPath[128];
char  szBuf[256];
// char  szTempBuf[256];

// ======================================================
// Функция WinMain
// ======================================================
#pragma argsused
int PASCAL
WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  LPSTR lpszCmdLine, int nCmdShow)
{
  if(hPrevInstance) // только одна копия приложения
    return FALSE;

  // Открываем драйвер
  HDRVR hDriver = OpenDriver(szDriverName, NULL, NULL);

  HTASK hTask;

  if(hDriver)
  {
    // Получаем идентификатор текущей задачи 
    hTask = GetCurrentTask();

    // Регистрируем в драйвере текущую задачу
    BOOL rc = (BOOL)SendDriverMessage(
          hDriver, UDRV_REGISTERTASK, (LPARAM)hTask, NULL);

    // Если не удалось зарегистрировать задачу,
    // виртуальный драйвер vxdsrv.386 не загружен
    if(!rc)
    {
      MessageBox(NULL, "Error Loading WAST\n"
       "Driver vxdsrv.386 not found",
       "Windows Application Starter", MB_OK | MB_ICONHAND);
      return FALSE;
    }
  }

  // Если не удалось открыть загружаемый драйвер,
  // выводим сообщение об ошибке
  else
  {
    MessageBox(NULL, "Error Loading WAST\n"
     "Driver wastdrv.dll not found",
     "Windows Application Starter", MB_OK | MB_ICONHAND);
    return FALSE;
  }

  MSG  msg;

  while(GetMessage(&msg, NULL, 0, 0))
  {
    // Это сообщение посылается загружаемым драйвером wastdrv.dll,
    // когда VxD-драйвер фиксирует запуск программы любой
    // виртуальной машиной MS-DOS
    if (msg.message == WM_STARTWINAPP)
    {
      // Создаем и активируем временное невидимое окно, тем самым 
      // переключая системную виртуальную машину из фонового
      // режима в основной режим
      HWND hDummyWnd = CreateWindow("static", "", WS_POPUP,
            0, 0, 0, 0, HWND_DESKTOP, NULL, hInstance, NULL);

      ShowWindow(hDummyWnd, SW_SHOW);
      DestroyWindow(hDummyWnd);

      // Адрес командной строки
      lpszCmd  = (LPSTR)msg.lParam + 65;

      // Адрес строки параметров
      lpszParm  = (LPSTR)msg.lParam + 65 + 128;

      // Устанавливаем текущий каталог
      setdisk(*LPSTR(msg.lParam));
      szBuf[0] = *LPSTR(msg.lParam) + 'A';
      szBuf[1] = ':';
      szBuf[2] = '\\';
      lstrcpy(szBuf + 3, LPSTR(msg.lParam) + 1);
      chdir(szBuf);

      // Готовим параметры для LoadModule
      lstrcpy(szBuf, (LPCSTR)" ");
      lstrcat(szBuf, (LPCSTR)lpszParm);
      *szBuf = (BYTE)lstrlen(lpszParm);

      if(lstrlen(lpszParm) != 0)
        parms.lpszCmdLine = (LPSTR)szBuf;
      else
        parms.lpszCmdLine = (LPSTR)"";

      parms.segEnv = 0;
      parms.lpwShow = (LPWORD) awShow;
      parms.lpwReserved = (LPWORD) NULL;

      // Копируем командную строку и параметры
//      lstrcpy(szTempBuf, (LPSTR)msg.lParam + 65);
//      lstrcat(szTempBuf, (LPSTR)msg.lParam + 65 + 128);

      // Запускаем приложение Windows
      LoadModule(lpszCmd, &parms);

//      WinExec(szTempBuf, SW_SHOW);
    }

    // Это сообщение поступает от загружаемого драйвера
    // при его удалении, выполняемом из приложения
    // Control Panel
    else if (msg.message == WM_UNLOADWAST)
      PostQuitMessage(0);
    else
      DispatchMessage(&msg);
  }

  // Отменяем регистрацию текущей задачи
  SendDriverMessage(hDriver, UDRV_UNREGISTERTASK,
     (LPARAM)hTask, NULL);

  // Закрываем драйвер
  CloseDriver(hDriver, NULL, NULL);

  return msg.wParam;
}
