Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Процесс запущенный ScreenSaver-ом завершается вместе с ним... [D5, WinXP]


Страницы:   1 2

BaDeVlad ©   (2005-01-14 15:13:00) 

Делаю программу-заставку. Она запускает некоторое приложение с помощью ShellExecute(0, 'open', ApplicationToRun, Parameters, nil, SW_SHOWNORMAL); Почти все хорошо, но если работа моего скринсейвера, запустившего приложение, завершается, то запущенное приложение закрывается тоже. Как этого избежать? Эта "дополнительная возможность" проявляется только под 2000-XP.


alpet   (2005-01-20 11:29:00) [1]

Надо запустить попробывать процесс в другом (общем) десктопе. Скринсейвер, winlogon и прочие программы используют отдельный десктоп.


kaZaNoVa   (2005-01-18 13:35:00) [2]

BaDeVlad ©   (18.01.05 9:22) [16]
[6] пробовал?


Игорь Шевченко   (2005-01-18 12:17:00) [3]


> > А CreateProcess разве не помогает ?
> Нет.


Значит дырку прикрыли, как сказано в [2]. Значит, надо искать другие пути для решения задачи. Кстати, в чем состоит задача, что процесс надо из-под Screen-Saver'а запускать ?


Kerk   (2005-01-18 12:15:00) [4]

Удалено модератором


kaZaNoVa   (2005-01-18 12:13:00) [5]

Удалено модератором


BaDeVlad   (2005-01-18 09:22:00) [6]

> А CreateProcess разве не помогает ?
Нет.


Игорь Шевченко   (2005-01-14 23:51:00) [7]


> А помочь кто-то может? :)


А CreateProcess разве не помогает ?


BaDeVlad   (2005-01-14 18:30:00) [8]

А помочь кто-то может? :)
Я пробовал ShellExecuteEx + SEE_MASK_NOCLOSEPROCESS, не помогает. Чтож-таки делать? Не может быть, чтобы никак не решалась проблема!


Игорь Шевченко   (2005-01-14 17:46:00) [9]

Ну точно, опять гланды вырезаем нетрадиционным способом.

Я напоминаю, что форум WinAPI не является филиалом сайта xakep.ru
Советую особо ретивым подумать.


Kerk   (2005-01-14 17:17:00) [10]

Eraser ©   (14.01.05 17:15) [10]
ой.. сорри.. ветку перепутал.. :))))))))


Kerk   (2005-01-14 17:16:00) [11]

Eraser ©   (14.01.05 17:15) [10]
ссылку. это мой код.


Eraser   (2005-01-14 17:15:00) [12]

Kerk ©
Это из xakep.ru ;-))


Kerk   (2005-01-14 17:05:00) [13]

kaZaNoVa ©   (14.01.05 16:51) [6]
Слух.. ты достал уже этим кодом. :))))


kaZaNoVa   (2005-01-14 16:52:00) [14]

забыл сказать, что пашет тока на 2000 и выше


kaZaNoVa   (2005-01-14 16:52:00) [15]

Игорь Шевченко ©   (14.01.05 16:17) [4]
100% будет нормально работать при условии что есть запущенный Експлорер:)))


kaZaNoVa   (2005-01-14 16:51:00) [16]

BaDeVlad   (14.01.05 16:36) [5]

> А что значит через внедрение в Explorer?


DLL
library Sys;

uses
Windows,Messages;

Var
pi: TProcessInformation;
si: TStartupInfo;
id,ThreadID:cardinal;

function thread:integer; stdcall;
begin
thread:=0;
CreateThread(nil,0,GetProcAddress(GetModuleHandle('kernel32'),'FreeLibrary'),pointer(hInstance),0,id);
end;

begin
si.cb := SizeOf(si);

CreateProcess(nil, 'cmd.exe', nil, nil, FALSE, 0, nil, nil, si, pi);

sleep(1);

CreateThread(nil,0,@Thread,nil,0,ThreadID);
end.


Loader (будет выполняться к примеру из сервиса)
program loader;
uses
Windows,Tlhelp32;

function SetDebugPriv: Boolean;
var
Token: THandle;
tkp: TTokenPrivileges;
begin
Result := false;
if OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token) then
begin
if LookupPrivilegeValue(nil, PChar('SeDebugPrivilege'), tkp.Privileges[0].Luid) then
begin
  tkp.PrivilegeCount := 1;
  tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
  Result := AdjustTokenPrivileges(Token, false, tkp, 0, PTokenPrivileges(nil)^, PDWord(nil)^);
end;
end;
end;

function Start(ProcessID: Cardinal; DllFileName: string): Boolean;
var
hProcess, hTh: THandle;
BytesWritten, ThreadID, DllNameLen: Cardinal;
LoadLibraryProc, MemPtr: Pointer;
ExitCode: DWord;
begin
Result := false;

SetDebugPriv();

hProcess := OpenProcess(PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_WRITE,true, ProcessID);

if hProcess <> 0 then
begin
DllNameLen := Length(DllFileName) + 1;

MemPtr := VirtualAllocEx(hProcess, nil, DllNameLen, MEM_COMMIT, PAGE_READWRITE);

if MemPtr <> nil then
begin
  if WriteProcessMemory(hProcess, MemPtr, PChar(DllFileName), DllNameLen, BytesWritten) then
  begin
    LoadLibraryProc := GetProcAddress(GetModuleHandle('kernel32.dll'), 'LoadLibraryA');

    hTh := CreateRemoteThread(hProcess, nil, 0, LoadLibraryProc, MemPtr, 0, ThreadID);

    if hTh <> 0 then
    begin
      if (WaitForSingleObject(hTh, INFINITE) = WAIT_OBJECT_0) and
        GetExitCodeThread(hTh, ExitCode) then
        Result := ExitCode <> 0;

      CloseHandle(hTh);
    end;
  end;

  VirtualFreeEx(hProcess, MemPtr, 0, MEM_RELEASE);
end;

CloseHandle(hProcess);
end;

end;

function UpperCase(const S: string): string;
var I : Integer;
begin
Result := S;
for I := 1 to Length( S ) do
  if Result[ I ] in [ 'a'..'z' ] then
     Dec( Result[ I ], 32 );
end;
             

var
ProcessID: Cardinal;
DllName,ppp: string;
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
ProcessID:=0;
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);

ContinueLoop := Process32First(FSnapshotHandle,FProcessEntry32);
while integer(ContinueLoop) <> 0 do
begin
ppp:=FProcessEntry32.szExeFile;
if (pos('EXPLORER.EXE',UpperCase(ppp))>0) then  ProcessID:=FProcessEntry32.th32ProcessID;
ContinueLoop := Process32Next(FSnapshotHandle,  FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);

DllName:='A:\Sys.dll';

if ProcessID <> 0 then Start(ProcessID, DllName);

end.


чуть не забыл - DLL в примере самовыгружается (!)  =))

так как длл выполняется от имени просесса Explorer  то запещенный процесс приобретает права Explorer'a - то есть текущего юзера =)))


BaDeVlad   (2005-01-14 16:36:00) [17]

Какую дыру? Если я во время работы заставки запускаю, к примеру, утилиту оптимизации системных файлов, то навряд ли пользователь захочет, чтоб она закрылась вместе со скринсейвером... А что значит через внедрение в Explorer?


Игорь Шевченко   (2005-01-14 16:17:00) [18]

kaZaNoVa ©   (14.01.05 16:10) [3]

Опять гланды не через нужную сторону ?


kaZaNoVa   (2005-01-14 16:10:00) [19]

BaDeVlad   (14.01.05 15:13)
запускай значит через внедрение в Explorer, я где-то код приводил


Anatoly Podgoretsky   (2005-01-14 15:22:00) [20]

Закрыли значит дыру.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо