找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 2115|回复: 0

实现windbg查看错误信息插件

[复制链接]
发表于 2015-11-18 23:54:57 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
vs有个实用程序是 错误查找,可以显示错误值信息,windbg也有,然而却不好使,内核错误显示不出,不明白为啥越能提供方便的功能微软越做不好

下面是我写的插件用例:
0:000> !err
usage: !err [-c code][-l]
        Default code is $retreg;        l stands for Api LastError
example:!err -c C0000001                !err        !err -l
Kernel ErrorCode:
        MessageId:STATUS_UNSUCCESSFUL
        MesageText:{Operation Failed} The requested operation was unsuccessful.
0:000> reax=c0000002
0:000> !err
usage: !err [-c code][-l]
        Default code is $retreg;        l stands for Api LastError
example:!err -c C0000001                !err        !err -l
Kernel ErrorCode:
        MessageId:STATUS_NOT_IMPLEMENTED
        MesageText:{Not Implemented} The requested operation is not implemented.
0:000> !err -c 5
usage: !err [-c code][-l]
        Default code is $retreg;        l stands for Api LastError
example:!err -c C0000001                !err        !err -l
Windows ErrorCode:
        MessageId:ERROR_ACCESS_DENIED
        MesageText:Access is denied.
0:000> eb @@(&(_TEB*)(@$teb)->LastErrorValue) 6
0:000> !err -l
usage: !err [-c code][-l]
        Default code is $retreg;        l stands for Api LastError
example:!err -c C0000001                !err        !err -l
Windows ErrorCode:
        MessageId:ERROR_INVALID_HANDLE
        MesageText:The handle is invalid.

注意,!err可以根据参数解析指定错误号、GetLastError()错误号、Eax错误号



  1. ERRORINFO data1[]=//应用层
  2. {
  3.         {0, "ERROR_SUCCESS", "The operation completed successfully."},
  4.         {1, "ERROR_INVALID_FUNCTION", "Incorrect function."},    // dderror
  5.         {2, "ERROR_FILE_NOT_FOUND", "The system cannot find the file specified."},
  6.         {3, "ERROR_PATH_NOT_FOUND", "The system cannot find the path specified."},
  7.         {4, "ERROR_TOO_MANY_OPEN_FILES", "The system cannot open the file."}
  8.         。。。。。。。。。。。。。。。。。
  9. ERRORINFO data2[]=//内核层
  10. {
  11.         {0x00000000, "STATUS_WAIT_0", "STATUS_WAIT_0"},
  12.         {0x00000001, "STATUS_WAIT_1", "STATUS_WAIT_1"},
  13.         {0x00000002, "STATUS_WAIT_2", "STATUS_WAIT_2"},
  14.         {0x00000003, "STATUS_WAIT_3", "STATUS_WAIT_3"},
  15.         {0x0000003F, "STATUS_WAIT_63", "STATUS_WAIT_63"},
  16.         {0x00000080, "STATUS_ABANDONED", "The success status codes 128 - 191 are reserved for wait completion status with an abandoned mutant object."},
  17.         {0x00000080, "STATUS_ABANDONED_WAIT_0", "STATUS_ABANDONED_WAIT_0"},
  18.         {0x000000BF, "STATUS_ABANDONED_WAIT_63", "STATUS_ABANDONED_WAIT_63"},

  19. #include "DbgEng.h"
  20. #include "errors.h"
  21. #include <windows.h>

  22. int GetOnlyParamVal(PCSTR& begin, PCSTR& end);

  23. HRESULT CALLBACK
  24. err(PDEBUG_CLIENT pDebugClient, PCSTR args)
  25. {
  26.         IDebugControl* pDebugControl;

  27.         if (SUCCEEDED(pDebugClient->QueryInterface(__uuidof(IDebugControl), (void **)&pDebugControl)))
  28.         {
  29.                 HRESULT result = 0;
  30.                 pDebugControl->Output(DEBUG_OUTPUT_NORMAL, "usage: !err [-c code][-l]\n");//不指定参数则自动判断内核态用户态错误
  31.                 pDebugControl->Output(DEBUG_OUTPUT_NORMAL, "\tDefault code is $retreg;        l stands for Api LastError\n");
  32.                 pDebugControl->Output(DEBUG_OUTPUT_NORMAL, "example:!err -c C0000001                !err        !err -l\n");

  33.                 ULONG ErrorCode = -1;
  34.                 DEBUG_VALUE value;

  35.                 PCSTR a;
  36.                 if (a = strstr(args, "-c"))
  37.                 {
  38.                         char exp[256]="";
  39.                         a += 2;
  40.                         PCSTR begin = a, end = a;
  41.                         int len = GetOnlyParamVal(begin, end);
  42.                         strncpy(exp, begin, len);
  43.                         exp[len] = '\0';
  44.                         if (SUCCEEDED(pDebugControl->Evaluate(exp, DEBUG_VALUE_INT32, &value, NULL)))
  45.                         {
  46.                                 ErrorCode = value.I32;
  47.                         }
  48.                 }
  49.                 else if (strstr(args, "-l"))
  50.                 {
  51.                         if (SUCCEEDED(pDebugControl->Evaluate("@@((_TEB*)(@$teb)->LastErrorValue)", DEBUG_VALUE_INT32, &value, NULL)))
  52.                         {
  53.                                 ErrorCode = value.I32;
  54.                         }
  55.                 }
  56.                 else
  57.                 {
  58.                         if (SUCCEEDED(pDebugControl->Evaluate("$retreg ", DEBUG_VALUE_INT32, &value, NULL)))
  59.                         {
  60.                                 ErrorCode = value.I32;
  61.                         }
  62.                 }

  63.                 if (ErrorCode != -1)
  64.                 {
  65.                         int i;
  66.                         for (i = 0; i < sizeof(data1) / sizeof(data1[0]); i++)
  67.                         {
  68.                                 if (ErrorCode == data1[i].ErrorCode)
  69.                                 {
  70.                                         pDebugControl->Output(DEBUG_OUTPUT_NORMAL, "Windows ErrorCode:\n\tMessageId:%s\n\tMesageText:%s\n",
  71.                                                 data1[i].MessageId, data1[i].MessageText);
  72.                                 }
  73.                         }
  74.                         for (i = 0; i < sizeof(data2) / sizeof(data2[0]); i++)
  75.                         {
  76.                                 if (ErrorCode == data2[i].ErrorCode)
  77.                                 {
  78.                                         pDebugControl->Output(DEBUG_OUTPUT_NORMAL, "Kernel ErrorCode:\n\tMessageId:%s\n\tMesageText:%s\n",
  79.                                                 data2[i].MessageId, data2[i].MessageText);
  80.                                 }
  81.                         }
  82.                 }
  83.                 else
  84.                 {
  85.                         pDebugControl->Output(DEBUG_OUTPUT_NORMAL, "Cannot find this error value!\n");
  86.                 }
  87.         }
  88.         pDebugControl->Release();
  89.         return S_OK;
  90. }
复制代码

回复

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-22 01:12 , Processed in 0.031163 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表