public void PersistObjectMap(ObjectTypeMap source, string fileName) { byte[] bytesToCompress = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(source)); using (FileStream fileToCompress = File.Create(fileName)) using (GZipStream compressionStream = new GZipStream(fileToCompress, CompressionMode.Compress)) { compressionStream.Write(bytesToCompress, 0, bytesToCompress.Length); } }
public ObjectTypes(DataProviderBase dataProvider, Profile profile) : base(profile, dataProvider, 0) { _is64 = (_profile.Architecture == "AMD64"); _objectMap = new ObjectTypeMap(); _objectMap.ObjectTypeRecords = new List <ObjectTypeRecord>(); // first let's see if it already exists FileInfo cachedFile = new FileInfo(_dataProvider.CacheFolder + "\\object_type_map.gz"); if (cachedFile.Exists && !dataProvider.IsLive) { ObjectTypeMap otm = RetrieveObjectMap(cachedFile); if (otm != null) { _objectMap = otm; return; } } AddressBase kernelAS; if (_is64) { kernelAS = _profile.KernelAddressSpace as AddressSpacex64; } else { kernelAS = _profile.KernelAddressSpace as AddressSpacex86Pae; } uint indexTableOffset = (uint)_profile.GetConstant("ObpObjectTypes"); ulong startOffset = _profile.KernelBaseAddress + indexTableOffset; ulong pAddr = kernelAS.vtop(startOffset, _dataProvider.IsLive); if (pAddr == 0) { return; } _buffer = _dataProvider.ReadMemory(pAddr & 0xfffffffff000, 1); ulong ptr = 0; if (_is64) { ptr = ReadUInt64((int)(pAddr & 0xfff)); } else { ptr = ReadUInt32((int)(pAddr & 0xfff)); } //ulong pAddress = kernelAS.vtop(ptr); ObjectType ot = new ObjectType(_profile, _dataProvider, ptr); int count = (int)ot.TotalNumberOfObjects; for (int i = 0; i < count; i++) { if (_is64) { startOffset = _profile.KernelBaseAddress + indexTableOffset + (uint)(i * 8); } else { startOffset = _profile.KernelBaseAddress + indexTableOffset + (uint)(i * 4); } pAddr = kernelAS.vtop(startOffset, _dataProvider.IsLive); _buffer = _dataProvider.ReadMemory(pAddr & 0xfffffffff000, 1); if (_is64) { ptr = ReadUInt64((int)(pAddr & 0xfff)); } else { ptr = ReadUInt32((int)(pAddr & 0xfff)); } //pAddress = kernelAS.vtop(ptr); ot = new ObjectType(_profile, _dataProvider, ptr); ObjectTypeRecord otr = new ObjectTypeRecord(); otr.Name = ot.Name; otr.Index = ot.Index; if (otr.Index == 0 || otr.Name == "") { continue; } _objectMap.ObjectTypeRecords.Add(otr); } if (!dataProvider.IsLive) { PersistObjectMap(_objectMap, _dataProvider.CacheFolder + "\\object_type_map.gz"); } }