#define WIN32_LEAN_AND_MEAN #include #include static DWORD phase,index; static BYTE template[1]; static BOOL parameters_valid(void) { PEB *peb; __asm__("movq %%gs:0x60,%0":"=r"(peb)); RTL_USER_PROCESS_PARAMETERS *parameters=peb->ProcessParameters; if (!parameters || !parameters->ImagePathName.Buffer || !parameters->ImagePathName.Length || !parameters->CommandLine.Buffer || parameters->ImagePathName.Length%2 || parameters->CommandLine.Length%2 || parameters->ImagePathName.MaximumLengthImagePathName.Length+2 || parameters->CommandLine.MaximumLengthCommandLine.Length+2 || parameters->ImagePathName.Buffer[parameters->ImagePathName.Length/2] || parameters->CommandLine.Buffer[parameters->CommandLine.Length/2]) return FALSE; SetLastError(0x7654); WCHAR *command=GetCommandLineW(); CHAR *ansi=GetCommandLineA(); if (!ansi || ansi!=GetCommandLineA() || GetACP()!=1252 || command!=parameters->CommandLine.Buffer || command!=GetCommandLineW()) return FALSE; if (*command) { WCHAR saved=*command; CHAR original=*ansi; *command=L'!'; BOOL cached=ansi==GetCommandLineA() && *ansi==original; *command=saved; if (!cached) return FALSE; } STARTUPINFOA startup_a;STARTUPINFOW startup_w; for (unsigned i=0;i