Возвращение после InbvAcquireDisplayOwnership

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

  1. irusrubin

    irusrubin New Member

    Публикаций:
    0
    Регистрация:
    7 июл 2010
    Сообщения:
    16
    Здравствуйте!
    Очень нужно уметь возвращаться после InbvAcquireDisplayOwnership.
    Пишу следующее:
    if (InbvIsBootDriverInstalled()) {
    InbvAcquireDisplayOwnership();
    InbvResetDisplay();
    InbvSolidColorFill(0,0,639,479,4);
    InbvSetTextColor(15);
    InbvInstallDisplayStringFilter(NULL);
    InbvEnableDisplayString(TRUE);
    InbvSetScrollRegion(0,0,639,479);
    InbvDisplayString("Text");
    }
    Выдает,как и должно быть, синий экран с надписью Text. Хотелось бы уметь возвращаться в предыдущий режим.
    Проверял следующие гипотезы:
    1) Поможет IoRaiseInformationalHardError.
    Не помогла
    2)Поможет InbvSetDisplayOwnership. В экспорте ядра её я не нашёл. Поэтому сам не проверял.
    Однако, если верить листингу, она тоже не поможет:
    .text:805299E7 ; __stdcall InbvSetDisplayOwnership(x)
    .text:805299E7 _InbvSetDisplayOwnership@4 proc near ; CODE XREF: PopInvokeSystemStateHandler(x,x)+27Ap
    .text:805299E7
    .text:805299E7 bOwned = byte ptr 8
    .text:805299E7
    .text:805299E7 mov edi, edi
    .text:805299E9 push ebp
    .text:805299EA mov ebp, esp
    .text:805299EC mov al, [ebp+bOwned]
    .text:805299EF neg al
    .text:805299F1 sbb eax, eax
    .text:805299F3 and eax, 0FFFFFFFEh
    .text:805299F6 inc eax
    .text:805299F7 inc eax
    .text:805299F8 mov _InbvDisplayState, eax
    .text:805299FD pop ebp
    .text:805299FE retn 4
    .text:805299FE _InbvSetDisplayOwnership@4 endp


    Кто,что думает на этот счёт? Заранее, спасибо.
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    irusrubin
    Про какой режим вы говорите ?

    По сути функции Inbv* это переходники к драйверу видеопортов(videoprt.sys). Переменная InbvDisplayState используется этим драйвером(опрос через InbvCheckDisplayOwnership()), вроде как есть специальный IOCTL(смотрите сами). Тут http://www.koders.com/c/fid982470AA7C22AF70C7599CC5352106B56F73E787.aspx нужных вам ссылок на INBV_DISPLAY_STATE_LOST или InbvCheckDisplayOwnership() также нет как и в самом ядре(InbvRotateGuiBootDisplay() не в счёт).
     
  3. irusrubin

    irusrubin New Member

    Публикаций:
    0
    Регистрация:
    7 июл 2010
    Сообщения:
    16
    Clerk
    Когда я говорил про режим, я имел ввиду, что в InbvAcquireDisplayOwnership() вызывается InbvResetDisplayParameters(80, 50); (меняется режим видеоадаптера на используемый при загрузке системы и выводе BSOD'а)
    Насколько я понимаю, изменение переменной InbvDisplayState мне не поможет вернуть предыдущий режим.
    Повторю свой вопрос другими словами:
    Каким образом после того, как я вывел на экран на синем фоне слово Text методом описанным выше, мне вернуться опять в нормальный режим, т.е. увидеть рабочий стол и всё такое.
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    irusrubin
    Тогда вам нужно смотреть в сторону минипорта видео(IOCTL_VIDEO_RESTORE_HARDWARE_STATE etc.) или непосредственно шадова(NtUserChangeDisplaySettings etc.). Средствами самого ядра(nt) этого не сделать.

    Грейт вроде описывал гдето матчасть тут на форуме и в блоге, http://the-gr8.cih.ms/2010_01_01_archive.html