| 26 | } |
| 27 | |
| 28 | void RemoteProcess::open(void) { |
| 29 | this->handle = OpenProcess(RemoteProcess::NEEDEDACCESS, false, this->the_signal->getPid()); |
| 30 | |
| 31 | if (this->handle == NULL) { |
| 32 | if (GetLastError() != ERROR_ACCESS_DENIED) { |
| 33 | throw system_error(error_code(GetLastError(), system_category()), "remote-process:open:OpenProcess"); |
| 34 | } |
| 35 | |
| 36 | if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &this->process_token)) { |
| 37 | this->closeProcessToken(); |
| 38 | throw system_error(error_code(GetLastError(), system_category()), "remote-process:open:OpenProcessToken"); |
| 39 | } |
| 40 | |
| 41 | if (!this->setPrivilege(true)) { |
| 42 | this->closeProcessToken(); |
| 43 | throw runtime_error(string("EPERM")); |
| 44 | } |
| 45 | |
| 46 | this->handle = OpenProcess(RemoteProcess::NEEDEDACCESS, false, this->the_signal->getPid()); |
| 47 | |
| 48 | if (this->handle == NULL) { |
| 49 | this->setPrivilege(false); |
| 50 | this->closeProcessToken(); |
| 51 | throw runtime_error(string("EPERM")); |
| 52 | // throw runtime_error(std::string("remote-process:open:setPrivilege(true):OpenProcess:code:") + std::to_string(GetLastError())); |
| 53 | } |
| 54 | } |
| 55 | } |
| 56 | |
| 57 | void RemoteProcess::closeProcessToken(void) { |
| 58 | if (this->process_token != NULL) { |
no test coverage detected