"ObDereferenceObject decrements the given object's reference count and performs retention checks" Так написано в MSDN и у Four-F Код (Text): invoke ObDereferenceObject, pProcess MASM компилирует в Код (Text): push dword ptr [esi+64h] call ObDereferenceObject Но в одном из драйверов нашел другую интерпритацию Код (Text): mov ecx, [esi+64h] call ds:__imp_@ObfDereferenceObject@4 Во втором случае она рассматривается как fastcall-функция. Вопрос - как правильно вызывать? И как узнать какая ф-ция fastcall или нет? Ведь можно любоваться синим экраном долго Ж
ObDereferenceObject и ObfDereferenceObject - это разные функции. VOID FASTCALL ObfDereferenceObject(IN PVOID Object) и VOID ObDereferenceObject(IN PVOID Object)
ничего удивительного. Код (Text): VOID ObDereferenceObject ( IN PVOID Object ) /*++ Routine Description: This is really just a thunk for the Obf version of the dereference routine ююююю
Код (Text): invoke ObDereferenceObject, pProcess или Код (Text): fastcall ObfDereferenceObject, pProcess
А вот и ответ IDA показала. Код (Text): 0044F99C public ObDereferenceObject 0044F99C ObDereferenceObject proc near 0044F99C 0044F99C arg_0 = dword ptr 4 0044F99C 0044F99C mov ecx, [esp+arg_0] 0044F9A0 call ObfDereferenceObject 0044F9A5 retn 4 0044F9A5 ObDereferenceObject endp ObDereferenceObject - оболочка для ObfDereferenceObject
а я что написал - "This is really just a thunk for the Obf version of the dereference routine" - цитата из первоисточника
Вот, пока копался в ядре нашёл странную странность - интересный код: Код (Text): 00402340 public KefAcquireSpinLockAtDpcLevel 00402340 KefAcquireSpinLockAtDpcLevel proc near 00402340 retn 00402340 KefAcquireSpinLockAtDpcLevel endp 00402340 00402340 ; ---------------------------------------------------------------------- ----- 00402341 align 4 00402344 ; Exported entry 434. KeAcquireSpinLockAtDpcLevel 00402344 00402344 ; --------------- S U B R O U T I N E --------------------------------------- 00402344 00402344 00402344 public KeAcquireSpinLockAtDpcLevel 00402344 KeAcquireSpinLockAtDpcLevel proc near 00402344 retn 4 00402344 KeAcquireSpinLockAtDpcLevel endp И такого "барахла" много Ж Может эти функции вообще не надо вызывать? Ведь простой ret я и сам могу сделать.
Это как раз для однопроцессорной машины, в ней хватание спинлока это просто повышение IRQL до dispatch. И если мы уже на dispatch, то нет смысла устанавливать этот же самый IRQL ещё раз.