Поделиться через


.call (функция вызова)

Команда вызова вызывает целевой процесс для выполнения функции.

.call [/v] Function( Arguments ) 
.call /s Prototype Function( Arguments ) 
.call /c 
.call /C 

Параметры

/v
Подробные сведения о вызове и его аргументах отображаются.

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

Функция
Указывает вызываемую функцию. Это может быть имя функции (желательно квалифицировать с именем модуля) или любое другое выражение, которое оценивается по адресу функции. Если необходимо вызвать конструктор или деструктор, необходимо указать адрес или использовать выражение C++ для оценки именованного синтаксиса операторов (см . сведения о синтаксисе числовых выражений).

Аргументы
Задает аргументы, переданные функции. Если вы вызываете метод, первый аргумент должен быть таким, и все остальные аргументы следуют ему. Аргументы должны быть разделены запятыми и должны соответствовать обычному синтаксису аргументов. Поддерживаются списки аргументов переменной длины. Выражения в аргументе анализируются вычислителем выражений C++; Дополнительные сведения см. в разделе "Номера И операторы C++". Вы не можете ввести литеральную строку в качестве аргумента, но можно использовать указатель на строку или любую другую память, доступную для целевого процесса.

/c
Очищает существующий вызов текущего потока.

/C
Очищает любой существующий вызов текущего потока и сбрасывает контекст текущего потока в контекст, хранящийся невыполненным вызовом.

Среда

Режимы

только в пользовательском режиме

Целевые объекты

только динамическая отладка

Платформы

Только x86 и x64

Замечания

Указанная функция вызывается текущим потоком текущего процесса.

Поддерживаются только соглашения о вызовах cdecl, stdcall, fastcall и thiscall. Управляемый код не может вызываться этой командой.

После использования вызова отладчик обновит стек, измените указатель инструкции, чтобы указать начало вызываемой функции, а затем остановиться. Используйте g (Go) для возобновления выполнения или ~. g для выполнения только потока, выполняющего вызов.

Когда функция возвращается, происходит разрыв, а отладчик отображает возвращаемое значение функции. Возвращаемое значение также хранится в псевдорегистрируемом $callret , который получает тип возвращаемого значения.

Если вы врезались в целевой объект с помощью CTRL+C или CTRL+BREAK, текущий поток является дополнительным потоком, созданным для обработки разрыва. При возникновении команды вызова .call на этом этапе для вызываемой функции будет использоваться дополнительный поток.

Если вы достигли предопределенной точки останова, нет дополнительного потока останова. При использовании вызова в точке останова в пользовательском режиме можно использовать g для выполнения всего процесса или ~. g для выполнения только текущего потока. Использование g может исказить поведение программы, так как вы взяли один поток и перенаправили его на эту новую функцию. С другой стороны, этот поток по-прежнему будет иметь свои блокировки и другие атрибуты, и, следовательно , ~. g может рисковать взаимоблокировками.

Самый безопасный способ использования вызова .— задать точку останова в коде в расположении, где можно безопасно вызвать определенную функцию. При попадании в эту точку останова можно использовать вызов .call , если требуется, чтобы эта функция выполнялась. Если вы используете вызов .в точке, где эта функция не может быть вызвана обычно, взаимоблокировка или повреждение целевого объекта может привести к повреждению.

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

Команды .call /c и .call /C следует использовать только в том случае, если попытка использования вызова завершилась ошибкой или если вы изменили свое мнение перед вводом команды g. Они не должны использоваться случайно, так как отказ от незавершенного вызова может привести к поврежденном целевому состоянию.

В следующем примере кода показано, как используется команда .call /s .

.call /s KnownFunction UnknownFunction( 1 )

В этом примере есть частные символы для KnownFunction, которые принимают целое число в качестве единственного аргумента и возвращают, например указатель на массив. У вас нет символов или, возможно, у вас есть только открытые символы для UnknownFunction, но вы знаете, что он принимает целое число в качестве единственного аргумента и возвращает указатель на массив. С помощью параметра /s можно указать, что UnknownFunction будет работать таким же образом, как и Функция KnownFunction. Таким образом, можно успешно создать вызов UnknownFunction.