LONG DeleteShellExtensionInfo(HKEY hkey, const CSysString &ext) { // NSynchronization::CCriticalSectionLock lock(g_CriticalSection); CKey rootKey; rootKey.Attach(hkey); LONG res = rootKey.RecurseDeleteKey(GetExtKeyPath(hkey, ext)); // then we delete only 7-Zip.* key. rootKey.RecurseDeleteKey(GetFullKeyPath(hkey, GetExtProgramKeyName(ext))); rootKey.Detach(); return res; }
NTSTATUS OpenKey(LPWSTR Root, LPWSTR KeyPath, OUT PHANDLE hKey) { LPWSTR FullKeyPath = GetFullKeyPath(Root, KeyPath); UNICODE_STRING UnicodePath; RtlInitUnicodeString(&UnicodePath, FullKeyPath); OBJECT_ATTRIBUTES ObjectAttributes; InitializeObjectAttributes(&ObjectAttributes, &UnicodePath, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL); NTSTATUS Status = ZwOpenKey(hKey, KEY_ALL_ACCESS, &ObjectAttributes); FreeString(FullKeyPath); return Status; }
bool CShellExtInfo::ReadFromRegistry(HKEY hkey, const CSysString &ext) { ProgramKey.Empty(); IconPath.Empty(); IconIndex = -1; // NSynchronization::CCriticalSectionLock lock(g_CriticalSection); { CKey extKey; if (extKey.Open(hkey, GetExtKeyPath(hkey, ext), KEY_READ) != ERROR_SUCCESS) return false; if (extKey.QueryValue(NULL, ProgramKey) != ERROR_SUCCESS) return false; } { CKey iconKey; if (iconKey.Open(hkey, GetFullKeyPath(hkey, ProgramKey + CSysString(TEXT(CHAR_PATH_SEPARATOR)) + kDefaultIconKeyName), KEY_READ) == ERROR_SUCCESS) { UString value; if (iconKey.QueryValue(NULL, value) == ERROR_SUCCESS) { int pos = value.ReverseFind(L','); IconPath = value; if (pos >= 0) { const wchar_t *end; Int32 index = ConvertStringToInt32((const wchar_t *)value + pos + 1, &end); if (*end == 0) { // 9.31: if there is no icon index, we use -1. Is it OK? if (pos != (int)value.Len() - 1) IconIndex = (int)index; IconPath.SetFrom(value, pos); } } } } } return true; }
static CSysString GetExtKeyPath(HKEY hkey, const CSysString &ext) { return GetFullKeyPath(hkey, (TEXT(".")) + ext); }
LONG AddShellExtensionInfo(HKEY hkey, const CSysString &ext, const UString &programTitle, const UString &programOpenCommand, const UString &iconPath, int iconIndex // , const void *shellNewData, int shellNewDataSize ) { LONG res = 0; DeleteShellExtensionInfo(hkey, ext); // NSynchronization::CCriticalSectionLock lock(g_CriticalSection); CSysString programKeyName; { CSysString ext2 = ext; if (iconIndex < 0) ext2 = TEXT("*"); programKeyName = GetExtProgramKeyName(ext2); } { CKey extKey; res = extKey.Create(hkey, GetExtKeyPath(hkey, ext)); extKey.SetValue(NULL, programKeyName); /* if (shellNewData != NULL) { CKey shellNewKey; shellNewKey.Create(extKey, kShellNewKeyName); shellNewKey.SetValue(kShellNewDataValueName, shellNewData, shellNewDataSize); } */ } CKey programKey; programKey.Create(hkey, GetFullKeyPath(hkey, programKeyName)); programKey.SetValue(NULL, programTitle); { CKey iconKey; UString iconPathFull = iconPath; if (iconIndex < 0) iconIndex = 0; // if (iconIndex >= 0) { iconPathFull += L','; wchar_t s[16]; ConvertUInt32ToString((UInt32)iconIndex, s); iconPathFull += s; } iconKey.Create(programKey, kDefaultIconKeyName); iconKey.SetValue(NULL, iconPathFull); } CKey shellKey; shellKey.Create(programKey, kShellKeyName); shellKey.SetValue(NULL, TEXT("")); CKey openKey; openKey.Create(shellKey, kOpenKeyName); openKey.SetValue(NULL, TEXT("")); CKey commandKey; commandKey.Create(openKey, kCommandKeyName); commandKey.SetValue(NULL, programOpenCommand); return res; }