internal string GetName(PEBuffer buff, int resourceStartFileOffset) { if (IsStringName) { int nameLen = *((ushort *)buff.Fetch(NameOffset + resourceStartFileOffset, 2)); char *namePtr = (char *)buff.Fetch(NameOffset + resourceStartFileOffset + 2, nameLen); return(new string(namePtr)); } return(Id.ToString()); }
public unsafe int ReadVirtual(IntPtr self, ulong address, IntPtr buffer, int bytesRequested, out int bytesRead) { if (_dataReader.ReadMemory(address, buffer, bytesRequested, out int read)) { bytesRead = read; return(S_OK); } bytesRead = 0; ModuleInfo info = GetModule(address); if (info != null) { if (Path.GetExtension(info.FileName).ToLower() == ".so") { // TODO System.Diagnostics.Debug.WriteLine($"TODO: Implement reading from module '{info.FileName}'"); return(E_NOTIMPL); } string filePath = _dataTarget.SymbolLocator.FindBinary(info.FileName, info.TimeStamp, info.FileSize, true); if (filePath == null) { bytesRead = 0; return(E_FAIL); } // We do not put a using statement here to prevent needing to load/unload the binary over and over. PEFile file = _dataTarget.FileLoader.LoadPEFile(filePath); if (file?.Header != null) { PEBuffer peBuffer = file.AllocBuff(); int rva = checked ((int)(address - info.ImageBase)); if (file.Header.TryGetFileOffsetFromRva(rva, out rva)) { byte *dst = (byte *)buffer.ToPointer(); byte *src = peBuffer.Fetch(rva, bytesRequested); for (int i = 0; i < bytesRequested; i++) { dst[i] = src[i]; } bytesRead = bytesRequested; return(S_OK); } file.FreeBuff(peBuffer); } } return(E_FAIL); }
public unsafe int ReadVirtual(ulong address, IntPtr buffer, int bytesRequested, out int bytesRead) { int read = 0; if (_dataReader.ReadMemory(address, buffer, bytesRequested, out read)) { bytesRead = read; return(0); } ModuleInfo info = GetModule(address); if (info != null) { PEFile file = _dataTarget.SymbolLocator.LoadBinary(info.FileName, info.TimeStamp, info.FileSize, true); if (file != null) { PEBuffer peBuffer = file.AllocBuff(); int rva = checked ((int)(address - info.ImageBase)); if (file.Header.TryGetFileOffsetFromRva(rva, out rva)) { byte *dst = (byte *)buffer.ToPointer(); byte *src = peBuffer.Fetch(rva, bytesRequested); for (int i = 0; i < bytesRequested; i++) { dst[i] = src[i]; } bytesRead = bytesRequested; return(0); } file.FreeBuff(peBuffer); } } bytesRead = 0; return(-1); }