В настоящее время я пытаюсь отследить ошибку в драйвере, которая, кажется, имеет проблемы с вызовом функции ядра 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 также говорится, что целочисленные значения передаются в эти регистры, поэтому я не уверен, что указатель квалифицируется как целочисленное значение, я так думаю, верно?
Если бы кто-нибудь мог дать небольшой совет по чтению значений регистра при достижении точки останова, я был бы признателен.
Благодарю.
Задача ещё не решена.
Других решений пока нет …