通过注册表的句柄得到当前句柄在注册表中的路径

   1: #include <windows.h>
   2: #include <string>
   3:  
   4: typedef LONG NTSTATUS;
   5:  
   6: #ifndef STATUS_SUCCESS
   7: #define STATUS_SUCCESS ((NTSTATUS)0x00000000L)
   8: #endif
   9:  
  10: #ifndef STATUS_BUFFER_TOO_SMALL
  11: #define STATUS_BUFFER_TOO_SMALL ((NTSTATUS)0xC0000023L)
  12: #endif
  13:  
  14: std::wstring GetKeyPathFromKKEY(HKEY key)
  15: {
  16:     std::wstring keyPath;
  17:     if (key != NULL)
  18:     {
  19:      HMODULE dll = LoadLibrary(L"ntdll.dll");
  20:      if (dll != NULL) {
  21:       typedef DWORD (__stdcall *ZwQueryKeyType)(
  22:        HANDLE  KeyHandle,
  23:        int KeyInformationClass,
  24:        PVOID  KeyInformation,
  25:        ULONG  Length,
  26:        PULONG  ResultLength);
  27:  
  28:       ZwQueryKeyType func = reinterpret_cast<ZwQueryKeyType>(::GetProcAddress(dll, "ZwQueryKey"));
  29:  
  30:       if (func != NULL) {
  31:        DWORD size = 0;
  32:        DWORD result = 0;
  33:        result = func(key, 3, 0, 0, &size);
  34:        if (result == STATUS_BUFFER_TOO_SMALL)
  35:        {
  36:         size = size + 2;
  37:         wchar_t* buffer = new (std::nothrow) wchar_t[size];
  38:         if (buffer != NULL)
  39:         {
  40:          result = func(key, 3, buffer, size, &size);
  41:          if (result == STATUS_SUCCESS)
  42:          {
  43:           buffer[size / sizeof(wchar_t)] = L'\0';
  44:           keyPath = std::wstring(buffer + 2);
  45:          }
  46:  
  47:          delete[] buffer;
  48:         }
  49:        }
  50:       }
  51:  
  52:       FreeLibrary(dll);
  53:      }
  54:     }
  55:     return keyPath;
  56: }
  57:  
  58: int _tmain(int argc, _TCHAR* argv[])
  59: {
  60:     HKEY key = NULL;
  61:     LONG ret = ERROR_SUCCESS;
  62:  
  63:     ret = RegOpenKey(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft", &key);
  64:     if (ret == ERROR_SUCCESS)
  65:     {
  66:      wprintf_s(L"Key path for %p is '%s'.", key, GetKeyPathFromKKEY(key).c_str());    
  67:      RegCloseKey(key);
  68:     }
  69:  
  70:     return 0;
  71: }
posted @ 2010-03-23 23:47  Gang.Wang  阅读(924)  评论(0编辑  收藏  举报