ObDereferenceObject

Тема в разделе "WASM.WIN32", создана пользователем ChS, 23 авг 2004.

  1. ChS

    ChS New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2003
    Сообщения:
    20
    "ObDereferenceObject decrements the given object's reference count and performs retention checks" Так написано в MSDN и у Four-F
    Код (Text):
    1.  
    2.     invoke ObDereferenceObject, pProcess
    3.  


    MASM компилирует в
    Код (Text):
    1.  
    2. push dword ptr [esi+64h]
    3. call ObDereferenceObject
    4.  


    Но в одном из драйверов нашел другую интерпритацию :)
    Код (Text):
    1.  
    2. mov ecx, [esi+64h]
    3. call ds:__imp_@ObfDereferenceObject@4
    4.  


    Во втором случае она рассматривается как fastcall-функция. Вопрос - как правильно вызывать? И как узнать какая ф-ция fastcall или нет? Ведь можно любоваться синим экраном долго Ж:)
     
  2. ssx

    ssx Member

    Публикаций:
    0
    Регистрация:
    19 авг 2003
    Сообщения:
    336
    ObDereferenceObject и ObfDereferenceObject - это разные функции.

    VOID FASTCALL ObfDereferenceObject(IN PVOID Object)

    и VOID ObDereferenceObject(IN PVOID Object)
     
  3. ChS

    ChS New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2003
    Сообщения:
    20
    Разные по передачи параметров, в DDK нет ObfDereferenceObject :dntknw:
     
  4. ssx

    ssx Member

    Публикаций:
    0
    Регистрация:
    19 авг 2003
    Сообщения:
    336
    ничего удивительного.
    Код (Text):
    1.  
    2. VOID
    3. ObDereferenceObject (
    4.     IN PVOID Object
    5.     )
    6.  
    7. /*++
    8. Routine Description:
    9. This is really just a thunk for the Obf version of the dereference routine
    10. ююююю
    11.  
     
  5. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Код (Text):
    1. invoke ObDereferenceObject, pProcess


    или
    Код (Text):
    1. fastcall ObfDereferenceObject, pProcess
     
  6. ChS

    ChS New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2003
    Сообщения:
    20
    А вот и ответ :) IDA показала.
    Код (Text):
    1.  
    2. 0044F99C                 public ObDereferenceObject
    3. 0044F99C ObDereferenceObject proc near
    4. 0044F99C
    5. 0044F99C arg_0           = dword ptr  4
    6. 0044F99C
    7. 0044F99C                 mov     ecx, [esp+arg_0]
    8. 0044F9A0                 call    ObfDereferenceObject
    9. 0044F9A5                 retn    4
    10. 0044F9A5 ObDereferenceObject endp
    11.  


    ObDereferenceObject - оболочка для ObfDereferenceObject
     
  7. ssx

    ssx Member

    Публикаций:
    0
    Регистрация:
    19 авг 2003
    Сообщения:
    336
    а я что написал - "This is really just a thunk for the Obf version of the dereference routine" - цитата из первоисточника
     
  8. ChS

    ChS New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2003
    Сообщения:
    20
    Вот, пока копался в ядре нашёл странную странность - интересный код:
    Код (Text):
    1.  
    2. 00402340                 public KefAcquireSpinLockAtDpcLevel
    3. 00402340 KefAcquireSpinLockAtDpcLevel proc near
    4. 00402340                 retn
    5. 00402340 KefAcquireSpinLockAtDpcLevel endp
    6. 00402340
    7. 00402340 ; ---------------------------------------------------------------------- -----
    8. 00402341                 align 4
    9. 00402344 ; Exported entry 434. KeAcquireSpinLockAtDpcLevel
    10. 00402344
    11. 00402344 ; --------------- S U B R O U T I N E ---------------------------------------
    12. 00402344
    13. 00402344
    14. 00402344                 public KeAcquireSpinLockAtDpcLevel
    15. 00402344 KeAcquireSpinLockAtDpcLevel proc near
    16. 00402344                 retn    4
    17. 00402344 KeAcquireSpinLockAtDpcLevel endp
    18.  


    И такого "барахла" много Ж:dntknw:

    Может эти функции вообще не надо вызывать? Ведь простой ret я и сам могу сделать.
     
  9. ChS

    ChS New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2003
    Сообщения:
    20
    Снимаю вопрос :) это для "multiprocessor-safe way" У меня однопроцессорная система.
     
  10. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Это как раз для однопроцессорной машины, в ней хватание спинлока это просто повышение IRQL до dispatch. И если мы уже на dispatch, то нет смысла устанавливать этот же самый IRQL ещё раз.