Загрузить драйвер дважды?

Тема в разделе "WASM.NT.KERNEL", создана пользователем krol, 8 сен 2011.

  1. krol

    krol New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2011
    Сообщения:
    19
    Есть драйвер - c:\driver1.sys
    После того как он загружается - нужно загрузить другой драйвер, но по конкретно этому пути.
    Вопрос: возможно ли такое? Фишка в том что путь менять нельзя.
    Нужно подчистить какой-то список в ядре, чтобы драйвер там не святился? (типа уже загружен - STATUS_IMAGE_ALREADY_LOADED) ??
     
  2. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    1) Открываешь исходники ядра WinXP
    2) поиском находишь где используется константа STATUS_IMAGE_ALREADY_LOADED
    3) Это будет функция MmLoadSystemImage и IopLoadDriver
    4) Для примера возьмём IopLoadDriver т.к. код проверки почти такой же как и в MmLoadSystemImage
    5) Далее видим код
    Код (Text):
    1.     ExAcquireResourceSharedLite( &PsLoadedModuleResource, TRUE );
    2.     nextEntry = PsLoadedModuleList.Flink;
    3.     while (nextEntry != &PsLoadedModuleList) {
    4.  
    5.         //
    6.         // Look at the next boot driver in the list.
    7.         //
    8.  
    9.         driverEntry = CONTAINING_RECORD( nextEntry,
    10.                                          KLDR_DATA_TABLE_ENTRY,
    11.                                          InLoadOrderLinks );
    12.  
    13.         //
    14.         // If this is not the kernel image (ntoskrnl) and not the HAL (hal),
    15.         // then this is a driver, so initialize it.
    16.         //
    17.  
    18.         if (RtlEqualUnicodeString(  &baseName,
    19.                              &driverEntry->FullDllName,
    20.                             TRUE )) {
    21.  
    22.             status = STATUS_IMAGE_ALREADY_LOADED;
    23.             ExReleaseResourceLite( &PsLoadedModuleResource );
    24.  
    25.             IopBootLog(&baseName, TRUE);
    26.             baseName.Buffer = NULL;
    27.             goto IopLoadExit;
    28.         }
    29.  
    30.         nextEntry = nextEntry->Flink;
    31.     }
    32.     ExReleaseResourceLite( &PsLoadedModuleResource );
    т.е. как видно проверяется driverEntry->FullDllName
    Так что из первого драйвера подчищай этой значение и будет тебе счастье.
     
  3. krol

    krol New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2011
    Сообщения:
    19
    Сенкс! То что нужно!
     
  4. krol

    krol New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2011
    Сообщения:
    19
    А что, где-то есть исходники WinXP?
     
  5. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
  6. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    krol
    Можно, но тогда тебе надо выделить память в ядре неподкачиваемую, и тело функции потока туда записать, и функция должно быть базонезависима.
     
  7. krol

    krol New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2011
    Сообщения:
    19
    Дак и так вроде бы все это выполняется!
     
  8. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    покажи код целиком который выделяет память и переносит код.
    И сделай DbgPrint с размером копируемых данных. т.к. очень часто при включенной оптимизации, функции перестанавливающий местами.
    т.е. код
    Код (Text):
    1. DWORD Proc1(PStr1 Param)
    2. {
    3.  ***
    4. }
    5.  
    6. void EndProc1()
    7. {
    8. }
    9.  
    10. *****
    11. Size = (ULONG_PTR)EndProc1 - (ULONG_PTR)Proc1;
    Size может быть вообще отрицательным или ооочень большим (в зависимости от типа)
     
  9. krol

    krol New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2011
    Сообщения:
    19
    Проблема решена. Наверный указатель на DbgPrint.
    Там еще кампилятор при
    call _DbgPrint
    вставлял
    jmp ds:__imp__DbgPrint

    Оттого и не откуда было "прыгать"