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

Вниз

Как закрыть Dll ку по завершении?   Найти похожие ветки 

 
Valentin   (2005-08-08 15:51) [0]

Моя Dll"ка работает всего минуту, после чего вырубается, как можно привязать её к работе программы, так чтобы она работала ровно столько же и выключалась вместе с завершением программы?

Код Dll:

library Project1;

uses

Windows,Messages;

Var

SavedProc: pointer;

ThreadID,id:cardinal;

ready:boolean;

function GethWnd: HWND;

begin

result:= FindWindow(Pchar("SAS Window class"),Pchar("SAS window") );

end;

function MyWndProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;

begin

ready:=false;

 if  msg=WM_HOTKEY then  begin

// Поймали HOTKEY CAD (CSE) - выводим сообщение на десктоп "Default" и затем выходим

if( MAKELONG( MOD_CONTROL or MOD_ALT, VK_DELETE ) = lParam )then

begin

result:= 0;

ready:=True;

end;

if( MAKELONG( MOD_CONTROL or  MOD_SHIFT, VK_ESCAPE ) = lParam ) then

begin

result:= 0;

ready:=True;

end;

if not ready then result:= CallWindowProc(SavedProc, hWnd, Msg, wParam, lParam);

                           end

else  result:= CallWindowProc(SavedProc, hWnd, Msg, wParam, lParam);

end;

procedure SetWndProc(hWnd: HWND);

begin

SavedProc:= pointer(SetWindowLong(hWnd, GWL_WNDPROC, cardinal(@myWndProc)));

end;

procedure UnSetWndProc(hWnd: HWND);

begin

SavedProc:= pointer(SetWindowLong(hWnd, GWL_WNDPROC, cardinal(SavedProc)));

end;

function thread:integer; stdcall;

begin

SetWndProc(GethWnd);

sleep(60*1000); // помоему проблема сдесь!!

//PostMessage(HWND_BROADCAST,WM_HOTKEY,0, MAKELONG(MOD_CONTROL or MOD_ALT, VK_DELETE ) ); //CAD

UnSetWndProc(GethWnd);

sleep(10);

thread:=0;

CreateThread(nil,0,GetProcAddress(GetModuleHandle("kernel32"),"FreeLibrary"),pointer(hInstance),0,id);

end;

begin

//MessageBoxEx(0,"Ctrl + Shift + Esc","FIGA2", MB_DEFAULT_DESKTOP_ONLY, 0 );

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

end.


А вот код программы:

program loader;

uses

Windows,SysUtils,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;

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("WINLOGON",UpperCase(ppp))>0) then  ProcessID:=FProcessEntry32.th32ProcessID;

ContinueLoop := Process32Next(FSnapshotHandle,  FProcessEntry32);

end;

CloseHandle(FSnapshotHandle);

DllName:="C:\Documents and Settings\Vania\My Documents\cad_zamena\Project1.dll";

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

end.


 
Digitman ©   (2005-08-08 15:59) [1]


> чтобы она работала


что значит "работала" ?

ЧТО под "работой" подразумевается ?


 
Valentin   (2005-08-08 16:10) [2]

Чтобы она блокировали Ctrl+Alt+Del и Ctrl+Shift+Esc только на время работы программы, а не на столько на сколько хватает sleep


 
Digitman ©   (2005-08-08 16:26) [3]


> Чтобы она блокировали


я спрашиваю - ЧТО ЕСТЬ работа DLL ?!

п/программа ее инициализации ?
п/программы, выполняемые при вызове тех или иных эксп.ф-ций этой DLL ?

?!


 
Valentin   (2005-08-08 16:33) [4]

Я не знаю писал то её не я она лежит на исходниках.ру


 
Poirot ©   (2005-08-08 17:36) [5]

Valentin   (08.08.05 16:33) [4]
Имеется ввиду когда она работет кто её вызывает.. это эе не ехе который может запужен быть и поработав выгружен быть!!!
Где-то дб прога, которая это всё запускает.. дык вот -где эта прога!!! Или сформулируй вопрос корректнее!


 
3DxFantastika ©   (2005-08-08 17:59) [6]

Valentin

> она лежит на исходниках.ру

неправда!
ссылка на эту программу:
http://kladovka.net.ru/index.cgi?pid=list&rid=84

совет тебе - тот sleep - замени на ожидание события или какую-нить проверку ставь ..


 
Valentin   (2005-08-08 19:05) [7]

[6]
Если бы я знал как седлать это, то наверное уже сделал бы.
Именно по этому и прошу вашей помощи.


 
3DxFantastika ©   (2005-08-08 19:20) [8]

Valentin   (08.08.05 19:05) [7]
учитывай что DLL работает в контексте процесса Winlogon и оттуда простой FindWindow() заголовка формы не поможет ..

мой совет - поучи способы межпрограммной синхронизации, извини, но с твоим уровнем программирования писать подобные программы рановато ..


 
3DxFantastika ©   (2005-08-08 19:27) [9]

и с какой целью ты перехватываешь Ctrl+Alt+Del?
может есть более простое и естественное решение?


 
Valentin   (2005-08-08 19:32) [10]

Нет более простого способа я не нашёл.
Может всётаки подскажете как сделать чтобы активность работы 3х клавишь восстанавливазась по завершении работы программы, а не по истечении sleep?!


 
n0name   (2005-08-08 21:04) [11]

loader:
перед загрузкой DLL: CreateEventA
перед завершением: SetEvent
DLL:
OpenEventA
WatForSingleObject
Там где надо подождать


 
Valentin   (2005-08-08 23:24) [12]

n0name   (08.08.05 21:04) [11]
[8] - наверное правильно сказал мне ещё не хватает мозгов.
Так что если не затруднит - перепишите вышеуказанный код.


 
n0name   (2005-08-09 04:04) [13]

Я написал так, образно %)
Глобальные переменные:
var
...
hEvent: THandle;
...

В начале кода:
hEvent:=CreateEvent(nil, false, false, "Simple Name");
В конце кода:
SetEvent(hEvent);
CloseHandle(hEvent);

В DLL где надо подождать:
Локальные переменные:
var
...
hEvent: THandle;
...
hEvent:=OpenEvent(EVENT_ALL_ACCESS, false, "Simple Name");
WaitForSingleObject(hEvent, INFINNITE);


 
Alexander Panov ©   (2005-08-09 04:28) [14]

Рекомендую поучиться сначала, прежде чем братьсяза освоение вирусных технологий



Страницы: 1 вся ветка

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

Наверх




Память: 0.51 MB
Время: 0.046 c
2-1123411165
panov
2005-08-07 14:39
2005.10.02
Правила конференции.


6-1117745556
Delphi_is_cool
2005-06-03 00:52
2005.10.02
Объекты виндовс


14-1126590459
КаПиБаРа
2005-09-13 09:47
2005.10.02
Самая интересная тема


14-1126027956
Nous Mellon_
2005-09-06 21:32
2005.10.02
html-засада


1-1126079154
psa247
2005-09-07 11:45
2005.10.02
DoubleClick по RichEdit