юзать вручную созданный стек - корректно ли ?

Тема в разделе "WASM.NT.KERNEL", создана пользователем vladqq, 26 мар 2010.

  1. vladqq

    vladqq New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2009
    Сообщения:
    69
    хай всем

    такой вопрос
    выделяю вручную nonpaged память, и юзаю её как стек в драйвере. всё работало в прицнипе, но когда я включил
    verifier, при выгрузке драйвер начал вылетать с сообщением что worker thread завершён с irql=2 а не 0.
    я несколько дней долбался, пытаясь выяснить причину, проверял - в самом конце driverunload-а irql==0.
    остаётся одна возможная причина - где то я чтото запорол. сам код ничего особого не делает (треды не создаются), за
    исключением того что юзает вручную выделенный стек.
    роя гугл я гдето мельком прочитал что менять стек нельзя ни в коем случае, сейчас эту инфу найти не могу.
    кто-нить сталкивался с этим?
     
  2. vladqq

    vladqq New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2009
    Сообщения:
    69
    похоже дело было не в стеке а в том что забыл регистр восстановить при выходе из функции. но всё же вопрос остаётся открытым - кошерно ли юзать свой стек?
     
  3. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Вопрос в обратку: а чем в данном случае обосновано использование своего стека?
     
  4. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Patching Policy for x64-Based Systems

     
  5. vladqq

    vladqq New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2009
    Сообщения:
    69
    x64 спасибо, видимо прийдётся отрезать кусочек кернел-стека под свои нужды.
     
  6. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    x64
    Хм... Вполне возможно. Я так же как и Great, к примеру, с x64-based systems не шибко дружу - не приходилось. Но все равно, немного туманное высказывание. Ты мог бы привести нормальную ссылку на первоисточник? Хочется аргументов :)

    ADD: Это было оно?
     
  7. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Да.
     
  8. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Прочитал. Ну про модификацию SSDT и иже с ней и так ясно, а вот про стек не знал, спасибо.

    Вырисовалась очередная причина не юзать самопальный стек. Но мой вопрос к ТС остается открытым: а какие-такие причины заставили создавать свой стек?
     
  9. vladqq

    vladqq New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2009
    Сообщения:
    69
    скажем так, защита отдельной части кода драйвера, протектор вызывается периодически и стек драйвера ни в коем случае не должен изменять никаким образом.
     
  10. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    vladqq
    Немного расплывчатое объяснение, не до конца ясна суть. Но все же попробую усомниться в том, что нормально спроектированный протектор кода от модификации или еще от чего-либо будет портить стеки каких-либо потоков.

    ЗЫ. Что в данном контексте есть "стек драйвера"? То, о чем я думаю? ;)
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Можно свой стек создать, только нужно должным образом его настроить в ETHREAD(InitialStack для трап-фреймов и пр.). Можно расширить имеющийся MmGrowKernelStack(). (x64 - не документировано, в мсдн нет.. так к слову :P).
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    vladqq
    Кстате знакомая ошибка. У меня падало, когда я изменял PreviousMode, сделав опечатку - писал вместо байта дворд, тоесть затерались следующие 3 байта(не помню что там).
     
  13. vladqq

    vladqq New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2009
    Сообщения:
    69
    Twister
    ну вот есть драйвер, скомпиленый. на него вешается протектор, который добавляет свой код в драйвер. код этот достаточно велик, это не одна функция на асме. соответственно коду этому нужен стек. стек драйвера я юзать не рискую, так как там можно чтото затереть не то, да и бывает надо данные в стеке сохранять между вызовами.

    ещё одну багу обнаружил - часть api-вызовов ядра, типа работы с мьютексами, портят содержимое регистров как хотят, я то думал что они сохраняют их. кто-нить в курсе где найти описание того какие из регистров ядро в праве портить ?
     
  14. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    По общепринятому соглашению ebx, esi, edi, ebp функции должны сохранять, а ecx, eax, edx сохранять не обязаны. По тому же соглашению возвращаемое значение заносят в eax, а если оно 64битное - то в пару edx:eax.
    По тому же соглашению, аргументы в стек заносят в порядке справа налево (cdecl,stdcall), или по регистрам (ecx, edx, остальные на стек - fastcall), место под аргументы чистит вызывающая (cdecl) или вызываемая (stdcall, fastcall) функция.
     
  15. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Я повторюсь: нормальный код ничего не будет портить и затирать. Пересмотрите нюансы.

    Для этого существует секция данных. Расширьте для своих нужд имеющуюся / создайте свою / просто выделите память для хранения своих данных.
     
  16. vladqq

    vladqq New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2009
    Сообщения:
    69
    Twister
    я не совсем правильно выразился. данные, сохраняемые, это стековые переменные при ветвлениях типа:
    драйвер -> драйвер -> протектор -> драйвер -> протектор -> драйвер ......
     
  17. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    vladqq
    Вот это ещё посмотри.
     
  18. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    x64
    С совместимостью проблем не будет, по мойму проще вызвать то, что есть в экспорте.