Текущий архив: 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