| 57 | } |
| 58 | |
| 59 | bool SymbolFileInfo::GetPdbSignature(ULONG_PTR imageBase,PIMAGE_DEBUG_DIRECTORY entry) { |
| 60 | if (entry->SizeOfData < sizeof(CV_INFO_PDB20)) |
| 61 | return false; |
| 62 | |
| 63 | ULONG_PTR offset = 0; |
| 64 | |
| 65 | offset = entry->PointerToRawData; |
| 66 | auto cvData = (unsigned char*)(imageBase + offset); |
| 67 | auto signature = *(DWORD*)cvData; |
| 68 | |
| 69 | if (signature == '01BN') { |
| 70 | auto cv = (CV_INFO_PDB20*)cvData; |
| 71 | _pdbSignature.Format(L"%X%X", cv->Signature, cv->Age); |
| 72 | std::string file((const char*)cv->PdbFileName, entry->SizeOfData - FIELD_OFFSET(CV_INFO_PDB20, PdbFileName)); |
| 73 | _pdbFile = Helpers::StringToWstring(file).c_str(); |
| 74 | _pdbValidation.signature = cv->Signature; |
| 75 | _pdbValidation.age = cv->Age; |
| 76 | } |
| 77 | else if (signature == 'SDSR') { |
| 78 | auto cv = (CV_INFO_PDB70*)cvData; |
| 79 | _pdbSignature.Format(L"%08X%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X%X", |
| 80 | cv->Signature.Data1, cv->Signature.Data2, cv->Signature.Data3, |
| 81 | cv->Signature.Data4[0], cv->Signature.Data4[1], cv->Signature.Data4[2], |
| 82 | cv->Signature.Data4[3], cv->Signature.Data4[4], cv->Signature.Data4[5], |
| 83 | cv->Signature.Data4[6], cv->Signature.Data4[7], cv->Age); |
| 84 | std::string file((const char*)cv->PdbFileName, entry->SizeOfData - FIELD_OFFSET(CV_INFO_PDB70, PdbFileName)); |
| 85 | _pdbFile = Helpers::StringToWstring(file).c_str(); |
| 86 | memcpy(&_pdbValidation.guid, &cv->Signature, sizeof(GUID)); |
| 87 | _pdbValidation.signature = 0; |
| 88 | _pdbValidation.age = cv->Age; |
| 89 | } |
| 90 | return true; |
| 91 | } |
| 92 | |
| 93 | downslib_error SymbolFileInfo::Download(std::string url, std::wstring fileName, std::string userAgent, |
| 94 | unsigned int timeout,downslib_cb cb, void* userdata){ |