65.9K
CodeProject 正在变化。 阅读更多。
Home

NTSTATUS 查询应用程序

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.65/5 (9投票s)

2004年3月24日

2分钟阅读

viewsIcon

60331

downloadIcon

1074

有时,我们需要通过 FormatMessage 函数查询 NTSTATUS 代码查找,这不太方便。因此,我决定编写一个 NTSTATUS 错误代码查找应用程序。

Sample Image - NtStatus.gif

引言

开发人员通常使用 Visual Studio 提供的错误查找应用程序,将 GetLastError() 转换为带有详细描述的便于理解的错误字符串。但是,有时我们也需要通过 FormatMessage 函数查询 NTSTATUS 代码查找,这不太方便。因此,我决定编写一个 NTSTATUS 错误代码查找应用程序。

背景

这很简单,只需将 FormatMessage 函数中的 Messagesource 更改为 NTDLL.DLL 的句柄即可。

//
 FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|
  FORMAT_MESSAGE_FROM_HMODULE,Hand,ntStatusMsg,
  MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
  (LPTSTR)&lpMessageBuffer,0,NULL);

//

详细说明

FormatMessage 函数格式化消息字符串。该函数需要一个消息定义作为输入。消息定义可以来自传递到函数的缓冲区。它可以来自已加载模块中的消息表资源。或者,调用者可以要求该函数在系统的消息表资源中搜索消息定义。该函数根据消息标识符和语言标识符在消息表资源中找到消息定义。该函数将格式化的消息文本复制到输出缓冲区,如果请求,则处理任何嵌入的插入序列。” FormatMessage 的语法是

//
 DWORD FormatMessage(DWORD dwFlags,LPCVOID lpSource,
   DWORD dwMessageID,DWORD dwLanguageID,LPTSTR lpBuffer, 
   DWORD nSize,va_list* Arguments);
//

第一个参数 dwFlags 包含对我们来说重要的格式化选项。完整的应用程序也包含在内。整个技巧是通过 LoadLibrary 获取错误代码资源的句柄。

//
HMODULE Hand = LoadLibrary("NTDLL.DLL");
//

然后只需格式化消息并将 ntStatus 代码传递给它,即可获得相应的字符串。很简单!!不是吗?但是,一个应用程序作为错误查找会非常方便。

//
 FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | 
   FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_FROM_HMODULE, 
   Hand,ntStatusMsg,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
   (LPTSTR)&lpMessageBuffer,0,NULL);

//

就这样!很简单。我已经制作了一个示例应用程序。您可以随意使用它。

未来发布

  • 将其制作成 Visual Studio 插件。
  • 将其移植到 Visual Studio .NET 2003 并将其也制作成插件。

就这样!!

我知道它太简单了,但我发现这是一种有趣的方式来制作一个小应用程序,我需要它自己并与我的开发人员朋友分享。

© . All rights reserved.