# nickdu088/sharpext4 architecture

> Architecture diagram of the GitHub repository nickdu088/sharpext4, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-30). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/nickdu088/sharpext4
- Repository: https://github.com/nickdu088/sharpext4

## Overview

SharpExt4 is a .NET/Windows library for accessing ext2/3/4 filesystems on disk images and physical drives. The documented workflow opens a disk, selects a partition, mounts it as a filesystem, then performs file operations such as reading, writing, listing, and changing modes. The architecture combines a C++/CLI wrapper, raw-device access, partition parsing, and the lwext4 C filesystem. The README establishes the user workflow; many internal lwext4 calls are not shown in the excerpts, so uncertain implementation links are omitted or marked dashed.

Main entry points: [`lwext4/src/ext4.c`](https://github.com/nickdu088/sharpext4/blob/main/lwext4/src/ext4.c) (Filesystem operations), [`SharpExt4/ExtFileSystem.cpp`](https://github.com/nickdu088/sharpext4/blob/main/SharpExt4/ExtFileSystem.cpp) (Filesystem API), [`SharpExt4/ExtDisk.cpp`](https://github.com/nickdu088/sharpext4/blob/main/SharpExt4/ExtDisk.cpp) (Disk access), [`SharpExt4/io_raw.cpp`](https://github.com/nickdu088/sharpext4/blob/main/SharpExt4/io_raw.cpp) (Raw device I/O)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_entry["Disk and partitions"]
  node_disk["Disk access<br/>[ExtDisk.cpp]"]
  node_partition["Partition discovery"]
end

subgraph group_wrapper[".NET wrapper"]
  node_filesystem["Filesystem API<br/>[ExtFileSystem.cpp]"]
  node_stream["File stream<br/>[ExtFileStream.cpp]"]
  node_directory["Directory entries<br/>[ExtDirEntry.cpp]"]
end

subgraph group_native["Filesystem engine"]
  node_ext4api["Filesystem operations<br/>[ext4.c]"]
  node_fsmeta["Mount and metadata<br/>[ext4_fs.c]"]
  node_directories["Directory operations<br/>[ext4_dir.c]"]
  node_inodes["Inode allocation<br/>[ext4_inode.c]"]
  node_extents["Extent mapping<br/>[ext4_extent.c]"]
  node_journal["Journal recovery<br/>[ext4_journal.c]"]
  node_xattrs["Extended attributes<br/>[ext4_xattr.c]"]
  node_mkfs["Filesystem creation<br/>[ext4_mkfs.c]"]
end

subgraph group_storage["Block storage"]
  node_rawio["Raw device I/O<br/>[io_raw.cpp]"]
  node_blockdev["Block device layer<br/>[ext4_blockdev.c]"]
end

node_app((".NET application"))

node_app -->|"opens disk"| node_disk
node_disk -->|"exposes partitions"| node_partition
node_app -->|"opens partition"| node_filesystem
node_filesystem -->|"opens files"| node_stream
node_app -->|"lists and modifies"| node_filesystem
node_disk -->|"uses device I/O"| node_rawio
node_filesystem -->|"configures device"| node_rawio
node_filesystem -->|"calls filesystem API"| node_ext4api
node_rawio -.->|"implements device callbacks"| node_blockdev
node_ext4api -.->|"uses filesystem services"| node_fsmeta
node_ext4api -.->|"uses directory operations"| node_directories
node_ext4api -.->|"uses inode operations"| node_inodes
node_ext4api -.->|"uses extent mapping"| node_extents
node_ext4api -.->|"uses journal"| node_journal
node_ext4api -.->|"uses attributes"| node_xattrs
node_mkfs -.->|"writes filesystem"| node_blockdev

click node_disk "https://github.com/nickdu088/sharpext4/blob/main/SharpExt4/ExtDisk.cpp"
click node_partition "https://github.com/nickdu088/sharpext4/tree/main/DiskPartitionInfo"
click node_filesystem "https://github.com/nickdu088/sharpext4/blob/main/SharpExt4/ExtFileSystem.cpp"
click node_stream "https://github.com/nickdu088/sharpext4/blob/main/SharpExt4/ExtFileStream.cpp"
click node_directory "https://github.com/nickdu088/sharpext4/blob/main/SharpExt4/ExtDirEntry.cpp"
click node_rawio "https://github.com/nickdu088/sharpext4/blob/main/SharpExt4/io_raw.cpp"
click node_blockdev "https://github.com/nickdu088/sharpext4/blob/main/lwext4/src/ext4_blockdev.c"
click node_ext4api "https://github.com/nickdu088/sharpext4/blob/main/lwext4/src/ext4.c"
click node_fsmeta "https://github.com/nickdu088/sharpext4/blob/main/lwext4/src/ext4_fs.c"
click node_directories "https://github.com/nickdu088/sharpext4/blob/main/lwext4/src/ext4_dir.c"
click node_inodes "https://github.com/nickdu088/sharpext4/blob/main/lwext4/src/ext4_inode.c"
click node_extents "https://github.com/nickdu088/sharpext4/blob/main/lwext4/src/ext4_extent.c"
click node_journal "https://github.com/nickdu088/sharpext4/blob/main/lwext4/src/ext4_journal.c"
click node_xattrs "https://github.com/nickdu088/sharpext4/blob/main/lwext4/src/ext4_xattr.c"
click node_mkfs "https://github.com/nickdu088/sharpext4/blob/main/lwext4/src/ext4_mkfs.c"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_disk,node_partition toneBlue
class node_filesystem,node_stream,node_directory toneAmber
class node_ext4api,node_fsmeta,node_directories,node_inodes,node_extents,node_journal,node_xattrs,node_mkfs toneMint
class node_rawio,node_blockdev toneRose
class node_app toneIndigo
```

## Components

### Disk and partitions

- [Disk access](https://github.com/nickdu088/sharpext4/blob/main/SharpExt4/ExtDisk.cpp): `SharpExt4/ExtDisk.cpp`
- [Partition discovery](https://github.com/nickdu088/sharpext4/tree/main/DiskPartitionInfo): `DiskPartitionInfo`

### .NET wrapper

- [Filesystem API](https://github.com/nickdu088/sharpext4/blob/main/SharpExt4/ExtFileSystem.cpp): `SharpExt4/ExtFileSystem.cpp`
- [File stream](https://github.com/nickdu088/sharpext4/blob/main/SharpExt4/ExtFileStream.cpp): `SharpExt4/ExtFileStream.cpp`
- [Directory entries](https://github.com/nickdu088/sharpext4/blob/main/SharpExt4/ExtDirEntry.cpp): `SharpExt4/ExtDirEntry.cpp`

### Filesystem engine

- [Filesystem operations](https://github.com/nickdu088/sharpext4/blob/main/lwext4/src/ext4.c): `lwext4/src/ext4.c`
- [Mount and metadata](https://github.com/nickdu088/sharpext4/blob/main/lwext4/src/ext4_fs.c): `lwext4/src/ext4_fs.c`
- [Directory operations](https://github.com/nickdu088/sharpext4/blob/main/lwext4/src/ext4_dir.c): `lwext4/src/ext4_dir.c`
- [Inode allocation](https://github.com/nickdu088/sharpext4/blob/main/lwext4/src/ext4_inode.c): `lwext4/src/ext4_inode.c`
- [Extent mapping](https://github.com/nickdu088/sharpext4/blob/main/lwext4/src/ext4_extent.c): `lwext4/src/ext4_extent.c`
- [Journal recovery](https://github.com/nickdu088/sharpext4/blob/main/lwext4/src/ext4_journal.c): `lwext4/src/ext4_journal.c`
- [Extended attributes](https://github.com/nickdu088/sharpext4/blob/main/lwext4/src/ext4_xattr.c): `lwext4/src/ext4_xattr.c`
- [Filesystem creation](https://github.com/nickdu088/sharpext4/blob/main/lwext4/src/ext4_mkfs.c): `lwext4/src/ext4_mkfs.c`

### Block storage

- [Raw device I/O](https://github.com/nickdu088/sharpext4/blob/main/SharpExt4/io_raw.cpp): `SharpExt4/io_raw.cpp`
- [Block device layer](https://github.com/nickdu088/sharpext4/blob/main/lwext4/src/ext4_blockdev.c): `lwext4/src/ext4_blockdev.c`

### Other components

- **.NET application**

## Connections

- .NET application → Disk access: opens disk
- Disk access → Partition discovery: exposes partitions
- .NET application → Filesystem API: opens partition
- Filesystem API → File stream: opens files
- .NET application → Filesystem API: lists and modifies
- Disk access → Raw device I/O: uses device I/O (evidence: `SharpExt4/ExtDisk.cpp`)
- Filesystem API → Raw device I/O: configures device (evidence: `SharpExt4/ExtFileSystem.cpp`)
- Filesystem API → Filesystem operations: calls filesystem API (evidence: `SharpExt4/ExtFileSystem.cpp`)
- Raw device I/O → Block device layer: implements device callbacks
- Filesystem operations → Mount and metadata: uses filesystem services
- Filesystem operations → Directory operations: uses directory operations
- Filesystem operations → Inode allocation: uses inode operations
- Filesystem operations → Extent mapping: uses extent mapping
- Filesystem operations → Journal recovery: uses journal
- Filesystem operations → Extended attributes: uses attributes
- Filesystem creation → Block device layer: writes filesystem
