| //===- FuzzerExtFunctionsDlsymWin.cpp - Interface to external functions ---===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // Implementation using dynamic loading for Windows. |
| //===----------------------------------------------------------------------===// |
| #include "FuzzerDefs.h" |
| #if LIBFUZZER_WINDOWS |
| |
| #include "FuzzerExtFunctions.h" |
| #include "FuzzerIO.h" |
| #include "Windows.h" |
| |
| // This must be included after Windows.h. |
| #include "Psapi.h" |
| |
| namespace fuzzer { |
| |
| ExternalFunctions::ExternalFunctions() { |
| HMODULE Modules[1024]; |
| DWORD BytesNeeded; |
| HANDLE CurrentProcess = GetCurrentProcess(); |
| |
| if (!EnumProcessModules(CurrentProcess, Modules, sizeof(Modules), |
| &BytesNeeded)) { |
| Printf("EnumProcessModules failed (error: %d).\n", GetLastError()); |
| exit(1); |
| } |
| |
| if (sizeof(Modules) < BytesNeeded) { |
| Printf("Error: the array is not big enough to hold all loaded modules.\n"); |
| exit(1); |
| } |
| |
| for (size_t i = 0; i < (BytesNeeded / sizeof(HMODULE)); i++) |
| { |
| FARPROC Fn; |
| #define EXT_FUNC(NAME, RETURN_TYPE, FUNC_SIG, WARN) \ |
| if (this->NAME == nullptr) { \ |
| Fn = GetProcAddress(Modules[i], #NAME); \ |
| if (Fn == nullptr) \ |
| Fn = GetProcAddress(Modules[i], #NAME "__dll"); \ |
| this->NAME = (decltype(ExternalFunctions::NAME)) Fn; \ |
| } |
| #include "FuzzerExtFunctions.def" |
| #undef EXT_FUNC |
| } |
| |
| #define EXT_FUNC(NAME, RETURN_TYPE, FUNC_SIG, WARN) \ |
| if (this->NAME == nullptr && WARN) \ |
| Printf("WARNING: Failed to find function \"%s\".\n", #NAME); |
| #include "FuzzerExtFunctions.def" |
| #undef EXT_FUNC |
| } |
| |
| } // namespace fuzzer |
| |
| #endif // LIBFUZZER_WINDOWS |