Соглашение о вызовах Windows 7 x64 и передача одного параметра

В настоящее время я пытаюсь отследить ошибку в драйвере, которая, кажется, имеет проблемы с вызовом функции ядра IoFreeIrp освободить память IRP обратно в невыгружаемый пул.

Я установил точку останова в IoFreeIrp функции и когда он нажал, я могу видеть значения, содержащиеся в регистрах, однако я не уверен, какой регистр на самом деле содержит IRP, который должен быть освобожден.

Из того, что я знаю о 64-разрядной Windows 7, она использует соглашение о вызовах x64, что означает, что первые четыре параметра передаются регистром. Microsoft заявляет, что:

Аргументы передаются в регистрах RCX, RDX, R8 и R9.

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

Microsoft заявляет, что функция IoFreeIrp принимает один параметр:

The IoFreeIrp routine releases a caller-allocated IRP from the caller's IoCompletion routine.
Syntax

C++

VOID IoFreeIrp(
_In_  PIRP Irp
);

Parameters

Irp [in]
Pointer to the IRP that is to be released.

В документе Microsoft также говорится, что целочисленные значения передаются в эти регистры, поэтому я не уверен, что указатель квалифицируется как целочисленное значение, я так думаю, верно?

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

Благодарю.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector