Правильный запуск logonui.exe

Тема в разделе "WASM.WIN32", создана пользователем OxBADC0DE, 6 дек 2008.

  1. OxBADC0DE

    OxBADC0DE Олег aka Executioner

    Публикаций:
    0
    Регистрация:
    6 дек 2008
    Сообщения:
    11
    Адрес:
    SPb
    Доброго времени суток, друзья.
    Вобщем, при написашии оболочки у меня возникла потребность сменить экран приветствия.
    Суть в том, чо если при инициализации моего экрана приветствия возникает ошибка, должен запускаться стандартный, то есть logonui.exe. При этом ему должен передаваться параметр командной строки. Я читаю этот параметр из коммандлайна, котрый был передан в мое приложение и запускаю logonui.exe с этим параметром. Но вот только он почему-то не запускается. Точнее, запускается, но тут же закрывается, даже не показав окно. Засунул в ольку, потрейсил - нифига не понял. Как быть?
    Опуская все ненужные подробности приведу кусок кода:
    Код (Text):
    1. .data?
    2.     mSI STARTUPINFO <?>
    3.     mPI PROCESS_INFORMATION <?>
    4. .data
    5.     szLogonui db 'logonui.exe', 200 dup (0)
    6. .code
    7. Main:
    8.     invoke GetCommandLine
    9.     push eax
    10.     push eax
    11.     call lstrlen
    12.     pop ecx
    13.     add ecx, eax
    14.     ; logonui.exe /[param]
    15.     ; отделяем параметр
    16.     @1:
    17.     dec ecx
    18.     cmp byte ptr[ecx], 020h
    19.     je @2
    20.     jmp @1
    21.     @2:
    22.     nop
    23.     ; добавляем к имени параметр командной строки
    24.     invoke lstrcat, offset szLogonui, ecx
    25.     invoke RtlZeroMemory, offset mSI, sizeof(STARTUPINFO)
    26.     invoke RtlZeroMemory, offset mPI, sizeof(PROCESS_INFORMATION)
    27.     ; получем STARTUPINFO, на всякий случай...
    28.     invoke GetStartupInfo, addr mSI
    29.     ; запускаем logonui.exe с параметром
    30.     invoke CreateProcess, NULL, offset szLogonui, NULL, NULL, FALSE, 0, NULL, NULL, offset mSI, offset mPI
    31.     ; ждем закрытия
    32.     invoke WaitForSingleObject, mpi.hProcess, -1
    33.     ; чистимся
    34.     invoke CloseHandle, mpi.hProcess
    35.     invoke CloseHandle, mpi.hThread
    36.     ret
    37. End Main
    Полный код, скомпиленый бинарник смотрите в архиве. Там же файл реестра, который заменяет стандартный logonui на наш. Не забудьте сделать копию ветки реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon, дабы потом восстановить все обратно.
    Заранее спасибо, надеюсь на вашу помощь.
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Код (Text):
    1. 010080A0               push 0                                            ; /Title = NULL
    2. 010080A2               push logonui.01001E30                             ; |Class = "Shell_TrayWnd"
    3. 010080A7               call dword ptr [<&USER32.FindWindowW>]            ; \FindWindowW
    4. 010080AD               neg eax
    5. 010080AF               sbb eax,eax
    6. 010080B1               inc eax
    7. 010080B2               ret
    Ищется окно "Shell_TrayWnd", если оно найдено процесс завершаетсо, иначе выводится окно входа в систему.
    Можно либо возвратить ноль из FindWindowW(), либо завершить explorer.exe
    Это работает ведь есчо до запуска проводника.
     
  3. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    [deleted]
    Простите, перепутал.
     
  4. OxBADC0DE

    OxBADC0DE Олег aka Executioner

    Публикаций:
    0
    Регистрация:
    6 дек 2008
    Сообщения:
    11
    Адрес:
    SPb
    Это я заметил уже. Пробовал убивать окно, а после запускать оригинальный процесс - не помогает. Да и при запуске винды logonui.exe запускается раньше эксплорера, поэтому в это время окна с классом "Shell_TrayWnd" не может быть в принципе.
    Но если в дебагере подменить параметр, который возвращает FindWindowW, то окно входа появляется. Странно это все как-то. короче, вопрос остается открытым.
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    OxBADC0DE
    Заверши проводник и заюзай свой кодес.
     
  6. OxBADC0DE

    OxBADC0DE Олег aka Executioner

    Публикаций:
    0
    Регистрация:
    6 дек 2008
    Сообщения:
    11
    Адрес:
    SPb
    Clerk
    Завершение проводника ничего не дает.
     
  7. Clerk

    Clerk Забанен

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

    OxBADC0DE Олег aka Executioner

    Публикаций:
    0
    Регистрация:
    6 дек 2008
    Сообщения:
    11
    Адрес:
    SPb
    А у меня почему-то нет... Завершаю explorer.exe через диспетчер задачь, тут же завершаю сеанс - окна ввода нет. Точнее, есть окно ввода, но оно не красивенькое фуллскриновое, а обычное, как на W2k.