我的 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 执行中,进程句柄已成功检索。
OpenProcess
的官方文档对dwProcessId
参数(最后一个参数)做了如下说明:
如果指定的进程是系统空闲进程(0x00000000),则函数失败,最后的错误代码为
。如果指定的进程是系统进程或客户端服务器运行子系统 (CSRSS) 进程之一,则此函数将失败,最后一个错误代码为ERROR_INVALID_PARAMETER
,因为它们的访问限制阻止用户级代码打开它们。ERROR_ACCESS_DENIED
最后两个错误码的值为
ERROR_INVALID_PARAMETER
- 86L(简单来说就是86)ERROR_ACCESS_DENIED
- 5L(只需 5 个)从这两个事件中,我总是收到错误代码 5,事件以管理员身份运行。
希望能帮到你。