Skip to content

Commit 7828638

Browse files
committed
Use different keys based on process elevation
1 parent a6c2021 commit 7828638

File tree

4 files changed

+35
-2
lines changed

4 files changed

+35
-2
lines changed

Handle.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ namespace libreg
1818
const Handle<T>& operator=(const Handle&) = delete;
1919

2020
T Get() const;
21+
T* Addr();
2122
void Detach();
2223
void Close();
2324
operator T() const;

Handle.hxx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,4 +77,10 @@ namespace libreg
7777
{
7878
return _value != nullptr;
7979
}
80+
81+
template <typename T>
82+
inline T* Handle<T>::Addr()
83+
{
84+
return &_value;
85+
}
8086
}

Tests/TestRegistryOperations.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,22 @@ TestRegistryOperations::TestRegistryOperations() : Tester("Registry operations")
1616

1717
void TestRegistryOperations::RunImpl()
1818
{
19+
20+
bool isElevated = false;
21+
22+
libreg::Handle<HANDLE> token{ nullptr };
23+
24+
if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, token.Addr()))
25+
{
26+
TOKEN_ELEVATION elevation{};
27+
DWORD size = sizeof(elevation);
28+
29+
if (GetTokenInformation(token.Get(), TokenElevation, &elevation, sizeof(elevation), &size))
30+
{
31+
isElevated = elevation.TokenIsElevated;
32+
}
33+
}
34+
1935
auto dummy_key = "Software";
2036

2137
auto key = Key::OpenOrCreate(Hive::CurrentUser, dummy_key, Access::AllAccess);
@@ -98,7 +114,7 @@ void TestRegistryOperations::RunImpl()
98114

99115
TestThrow<KeyNotFoundException>([&](){subkey.Delete();}, "Keys can't be deleted twice");
100116

101-
auto read_only_key = Key::Open(Hive::LocalMachine, "SAM\\SAM", Access::QueryValue);
117+
auto read_only_key = Key::Open(Hive::LocalMachine, isElevated ? "BCD00000000" : "Software", Access::QueryValue);
102118

103119
TestThrow<AccessDeniedException>([&]() {read_only_key.CreateSubKey("denied"); },
104120
"AccessDeniedException is thrown");

Tests/Tester.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,17 @@ bool Tester::Run()
1515
cout << Colors::Blue() << Colors::Bold() << "\n\t\t\t======= Tests for \""
1616
<< _category << "\" =======" << endl
1717
<< Colors::Reset();
18-
RunImpl();
18+
19+
try
20+
21+
{
22+
RunImpl();
23+
}
24+
catch(const std::exception & e)
25+
{
26+
std::cout << Colors::Red() << "Tests caught unexpected exception: " << e.what() << std::endl;
27+
return false;
28+
}
1929

2030
return _failed == 0;
2131
}

0 commit comments

Comments
 (0)