Операционная система Microsoft Windows 3.1 для программиста -том 3

       

Файл isshare/isshare.cpp


// ===================================================== // Приложение определяет, загружена ли утилита MS-DOS // share.exe, и выводит соответствующее сообщение // =====================================================

#define STRICT #include <windows.h>
#include <windowsx.h>
#include <dos.h>

int ShareLoaded(void);

#pragma argsused int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { int rc;

// Проверяем, загружена ли share.exe rc = ShareLoaded();

if (!rc) { // Если код возврата равен -1, функция не смогла // создать на диске временный файл, необходимый // для выполнения проверки if(rc == -1) { MessageBox(NULL, "File creation error", "", MB_OK);
}

// Если код возврата равен 0, share.exe не загружена else { MessageBox(NULL, "Share NOT loaded", "", MB_OK);
} }

// Если код возврата равен 1, share.exe загружена else { MessageBox(NULL, "Share loaded", "SHARE Test", MB_OK);
}

return 0; }

// ------------------------------------------------------- // Функция ShareLoaded // Проверяет, загружена ли утилита share.exe // -------------------------------------------------------

int ShareLoaded(void) { HFILE hfTempFile; OFSTRUCT ofs; char szBuf[144]; union REGS regs; int rc;

// Создаем временный файл на диске GetTempFileName(0, "tst", 0, szBuf);
hfTempFile = _lcreat(szBuf, 0);

// Если файл создать не удалось, возвращаем -1 if (hfTempFile == HFILE_ERROR) { return(-1);
}



// Пытаемся заблокировать первый байт созданного файла

regs.x.bx = hfTempFile; // идентификатор файла regs.h.ah = 0x5c; // код функции MS-DOS regs.h.al = 0; // код операции блокирования regs.x.cx = 0; // CX:DX - смещение в файле regs.x.dx = 0; regs.x.si = 0; // SI:DI - длина блокируемой области regs.x.di = 1;

// Вызываем функцию MS-DOS intdos(&regs, &regs);

// Если установлен флаг переноса, выполнение блокирования // невозможно. Считаем, что в этом случае // утилита share.exe не загружена if(regs.x.cflag == 1) { rc = 0; }




// Если блокирование прошло успешно, // разблокируем и удаляем временный файл else { regs.x.bx = hfTempFile; regs.h.ah = 0x5c; regs.h.al = 1; // код операции разблокирования regs.x.cx = 0; regs.x.dx = 0; regs.x.si = 0; regs.x.di = 1; intdos(&regs, &regs);
rc = 1; }

// Закрываем временный файл _lclose(hfTempFile);

// Удаляем временный файл OpenFile(szBuf, &ofs, OF_DELETE);

return rc; }

Функция WinMain проверяет, загружена ли утилита share.exe, вызывая функцию ShareLoaded, определенную в приложении.

Эта функция может вернуть 0, 1 или -1. Если функция вернула 0, share.exe не загружена. Если функция вернула -1, произошла ошибка при создании временного файла. И, наконец, если функция ShareLoaded вернула 1, share.exe загружена.

Для создания временного файла используется функции GetTempFileName и _lcreat. Первая из этих двух функций получает имя временного файла, вторая - создает и открывает временный файл.

Для выполнения блокировки приложение вызывает функцию MS-DOS, пользуясь известной вам функцией intdos.

Если утилита share.exe установлена и блокировка файла выполнена успешно, функция ShareLoaded разблокирует файл, вызывая функцию MS-DOS с кодом 0x5c еще раз, но с другим значением регистра AL.

В любом случае перед возвратом из функции временный файл закрывается функцией _lclose и затем удаляется функцией OpenFile.

Файл определения модуля для приложения ISSHARE приведен в листинге 4.2.


Содержание раздела