![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Корректная по времени уснановка Hook'а.
Riply © (2007-04-09 10:33:00)Здравствуйте !
Неожиданно(а может и закономерно) столкнулась со следующим фактом:
Пробуем создать процесс и тут же установить на него персональный Hook (WH_SHELL).
type
TSetLibHook = function(const HookType, ThreadId: DWord): DWord; stdcall;
function ExecuteAndSetHook(const ExeName, LibName, FunctName: string; HookID: DWord): Boolean;
var
hLib: THandle;
LastErr: integer;
SetLibHook: TSetLibHook;
Proc_Info: PROCESS_INFORMATION;
begin
Result := False;
hLib := LoadLibrary(PChar(LibName));
if hLib <> 0 then
try
@SetLibHook := GetProcAddress(hLib, PChar(FunctName));
if Assigned(@SetLibHook) then
begin
FillChar(Proc_Info, SizeOf(PROCESS_INFORMATION), 0);
if Process_Create(SpyExeName, '', ExtractFileDir(ExeName), SW_SHOWDEFAULT, Proc_Info) then
try
// Sleep(1000);
LastErr := SetLibHook(HookID, Proc_Info.dwThreadId);
Log_WriteError('SetLibHook', LastErr);
Result := LastErr = ERROR_SUCCESS;
finally
ProcessInfo_CloseHandles(@Proc_Info);
end;
end;
finally
FreeLibrary(hLib);
end;
end;
SetLibHook в Dll'ке:
function Hook_SetThread(const HookType, ThreadId: DWord): DWord; export; stdcall;
begin
pHookData^.Hook := SetWindowsHookEx(HookType, @ShellHookProc, hInstance, ThreadId);
if pHookData^.Hook <> 0 then Result := ERROR_SUCCESS else Result := GetLastError;
end;
Проблемма в следующем:
Если убрать комментарии у Sleep(1000), то все работает, а если оставить,
то получим ошибку: "The parameter is incorrect".
Мне инересно: это у меня напартачено, или так и должно быть ?
Если так и должно быть, то как подождать возможности безопасно поставить Hook и почему это происходит ?
Сергей М. (2007-04-09 10:47:00) [21]hMod
Identifies the DLL containing the hook procedure pointed to by the lpfn parameter. The hMod parameter must be set to NULLif the dwThreadId parameter specifies a thread created by the current process and if the hook procedure is within the code associated with the current process.