OpenProcess 仅可通过 Visual Studio 执行工作

问题描述 投票:0回答:1

我的 C++ 代码有问题。当我通过 Visual Studio 运行它时,它工作正常,并且没有记录任何问题或错误。当我尝试以管理员身份运行 CMD 并运行该程序时,我收到一个错误,该错误已记录在我的代码中。

这是我尝试过的:

int FindSysmainSvc()
{
    SC_HANDLE scm = OpenSCManager(nullptr, nullptr, SC_MANAGER_CONNECT);
    if (!scm) {
        std::cerr << "Failed to open service control manager: " << GetLastError() << std::endl;
        return -1;
    }

    SC_HANDLE service = OpenService(scm, L"SysMain", SERVICE_QUERY_STATUS);
    if (!service) {
        std::cerr << "Failed to open service: " << GetLastError() << std::endl;
        CloseServiceHandle(scm);
        return -1;
    }

    SERVICE_STATUS_PROCESS status;
    DWORD bytesNeeded;
    if (!QueryServiceStatusEx(service, SC_STATUS_PROCESS_INFO, reinterpret_cast<LPBYTE>(&status), sizeof(status), &bytesNeeded)) {
        std::cerr << "Failed to query service status: " << GetLastError() << std::endl;
        CloseServiceHandle(service);
        CloseServiceHandle(scm);
        return -1;
    }

    DWORD processId = status.dwProcessId;

    CloseServiceHandle(service);
    CloseServiceHandle(scm);

    return processId;
}

int main() {
    int pid = FindSysmainSvc();

    if (pid == -1) {
        std::cout << "[!] Failed to find pid\n";
        return -1;
    }

    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pid);
    if (hProcess == nullptr) {
        std::cout << "[!] OpenProcess(): FAILED";
        return -1;
    }

    CloseHandle(hProcess);
    return 0;
}

在 Visual Studio 执行和 CMD 执行中均成功返回 pid。

我在 CMD 中收到“[!] OpenProcess(): FAILED”错误,而在 Visual Studio 执行中,进程句柄已成功检索。

c++ winapi
1个回答
0
投票

OpenProcess
的官方文档对
dwProcessId
参数(最后一个参数)做了如下说明:

如果指定的进程是系统空闲进程(0x00000000),则函数失败,最后的错误代码为

ERROR_INVALID_PARAMETER
。如果指定的进程是系统进程或客户端服务器运行子系统 (CSRSS) 进程之一,则此函数将失败,最后一个错误代码为
ERROR_ACCESS_DENIED
,因为它们的访问限制阻止用户级代码打开它们。

最后两个错误码的值为

  • ERROR_INVALID_PARAMETER
    - 86L(简单来说就是86)
  • ERROR_ACCESS_DENIED
    - 5L(只需 5 个)

从这两个事件中,我总是收到错误代码 5,事件以管理员身份运行。

希望能帮到你。

© www.soinside.com 2019 - 2024. All rights reserved.