windows核心情景分析之—— KeRaiseIrql函數與KeLowerIrql()函數

來源:互聯網
上載者:User

標籤:tps   class   提升   failed   flow   tca   pki   int()   變數   

windows核心情景分析之—— KeRaiseIrql函數與KeLowerIrql()函數

1.KeRaiseIrql函數

這個 KeRaiseIrql() 只是簡單地調用 hal 模組的 KfRaiseIrql() 函數,返回原來的 IRQL 寫入 KeRaiseIrql() 的第 2 個參數裡,將它寫回 C 代碼如下:

VOID KeRaiseIrql(KIRQL NewIrql, PKIRQL OldIrql){KIRQL Irql = KfRaiseIrql(NewIrql);*OldIrql = Irql;} KIRQL KfRaiseIrql(KIRQL Irql){KIRQL OldIrql = GetCurrentKPcr()->Irql; // 從 _KPCR.Irql(fs:[24])得到 Irql 值if (HalpEnableIrqlAudit != 0){eflags = GetCurrentElfags(); // 得到 eflags 值DisableInterrupt();  // 關閉中斷HalpValidatePendingInterrts();if (HalpEnableIrqlAudit == 0|| OldIrql >= DPC_LEVE|| OldIrql >= ((USHORT *)GetCurrentKPcr()->HalReserved)[1]; // fs:[96h]|| HalpAssertFailedOnce != 0){if (eflags.IF == 0)EnableInterrupt():  // 開中斷}}if (HalpEnableIrqlAudit == 0 || OldIrql <= Irql){// 空,跳出 if()}else{HalpAssertFailedOnce = 1;DbgBreakPoint();  // 被斷下}GetCurrentKPcr()->Irql = Irql; // 設定新的 IRQL 值return OldIrql;// 返回舊的 IRQL 值}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

KfRaiseIrql() 函數能提升 IRQL 需符合下面的條件之一:

1.HalpEnableIrqlAudit 為 0(HalpEnableIrqlAudit 是個 hal 模組內的全域變數,但我不知道它是什麼意思

2.NewIrql >= OldIrql(也就是要提升的 IRQL 必須大於或等於原值)

2.KeLowerIrql()函數

#define KeLowerIrql(a) KfLowerIrql(a)  VOID FASTCALL KfLowerIrql (KIRQLNewIrql)  {    if (NewIrql > KeGetPcr()->Irql)    {    KEBUGCHECK(0);    for(;;);    }    HalpLowerIrql(NewIrql);  }  VOID HalpLowerIrql(KIRQL NewIrql) //主要函數{    if (NewIrql >= PROFILE_LEVEL) //如果所要降到的插斷要求級大於PROFILE_LEVEL,則直接設定當前的插斷要求級  {    KeGetPcr()->Irql = NewIrql;    return;    }    HalpExecuteIrqs(NewIrql);    if (NewIrql >= DISPATCH_LEVEL) //如果所要降到的插斷要求級大於DISPATCH_LEVEL,則直接設定當前的插斷要求級  {    KeGetPcr()->Irql = NewIrql;    return;    }    //NewIrql低於DISPATCH_LEVEL    KeGetPcr()->Irql = DISPATCH_LEVEL; //所要降到的插斷要求級小於DISPATCH_LEVEL,設定當前的插斷要求級為DISPATCH_LEVEL,                                     //然後掃描dpc隊列,如果不為空白,則觸發dpc軟體中斷  if (((PKIPCR)KeGetPcr())->HalReserved[HAL_DPC_REQUEST])    {  //DPC請求隊列非空    ((PKIPCR)KeGetPcr())->HalReserved[HAL_DPC_REQUEST] = FALSE;    KiDispatchInterrupt();    }    KeGetPcr()->Irql = APC_LEVEL; //所要降到的插斷要求級小於APC_LEVEL,設定當前的插斷要求級為APC_LEVEL,                                //然後掃描apc隊列,如果不為空白,則觸發apc軟體中斷  if (NewIrql == APC_LEVEL)    {    return;    }    //NewIrql低於APC_LEVEL    if (KeGetCurrentThread() != NULL &&KeGetCurrentThread()->ApcState.KernelApc Pending)    {    KiDeliverApc(KernelMode, NULL, NULL);    }    KeGetPcr()->Irql = PASSIVE_LEVEL;  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • jpg 改 rar 

windows核心情景分析之—— KeRaiseIrql函數與KeLowerIrql()函數

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.