Windows 10: именования программ main.exe заставляют их отображать всплывающие окна

В Windows 10, когда мы создаем программу с именем main.exe или переименуем программу в main.exe, программа покажет всплывающее окно, как показано здесь:


некоторые появляются в Notepad ++, насколько это замечательно?


Существует 2 разных всплывающих окна, которые могут быть показаны:

- игровая панель 1 (французская и английская версии):

Appuyer sur Win + G pour ouvrir la barre jeu

Press Win + G to open Game bar

- снимок экрана:

Appuyer sur Win + Alt +Impr.écran pour prendre une capture d'écran

(На английском языке: нажмите Win + Alt + PrintScreen, чтобы сделать снимок экрана)


Первоначально я обнаружил проблему при использовании python и cx_freeze,

Я тестировал это на нескольких программах, в том числе (как видно выше), переименовывая блокнот ++. exe в main.exe, и каждый раз там был один из всплывающих окон,

Мы также можем заметить, что всплывающее окно появляется альтернативно (появляется одна игра, затем всплывает один всплывающий экран, затем появляется одна игра...)

Я запускаю windows10 через виртуальную коробку, но, как описано ниже, проблема также возникает на физических машинах.

Любая идея о том, как это произошло?

Примечание: BoltClock также проверил его (на физической машине) и обнаружил, что на его машине это поведение происходит только с "Main.exe", в то время как на моей машине произошло поведение, которое может быть в верхнем и нижнем регистре "основного" (IE: он работает с main.exe, Main.exe или даже с файлом MaIN.exe)

Ответ 1

В выходные я проделал несколько копаний, и я нашел более 2000 специальных имен exe, которые вызывают одно и то же поведение, а не только main.exe.

В проводнике есть компонент с именем BroadcastDVR (расположенный в dll twinui), который при создании процесса сравнивает исполняемые свойства с "магазином" игр и запустит GameLauncher.exe, если есть совпадение.

Мне не удалось определить, где сравнение выполняется, так как оно скрыто за вызовом RPC, который является PITA для изменения.

В любом случае explorer.exe имеет дескриптор в следующем файле C:\Users\YOUR_USERNAME\AppData\Local\Microsoft\GamesDVR\KnownGameList.bin (есть копия в C:\Windows\broadcastdvr), в которой перечислены все специальные исполняемые файлы, которые запускают всплывающее окно XBox. Вы можете увидеть запись main.exe здесь (запись № 1007):

введите описание изображения здесь

Я написал файл шаблона 010, чтобы проанализировать список записей, и он содержит 2089 записей на моем компьютере. Из того, что я видел, обратив двоичный файл, существует три типа записи:

  • "простой", где есть только совпадение с исполняемым именем.    Например: main.exe или ai.exe

  • более сложный, если существует совпадение с исполняемым именем и путь, в котором хранится exe, должен содержать некоторые строки.    Например: acu.exe должен быть расположен во вложенной папке Assassin Creed Unity.

  • В некоторых записях есть строки с дополнительными строками, но я не нашел, как запускать всплывающее окно DVR для них.

NB: подсистема Win32 нечувствительна к регистру, поэтому имеет смысл, что дело с исполняемым именем не имеет значения.

Вот шаблон (вы можете установить редактор 010 здесь, есть период оценки, который я думаю):

typedef struct  {
   BYTE Reserved[0x300];
}HEADER;

typedef struct  {
    WORD ByteLen;
    BYTE RawString[ByteLen];
    //local string sName=ReadWString(RawString);
} GAME_WSTR <read=ReadGame>;

typedef struct {
    DWORD Reserved;
    DWORD ByteLen;
    BYTE RawString[ByteLen] <fgcolor=cLtRed>;
} OPTION_STR  <read=ReadOption>;

typedef struct  {
   local int StartAddr = FTell();
   DWORD EntrySize;

   // Executable game name
   GAME_WSTR GameName <fgcolor=cLtBlue>;

   // Optional magic
   if (ReadUShort() == 0xca54)
        WORD OptReserved;

   // Optional structs based on switch values
   WORD AdditionalNamesCount;
   WORD SwitchOption2;

   // Additional names (probably like a hint).
   local int i =0;
   for (i = 0; i <  AdditionalNamesCount; i++){
        OPTION_STR Option;
        if (ReadUShort() == 0xca54)
            WORD OptReserved;
   }

   // Look for a magic
   local int Find20h = 0;
   while(!Find20h){
        Find20h = (0x20 == ReadByte());
        BYTE Res;
   }

   GAME_WSTR GameId;
   WORD Reserved;

   // Sometimes there is an additionnal name
   // sometimes not. I check the current entry
   // is at less than the EntrySize declared.
   if (FTell()-StartAddr < EntrySize)
   {
       switch (SwitchOption2)
       {
       case 3:
            OPTION_STR Option3;
            break;
       case 2:

            OPTION_STR Option2;
       case 1:
            break;
       }
    }

} ENTRY <read=ReadGameName>;

string ReadOption(OPTION_STR &Game)
{
    local wstring GameName = L"";
    local int i ;
    for (i= 0; 2*i < Game.ByteLen; i++){
        WStrcat(GameName, Game.RawString[2*i]);
    }
    return WStringToString(GameName);
}

string ReadGame(GAME_WSTR &Game)
{
    local wstring GameName = L"";
    local int i ;
    for (i= 0; 2*i < Game.ByteLen; i++){
        WStrcat(GameName, Game.RawString[2*i]);
    }
    return WStringToString(GameName);
}

string ReadGameName(ENTRY &Entry)
{
    local string GameName = ReadGame(Entry.GameName);
    local string OptionGameName = "";
    if (Entry.AdditionalNamesCount)
        OptionGameName = " : "+ReadOption(Entry.Option);

    return GameName + OptionGameName;
}

//------------------------------------------
LittleEndian();
Printf("Parse KnownGameList.bin Begin.\n");
HEADER UnkwownHeader <bgcolor=cLtGray>;
while(1)
{
    ENTRY Entry <bgcolor=cLtPurple>;
    //Printf("Entry : %s -> %d.\n",ReadGameName(Entry) ,Entry.AdditionalNamesCount);
}
Printf("Parse KnownGameList.bin End.\n");

Если это поведение вас раздражает, вы всегда можете отключить его глобально, установив ключ реестра ShowStartup в 0. Он находится в HKEY_CURRENT_USER\Software\Microsoft\GameBar.

Я не нашел, как отключить конкретный исполняемый файл от его запуска, но я мог бы просто посмотреть на машинный код в twinui.

Вопрос безопасности

У нас есть ситуация, когда мы можем запустить процесс, просто изменив имя исполняемого файла. Это может быть опасно.

Командная строка командной строки запуска находится в HKEY_LOCAL_MACHINE\Software\Microsoft\GameOverlay, для которой требуется уровень администрирования, поэтому здесь не существует обхода уровня UAC или Integrity.

(Я не нашел авторизационную ссылку из msdn, поэтому здесь подтверждается SO-ответ: Какой доступ к реестру вы можете получить без привилегий администратора?)