Проблема при получении исходного имени файла приложения Windows с GetFileVersionInfo и API VerQueryValue - PullRequest
0 голосов
/ 23 октября 2018

Я тестирую функции GetFileVersionInfo и VerQueryValue, чтобы получить исходное имя файла (OriginalFilename) файла в Windows 10 (64бит, версия 1803).

Я мог получить исходное имя файла некоторых приложений, таких как cmd.exe, putty.exe.

Моя проблема в том, что если я применяю эти функции к windowsapp, функция VerQueryValue никогда не возвращается.

Одним из протестированных приложений является калькулятор (calculator.exe), который былнаходится по адресу "C: \ Program Files \ WindowsApps \ Microsoft.WindowsCalculator_10.1804.911.0_x64__8wekyb3d8bbwe \ Calculator.exe".

После изменения свойств безопасности каталога были получены те же результаты.

Результатыбыло то же самое, хотя копирование Calculator.exe в Windowsapp в другой каталог (e: \ aa \ Calculator.exe).

Вот мой код:

struct LANGANDCODEPAGE {
    WORD wLanguage;
    WORD wCodePage;
 } *lpTranslate;

VOID readFileInfo(LPWSTR fullName, LPWSTR infoStr)
{
    DWORD dwHandle;
    wprintf(L"read info from %s\n", fullName);

    DWORD dwinfoSize = GetFileVersionInfoSize(fullName, &dwHandle);
    if (!dwinfoSize) return;

    LPWSTR info = (LPWSTR)calloc(1, dwinfoSize);
    printf("info size: %u\n", dwinfoSize);

    if (info) {
        BOOL bRes = GetFileVersionInfo(fullName, 0, dwinfoSize, info);

        if (bRes) {
            UINT uLen;
            UINT uBytes;
            LPBYTE lpBuffer = NULL;

            if (VerQueryValue(info, L"\\VarFileInfo\\Translation", (LPVOID *)&lpTranslate, &uLen)) {
                if (uLen) {
                    WCHAR buf[1024] = { 0 };
                    swprintf(buf, L"\\StringFileInfo\\%04x%04x\\%s", lpTranslate[0].wLanguage, lpTranslate[0].wCodePage, infoStr);

                    wprintf(L"VerQueryValue Len: %d\n", uLen);
                    VerQueryValue(info, buf, (LPVOID*)&lpBuffer, &uBytes); //never return !!!!!!!!!!!!!!

                    wprintf(L"%s is %s\n", infoStr, (LPWSTR)lpBuffer);
                }
            }
        }

        free(info);
        info = NULL;
    }
}

int main()
{
    //ok(can get origianl filename)
    readFileInfo(L"C:\\Windows\\System32\\cmd.exe", L"OriginalFilename");

    //not ok(second VerQueryValue never retrun)
    readFileInfo(L"C:\\Program Files\\WindowsApps\\Microsoft.WindowsCalculator_10.1804.911.0_x64__8wekyb3d8bbwe\\Calculator.exe", L"OriginalFilename");

    //not ok
    readFileInfo(L"E:\\aa\\Calculator.exe", L"OriginalFilename");

return 0;
}

пожалуйста, проверьте, в чем проблемаэто .. спасибо.

Следующий файл - это тот файл .... enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...