Добавить функцию в ядро

Internal structure and you change requests/suggestions
  • В файле core/syscall.inc после метки servetable по порядку заданы адреса всех системных функций.
    Для добавления новой (69) функции, в конец списка (после dd sys_internal_services) следует добавить строчку вида
    dd my_sys_function

    Значения регистров в функции меняются следующим образом:
    (в программе -> в обработчике)
    eax -> edi
    ebx -> eax
    ecx -> ebx
    edx -> ecx
    esi -> edx
    edi -> esi

    Изменяемые в обработчике регистры ни на что не влияют, так что нет необходимости их сохранять.
    Регистры eax, ebx, ecx программы можно изменять через [esp+36], [esp+32], [esp+24] соответственно.

    Если в обработчик передается указатель (адрес), для использования его в ядре нужно прибавить std_application_base_address.
    Last edited by Иван Поддубный on Sat Oct 29, 2005 12:20 pm, edited 1 time in total.
  • Спасибо. Этот вопрос и ответ можно в FAQ добавить.
  • Работать с портами из приложений возможно. Нужно лишь зарезервировать их предварительно функцией 46.
  • Только нужно обратить внимание на то что в документации кое где перепутано кое что.
  • Совершенно верно,перепутано.
    В описании 43 функции сказано,что для записи в порт нужно в bx записывать номер порта,а в cl данные.На самом деле все наоборот - в сх номер порта,а в bl данные.Нужно исправит ошибку,ато еще подумают,что в Меос/Колибри нельзя работать с портами.
  • Есть вариант - убрать эту функцию из документации, потому что можно пользоваться обычными in/out.
  • Тогда начинающим МЕОС/Колибри программистам будет трудно понять исходники PPP звонилки от Майка Хаббета.
  • Коллеги! Какой диапазон портов доступен для резервирования (мне нужны 70h и 71h). И можно ли использовать in/out? Разве приложение не умирает?
  • Умирает. Поддубный наверное имел ввиду что все будут создавать свои фунции на 0 уровне %).
  • Порты от 0 до 0xFF и некоторые другие уже зарезервированы системой, и функция 46 должна возвращать соответствующий результат.
    in/out пользовать можно и нужно, но только для зарезервированных портов.
  • Ответьте, пожалуйста, по существу: я смогу записать байт в порты 0x70 и 0x71, и как это сделать в Ring-3?
  • willow
    Ответ уже есть, но могу повторить еще раз:
    Порты 0x70, 0x71 зарезервированы системой. Использовать их в пользовательском режиме нельзя.
    И даже если захочется, то 46ая функция при попытке резервирования вернет ошибку.
  • Willow
    Не знаю, зачем тебе порты 70 и 71 программировать из приложения, но если ты задумал сделать установку даты и времени, то такая функция уже есть. Так что не надо мучиться. Михаил Лисовин ее сделал. Она есть, в ядре начиная с K0500, точно не помню, но в К0510 уже точно есть, само собой есть и будет в последующих. Номер 22. В sysfuncr.txt есть описание.
  • Да это я так, хотел из Menuet снять пароль BIOS :-)
  • Who is online

    Users browsing this forum: Google [Bot] and 11 guests