【问题标题】:Where can I find a list of all windows error codes?在哪里可以找到所有 Windows 错误代码的列表?
【发布时间】:2010-11-08 01:15:15
【问题描述】:

在上一个问题中,我问过当我的程序返回一个晦涩的值时是什么意思

-1073741819

嗯,现在我又得到了一个大的回报值,

-1073740777

我想知道是否有所有这些值的列表以及它们在哪里意味着什么?

【问题讨论】:

  • 我不敢相信,但据我所知,这是这个问题第一次出现在 SO 上。我想现在肯定它一定是重复的。

标签: windows error-code


【解决方案1】:

因为 Windows 错误代码系统是可扩展的,所以没有一个地方可以查找所有可能的 Windows 错误代码。但是,您可以从以下开始:

  • 研究Structure of COM Error Codes。有时了解错误来自哪个工具可以帮助您发现它来自哪个头文件。
  • 至少从 2003 年开始,Visual Studio 包含一个 ERRLOOK 工具。如果您使用的是 Visual Studio,请先尝试一下。
  • 您将遇到的许多代码都在Winerror.h 中。我已经包含了一个指向 MSDN 的链接,其中包含该头文件的内容。或者您可以在this 页面上按编号查看错误代码列表。
  • 理想情况下,您知道哪个函数返回了代码,然后您可以在 MSDN 上查找该函数并查看所有可能的返回值。当然,您需要参考 Winerror.h 或其他头文件来获取实际值。
  • 您可以在平台 SDK 的 Include 目录中 find(如 Unix grep)获取整个错误代码的十六进制值,或仅代码部分的十进制值——即,低 16 位。使用HRESULT_CODE 提取它。请参阅上面的 COM 错误代码的结构。
  • 有一些错误查找工具,您可以在其中粘贴一个值,然后它会在其数据库中查找它并告诉您它的含义。看看herehere
  • 谷歌。使用完整的十六进制值。有时您会发现非常有用的信息,或者至少是线索。

【讨论】:

    【解决方案2】:

    通常,如果您以十六进制而不是带符号的十进制形式打印错误号,您将获得更好的搜索结果。

    例如,您的第一个错误是 -1073741819,也可以用十六进制的 0xC0000005 表示。这是一个“访问冲突”错误,谷歌会很快告诉你。

    【讨论】:

    • 1073740777 的十六进制是 3ffffbe9,没有任何 google 搜索结果。
    • 是负数 1073740777,不是正数。
    • 十六进制的负数 1073740777 是什么?
    • 如果你使用 printf("%08x\n", (int)-1073740777);很容易得到正确的答案。如果您使用计算器,请输入 0x100000000 并减去十进制 1073740777,然后转换回十六进制。
    • 如果您将“-1073741819”粘贴到 Windows 计算器 (calc.exe) 中,然后单击 Hex 单选按钮(当它在其“科学”视图中时),则结果为 FFFFFFFFC0000005,即你可以看到意味着 0xC0000005。
    【解决方案3】:

    这是一个 100% 免费的在线工具“MagnumDB”,用于“幻数数据库”,其中包含从整个 Windows SDK 文件(约 6,000 个文件)解析的大约 350,000 个常量(整数、字符串、guid 等),您可以按值和名称查询。免责声明:我是在多年搜索常量、名称、guid 之后编写的...

    这是-1073741819 的结果,它映射到在 3 个不同文件中定义的 3 个不同的常量(具有相同的值和相同的含义),最常见的是 STATUS_ACCESS_VIOLATION

    对于-1073740777,它是在winnt.h 中定义的STATUS_INVALID_CRUNTIME_PARAMETER

    它支持整数、有符号整数、无符号整数、十六进制表示法以及原始文本搜索。它还知道由操作定义的常量的值(如 c2 = c1 + 1)。

    【讨论】:

      【解决方案4】:

      其中许多(但我认为与 COM 相关的不是)位于名为 winerror.h 的头文件中。

      在(某些版本的)Visual Studio 中,在“Tools”菜单下,您可能会找到一个名为“Error Lookup...”的菜单项。

      【讨论】:

      • 带有here描述符的COM代码列表。
      【解决方案5】:

      NTSTATUS

      NTSTATUS *涵盖一系列设施
      FACILITY_URT (0x013) *CLR 异常

      结果

      FACILITY_NULL (0x000)
      FACILITY_RPC (0x001)
      FACILITY_DISPATCH (0x002)
      FACILITY_RPC_STUBS (0x003)
      FACILITY_USER (0x004) *多个库可以复用相同的错误代码
      FACILITY_MCA_ERROR_CODE (0x005)
      FACILITY_WIN32, MSDN (0x007) *标准WINAPI错误代码
      FACILITY_WINDOWS (0x008)
      FACILITY_SECURITY (0x009)FACILITY_CERT (0x00B)
      FACILITY_INTERNET (0x00C)
      FACILITY_MEDIASERVER (0x00D)
      FACILITY_MSMQ (0x00E)
      FACILITY_SETUPAPI (0x00F)
      FACILITY_SCARD (0x010)
      FACILITY_COMPLUS (0x011)
      FACILITY_HTTP (0x019)
      FACILITY_USERMODE_FILTER_MANAGER (0x01F)
      FACILITY_WINDOWSUPDATE (0x024)
      FACILITY_GRAPHICS (0x026)
      FACILITY_NAP (0x027)
      FACILITY_INK (0x028)
      FACILITY_TPM_SOFTWARE (0x029)
      FACILITY_UI (0x02A)
      FACILITY_PLA (0x030)
      FACILITY_FVE ( 0x031)
      FACILITY_FWP (0x032)
      FACILITY_WINRM (0x033)
      FACILITY_NDIS (0x034)
      FACILITY_USERMODE_HYPERVISOR (0x035)
      FACILITY_USERMODE_VIRTUALIZATION (0x037)
      FACILITY_USERMODE_VOLMGR (0x038)
      FACILITY_BCD (0x039)
      FACILITY_USERMODE_VHD (0x03A)
      FACILITY_SDIAG (0x03C)
      FACILITY_WEBSERVICES (0x03D)
      FACILITY_WPN (0x03E) )
      FACILITY_MBN (0x054)
      FACILITY_P2P (0x063)
      @987654 363@ (0x065)
      FACILITY_AUDIO (0x066)
      FACILITY_IMAPI2 (0x0AA)
      FACILITY_RTC_INTERFACE (0x0EE)
      FACILITY_SIP_STATUS_CODE (0x0EF)
      FACILITY_PINT_STATUS_CODE (0x0F0)
      FACILITY_MAX_WDSTPTMGMT (0x110)
      FACILITY_WDSMCSERVER (0x121)
      FACILITY_MAX_WDSMC (0x122)
      FACILITY_MAX_WDSCP (0x125)
      FACILITY_BACKUP (0x7FF)
      @987654374 @ (0x800)
      FACILITY_DIRECT3D10 (0x879)
      FACILITY_DXGI (0x87A)
      FACILITY_DXGI_DDI (0x87B)
      FACILITY_DIRECT3D11 (0x87C)
      FACILITY_DWRITE (0x898)
      br>FACILITY_D2D (0x899)
      FACILITY_DEFRAG (0x900)
      FACILITY_ONLINE_ID (0xA02)

      错误检查

      Bug Check Code Reference *aka 蓝屏

      【讨论】:

        【解决方案6】:

        嗯,这里有很多,

        http://msdn.microsoft.com/en-us/library/ms681381(VS.85).aspx

        但是当我得到一个像你这样的例子时,我只是谷歌了这个号码。

        【讨论】:

          【解决方案7】:

          这是C# 中的一个类,可帮助您将错误代码 转换为string

          public static class WinErrors
          {
              #region definitions
              [DllImport("kernel32.dll", SetLastError = true)]
              static extern IntPtr LocalFree(IntPtr hMem);
          
              [DllImport("kernel32.dll", SetLastError = true)]
              static extern int FormatMessage(FormatMessageFlags dwFlags, IntPtr lpSource, uint dwMessageId, uint dwLanguageId, ref IntPtr lpBuffer, uint nSize, IntPtr Arguments);
          
              [Flags]
              private enum FormatMessageFlags : uint
              {
                  FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x00000100,
                  FORMAT_MESSAGE_IGNORE_INSERTS = 0x00000200,
                  FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000,
                  FORMAT_MESSAGE_ARGUMENT_ARRAY = 0x00002000,
                  FORMAT_MESSAGE_FROM_HMODULE = 0x00000800,
                  FORMAT_MESSAGE_FROM_STRING = 0x00000400,
              }
              #endregion
          
              /// <summary>
              /// Gets a user friendly string message for a system error code
              /// </summary>
              /// <param name="errorCode">System error code</param>
              /// <returns>Error string</returns>
              public static string GetSystemMessage(int errorCode)
              {
                  try
                  {
                      IntPtr lpMsgBuf = IntPtr.Zero;
          
                      int dwChars = FormatMessage(
                          FormatMessageFlags.FORMAT_MESSAGE_ALLOCATE_BUFFER | FormatMessageFlags.FORMAT_MESSAGE_FROM_SYSTEM | FormatMessageFlags.FORMAT_MESSAGE_IGNORE_INSERTS,
                          IntPtr.Zero,
                          (uint) errorCode,
                          0, // Default language
                          ref lpMsgBuf,
                          0,
                          IntPtr.Zero);
                      if (dwChars == 0)
                      {
                          // Handle the error.
                          int le = Marshal.GetLastWin32Error();
                          return "Unable to get error code string from System - Error " + le.ToString();
                      }
          
                      string sRet = Marshal.PtrToStringAnsi(lpMsgBuf);
          
                      // Free the buffer.
                      lpMsgBuf = LocalFree(lpMsgBuf);
                      return sRet;
                  }
                  catch (Exception e)
                  {
                      return "Unable to get error code string from System -> " + e.ToString();
                  }
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2013-04-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-07-13
            • 2013-07-06
            • 1970-01-01
            相关资源
            最近更新 更多