找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

帖子
查看: 2928|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

編程練習(xí)作品 -> GetError 翻譯小工具(非原創(chuàng))

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:71922 發(fā)表于 2015-1-10 23:31 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
       本來(lái)是想利用學(xué)到的 SSDT HOOK 設(shè)計(jì)一個(gè)主動(dòng)防御軟件。無(wú)奈,不知道sys怎么與exe通信,例如,當(dāng)驅(qū)動(dòng)攔截了應(yīng)用程序的某個(gè)危險(xiǎn)操作要怎么樣去通知exe,讓其詢(xún)問(wèn)用戶(hù),是否放行等... 目前只會(huì)exe向sys下指令... o(︶︿︶)o 唉,基礎(chǔ)不行啊...想找?guī)滋钻P(guān)于驅(qū)動(dòng)編寫(xiě)方面的視頻教程都找不到...納悶。無(wú)聊中就在自己的硬盤(pán)里看到了 windows核心編程電子書(shū),看了第一章,覺(jué)得受益不少。寫(xiě)下代碼以后備用...
        以下是根據(jù)書(shū)里面的代碼設(shè)計(jì)的一個(gè)小工具,個(gè)人覺(jué)得除錯(cuò)的時(shí)候挺有用的。



      以下為源碼,源碼有注釋?zhuān)?(源碼來(lái)自 Windows核心編程 第五版)====================================================================================
int len = 0;
void CTSDlg::OnEnChangeEditError()
{
// 獲取用戶(hù)輸入的錯(cuò)誤碼 必須以整型的方式獲取
DWORD dwError = GetDlgItemInt(IDC_EDIT_ERROR, NULL, FALSE);
if (!dwError)
  return;
// 指向一個(gè)內(nèi)存卡的句柄被實(shí)例化并初始化為 NULL FormatMessage函數(shù)在內(nèi)部分配一塊內(nèi)存,并返回指向這塊內(nèi)存的句柄
HLOCAL hlocal = NULL;      
DWORD systemLocale = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL);  // 生成語(yǔ)言標(biāo)識(shí)符,這兩個(gè)常量常聯(lián)合在一起生成一個(gè) 0 即操作系統(tǒng)默認(rèn)語(yǔ)言
BOOL fOk = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM |    // 獲取一個(gè)與系統(tǒng)定義的錯(cuò)誤代碼對(duì)應(yīng)的字符串
  FORMAT_MESSAGE_IGNORE_INSERTS |   // 允許獲得含有 %占位符的消息 用來(lái)被Windows 提供更多上下文相關(guān)信息
  FORMAT_MESSAGE_ALLOCATE_BUFFER,   // 分配一塊足以容納錯(cuò)誤文本描述的內(nèi)存 此內(nèi)存句柄將在hlocal變量返回
  NULL, dwError,        // dwError 要查找的錯(cuò)誤代碼
  systemLocale,        // 指出用什么語(yǔ)言來(lái)顯示文本描述
  (PTSTR)&hlocal, 0, NULL);
// 如果獲取失敗 嘗試在 NetMsg.dll 查找消息代碼 看錯(cuò)誤是否與網(wǎng)絡(luò)有關(guān)
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éi)有找到相關(guān)錯(cuò)誤信息~");
m_Clist_ErrorTxt.SetCurSel(len );
len++;
}
=======================================================================

不是原創(chuàng)作品,就不必發(fā)exe下載地址了...


7.1 更新:來(lái)自 百度百科
========================================================================
FormatMessage功能就是將GetLastError得到的錯(cuò)誤信息(這個(gè)錯(cuò)誤信息是數(shù)字代號(hào))轉(zhuǎn)化成字符串信息的函數(shù)
  FormatMessage()
  函數(shù)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
  );
  參數(shù)說(shuō)明:
  dwFlags:
  標(biāo)志位,決定如何說(shuō)明lpSource參數(shù),dwFlags的低位制定如何處理?yè)Q行功能在輸出緩沖區(qū),也決定最大寬度的格式化輸出行。
  可選參數(shù):
  
標(biāo)志標(biāo)志說(shuō)明
FORMAT_MESSAGE_ALLOCATE_BUFFER
0x00000100
函數(shù)會(huì)分配一個(gè)足夠大的緩沖區(qū)保存格式化消息,并且通過(guò)lpBuffer指向該
地址。
FORMAT_MESSAGE_ARGUMENT_ARRAY
0x00002000
Arguments參數(shù)不是指向va_list結(jié)構(gòu)體,但是是一個(gè)指向保存參數(shù)的數(shù)據(jù)。
FORMAT_MESSAGE_FROM_HMODULE
0x00000800
lpSource參數(shù)是需要去搜索的一個(gè)包含消息表的模塊線(xiàn)程。如果lpSource
是NULL,當(dāng)前進(jìn)程的應(yīng)用圖像會(huì)被搜索,這個(gè)標(biāo)志不能同FORMAT_ME
SSAGE_FROM_STRING使用。
FORMAT_MESSAGE_FROM_STRING
0x00000400
lpSource參數(shù)是一個(gè)指向以NULL結(jié)尾的字符串,字符串包含一個(gè)消息定義,
這個(gè)消息定義可以包含插入序列。此標(biāo)志最好不要和FORMAT_MESSAGE_F
ROM_HMODULE或者FORMAT_MESSAGE_FROM_SYSTEM使用
FORMAT_MESSAGE_FROM_SYSTEM
0x00001000
函數(shù)會(huì)為了請(qǐng)求的信息而搜索系統(tǒng)的消息表資源。如果標(biāo)志同時(shí)也指定了
FORMAT_MESSAGE_FROM_HMODULE,那么函數(shù)會(huì)先在lpSource指定
的模塊中搜索請(qǐng)求的消息,如果搜索不到,就去搜索系統(tǒng)消息表資源。此
標(biāo)志不能與FORMAT_MESSAGE_FROM_STRING使用。
FORMAT_MESSAGE_IGNORE_INSERTS
0x00000200
消息定義中的插入序列會(huì)被一直忽略和跳過(guò)直到輸出緩沖區(qū)不改變,并且
Arguments會(huì)被忽略。

  lpSource:
  根據(jù)dwFlags標(biāo)志而定。
  dwMessageId:
  請(qǐng)求的消息的標(biāo)識(shí)符。當(dāng)dwFlags標(biāo)志為FORMAT_MESSAGE_FROM_STRING時(shí)會(huì)被忽略。
  dwLanguageId:
  請(qǐng)求的消息的語(yǔ)言標(biāo)識(shí)符。
  nSize:
  如果FORMAT_MESSAGE_ALLOCATE_BUFFER標(biāo)志沒(méi)有被指定,這個(gè)參數(shù)必須指定為輸出緩沖區(qū)的大小,
  如果指定,這個(gè)參數(shù)指定為分配給輸出緩沖區(qū)的最小數(shù)。
  Arguments:
  保存格式化信息中的插入值的一個(gè)數(shù)組。
  返回值
  如果函數(shù)調(diào)用成功,返回輸出緩沖區(qū)的大小,除最后一個(gè)空字符。如果失敗側(cè)返回0。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表