Binary: support Windows

This commit is contained in:
李通洲
2024-08-22 16:41:06 +08:00
committed by 李通洲
parent cf9bd0f373
commit b4aac9d7d7
3 changed files with 46 additions and 4 deletions
+2 -1
View File
@@ -756,7 +756,7 @@ elseif(WIN32)
src/util/windows/unicode.c
src/util/windows/wmi.cpp
src/util/platform/FFPlatform_windows.c
src/util/binary_linux.c
src/util/binary_windows.c
)
elseif(SunOS)
list(APPEND LIBFASTFETCH_SRC
@@ -1139,6 +1139,7 @@ elseif(WIN32)
PRIVATE "setupapi"
PRIVATE "hid"
PRIVATE "wtsapi32"
PRIVATE "imagehlp"
)
elseif(FreeBSD)
target_link_libraries(libfastfetch
+5 -3
View File
@@ -57,15 +57,15 @@ const char* ffDetectEditor(FFEditorResult* result)
else
{
const char* error = ffFindExecutableInPath(result->name.chars, &result->path);
if (error) return error;
if (error) return NULL;
}
if (!instance.config.general.detectVersion) return NULL;
char buf[PATH_MAX + 1];
if (!realpath(result->path.chars, buf))
return NULL;
// WIN32: Should we handle scoop shim exe here?
ffStrbufSetS(&result->path, buf);
{
@@ -88,6 +88,8 @@ const char* ffDetectEditor(FFEditorResult* result)
#endif
}
if (!instance.config.general.detectVersion) return NULL;
if (ffStrbufEqualS(&result->exe, "nvim"))
ffBinaryExtractStrings(buf, extractNvimVersion, &result->version);
else if (ffStrbufEqualS(&result->exe, "vim"))
+39
View File
@@ -0,0 +1,39 @@
#include "binary.h"
#include "common/io/io.h"
#include "util/stringUtils.h"
#include "util/mallocHelper.h"
#include <windows.h>
#include <imagehlp.h>
#include <stdlib.h>
#include <string.h>
const char* ffBinaryExtractStrings(const char *peFile, bool (*cb)(const char *str, uint32_t len, void *userdata), void *userdata)
{
__attribute__((__cleanup__(UnMapAndLoad))) LOADED_IMAGE loadedImage = {};
if (!MapAndLoad(peFile, NULL, &loadedImage, FALSE, TRUE))
return "File could not be loaded";
for (ULONG i = 0; i < loadedImage.NumberOfSections; ++i)
{
PIMAGE_SECTION_HEADER section = &loadedImage.Sections[i];
if ((section->Characteristics & IMAGE_SCN_CNT_INITIALIZED_DATA) && ffStrEquals((const char*) section->Name, ".rdata"))
{
uint8_t *data = (uint8_t *) loadedImage.MappedAddress + section->PointerToRawData;
for (size_t off = 0; off < section->SizeOfRawData; ++off)
{
const char* p = (const char*) data + off;
if (*p == '\0') continue;
uint32_t len = (uint32_t) strlen(p);
if (*p >= ' ' && *p <= '~') // Ignore control characters
{
if (!cb(p, len, userdata)) break;
}
off += len;
}
}
}
return NULL;
}