diff --git a/include/winapi20/impl/libloaderapi_impl.h b/include/winapi20/impl/libloaderapi_impl.h index 37ca6e8..de30545 100644 --- a/include/winapi20/impl/libloaderapi_impl.h +++ b/include/winapi20/impl/libloaderapi_impl.h @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -64,6 +65,6 @@ namespace winapi::dll private: std::string m_name; Handle m_handle; - bool m_cleanup; + bool m_cleanup = false; }; } \ No newline at end of file diff --git a/include/winapi20/wrappers/function.h b/include/winapi20/wrappers/function.h index ee67aac..512502e 100644 --- a/include/winapi20/wrappers/function.h +++ b/include/winapi20/wrappers/function.h @@ -17,7 +17,7 @@ namespace winapi {} template - inline auto __fastcall operator()(T&&... args) const noexcept -> pointer_type { + inline auto __fastcall operator()(T&&... args) const noexcept -> R { return ((R (__fastcall*) (T...)) this->m_)(args...); } diff --git a/tests/test_libloaderapi.cc b/tests/test_libloaderapi.cc new file mode 100644 index 0000000..87ea8fc --- /dev/null +++ b/tests/test_libloaderapi.cc @@ -0,0 +1,40 @@ +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace ::testing; +using namespace winapi; +using namespace winapi; +using namespace winapi::th32; + +TEST(Library, View) +{ + using IncludeFlags = Snapshot::IncludeFlags; + + auto snapshot = th32::Snapshot(IncludeFlags::Process, PID::current()); + auto pid = snapshot.find_first_by_name("explorer.exe"); + EXPECT_TRUE(snapshot.valid()); + EXPECT_TRUE(pid.has_value()); + EXPECT_FALSE(pid->pid.is_current()); + + auto snapshot2 = th32::Snapshot(IncludeFlags::Module | IncludeFlags::Process, pid->pid); + auto module = snapshot2.find_first_by_name("kernel32.dll"); + EXPECT_TRUE(snapshot2.valid()); + EXPECT_TRUE(module.has_value()); + EXPECT_TRUE(module->base_address > 0); + EXPECT_TRUE(module->pid == pid->pid); + EXPECT_FALSE(module->name.empty()); + EXPECT_FALSE(module->path.empty()); + EXPECT_TRUE(module->handle); + + auto lib = dll::Library::view("kernel32.dll", pid->pid); + EXPECT_TRUE(lib.has_value()); + auto fn = (*lib)["MulDiv"]; + EXPECT_TRUE(fn.has_value()); + auto res = fn->operator()(10, 2, 5); + EXPECT_EQ(res, ::MulDiv(10, 2, 5)); +} \ No newline at end of file