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

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

#pragma argsused

int ShareLoaded(void);

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;
}