|
ffi pid по hwnd |
|
|
Cockney |
19.2.2024, 11:31
|
Master
Сообщений: 1.402
Регистрация: 22.6.2013 Группа: Пользователи Наличность: 21916
Пользователь №: 16.156
|
Цитата Если функция что-то возвращает, то это не значит, что она работает корректно
Крамольную вещь напишу - мне кажется лучше всего полагаться на поведение, описанное в документации. Если там написано, что все что не 0 это ок, значит так оно и есть. Цитата Полученное значение слишком мало, чтобы быть указателем ~800 и увеличивается при каждом запуске, что характерно для создания новых указателей Хендл не обязан быть указателем в том понимании которое ты закладываешь. Он просто как тип совместим с ним. Например, getmodulehandle вернет указатель, из которого можно читать, а все остальные функции могут и не дать таких гарантий. И инкремент это не признак указателя, это простейший счётчик дескрипторов, чем хендл и является
|
|
|
|
DarkMaster |
19.2.2024, 11:58
|
Модератор UOPilot
Сообщений: 9.573
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 28548
Пользователь №: 11.279
|
Цитата Не проще посмотреть пример чтения памяти? Гут ссылка. Тем не менее есть вопрос =) ты объявляешь: bool ReadProcessMemory(int hProcess, int lpBaseAddress, void *lpBuffer, int nSize, int *lpNumberOfBytesRead) при том что BOOL ReadProcessMemory( [in] HANDLE hProcess, [in] LPCVOID lpBaseAddress, [out] LPVOID lpBuffer, [in] SIZE_T nSize, [out] SIZE_T *lpNumberOfBytesRead ); Т.е. вместо указателей опять объявлены сами данные. Как? Почему? Тоже самое в в GetProcessHandleFromHwnd аналогично. При этом, если закидывать указатели, то не работает, а с данными шуршит. В чем прикол? У меня походу какое-то глобальное непонимание манов =\
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
DarkMaster |
19.2.2024, 19:42
|
Модератор UOPilot
Сообщений: 9.573
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 28548
Пользователь №: 11.279
|
Банально взять тот же ReadProcessMemory по майкрософту он BOOL ReadProcessMemory( [in] HANDLE hProcess, [in] LPCVOID lpBaseAddress, [out] LPVOID lpBuffer, [in] SIZE_T nSize, [out] SIZE_T *lpNumberOfBytesRead ); HANDLE это цепочка typedef void * PVOID; typedef PVOID HANDLE; Т.е. по сути у нас должен отправиться указатель на данные. Ну т.е. типа принимающая функция ее должна разыменовать и работать с данными. cirus передает не указатель на данные, а непосредственно int с данными: bool ReadProcessMemory(int hProcess, int lpBaseAddress, void *lpBuffer, int nSize, int При этом указатель не пашет, а инт пашет. Учитывая сказанное тобой выше про то, что хэндл это не совсем указатель единственное, что мне приходит в голову, что есть некоторый лист хэндлов, а тип данных тут от балды и в целевой функции нет разыменовывания и данные используются напрямую (типа индекса в листе). Но зачем тогда городить указатели, а не объявить изначально хэндл интом я вообще не понимаю. Указатель должен указывать на адрес, а он(когда там хэндл) указывает на не аллоцированную область.
Вся цепочка проблем с которыми я столкнулся по сути одинаковая в каждой функции. Я хэндл воспринимал, как указатель на данные (а по typedef так и есть), а там сами данные...
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
Aqualon |
20.2.2024, 2:15
|
Neophyte
Сообщений: 23
Регистрация: 21.3.2023 Группа: Пользователи Наличность: 0
Пользователь №: 20.503
Возраст: 22
|
Да, возвращает GetWindowThreadProcessId действительно thread id, но там есть out параметр для пида. Скопипасчу пример кода из адаптера для винапи который я сделал. Код local WinUser = ffi.load('User32') ffi.cdef[[ int __stdcall GetWindowThreadProcessId(int hWnd, int *lpdwProcessId); ]] local WinApiInterface = {}
function WinApiInterface.GetWindowThreadProcessId(handle) local pid = ffi.new("int[1]") local threadId = WinUser.GetWindowThreadProcessId(handle, pid) assert(threadId ~= 0, 'GetWindowThreadProcessId error: incorrect handle passed: '..handle) return { pid = pid[0], threadId = threadId } end
return WinApiInterface
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|