c++ 为什么UWFMGR的标准输出是不可读的,除非指向文件

htrmnn0y  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(109)

不确定这是否是我的代码中的某个东西,或者我是如何处理启动进程的,但在下面的代码中,如果我打开boolean outputToFile TRUE,程序将很高兴地从UWFMGR输出标准输出到out.log文件,并且它是可读的,看起来就像从cmd行执行时一样。
如果我关闭布尔值并尝试使用我从管道中读取的标准输出,它是垃圾.类似于“U A 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);
}

字符串

cigdeys3

cigdeys31#

对于任何试图在批处理文件中使用UWFMGR的人(即检查是否启用了过滤器),您可以使用

find /v "" filename > outputfile

字符串
将输出从UTF-16清理为asscort
此命令打印出文件中找到的任何不匹配“”的行(无)
因此,它会打印文件中的所有内容。查找输出对我来说恰好是纯异步的(需要测试它的代码页是否依赖)
举例说明:

uwfmgr filter get-config > bad.txt
find /v "" bad.txt > good.txt

相关问题