Странности с CreateProcessWithLogonW

Тема в разделе "WASM.WIN32", создана пользователем Twister, 13 дек 2007.

  1. Twister

    Twister New Member

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

    Создадим в Делфях новый проект с пустой формой.
    Создадим процедуру с вот таким вот содержанием:
    Код (Text):
    1. procedure RunSomeProcess;
    2. var
    3.   si: TSTARTUPINFO;
    4.   pif: PROCESS_INFORMATION;
    5. begin
    6. si.cb := SizeOf(TSTARTUPINFO);
    7. si.dwFlags  := STARTF_USESHOWWINDOW;
    8. si.wShowWindow := SW_SHOWDEFAULT;
    9. si.lpReserved := nil;
    10. si.lpDesktop := nil;
    11. si.lpTitle := nil;
    12. CreateProcessWithLogonW('Test', nil, 'test', 0, nil, 'c:\WINDOWS\system32\calc.exe', 0, nil, nil, si, pif);
    13. end;
    Естественно, пользователя Test нужно создать заранее (я создал его с правами админа). Так же нужно убедиться, что служба "Вторичный вход в систему" запущена.

    Попробуем теперь вызвать RunSomeProcess при загрузке формы:
    Код (Text):
    1. procedure TForm1.FormCreate(Sender: TObject);
    2. begin
    3. RunSomeProcess;
    4. end;
    Калькулятор запустился, но как... Целых два раза мы лицезреем "ошибку при инициализации приложения (0xc0000005)" и наш подопытный умирает.

    Дальше кинем на форму таймер (Interval == 1000) и вызовем RunSomeProcess в его обработчике:
    Код (Text):
    1. procedure TForm1.Timer1Timer(Sender: TObject);
    2. begin
    3. RunSomeProcess;
    4. Timer1.Enabled := false;
    5. end;
    Калькулятор вообще не запустился. GetLastError возвращает ERROR_NO_TOKEN.

    Теперь изменим немного код в обработчике таймера, просто скопировав содержимое функции RunSomeProcess:
    Код (Text):
    1. procedure TForm1.Timer1Timer(Sender: TObject);
    2. var
    3.   si: TSTARTUPINFO;
    4.   pif: PROCESS_INFORMATION;
    5. begin
    6. si.cb := SizeOf(tstartupinfo);
    7. si.dwFlags  := STARTF_USESHOWWINDOW;
    8. si.wShowWindow := SW_SHOWDEFAULT;
    9. si.lpReserved := nil;
    10. si.lpDesktop := nil;
    11. si.lpTitle := nil;
    12. CreateProcessWithLogonW('Test', nil, 'test', 0, nil, 'c:\WINDOWS\system32\calc.exe', 0, nil, nil, si, pif);
    13. Timer1.Enabled := false;
    14. end;
    Подопытный запустился и прекрасно работает.

    Вот такие вот пироги. У кого-нибудь есть мысли, отчего такой беспредел творится?
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    занулять si не пробовал?
     
  3. Twister

    Twister New Member

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

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    Twister
    Ай-яй, стыд и позор =)
     
  5. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Mental_Mirror
    Да не говори. Ну да ладно - с кем не бывает.
    К модерам просьба - топик снести, а то действительно стыд и позор