#include <stdio.h>
#include <windows.h>
#pragma warning(disable : 4996)
int main(int argc, wchar_t** argv)
{
DWORD bytes_read;
WCHAR* buffer[4096];
LPWSTR str;
STARTUPINFO start_info = { 0 };
PROCESS_INFORMATION process_info = { 0 };
ReadFile(GetStdHandle(STD_INPUT_HANDLE), buffer, 4096, &bytes_read, NULL);
str = malloc(bytes_read);
memcpy(str, buffer, bytes_read);
// debug - stdout + file
wprintf(L"\nTrying to run -> \"%LS\"", str);
FILE *f = fopen("file.txt", "w");
fwprintf(f, L"%LS", str);
fclose(f);
BOOL result = CreateProcessW(
NULL,
str,
NULL,
NULL,
TRUE,
CREATE_NO_WINDOW | NORMAL_PRIORITY_CLASS,
NULL,
NULL,
&start_info,
&process_info
);
if (!result) {
DWORD err = GetLastError();
WCHAR *errstr;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, err,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPWSTR)&errstr, 0, NULL
);
wprintf(L"\nError -> %ls", errstr);
return 1;
}
return 0;
}
Запуск его приводит к следующему
C:\Users\Admin\source\repos\ConsoleApplication1\Debug
λ php -r "echo \"C:\\Windows\\System32\\PING.EXE\0\";"|ConsoleApplication1.exe
Trying to run -> "C:\Windows\System32\PING.EXE"
Error -> The system cannot find the file specified.
Так что, похоже, он использует правильный ввод.Кроме того, в файле file.txt нет ничего подозрительного при просмотре в шестнадцатеричном редакторе
При жестком кодировании str, как следует, вместо использования stdin
wchar_t cmd[] = L"C:\\Windows\\System32\\PING.EXE";
Это работает.
Что мне нужно сделать, чтобы заставить CreateProcessW работать с вводом stdin?