быть так, что
GetProcAddress( GetModuleHandle( "kernel32.dll" ), "SetThreadDescription" )
вернёт ненулевое значение при отсутствии SetThreadDescription() в системе? заявлена поддержка этой функции в Windows Server 2016+, проверяю на 2012 - типа какой-то адрес возвращается??
хелп от вин32 апи нынче любит лапшу на уши вешать. у них даже функции из 3.11 поддерживаются только в десятке
дык, проблема в том, что я получаю какой-то адрес, пытаюсь вызвать функцию и получаю AV
Ну вот у меня этой функции нету в кернел32.длл. >tcc - -run #include <stdio.h> #include <windows.h> int main(){ printf("%08x\n", GetProcAddress(GetModuleHandle("kernel32.dll"), "SetThreadDescr iption")); return 0;} ^Z 00000000 работает как полагается по документации
семерка
посмотри каким-нить вьювером, есть ли такая функция в кернел32.длл
https://stackoverflow.com/questions/62243162/how-to-access-setthreaddescription-in-windows-2016-server-version-1607
а какое конкретно значение gpA возвращает?
так можно в самой dll-ке посмотреть экспорт
а вот хороший вопрос!!! сейчас сделал из дельфи вызвал - 0 ! а из DLL как буд-то даже если функция пытается загрузиться - сразу AV
Ты можешь в принципе не искать SetThreadDescription, а дергать напрямую. NtSetInformationThread даже в nt4 есть. А вот саму поддержку ThreadNameInformation можешь по результату проверять. STATUS_SUCCES если все норм, в противном случае будет STATUS_INVALID_INFO_CLASS pascal type NTSTATUS = Cardinal; ULONG = Cardinal; _UNICODE_STRING = record Length: WORD; MaximumLength: WORD; Buffer: PWideChar; end; UNICODE_STRING = _UNICODE_STRING; PTHREAD_NAME_INFORMATION = ^THREAD_NAME_INFORMATION; _THREAD_NAME_INFORMATION = record ThreadName: UNICODE_STRING; end; THREAD_NAME_INFORMATION = _THREAD_NAME_INFORMATION; function NtSetInformationThread(ThreadHandle: THandle; ThreadInformationClass: Integer; ThreadInformation: Pointer; ThreadInformationLength: ULONG): NTSTATUS; stdcall; external 'ntdll.dll'; function SetThreadDescription(hThread: THandle; lpThreadDescription: PWideChar): HRESULT; const ThreadNameInformation = 38; var NameInfo: THREAD_NAME_INFORMATION; begin NameInfo.ThreadName.Length := Length(lpThreadDescription) shl 1; NameInfo.ThreadName.MaximumLength := NameInfo.ThreadName.Length + 2; NameInfo.ThreadName.Buffer := lpThreadDescription; Result := NtSetInformationThread(hThread, ThreadNameInformation, @NameInfo, SizeOf(NameInfo)); end;
Обсуждают сегодня