Skip to content

Instantly share code, notes, and snippets.

@rbmm
Created June 26, 2025 14:25
Show Gist options
  • Save rbmm/e4539c739464550e0b456c1e3d7903a2 to your computer and use it in GitHub Desktop.
Save rbmm/e4539c739464550e0b456c1e3d7903a2 to your computer and use it in GitHub Desktop.
// 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