Ответ 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-ответ: Какой доступ к реестру вы можете получить без привилегий администратора?)