Реестр: преобразование HKEY в полный путь
например "HKEY_CURRENT_USER\Software\Microsoft\File Manager\Settings"
или просто "Software\Microsoft\File Manager\Settings"
порылся в WinAPI ф-иях Reg... - ничего не нашел подходящего :(
Не, не катит даже в качестве решения "на крайний случай". Программа не может гарантировать, что у нее будет право доступа на запись к жесткому диску из-под текущего пользователя. не говоря уже о неэлегантности такого решения :)
Нет, я никому и ничего не предлагаю. Я просто прошу помощи в вышеозначенном вопросе, поскольку самостоятельно приемлемого решения найти я не смог
А я люблю MSDN :) Да и уже близок к решению этой проблеммы (: Вот только возвращаемый путь получается не совсем нужного формата... я просто не знаю все поля структуры возвращаемой функцией ZwQueryKey... хотя можно пропарсить и убрать не нужное :)
{
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
Отлично, это уже ближе к истине, спасибо :)
Но насколько я понимаю эта ф-ия native NT, следовательно вопрос остается открытым для Win98/ME
Описание этой ф-ии есть в MSDN: http://msdn2.microsoft.com/en-us/library/ms804350.aspx
Наверно действительно проще пропарсить результат и выкинуть все ненужное. Хотя по идее должна быть ф-ия, которая мэпит результат на CurrentUser