Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.06;
Скачать: CL | DM;

Вниз

Процесс запущенный 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?


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 - то есть текущего юзера =)))


 
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 вся ветка

Текущий архив: 2005.03.06;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.059 c
3-1107415989
Маугли
2005-02-03 10:33
2005.03.06
Crystall Report


6-1103348192
Atomic2004
2004-12-18 08:36
2005.03.06
MailSlot


14-1108457319
BPK
2005-02-15 11:48
2005.03.06
Не совсем удобный форум


14-1108301049
Verg
2005-02-13 16:24
2005.03.06
Как называлась статуя или изображение....


14-1108328321
Kolan
2005-02-13 23:58
2005.03.06
Подскажите программу для рисования иконок (Не ImegeEditor)