根据HKey查找当前打开的注册表路径

2014-11-18 18:37:20 · 作者: · 浏览: 26

  在StackOverFlow里找到的,一定要收藏起来。


  #include


  #include


  typedef LONG NTSTATUS;


  #ifndef STATUS_SUCCESS


  #define STATUS_SUCCESS ((NTSTATUS)0x00000000L)


  #endif


  #ifndef STATUS_BUFFER_TOO_SMALL


  #define STATUS_BUFFER_TOO_SMALL ((NTSTATUS)0xC0000023L)


  #endif


  std::wstring GetKeyPathFromKKEY(HKEY key)


  {


  std::wstring keyPath;


  if (key != NULL)


  {


  HMODULE dll = LoadLibrary(L"ntdll.dll");


  if (dll != NULL) {


  typedef DWORD (__stdcall *ZwQueryKeyType)(


  HANDLE KeyHandle,


  int KeyInformationClass,


  PVOID KeyInformation,


  ULONG Length,


  PULONG ResultLength);


  ZwQueryKeyType func = reinterpret_cast (::GetProcAddress(dll, "ZwQueryKey"));


  if (func != NULL) {


  DWORD size = 0;


  DWORD result = 0;


  result = func(key, 3, 0, 0, &size);


  if (result == STATUS_BUFFER_TOO_SMALL)


  {


  size = size + 2;


  wchar_t* buffer = new (std::nothrow) wchar_t[size];


  if (buffer != NULL)


  {


  result = func(key, 3, buffer, size, &size);