blob: 7b8476d05e8c81e8e39b41e5e080cdeb7bf8a712 [file] [log] [blame]
/*
* Copyright 2006 ProductiveMe Inc.
* Copyright 2013 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.pme.exe.res;
import com.pme.exe.Bin;
import com.pme.exe.ImageSectionHeader;
import com.pme.exe.ImageOptionalHeader;
import com.pme.exe.ImageDataDirectory;
import java.io.*;
/**
* Date: Apr 6, 2006
* Time: 7:10:09 PM
*/
public class ResourceSectionReader extends Bin.Structure {
private Level myRoot = new Level();
private Bin.Value myStartOffset;
private Bin.Value myMainSectionsOffset;
private Bin.Value mySize;
private Bin.Bytes myBytes;
public ResourceSectionReader( ImageSectionHeader sectionHeader, Bin.Value startOffset, Bin.Value mainSectionsOffset, ImageOptionalHeader imageOptionalHeader) {
super(((Bin.Txt)sectionHeader.getMember("Name")).getText());
myStartOffset = startOffset;
mySize = sectionHeader.getValueMember( "SizeOfRawData" );
Bin.Value virtualSize = sectionHeader.getValueMember( "VirtualSize" );
myMainSectionsOffset = mainSectionsOffset;
addOffsetHolder(startOffset);
ArrayOfBins imageDataDirs = (ArrayOfBins)imageOptionalHeader.getMember( "ImageDataDirectories" );
Bin[] bins = imageDataDirs.getArray();
ImageDataDirectory imageDataDirectory = (ImageDataDirectory)bins[2];
Value size = imageDataDirectory.getValueMember("Size");
addSizeHolder(mySize);
addSizeHolder(virtualSize);
addSizeHolder(size);
myRoot.addLevelEntry(new DirectoryEntry( this, null, 0));
addMember(myRoot);
}
public DirectoryEntry getRoot(){
return (DirectoryEntry)myRoot.getMember( "IRD" );
}
public Value getStartOffset() {
return myStartOffset;
}
public Value getMainSectionsOffset() {
return myMainSectionsOffset;
}
public long sizeInBytes() {
return super.sizeInBytes() + myBytes.sizeInBytes();
}
public void read(DataInput stream) throws IOException {
super.read(stream);
DWord size = new DWord("size");
size.setValue((mySize.getValue() - myRoot.sizeInBytes()));
DWord startOffset = new DWord("startOffset");
startOffset.setValue((myStartOffset.getValue() + myRoot.sizeInBytes()));
myBytes = new Bin.Bytes("Raw data", startOffset, size);
myBytes.read(stream);
}
public void write(DataOutput stream) throws IOException {
super.write(stream);
myBytes.write(stream);
}
public void report(OutputStreamWriter writer) throws IOException {
super.report(writer);
myBytes.report(writer);
}
}