2017-07-19 16:31:08 +01:00
|
|
|
|
// /***************************************************************************
|
2016-07-28 18:13:49 +01:00
|
|
|
|
// The Disc Image Chef
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
|
//
|
|
|
|
|
|
// Filename : AppleHFSPlus.cs
|
|
|
|
|
|
// Author(s) : Natalia Portillo <claunia@claunia.com>
|
|
|
|
|
|
//
|
|
|
|
|
|
// Component : Apple Hierarchical File System Plus plugin.
|
|
|
|
|
|
//
|
|
|
|
|
|
// --[ Description ] ----------------------------------------------------------
|
|
|
|
|
|
//
|
|
|
|
|
|
// Identifies the Apple Hierarchical File System Plus and shows information.
|
|
|
|
|
|
//
|
|
|
|
|
|
// --[ License ] --------------------------------------------------------------
|
|
|
|
|
|
//
|
|
|
|
|
|
// This library is free software; you can redistribute it and/or modify
|
|
|
|
|
|
// it under the terms of the GNU Lesser General Public License as
|
|
|
|
|
|
// published by the Free Software Foundation; either version 2.1 of the
|
|
|
|
|
|
// License, or (at your option) any later version.
|
|
|
|
|
|
//
|
|
|
|
|
|
// This library is distributed in the hope that it will be useful, but
|
|
|
|
|
|
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
|
|
// Lesser General Public License for more details.
|
|
|
|
|
|
//
|
|
|
|
|
|
// You should have received a copy of the GNU Lesser General Public
|
|
|
|
|
|
// License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
//
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
2017-12-19 03:50:57 +00:00
|
|
|
|
// Copyright © 2011-2018 Natalia Portillo
|
2016-07-28 18:13:49 +01:00
|
|
|
|
// ****************************************************************************/
|
2014-04-17 19:58:14 +00:00
|
|
|
|
|
2011-03-06 00:25:11 +00:00
|
|
|
|
using System;
|
2016-07-21 17:16:08 +01:00
|
|
|
|
using System.Collections.Generic;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
using System.Runtime.InteropServices;
|
2017-07-19 16:31:08 +01:00
|
|
|
|
using System.Text;
|
|
|
|
|
|
using DiscImageChef.CommonTypes;
|
2011-03-06 00:25:11 +00:00
|
|
|
|
|
2016-07-21 16:15:39 +01:00
|
|
|
|
namespace DiscImageChef.Filesystems
|
2011-03-06 00:25:11 +00:00
|
|
|
|
{
|
2016-07-28 22:25:26 +01:00
|
|
|
|
// Information from Apple TechNote 1150: https://developer.apple.com/legacy/library/technotes/tn/tn1150.html
|
2017-07-01 03:26:08 +01:00
|
|
|
|
public class AppleHFSPlus : Filesystem
|
2014-04-14 02:29:13 +00:00
|
|
|
|
{
|
2015-12-06 07:18:36 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// "BD", HFS magic
|
|
|
|
|
|
/// </summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
const ushort HFS_MAGIC = 0x4244;
|
2015-12-06 07:18:36 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// "H+", HFS+ magic
|
|
|
|
|
|
/// </summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
const ushort HFSP_MAGIC = 0x482B;
|
2015-12-06 07:18:36 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// "HX", HFSX magic
|
|
|
|
|
|
/// </summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
const ushort HFSX_MAGIC = 0x4858;
|
2015-12-06 07:18:36 +00:00
|
|
|
|
|
2015-10-05 20:04:05 +01:00
|
|
|
|
public AppleHFSPlus()
|
2011-03-06 00:25:11 +00:00
|
|
|
|
{
|
2014-04-14 02:29:13 +00:00
|
|
|
|
Name = "Apple HFS+ filesystem";
|
|
|
|
|
|
PluginUUID = new Guid("36405F8D-0D26-6EBE-436F-62F0586B4F08");
|
2017-07-26 12:25:18 +01:00
|
|
|
|
CurrentEncoding = Encoding.BigEndianUnicode;
|
2011-03-06 00:25:11 +00:00
|
|
|
|
}
|
2014-04-14 02:29:13 +00:00
|
|
|
|
|
2017-10-12 23:54:02 +01:00
|
|
|
|
public AppleHFSPlus(Encoding encoding)
|
|
|
|
|
|
{
|
|
|
|
|
|
Name = "Apple HFS+ filesystem";
|
|
|
|
|
|
PluginUUID = new Guid("36405F8D-0D26-6EBE-436F-62F0586B4F08");
|
|
|
|
|
|
CurrentEncoding = Encoding.BigEndianUnicode;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2017-07-19 16:31:08 +01:00
|
|
|
|
public AppleHFSPlus(ImagePlugins.ImagePlugin imagePlugin, Partition partition, Encoding encoding)
|
2016-07-27 13:32:45 +01:00
|
|
|
|
{
|
|
|
|
|
|
Name = "Apple HFS+ filesystem";
|
|
|
|
|
|
PluginUUID = new Guid("36405F8D-0D26-6EBE-436F-62F0586B4F08");
|
2017-07-26 12:25:18 +01:00
|
|
|
|
CurrentEncoding = Encoding.BigEndianUnicode;
|
2016-07-27 13:32:45 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
2017-07-19 16:31:08 +01:00
|
|
|
|
public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, Partition partition)
|
2014-04-14 02:29:13 +00:00
|
|
|
|
{
|
2017-07-19 16:37:11 +01:00
|
|
|
|
if((2 + partition.Start) >= partition.End)
|
2014-07-09 19:49:14 +01:00
|
|
|
|
return false;
|
|
|
|
|
|
|
2016-07-28 22:25:26 +01:00
|
|
|
|
ushort drSigWord;
|
|
|
|
|
|
ushort xdrStABNt;
|
|
|
|
|
|
ushort drAlBlSt;
|
|
|
|
|
|
uint drAlBlkSiz;
|
2016-04-19 02:11:47 +01:00
|
|
|
|
|
2014-04-14 01:14:20 +00:00
|
|
|
|
byte[] vh_sector;
|
|
|
|
|
|
ulong hfsp_offset;
|
2012-08-05 00:43:49 +00:00
|
|
|
|
|
2017-07-20 13:14:12 +01:00
|
|
|
|
uint sectorsToRead = 0x800 / imagePlugin.ImageInfo.sectorSize;
|
|
|
|
|
|
if(0x800 % imagePlugin.ImageInfo.sectorSize > 0)
|
|
|
|
|
|
sectorsToRead++;
|
2016-04-19 02:11:47 +01:00
|
|
|
|
|
2017-07-20 13:14:12 +01:00
|
|
|
|
vh_sector = imagePlugin.ReadSectors(partition.Start, sectorsToRead); // Read volume header, of HFS Wrapper MDB
|
|
|
|
|
|
|
|
|
|
|
|
drSigWord = BigEndianBitConverter.ToUInt16(vh_sector, 0x400); // Check for HFS Wrapper MDB
|
2016-04-19 02:11:47 +01:00
|
|
|
|
|
|
|
|
|
|
if(drSigWord == HFS_MAGIC) // "BD"
|
2014-04-14 02:29:13 +00:00
|
|
|
|
{
|
2017-07-20 13:14:12 +01:00
|
|
|
|
drSigWord = BigEndianBitConverter.ToUInt16(vh_sector, 0x47C); // Read embedded HFS+ signature
|
2016-04-19 02:11:47 +01:00
|
|
|
|
|
|
|
|
|
|
if(drSigWord == HFSP_MAGIC) // "H+"
|
2014-04-14 02:29:13 +00:00
|
|
|
|
{
|
2017-07-20 13:14:12 +01:00
|
|
|
|
xdrStABNt = BigEndianBitConverter.ToUInt16(vh_sector, 0x47E); // Starting block number of embedded HFS+ volume
|
2016-04-19 02:11:47 +01:00
|
|
|
|
|
2017-07-20 13:14:12 +01:00
|
|
|
|
drAlBlkSiz = BigEndianBitConverter.ToUInt32(vh_sector, 0x414); // Block size
|
2016-04-19 02:11:47 +01:00
|
|
|
|
|
2017-07-20 13:14:12 +01:00
|
|
|
|
drAlBlSt = BigEndianBitConverter.ToUInt16(vh_sector, 0x41C); // Start of allocated blocks (in 512-byte/block)
|
2016-04-19 02:11:47 +01:00
|
|
|
|
|
2017-07-20 13:14:12 +01:00
|
|
|
|
hfsp_offset = (ulong)(((drAlBlSt * 512) + (xdrStABNt * drAlBlkSiz)) / imagePlugin.GetSectorSize());
|
2014-04-14 02:29:13 +00:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
hfsp_offset = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
hfsp_offset = 0;
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
|
2017-07-20 13:14:12 +01:00
|
|
|
|
vh_sector = imagePlugin.ReadSectors(partition.Start + hfsp_offset, sectorsToRead); // Read volume header
|
2016-04-19 02:11:47 +01:00
|
|
|
|
|
2017-07-20 13:14:12 +01:00
|
|
|
|
drSigWord = BigEndianBitConverter.ToUInt16(vh_sector, 0x400);
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(drSigWord == HFSP_MAGIC || drSigWord == HFSX_MAGIC)
|
2014-04-14 02:29:13 +00:00
|
|
|
|
return true;
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2017-07-19 16:31:08 +01:00
|
|
|
|
public override void GetInformation(ImagePlugins.ImagePlugin imagePlugin, Partition partition, out string information)
|
2014-04-14 02:29:13 +00:00
|
|
|
|
{
|
|
|
|
|
|
information = "";
|
2016-04-19 02:11:47 +01:00
|
|
|
|
|
2016-07-28 22:25:26 +01:00
|
|
|
|
ushort drSigWord;
|
|
|
|
|
|
ushort xdrStABNt;
|
|
|
|
|
|
ushort drAlBlSt;
|
|
|
|
|
|
uint drAlBlkSiz;
|
2014-04-14 02:29:13 +00:00
|
|
|
|
HFSPlusVolumeHeader HPVH = new HFSPlusVolumeHeader();
|
2016-04-19 02:11:47 +01:00
|
|
|
|
|
2014-04-14 01:14:20 +00:00
|
|
|
|
ulong hfsp_offset;
|
2014-04-14 02:29:13 +00:00
|
|
|
|
bool wrapped;
|
2014-04-14 01:14:20 +00:00
|
|
|
|
byte[] vh_sector;
|
2016-04-19 02:11:47 +01:00
|
|
|
|
|
2017-07-20 13:14:12 +01:00
|
|
|
|
uint sectorsToRead = 0x800 / imagePlugin.ImageInfo.sectorSize;
|
|
|
|
|
|
if(0x800 % imagePlugin.ImageInfo.sectorSize > 0)
|
|
|
|
|
|
sectorsToRead++;
|
|
|
|
|
|
|
|
|
|
|
|
vh_sector = imagePlugin.ReadSectors(partition.Start, sectorsToRead); // Read volume header, of HFS Wrapper MDB
|
2014-04-14 01:14:20 +00:00
|
|
|
|
|
2017-07-20 13:14:12 +01:00
|
|
|
|
drSigWord = BigEndianBitConverter.ToUInt16(vh_sector, 0x400); // Check for HFS Wrapper MDB
|
2016-04-19 02:11:47 +01:00
|
|
|
|
|
|
|
|
|
|
if(drSigWord == HFS_MAGIC) // "BD"
|
2014-04-14 02:29:13 +00:00
|
|
|
|
{
|
2017-07-20 13:14:12 +01:00
|
|
|
|
drSigWord = BigEndianBitConverter.ToUInt16(vh_sector, 0x47C); // Read embedded HFS+ signature
|
2016-04-19 02:11:47 +01:00
|
|
|
|
|
|
|
|
|
|
if(drSigWord == HFSP_MAGIC) // "H+"
|
2014-04-14 02:29:13 +00:00
|
|
|
|
{
|
2017-07-20 13:14:12 +01:00
|
|
|
|
xdrStABNt = BigEndianBitConverter.ToUInt16(vh_sector, 0x47E); // Starting block number of embedded HFS+ volume
|
2014-04-14 01:14:20 +00:00
|
|
|
|
|
2017-07-20 13:14:12 +01:00
|
|
|
|
drAlBlkSiz = BigEndianBitConverter.ToUInt32(vh_sector, 0x414); // Block size
|
2014-04-14 01:14:20 +00:00
|
|
|
|
|
2017-07-20 13:14:12 +01:00
|
|
|
|
drAlBlSt = BigEndianBitConverter.ToUInt16(vh_sector, 0x41C); // Start of allocated blocks (in 512-byte/block)
|
2014-04-14 01:14:20 +00:00
|
|
|
|
|
2017-07-20 13:14:12 +01:00
|
|
|
|
hfsp_offset = (ulong)(((drAlBlSt * 512) + (xdrStABNt * drAlBlkSiz)) / imagePlugin.GetSectorSize());
|
2014-04-14 02:29:13 +00:00
|
|
|
|
wrapped = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
hfsp_offset = 0;
|
|
|
|
|
|
wrapped = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
hfsp_offset = 0;
|
|
|
|
|
|
wrapped = false;
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
|
2017-07-20 13:14:12 +01:00
|
|
|
|
vh_sector = imagePlugin.ReadSectors(partition.Start + hfsp_offset, sectorsToRead); // Read volume header
|
2016-04-19 02:11:47 +01:00
|
|
|
|
|
2017-07-20 13:14:12 +01:00
|
|
|
|
HPVH.signature = BigEndianBitConverter.ToUInt16(vh_sector, 0x400);
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(HPVH.signature == HFSP_MAGIC || HPVH.signature == HFSX_MAGIC)
|
2014-04-14 02:29:13 +00:00
|
|
|
|
{
|
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2011-03-06 00:25:11 +00:00
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(HPVH.signature == 0x482B)
|
2014-04-14 02:29:13 +00:00
|
|
|
|
sb.AppendLine("HFS+ filesystem.");
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(HPVH.signature == 0x4858)
|
2014-04-14 02:29:13 +00:00
|
|
|
|
sb.AppendLine("HFSX filesystem.");
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(wrapped)
|
2014-04-14 02:29:13 +00:00
|
|
|
|
sb.AppendLine("Volume is wrapped inside an HFS volume.");
|
2016-04-19 02:11:47 +01:00
|
|
|
|
|
2017-07-20 13:14:12 +01:00
|
|
|
|
byte[] tmp = new byte[0x400];
|
|
|
|
|
|
Array.Copy(vh_sector, 0x400, tmp, 0, 0x400);
|
|
|
|
|
|
vh_sector = tmp;
|
|
|
|
|
|
|
2017-07-10 23:28:07 +01:00
|
|
|
|
HPVH = BigEndianMarshal.ByteArrayToStructureBigEndian<HFSPlusVolumeHeader>(vh_sector);
|
2016-04-19 02:11:47 +01:00
|
|
|
|
|
|
|
|
|
|
if(HPVH.version == 4 || HPVH.version == 5)
|
2014-04-14 02:29:13 +00:00
|
|
|
|
{
|
2016-04-19 02:11:47 +01:00
|
|
|
|
|
2014-04-14 02:29:13 +00:00
|
|
|
|
sb.AppendFormat("Filesystem version is {0}.", HPVH.version).AppendLine();
|
2011-03-06 00:25:11 +00:00
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if((HPVH.attributes & 0x80) == 0x80)
|
2014-04-14 02:29:13 +00:00
|
|
|
|
sb.AppendLine("Volume is locked on hardware.");
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if((HPVH.attributes & 0x100) == 0x100)
|
2014-04-14 02:29:13 +00:00
|
|
|
|
sb.AppendLine("Volume is unmounted.");
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if((HPVH.attributes & 0x200) == 0x200)
|
2014-04-14 02:29:13 +00:00
|
|
|
|
sb.AppendLine("There are bad blocks in the extents file.");
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if((HPVH.attributes & 0x400) == 0x400)
|
2014-04-14 02:29:13 +00:00
|
|
|
|
sb.AppendLine("Volume does not require cache.");
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if((HPVH.attributes & 0x800) == 0x800)
|
2014-04-14 02:29:13 +00:00
|
|
|
|
sb.AppendLine("Volume state is inconsistent.");
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if((HPVH.attributes & 0x1000) == 0x1000)
|
2014-04-14 02:29:13 +00:00
|
|
|
|
sb.AppendLine("CNIDs are reused.");
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if((HPVH.attributes & 0x2000) == 0x2000)
|
2014-04-14 02:29:13 +00:00
|
|
|
|
sb.AppendLine("Volume is journaled.");
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if((HPVH.attributes & 0x8000) == 0x8000)
|
2014-04-14 02:29:13 +00:00
|
|
|
|
sb.AppendLine("Volume is locked on software.");
|
2011-03-06 00:25:11 +00:00
|
|
|
|
|
2017-07-10 23:28:07 +01:00
|
|
|
|
sb.AppendFormat("Implementation that last mounted the volume: \"{0}\".", Encoding.ASCII.GetString(HPVH.lastMountedVersion)).AppendLine();
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if((HPVH.attributes & 0x2000) == 0x2000)
|
2014-04-14 02:29:13 +00:00
|
|
|
|
sb.AppendFormat("Journal starts at allocation block {0}.", HPVH.journalInfoBlock).AppendLine();
|
|
|
|
|
|
sb.AppendFormat("Creation date: {0}", DateHandlers.MacToDateTime(HPVH.createDate)).AppendLine();
|
|
|
|
|
|
sb.AppendFormat("Last modification date: {0}", DateHandlers.MacToDateTime(HPVH.modifyDate)).AppendLine();
|
2017-07-10 23:28:07 +01:00
|
|
|
|
if(HPVH.backupDate > 0)
|
|
|
|
|
|
sb.AppendFormat("Last backup date: {0}", DateHandlers.MacToDateTime(HPVH.backupDate)).AppendLine();
|
|
|
|
|
|
else
|
|
|
|
|
|
sb.AppendLine("Volume has never been backed up");
|
|
|
|
|
|
if(HPVH.backupDate > 0)
|
|
|
|
|
|
sb.AppendFormat("Last check date: {0}", DateHandlers.MacToDateTime(HPVH.checkedDate)).AppendLine();
|
|
|
|
|
|
else
|
|
|
|
|
|
sb.AppendLine("Volume has never been checked up");
|
2014-04-14 02:29:13 +00:00
|
|
|
|
sb.AppendFormat("{0} files on volume.", HPVH.fileCount).AppendLine();
|
|
|
|
|
|
sb.AppendFormat("{0} folders on volume.", HPVH.folderCount).AppendLine();
|
|
|
|
|
|
sb.AppendFormat("{0} bytes per allocation block.", HPVH.blockSize).AppendLine();
|
|
|
|
|
|
sb.AppendFormat("{0} allocation blocks.", HPVH.totalBlocks).AppendLine();
|
|
|
|
|
|
sb.AppendFormat("{0} free blocks.", HPVH.freeBlocks).AppendLine();
|
|
|
|
|
|
sb.AppendFormat("Next allocation block: {0}.", HPVH.nextAllocation).AppendLine();
|
|
|
|
|
|
sb.AppendFormat("Resource fork clump size: {0} bytes.", HPVH.rsrcClumpSize).AppendLine();
|
|
|
|
|
|
sb.AppendFormat("Data fork clump size: {0} bytes.", HPVH.dataClumpSize).AppendLine();
|
|
|
|
|
|
sb.AppendFormat("Next unused CNID: {0}.", HPVH.nextCatalogID).AppendLine();
|
|
|
|
|
|
sb.AppendFormat("Volume has been mounted writable {0} times.", HPVH.writeCount).AppendLine();
|
|
|
|
|
|
sb.AppendFormat("Allocation File is {0} bytes.", HPVH.allocationFile_logicalSize).AppendLine();
|
|
|
|
|
|
sb.AppendFormat("Extents File is {0} bytes.", HPVH.extentsFile_logicalSize).AppendLine();
|
|
|
|
|
|
sb.AppendFormat("Catalog File is {0} bytes.", HPVH.catalogFile_logicalSize).AppendLine();
|
|
|
|
|
|
sb.AppendFormat("Attributes File is {0} bytes.", HPVH.attributesFile_logicalSize).AppendLine();
|
|
|
|
|
|
sb.AppendFormat("Startup File is {0} bytes.", HPVH.startupFile_logicalSize).AppendLine();
|
|
|
|
|
|
sb.AppendLine("Finder info:");
|
|
|
|
|
|
sb.AppendFormat("CNID of bootable system's directory: {0}", HPVH.drFndrInfo0).AppendLine();
|
|
|
|
|
|
sb.AppendFormat("CNID of first-run application's directory: {0}", HPVH.drFndrInfo1).AppendLine();
|
|
|
|
|
|
sb.AppendFormat("CNID of previously opened directory: {0}", HPVH.drFndrInfo2).AppendLine();
|
|
|
|
|
|
sb.AppendFormat("CNID of bootable Mac OS 8 or 9 directory: {0}", HPVH.drFndrInfo3).AppendLine();
|
|
|
|
|
|
sb.AppendFormat("CNID of bootable Mac OS X directory: {0}", HPVH.drFndrInfo5).AppendLine();
|
2017-07-10 23:28:07 +01:00
|
|
|
|
if(HPVH.drFndrInfo6 != 0 && HPVH.drFndrInfo7 != 0)
|
|
|
|
|
|
sb.AppendFormat("Mac OS X Volume ID: {0:X8}{1:X8}", HPVH.drFndrInfo6, HPVH.drFndrInfo7).AppendLine();
|
2015-12-05 17:10:27 +00:00
|
|
|
|
|
|
|
|
|
|
xmlFSType = new Schemas.FileSystemType();
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(HPVH.backupDate > 0)
|
2015-12-06 05:09:31 +00:00
|
|
|
|
{
|
|
|
|
|
|
xmlFSType.BackupDate = DateHandlers.MacToDateTime(HPVH.backupDate);
|
|
|
|
|
|
xmlFSType.BackupDateSpecified = true;
|
|
|
|
|
|
}
|
2016-07-28 22:25:26 +01:00
|
|
|
|
xmlFSType.Bootable |= (HPVH.drFndrInfo0 != 0 || HPVH.drFndrInfo3 != 0 || HPVH.drFndrInfo5 != 0);
|
2015-12-05 17:10:27 +00:00
|
|
|
|
xmlFSType.Clusters = HPVH.totalBlocks;
|
|
|
|
|
|
xmlFSType.ClusterSize = (int)HPVH.blockSize;
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(HPVH.createDate > 0)
|
2015-12-06 05:09:31 +00:00
|
|
|
|
{
|
|
|
|
|
|
xmlFSType.CreationDate = DateHandlers.MacToDateTime(HPVH.createDate);
|
|
|
|
|
|
xmlFSType.CreationDateSpecified = true;
|
|
|
|
|
|
}
|
2015-12-05 17:10:27 +00:00
|
|
|
|
xmlFSType.Dirty = (HPVH.attributes & 0x100) != 0x100;
|
|
|
|
|
|
xmlFSType.Files = HPVH.fileCount;
|
2015-12-06 05:09:31 +00:00
|
|
|
|
xmlFSType.FilesSpecified = true;
|
2015-12-05 17:10:27 +00:00
|
|
|
|
xmlFSType.FreeClusters = HPVH.freeBlocks;
|
2015-12-06 05:09:31 +00:00
|
|
|
|
xmlFSType.FreeClustersSpecified = true;
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(HPVH.modifyDate > 0)
|
2015-12-06 05:09:31 +00:00
|
|
|
|
{
|
|
|
|
|
|
xmlFSType.ModificationDate = DateHandlers.MacToDateTime(HPVH.modifyDate);
|
|
|
|
|
|
xmlFSType.ModificationDateSpecified = true;
|
|
|
|
|
|
}
|
2015-12-05 17:10:27 +00:00
|
|
|
|
if(HPVH.signature == 0x482B)
|
|
|
|
|
|
xmlFSType.Type = "HFS+";
|
|
|
|
|
|
if(HPVH.signature == 0x4858)
|
|
|
|
|
|
xmlFSType.Type = "HFSX";
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(HPVH.drFndrInfo6 != 0 && HPVH.drFndrInfo7 != 0)
|
2017-07-10 23:28:07 +01:00
|
|
|
|
xmlFSType.VolumeSerial = string.Format("{0:X8}{1:X8}", HPVH.drFndrInfo6, HPVH.drFndrInfo7);
|
|
|
|
|
|
xmlFSType.SystemIdentifier = Encoding.ASCII.GetString(HPVH.lastMountedVersion);
|
2014-04-14 02:29:13 +00:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
sb.AppendFormat("Filesystem version is {0}.", HPVH.version).AppendLine();
|
|
|
|
|
|
sb.AppendLine("This version is not supported yet.");
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
|
2014-04-14 02:29:13 +00:00
|
|
|
|
information = sb.ToString();
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
2015-12-06 07:18:36 +00:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// HFS+ Volume Header, should be at offset 0x0400 bytes in volume with a size of 532 bytes
|
|
|
|
|
|
/// </summary>
|
2017-07-10 23:28:07 +01:00
|
|
|
|
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
2015-12-06 07:18:36 +00:00
|
|
|
|
struct HFSPlusVolumeHeader
|
2014-04-14 02:29:13 +00:00
|
|
|
|
{
|
2015-12-06 07:18:36 +00:00
|
|
|
|
/// <summary>0x000, "H+" for HFS+, "HX" for HFSX</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public ushort signature;
|
2015-12-06 07:18:36 +00:00
|
|
|
|
/// <summary>0x002, 4 for HFS+, 5 for HFSX</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public ushort version;
|
2015-12-06 07:18:36 +00:00
|
|
|
|
/// <summary>0x004, Volume attributes</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint attributes;
|
2015-12-06 07:18:36 +00:00
|
|
|
|
/// <summary>0x008, Implementation that last mounted the volume.
|
|
|
|
|
|
/// Reserved by Apple:
|
|
|
|
|
|
/// "8.10" Mac OS 8.1 to 9.2.2
|
|
|
|
|
|
/// "10.0" Mac OS X
|
|
|
|
|
|
/// "HFSJ" Journaled implementation
|
|
|
|
|
|
/// "fsck" /sbin/fsck</summary>
|
2017-07-10 23:28:07 +01:00
|
|
|
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
|
|
|
|
|
|
public byte[] lastMountedVersion;
|
2015-12-06 07:18:36 +00:00
|
|
|
|
/// <summary>0x00C, Allocation block number containing the journal</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint journalInfoBlock;
|
2015-12-06 07:18:36 +00:00
|
|
|
|
/// <summary>0x010, Date of volume creation</summary>
|
2017-07-10 23:28:07 +01:00
|
|
|
|
public uint createDate;
|
|
|
|
|
|
/// <summary>0x014, Date of last volume modification</summary>
|
|
|
|
|
|
public uint modifyDate;
|
|
|
|
|
|
/// <summary>0x018, Date of last backup</summary>
|
|
|
|
|
|
public uint backupDate;
|
|
|
|
|
|
/// <summary>0x01C, Date of last consistency check</summary>
|
|
|
|
|
|
public uint checkedDate;
|
|
|
|
|
|
/// <summary>0x020, File on the volume</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint fileCount;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x024, Folders on the volume</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint folderCount;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x028, Bytes per allocation block</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint blockSize;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x02C, Allocation blocks on the volume</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint totalBlocks;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x030, Free allocation blocks</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint freeBlocks;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x034, Hint for next allocation block</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint nextAllocation;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x038, Resource fork clump size</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint rsrcClumpSize;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x03C, Data fork clump size</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint dataClumpSize;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x040, Next unused CNID</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint nextCatalogID;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x044, Times that the volume has been mounted writable</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint writeCount;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x048, Used text encoding hints</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public ulong encodingsBitmap;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x050, finderInfo[0], CNID for bootable system's directory</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint drFndrInfo0;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x054, finderInfo[1], CNID of the directory containing the boot application</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint drFndrInfo1;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x058, finderInfo[2], CNID of the directory that should be opened on boot</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint drFndrInfo2;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x05C, finderInfo[3], CNID for Mac OS 8 or 9 directory</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint drFndrInfo3;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x060, finderInfo[4], Reserved</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint drFndrInfo4;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x064, finderInfo[5], CNID for Mac OS X directory</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint drFndrInfo5;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x068, finderInfo[6], first part of Mac OS X volume ID</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint drFndrInfo6;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x06C, finderInfo[7], second part of Mac OS X volume ID</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint drFndrInfo7;
|
2014-04-14 02:29:13 +00:00
|
|
|
|
// HFSPlusForkData allocationFile;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x070</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public ulong allocationFile_logicalSize;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x078</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint allocationFile_clumpSize;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x07C</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint allocationFile_totalBlocks;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x080</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint allocationFile_extents_startBlock0;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x084</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint allocationFile_extents_blockCount0;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x088</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint allocationFile_extents_startBlock1;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x08C</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint allocationFile_extents_blockCount1;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x090</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint allocationFile_extents_startBlock2;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x094</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint allocationFile_extents_blockCount2;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x098</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint allocationFile_extents_startBlock3;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x09C</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint allocationFile_extents_blockCount3;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x0A0</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint allocationFile_extents_startBlock4;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x0A4</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint allocationFile_extents_blockCount4;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x0A8</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint allocationFile_extents_startBlock5;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x0AC</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint allocationFile_extents_blockCount5;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x0B0</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint allocationFile_extents_startBlock6;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x0B4</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint allocationFile_extents_blockCount6;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x0B8</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint allocationFile_extents_startBlock7;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x0BC</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint allocationFile_extents_blockCount7;
|
2014-04-14 02:29:13 +00:00
|
|
|
|
// HFSPlusForkData extentsFile;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x0C0</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public ulong extentsFile_logicalSize;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x0C8</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint extentsFile_clumpSize;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x0CC</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint extentsFile_totalBlocks;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x0D0</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint extentsFile_extents_startBlock0;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x0D4</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint extentsFile_extents_blockCount0;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x0D8</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint extentsFile_extents_startBlock1;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x0DC</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint extentsFile_extents_blockCount1;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x0E0</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint extentsFile_extents_startBlock2;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x0E4</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint extentsFile_extents_blockCount2;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x0E8</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint extentsFile_extents_startBlock3;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x0EC</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint extentsFile_extents_blockCount3;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x0F0</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint extentsFile_extents_startBlock4;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x0F4</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint extentsFile_extents_blockCount4;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x0F8</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint extentsFile_extents_startBlock5;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x0FC</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint extentsFile_extents_blockCount5;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x100</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint extentsFile_extents_startBlock6;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x104</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint extentsFile_extents_blockCount6;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x108</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint extentsFile_extents_startBlock7;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x10C</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint extentsFile_extents_blockCount7;
|
2014-04-14 02:29:13 +00:00
|
|
|
|
// HFSPlusForkData catalogFile;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x110</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public ulong catalogFile_logicalSize;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x118</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint catalogFile_clumpSize;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x11C</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint catalogFile_totalBlocks;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x120</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint catalogFile_extents_startBlock0;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x124</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint catalogFile_extents_blockCount0;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x128</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint catalogFile_extents_startBlock1;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x12C</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint catalogFile_extents_blockCount1;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x130</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint catalogFile_extents_startBlock2;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x134</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint catalogFile_extents_blockCount2;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x138</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint catalogFile_extents_startBlock3;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x13C</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint catalogFile_extents_blockCount3;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x140</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint catalogFile_extents_startBlock4;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x144</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint catalogFile_extents_blockCount4;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x148</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint catalogFile_extents_startBlock5;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x14C</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint catalogFile_extents_blockCount5;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x150</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint catalogFile_extents_startBlock6;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x154</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint catalogFile_extents_blockCount6;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x158</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint catalogFile_extents_startBlock7;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x15C</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint catalogFile_extents_blockCount7;
|
2014-04-14 02:29:13 +00:00
|
|
|
|
// HFSPlusForkData attributesFile;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x160</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public ulong attributesFile_logicalSize;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x168</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint attributesFile_clumpSize;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x16C</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint attributesFile_totalBlocks;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x170</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint attributesFile_extents_startBlock0;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x174</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint attributesFile_extents_blockCount0;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x178</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint attributesFile_extents_startBlock1;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x17C</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint attributesFile_extents_blockCount1;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x180</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint attributesFile_extents_startBlock2;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x184</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint attributesFile_extents_blockCount2;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x188</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint attributesFile_extents_startBlock3;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x18C</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint attributesFile_extents_blockCount3;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x190</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint attributesFile_extents_startBlock4;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x194</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint attributesFile_extents_blockCount4;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x198</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint attributesFile_extents_startBlock5;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x19C</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint attributesFile_extents_blockCount5;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x1A0</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint attributesFile_extents_startBlock6;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x1A4</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint attributesFile_extents_blockCount6;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x1A8</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint attributesFile_extents_startBlock7;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x1AC</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint attributesFile_extents_blockCount7;
|
2014-04-14 02:29:13 +00:00
|
|
|
|
// HFSPlusForkData startupFile;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x1B0</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public ulong startupFile_logicalSize;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x1B8</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint startupFile_clumpSize;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x1BC</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint startupFile_totalBlocks;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x1C0</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint startupFile_extents_startBlock0;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x1C4</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint startupFile_extents_blockCount0;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x1C8</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint startupFile_extents_startBlock1;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x1D0</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint startupFile_extents_blockCount1;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x1D4</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint startupFile_extents_startBlock2;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x1D8</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint startupFile_extents_blockCount2;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x1DC</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint startupFile_extents_startBlock3;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x1E0</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint startupFile_extents_blockCount3;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x1E4</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint startupFile_extents_startBlock4;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x1E8</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint startupFile_extents_blockCount4;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x1EC</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint startupFile_extents_startBlock5;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x1F0</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint startupFile_extents_blockCount5;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x1F4</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint startupFile_extents_startBlock6;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x1F8</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint startupFile_extents_blockCount6;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x1FC</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint startupFile_extents_startBlock7;
|
2017-07-10 23:28:07 +01:00
|
|
|
|
/// <summary>0x200</summary>
|
2016-07-28 22:25:26 +01:00
|
|
|
|
public uint startupFile_extents_blockCount7;
|
2014-04-14 02:29:13 +00:00
|
|
|
|
}
|
2016-07-21 17:16:08 +01:00
|
|
|
|
|
|
|
|
|
|
public override Errno Mount()
|
|
|
|
|
|
{
|
|
|
|
|
|
return Errno.NotImplemented;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-07-22 00:43:22 +01:00
|
|
|
|
public override Errno Mount(bool debug)
|
|
|
|
|
|
{
|
|
|
|
|
|
return Errno.NotImplemented;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-07-21 17:16:08 +01:00
|
|
|
|
public override Errno Unmount()
|
|
|
|
|
|
{
|
|
|
|
|
|
return Errno.NotImplemented;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override Errno MapBlock(string path, long fileBlock, ref long deviceBlock)
|
|
|
|
|
|
{
|
|
|
|
|
|
return Errno.NotImplemented;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override Errno GetAttributes(string path, ref FileAttributes attributes)
|
|
|
|
|
|
{
|
|
|
|
|
|
return Errno.NotImplemented;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override Errno ListXAttr(string path, ref List<string> xattrs)
|
|
|
|
|
|
{
|
|
|
|
|
|
return Errno.NotImplemented;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override Errno GetXattr(string path, string xattr, ref byte[] buf)
|
|
|
|
|
|
{
|
|
|
|
|
|
return Errno.NotImplemented;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override Errno Read(string path, long offset, long size, ref byte[] buf)
|
|
|
|
|
|
{
|
|
|
|
|
|
return Errno.NotImplemented;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override Errno ReadDir(string path, ref List<string> contents)
|
|
|
|
|
|
{
|
|
|
|
|
|
return Errno.NotImplemented;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override Errno StatFs(ref FileSystemInfo stat)
|
|
|
|
|
|
{
|
|
|
|
|
|
return Errno.NotImplemented;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override Errno Stat(string path, ref FileEntryInfo stat)
|
|
|
|
|
|
{
|
|
|
|
|
|
return Errno.NotImplemented;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override Errno ReadLink(string path, ref string dest)
|
|
|
|
|
|
{
|
|
|
|
|
|
return Errno.NotImplemented;
|
|
|
|
|
|
}
|
2014-04-14 02:29:13 +00:00
|
|
|
|
}
|
2011-03-06 00:25:11 +00:00
|
|
|
|
}
|