MCPcopy Create free account
hub / github.com/OpenSteam001/OpenSteamTool / ResolveRemoteExport

Function ResolveRemoteExport

src/OSTPlatform/Windows/RemoteProcess.cpp:115–157  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

113}
114
115std::optional<uintptr_t> ResolveRemoteExport(
116 std::span<const RemoteModule> modules,
117 std::wstring_view moduleName,
118 std::string_view symbolName,
119 int depth = 0) {
120 if (depth > 8) return std::nullopt;
121
122 const RemoteModule* module = FindModule(modules, moduleName);
123 if (!module && StartsWithInsensitive(moduleName, L"api-ms-win-")) {
124 module = FindModule(modules, L"kernelbase.dll");
125 }
126 if (!module) {
127 OSTP_LOG_WARN("ResolveRemoteExport: module '{}' not found", Encoding::WideToUtf8(moduleName));
128 return std::nullopt;
129 }
130
131 const PE::Image image(module->path);
132 const auto exported = image.FindExport(symbolName);
133 if (!exported) {
134 OSTP_LOG_WARN("ResolveRemoteExport: export {}!{} not found",
135 module->path.string(), std::string(symbolName));
136 return std::nullopt;
137 }
138
139 if (!exported->IsForwarder()) {
140 return module->base + exported->rva;
141 }
142
143 const size_t dot = exported->forwarder.find('.');
144 if (dot == std::string::npos || dot == 0 || dot + 1 >= exported->forwarder.size()) {
145 OSTP_LOG_WARN("ResolveRemoteExport: unsupported forwarder '{}'", exported->forwarder);
146 return std::nullopt;
147 }
148
149 const std::string_view forwardModule(exported->forwarder.data(), dot);
150 const std::string_view forwardSymbol(exported->forwarder.data() + dot + 1, exported->forwarder.size() - dot - 1);
151 if (!forwardSymbol.empty() && forwardSymbol.front() == '#') {
152 OSTP_LOG_WARN("ResolveRemoteExport: ordinal forwarder '{}' is not supported", exported->forwarder);
153 return std::nullopt;
154 }
155
156 return ResolveRemoteExport(modules, ModuleNameFromForwarder(forwardModule), forwardSymbol, depth + 1);
157}
158
159LPTHREAD_START_ROUTINE ResolveRemoteLoadLibraryW(uint32_t pid, Architecture architecture) {
160 const std::vector<RemoteModule> modules = EnumerateRemoteModules(pid, architecture);

Callers 1

Calls 9

FindModuleFunction · 0.85
StartsWithInsensitiveFunction · 0.85
WideToUtf8Function · 0.85
ModuleNameFromForwarderFunction · 0.85
FindExportMethod · 0.80
IsForwarderMethod · 0.80
sizeMethod · 0.80
dataMethod · 0.80
emptyMethod · 0.80

Tested by

no test coverage detected