public TreeNode getDirectoryChildren(HFSPlusCatalogFolder folderRecord, catalogFile cf, extentsOverflowFile eof, attributesFile af) { TreeNode returnDir = new TreeNode(); // get every file and directory inside the current one returnDir = cf.getDirectoryAndChildren(folderRecord, eof, this.partitionNo); foreach (TreeNode child in returnDir.Nodes) { // check if there are any alternate data streams for the files if (child.Tag is HFSPlusCatalogFile) { HFSPlusCatalogFile data = (HFSPlusCatalogFile)child.Tag; attributesFile.HFSPlusAttrKey attrKey = new attributesFile.HFSPlusAttrKey(); attrKey.fileID = data.fileID; attrKey.startBlock = 0; attributesLeafNode.attributesDataForFile allAttributes = af.getAttrFileDataWithKey(attrKey); foreach (attributesLeafNode.HFSPlusAttrForkData fork in allAttributes.forks) { TreeNode attribute = new TreeNode(); attributesLeafNode.HFSPlusAttrForkData tag = fork; tag.partitionAssoc = folderRecord.partitionAssoc; attribute.Text = child.Text + " > " + System.Text.Encoding.BigEndianUnicode.GetString(fork.key.attrName); attribute.Tag = tag; returnDir.Nodes.Add(attribute); } foreach (attributesLeafNode.HFSPlusAttrInlineData inline in allAttributes.inline) { TreeNode attribute = new TreeNode(); attributesLeafNode.HFSPlusAttrInlineData tag = inline; tag.partitionAssoc = folderRecord.partitionAssoc; attribute.Text = child.Text + " > " + System.Text.Encoding.BigEndianUnicode.GetString(inline.key.attrName); attribute.Tag = tag; returnDir.Nodes.Add(attribute); } } } return(returnDir); }
public attributesLeafNode.HFSPlusAttrInlineData getAttriInlineDataWithKey(HFSPlusAttrKey recordKeyID, bool caseSensitiveCompare = false) { byte[] nodeRawData = new byte[this.nodeSize]; attributesLeafNode.HFSPlusAttrInlineData result = new attributesLeafNode.HFSPlusAttrInlineData(); // find the root node uint currentNodeNumber = this.header.headerInfo.rootNode; fs.Seek(currentNodeNumber * this.nodeSize, SeekOrigin.Begin); fs.Read(nodeRawData, 0, this.nodeSize); absNode.nodeType currentNodeType = getNodeType(currentNodeNumber); bool found = false; // get the leaf if (this.header.headerInfo.rootNode > 0) { uint leafRecordNumber = getLeafNodeContainingRecord(recordKeyID); fs.Seek(leafRecordNumber * this.nodeSize, SeekOrigin.Begin); fs.Read(nodeRawData, 0, this.nodeSize); attributesLeafNode leafNode = new attributesLeafNode(ref nodeRawData); foreach (attributesLeafNode.HFSPlusAttrInlineData leafRecord in leafNode.inlineRecords) { if (dataOperations.keyCompareResult.equalsTrialKey == attrKeyCompare(leafRecord.key, recordKeyID, caseSensitiveCompare) && found == false) { result = leafRecord; found = true; } } } if (found) { return(result); } else { throw new KeyNotFoundException(); } }
private void onRowClick(object sender, ListViewItemSelectionChangedEventArgs e) { comboBox1.Visible = false; if (e.Item.Tag is HFSPlusCatalogFolder) { HFSPlusCatalogFolder details = (HFSPlusCatalogFolder)e.Item.Tag; propertyGrid1.SelectedObject = details; resetHex(); } else if (e.Item.Tag is HFSPlusCatalogFile) { resetHex(); HFSPlusCatalogFile details = (HFSPlusCatalogFile)e.Item.Tag; propertyGrid1.SelectedObject = details; if (details.dataFork.forkDataValues.logicalSize > 0 || details.resourceFork.forkDataValues.logicalSize > 0) { comboBox1.Visible = true; } if (details.dataFork.forkDataValues.logicalSize > 0) { dc.showForkData(details, 0, forkStream.forkType.data); dc.selectedFile = details; hexText.Text = dc.contentDisplay; showTotalBlocks.Text = details.dataFork.forkDataValues.totalBlocks.ToString(); if (details.dataFork.forkDataValues.totalBlocks > 1) { nextBlock.Enabled = true; goToBlock.Enabled = true; blockNumBox.Enabled = true; } dc.fileDataBlock = 1; showCurrentBlock.Text = dc.fileDataBlock.ToString(); comboBox1.SelectedItem = dc.forkview[0]; } else if (details.resourceFork.forkDataValues.logicalSize > 0) { dc.showForkData(details, 0, forkStream.forkType.resource); dc.selectedFile = details; hexText.Text = dc.contentDisplay; showTotalBlocks.Text = details.resourceFork.forkDataValues.totalBlocks.ToString(); if (details.resourceFork.forkDataValues.totalBlocks > 1) { nextBlock.Enabled = true; goToBlock.Enabled = true; blockNumBox.Enabled = true; } dc.fileDataBlock = 1; showCurrentBlock.Text = dc.fileDataBlock.ToString(); comboBox1.SelectedItem = dc.forkview[1]; } else { hexText.Text = ""; showCurrentBlock.Text = ""; } comboBox1.DataSource = dc.forkview; } else if (e.Item.Tag is HFSPlus.volumeHeader) { HFSPlus.volumeHeader details = (HFSPlus.volumeHeader)e.Item.Tag; propertyGrid1.SelectedObject = details; resetHex(); } else if (e.Item.Tag is attributesLeafNode.HFSPlusAttrInlineData) { resetHex(); attributesLeafNode.HFSPlusAttrInlineData attrDetails = (attributesLeafNode.HFSPlusAttrInlineData)e.Item.Tag; propertyGrid1.SelectedObject = attrDetails; if (attrDetails.otherData.Length > 0) { dc.showInlineAttrData((attributesLeafNode.HFSPlusAttrInlineData)e.Item.Tag); hexText.Text = dc.contentDisplay; } } }
public void showInlineAttrData(attributesLeafNode.HFSPlusAttrInlineData entry) { rawDataDisplay(entry.otherData); }
private ListViewItem getNodeRowContents(TreeNode theTree) { ListViewItem row = new ListViewItem(theTree.Text); if (theTree.Tag != null) { string tagType = theTree.Tag.GetType().ToString(); switch (tagType) { case "Disk_Reader.HFSPlusCatalogFolder": HFSPlusCatalogFolder folderTag = (HFSPlusCatalogFolder)theTree.Tag; row.Tag = folderTag; row.SubItems.Add(folderTag.folderID.ToString()); if (folderTag.createDate > HFSPlus.FromHFSPlusTime(0)) { row.SubItems.Add(folderTag.createDate.ToString()); } else { row.SubItems.Add(""); } if (folderTag.contentModDate > HFSPlus.FromHFSPlusTime(0)) { row.SubItems.Add(folderTag.contentModDate.ToString()); } else { row.SubItems.Add(""); } if (folderTag.attributeModDate > HFSPlus.FromHFSPlusTime(0)) { row.SubItems.Add(folderTag.attributeModDate.ToString()); } else { row.SubItems.Add(""); } if (folderTag.backupDate > HFSPlus.FromHFSPlusTime(0)) { row.SubItems.Add(folderTag.backupDate.ToString()); } else { row.SubItems.Add(""); } if (folderTag.accessDate > HFSPlus.FromHFSPlusTime(0)) { row.SubItems.Add(folderTag.accessDate.ToString()); } else { row.SubItems.Add(""); } string folderPermissions = ""; if (folderTag.permissions.fileMode.owner.read) { folderPermissions += "r"; } else { folderPermissions += "-"; } if (folderTag.permissions.fileMode.owner.write) { folderPermissions += "w"; } else { folderPermissions += "-"; } if (folderTag.permissions.fileMode.owner.execute) { folderPermissions += "x"; } else { folderPermissions += "-"; } folderPermissions += "/"; if (folderTag.permissions.fileMode.group.read) { folderPermissions += "r"; } else { folderPermissions += "-"; } if (folderTag.permissions.fileMode.group.write) { folderPermissions += "w"; } else { folderPermissions += "-"; } if (folderTag.permissions.fileMode.group.execute) { folderPermissions += "x"; } else { folderPermissions += "-"; } folderPermissions += "/"; if (folderTag.permissions.fileMode.other.read) { folderPermissions += "r"; } else { folderPermissions += "-"; } if (folderTag.permissions.fileMode.other.write) { folderPermissions += "w"; } else { folderPermissions += "-"; } if (folderTag.permissions.fileMode.other.execute) { folderPermissions += "x"; } else { folderPermissions += "-"; } row.SubItems.Add(folderPermissions); row.SubItems.Add(""); // data fork size row.SubItems.Add(""); // resource fork size row.SubItems.Add(""); // data start sector LBA row.SubItems.Add(""); // rsrc start sector row.SubItems.Add(""); // data fragments count row.SubItems.Add(""); // rsrc fragments count row.SubItems.Add(""); // data fork MD5 row.SubItems.Add(""); // data fork SHA1 row.SubItems.Add(""); // resource fork MD5 row.SubItems.Add(""); // resource fork SHA1 row.SubItems.Add(""); // is deleted row.SubItems.Add(folderTag.path); break; case "Disk_Reader.HFSPlus+volumeHeader": HFSPlus.volumeHeader headerTag = (HFSPlus.volumeHeader)theTree.Tag; row.Tag = headerTag; row.SubItems.Add(""); // CNID if (headerTag.createDate > HFSPlus.FromHFSPlusTime(0)) { row.SubItems.Add(headerTag.createDate.ToString()); } else { row.SubItems.Add(""); } if (headerTag.modifyDate > HFSPlus.FromHFSPlusTime(0)) { row.SubItems.Add(headerTag.modifyDate.ToString()); } else { row.SubItems.Add(""); } row.SubItems.Add(""); // attribute mod date if (headerTag.backupDate > HFSPlus.FromHFSPlusTime(0)) { row.SubItems.Add(headerTag.backupDate.ToString()); } else { row.SubItems.Add(""); } row.SubItems.Add(""); // access date row.SubItems.Add(""); // permissions row.SubItems.Add(""); // data fork size row.SubItems.Add(""); // resource fork size row.SubItems.Add(""); // data start sector LBA row.SubItems.Add(""); // rsrc start sector row.SubItems.Add(""); // data fragments count row.SubItems.Add(""); // rsrc fragments count row.SubItems.Add(""); // data fork MD5 row.SubItems.Add(""); // data fork SHA1 row.SubItems.Add(""); // resource fork MD5 row.SubItems.Add(""); // resource fork SHA1 row.SubItems.Add(""); // is deleted row.SubItems.Add(headerTag.path); break; case "Disk_Reader.HFSPlusCatalogFile": HFSPlusCatalogFile fileTag = (HFSPlusCatalogFile)theTree.Tag; row.Tag = fileTag; row.SubItems.Add(fileTag.fileID.ToString()); if (fileTag.createDate > HFSPlus.FromHFSPlusTime(0)) // creation date { row.SubItems.Add(fileTag.createDate.ToString()); } else { row.SubItems.Add(""); } if (fileTag.contentModDate > HFSPlus.FromHFSPlusTime(0)) // content mod date { row.SubItems.Add(fileTag.contentModDate.ToString()); } else { row.SubItems.Add(""); } if (fileTag.attributeModDate > HFSPlus.FromHFSPlusTime(0)) // attributes mod date { row.SubItems.Add(fileTag.attributeModDate.ToString()); } else { row.SubItems.Add(""); } if (fileTag.backupDate > HFSPlus.FromHFSPlusTime(0)) // backup date { row.SubItems.Add(fileTag.backupDate.ToString()); } else { row.SubItems.Add(""); } if (fileTag.accessDate > HFSPlus.FromHFSPlusTime(0)) // access date - Mac OS X does not use this - only POSIX implementations { row.SubItems.Add(fileTag.accessDate.ToString()); } else { row.SubItems.Add(""); } string filePermissions = ""; if (fileTag.permissions.fileMode.owner.read) { filePermissions += "r"; } else { filePermissions += "-"; } if (fileTag.permissions.fileMode.owner.write) { filePermissions += "w"; } else { filePermissions += "-"; } if (fileTag.permissions.fileMode.owner.execute) { filePermissions += "x"; } else { filePermissions += "-"; } filePermissions += "/"; if (fileTag.permissions.fileMode.group.read) { filePermissions += "r"; } else { filePermissions += "-"; } if (fileTag.permissions.fileMode.group.write) { filePermissions += "w"; } else { filePermissions += "-"; } if (fileTag.permissions.fileMode.group.execute) { filePermissions += "x"; } else { filePermissions += "-"; } filePermissions += "/"; if (fileTag.permissions.fileMode.other.read) { filePermissions += "r"; } else { filePermissions += "-"; } if (fileTag.permissions.fileMode.other.write) { filePermissions += "w"; } else { filePermissions += "-"; } if (fileTag.permissions.fileMode.other.execute) { filePermissions += "x"; } else { filePermissions += "-"; } row.SubItems.Add(filePermissions); // file permissions row.SubItems.Add(fileTag.dataFork.forkDataValues.logicalSize.ToString()); // data fork size int rsrccount = 0; if (fileTag.resourceFork != null) { row.SubItems.Add(fileTag.resourceFork.forkDataValues.logicalSize.ToString()); // only try to iterate through resource fork extents if a resource fork exists // (volume metadata files do not have a resource fork) for (int i = 0; i < fileTag.dataFork.forkDataValues.extents.Count(); i++) { if (fileTag.resourceFork.forkDataValues.extents[i].blockCount > 0) { rsrccount++; } } } else { row.SubItems.Add("0"); // resource fork size } if (fileTag.dataFork.forkDataValues.extents[0].startBlock > 0) { row.SubItems.Add(fileTag.dataFork.forkDataValues.extents[0].startBlock.ToString()); } else { row.SubItems.Add(""); // start sector LBA } if (fileTag.resourceFork != null) { if (fileTag.resourceFork.forkDataValues.extents[0].startBlock > 0) { row.SubItems.Add(fileTag.resourceFork.forkDataValues.extents[0].startBlock.ToString()); } else { row.SubItems.Add(""); // resource start sector } } int datacount = 0; for (int i = 0; i < fileTag.dataFork.forkDataValues.extents.Count(); i++) { if (fileTag.dataFork.forkDataValues.extents[i].blockCount > 0) { datacount++; } } row.SubItems.Add(datacount.ToString()); // data fragments count row.SubItems.Add(rsrccount.ToString()); // resource fragments count row.SubItems.Add(""); // data fork MD5 row.SubItems.Add(""); // data fork SHA1 row.SubItems.Add(""); // resource fork MD5 row.SubItems.Add(""); // resource fork SHA1 row.SubItems.Add(""); // is deleted row.SubItems.Add(fileTag.path); break; case "Disk_Reader.attributesLeafNode+HFSPlusAttrForkData": break; case "Disk_Reader.attributesLeafNode+HFSPlusAttrInlineData": attributesLeafNode.HFSPlusAttrInlineData inlineTag = (attributesLeafNode.HFSPlusAttrInlineData)theTree.Tag; row.Tag = inlineTag; row.SubItems.Add(inlineTag.key.fileID.ToString()); row.SubItems.Add(""); // creation date row.SubItems.Add(""); // content mod date row.SubItems.Add(""); // attributes mod date row.SubItems.Add(""); // backup date row.SubItems.Add(""); // access date row.SubItems.Add(""); // file permissions row.SubItems.Add(inlineTag.otherData.Length.ToString()); // data fork size row.SubItems.Add(""); // resource fork size row.SubItems.Add(""); // data start sector LBA row.SubItems.Add(""); // rsrc start sector LBA row.SubItems.Add(""); // data fragments count row.SubItems.Add(""); // rsrc fragments count row.SubItems.Add(""); // data fork MD5 row.SubItems.Add(""); // data fork SHA1 row.SubItems.Add(""); // resource fork MD5 row.SubItems.Add(""); // resource fork SHA1 row.SubItems.Add(""); // is deleted row.SubItems.Add(""); // path break; } } return(row); }
public attributesLeafNode.HFSPlusAttrInlineData getAttriInlineDataWithKey(HFSPlusAttrKey recordKeyID, bool caseSensitiveCompare = false) { byte[] nodeRawData = new byte[this.nodeSize]; attributesLeafNode.HFSPlusAttrInlineData result = new attributesLeafNode.HFSPlusAttrInlineData(); // find the root node uint currentNodeNumber = this.header.headerInfo.rootNode; fs.Seek(currentNodeNumber * this.nodeSize, SeekOrigin.Begin); fs.Read(nodeRawData, 0, this.nodeSize); absNode.nodeType currentNodeType = getNodeType(currentNodeNumber); bool found = false; // get the leaf if (this.header.headerInfo.rootNode > 0) { uint leafRecordNumber = getLeafNodeContainingRecord(recordKeyID); fs.Seek(leafRecordNumber * this.nodeSize, SeekOrigin.Begin); fs.Read(nodeRawData, 0, this.nodeSize); attributesLeafNode leafNode = new attributesLeafNode(ref nodeRawData); foreach (attributesLeafNode.HFSPlusAttrInlineData leafRecord in leafNode.inlineRecords) { if (dataOperations.keyCompareResult.equalsTrialKey == attrKeyCompare(leafRecord.key, recordKeyID, caseSensitiveCompare) && found == false) { result = leafRecord; found = true; } } } if (found) { return result; } else { throw new KeyNotFoundException(); } }