|
ffi pid по hwnd |
|
|
Cockney |
17.2.2024, 21:09
|
Master
Сообщений: 1.402
Регистрация: 22.6.2013 Группа: Пользователи Наличность: 21916
Пользователь №: 16.156
|
Не, ну чего ты как маленький... https://learn.microsoft.com/en-us/windows/w...dows-data-typesБерешь свой HWND и распутываешь до С-совместимого типа. А вообще все должно прекрасно кастится к интам/войдам, Да там в целом вариантов то других и нет Цитата Во 1 GetWindowThreadProcessId я же правильно понимаю, что это НЕ оно? Он же id потока вернет? Оно, из доки: Цитата [out, optional] lpdwProcessId
Тип: LPDWORD
Указатель на переменную, получающую идентификатор процесса. Если этот параметр не имеет значение NULL, GetWindowThreadProcessId копирует идентификатор процесса в переменную ; В противном случае — нет. Если функция завершается сбоем, значение переменной не изменяется. И вообще на будущее - всякие ffi работают только с Си типами. Изначально кормить их чем-то не из списка не имеет смысла как правило. Сразу ищи как кастовать свой тип к сишному
|
|
|
|
DarkMaster |
18.2.2024, 5:42
|
Модератор UOPilot
Сообщений: 9.573
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 28548
Пользователь №: 11.279
|
Ну так я был там. В том и проблема, что HWND__ там нет. О нем вообще описание от майкрософта "сами напрямую использовать не можете" и на этом все. GetProcessHandleFromHwnd требует его. По крайней мере луа орет на него. Попытки объявить эту структуру ни к чему не привели. В доках требуется HWND, а не HWND__. Код ffi.cdef([[ typedef void * PVOID; typedef PVOID HANDLE; typedef HANDLE HWND;
typedef unsigned long DWORD; HANDLE GetProcessHandleFromHwnd(HWND hwnd); DWORD GetProcessId(HANDLE Process); ]]) local ole = ffi.load('Oleacc.dll') --local user, kernel = ffi.load('User32'), ffi.load('Kernel32')
local PROCESS_VM_READ = 0x0010 function readDword(address) if workwindow() == 0 then log('No Workwindow') return -1 end
local PID, pointer_int, hwnd = ffi.new('unsigned long[1]'), ffi.new('int[1]'), ffi.new('HWND[1]') local puint = ffi.new('unsigned int[1]')
puint[1] = workwindow() hwnd = ffi.cast("HWND", puint) log(tostring(hwnd))
PID[1] = ole.GetProcessHandleFromHwnd(hwnd[1])
в таком варианте орет cannot convert 'void *' to 'unsigned int' при попытке дернуть хэндл процесса (я в курсе, что там не pid).
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
Cockney |
18.2.2024, 13:27
|
Master
Сообщений: 1.402
Регистрация: 22.6.2013 Группа: Пользователи Наличность: 21916
Пользователь №: 16.156
|
Цитата(DarkMaster @ 18.2.2024, 5:42) Ну так я был там. В том и проблема, что HWND__ там нет. О нем вообще описание от майкрософта "сами напрямую использовать не можете" и на этом все. GetProcessHandleFromHwnd требует его. По крайней мере луа орет на него. Попытки объявить эту структуру ни к чему не привели. В доках требуется HWND, а не HWND__. Код ffi.cdef([[ typedef void * PVOID; typedef PVOID HANDLE; typedef HANDLE HWND;
typedef unsigned long DWORD; HANDLE GetProcessHandleFromHwnd(HWND hwnd); DWORD GetProcessId(HANDLE Process); ]]) local ole = ffi.load('Oleacc.dll') --local user, kernel = ffi.load('User32'), ffi.load('Kernel32')
local PROCESS_VM_READ = 0x0010 function readDword(address) if workwindow() == 0 then log('No Workwindow') return -1 end
local PID, pointer_int, hwnd = ffi.new('unsigned long[1]'), ffi.new('int[1]'), ffi.new('HWND[1]') local puint = ffi.new('unsigned int[1]')
puint[1] = workwindow() hwnd = ffi.cast("HWND", puint) log(tostring(hwnd))
PID[1] = ole.GetProcessHandleFromHwnd(hwnd[1])
в таком варианте орет cannot convert 'void *' to 'unsigned int' при попытке дернуть хэндл процесса (я в курсе, что там не pid). А откуда ты взял HWND___ ? Правильно тебе говорят что это кишки какие то винды, а для обычного вин апи требуется hwnd. Мне кажется что ты смотришь не на ту функцию в документации, или не на ту документацию https://learn.microsoft.com/ru-ru/windows/w...threadprocessid
|
|
|
|
DarkMaster |
18.2.2024, 18:41
|
Модератор UOPilot
Сообщений: 9.573
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 28548
Пользователь №: 11.279
|
Код ffi.cdef([[ typedef void * PVOID; typedef PVOID HANDLE; typedef HANDLE HWND;
typedef unsigned long DWORD; typedef DWORD * LPDWORD;
HANDLE GetProcessHandleFromHwnd(HWND hwnd); DWORD GetProcessId(HANDLE Process);
int OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId); int GetWindowThreadProcessId(int hWnd, int *lpdwProcessId); bool CloseHandle(int hObject); bool ReadProcessMemory(int hProcess, int lpBaseAddress, void *lpBuffer, int nSize, int *lpNumberOfBytesRead); int GetModuleHandleA(const char *lpModuleName); ]]) local ole = ffi.load('Oleacc.dll') local user, kernel = ffi.load('User32'), ffi.load('Kernel32')
local PROCESS_VM_READ = 0x0010 function readDword(address) if workwindow() == 0 then log('No Workwindow') return -1 end
local PID, pointer_int, hwnd = ffi.new('unsigned long[1]'), ffi.new('int[1]'), ffi.new('unsigned int[1]') local puint = ffi.new('unsigned int[1]')
puint[0] = workwindow() hwnd = ffi.cast("HWND", puint) -- log(tostring(hwnd))
local pvoid = ole.GetProcessHandleFromHwnd(hwnd) log(tostring(pvoid)) local r = ffi.cast("unsigned int * ", pvoid) log(tostring(r)) log(tostring(r[0])) log(tonumber(r[0])) log"wtf"
Возваращет указатель на NULL, при чтении r[0] естественно краш(только скрипта). Ну не сишник я. Не судите строго. У меня и си давняя история, но не очень счастливая. Как бы я ни уважал его - душа не лежит(
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
DarkMaster |
18.2.2024, 19:34
|
Модератор UOPilot
Сообщений: 9.573
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 28548
Пользователь №: 11.279
|
Цитата А почему вообще оле используется ? Зачем он тут потому что нужна либа с этой функцией ole ее содержит. Допускаю, что она к нему прилинкована от другой либы. Цитата --lua local ffi = require("ffi") log 'clear' log 'mode compact'
ffi.cdef([[ unsigned int GetProcessHandleFromHwnd(unsigned int hwnd); ]]) local ole = ffi.load('Oleacc.dll')
function readDword() if workwindow() == 0 then log('No Workwindow') return -1 end return ole.GetProcessHandleFromHwnd(workwindow()) end
log (readDword()) вроде как синтаксис предполагает передачу указателей, а не значений. HANDLE WINAPI GetProcessHandleFromHwnd( _In_ HWND hwnd ); ну и возврат тоже указателя. Лог выводит ерунду, я так подозреваю указатель.
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
DarkMaster |
19.2.2024, 9:20
|
Модератор UOPilot
Сообщений: 9.573
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 28548
Пользователь №: 11.279
|
Цитата Куда туда ? в GetProcessHandleFromHwnd Цитата Зачем что то засовывать, если cirus дал конечный код. Не рабочий. Цитата Если у тебя при его использовании выводится в лог не 0, то все работает. Если функция что-то возвращает, то это не значит, что она работает корректно. Полученное значение слишком мало, чтобы быть указателем ~800 и увеличивается при каждом запуске, что характерно для создания новых указателей. При попытке прочитать данный указатель получаем тихий краш скрипта, что явно напоминает попытку чтения неразмечнной области памяти. Так же если функция ожидает получить на входе _указатель_ и планирует вренуть на выходе _указатель_ и нет каких либо упоминаний оперегрузке функции, то мне действительно кажется это не правильным пытаться туда пихать данные напрямую. В моем понимании в таком виде это не может работать. При передаче указателя я получаю ошибку невозможности прикастовать к HWND__.
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|