Доброго времени суток, друзья. Вобщем, при написашии оболочки у меня возникла потребность сменить экран приветствия. Суть в том, чо если при инициализации моего экрана приветствия возникает ошибка, должен запускаться стандартный, то есть logonui.exe. При этом ему должен передаваться параметр командной строки. Я читаю этот параметр из коммандлайна, котрый был передан в мое приложение и запускаю logonui.exe с этим параметром. Но вот только он почему-то не запускается. Точнее, запускается, но тут же закрывается, даже не показав окно. Засунул в ольку, потрейсил - нифига не понял. Как быть? Опуская все ненужные подробности приведу кусок кода: Код (Text): .data? mSI STARTUPINFO <?> mPI PROCESS_INFORMATION <?> .data szLogonui db 'logonui.exe', 200 dup (0) .code Main: invoke GetCommandLine push eax push eax call lstrlen pop ecx add ecx, eax ; logonui.exe /[param] ; отделяем параметр @1: dec ecx cmp byte ptr[ecx], 020h je @2 jmp @1 @2: nop ; добавляем к имени параметр командной строки invoke lstrcat, offset szLogonui, ecx invoke RtlZeroMemory, offset mSI, sizeof(STARTUPINFO) invoke RtlZeroMemory, offset mPI, sizeof(PROCESS_INFORMATION) ; получем STARTUPINFO, на всякий случай... invoke GetStartupInfo, addr mSI ; запускаем logonui.exe с параметром invoke CreateProcess, NULL, offset szLogonui, NULL, NULL, FALSE, 0, NULL, NULL, offset mSI, offset mPI ; ждем закрытия invoke WaitForSingleObject, mpi.hProcess, -1 ; чистимся invoke CloseHandle, mpi.hProcess invoke CloseHandle, mpi.hThread ret End Main Полный код, скомпиленый бинарник смотрите в архиве. Там же файл реестра, который заменяет стандартный logonui на наш. Не забудьте сделать копию ветки реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon, дабы потом восстановить все обратно. Заранее спасибо, надеюсь на вашу помощь.
Код (Text): 010080A0 push 0 ; /Title = NULL 010080A2 push logonui.01001E30 ; |Class = "Shell_TrayWnd" 010080A7 call dword ptr [<&USER32.FindWindowW>] ; \FindWindowW 010080AD neg eax 010080AF sbb eax,eax 010080B1 inc eax 010080B2 ret Ищется окно "Shell_TrayWnd", если оно найдено процесс завершаетсо, иначе выводится окно входа в систему. Можно либо возвратить ноль из FindWindowW(), либо завершить explorer.exe Это работает ведь есчо до запуска проводника.
Это я заметил уже. Пробовал убивать окно, а после запускать оригинальный процесс - не помогает. Да и при запуске винды logonui.exe запускается раньше эксплорера, поэтому в это время окна с классом "Shell_TrayWnd" не может быть в принципе. Но если в дебагере подменить параметр, который возвращает FindWindowW, то окно входа появляется. Странно это все как-то. короче, вопрос остается открытым.
А у меня почему-то нет... Завершаю explorer.exe через диспетчер задачь, тут же завершаю сеанс - окна ввода нет. Точнее, есть окно ввода, но оно не красивенькое фуллскриновое, а обычное, как на W2k.