KiInitPrcb

VOID __stdcall KiInitPrcb(_KPRCB *Prcb, UINT64 Number){
  _LIST_ENTRY *DispatcherReadyListHead; 
  int v4; 
  __int64 v5; 
  __int64 v6; 
  __int64 v7; 
  _LIST_ENTRY *v8; 
  __int64 i; 

  Prcb->QueueIndex = 1;
  Prcb->ReadySummary = 0;
  Prcb->ReadyThreadCount = 0;
  DispatcherReadyListHead = Prcb->DispatcherReadyListHead;
  Prcb->ReadyQueueExpectedRunTime = 0i64;
  v4 = Number;
  v5 = 32i64;
  Prcb->DeferredReadyListHead.Next = 0i64;
  v6 = 32i64;
  do
  {
    DispatcherReadyListHead->Blink = DispatcherReadyListHead;
    DispatcherReadyListHead->Flink = DispatcherReadyListHead;
    ++DispatcherReadyListHead;
    --v6;
  }
  while( v6 );
  v7 = 0i64;
  Prcb->SharedReadyQueue->Lock = 0i64;
  Prcb->SharedReadyQueue->ReadySummary = 0;
  Prcb->SharedReadyQueue->ReadyThreadCount = 0;
  Prcb->SharedReadyQueue->ReadyQueueExpectedRunTime = 0i64;
  do
  {
    v8 = &Prcb->SharedReadyQueue->ReadyListHead[v7++];
    v8->Blink = v8;
    v8->Flink = v8;
    --v5;
  }
  while( v5 );
  memset(Prcb->SharedReadyQueue->RunningSummary, 127i64, sizeof(Prcb->SharedReadyQueue->RunningSummary));
  Prcb->SharedReadyQueue->Span = 1;
  Prcb->SharedReadyQueue->LowProcIndex = Prcb->GroupIndex;
  for( i = 0i64; i < 2; ++i )
    *(&Prcb->SharedReadyQueue->QueueIndex + i) = 1;
  Prcb->SharedReadyQueue->Affinity = Prcb->GroupSetMember;
  Prcb->PriorityState = Prcb->SharedReadyQueue->RunningSummary;
  KiInitializeDpcList(&Prcb->DpcData[0].DpcList);
  Prcb->DpcData[0].DpcLock = 0i64;
  Prcb->DpcData[0].DpcQueueDepth = 0;
  Prcb->$A81AFC2514E605CDBADB8E27B49DE82B::_bf_0 = 0;
  Prcb->DpcRoutineActive = 0;
  Prcb->DpcData[0].DpcCount = 0;
  Prcb->MaximumDpcQueueDepth = KiMaximumDpcQueueDepth;
  Prcb->MinimumDpcRate = KiMinimumDpcRate;
  Prcb->AdjustDpcThreshold = KiAdjustDpcThreshold;
  KeInitializeDpc(&Prcb->CallDpc, KiDpcWatchdog, 0i64);
  if( !Prcb->CallDpc.DpcData )
    Prcb->CallDpc.Number = v4 + 1280;
  Prcb->CallDpc.Importance = 2;
  Prcb->WaitListHead.Blink = &Prcb->WaitListHead;
  Prcb->WaitListHead.Flink = &Prcb->WaitListHead;
  Prcb->CurrentDpcRuntimeHistoryCached = 1i64;
  InitializeSListHead(&Prcb->InterruptObjectPool);
  KeGetPcr()->NtTib.ArbitraryUserPointer = Prcb->LockQueue;
  Prcb->LockQueue[14].Lock = (unsigned __int64 *volatile)&CcBcbSpinLock;
  Prcb->LockQueue[14].Next = 0i64;
  Prcb->LockQueue[5].Lock = (unsigned __int64 *volatile)&CcMasterSpinLock;
  Prcb->LockQueue[4].Lock = (unsigned __int64 *volatile)&CcVacbSpinLock;
  Prcb->LockQueue[6].Lock = (unsigned __int64 *volatile)&NonPagedPoolLock;
  Prcb->LockQueue[7].Lock = (unsigned __int64 *volatile)&IopCancelSpinLock;
  Prcb->LockQueue[9].Lock = (unsigned __int64 *volatile)&IopVpbSpinLock;
  Prcb->LockQueue[10].Lock = (unsigned __int64 *volatile)&IopDatabaseLock;
  Prcb->LockQueue[11].Lock = (unsigned __int64 *volatile)&IopCompletionLock;
  Prcb->LockQueue[12].Lock = (unsigned __int64 *volatile)&NtfsStructLock;
  Prcb->LockQueue[13].Lock = (unsigned __int64 *volatile)&AfdWorkQueueSpinLock;
  Prcb->LockQueue[5].Next = 0i64;
  Prcb->LockQueue[4].Next = 0i64;
  Prcb->LockQueue[6].Next = 0i64;
  Prcb->LockQueue[7].Next = 0i64;
  Prcb->LockQueue[9].Next = 0i64;
  Prcb->LockQueue[10].Next = 0i64;
  Prcb->LockQueue[11].Next = 0i64;
  Prcb->LockQueue[12].Next = 0i64;
  Prcb->LockQueue[13].Next = 0i64;
  Prcb->LockQueue[16].Next = 0i64;
  Prcb->LockQueue[16].Lock = 0i64;
  Prcb->EntropyTimingState.EntropyCount = (3 * (_WORD)v4) & 0x3FF;
  Prcb->PrcbLock = 0i64;
  Prcb->WaitLock = 0i64;
  Prcb->ClockKeepAlive = 1;
  KeInitializeDpc(&Prcb->EntropyTimingState.Dpc, KiEntropyDpcRoutine, &Prcb->EntropyTimingState);
  if( !v4 )
  {
    KiClockPollCycle = KiClockKeepAliveCycle;
    KiReverseStallIpiLock = 0i64;
    CcBcbSpinLock = 0i64;
    CcMasterSpinLock = 0i64;
    CcVacbSpinLock = 0i64;
    IopCancelSpinLock = 0i64;
    IopCompletionLock = 0i64;
    IopDatabaseLock = 0i64;
    IopVpbSpinLock = 0i64;
    NonPagedPoolLock = 0i64;
    NtfsStructLock = 0i64;
    AfdWorkQueueSpinLock = 0i64;
    *(_DWORD *)&KeSleepingProcessors.Count = 1310740;
    memset(&KeSleepingProcessors.Reserved, 0i64, 0xA4u);
  }
  KiIntSteerInitPrcb(Prcb);
  KeInitializeDpc(&Prcb->AbDpc, KiAbDeferredProcessingWorker, 0i64);
  if( !Prcb->AbDpc.DpcData )
    Prcb->AbDpc.Number = v4 + 1280;
}

Referenced by:

KiInitializeBootStructures