-
> NoUser © (18.05.16 17:50) [19]
Ну какое значение имеет, даём мы кому-то кусок памяти или нет... Есть особенность использования. Если завершения всех потоков не получится отследить - я сделаю через SystemThreadEndProc для своих потоков и более сложный и медленный вариант для чужих. Но хочется универсально.
-
Facepalm
-
> Но хочется универсально. Сделай второй калбек (для зачистки), сделай свою длл-ку в которую "передай" его и там вызывай в момент DLL_THREAD_DETACH.
-
> Crysis © (18.05.16 14:56) [16] > А можно поподробнее? > Подойдёт ли этот способ для потоков, созданных вне Delphi?
Что значит "вне Delphi"? Так ты перехватишь создание нити в твоем приложении (за исключением случая CreateRemoteThread из другого процесса)
-
> Rouse_ © (18.05.16 22:54) [23]
Допустим я использую сторонний движок, будь то звуковая библиотека, физика, базы данных. Они написаны на другом языке программирования, исходников нет; зато известно, что они вызывают CreateThread и внутри потока дёргают мой калбек. "Перехват ZwCreateThread" поможет в данной ситуации или нет? Можно поподробнее, как перехватить?
-
-
Спасибо, буду пробовать!
-
> решено поменять принципы обработки данных, задействуя threadvar > и кеширование данных/буферов
- кеширование внешнего контекста в реентерабельной функции - нонсенс... А промежутоные буфера надо выделять на стеке(в пределах отведенных(по умолчанию) ~ 1Мб естественно)...
-
> Rouse_ © (19.05.16 16:04) [25]
А не проще перехватить импорт DLL?
-
> DayGaykin © (19.05.16 20:32) [28] > А не проще перехватить импорт DLL?
Он только для статической линковки, используется.
-
> Rouse_ © (19.05.16 20:37) [29]
Со сплайсингом в многопоточности точно не без проблем обойдется, да еще если на 64 битах запускать.
-
Если правильно делать с использование хотпатча (атомарной замены 2 байт в области нопов в прологе функции) - никаких проблем не будет. Этож штатный механизм.
-
В частности в 64 битах делается воот так: Вот тело ZwCreateThread (адрес точки входа 77AFD890), перед ней идет пятибайтный длинный NOP
77AFD88B: 0F 1F 44 00 00 nop dword ptr [rax+rax+00h]
77AFD890: B8 DB 3C 03 00 mov eax, 00033CDBh
77AFD895: 48 63 C0 movsxd rax, rax
77AFD898: FF E0 jmp rax
77AFD89A: C3 ret первым шагом делаем установку джампа в область длинного нопа, вторым шагом - атомарно (через LOCK XCHG) джамп на эту область вместо инструкции JMP RAX (для других функций вместо него будет SYSCALL)
-
> Rouse_ © (19.05.16 21:10) [31] > Если правильно делать с использование хотпатча (атомарной > замены 2 байт в области нопов в прологе функции) - никаких > проблем не будет. Этож штатный механизм.
Если я правильно помню, условия хот-патча не выполняются если программа запущена в 64хбитной ос.
-
> Leonid Troyanovsky © (18.05.16 14:02) [15]
Вот набросал пример, без всякой оптимизации и контроля ошибок.
type
TMItem = packed record
ThreadId: Cardinal;
OTHandle: THandle;
Data: DWord;
end;
PMItem = ^TMItem;
var
ftl: TThreadList;
function GetDataPtr: PDWord;
var
i: Longint;
pmi: PMItem;
exCode: Cardinal;
begin
Result := nil;
with ftl.LockList do
try
for i:= Count-1 downto 0 do
begin
pmi := PMItem(List[i]);
if pmi.ThreadId = GetCurrentThreadId then
begin
Result := @pmi.Data;
Continue;
end;
GetExitCodeThread(pmi.OTHandle, exCode);
if ExCode <> STILL_ACTIVE then
begin
OutputDebugString(PChar(IntToStr(ExCode)));
CloseHandle(pmi.OTHandle);
Dispose(pmi);
Delete(i);
end;
end;
if Result = nil then
begin
New(pmi);
pmi.ThreadId := GetCurrentThreadId;
DuplicateHandle( GetCurrentProcess,
GetCurrentThread,
GetCurrentProcess,
@pmi.OTHandle,
0,
False,
DUPLICATE_SAME_ACCESS);
pmi.Data := 0;
Add(pmi);
Result := @pmi.Data;
end;
finally
ftl.UnlockList;
end;
end;
type
TMyThread = class(TThread)
procedure Execute; override;
end;
procedure TMyThread.Execute;
var
pData: PDWord;
begin
pData := GetDataPtr;
pData^ := Random(10000);
Sleep (pData^);
ReturnValue := pData^;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ftl := TThreadList.Create;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
TMyThread.Create(False).FreeOnTerminate := True;
end;
Смотрим в EventLog. -- Regards, LVT.
-
> DayGaykin © (20.05.16 03:33) [33] > Если я правильно помню, условия хот-патча не выполняются > если программа запущена в 64хбитной ос.
Все выполняется иначе как бы перехваты в моем софте работали?
-
А, или ты про 32 битный софт в 64 битной ОС? Да, там некоторые функции идут без пролога, но там тоже можно пошаманить
-
> Rouse_ © (20.05.16 09:37) [36] > А, или ты про 32 битный софт в 64 битной ОС? Да, там некоторые > функции идут без пролога, но там тоже можно пошаманить
Да-да. Ты мне про это, кстати, и говорил.
-
Почему бы не поменять способ работы на что-то типа BeginUpdate;
EndUpdate; ?
|