Драйверы режима ядра

Тема в разделе "WASM.NT.KERNEL", создана пользователем wasm_test, 14 ноя 2008.

  1. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.615
    Адрес:
    Russia
    G13
    писать в личку - получил ответ - у меня нет виллы на карибах
    скачать WDK - качаю уж
    просто интересно посмотреть сравнить
     
  2. Ins3t

    Ins3t New Member

    Публикаций:
    0
    Регистрация:
    24 июл 2009
    Сообщения:
    40
    Грейт, благодарю за статью.
    Уже купил книгу Руссиновича и Соломона, читаю.
    Только на будущее возник вопрос, как прикрутить ДДК к VC 2008 ?
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ins3t
    Если ты внимательно читал статью, то наверняка видел там ссылку http://alter.org.ua/ru/docs/nt_kernel/vc8_proj/
    Там это расписано
     
  4. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    а что там особо прикручивать - указать пути к инклудам и либам, да поставить пару галочек в проекте. интересно, что даже C++ дрова можно компилить :)))
     
  5. Ins3t

    Ins3t New Member

    Публикаций:
    0
    Регистрация:
    24 июл 2009
    Сообщения:
    40
    2Great, благодарю.
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ну да, только без экцепшонов =(
    Хотя я реализовывал поддержку экцепшонов С++ для ядра
     
  7. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    а в чём принципиальная проблема? мелкомягкие ведь предоставляют директиву __try __except().

    int filter(unsigned int code, struct _EXCEPTION_POINTERS *ep)
    {
    OutputDebugString(TEXT("exception."));

    if (code == EXCEPTION_INT_DIVIDE_BY_ZERO)
    {
    OutputDebugString(TEXT("caught AV as expected."));
    return EXCEPTION_EXECUTE_HANDLER;
    }

    OutputDebugString(TEXT("didn't catch AV, unexpected."));
    return EXCEPTION_CONTINUE_SEARCH;
    }

    void Main()
    {
    int x = 0;

    __try
    {
    x /= 0;
    }
    __except (filter(GetExceptionCode(), GetExceptionInformation()))
    {
    x = 1;
    }
    }

    аналогично для кернела. только класс исключений создать..
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ну да, попробуй для кернела ту же либу подключить (msvcp80.lib) Ж) помню что там траблы были
     
  9. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    а при чём тут msvcp80.lib? и без неё неплохо собирается. указываю nodefaultlib + ntoskrnl (в ядре) или ntdll (в юзере) экспортирует вот эту заразу: external symbol __C_specific_handler. всё собирается со стандартным набором библиотек. в кернеле х.з. - влом дров компилить, а в юзере всё пучком. в таблице экспорта только ntdll.dll.
     
  10. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Поделишься? :)

    Принципиальная проблема в том, что С++ исключения это "не совсем то".
     
  11. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    __C_specific_handler - это 64, в общем ясно, что не особо копал.
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    cupuyc
    А ты попробуй С++ исключения try/catch/throw.
    Ясен пень SEH будет компилится и работать и в юзере и в ядре. А это другое
     
  13. reversecode

    reversecode Guest

    Публикаций:
    0
    разве в винде в юзер левеле try/catch/throw не используют механизмы SEH ?
     
  14. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Могут использовать, но: 1) не обязательно; 2) по-другому. Раз Great не хочет делиться своим кодом, начинать мона отсюда http://www.openrce.org/articles/full_view/21
     
  15. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Используют. Но код обработки исключения, обработчик throw (__CxxThrowException) от мелкомягких требуют всякие функции из кернела, как мне помнится. И в ядре работать не будут

    J0E
    У меня не совсем отлажено. В целом работает, но могут быть косяки. Если что я предупреждал :) ща поищу
     
  16. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Учитывая открытость вполне рабочей реализации, косяки не особо волнуют. Больше интересно каким образом удалось избавиться от _getptd()
     
  17. Ins3t

    Ins3t New Member

    Публикаций:
    0
    Регистрация:
    24 июл 2009
    Сообщения:
    40
    Линк на статью о настройке ком порта в вмваре битой.
    мб есть у кого копия статьи?
     
  18. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Копии статьи нет, напишу от себя.

    В двух словах о настройке COM порта. Создаем новый Serial Port в вмваре, выбираем типы This end is a server, The other end is an application. После создания ставим в свойствах порта галочку Yield CPU on poll. Порту назначается автоматически имя \\.\pipe\com_1 (если он первый)
    В Windows в boot.ini берем основную загрузочную запись, с которой грузится винда, и копируем, указывая в копии дополнительные параметры ядра - /DEBUG /DEBUGPORT=COM1 /BAUDRATE=115200
    Затем перезагружаем вмварю, выбираем этот пункт. Врубаем WinDbg:
    "D:\Program Files\Debugging Tools for Windows\windbg.exe" -y D:\Symbols -k com:pipe,port=\\192.168.0.1\pipe\com_1,reconnect
    (пример для моей тачки; так же можно использовать kd)
    Должны увидеть "Waiting for reconnect...". Нажимаем Ctrl-Break (в случае kd - Ctrl-C), WinDbg посылает команду на останов в виртуалку.
    Должны увидеть:
    Далее нажимаем F5 (windbg) или вводим команду g (kd). Далее система работает под присмотром отладчика. Рекомендую на данном этапе сделать снапшот (когда система загрузится).

    После восстановления снапшота при следующих запусках достаточно запустить WinDbg, подсоединиться и сделать Ctrl-Break, потом Go (простое присоединение не пойдет - почему-то ядро считает, что отладчика нет и любой бсод свалит систему, вместо того, чтобы всплыть в отладчике. только после ctrl-break/go система "признает" отладчик)
     
  19. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    В случае с Windows >= Vista там используется новая версия ntldr, которая использует в качестве базы не boot.ini, а специальную bcd в собственном формате (boot configuration database).
    Для ее редактирования есть программы bcdedit (поставляется с Windows, консольная, требует запуска с консоли администратора), EasyBCD (сторонняя, с графическим интерфейсом).
    Как пользоваться bcdedit написано в её хелпе и мсдн.
    У EasyBCD интерфейс интуитивный. Нужно создать новую загрузочную запись, скопировав параметры существующей, где поставить необходимые галочки для отладки ядра. К сожалению, у меня сейчас нет возможности сделать скриншоты, а по памяти я не помню. Как будет возможность, я сделаю. В остальном процесс мало отличается от предыдущих версий Windows
     
  20. deshiko

    deshiko New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    42
    Ссылка на Windows Internals Fifth Edition от Руссиновича
    http://www.knigka.info/2009/11/18/windows-internals-fifth-edition.html