Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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?


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

Форум: "WinAPI";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.033 c
4-1106205976
Cosinus
2005-01-20 10:26
2005.03.06
Реально ли узнать Handle главного окна приложения, вызвавшего


11-1089554522
Андрей
2004-07-11 18:02
2005.03.06
ToolBar - Решение странной проблемы


14-1108113513
P.N.P.
2005-02-11 12:18
2005.03.06
Мир InterBase. 3-е издание


3-1107328157
Mishenka
2005-02-02 10:09
2005.03.06
Перемещение столбцов в TDbGridEh


1-1108893154
XfroSt
2005-02-20 12:52
2005.03.06
мышка на форме...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский