找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2945|回复: 0
打印 上一主题 下一主题
收起左侧

编程练习作品 -> GetError 翻译小工具(非原创)

[复制链接]
跳转到指定楼层
楼主
ID:71922 发表于 2015-1-10 23:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
       本来是想利用学到的 SSDT HOOK 设计一个主动防御软件。无奈,不知道sys怎么与exe通信,例如,当驱动拦截了应用程序的某个危险操作要怎么样去通知exe,让其询问用户,是否放行等... 目前只会exe向sys下指令... o(︶︿︶)o 唉,基础不行啊...想找几套关于驱动编写方面的视频教程都找不到...纳闷。无聊中就在自己的硬盘里看到了 windows核心编程电子书,看了第一章,觉得受益不少。写下代码以后备用...
        以下是根据书里面的代码设计的一个小工具,个人觉得除错的时候挺有用的。



      以下为源码,源码有注释: (源码来自 Windows核心编程 第五版)====================================================================================
int len = 0;
void CTSDlg::OnEnChangeEditError()
{
// 获取用户输入的错误码 必须以整型的方式获取
DWORD dwError = GetDlgItemInt(IDC_EDIT_ERROR, NULL, FALSE);
if (!dwError)
  return;
// 指向一个内存卡的句柄被实例化并初始化为 NULL FormatMessage函数在内部分配一块内存,并返回指向这块内存的句柄
HLOCAL hlocal = NULL;      
DWORD systemLocale = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL);  // 生成语言标识符,这两个常量常联合在一起生成一个 0 即操作系统默认语言
BOOL fOk = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM |    // 获取一个与系统定义的错误代码对应的字符串
  FORMAT_MESSAGE_IGNORE_INSERTS |   // 允许获得含有 %占位符的消息 用来被Windows 提供更多上下文相关信息
  FORMAT_MESSAGE_ALLOCATE_BUFFER,   // 分配一块足以容纳错误文本描述的内存 此内存句柄将在hlocal变量返回
  NULL, dwError,        // dwError 要查找的错误代码
  systemLocale,        // 指出用什么语言来显示文本描述
  (PTSTR)&hlocal, 0, NULL);
// 如果获取失败 尝试在 NetMsg.dll 查找消息代码 看错误是否与网络有关
if (!fOk)
{
  HMODULE hDll = LoadLibraryEx(L"netmsg.dll", NULL, DONT_RESOLVE_DLL_REFERENCES);
  if(hDll != NULL)
  {
   fOk = FormatMessage(FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER,
    hDll, dwError, systemLocale, (PTSTR)&hlocal, 0, NULL);
   FreeLibrary(hDll);
  }
}
if (fOk && (hlocal != NULL))
{
  m_Clist_ErrorTxt.InsertString (len, (PCTSTR)LocalLock(hlocal));
  LocalLock(hlocal);
}
else
  m_Clist_ErrorTxt.InsertString (len, L"没有找到相关错误信息~");
m_Clist_ErrorTxt.SetCurSel(len );
len++;
}
=======================================================================

不是原创作品,就不必发exe下载地址了...


7.1 更新:来自 百度百科
========================================================================
FormatMessage功能就是将GetLastError得到的错误信息(这个错误信息是数字代号)转化成字符串信息的函数
  FormatMessage()
  函数FormatMessage声明如下:
  DWORD WINAPI FormatMessage(
  __in DWORD dwFlags,
  __in_opt LPCVOID lpSource,
  __in DWORD dwMessageId,
  __in DWORD dwLanguageId,
  __out LPTSTR lpBuffer,
  __in DWORD nSize,
  __in_opt va_list *Arguments
  );
  参数说明:
  dwFlags:
  标志位,决定如何说明lpSource参数,dwFlags的低位制定如何处理换行功能在输出缓冲区,也决定最大宽度的格式化输出行。
  可选参数:
  
标志标志说明
FORMAT_MESSAGE_ALLOCATE_BUFFER
0x00000100
函数会分配一个足够大的缓冲区保存格式化消息,并且通过lpBuffer指向该
地址。
FORMAT_MESSAGE_ARGUMENT_ARRAY
0x00002000
Arguments参数不是指向va_list结构体,但是是一个指向保存参数的数据。
FORMAT_MESSAGE_FROM_HMODULE
0x00000800
lpSource参数是需要去搜索的一个包含消息表的模块线程。如果lpSource
是NULL,当前进程的应用图像会被搜索,这个标志不能同FORMAT_ME
SSAGE_FROM_STRING使用。
FORMAT_MESSAGE_FROM_STRING
0x00000400
lpSource参数是一个指向以NULL结尾的字符串,字符串包含一个消息定义,
这个消息定义可以包含插入序列。此标志最好不要和FORMAT_MESSAGE_F
ROM_HMODULE或者FORMAT_MESSAGE_FROM_SYSTEM使用
FORMAT_MESSAGE_FROM_SYSTEM
0x00001000
函数会为了请求的信息而搜索系统的消息表资源。如果标志同时也指定了
FORMAT_MESSAGE_FROM_HMODULE,那么函数会先在lpSource指定
的模块中搜索请求的消息,如果搜索不到,就去搜索系统消息表资源。此
标志不能与FORMAT_MESSAGE_FROM_STRING使用。
FORMAT_MESSAGE_IGNORE_INSERTS
0x00000200
消息定义中的插入序列会被一直忽略和跳过直到输出缓冲区不改变,并且
Arguments会被忽略。

  lpSource:
  根据dwFlags标志而定。
  dwMessageId:
  请求的消息的标识符。当dwFlags标志为FORMAT_MESSAGE_FROM_STRING时会被忽略。
  dwLanguageId:
  请求的消息的语言标识符。
  nSize:
  如果FORMAT_MESSAGE_ALLOCATE_BUFFER标志没有被指定,这个参数必须指定为输出缓冲区的大小,
  如果指定,这个参数指定为分配给输出缓冲区的最小数。
  Arguments:
  保存格式化信息中的插入值的一个数组。
  返回值
  如果函数调用成功,返回输出缓冲区的大小,除最后一个空字符。如果失败侧返回0。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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