Chinaunix首页 | 论坛 | 博客
  • 博客访问: 26773
  • 博文数量: 10
  • 博客积分: 245
  • 博客等级: 二等列兵
  • 技术积分: 120
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-08 09:38
文章分类

全部博文(10)

文章存档

2012年(10)

我的朋友

分类: WINDOWS

2012-08-20 21:57:58


点击(此处)折叠或打开

  1. #include <windows.h>
  2. #include <stdio.h>
  3. //#include <Winternl.h>
  4. //#include <LMACCESS.h>// typedef LONG NTSTATUS, *PNTSTATUS;
  5. #include <NtSecApi.h>// typedef LONG NTSTATUS, *PNTSTATUS;

  6. // 下面函数是某英文网站看到的
  7. /*
  8.  * This is an alternative to the RtlNtStatusToDosError()
  9.  * function in ntdll.dll. It uses the GetOverlappedResult()
  10.  * function in kernel32.dll to do the conversion.
  11.  */
  12. DWORD ConvertNtStatusToWin32Error(LONG ntstatus)
  13. {
  14.     DWORD oldError;
  15.     DWORD result;
  16.     DWORD br;
  17.     OVERLAPPED o;
  18.     
  19.     o.Internal = ntstatus;
  20.     o.InternalHigh = 0;
  21.     o.Offset = 0;
  22.     o.OffsetHigh = 0;
  23.     o.hEvent = 0;
  24.     oldError = GetLastError();
  25.     GetOverlappedResult(NULL, &o, &br, FALSE);
  26.     result = GetLastError();
  27.     SetLastError(oldError);
  28.     return result;
  29. }

  30. void main()
  31. {
  32.     // STATUS_INVALID_INFO_CLASS(0xC0000003L)

  33.     DWORD dw = ConvertNtStatusToWin32Error(0xC0000003L);
  34.     printf("%d\n", dw);

  35. // *** ***

  36.     HINSTANCE hDllInst = LoadLibrary("Ntdll.dll");
  37.     if(hDllInst)
  38.     {
  39.         typedef ULONG (WINAPI *MYFUNC)(IN NTSTATUS Status);
  40.         MYFUNC RtlNtStatusToDosError = NULL; // RtlNtStatusToDosError 函数别名
  41.         RtlNtStatusToDosError = (MYFUNC)GetProcAddress(hDllInst, "RtlNtStatusToDosError");
  42.         // "RtlNtStatusToDosError" 在DLL中声明的函数名
  43.         if(RtlNtStatusToDosError)
  44.         {
  45.             DWORD dw = RtlNtStatusToDosError(0xC0000003L);
  46.             printf("%d\n", dw);
  47.         }
  48.         FreeLibrary(hDllInst);
  49.     }
  50. }
 
顺路看到几个宏,记下来:
  1. MAKE_HRESULT(sev, fac, code): 将 severity、facility、code 合并为 HRESULT  
  2. HRESULT_CODE(hr): 取得 HRESULT 的 code 部分  
  3. HRESULT_FACILITY(hr): 取得 HRESULT 的 facility 部分  
  4. HRESULT_SEVERITY(hr): 取得 HRESULT 的 severity 位  
  5.   
  6. HRESULT_FROM_NT(nt_stat): 从 NTSTATUS 变换到 HRESULT  
  7. HRESULT_FROM_WIN32(win_err): 从 Win32 状态码变换到 HRESULT  
  8.   
  9. SUCCEEDED(hr): HRESULT 是否表示成功  
  10. FAILED(hr): HRESULT 是否表示失败  
  11. IS_ERROR(hr): HRESULT 是否表示一个错误  

阅读(1607) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~