Файл wast\wast.cpp
// ====================================================== // Приложение 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; }
Первое, что делает функция WinMain - открывает загружаемый драйвер, вызывая для этого функцию OpenDriver.
Затем приложение получает идентификатор текущей задачи (т. е. свой идентификатор задачи), и регистрирует его в загружаемом драйвере, посылая тому сообщение UDRV_REGISTERTASK.
Далее запускается цикл обработки сообщений.
При обработке сообщения WM_STARTWINAPP выполняется запуск приложения Windows. Для быстрого переключения системной виртуальной машины из фонового режима в основной мы создаем окно с нулевыми размерами, а затем сразу же отображаем и удаляем его.
После этого запускаем приложение функцией LoadModule.
Вы можете также попробовать использовать для запуска функцию WinExec, для чего следует переставить соответствующим образом символы комментария.
При поступлении в очередь сообщения WM_UNLOADWAST работа приложения wast.exe завершается. Напомним, что это сообщение посылается приложению при удалении загружаемого драйвера.
Перед завершением своей работы приложение wast.exe отменяет регистрацию и закрывает загружаемый драйвер.
Все пользовательские сообщения определены в файле wast.hpp (листинг5.19).