Странный (ИМХО) кусок кода в драйвере:

Тема в разделе "WASM.RESEARCH", создана пользователем souzz, 23 сен 2006.

  1. souzz

    souzz New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2006
    Сообщения:
    17
    Адрес:
    Freedom
    разбираю тут драйвер один, натолкнулся на следующий код:

    Код (Text):
    1.                  mov     eax, ds:KeTickCount
    2.                  mov     [ebp+Packet_buf], eax ; random value???
    3.                  jmp     short loc_12781
    4.  ; --------------------------------------------------------------------
    5.  
    6.  Synchronize:                            ; CODE XREF:
    7.                  pause
    8.  
    9.  loc_12781:                              ; CODE XREF:
    10.                  mov     eax, [ebp+Packet_buf]
    11.                  mov     eax, [eax+4]
    12.                  mov     [esi+290h], eax
    13.                  mov     eax, [ebp+Packet_buf]
    14.                  mov     eax, [eax]
    15.                  mov     [esi+28Ch], eax
    16.                  mov     eax, [ebp+Packet_buf]
    17.                  mov     ecx, [esi+290h]
    18.                  cmp     ecx, [eax+8]
    19.                  jnz     short Synchronize
    20.                  mov     eax, [esi+28Ch] ; random seed (dword)
    21.                  shr     eax, 8
    22.                  and     eax, 0FFFFh
    23.                  push    eax
    24.                  call    srand           ; init seeds random generator
    Зачем этот цикл? Синхронизация значений или просто для надежности??
    Помогите разобраться плиз.
    P.S. полученный seed для инициализации srand используется в затем в шифровании пакета...

    Спасибо.
     
  2. fr0b-p

    fr0b-p New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2006
    Сообщения:
    118
    вот оригинал:
    Код (Text):
    1. #define KeQueryTickCount(CurrentCount ) { \
    2.     volatile PKSYSTEM_TIME _TickCount = *((PKSYSTEM_TIME *)(&KeTickCount)); \
    3.     for (;;) {                                                              \
    4.         (CurrentCount)->HighPart = _TickCount->High1Time;                   \
    5.         (CurrentCount)->LowPart = _TickCount->LowPart;                      \
    6.         if ((CurrentCount)->HighPart == _TickCount->High2Time) break;       \
    7.         YieldProcessor();                                                   \
    8.     }                                                                       \
    9. }
    смысл - KeTickCount изменяется не атомарно, а за несколько команд.