Created
June 26, 2025 14:25
-
-
Save rbmm/e4539c739464550e0b456c1e3d7903a2 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ucrtbase.dll | |
// 10.0.26100.1591 | |
// setlocale=English_United States.utf8 | |
ftest(L"test_utf8_文件.txt"); | |
const VS_FIXEDFILEINFO* GetFileVersion(PVOID ImageBase); | |
void ftest(PCWSTR pcwz) | |
{ | |
if (FILE *fp = _wfopen(pcwz, L"r")) | |
{ | |
fclose(fp); | |
} | |
else | |
{ | |
return ; | |
} | |
PVOID hmod; | |
if (RtlPcToFileHeader(setlocale, &hmod) == RtlPcToFileHeader(fopen, &hmod) && hmod) | |
{ | |
ULONG s; | |
if (PIMAGE_EXPORT_DIRECTORY pied = (PIMAGE_EXPORT_DIRECTORY)RtlImageDirectoryEntryToData( | |
hmod, TRUE, IMAGE_DIRECTORY_ENTRY_EXPORT, &s)) | |
{ | |
DbgPrint("%hs\n", RtlOffsetToPointer(hmod, pied->Name)); | |
} | |
if (const VS_FIXEDFILEINFO* p = GetFileVersion(hmod)) | |
{ | |
DbgPrint("%u.%u.%u.%u\n", HIWORD(p->dwFileVersionMS), LOWORD(p->dwFileVersionMS), | |
HIWORD(p->dwFileVersionLS), LOWORD(p->dwFileVersionLS)); | |
} | |
} | |
ULONG UnicodeStringByteCount = (1 + (ULONG)wcslen(pcwz)) * sizeof(wchar_t); | |
PSTR filename = 0; | |
ULONG cb = 0; | |
while (0 <= RtlUnicodeToUTF8N(filename, cb, &cb, pcwz, UnicodeStringByteCount)) | |
{ | |
if (filename) | |
{ | |
ULONG i = 2; | |
do | |
{ | |
if (FILE *fp = fopen(filename, "r")) | |
{ | |
fclose(fp); | |
} | |
if (--i) | |
{ | |
if (PCSTR pcsz = setlocale(LC_ALL, ".UTF8")) | |
{ | |
DbgPrint("setlocale=%hs\n", pcsz); | |
} | |
else | |
{ | |
break; | |
} | |
} | |
} while (i); | |
break; | |
} | |
filename = (PSTR)alloca(cb); | |
} | |
} | |
const VS_FIXEDFILEINFO* GetFileVersion(PVOID ImageBase) | |
{ | |
static LPCWSTR a[3] = { RT_VERSION, MAKEINTRESOURCE(1) }; | |
PIMAGE_RESOURCE_DATA_ENTRY pirde; | |
DWORD size, wLength, wValueLength; | |
struct VS_VERSIONINFO_HEADER { | |
WORD wLength; | |
WORD wValueLength; | |
WORD wType; | |
WCHAR szKey[]; | |
} *pv; | |
if ( | |
0 <= LdrFindResource_U(ImageBase, a, 3, &pirde) && | |
0 <= LdrAccessResource(ImageBase, pirde, (void**)&pv, &size) && | |
size > sizeof(VS_VERSIONINFO_HEADER) && | |
(wLength = pv->wLength) >= sizeof(VS_VERSIONINFO_HEADER) && | |
(wValueLength = pv->wValueLength) >= sizeof(VS_FIXEDFILEINFO) && | |
wLength <= size && | |
wValueLength <= (wLength - sizeof(VS_VERSIONINFO_HEADER)) | |
) | |
{ | |
PVOID end = RtlOffsetToPointer(pv, wLength - wValueLength); | |
PCWSTR sz = pv->szKey; | |
do | |
{ | |
if (!*sz++) | |
{ | |
VS_FIXEDFILEINFO* pffi = (VS_FIXEDFILEINFO*)((__alignof(VS_FIXEDFILEINFO) - 1 + (ULONG_PTR)sz) & ~(__alignof(VS_FIXEDFILEINFO) - 1)); | |
return VS_FFI_SIGNATURE == pffi->dwSignature ? pffi : 0; | |
} | |
} while (sz <= end); | |
} | |
return 0; | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment