熱點推薦:
您现在的位置: 電腦知識網 >> 操作系統 >> Windows系統管理 >> 正文

windows下異常處理

2013-11-11 21:32:42  來源: Windows系統管理 

  異常的分發和處理時在線程范圍內進行的異常處理器的注冊也是相對線程而言的Windows系統中的每個用戶態線程都擁有一個線程環境塊(Thread Environment Block)TEB結構的具體定義TEB結構的起始處總有一個被稱為線程信息塊(Thread information Block)的結構簡稱TIBTIB的第一字段ExceptionList記錄的就是用來登記結構化異常處理鏈表的表頭地址在x系統中段寄存器FS總是指向線程的TEB/TIB結構FS[] 總是指向結構化異常處理鏈表的表頭所以將這個鏈表稱為FS[]鏈條可以把結構化異常處理看作是操作系統與用戶代碼軟硬件異常的一種模型而FS[]鏈條便是這兩者間協作的接口當有異常需要處理時操作系統通過FS[]鏈條來尋找異常處理器給用戶代碼異常情況的機會

  可以手工編寫代碼來登記和注銷異常處理器首先需要編寫一個異常處理器函數它應該具有標准的sehHandler原型然後在棧上建立一個EXCEPTION_REGISTRATION_RECORD結構並把這個結構的地址注冊到FS[]鏈表中

  注冊FS[]的代碼如下所示

  #include stdafxh

  #include <windowsh>

  // 定義一個符合sehHandler原型的異常處理函數如果該函數檢測發生的是

  // 除零異常然後將上下文結構中的ECX寄存器的值改為讓其繼續執行

  // 導致異常的代碼第二次執行時由於除數不再為所以可以順利執行了

  EXCEPTION_DISPOSITION __cdecl _raw_seh_handler( struct _EXCEPTION_RECORD *ExceptionRecord

  void * EstablisherFrame

  struct _CONTEXT * ContexRecord

  void * DispacherContext

  )

  {

  printf(_raw_seh_handler codex%x flagsx%x\n

  ExceptionRecord>ExceptionCode

  ExceptionRecord>ExceptionFlags)

  if(ExceptionRecord>ExceptionCode == STATUS_INTEGER_DIVIDE_BY_ZERO)

  {

  ContexRecord>Ecx =

  return ExceptionContinueExecution

  }

  return ExceptionContinueSearch

  }

  int main(int argc char* argv[])

  {

  __asm

  {

  // 手工方法將異常函數注冊到FS[]鏈表中

  push OFFSET _raw_seh_handler

  push FS[]

  mov FS[] ESP

  // 執行除零異常

  xor edx edx

  mov eax

  xor ecx ecx

  idiv ecx

  mov eax [ESP]

  mov FS[] EAX

  add esp

  }

  printf(Hello World!\n

  return

  }


From:http://tw.wingwit.com/Article/os/xtgl/201311/8664.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.