Не уверен, что это что-то в моем коде или как я обрабатываю запуск процесса, но в приведенном ниже коде, если я включу логическое значение outputToFile TRUE, программа с радостью выведет стандартный вывод из UWFMGR в out.log файл, и он читается и выглядит так, как он выполняется при выполнении из строки cmd.
Если я выключу это логическое значение и попытаюсь использовать стандартный вывод, который я читаю из канала, это мусор ... Что-то вроде " UA n yzna ... a / ". buf, csTemp и m_csOutput имеют отключенные символы. Если я запускаю ту же программу с другими программами, такими как ipconfig, netsh, ect вместо uwfmgr, она работает отлично. Я даже использовал этот код в прошлом с ewfmgr, и он работал нормально. Я не уверен, что отличается от uwfmgr, но это нарушает этот код. Другая странная вещь, которая должна быть подсказкой, это то, что WaitForSingleObject прекрасно работает со всем, кроме uwfmgr, когда я запускаю uwfmgr, который WaitForSingleObject никогда не вернется и будет ждать вечно.
Еще одна вещь, на которую следует обратить внимание, - это вызов uwfmgr. Например, «uwfmgr filter enable» включит фильтр при перезагрузке системы, даже если вывод std не читается.
Есть идеи? Спасибо!
String csExecute;
csExecute = "uwfmgr get-config";
bool outputToFile = FALSE;
SECURITY_ATTRIBUTES secattr;
ZeroMemory(&secattr, sizeof(secattr));
secattr.nLength = sizeof(secattr);
secattr.bInheritHandle = TRUE;
secattr.lpSecurityDescriptor = NULL;
HANDLE rPipe = NULL;
HANDLE wPipe = NULL;
//For test use....File works and captures output correctly
HANDLE h = CreateFile(_T("out.log"),
FILE_APPEND_DATA,
FILE_SHARE_WRITE | FILE_SHARE_READ,
&secattr,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL );
// Create pipes to write and read data
//if(outputToFile)
//{
// CreatePipe(&rPipe, &h, &secattr, 0);
//}else
//{
CreatePipe(&rPipe, &wPipe, &secattr, 0);
//}
STARTUPINFOW sInfo;
PROCESS_INFORMATION pInfo;
ZeroMemory(&sInfo, sizeof(STARTUPINFOW));
ZeroMemory(&pInfo, sizeof(PROCESS_INFORMATION));
sInfo.cb = sizeof(STARTUPINFOW);
sInfo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
sInfo.wShowWindow = SW_HIDE;
sInfo.hStdInput = NULL;
if(outputToFile)
{
sInfo.hStdOutput = h;
sInfo.hStdError = h;
}else
{
sInfo.hStdOutput = wPipe;
sInfo.hStdError = wPipe;
}
char command[1024];
wcstombs(command, csExecute.c_str(), sizeof(command));
ShowMessage(csExecute);
CreateProcessWithLogonW(L"username", L"PCDOMAIN", L"password",
LOGON_NETCREDENTIALS_ONLY, NULL, csExecute.w_str(),
NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW, NULL, NULL,
&sInfo, &pInfo);
//Never returns with UWFMGR, works fine on other processes like ipconfig, netsh, ect
//WaitForSingleObject(pInfo.hThread, Infinite);
if(outputToFile)
{
CloseHandle(h);
}else
{
CloseHandle(wPipe);
}
//returns 0 and works fine (actual call to uwfmgr succeeded, for example uwfmgr filter enable turns the filter on even though the output is garbage unless outputted to a file
ShowMessage(GetLastError());
// now read the output pipe here.
#define BUFSIZE 100
BOOL res = FALSE;
String m_csOutput = "";
for(;;)
{
char buf[BUFSIZE+1] = "";
DWORD reDword;
if(!::ReadFile(rPipe, buf, BUFSIZE, &reDword, 0))
{
DWORD error = ::GetLastError();
ShowMessage("Error #....");
ShowMessage(error);
break;
}
if(reDword == 0)
{
break;
}
buf[reDword] = '\0';
ShowMessage(buf);
String csTemp = buf;
ShowMessage(csTemp);
m_csOutput += csTemp;//.SubString(1, reDword);
ShowMessage(m_csOutput);
}