bool IBinaryAppender <ImportFunctionModule.ImageBoundImportDescription, ReaderWithOffsetArgs> .Attach(ref ImportFunctionModule.ImageBoundImportDescription s, uint size, ReaderWithOffsetArgs arg) { if (s.TimeDateStamp == 0) { return(false); } ImportFunctionSection ifs = arg.Tag as ImportFunctionSection; if (ifs == null) { return(false); } string name = arg.Source.ReadStringAnsiAt(arg.Offset + s.OffsetModuleName); ImportFunctionModule ifm = ifs[name]; // if there is a module to update: if (ifm != null) { ReaderWithOffsetArgs mArg = new ReaderWithOffsetArgs(arg.Source, arg.Offset, 0, null); ifm.BoundDate = new DateTime(1970, 1, 1).AddSeconds(s.TimeDateStamp); // append given number of forwarders, having the same size as the current structure // and lying just after: for (ushort i = 0; i < s.NumberOfModuleForwarderRefs; i++) { Append <ImportFunctionModule.ImageBoundImportForwarderRef, ImportFunctionModule, ReaderWithOffsetArgs>( arg.Source, ifm, mArg); } } return(true); }
/// <summary> /// Reads detailed data of imported elements. /// </summary> private void ReadImportData <T, S>(UnmanagedDataReader s, ImportFunctionModule m) where T : struct where S : class, IBinaryAppender <T, ReaderWithOffsetArgs> { if (m != null) { uint xDelta; uint xOffset = GetVirtualRelativeAddress(m.NextModuleAddress, out xDelta); if (xOffset != 0) { s.Jump(xOffset); while (Append <T, S, ReaderWithOffsetArgs> (s, this as S, new ReaderWithOffsetArgs(s, xOffset, xDelta, m))) { m.FirstThunk += s.LastReadSize; } } } }
/// <summary> /// Adds new import module. /// </summary> public void Add(ImportFunctionModule t) { modules.Add(t); }
bool IBinaryAppender <ImportFunctionModule.ImageImportDescriptor, ReaderWithOffsetArgs> .Attach(ref ImportFunctionModule.ImageImportDescriptor s, uint size, ReaderWithOffsetArgs arg) { ImportFunctionSection imports = arg.Tag as ImportFunctionSection; IBinaryAppender <ImportFunctionModule.ImageImportDescriptor, ReaderWithOffsetArgs> t = new ImportFunctionModule(); // read the next import module description: if (t.Attach(ref s, size, arg)) { if (imports != null) { imports.Add(t as ImportFunctionModule); arg.Tag = t; return(true); } } return(false); }
/// <summary> /// Attaches 64-bit specific info about imported functions. /// </summary> private bool AttachImportData(ref ImportFunctionModule.ImageImportData64 r, UnmanagedDataReader s, uint delta, ImportFunctionModule m) { if (m == null) { return(false); } // check if there is any data attached: if (r.OrdinalOrAddressOfData == 0) { return(false); } if (r.IsOrdinal) { ImportFunctionModule.ImageImportData64 thunk = new ImportFunctionModule.ImageImportData64(); if (s.ReadAt(ref thunk, m.FirstThunk - delta)) { m.Add(new ImportFunctionDescription(r.Ordinal, m.IsBinded ? thunk.OrdinalOrAddressOfData : 0)); } } else { ImportFunctionModule.ImageImportByName funName = new ImportFunctionModule.ImageImportByName(); ImportFunctionModule.ImageImportData64 thunk = new ImportFunctionModule.ImageImportData64(); if (s.ReadAt(ref thunk, m.FirstThunk - delta)) { if (s.ReadAt(ref funName, (uint)r.OrdinalOrAddressOfData - delta)) { m.Add(new ImportFunctionDescription( s.ReadStringAnsiAt((uint)r.OrdinalOrAddressOfData - delta + sizeof(short)), m.IsBinded ? thunk.OrdinalOrAddressOfData : 0, (uint)funName.Hint)); } } } return(true); }