![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Процесс запущенный ScreenSaver-ом завершается вместе с ним... [D5, WinXP]
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]Закрыли значит дыру.