public absHFSPlusBTree(HFSPlusFile knownExtents, volumeStream hfsp) { extents = knownExtents; // grab a bunch of information to ensure the header node is captured byte[] firstBlock = new byte[hfsp.volume.blockSize]; this.fs = new forkStream(hfsp, knownExtents, forkStream.forkType.data); fs.Read(firstBlock, 0, firstBlock.Count()); // nodeSize is byte 30 of header record which comes immediately after 14 byte descriptor this.nodeSize = dataOperations.convToLE(BitConverter.ToUInt16(firstBlock, 32)); byte[] headerData = new byte[nodeSize]; headerData = getNodeData(0, nodeSize); header = new headerNode(ref headerData); // check whether all of the data extents are known long treeSize = header.headerInfo.totalNodes * header.headerInfo.nodeSize; if (fs.Length >= treeSize && fs.Length > 0) { isRawDataComplete = true; buildMap(fs); } }