Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/19: Рейтинг темы: голосов - 19, средняя оценка - 4.89
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771

Как будет &(PVOID&) в reinterpret_cast?

21.08.2021, 03:27. Показов 3994. Ответов 47
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как правильно написать приведение к типу &(PVOID&) через reinterpret_cast?
(в Detours вообще написано что DetourAttach ждет первым аргументом void**, но когда я привожу к void** вместо &(PVOID&) то оно крашит процесс при внедрении :/
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.08.2021, 03:27
Ответы с готовыми решениями:

Ошибка: multiple definition of `void std::swap<A>(A&amp;, A&amp;)
Хочу специализировать swap для своего класса. Получаю ошибку. Вот код:#ifndef A_H #define A_H #include &lt;string&gt; class A ...

Язык C, напечатать таблицу истинности логической функции (A & B & C), где & - знаки логический операций И, НЕ
напечатать таблицу истинности логической функции (A &amp; B &amp; C), где &amp; - знаки логический операций И, НЕ

Почему friend ostrem& operator <<(ostream& outs, const Rational&); - invalid function declaration?
Пытаюсь скомпилировать программу пишет friend ostrem&amp; operator &lt;&lt;(ostream&amp; outs, const Rational&amp;); - invalid function declaration. ...

47
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1819
Регистрация: 18.10.2014
Сообщений: 17,198
21.08.2021, 07:08
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Как правильно написать приведение к типу &(PVOID&)
Нет такого типа. Какой нужен тип?
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
21.08.2021, 11:53
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
но когда я привожу
Что именно приводишь? И речь о типе (PVOID&) * ?
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
21.08.2021, 17:49  [ТС]
TheCalligrapher, TRam_, PVOID это void* в Visual Studio. Получается &(void*&) как это записать не через C cast а через reinterpret_cast?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
21.08.2021, 17:55
Лучший ответ Сообщение было отмечено eXpl01TeR как решение

Решение

Цитата Сообщение от eXpl01TeR Посмотреть сообщение
&(void*&)
& перед скобками не относится к типу, это взятие адреса от результата получившегося выражения.

Добавлено через 1 минуту
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
как это записать не через C cast а через reinterpret_cast?
C++
1
reinterpret_cast<PVOID&>
1
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
21.08.2021, 18:12  [ТС]
DrOffset, Спасибо большое

Добавлено через 3 минуты
DrOffset, Странно, Visual Studio ругается на reinterpret_cast<PVOID&> аргумент типа PVOID несовместим с параметром типа PVOID* но при C cast'е через &(PVOID&) было все ок, без ошибок
0
Заблокирован
21.08.2021, 18:37
Цитата Сообщение от DrOffset Посмотреть сообщение
& перед скобками не относится к типу, это взятие адреса от результата получившегося выражения.
eXpl01TeR, не знаю что вы там такое делаете, но все выше описанное это какое то шаманство со чтением мыслей....
приведите конкретный код, пример.

DrOffset, вообще и второй амперсанд с права тоже муть какая то.
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
int main()
{
    typedef void * PVOID;
    int i=1;
    PVOID pv = &i;
    PVOID * ppv = &pv;
    std::cout << pv<< std::endl;
    std::cout << ppv<< std::endl;
    std::cout << *ppv<< std::endl;
}
Code
1
2
3
0x7fffb59ad9fc
0x7fffb59ada00
0x7fffb59ad9fc
моя не понима, чего автор хочет...

Добавлено через 9 минут
если разбирать конкретно функцию DetourAttach :
Цитата Сообщение от "https://documentation.help/Detours/Ref_DetourAttach.htm"
DetourAttach

Attach a detour to a target function.
Definition

LONG DetourAttach(
_Inout_ PVOID * ppPointer,
_In_ PVOID pDetour
);

Parameters

ppPointer
Pointer to the target pointer to which the detour will be attached.
pDetour
Pointer to the detour function.
где ppPointer (так как я понял сходу), массив (скорее всего одномерный), куда будет прилеплено что то связанное с detour . Конешно могу ошибаться, ибо нет никакого желания разбираться со всем етим.
Еще раз, приведите код.
eXpl01TeR,Думаю, у вас проблема не только с типами, но и с пониманием с тем с чем вы работаете.
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
21.08.2021, 18:39  [ТС]
SmallEvil,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <windows.h>
#include <detours.h>
 
static LONG dwSlept = 0;
 
// Target pointer for the uninstrumented Sleep API.
//
static VOID (WINAPI * TrueSleep)(DWORD dwMilliseconds) = Sleep;
 
// Detour function that replaces the Sleep API.
//
VOID WINAPI TimedSleep(DWORD dwMilliseconds)
{
    // Save the before and after times around calling the Sleep API.
    DWORD dwBeg = GetTickCount();
    TrueSleep(dwMilliseconds);
    DWORD dwEnd = GetTickCount();
 
    InterlockedExchangeAdd(&dwSlept, dwEnd - dwBeg);
}
 
// DllMain function attaches and detaches the TimedSleep detour to the
// Sleep target function.  The Sleep target function is referred to
// through the TrueSleep target pointer.
//
BOOL WINAPI DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved)
{
    if (DetourIsHelperProcess()) {
        return TRUE;
    }
 
    if (dwReason == DLL_PROCESS_ATTACH) {
        DetourRestoreAfterWith();
 
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        DetourAttach(&(PVOID&)TrueSleep, TimedSleep);
        DetourTransactionCommit();
    } else if (dwReason == DLL_PROCESS_DETACH) {
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        DetourDetach(&(PVOID&)TrueSleep, TimedSleep);
        DetourTransactionCommit();
    }
    return TRUE;
}
Код из примера перехвата функции. &(PVOID&) работает но я просто хотел бы переделать это на reinterpret_cast
0
Заблокирован
21.08.2021, 18:53
eXpl01TeR,
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
typedef void * PVOID;
void Sleep(unsigned){};
static void (* TrueSleep)(unsigned) = Sleep;
 
void test (void **){};
int main()
{
    test(&(reinterpret_cast<PVOID&>(TrueSleep)));
}
так понятно ? Но опять же , зачем ?
Если честно так и не понял части с reinterpret_cast<PVOID&>
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
21.08.2021, 18:59
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
C++
1
DetourAttach(&(PVOID&)TrueSleep, TimedSleep);
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <windows.h>
#include <detours.h>
 
static LONG dwSlept = 0;
 
// Target pointer for the uninstrumented Sleep API.
//
static PVOID TrueSleepF = reinterpret_cast<PVOID>(&Sleep);
 
template <typename F>
static F WINAPI * FCast(PVOID p)
{
     return reinterpret_cast<F WINAPI*>(p);
}
 
// Detour function that replaces the Sleep API.
//
VOID WINAPI TimedSleep(DWORD dwMilliseconds)
{
    // Save the before and after times around calling the Sleep API.
    DWORD dwBeg = GetTickCount();
    FCast<VOID WINAPI(DWORD)>(TrueSleepF)(dwMilliseconds);
    DWORD dwEnd = GetTickCount();
 
    InterlockedExchangeAdd(&dwSlept, dwEnd - dwBeg);
}
 
// DllMain function attaches and detaches the TimedSleep detour to the
// Sleep target function.  The Sleep target function is referred to
// through the TrueSleep target pointer.
//
BOOL WINAPI DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved)
{
    if (DetourIsHelperProcess()) {
        return TRUE;
    }
 
    if (dwReason == DLL_PROCESS_ATTACH) {
        DetourRestoreAfterWith();
 
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        DetourAttach(&TrueSleepF , TimedSleep);
        DetourTransactionCommit();
    } else if (dwReason == DLL_PROCESS_DETACH) {
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        DetourDetach(&TrueSleepF , TimedSleep);
        DetourTransactionCommit();
    }
    return TRUE;
}
1
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
21.08.2021, 19:00  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Если честно так и не понял части с reinterpret_cast<PVOID&>
Я её сам не понимаю, но везде в примерах перехвата через Microsoft Detours пишут именно через &(PVOID&)
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
21.08.2021, 19:03
Цитата Сообщение от SmallEvil Посмотреть сообщение
Если честно так и не понял части с reinterpret_cast<PVOID&>
Там все просто.
Функция DetourAttach может поменять аргумент (т.е. значение указателя), поэтому принимает указатель на указатель.
При этом за указателем на void скрывается функция. Т.е. поменять надо адрес функции.
Поэтому он кастит ее к ссылке на указатель на void, чтобы передать туда указатель на этот указатель на void и чтобы функция поменяла этот адрес
Короче так лучше не делать. Лучше делать как я показал.
0
Заблокирован
21.08.2021, 19:05
DrOffset, это тоже самое что я предлагал в своем первом посте, взять адрес с указателя.
С кодом все гораздо понятней стало ).

Добавлено через 43 секунды
Цитата Сообщение от DrOffset Посмотреть сообщение
Поэтому он кастит ее к ссылке на указатель на void, чтобы передать туда указатель на этот указатель на void и чтобы функция поменяла этот адрес
моя тупая башка
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
21.08.2021, 19:06
Цитата Сообщение от DrOffset Посмотреть сообщение
return reinterpret_cast<F WINAPI*>(p);
Опечатка.
Надо так:
C++
1
return reinterpret_cast<F*>(p);
0
Заблокирован
21.08.2021, 19:07
Цитата Сообщение от DrOffset Посмотреть сообщение
Функция DetourAttach может поменять аргумент (т.е. значение указателя), поэтому принимает указатель на указатель.
ну и что без кода ТС мы должны были гуглить функцию и допрашивать ТС о его коде ?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
21.08.2021, 19:13
Лучший ответ Сообщение было отмечено eXpl01TeR как решение

Решение

Цитата Сообщение от SmallEvil Посмотреть сообщение
ну и что без кода ТС мы должны были гуглить функцию и допрашивать ТС о его коде ?
Да вот никак они не научатся, что надо давать весь контекст, особенно если вопрос выходит за рамки хрестоматийных.
Эх, в былые времена на определенных ресурсах за такое и забанить могли, не то, что сейчас. Век терпимости

Добавлено через 4 минуты
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Visual Studio ругается на reinterpret_cast<PVOID&> аргумент типа PVOID несовместим с параметром типа PVOID* но при C cast'е через &(PVOID&) было все ок, без ошибок
Ну нельзя же так буквально понимать
Я же специально для вас выше написал:
Цитата Сообщение от DrOffset Посмотреть сообщение
& перед скобками не относится к типу, это взятие адреса от результата получившегося выражения.
Т.е. с учетом моего ответа
Цитата Сообщение от DrOffset Посмотреть сообщение
reinterpret_cast<PVOID&>
вы должны были подставить вот так:
C++
1
&reinterpret_cast<PVOID&>
Добавлено через 37 секунд
Ну и это же самое вам еще раз показали в посте #9.
1
Заблокирован
21.08.2021, 19:24
DrOffset, хътелось бы все таки добраться до ответа что делает амперсанд справа в реинтрперткаст
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
typedef void * PVOID;
void Sleep(unsigned){};
static void (* TrueSleep)(unsigned) = Sleep;
 
void test (void **){};
int main()
{
    test(&(reinterpret_cast<PVOID&>(TrueSleep))); // проходит
    test(&(reinterpret_cast<PVOID>(TrueSleep))); // так ошибка, разве результат выражения не void ** ?
    test(&TrueSleep); // и так - ошибка, но тут более понятно
}
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
21.08.2021, 19:27
Цитата Сообщение от SmallEvil Посмотреть сообщение
test(&(reinterpret_cast<PVOID>(TrueSleep ))); // так ошибка, разве результат выражения не void ** ?
Так вы берете адрес временного объекта

Цитата Сообщение от SmallEvil Посмотреть сообщение
test(&(reinterpret_cast<PVOID&>(TrueSlee p))); // проходит
Берет адрес указателя (на функцию) TrueSleep, интерпретированного как указатель на void. Ссылка тут дает возможно работать непосредственно с объектом TrueSleep (а не с временным объектом) в результате каста.
0
Заблокирован
21.08.2021, 19:36
Цитата Сообщение от DrOffset Посмотреть сообщение
Ссылка тут дает возможно работать непосредственно с объектом TrueSleep (а не с временным объектом) в результате каста.
спасибо, ошибка говорила о невозможности взять адрес, век живи - век учись.

C++
1
2
3
    PVOID lpvoid= reinterpret_cast<PVOID>(TrueSleep);  // так же как и ты выше в своем коде,
    test(&(reinterpret_cast<PVOID&>(TrueSleep))); // проходит
    test(&lpvoid); // уже все ок
но еще осталось странное ощущение что, что то где то не так )

Добавлено через 2 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
Ссылка тут дает возможно работать непосредственно с объектом
кажется тут немного не так, указатель на укззатель дает возможность изменять первичный указатель.
Так как я понял, ссылка продлевает жизнь временному объекту полученного из reinterpret_cast
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
21.08.2021, 19:38
Цитата Сообщение от SmallEvil Посмотреть сообщение
но еще осталось странное ощущение что, что то где то не так )
Нут все нормально

Задача дать функции test (DetourAttach) возможность изменить переменную TrueSleep.

Т.е. если бы у нас была возможность работать с известными типами, то нам надо было передать туда указатель на указатель на функцию. Но т.к. это обобщенная API-функция, то она работает с обезличенным типом void*, поэтому мы вынуждены писать эти касты.

Добавлено через 30 секунд
Цитата Сообщение от SmallEvil Посмотреть сообщение
кажется тут немного не так, указатель на укззатель дает возможность изменять первичный указатель.
Так как я понял, ссылка продлевает жизнь временному объекту полученного из reinterpret_cast
Нет, все именно так. Никто тут ничего не продлевает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.08.2021, 19:38
Помогаю со студенческими работами здесь

В заштрихованную фигуру бросают точки с координатами x и y. Получить координаты первой точки не попавшей в эту область (фигура x*x+y*y<25&&x*x+y*y>=9&
В заштрихованную фигуру бросают точки с координатами x и y. Получить координаты первой точки не попавшей в эту область (фигура...

ostream &operator<< (ostream &output, const Array &obj) - что означает эта строка?
void Array::getArray() // вывод массива { for (int ix = 0; ix &lt; size; ix++) cout &lt;&lt; setw(5) &lt;&lt; ptr; // вывод элементов...

Нюансы синтаксиса: где, как и для чего используется &&
Когда применяется ссылка на ссылку? В STL есть классы, конструкторы которых принимают ссылку на ссылку. Попробовал понять для чего они...

Как проверить, принадлежит ли символ заданному диапазону m...n, кроме if (c <= n && c >= m) ?
есть какая-нибудь более короткая запись для проверки, принадлежит ли символ заданному диапазону m...n, кроме if (c &lt;= n &amp;&amp; c...

Порядок вычисления: операторы «|» и «||», «&» и «&&»
В Java булевые операторы «|» и «||», и «&amp;» и «&amp;&amp;» отличаются друг от друга порядком вычеслений, а в C++ так же как и в Java или...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru