繁体   English   中英

使用 ReadFile function 从进程中读取数据

[英]Using ReadFile function to read data from a process

我正在尝试使用 Win32 API function ReadFile()从进程中读取数据。 我没有使用标准库 function 因为我使用的是来自公共仓库的源代码。 在这里,我提供了我遇到问题的特定片段..

//Those are Globals
HANDLE pipin_w, pipin_r, pipout_w, pipout_r;
DWORD write, read, available;
BYTE buffer[2048];

std::string myFunction(){
    std::string out="";
    PeekNamedPipe ( pipout_r, buffer, sizeof(buffer), &read, &available, NULL);
    sleep(300);
    do {
        ZeroMemory(*buffer, sizeof(buffer));
        ReadFile( pipout_r, buffer, sizeof(buffer), &read, NULL);

        if (!read) { return std::string("error"); }
        buffer[read]=0;
        out += (char*)buffer;
    } while(read >= sizeof(buffer));
    return out;
}

前两个调用正确响应,然后返回"error"

我无法使用和理解标准库 function 因为我没有 C++ 编程经验。 我要做的是填充大小为 2048 的BYTE缓冲区。

此代码适用于前两个调用,然后read变量被破坏。 我知道我的初始化是正确的,因为我能够连接在任务管理器中打开自身的进程,并且我能够从中检索数据,但是在一对调用之后, read变量被损坏。

这会导致我的代码挂起或崩溃。 这段代码有一些我不喜欢的地方。 例如,我不能使用像fstream这样的标准库函数,所以我决定暂时坚持这个设置。 另外,我不知道使用ReadFile() function 从进程中读取是否正确,但这种方法有效。 while循环让我感觉很不舒服,我不明白我为什么需要它。

任何想知道我如何初始化此代码的人,请随时询问,我将提供所有缺失的信息,但我认为这不是问题,因为我能够从过程本身中读取一些内容。 我可以提供我正在使用的源代码的链接,因为那是一个公共源代码存储库。

也许问的问题(来自你):

  1. 您的流程是否支持阅读?

    是的,它确实

  2. 您是否有足够的权限来运行和读取该进程?

    是的,我有

  3. 也许你需要写一些数据来告诉进程开始通信..

    不是这样的,我还有一个function要写数据,在这个调用之前我用过,但是不写我还是收到数据

  4. 你如何创建你的流程?

    我可以提供那个片段,只要问我,但本质上我创建了两个管道,一个用于读取,另一个用于写入,然后我通过调用 CreateProcess 来启动该过程,这很有效。

  5. 你想用你的代码做什么?

    我正在尝试使用 c++ 在 Windows 平台环境中构建一个 class 来处理进程的创建、写入和读取,仅此而已..

什么可能导致read变量损坏? 我很难理解这一点,以及如何避免它。 另外,如果有人可以向我解释这种情况下的良好做法,我真的很感激,或者至少有一个链接到我可以查看的一些资源,或者研究它是如何工作的。

  • ZeroMemory(*buffer, sizeof(buffer)); 应该是ZeroMemory(buffer, sizeof(buffer));
    在当前的 state 中,您读取buffer中的第一个BYTE并将其用作开始归零的地址。 这会导致未定义的行为。
  • buffer[read]=0; 可能会超出范围。 如果您已阅读2048 BYTE ,则您的行为未定义。
  • out += (char*)buffer; 读取buffer ,直到找到\0 - 但没有必要这样做,因为您已经知道您已经阅读了多少BYTE

修复:

  • 删除ZeroMemory - 您只会读取已由ReadFile填充的 memory,因此首先将其清零只是浪费时间。
  • 代替
    buffer[read]=0; out += (char*)buffer;
    out.append(reinterpret_cast<char*>(buffer), read);

另外,检查您调用的函数的返回值。 例如, ReadFile可能会失败。

崩溃都消失了,在我将转换恢复为 char 指针后,我不太了解转换转换,但由于我首先将 char 指针初始化为 nullptr 来分配 memory,然后我使用 memset 分配更大的缓冲区,不知何故我的approce 适用于这种情况,因为我不在代码中的其他任何地方使用它,如果我需要它,我只需使用 std::string 将它复制到一个新的初始化字符串中,这样就解决了持续崩溃问题,并且唯一我想不出更好的方法来解决这个问题。

接下来,我预想的也是一个崩溃,它实际上是ReadFile function的无限循环,它发生在两种情况下。

  1. 当我传递一个“错误”的字符串与它通信时,某种特殊的字符(如 \ 或 /)

  2. 当缓冲区没有从应用程序读取,应用程序返回空 output

仍然不确定如何处理第二种情况:(但至少我可以继续调试...... :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM