Форум: "WinAPI";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];
ВнизПроцесс запущенный ScreenSaver-ом завершается вместе с ним... Найти похожие ветки
← →
BaDeVlad (2005-01-14 15:13) [0]Делаю программу-заставку. Она запускает некоторое приложение с помощью ShellExecute(0, "open", ApplicationToRun, Parameters, nil, SW_SHOWNORMAL); Почти все хорошо, но если работа моего скринсейвера, запустившего приложение, завершается, то запущенное приложение закрывается тоже. Как этого избежать? Эта "дополнительная возможность" проявляется только под 2000-XP.
← →
Kerk © (2005-01-14 15:15) [1]
> Делаю программу-заставку. Она запускает некоторое
> приложение
ну и изврат :)))
← →
Anatoly Podgoretsky © (2005-01-14 15:22) [2]Закрыли значит дыру.
← →
kaZaNoVa © (2005-01-14 16:10) [3]BaDeVlad (14.01.05 15:13)
запускай значит через внедрение в Explorer, я где-то код приводил
← →
Игорь Шевченко © (2005-01-14 16:17) [4]kaZaNoVa © (14.01.05 16:10) [3]
Опять гланды не через нужную сторону ?
← →
BaDeVlad (2005-01-14 16:36) [5]Какую дыру? Если я во время работы заставки запускаю, к примеру, утилиту оптимизации системных файлов, то навряд ли пользователь захочет, чтоб она закрылась вместе со скринсейвером... А что значит через внедрение в Explorer?
← →
kaZaNoVa © (2005-01-14 16:51) [6]BaDeVlad (14.01.05 16:36) [5]
> А что значит через внедрение в Explorer?
DLLlibrary 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 - то есть текущего юзера =)))
← →
kaZaNoVa © (2005-01-14 16:52) [7]Игорь Шевченко © (14.01.05 16:17) [4]
100% будет нормально работать при условии что есть запущенный Експлорер:)))
← →
kaZaNoVa © (2005-01-14 16:52) [8]забыл сказать, что пашет тока на 2000 и выше
← →
Kerk © (2005-01-14 17:05) [9]kaZaNoVa © (14.01.05 16:51) [6]
Слух.. ты достал уже этим кодом. :))))
← →
Eraser © (2005-01-14 17:15) [10]Kerk ©
Это из xakep.ru ;-))
← →
Kerk © (2005-01-14 17:16) [11]Eraser © (14.01.05 17:15) [10]
ссылку. это мой код.
← →
Kerk © (2005-01-14 17:17) [12]Eraser © (14.01.05 17:15) [10]
ой.. сорри.. ветку перепутал.. :))))))))
← →
Игорь Шевченко © (2005-01-14 17:46) [13]Ну точно, опять гланды вырезаем нетрадиционным способом.
Я напоминаю, что форум WinAPI не является филиалом сайта xakep.ru
Советую особо ретивым подумать.
← →
BaDeVlad © (2005-01-14 18:30) [14]А помочь кто-то может? :)
Я пробовал ShellExecuteEx + SEE_MASK_NOCLOSEPROCESS, не помогает. Чтож-таки делать? Не может быть, чтобы никак не решалась проблема!
← →
Игорь Шевченко © (2005-01-14 23:51) [15]
> А помочь кто-то может? :)
А CreateProcess разве не помогает ?
← →
BaDeVlad © (2005-01-18 09:22) [16]> А CreateProcess разве не помогает ?
Нет.
← →
kaZaNoVa © (2005-01-18 12:13) [17]Удалено модератором
← →
Kerk © (2005-01-18 12:15) [18]Удалено модератором
← →
Игорь Шевченко © (2005-01-18 12:17) [19]
> > А CreateProcess разве не помогает ?
> Нет.
Значит дырку прикрыли, как сказано в [2]. Значит, надо искать другие пути для решения задачи. Кстати, в чем состоит задача, что процесс надо из-под Screen-Saver"а запускать ?
← →
kaZaNoVa © (2005-01-18 13:35) [20]BaDeVlad © (18.01.05 9:22) [16]
[6] пробовал?
← →
alpet (2005-01-20 11:29) [21]Надо запустить попробывать процесс в другом (общем) десктопе. Скринсейвер, winlogon и прочие программы используют отдельный десктоп.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.033 c