Переписал процедуру из книги хоглунда которая переводит все процессоры в DISPATCH_LEVEL, и нет возможности проверить, так как не имею мультипроцессорную систему =( всё ли правильно? Код (Text): AllDPC proc uses edi esi LOCAL pkdpc :dword LOCAL temp_pkdpc :dword LOCAL u_currentCPU :dword LOCAL CPUCount :dword xor eax, eax lea ecx, ALLCPURaised lock and [ecx], eax ; ALLCPURaised = 0 lea ecx, NumberOfRaisedCPU lock and [ecx], eax ; NumberOfRaisedCPU = 0 assume fs:nothing movzx eax,byte ptr fs:51h mov u_currentCPU, eax ; Òåêóùèé ïðîöåññîð mov ecx, KeNumberProcessors mov ecx, [ecx] movsx ecx, byte ptr [ecx] mov CPUCount, ecx ; Êîëè÷åñòâî ïðîöåññîðîâ imul ecx,sizeof KDPC ; Ïàìÿòü ïîä ñòðóêòóðû KDPC invoke ExAllocatePool,NonPagedPool,ecx mov pkdpc,eax mov temp_pkdpc,eax xor esi,esi next: cmp esi, CPUCount jae waitraise cmp esi, u_currentCPU ; Èñêëþ÷àåì òåêóùèé ïðîöåññîð je skip invoke KeInitializeDpc,temp_pkdpc,addr DPCProc,0 invoke KeSetTargetProcessorDpc,temp_pkdpc,esi invoke KeInsertQueueDpc,temp_pkdpc,0,0 skip: inc esi add temp_pkdpc,sizeof KDPC jmp next waitraise: lea edx, NumberOfRaisedCPU mov ecx, CPUCount dec ecx ; NumberProcessors - 1 wh: mov eax, ecx mov edi, edx lock cmpxchg dword ptr [edi], eax cmp eax, ecx ; NumberOfRaisedCPU = NumberProcessors - 1 jnz wh exit: mov eax,pkdpc ret AllDPC endp Код (Text): DPCProc proc lock inc NumberOfRaisedCPU wh: xor eax, eax inc eax lea edx, ALLCPURaised lock cmpxchg [edx], eax test eax, eax jz wh lock dec NumberOfRaisedCPU ret 10h DPCProc endp Код (Text): DeDPC proc pkdpc:dword lock inc ALLCPURaised lea edx, NumberOfRaisedCPU xor eax,eax wh: lock cmpxchg [edx], eax test eax,eax jnz wh invoke ExFreePool,pkdpc ret DeDPC endp