Здравствуйте, гость ( Вход | Регистрация )

2 страниц V  1 2 >  
Ответить в эту темуОткрыть новую тему
> ffi pid по hwnd
DarkMaster
сообщение 17.2.2024, 16:59
Сообщение #1


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27725
Пользователь №: 11.279



Господа, а как дернуть pid по hwnd?
Я так люблю виндовые переопределения типов... Задолбался уже...
Во 1 GetWindowThreadProcessId я же правильно понимаю, что это НЕ оно? Он же id потока вернет?
GetProcessHandleFromHwnd требует чтобы ему передали HWND__. Что есть это нашлась только одна страничка с гордой структурой из одного инта. Как еще через ffi воссоздать не понимаю. Объявляю define, делаю ffi.new('HWND__[1]' говорит declaration specifier expected near 'HWND__'...


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 17.2.2024, 17:36
Сообщение #2


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27725
Пользователь №: 11.279



хэндл естественно имеет type number луашный. workwindow()


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 17.2.2024, 21:09
Сообщение #3


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21064
Пользователь №: 16.156



Не, ну чего ты как маленький...

https://learn.microsoft.com/en-us/windows/w...dows-data-types


Берешь свой HWND и распутываешь до С-совместимого типа. А вообще все должно прекрасно кастится к интам/войдам, Да там в целом вариантов то других и нет

Цитата
Во 1 GetWindowThreadProcessId я же правильно понимаю, что это НЕ оно? Он же id потока вернет?


Оно, из доки:

Цитата
[out, optional] lpdwProcessId

Тип: LPDWORD

Указатель на переменную, получающую идентификатор процесса. Если этот параметр не имеет значение NULL, GetWindowThreadProcessId копирует идентификатор процесса в переменную ; В противном случае — нет. Если функция завершается сбоем, значение переменной не изменяется.


И вообще на будущее - всякие ffi работают только с Си типами. Изначально кормить их чем-то не из списка не имеет смысла как правило. Сразу ищи как кастовать свой тип к сишному
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 18.2.2024, 5:42
Сообщение #4


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27725
Пользователь №: 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____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 18.2.2024, 11:13
Сообщение #5


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26745
Пользователь №: 16.971
Возраст: 29



Код
--lua
local ffi = require("ffi")
local user = ffi.load('User32')
log 'clear' log 'mode compact'

ffi.cdef[[
    typedef unsigned long   DWORD;
    typedef DWORD           *LPDWORD;
    struct HWND__ { int unused; }; typedef struct HWND__ *HWND;
    DWORD GetWindowThreadProcessId( HWND    hWnd, LPDWORD lpdwProcessId );
]]

local pid = ffi.new('DWORD[1]')
user.GetWindowThreadProcessId(ffi.cast('HWND', workwindow()), pid)
log(tonumber(pid[0]))

Или так:
Код
--lua
local ffi = require("ffi")
local user = ffi.load('User32')
log 'clear' log 'mode compact'

ffi.cdef[[
    typedef unsigned long   DWORD;
    typedef DWORD           *LPDWORD;
    DWORD GetWindowThreadProcessId( unsigned long    hWnd, LPDWORD lpdwProcessId );
]]

local pid = ffi.new('DWORD[1]')
user.GetWindowThreadProcessId(workwindow(), pid)
log(tonumber(pid[0]))
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 18.2.2024, 12:08
Сообщение #6


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27725
Пользователь №: 11.279



GetWindowThreadProcessId вернет разве id процесса? Он же потока возвращает. В этом то и суть проблемы. C GetWindowThreadProcessId работало и у меня =)


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 18.2.2024, 13:27
Сообщение #7


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21064
Пользователь №: 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
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 18.2.2024, 13:38
Сообщение #8


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27725
Пользователь №: 11.279



Цитата
А откуда ты взял HWND___ ?

Это мне луа выкидывает ошибку что не может к нему прикастовать. Еще раз. Мне НЕ нужен хэндл ПОТОКА нужен хендл ПРОЦЕССА. Хэндл потока дергается исправно.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 18.2.2024, 13:50
Сообщение #9


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26745
Пользователь №: 16.971
Возраст: 29



GetWindowThreadProcessId возвращает ид потока, в переменную ид процесса.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 18.2.2024, 14:29
Сообщение #10


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27725
Пользователь №: 11.279



мля а вот теперь стыдно стало =)
тем не менее GetProcessHandleFromHwnd почему не шуршит то? прям зацепило...


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 18.2.2024, 16:37
Сообщение #11


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26745
Пользователь №: 16.971
Возраст: 29



Цитата
ole.GetProcessHandleFromHwnd(hwnd[1])

Цитата
тем не менее GetProcessHandleFromHwnd почему не шуршит то?

Индексация начинается с 0.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 18.2.2024, 18:41
Сообщение #12


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27725
Пользователь №: 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____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 18.2.2024, 18:42
Сообщение #13


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21064
Пользователь №: 16.156



А почему вообще оле используется ? Зачем он тут
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 18.2.2024, 19:17
Сообщение #14


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26745
Пользователь №: 16.971
Возраст: 29



Проще так:
Код
--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())
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 18.2.2024, 19:34
Сообщение #15


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27725
Пользователь №: 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____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 18.2.2024, 21:35
Сообщение #16


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21064
Пользователь №: 16.156



Цитата
ну и возврат тоже указателя. Лог выводит ерунду, я так подозреваю указатель.


хендл и есть по сути указатель. если бы функция не работала, то выводился бы 0, null, nil или что у вас там в луа
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 19.2.2024, 3:58
Сообщение #17


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27725
Пользователь №: 11.279



Цитата
хендл и есть по сути указатель.

при попытке засунуть туда указатель ловлю маты на невозможность прикастовать к HWND__. Собственно с чего все и начиналось.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 19.2.2024, 9:00
Сообщение #18


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21064
Пользователь №: 16.156



Куда туда ? Зачем что то засовывать, если cirus дал конечный код. Если у тебя при его использовании выводится в лог не 0, то все работает.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 19.2.2024, 9:20
Сообщение #19


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27725
Пользователь №: 11.279



Цитата
Куда туда ?

в GetProcessHandleFromHwnd
Цитата
Зачем что то засовывать, если cirus дал конечный код.

Не рабочий.
Цитата
Если у тебя при его использовании выводится в лог не 0, то все работает.

Если функция что-то возвращает, то это не значит, что она работает корректно.

Полученное значение слишком мало, чтобы быть указателем ~800 и увеличивается при каждом запуске, что характерно для создания новых указателей. При попытке прочитать данный указатель получаем тихий краш скрипта, что явно напоминает попытку чтения неразмечнной области памяти.

Так же если функция ожидает получить на входе _указатель_ и планирует вренуть на выходе _указатель_ и нет каких либо упоминаний оперегрузке функции, то мне действительно кажется это не правильным пытаться туда пихать данные напрямую. В моем понимании в таком виде это не может работать. При передаче указателя я получаю ошибку невозможности прикастовать к HWND__.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 19.2.2024, 10:52
Сообщение #20


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27725
Пользователь №: 11.279



user.GetWindowThreadProcessId(ffi.cast('HWND', workwindow()), pid)

Работает на пилоте, на блокноте не хочет. На Notepad++ работает, если привязать к заголовку, но не работает, если привязать к рабочей области...


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

2 страниц V  1 2 >
Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 27.4.2024, 22:03
Designed by Nickostyle