101

Re: AHK: Передать структуру

svoboden пишет:

524 * 2 это верное смещения id.

Смещение-то верное, но подсчёт неверный, просто попали пальцем в небо.
Указатель на строку ничем не отличается от любого другого указателя.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

102 (изменено: svoboden, 2021-07-03 11:00:35)

Re: AHK: Передать структуру

Почему в небо, я же смог подсчитал Юникод структуру как-то. А как их передавать указатели на строку?

103

Re: AHK: Передать структуру

svoboden пишет:

я же смог подсчитал Юникод структуру как-то

Как подсчитали? Я и предлагал показать, как именно. Использование 524 * 2 говорит о том, что не понимаете, как считать. Откуда это 524 взялось, и почему его нужно на 2 умножать?

svoboden пишет:

А как их передавать указатели на строку?

Через NumPut по нужному смещению:

NumPut(&str, &struct + offset)
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

104 (изменено: svoboden, 2021-07-03 11:37:51)

Re: AHK: Передать структуру

wchar_t - это Юникод строка, * 2. А 524 я же писал уже:

• По смещению 0 есть UInt.
• По смещению 4 есть 520 длинных массивов символов.
• По смещению 524 есть UInt.

А про указатели я не понял, а как узнать их смещения.
И как передать 0 тут:

NumPut(&str, &struct + offset)

105

Re: AHK: Передать структуру

svoboden пишет:

* 2 - это Юникод строка. А 524 я же писал уже:

• По смещению 0 есть UInt.
• По смещению 4 есть 520 длинных массивов символов.
• По смещению 524 есть UInt.

Это всё неверно, кроме По смещению 0 есть UInt.
И зачем нужно 524 на 2 умножать? Почему 520, ещё можно понять, но почему 524? Четвёрку-то зачем?

svoboden пишет:

А про указатели я не понял, а как узнать их смещения.

Посчитать, как я пытался показать, но вы не захотели разбираться.

svoboden пишет:

И как передать 0 тут

Ноль вообще передавать не нужно, изначально вся структура заполнена нулями, причём у вас зачем-то два раза подряд.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

106 (изменено: svoboden, 2021-07-03 11:51:17)

Re: AHK: Передать структуру

teadrinker пишет:

но почему 524?

В справке же написанно:
The second member is at offset 0 plus the size of the first member (typically 4).

teadrinker пишет:

Ноль вообще передавать не нужно, изначально вся структура заполнена нулями

А если вместо 0 нужно указать имя целвого процесса szTargetProcessExeFileName? То как в таком случае передать указатель? Если это возможно, конечно.
И как посчитать смещения указателя, вы не говорили.

107

Re: AHK: Передать структуру

svoboden пишет:

The second member is at offset 0 plus the size of the first member (typically 4).

А как это объясняет, зачем нужно 4 на два умножать?

svoboden пишет:

То как в таком случае передать указатель?

Как выше показал:

NumPut(&str, &struct + offset)

str это переменная со строкой, struct — структура, в которую передаём, offset — смещение.

svoboden пишет:

И как посчитать смещения указателя, вы не говорили.

Смещение указателя ничем не отличается от остальных смещений, считается так же, во всяком случае для 32-битных процессов.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

108

Re: AHK: Передать структуру

svoboden пишет:
DllCall("ZeroMemory", "Ptr", &ParamStruct, "UInt", 540 * 2)

Это, кстати, тоже неверно.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

109 (изменено: svoboden, 2021-07-03 12:13:05)

Re: AHK: Передать структуру

teadrinker пишет:

зачем нужно 4 на два умножать?

Где такое написанно, я писал 524 * 2.

teadrinker пишет:

str это переменная со строкой

Какая-же это переменная - это указатель в вашем примере, а если там нужно указать строку, а не 0, то как ее передать?

110 (изменено: svoboden, 2021-07-03 12:02:50)

Re: AHK: Передать структуру

teadrinker пишет:

Это, кстати, тоже неверно.

Что неверного, в заполнении нулями блока памяти?

111

Re: AHK: Передать структуру

svoboden пишет:

Где такое написанно, я писал 524 * 2.

Ну, там же четвёрка лишняя. Строка занимает 520*2, она находится по смещению 4. Всего получается 4 + 520*2.

svoboden пишет:

Какая-же это переменная - это указатель, а если там нужно указать строку, а не 0, то как ее передать numput'ом можно?

Вот прямо, как написано, так и передавайте, всё будет ок.

svoboden пишет:

Что неверного, в заполнении нулями структуры?

Так заполнения не происходит, функции ZeroMemory не существует.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

112 (изменено: svoboden, 2021-07-03 12:11:51)

Re: AHK: Передать структуру

teadrinker пишет:

Строка занимает 520*2

Так я про id смещение, оно находится на 524 * 2.

113 (изменено: svoboden, 2021-07-03 12:14:56)

Re: AHK: Передать структуру

teadrinker пишет:

Вот прямо, как написано, так и передавайте

Так как numput может передавать строки? Не пойму ничего.

114

Re: AHK: Передать структуру

svoboden пишет:

Так я про id смещение, оно находится на 524 * 2.

Да, но почему, вы объяснить не можете. А если можете, значит такой вопрос

svoboden пишет:

Так вроде структуры отличаются, смещения строки одинаковые, а дальше где должно быть id идет

у вас не должен возникнуть.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

115

Re: AHK: Передать структуру

svoboden пишет:

Так как numput может передавать строки?

Через знак & — это значит адрес переменной.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

116

Re: AHK: Передать структуру

Хорошо, спасибо, буду разбираться. Пока нету вопросов.

117 (изменено: svoboden, 2021-07-05 11:10:38)

Re: AHK: Передать структуру

Посчитал смещение для:

wchar_t* szTargetProcessExeFileName;

Оно находятся на 522 * 2. Это понятно, т.к. wchar_t имеет 2 байта размер. Но почему dword id находится на 524 * 2, если его размер является 4 байта? Это как-то связанно с Юникод структурой получается?

118

Re: AHK: Передать структуру

По-моему, вы опять гадаете. Распишите, сколько байтов занимает каждое поле, по-крайней мере, как вы это понимаете.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

119 (изменено: svoboden, 2021-07-05 15:16:55)

Re: AHK: Передать структуру

первое поле 0 байт.
второе 520 * 2 (умножить на 2 - это юникод строка, она в два раза больше анси).
третье 2 байта.
четвертое уже непонятно.

120

Re: AHK: Передать структуру

Вопрос невнимательно прочитали

teadrinker пишет:

сколько байтов занимает каждое поле

Поле не может занимать 0 байт.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

121 (изменено: svoboden, 2021-07-05 15:21:28)

Re: AHK: Передать структуру

Тогда:
4 байта.
520 * 2 байт.
2 байта.
4 байта.

122

Re: AHK: Передать структуру

struct INJECTIONDATA
{
    DWORD            LastErrorCode;
    wchar_t            szDllPath[MAX_PATH * 2];
    wchar_t*          szTargetProcessExeFileName;
    DWORD            ProcessID;
    INJECTION_MODE    Mode;
    LAUNCH_METHOD    Method;
    DWORD            Flags;
    DWORD            hHandleValue;
    HINSTANCE       hDllOut;
};

А почему третье два? Это указатель (адрес) переменной со строкой. Для 32 битных процессов указатели занимают 4 байта, для 64 битных 8.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

123

Re: AHK: Передать структуру

По вашей ссылке смотрел: https://docs.microsoft.com/en-us/cpp/cp … om=vs-2019. Ориентировался на эту надпись: wchar_t 2 __wchar_t 0 to 65,535

124

Re: AHK: Передать структуру

Это имеет отношение ко второму полю, там указано, сколько занимает один wchar_t, действительно 2 байта, именно поэтому мы умножаем 520 (количество символов в строке) на два.
В третьем поле вы видите звёздочку, это значит указатель.
То-есть во втором поле мы передаём непосредственно саму строку с помощью StrPut(), а в третьем адрес строки с помощью NumPut().

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

125 (изменено: svoboden, 2021-07-13 16:02:27)

Re: AHK: Передать структуру

Так проверьте, вот, может не очень правильный скрипт, но смещения работают, три первых поля я не гадал, а дальше да, вопросы уже, но я все-равно подобрал их исходя из файла ошибок.

#NoEnv

File := "test_.dll"
str := "test.exe"

WinGet, id, PID, ahk_exe test.exe

hModule := DllCall("LoadLibrary", "Str", "gh_injector.dll", "Ptr")
;msgbox % hModule
InjectW := DllCall("GetProcAddress", "Ptr", hModule, "Astr", "InjectW", "Ptr")
;msgbox % InjectW

VarSetCapacity(ParamStruct, 542 * 2, 0)

NumPut(&str, ParamStruct + 522 * 2)
NumPut(id, ParamStruct, 524 * 2, "Uint")
NumPut(2, ParamStruct, 526 * 2, "Uint")
NumPut(0, ParamStruct, 528 * 2, "Uint") ; 0 - NtCreateThreadEx
StrPut(File, &ParamStruct + 4, "UTF-16")

DllCall(InjectW, "Ptr", &ParamStruct)

Я посчитал почему-то по справке, что szTargetProcessExeFileName = 2 байтам. И это оказалось правильным смещением, не знаю.

126

Re: AHK: Передать структуру

Неудобно смотреть в таком виде. Зачем вы всё умножаете на 2? Здесь на 2 умножается только 520, остальное складывается. Перепишите, всё будет понятно.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

127 (изменено: svoboden, 2021-07-13 16:02:14)

Re: AHK: Передать структуру

Так вроде:

#NoEnv

File := "test_.dll"
str := "test.exe"

WinGet, id, PID, ahk_exe test.exe

hModule := DllCall("LoadLibrary", "Str", "gh_injector.dll", "Ptr")
InjectW := DllCall("GetProcAddress", "Ptr", hModule, "Astr", "InjectW", "Ptr")
;msgbox % InjectW

VarSetCapacity(ParamStruct, 1084, 0)

NumPut(&str, ParamStruct + 1044)
NumPut(id, ParamStruct, 1048, "Uint")
NumPut(2, ParamStruct, 1052, "Uint")
NumPut(0, ParamStruct, 1056, "Uint") ; 0 - NtCreateThreadEx
StrPut(File, &ParamStruct + 4, "UTF-16")

DllCall(InjectW, "Ptr", &ParamStruct)

128

Re: AHK: Передать структуру

Так тоже неудобно. Во-первых, для наглядности (и во избежание ошибок) нужно добавлять поля в том порядке, в котором они идут в структуре. Во-вторых, лучше расписывать оффсеты подробно, т. е. вместо

NumPut(&str, &ParamStruct + 1044)

пишем

NumPut(&str, &ParamStruct + 4 + 520*2)

И так же для остальных полей.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

129 (изменено: svoboden, 2021-07-13 16:01:55)

Re: AHK: Передать структуру

Ну да, у меня заработал такой вариант, но и мой вариант тоже работает же, не знаю.

#NoEnv

File := "test_.dll"
str := "test.exe"

WinGet, id, PID, ahk_exe test.exe

hModule := DllCall("LoadLibrary", "Str", "gh_injector.dll", "Ptr")
InjectW := DllCall("GetProcAddress", "Ptr", hModule, "Astr", "InjectW", "Ptr")
;msgbox % InjectW

VarSetCapacity(ParamStruct, 1084, 0)

StrPut(File, &ParamStruct + 4, "UTF-16")
NumPut(&str, ParamStruct + 4 + 520*2)
NumPut(id, ParamStruct, 8 + 520*2, "Uint")
NumPut(2, ParamStruct, 12 + 520*2, "Uint")
NumPut(0, ParamStruct, 16 + 520*2, "Uint")

DllCall(InjectW, "Ptr", &ParamStruct)

130

Re: AHK: Передать структуру

Теперь почти всё правильно, но, во-первых, откуда взялось здесь 1084?

VarSetCapacity(ParamStruct, 1084, 0)

Во-вторых, для наглядности лучше так:

StrPut(File, &ParamStruct + 4, "UTF-16")
NumPut(&str, ParamStruct, 4 + 520*2)
NumPut(id  , ParamStruct, 4 + 520*2 + 4, "Uint")
NumPut(2   , ParamStruct, 4 + 520*2 + 8, "Uint")
; NumPut(0   , ParamStruct, 4 + 520*2 + 12, "Uint")

Ноль передавать не нужно (но можно для наглядности).

svoboden пишет:

мой вариант тоже работает же

Если работает, значит смещения указаны правильно (посчитайте, какие в моём, какие в вашем), просто неправильно записаны.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

131 (изменено: svoboden, 2022-04-27 04:11:10)

Re: AHK: Передать структуру

teadrinker пишет:

откуда взялось здесь 1084?

Это емкость переменной, если поставить меньше, ничего не заработает. Но я еще не посчитал ее.

teadrinker пишет:

Если работает, значит смещения указаны правильно

Да, смещения такие же, я их просто по-своему записывал. А так, вроде все работает, буду дальше учить структуры.

132

Re: AHK: Передать структуру

Представьте, что структура - это письменный стол, а члены структуры это ящики в столе в сантиметрах.
Ящик может быть пустой или полный, но он всё-равно занимает какое-то место.

133

Re: AHK: Передать структуру

Хорошо, спасибо.