All CPU DISPATCH_LEVEL

Тема в разделе "WASM.NT.KERNEL", создана пользователем 2FED, 28 мар 2008.

  1. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Переписал процедуру из книги хоглунда которая переводит все процессоры в DISPATCH_LEVEL, и нет возможности проверить, так как не имею мультипроцессорную систему =(

    всё ли правильно?

    Код (Text):
    1. AllDPC proc uses edi esi
    2. LOCAL pkdpc         :dword
    3. LOCAL temp_pkdpc    :dword
    4. LOCAL u_currentCPU  :dword
    5. LOCAL CPUCount      :dword
    6.  
    7.  xor        eax, eax
    8.  lea        ecx, ALLCPURaised
    9.  lock and   [ecx], eax                              ; ALLCPURaised = 0
    10.  lea        ecx, NumberOfRaisedCPU
    11.  lock and   [ecx], eax                              ; NumberOfRaisedCPU = 0
    12.  
    13.  assume     fs:nothing
    14.  movzx      eax,byte ptr fs:51h
    15.  mov        u_currentCPU, eax                       ; Òåêóùèé ïðîöåññîð
    16.  
    17.  mov        ecx, KeNumberProcessors
    18.  mov        ecx, [ecx]
    19.  movsx      ecx, byte ptr [ecx]
    20.  mov        CPUCount, ecx                           ; Êîëè÷åñòâî ïðîöåññîðîâ
    21.  
    22.  imul       ecx,sizeof KDPC                         ; Ïàìÿòü ïîä ñòðóêòóðû KDPC
    23.  invoke     ExAllocatePool,NonPagedPool,ecx
    24.  mov        pkdpc,eax
    25.  mov        temp_pkdpc,eax
    26.  
    27.  xor        esi,esi
    28.  
    29. next:
    30.  cmp        esi, CPUCount
    31.  jae        waitraise
    32.  cmp        esi, u_currentCPU                       ; Èñêëþ÷àåì òåêóùèé ïðîöåññîð
    33.  je         skip
    34.  
    35.  invoke     KeInitializeDpc,temp_pkdpc,addr DPCProc,0
    36.  invoke     KeSetTargetProcessorDpc,temp_pkdpc,esi
    37.  invoke     KeInsertQueueDpc,temp_pkdpc,0,0
    38.  
    39. skip:
    40.  inc        esi
    41.  add        temp_pkdpc,sizeof KDPC
    42.  jmp        next
    43.  
    44. waitraise:
    45.  lea        edx, NumberOfRaisedCPU
    46.  mov        ecx, CPUCount
    47.  dec        ecx                                     ; NumberProcessors - 1
    48. wh:
    49.  mov        eax, ecx
    50.  mov        edi, edx
    51.  lock cmpxchg dword ptr [edi], eax
    52.  cmp        eax, ecx                                ; NumberOfRaisedCPU = NumberProcessors - 1
    53.  jnz        wh
    54.  
    55. exit:
    56.  mov eax,pkdpc
    57.  ret
    58. AllDPC endp
    Код (Text):
    1. DPCProc proc
    2.     lock inc NumberOfRaisedCPU
    3. wh: xor      eax, eax
    4.     inc      eax
    5.     lea      edx, ALLCPURaised
    6.     lock     cmpxchg [edx], eax
    7.     test     eax, eax
    8.     jz       wh
    9.     lock dec NumberOfRaisedCPU
    10. ret 10h
    11. DPCProc endp
    Код (Text):
    1. DeDPC proc pkdpc:dword
    2.     lock inc ALLCPURaised
    3.     lea     edx, NumberOfRaisedCPU
    4.     xor     eax,eax
    5. wh: lock    cmpxchg [edx], eax
    6.     test    eax,eax
    7.     jnz     wh 
    8.     invoke  ExFreePool,pkdpc
    9.     ret
    10. DeDPC endp