Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 10 декабря!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Программисты долго мучаются с кодом прогаммы, изучают С++, WinAPI функции, MSDN. Потом пишут банальную систему защиты или навешивают банальный протектор, а крэкеры и реверсеры справляются с такой защитой за 5 минут. В итоге, продажи программы почти нулевые. Чтобы такого не допустить, тут самому надо немного поднабрать опыта отладки, реверсинга, тот же отладчик Ollydbg изучить или дизассемблер IDA Pro. Но где искать по крохам эти знания? Нет, конечно можно годами "методом тыка" разбираться, но куда быстрее видеокурс специальный посмотреть. Вот тут он есть: ссылка. Автор курса с большим опытом и объясняет понятно, я из этого курса много узнал про то как работает компьютер, процессор, про инструменты специальные и как с ними работать. Мои коллеги программисты на работе ничего такого и не знают, теперь я им нос утру.

Функция Устанавливает подпрограмму обработки ошибок

 
                    электронного оборудования.
 
 
 
 Синтаксис          #include<dos.h>
 
                    void harderr(*handler)());
 
 
 
 Файл, содержащий   dos.h
 
 прототип
 
 
 
 Описание           Функция harderr      устанавливает     подпрограмму
 
                    обработки  сбоев  электронного   оборудования   для
 
                    текущей программы. Данная подпрограмма вызывается к
 
                    работе,  как только возникнет прерывание 0x24. (см.
 
                    документ  "Справочное  руководство программиста для
 
                    DOS").
 
 
 
                    При появлении  данного прерывыания происходит вызов
 
                    функции handler.  Функция должна  быть  вызвана  со
 
                    следующими аргументами:
 
 
 
                    handler(int errval, int ax, int bp, int si);
 
 
 
                    Переменная errval - код ошибки, устанавливаемый DOS
 
                    в регистре DI.  ax,  bp и si  -  значения,  которые
 
                    MS-DOS помещает соответственно в регистры AX,BP,SI.
 
 
 
                    - Параметр ax обозначает, произошла ли ошибка диска
 
                      или какого-либо другого устройства.  Если  ax  не
 
                      отрицательно,   произошла   дисковая   ошибка,  в
 
                      противном случае,  это ошибка другого устройства.
 
                      Для   дисковой   ошибки  значение  ax,  сложенное
 
                      логически (операцией AND) с  0x00FF,  даст  номер
 
                      дисковода,  в котором произошел сбой (1=A; 2=B; и
 
                      т.д.).
 
 
 
                    - bp и si вместе указывают  на  заголовок  драйвера
 
                      устройства, в котором произошел сбой. bp содержит
 
                      адрес сегмента, а si смещение.
 
 
 
                    Названная выше      функция      не      вызывается
 
                    непосредственно.   Функция   harderr  устанавливает
 
                    подпрограмму  обработки  прерываний  DOS,   которая
 
                    вызывает   функцию.  Для  получения  информации  из
 
                    заголовка драйвера можно использовать функции  peek
 
                    и peekb.
 
 
 
                    Программа -     обработчик     прерываний     может
 
                    использовать системные вызовы DOS от 1 до 0xC,  все
 
                    остальные вызовы портят DOS.  В частности, не могут
 
                    быть использованы ни любые стандартные подпрограммы
 
                    ввода/вывода C,  ни любые подпрограммы ввода/вывода
 
                    эмуляции UNIX.
 
 
 
                    Программа обработки прерывания должна возвращать 0,
 
                    если необходимо игнорировать ошибку,  1, если нужно
 
                    повторить операцию и 2 для завершения программы.
 
 
 
 Возвращаемое       Нет.
 
 значение
 
 
 
 Переносимость      Функция уникальна для DOS.  Функция не совместима с
 
                    Windows.
 
 
 
 Смотрите также     hardresume, hardretn, peek, poke.
 
 
 
 Пример:
 
 
 
 /* эта программа отслеживает ошибки дисковых операций ввода/вывода и
 
    запрашивает у пользователя дальнейшие инструкции. Попробуйте
 
    запустить ее, вынув дискету из дисковода а: */
 
 
 
 #include <stdio.h>
 
 #include <conio.h>
 
 #include <dos.h>
 
 
 
 #define IGNORE 0
 
 #define RETRY  1
 
 #define ABORT  2
 
 
 
 /* определим сообщения об ошибке для дисковода */
 
 static char *err_msg[] = {"диск защищен от записи",
 
                           "неизвестное устройство",
 
                           "дисковод не готов",
 
                           "неизвестная команда",
 
                           "ошибка данных (CRC)",
 
                           "ошибка поиска",
 
                           "неизвестный тип носителя",
 
                           "ненайден сектор",
 
                           "в принтере нет бумаги",
 
                           "сбой при записи",
 
                           "ошибка при чтении",
 
                           "неустранимая ошибка",
 
                           "зарезервирован",
 
                           "зарезервирован",
 
                           "неверная смена диска"
 
                           };
 
 
 
 error_win(char *msg)
 
 {
 
    int retval;
 
    cputs(msg);
 
 
 
    /* запрос у пользователя дальнейших действий */
 
    while(1)
 
    {
 
       retval = getch();
 
       if(retval == 'a' || retval == 'A')
 
       {
 
          retval = ABORT;
 
          break;
 
       }
 
       if(retval == 'r' || retval == 'R')
 
       {
 
          retval = RETRY;
 
          break;
 
       }
 
       if(retval == 'i' || retval == 'I')
 
       {
 
          retval = IGNORE;
 
          break;
 
       }
 
    }
 
    return(retval);
 
 }
 
 /* прагма warn -par исключае выдачу предупреждений о том, что
 
    в подпрограмме не используются параметры errval,bp и si */
 
 
 
 #pragma warn -par
 
 
 
 int handler(int errval, int ax, int bp, int si)
 
 {
 
    static char msg[80];
 
    unsigned di;
 
    int drive;
 
    int errno;
 
    di = _DI;
 
 /* если это не ошибка диска, то проблемы возникли у
 
    другого устр-ва */
 
    if(ax<0)
 
    {
 
       /* сообщить об ошибке */
 
       error_win("Ошибка устройства");
 
       /* и вернуть управление программе */
 
       hardretn(ABORT);
 
    }
 
    /* иначе это ошибка диска */
 
    drive = ax&0x00ff;
 
    errno = di & 0xff;
 
    /* сообщить, что за ошибка */
 
    sprintf(msg,"Ошибка: %s на дисководе %c\r\nA)bort, R)etry,
 
                I)gnore:",err_msg[errno],'A'+drive);
 
    /* вернуть управление программе */
 
    hardresume(error_win(msg));
 
    return ABORT;
 
 }
 
 #pragma warn +par
 
 
 
 int main(void)
 
 {
 
    /* установить программу обработки прерывания */
 
    harderr(handler);
 
    printf("Make sure there is no disk in drive A:\n");
 
    printf("Press a key when ready...\n");
 
    getch();
 
    printf("Attempting to access A:\n);
 
    fopen("A:ANY.FIL","r");
 
    return 0;
 
 }


<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS