bool CheckPEHeaders::parseResponse(QPointer<RpcData> rd) { if (!ICommand::parseResponse(rd)) return false; try { rpc::CheckPEHeadersResult result; if (!hlp::protobuf::parseBigMessage(result, rd->response->rpc_result())) { msg("%s: rpc::CheckPEHeadersResult::ParseFromString() failed\n", __FUNCTION__); return false; } peValid = result.pe_valid(); if (peValid) { const auto& exps = result.exps(); for (auto it = exps.begin(), end = exps.end(); it != end; ++it) { ExportItem item = { it->ea(), it->ord(), it->name() }; exports.append(item); } const auto& sects = result.sections(); for (auto it = sects.begin(), end = sects.end(); it != end; ++it) { Section s = { it->name(), it->va(), it->v_size(), it->raw(), it->raw_size(), it->characteristics() }; sections.append(s); } } return true; } catch (std::runtime_error e) { msg("%s: Runtime error: %s\n", __FUNCTION__, e.what()); } catch (...) { msg("%s: Unable to parse CheckPEHeadersRequest response\n", __FUNCTION__); } return false; }
// exponential of matrix to kmax terms Matrix3 Matrix3::Exponential(int kmax) const { if(is2D) { // first term if(kmax==1) { return Matrix3(1. + m[0][0], m[0][1], m[1][0], 1. + m[1][1], 1. + m[2][2]); } // kmax is 2 or higher int k; double c0 = m[0][1]*m[1][0] - m[0][0]*m[1][1]; // -det(A) double c1 = m[0][0] + m[1][1]; // Tr(A) double beta0 = 0., beta1 = 1.; double alpha0 = 1., alpha1 = 1.; double betaz = m[2][2], ezz = 1. + betaz; double factor, temp; for(k=2;k<=kmax;k++) { // update beta using beta(k,0) = (1/k) c0 beta(k-1,1) // and beta(k,1) = (1/k) (c1 beta(k-1,1) + beta(k-1,0)) factor = 1/(double)k; temp = beta1; beta1 = factor*(c1*temp + beta0); beta0 = factor*c0*temp; betaz *= factor*m[2][2]; alpha0 += beta0; alpha1 += beta1; ezz += betaz; } // return alpha0*I + alpha1*m return Matrix3(alpha0 + alpha1*m[0][0], alpha1*m[0][1], alpha1*m[1][0], alpha0 + alpha1*m[1][1], ezz); } // done if only 1 term if(kmax==1) { return Matrix3(1. + m[0][0], m[0][1], m[0][2], m[1][0], 1. + m[1][1], m[1][2], m[2][0], m[2][1], 1. + m[2][2]); } // get square of this matrix Matrix3 m2 = *this; m2 *= m2; // just two terms if(kmax==2) { return Matrix3(1. + m[0][0] + 0.5*m2(0,0), m[0][1] + 0.5*m2(0,1), m[0][2] + 0.5*m2(0,2), m[1][0] + 0.5*m2(1,0), 1. + m[1][1] + 0.5*m2(1,1), m[1][2] + 0.5*m2(1,2), m[2][0] + 0.5*m2(2,0), m[2][1] + 0.5*m2(2,1), 1. + m[2][2] + 0.5*m2(2,2)); } // kmax is 3 or more int k; double c0,c1,c2,factor,temp; characteristics(c0,c1,c2); double beta0 = 0.,beta1 = 0.,beta2 = 0.5; double alpha0 = 1.,alpha1 = 1.,alpha2 = 0.5; for(k=3;k<=kmax;k++) { // update beta using beta(k,0) = (1/k) c0 beta(k-1,2) // and beta(k,1) = (1/k) (c1 beta(k-1,2) + beta(k-1,0)) // and beta(k,2) = (1/k) (c2 beta(k-1,2) + beta(k-1,1)) factor = 1./(double)k; temp = beta2; beta2 = factor*(c2*temp + beta1); beta1 = factor*(c1*temp + beta0); beta0 = factor*c0*temp; alpha0 += beta0; alpha1 += beta1; alpha2 += beta2; } // return alpha0*I + alpha1*m + alpha2*m2 return Matrix3(alpha0 + alpha1*m[0][0] + alpha2*m2(0,0), alpha1*m[0][1] + alpha2*m2(0,1), alpha1*m[0][2] + alpha2*m2(0,2), alpha1*m[1][0] + alpha2*m2(1,0), alpha0 + alpha1*m[1][1] + alpha2*m2(1,1), alpha1*m[1][2] + alpha2*m2(1,2), alpha1*m[2][0] + alpha2*m2(2,0), alpha1*m[2][1] + alpha2*m2(2,1), alpha0 + alpha1*m[2][2] + alpha2*m2(2,2)); }