Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Реестр: преобразование HKEY в полный путь

401
16 июля 2007 года
Br@in RIPper
289 / / 15.02.2003
Как получить по хэндлу открытого ключа (HKEY) полный путь к нему?

например "HKEY_CURRENT_USER\Software\Microsoft\File Manager\Settings"
или просто "Software\Microsoft\File Manager\Settings"

порылся в WinAPI ф-иях Reg... - ничего не нашел подходящего :(
7
17 июля 2007 года
@pixo $oft
3.4K / / 20.09.2006
А поробуй сохрани в файл(RegSaveKey),а потом прочитай его.Надеюсь,с форматом .reg-файлов знаком
401
19 июля 2007 года
Br@in RIPper
289 / / 15.02.2003
Цитата: @pixo $oft
А поробуй сохрани в файл(RegSaveKey),а потом прочитай его.Надеюсь,с форматом .reg-файлов знаком



Не, не катит даже в качестве решения "на крайний случай". Программа не может гарантировать, что у нее будет право доступа на запись к жесткому диску из-под текущего пользователя. не говоря уже о неэлегантности такого решения :)

10
19 июля 2007 года
Freeman
3.2K / / 06.03.2004
Предлагаешь лезть в MSDN нам?
401
19 июля 2007 года
Br@in RIPper
289 / / 15.02.2003
Цитата: Freeman
Предлагаешь лезть в MSDN нам?



Нет, я никому и ничего не предлагаю. Я просто прошу помощи в вышеозначенном вопросе, поскольку самостоятельно приемлемого решения найти я не смог

19K
20 июля 2007 года
Rost
45 / / 05.07.2007
Цитата: Freeman
Предлагаешь лезть в MSDN нам?


А я люблю MSDN :) Да и уже близок к решению этой проблеммы (: Вот только возвращаемый путь получается не совсем нужного формата... я просто не знаю все поля структуры возвращаемой функцией ZwQueryKey... хотя можно пропарсить и убрать не нужное :)

Код:
typedef enum tagKEY_INFO_CLASS
{
    KEY_BASE_INFORMATION    = 0,
    KEY_NODE_INFORMATION,
    KEY_FULL_INFORMATION,
    KEY_NAME_INFORMATION
}
KEY_INFO_CLASS;
//----
typedef DWORD (__stdcall *ZW_QUERY_KEY)(HKEY, KEY_INFO_CLASS, PVOID, DWORD, PDWORD);
//----
//-----------------------------------------------------------------------------------
bool RegGetKeyPath(HKEY _hKey, WCHAR *_pszWay)
{
 if((_hKey == INVALID_HANDLE_VALUE) || (_pszWay == NULL))   return false;
 //--
 
 HMODULE        hNTLib;
 ZW_QUERY_KEY       pQueryKeyProc;
 PBYTE          pData;
 DWORD          nDataLen;
 
 if((hNTLib = LoadLibrary(TEXT("ntdll.dll"))) != NULL)
  {
   if((pQueryKeyProc = (ZW_QUERY_KEY)GetProcAddress(hNTLib, "ZwQueryKey")) != NULL)
    {
     (*pQueryKeyProc)(_hKey, KEY_NAME_INFORMATION, NULL, NULL, &nDataLen);
     
     try
      {
       pData    = new BYTE[nDataLen];
      }
     catch(...)
      {
       FreeLibrary(hNTLib);
       return false;
      }
     
     (*pQueryKeyProc)(_hKey, KEY_NAME_INFORMATION, pData, nDataLen, &nDataLen);
     
     [COLOR="SeaGreen"]//-- Первые 4 байта - длинна имени ключа без символа окончания строки.. его вообще вроде нет.. жалко 2 байта?! :)[/COLOR]
     memcpy(_pszWay, &pData[4], *((PDWORD)pData));
     delete[] pData;
    }
   
   FreeLibrary(hNTLib);
   return true;
  }
 
 return false;
}
//-----------------------------------------------------------------------------------
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
 HKEY   hKey;
 WCHAR  szWay[MAX_PATH] = TEXT(""); //-- Без инициализации фигово (:
 
 if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Run"), 0, KEY_READ, &hKey) == ERROR_SUCCESS)
  {
   if(RegGetKeyPath(hKey, szWay))
     MessageBox(0, szWay, TEXT(":)"), MB_OK | MB_ICONINFORMATION);
   RegCloseKey(hKey);
  }
 
 return 0;
}

В результате получаем строку такого типа:
Цитата:

\REGISTRY\MACHINE\Software\Microsoft\Windows\CurrentVersion\Run


Второй элемент в пути определяет ветку..
MACHINE - HKEY_LOCAL_MACHINE
USER - HKEY_CURRENT_USER.. после чего следует идентификатор юзера видимо.. выглядит так

Цитата:

\REGISTRY\USER\S-1-5-21-100433345374-564905-...-340705\Software\Microsoft\Windows\CurrentVersion\Run

401
23 июля 2007 года
Br@in RIPper
289 / / 15.02.2003
Цитата: Rost
А я люблю MSDN :) Да и уже близок к решению этой проблеммы (:



Отлично, это уже ближе к истине, спасибо :)

Но насколько я понимаю эта ф-ия native NT, следовательно вопрос остается открытым для Win98/ME

Описание этой ф-ии есть в MSDN: http://msdn2.microsoft.com/en-us/library/ms804350.aspx

Наверно действительно проще пропарсить результат и выкинуть все ненужное. Хотя по идее должна быть ф-ия, которая мэпит результат на CurrentUser

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог