174 Commits
1.5.1 ... main

Author SHA1 Message Date
Matt Nadareski
729a2ca0a2 Update final notice 2025-09-29 07:29:37 -04:00
Matt Nadareski
d9b7ebedc3 Add deprecation notice 2025-09-26 12:00:12 -04:00
Matt Nadareski
19e9734a6f Migrate non-executable models to Serialization 2025-09-26 11:57:24 -04:00
Matt Nadareski
f101df48ae Migrate support file models to Serialization 2025-09-26 11:39:29 -04:00
Matt Nadareski
ceececd8a0 Remove now-unnecessary warning disable 2025-09-26 10:58:10 -04:00
Matt Nadareski
d86f539da4 Migrate archive models to Serialization 2025-09-26 10:54:17 -04:00
Matt Nadareski
54b0a0f4b1 Migrate ASN1 models to Serialization 2025-09-26 10:22:32 -04:00
Matt Nadareski
c6cba88ba6 Migrate metadata models to Serialization 2025-09-26 10:22:11 -04:00
Matt Nadareski
063d91db6d Add some more notes about SFX 2025-09-26 08:50:59 -04:00
Matt Nadareski
f7311b8f01 Add observed values 2025-09-26 08:45:18 -04:00
Matt Nadareski
697a2e0f05 Reduce redundant remarks 2025-09-26 08:43:04 -04:00
Matt Nadareski
35806a16d2 Relabel to an unknown because correlation is difficult 2025-09-26 08:41:09 -04:00
Matt Nadareski
550e8f5d8b Clarify unknown offset information 2025-09-26 08:13:51 -04:00
Matt Nadareski
c5a818d1a3 Missing? field 2025-09-26 08:03:46 -04:00
Matt Nadareski
12943ac578 Remove incorrect remark 2025-09-26 07:56:51 -04:00
Matt Nadareski
028fdf14f6 More Advanced Installer notes 2025-09-26 07:56:30 -04:00
Matt Nadareski
e535b23953 Correct some information 2025-09-25 22:51:54 -04:00
Matt Nadareski
b94f011c15 Better footer research 2025-09-25 22:50:30 -04:00
Matt Nadareski
a7fa074877 Add anotehr note about size 2025-09-25 22:36:45 -04:00
Matt Nadareski
219ce890c4 Reorganize remarks a bit 2025-09-25 22:28:01 -04:00
Matt Nadareski
76fcc49d6d Start documenting Advanced Installer 2025-09-25 22:23:50 -04:00
Matt Nadareski
d7ade2efc4 Add ASN.1 models 2025-09-24 09:31:40 -04:00
Matt Nadareski
f4f1870cee Fix this for later 2025-09-22 19:32:26 -04:00
Matt Nadareski
0130a9caee Bump version 2025-09-22 17:26:04 -04:00
Matt Nadareski
da204f129f Remove unnecessary NoWarn 2025-09-22 17:22:32 -04:00
Matt Nadareski
945a62d1f2 Add COFF constants 2025-09-22 15:57:16 -04:00
Matt Nadareski
8ab5088607 Simplify naming in comments 2025-09-22 12:58:02 -04:00
Matt Nadareski
9e9fcac654 Move delay load table because it was missed 2025-09-22 12:39:44 -04:00
Matt Nadareski
76dac1025c Move TODO more out of the way 2025-09-22 12:38:03 -04:00
Matt Nadareski
0ec1cac7cf Remove TODO that was done 2025-09-22 12:36:01 -04:00
Matt Nadareski
6a0b97fdcd Remove meta-tables 2025-09-22 12:34:26 -04:00
Matt Nadareski
66f7adc49a Slightly change description on optional header 2025-09-22 12:19:06 -04:00
Matt Nadareski
4bc685ba23 Move TLS 2025-09-22 12:17:29 -04:00
Matt Nadareski
89ef827251 Move resource 2025-09-22 12:16:47 -04:00
Matt Nadareski
beb42b7e35 Move load configuration 2025-09-22 12:13:08 -04:00
Matt Nadareski
0502808962 This goes in resource entries 2025-09-22 12:07:26 -04:00
Matt Nadareski
e3411d3984 This is also import-related 2025-09-22 12:06:46 -04:00
Matt Nadareski
9d13cb01e3 Move import table 2025-09-22 12:06:05 -04:00
Matt Nadareski
649ea98a52 Move export table 2025-09-22 12:04:06 -04:00
Matt Nadareski
b90d7c5e9a Move debug data table 2025-09-22 12:01:12 -04:00
Matt Nadareski
9def156302 Move delay load directory table 2025-09-22 11:56:11 -04:00
Matt Nadareski
e1db4fc17b Move attribute certificate table 2025-09-22 11:52:28 -04:00
Matt Nadareski
ae4ad5c272 Optional header is partially COFF 2025-09-22 11:38:24 -04:00
Matt Nadareski
5bda523aec Sections are COFF, who knew? 2025-09-22 11:29:39 -04:00
Matt Nadareski
eda099d44e Separate out COFF stuff maybe for later? 2025-09-22 11:26:08 -04:00
Matt Nadareski
b5ac9304a4 Move base relocation to new namespace 2025-09-22 11:14:27 -04:00
Matt Nadareski
b40f84dd4b Move more things to resource entries namespace 2025-09-22 11:09:58 -04:00
Matt Nadareski
4a276fb65e Move MoPaQ encryption constants to IO 2025-09-22 10:37:40 -04:00
Matt Nadareski
973a94b340 Move LZX models to IO 2025-09-22 10:33:33 -04:00
Matt Nadareski
c6062f71eb Move Quantum compression models to IO 2025-09-22 10:29:29 -04:00
Matt Nadareski
fd7746fae3 Move MSZIP "model" to IO 2025-09-22 10:22:38 -04:00
Matt Nadareski
d3c6bdf23f Update Newtonsoft 2025-09-22 09:46:23 -04:00
Matt Nadareski
605a3bf30d Add a bunch of useful constants 2025-09-22 09:35:00 -04:00
Matt Nadareski
710ddc912d Add and update models needed for BOS 2025-09-22 09:06:33 -04:00
HeroponRikiBestest
2f94464b7d Small matroschka model update (#14)
* Small model updates, mainly documentation. Not essential.

* wrong branch lol
2025-09-19 12:09:16 -04:00
Matt Nadareski
b3d9bd3d6b Add some more hashes for fun 2025-09-19 08:29:49 -04:00
Matt Nadareski
c51c16ed2d Add RA extensions to Logiqx (fixes #13) 2025-09-17 09:29:29 -04:00
HeroponRikiBestest
978b6904db Add fileData variable to MatroshkaEntry.cs model (#12)
* Add fileData variable to MatroshkaEntry.cs model

This will be necessary to handle parsing properly in serialization.

* Use PascalCase
2025-09-16 15:30:47 -04:00
Matt Nadareski
d62bd2f60c Cleanup from last PR 2025-09-12 12:54:22 -04:00
Deterous
26f7f4d7da AACS2 support (#11)
* AACS2 support

* Better names

* libaacs links
2025-09-12 12:50:32 -04:00
Matt Nadareski
50a6f9ba89 There 2025-09-10 21:52:09 -04:00
Matt Nadareski
f07c11fb47 Simplify TLS directory 2025-09-09 13:54:19 -04:00
Matt Nadareski
dc47f64ee6 Sync a few notes from Serialization 2025-09-09 13:52:48 -04:00
Matt Nadareski
69006247a9 One more potential constant 2025-09-09 12:32:11 -04:00
Matt Nadareski
9c43b80502 Rename to be more accurate 2025-09-09 12:29:26 -04:00
Matt Nadareski
cbb7563724 Add missing symbol types, make a flag 2025-09-09 11:07:51 -04:00
Matt Nadareski
c7530884b3 Add constant notes 2025-09-09 09:42:55 -04:00
Matt Nadareski
e59c9205d4 Make OptionalHeader a bit more correct 2025-09-09 09:30:43 -04:00
Matt Nadareski
f5859638c2 Move these 2025-09-08 21:09:54 -04:00
Matt Nadareski
84d3740e73 Yeah 2025-09-08 21:07:25 -04:00
Matt Nadareski
517324ab58 Bump version 2025-09-05 09:10:29 -04:00
Matt Nadareski
a02c037995 Remind myself of this 2025-09-02 19:20:59 -04:00
Matt Nadareski
a1890e1fe6 I messed this up too 2025-09-01 16:17:02 -04:00
Matt Nadareski
32c6633788 Fix this naming for later 2025-09-01 15:52:50 -04:00
Matt Nadareski
81b53c9785 Bump version 2025-09-01 15:05:53 -04:00
Matt Nadareski
54c05f2746 Sync changes from downstream 2025-09-01 15:05:15 -04:00
Matt Nadareski
4a4d7ceddf Make this more clear 2025-08-28 23:37:18 -04:00
Matt Nadareski
0f029c5979 Fix one 2025-08-28 21:29:23 -04:00
Matt Nadareski
bb4fee91d9 Sort some things around PE 2025-08-28 21:18:39 -04:00
Matt Nadareski
ed56e2543d Convert this to an array 2025-08-28 12:12:04 -04:00
Matt Nadareski
d675673e50 More descriptive names 2025-08-28 09:47:01 -04:00
Matt Nadareski
ebee967c7f Clean up gzip and tar a bit 2025-08-28 09:27:08 -04:00
Matt Nadareski
f5da54eaac Fix some tar model issues 2025-08-28 08:56:11 -04:00
Matt Nadareski
2350c1af27 Add placeholder models 2025-08-28 07:46:23 -04:00
Matt Nadareski
454d507b41 Source my sources 2025-08-28 07:40:09 -04:00
Matt Nadareski
10de4acbb9 File ending thing for PKZIP 2025-08-28 07:38:11 -04:00
Matt Nadareski
8ec91d8d04 Add a couple missing extra field structures 2025-08-27 22:28:06 -04:00
Matt Nadareski
1d62d69a53 Interleaved types don't need to be here 2025-08-27 22:09:28 -04:00
Matt Nadareski
5b5fed8932 Rename a few things 2025-08-27 21:09:30 -04:00
Matt Nadareski
32123d4b80 Fix one more PKZIP extra field 2025-08-27 20:40:32 -04:00
Matt Nadareski
f5717c3929 Forgot to sync change here 2025-08-27 19:19:36 -04:00
Matt Nadareski
e8db261d73 Start making some fixes to PKZIP 2025-08-27 19:14:31 -04:00
Matt Nadareski
9557f43dab Add placeholder extras field 2025-08-27 18:43:26 -04:00
Matt Nadareski
51b9c1a016 Make PKZIP models a bit easier to follow 2025-08-27 12:51:57 -04:00
Matt Nadareski
bb3cd54865 Remove now-useless note 2025-08-15 10:13:31 -04:00
Matt Nadareski
0c6060a901 Clickable sources, archive links for dead pages 2025-08-15 10:09:43 -04:00
Matt Nadareski
c18770f627 Upstream changes from WiseUnpacker 2025-08-15 08:59:29 -04:00
Matt Nadareski
c2a5d6770c Upstream changes from WiseUnpacker 2025-08-13 12:22:11 -04:00
Matt Nadareski
4ef79ccdca Upstream changes from WiseUnpacker 2025-08-10 21:44:23 -04:00
Matt Nadareski
cf5135f330 Slight NE cleanup 2025-08-10 20:36:53 -04:00
Matt Nadareski
6d989209db Update NE notes and structure a bit more 2025-08-10 20:15:49 -04:00
Matt Nadareski
cc48593646 Upstream changes from WiseUnpacker 2025-08-09 10:26:37 -04:00
Matt Nadareski
415d571b65 Upstream changes from WiseUnpacker 2025-08-06 09:33:51 -04:00
Matt Nadareski
4a6e244b38 Upstream changes from WiseUnpacker 2025-08-04 12:16:34 -04:00
Matt Nadareski
771a39517f Upstream changes from WiseUnpacker 2025-08-01 16:06:32 -04:00
Matt Nadareski
b072a3809c Fix enum 2025-08-01 10:32:17 -04:00
Matt Nadareski
341585206a Add Wise Installer models from REWise
All credit to CYBERDEV for their work in documenting these structures in the first place
2025-07-31 22:35:04 -04:00
Matt Nadareski
2dc2ab5dd1 Add OLE models 2025-07-30 22:46:37 -04:00
Matt Nadareski
144a3ce52b Fix CFB comments 2025-07-29 22:45:15 -04:00
Matt Nadareski
85199789f7 Add new Matroshka package comment 2025-07-28 07:54:29 -04:00
Matt Nadareski
fb39216c82 Bump verison 2025-07-24 09:11:34 -04:00
Matt Nadareski
1a2de39868 Fix Dir serialization issue 2025-07-24 09:11:10 -04:00
Matt Nadareski
f18b6c8850 Bump version 2025-07-23 09:48:18 -04:00
Matt Nadareski
8f1e49e464 Add .NET Standard 2.0 and 2.1 2025-07-23 09:43:12 -04:00
Matt Nadareski
6547242f93 Clean up more Matroskha comments 2025-07-21 11:27:20 -04:00
Matt Nadareski
edf00f3ab2 Add analysis block comment 2025-07-21 11:25:18 -04:00
Matt Nadareski
bce4736037 Clean up more Matroskha comments 2025-07-21 11:23:25 -04:00
Matt Nadareski
81f28974c0 More remark corrections based on more samples 2025-07-21 11:10:35 -04:00
Matt Nadareski
30ebe84af4 Remove disproven theory 2025-07-21 11:08:01 -04:00
Matt Nadareski
b07fbdedd6 Add secondary length note 2025-07-21 09:39:31 -04:00
Matt Nadareski
cd8fff4a86 Slight tweaks to Matroska entry notes 2025-07-21 09:21:56 -04:00
Matt Nadareski
3d3275e3cb Add SecuROM Matroshka models
All research thanks to HeroponRikiBestest
2025-07-21 09:11:37 -04:00
Matt Nadareski
4c76ce1230 Add SecuROM DFA models
All research thanks to HeroponRikiBestest
2025-07-21 08:10:25 -04:00
Matt Nadareski
0c4e3b4bf2 Dirs can be nested 2025-06-24 12:32:14 -04:00
Matt Nadareski
e8f4386199 Add mess alternative ListXML model 2025-05-28 09:53:05 -04:00
Matt Nadareski
ab66ccf3c5 Update copyright 2024-12-30 21:19:05 -05:00
Matt Nadareski
cc60d54a33 Remove unnecessary action step 2024-12-30 21:18:59 -05:00
Matt Nadareski
e805f4cb9a Ensure .NET versions are installed for testing 2024-12-19 10:50:01 -05:00
Matt Nadareski
328c893a38 Ensure .NET versions are installed for testing 2024-12-19 10:45:08 -05:00
Matt Nadareski
ab2a12c996 Bump version 2024-12-16 12:10:13 -05:00
Matt Nadareski
362b123661 Allow symbols to be packed 2024-12-16 11:37:18 -05:00
Matt Nadareski
4a8a4746a2 Add big-endian note for PS4 PKG 2024-12-16 11:31:38 -05:00
Deterous
3f368a3be8 Create model for PS4 app.pkg header (#7)
* Create model for PS4 app.pkg header

* Rename PS4 app.pkg class

* Fix typo

* Requested changes

* Add newline
2024-12-15 20:12:06 -05:00
Matt Nadareski
2749c2f5bd Bump version 2024-12-11 11:25:41 -05:00
Matt Nadareski
41ce962700 Reorder LZ constants 2024-12-11 11:10:01 -05:00
Matt Nadareski
85b7103bd3 Re-rename Expand to SZDD for consistency 2024-12-11 11:09:28 -05:00
Matt Nadareski
4c61a191e8 Remove MS-ZIP Block type 2024-12-11 11:00:44 -05:00
Matt Nadareski
0f70598969 Add LZ prefixes for easier checking 2024-12-11 10:58:47 -05:00
Matt Nadareski
d6b057d808 Move LZ models out of Compression namespace 2024-12-11 10:54:10 -05:00
Matt Nadareski
3d8036e7b5 Remove things that Compression doesn't need anymore 2024-12-11 10:46:28 -05:00
Matt Nadareski
bb35946866 Ensure KWAJ header flags serialized 2024-12-11 04:19:02 -05:00
Matt Nadareski
78f9f1b36f Fix KWAJ serialization 2024-12-11 04:16:23 -05:00
Matt Nadareski
9d1b1ca36d Further simplify LZ models 2024-12-11 03:48:10 -05:00
Matt Nadareski
6e1f8bf55e Fix issues with MS-LZ models 2024-12-11 01:50:02 -05:00
Matt Nadareski
a19afc240c Bump version 2024-12-10 15:28:49 -05:00
Matt Nadareski
148e97ef64 Add now-supported DOSCenter SHA-1 attribute 2024-12-07 23:28:52 -05:00
Matt Nadareski
676b446025 Add badge for build status 2024-12-06 10:48:43 -05:00
Matt Nadareski
aeff75d8d3 Rename workflow file, add releases to README 2024-12-06 10:47:42 -05:00
Matt Nadareski
e20e515f56 Attempt to use publish script 2024-12-06 10:43:08 -05:00
Matt Nadareski
bf02266f0f Bump version 2024-11-29 19:51:47 -05:00
Matt Nadareski
b521e503c2 Rearrange SGA 2024-11-28 20:26:58 -05:00
Matt Nadareski
48e79d26ed Ensure nullable arrays are correct 2024-11-27 23:37:25 -05:00
Matt Nadareski
989ef41c6d Get/Set may be fully disallowed? 2024-11-27 21:31:33 -05:00
Matt Nadareski
6b0c4c3024 Bump version 2024-11-27 21:15:05 -05:00
Matt Nadareski
4b54d0f4dc Fix build 2024-11-27 21:09:01 -05:00
Matt Nadareski
2bc1cfc5d0 Cleanup from issues in Serialization 2024-11-27 21:03:50 -05:00
Matt Nadareski
362abfdc64 Remove layout from CopyrightRecord 2024-11-27 10:38:58 -05:00
Matt Nadareski
a06ff8f8b3 Bump version 2024-11-20 14:03:14 -05:00
Matt Nadareski
7269e91913 Partially add VBSP lump 40 2024-11-19 14:34:32 -05:00
Matt Nadareski
c118271565 Add VBSP lump 29 2024-11-19 14:30:54 -05:00
Matt Nadareski
71ccbc6ab1 Fix issues found during Serialization update 2024-11-19 12:47:09 -05:00
Matt Nadareski
ed5c1a7173 Use array-of-array instead of multidimensional array 2024-11-18 23:35:47 -05:00
Matt Nadareski
0451af3eb4 Bump version 2024-11-18 20:37:56 -05:00
Matt Nadareski
7967eb29eb Move Deflate constants to new file 2024-11-18 12:09:48 -05:00
Matt Nadareski
6bbe904cc3 Move Deflate-specific models to separate namespace 2024-11-18 10:04:45 -05:00
Matt Nadareski
dce9d98885 Add GZIP models 2024-11-18 02:45:07 -05:00
Matt Nadareski
f862e018fb Update VPK models 2024-11-18 02:13:52 -05:00
Matt Nadareski
b4a5154da8 Update VBSP models 2024-11-18 01:59:46 -05:00
Matt Nadareski
077aa3c57e Update BSP models 2024-11-17 21:20:50 -05:00
Matt Nadareski
ea8630ba8c Update WAD3 models 2024-11-17 19:56:59 -05:00
Matt Nadareski
385491c67b Framework only matters for executable 2024-11-15 20:16:03 -05:00
Matt Nadareski
f57461e0c3 Make obsolete types NoWarn instead of ignore 2024-11-15 20:10:16 -05:00
Matt Nadareski
18f49ac43f It was correct 2024-11-14 11:19:21 -05:00
Matt Nadareski
28fd81adab Minor tweaks 2024-11-13 23:12:37 -05:00
756 changed files with 7067 additions and 28558 deletions

View File

@@ -1,4 +1,4 @@
name: Nuget Pack
name: Build and Test
on:
push:
@@ -16,25 +16,22 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: 9.0.x
dotnet-version: |
6.0.x
8.0.x
9.0.x
- name: Restore dependencies
run: dotnet restore
- name: Pack
run: dotnet pack
- name: Run tests
run: dotnet test
- name: Upload build
uses: actions/upload-artifact@v4
with:
name: 'Nuget Package'
path: 'SabreTools.Models/bin/Release/*.nupkg'
- name: Run publish script
run: ./publish-nix.sh
- name: Upload to rolling
uses: ncipollo/release-action@v1.14.0
with:
allowUpdates: True
artifacts: 'SabreTools.Models/bin/Release/*.nupkg'
artifacts: "*.nupkg,*.snupkg"
body: 'Last built commit: ${{ github.sha }}'
name: 'Rolling Release'
prerelease: True

View File

@@ -11,7 +11,13 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: 9.0.x
dotnet-version: |
6.0.x
8.0.x
9.0.x
- name: Build
run: dotnet build
run: dotnet build
- name: Run tests
run: dotnet test

7
LICENSE Normal file
View File

@@ -0,0 +1,7 @@
Copyright (c) 2018-2025 Matt Nadareski
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@@ -1,13 +1,66 @@
# SabreTools.Models
[![Build and Test](https://github.com/SabreTools/SabreTools.Models/actions/workflows/build_and_test.yml/badge.svg?branch=main)](https://github.com/SabreTools/SabreTools.Models/actions/workflows/build_and_test.yml)
**NOTICE**: This library has been deprecated. All functionality formerly in this library is in [SabreTools.Serialization](https://github.com/SabreTools/SabreTools.Serialization) as of version 2.0.0.
This library comprises of models that represent either directly serializable or representative structures for all SabreTools projects. All of the main models representing metadata files should have parsers created outside of the current code.
Find the link to the Nuget package [here](https://www.nuget.org/packages/SabreTools.Models).
## Missing Metadata Models
## Releases
The following metadata file formats do not have models included in this library yet and, as such, do not have serializers:
For the most recent stable build, download the latest release here: [Releases Page](https://github.com/SabreTools/SabreTools.Models/releases)
- Missfile
- SabreJSON
- SabreDAT XML
For the latest WIP build here: [Rolling Release](https://github.com/SabreTools/SabreTools.Models/releases/rolling)
## Notable Information Sources
Not all of this information was able to be gathered directly from the files in question, so here is a non-exhaustive list of sites and projects that allow this project to exist. Most of the models also have direct links to specific pages or code snippets, where available.
| Site/Project | Models Directory |
| --- | --- |
| [3DBrew](https://www.3dbrew.org/wiki/Main_Page) | N3DS |
| [Aaru Data Preservation Suite](https://github.com/aaru-dps) | PIC |
| [Advanced Access Content System Licensing Administrator (AACS LA)](https://aacsla.com/) | AACS |
| [BYTE*](https://web.archive.org/web/20240703222951/https://bytepointer.com/index.htm) | NewExecutable |
| [cabextract/libmspack](https://www.cabextract.org.uk/) | LZ |
| [DBox](https://dbox.tools/) | Xbox |
| [DebugInfo.com](https://www.debuginfo.com/index.html) | PortableExecutable |
| [Devilsclaw](https://devilsclaws.net/) | PFF |
| [DSiBrew](https://dsibrew.org/wiki/Main_Page) | Nitro |
| [DVD Resources for Open Source Development](https://dvd.sourceforge.net/) | DVD |
| [EDM/2](https://www.edm2.com/index.php/Main_Page) | LinearExecutable |
| [faydoc.tripod.com](https://faydoc.tripod.com/formats/) | LinearExecutable |
| [GuitarGame_ChartFormats](https://github.com/TheNathannator/GuitarGame_ChartFormats/) | Charts |
| [HandWiki](https://handwiki.org/wiki/Start) | Quantum |
| [HLLib](https://github.com/RavuAlHemio/hllib/) | BSP, GCF, NCF, PAK, SGA, VPK, WAD3, XZP |
| [IBM Documentation](https://www.ibm.com/docs/en) | TAR |
| [IETF](https://www.ietf.org/) | GZIP |
| [Independent Commodore Library](https://petlibrary.tripod.com/) | PKZIP |
| [Ladislav Zezula](http://zezula.net/en/tools/main.html) | MoPaQ |
| [libaacs](https://code.videolan.org/videolan/libaacs/) | AACS |
| [libbdplus](https://github.com/mwgoldsmith/bdplus) | BD+ |
| [libexe](https://github.com/libyal/libexe/) | NewExecutable |
| [MAME](https://github.com/mamedev/mame/) | CHD |
| [Matthew Russotto](http://www.russotto.net/quantumcomp.html) | Compression/Quantum |
| [Microsoft Learn](https://learn.microsoft.com/en-us/) | BMP, CFB, Compression/LZX, Compression/MSZIP, MicrosoftCabinet, OLE, PortableExecutable, SecuROM, WiseInstaller |
| [msitools](https://github.com/GNOME/msitools/) | CFB |
| [OSDev.org](https://wiki.osdev.org/Expanded_Main_Page) | MSDOS, NewExecutable |
| [PInvoke.net](http://www.pinvoke.net/index.aspx) | MSDOS |
| [PKWARE(?)](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT) | PKZIP |
| [PS3 Developer Wiki](https://www.psdevwiki.com/ps3/) | IRD, PlayStation3 |
| [RanseiLink](https://github.com/Deijin27/RanseiLink) | Nitro |
| [Reverse Engineering Wise](https://codeberg.org/CYBERDEV/REWise) | WiseInstaller |
| [SharpCompress](https://github.com/adamhathcock/sharpcompress) | PKZIP |
| [Source SDK 2013](https://github.com/ValveSoftware/source-sdk-2013) | BSP |
| [Technical Committee T10](https://www.t10.org/) | PIC |
| [The Go tools for Windows + Assembler](https://www.godevtool.com/) | PortableExecutable |
| [The Whole Half-Life](https://twhl.info/wiki/page/Specification:_WAD3) | WAD3 |
| [Unshield](https://github.com/twogood/unshield) | InstallShieldCabinet |
| [unshieldv3](https://github.com/wfr/unshieldv3) | InstallShieldArchiveV3 |
| [Valve Developer Community](https://developer.valvesoftware.com/wiki/Main_Page) | BSP, VPK |
| [w4kfu's bl0g](https://web.archive.org/web/20250206143756/http://blog.w4kfu.com/) | SafeDisc |
| [Wine](https://github.com/wine-mirror/wine/) | LZ |
| [XboxDevWiki.net](https://xboxdevwiki.net/Main_Page) | Xbox |
| [XeNTaX Game Research Forum](http://web.archive.org/web/20231031162306/https://forum.xentax.com/) | SFFS |

View File

@@ -1,17 +0,0 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.AACS
{
/// <summary>
/// This record type is undocumented but found in real media key blocks
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public sealed class CopyrightRecord : Record
{
/// <summary>
/// Null-terminated ASCII string representing the copyright
/// </summary>
[MarshalAs(UnmanagedType.LPStr)]
public string? Copyright;
}
}

View File

@@ -1,25 +0,0 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.AACS
{
/// <see href="https://aacsla.com/wp-content/uploads/2019/02/AACS_Spec_Common_Final_0953.pdf"/>
[StructLayout(LayoutKind.Sequential)]
public sealed class DriveRevocationListEntry
{
/// <summary>
/// A 2-byte Range value indicates the range of revoked IDs starting
/// from the ID contained in the record. A value of zero in the Range
/// field indicates that only one ID is being revoked, a value of one
/// in the Range field indicates two IDs are being revoked, and so on.
/// </summary>
public ushort Range;
/// <summary>
/// A 6-byte Drive ID value identifying the Licensed Drive being revoked
/// (or the first in a range of Licensed Drives being revoked, in the
/// case of a non-zero Range value).
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public byte[]? DriveID;
}
}

View File

@@ -1,26 +0,0 @@
namespace SabreTools.Models.AACS
{
/// <summary>
/// A properly formatted type 3 or type 4 Media Key Block contains exactly
/// one Drive Revocation List Record. It follows the Host Revocation List
/// Record, although it may not immediately follow it.
///
/// The Drive Revocation List Record is identical to the Host Revocation
/// List Record, except it has type 2016, and it contains Drive Revocation
/// List Entries, not Host Revocation List Entries. The Drive Revocation List
/// Entries refer to Drive IDs in the Drive Certificates.
/// </summary>
/// <see href="https://aacsla.com/wp-content/uploads/2019/02/AACS_Spec_Common_Final_0953.pdf"/>
public sealed class DriveRevocationListRecord : Record
{
/// <summary>
/// The total number of Drive Revocation List Entry fields that follow.
/// </summary>
public uint TotalNumberOfEntries { get; set; }
/// <summary>
/// Revocation list entries
/// </summary>
public DriveRevocationSignatureBlock?[]? SignatureBlocks { get; set; }
}
}

View File

@@ -1,17 +0,0 @@
namespace SabreTools.Models.AACS
{
/// <see href="https://aacsla.com/wp-content/uploads/2019/02/AACS_Spec_Common_Final_0953.pdf"/>
public sealed class DriveRevocationSignatureBlock
{
/// <summary>
/// The number of Drive Revocation List Entry fields in the signature block.
/// </summary>
public uint NumberOfEntries { get; set; }
/// <summary>
/// A list of 8-byte Host Drive List Entry fields, the length of this
/// list being equal to the number in the signature block.
/// </summary>
public DriveRevocationListEntry?[]? EntryFields { get; set; }
}
}

View File

@@ -1,23 +0,0 @@
namespace SabreTools.Models.AACS
{
/// <summary>
/// A properly formatted MKB shall contain an End of Media Key Block Record.
/// When a device encounters this Record it stops processing the MKB, using
/// whatever Km value it has calculated up to that point as the final Km for
/// that MKB (pending possible checks for correctness of the key, as
/// described previously).
/// </summary>
/// <see href="https://aacsla.com/wp-content/uploads/2019/02/AACS_Spec_Common_Final_0953.pdf"/>
public sealed class EndOfMediaKeyBlockRecord : Record
{
/// <summary>
/// AACS LAs signature on the data in the Media Key Block up to,
/// but not including, this record. Devices depending on the Version
/// Number in the Type and Version Record must verify the signature.
/// Other devices may ignore the signature data. If any device
/// determines that the signature does not verify or is omitted, it
/// must refuse to use the Media Key.
/// </summary>
public byte[]? SignatureData { get; set; }
}
}

View File

@@ -1,46 +0,0 @@
namespace SabreTools.Models.AACS
{
public enum MediaKeyBlockType : uint
{
/// <summary>
/// (Type 3). This is a normal Media Key Block suitable for being recorded
/// on a AACS Recordable Media. Both Class I and Class II Licensed Products
/// use it to directly calculate the Media Key.
/// </summary>
Type3 = 0x00031003,
/// <summary>
/// (Type 4). This is a Media Key Block that has been designed to use Key
/// Conversion Data (KCD). Thus, it is suitable only for pre-recorded media
/// from which the KCD is derived. Both Class I and Class II Licensed Products
/// use it to directly calculate the Media Key.
/// </summary>
Type4 = 0x00041003,
/// <summary>
/// (Type 10). This is a Class II Media Key Block (one that has the functionality
/// of a Sequence Key Block). This can only be processed by Class II Licensed
/// Products; Class I Licensed Products are revoked in Type 10 Media Key Blocks
/// and cannot process them. This type does not contain the Host Revocation List
/// Record, the Drive Revocation List Record, and the Media Key Data Record, as
/// described in the following sections. It does contain the records shown in
/// Section 3.2.5.2, which are only processed by Class II Licensed Products.
/// </summary>
Type10 = 0x000A1003,
}
public enum RecordType : byte
{
EndOfMediaKeyBlock = 0x02,
ExplicitSubsetDifference = 0x04,
MediaKeyData = 0x05,
SubsetDifferenceIndex = 0x07,
TypeAndVersion = 0x10,
DriveRevocationList = 0x20,
HostRevocationList = 0x21,
VerifyMediaKey = 0x81,
// Not documented
Copyright = 0x7F,
}
}

View File

@@ -1,11 +0,0 @@
namespace SabreTools.Models.AACS
{
/// <see href="https://aacsla.com/wp-content/uploads/2019/02/AACS_Spec_Common_Final_0953.pdf"/>
public sealed class ExplicitSubsetDifferenceRecord : Record
{
/// <summary>
/// In this record, each subset-difference is encoded with 5 bytes.
/// </summary>
public SubsetDifference?[]? SubsetDifferences { get; set; }
}
}

View File

@@ -1,25 +0,0 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.AACS
{
/// <see href="https://aacsla.com/wp-content/uploads/2019/02/AACS_Spec_Common_Final_0953.pdf"/>
[StructLayout(LayoutKind.Sequential)]
public sealed class HostRevocationListEntry
{
/// <summary>
/// A 2-byte Range value indicates the range of revoked IDs starting
/// from the ID contained in the record. A value of zero in the Range
/// field indicates that only one ID is being revoked, a value of one
/// in the Range field indicates two IDs are being revoked, and so on.
/// </summary>
public ushort Range;
/// <summary>
/// A 6-byte Host ID value identifying the host being revoked (or the
/// first in a range of hosts being revoked, in the case of a non-zero
/// Range value).
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public byte[]? HostID;
}
}

View File

@@ -1,29 +0,0 @@
namespace SabreTools.Models.AACS
{
/// <summary>
/// A properly formatted type 3 or type 4 Media Key Block shall have exactly
/// one Host Revocation List Record as its second record. This record provides
/// a list of hosts that have been revoked by the AACS LA. The AACS specification
/// is applicable to PC-based system where a Licensed Drive and PC Host act
/// together as the Recording Device and/or Playback Device for AACS Content.
/// AACS uses a drive-host authentication protocol for the host to verify the
/// integrity of the data received from the Licensed Drive, and for the Licensed
/// Drive to check the validity of the host application. The Type and Version
/// Record and the Host Revocation List Record are guaranteed to be the first two
/// records of a Media Key Block, to make it easier for Licensed Drives to extract
/// this data from an arbitrary Media Key Block.
/// </summary>
/// <see href="https://aacsla.com/wp-content/uploads/2019/02/AACS_Spec_Common_Final_0953.pdf"/>
public sealed class HostRevocationListRecord : Record
{
/// <summary>
/// The total number of Host Revocation List Entry fields that follow.
/// </summary>
public uint TotalNumberOfEntries { get; set; }
/// <summary>
/// Revocation list entries
/// </summary>
public HostRevocationSignatureBlock?[]? SignatureBlocks { get; set; }
}
}

View File

@@ -1,17 +0,0 @@
namespace SabreTools.Models.AACS
{
/// <see href="https://aacsla.com/wp-content/uploads/2019/02/AACS_Spec_Common_Final_0953.pdf"/>
public sealed class HostRevocationSignatureBlock
{
/// <summary>
/// The number of Host Revocation List Entry fields in the signature block.
/// </summary>
public uint NumberOfEntries { get; set; }
/// <summary>
/// A list of 8-byte Host Revocation List Entry fields, the length of this
/// list being equal to the number in the signature block.
/// </summary>
public HostRevocationListEntry?[]? EntryFields { get; set; }
}
}

View File

@@ -1,14 +0,0 @@
namespace SabreTools.Models.AACS
{
/// <summary>
/// A Media Key Block is formatted as a sequence of contiguous Records.
/// </summary>
/// <see href="https://aacsla.com/wp-content/uploads/2019/02/AACS_Spec_Common_Final_0953.pdf"/>
public sealed class MediaKeyBlock
{
/// <summary>
/// Records
/// </summary>
public Record?[]? Records { get; set; }
}
}

View File

@@ -1,18 +0,0 @@
namespace SabreTools.Models.AACS
{
/// <summary>
/// This record gives the associated encrypted media key data for the
/// subset-differences identified in the Explicit Subset-Difference Record.
/// </summary>
/// <see href="https://aacsla.com/wp-content/uploads/2019/02/AACS_Spec_Common_Final_0953.pdf"/>
public sealed class MediaKeyDataRecord : Record
{
/// <summary>
/// Each subset difference has its associated 16 bytes in this
/// record, in the same order it is encountered in the subset-difference
/// record. This 16 bytes is the ciphertext value C in the media
/// key calculation.
/// </summary>
public byte[][]? MediaKeyData { get; set; }
}
}

View File

@@ -1,28 +0,0 @@
namespace SabreTools.Models.AACS
{
/// <summary>
/// Each Record begins with a one-byte Record Type field, followed by a
/// three-byte Record Length field.
///
/// The following subsections describe the currently defined Record types,
/// and how a device processes each. All multi-byte integers, including
/// the length field, are “Big Endian”; in other words, the most significant
/// byte comes first in the record.
/// </summary>
/// <see href="https://aacsla.com/wp-content/uploads/2019/02/AACS_Spec_Common_Final_0953.pdf"/>
public abstract class Record
{
/// <summary>
/// The Record Type field value indicates the type of the Record.
/// </summary>
public RecordType RecordType { get; set; }
/// <summary>
/// The Record Length field value indicates the number of bytes in
/// the Record, including the Record Type and the Record Length
/// fields themselves. Record lengths are always multiples of 4 bytes.
/// </summary>
// <remarks>UInt24 not UInt32</remarks>
public uint RecordLength { get; set; }
}
}

View File

@@ -1,23 +0,0 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.AACS
{
/// <see href="https://aacsla.com/wp-content/uploads/2019/02/AACS_Spec_Common_Final_0953.pdf"/>
[StructLayout(LayoutKind.Sequential)]
public sealed class SubsetDifference
{
/// <summary>
/// The mask for u is given by the first byte. That byte is
/// treated as a number, the number of low-order 0-bits in
/// the mask. For example, the value 0x01 denotes a mask of
/// 0xFFFFFFFE; value 0x0A denotes a mask of 0xFFFFFC00.
/// </summary>
public byte Mask;
/// <summary>
/// The last 4 bytes are the uv number, most significant
/// byte first.
/// </summary>
public uint Number;
}
}

View File

@@ -1,26 +0,0 @@
namespace SabreTools.Models.AACS
{
/// <summary>
/// This is a speed-up record which can be ignored by devices not wishing to
/// take advantage of it. It is a lookup table which allows devices to quickly
/// find their subset-difference in the Explicit Subset-Difference record,
/// without processing the entire record. This Subset-Difference Index record
/// is always present, and always precedes the Explicit Subset-Difference record
/// in the MKB, although it does not necessarily immediately precede it.
/// </summary>
/// <see href="https://aacsla.com/wp-content/uploads/2019/02/AACS_Spec_Common_Final_0953.pdf"/>
public sealed class SubsetDifferenceIndexRecord : Record
{
/// <summary>
/// The number of devices per index offset.
/// </summary>
public uint Span { get; set; }
/// <summary>
/// These offsets refer to the offset within the following Explicit
/// Subset-Difference record, with 0 being the start of the record.
/// </summary>
// <remarks>UInt24 not UInt32</remarks>
public uint[]? Offsets { get; set; }
}
}

View File

@@ -1,32 +0,0 @@
namespace SabreTools.Models.AACS
{
/// <summary>
/// Devices, except for recording devices which are writing Media Key Block
/// Extensions, may ignore this record. Recording devices shall verify the
/// signature (see End of Media Key Block record) and use the Version Number
/// in this record to determine if a new Media Key BLock Extension is, in
/// fact, more recent than the Media Key Block Extension that is currently
/// on the media.
/// </summary>
/// <see href="https://aacsla.com/wp-content/uploads/2019/02/AACS_Spec_Common_Final_0953.pdf"/>
public sealed class TypeAndVersionRecord : Record
{
/// <summary>
/// For AACS applications, the MKBType field is one of three values.
/// It is not an error for a Type 3 Media Key Block to be used for
/// controlling access to AACS Content on pre- recorded media. In
/// this case, the device shall not use the KCD.
/// </summary>
public MediaKeyBlockType MediaKeyBlockType { get; set; }
/// <summary>
/// The Version Number is a 32-bit unsigned integer. Each time the
/// licensing agency changes the revocation, it increments the version
/// number and inserts the new value in subsequent Media Key Blocks.
/// Thus, larger values indicate more recent Media Key Blocks. The
/// Version Numbers begin at 1; 0 is a special value used for test
/// Media Key Blocks.
/// </summary>
public uint VersionNumber { get; set; }
}
}

View File

@@ -1,24 +0,0 @@
namespace SabreTools.Models.AACS
{
/// <summary>
/// A properly formatted MKB shall have exactly one Verify Media Key Record
/// as its first record. The presence of the Verify Media Key Record in an MKB
/// is mandatory, but the use of the Record by a device is not mandatory. The
/// device may use the Verify Media Key Record to verify the correctness of a
/// given MKB, or of its processing of it. If everything is correct, the device
/// should observe the condition:
/// [AES_128D(vKm, C]msb_64 == 0x0123456789ABCDEF)]
/// where Km is the Media Key value.
/// </summary>
/// <see href="https://aacsla.com/wp-content/uploads/2019/02/AACS_Spec_Common_Final_0953.pdf"/>
public sealed class VerifyMediaKeyRecord : Record
{
/// <summary>
/// Bytes 4 through 19 of the Record contain the ciphertext value
/// Cv = AES-128E (Km, 0x0123456789ABCDEF || 0xXXXXXXXXXXXXXXXX)
/// where 0xXXXXXXXXXXXXXXXX is an arbitrary 8-byte value, and Km is
/// the correct final Media Key value.
/// </summary>
public byte[]? CiphertextValue { get; set; }
}
}

View File

@@ -0,0 +1,61 @@
namespace SabreTools.Models.AdvancedInstaller
{
/// <summary>
/// Single entry in the file table
/// </summary>
public class FileEntry
{
/// <summary>
/// Unknown
/// </summary>
/// <remarks>
/// Observed values:
/// - 00 00 00 00 (INI)
/// - 01 00 00 00 (MSI, CAB)
/// - 05 00 00 00 (DLL)
/// </remarks>
public uint Unknown0 { get; set; }
/// <summary>
/// Unknown
/// </summary>
/// <remarks>
/// Observed values:
/// - 00 00 00 00 (MSI)
/// - 01 00 00 00 (CAB)
/// - 03 00 00 00 (INI)
/// - 0C 00 00 00 (DLL)
/// </remarks>
public uint? Unknown1 { get; set; }
/// <summary>
/// Unknown, always 0?
/// </summary>
/// <remarks>
/// Observed values:
/// - 00 00 00 00 (DLL, MSI, CAB, INI)
/// </remarks>
public uint? Unknown2 { get; set; }
/// <summary>
/// Size of the file
/// </summary>
public uint FileSize { get; set; }
/// <summary>
/// Offset of the file relative to the start
/// of the SFX stub
/// </summary>
public uint FileOffset { get; set; }
/// <summary>
/// Size of the file name in characters
/// </summary>
public uint NameSize { get; set; }
/// <summary>
/// Unicode-encoded file name
/// </summary>
public string? Name { get; set; }
}
}

View File

@@ -0,0 +1,109 @@
namespace SabreTools.Models.AdvancedInstaller
{
/// <summary>
/// Structure similar to the end of central directory
/// header in PKZIP files
/// </summary>
public class Footer
{
/// <summary>
/// Unknown
/// </summary>
/// <remarks>
/// Observed values:
/// - 00 00 00 00
/// </remarks>
public uint Unknown0 { get; set; }
/// <summary>
/// Size of the original filename?
/// </summary>
/// <remarks>Doesn't exist in some cases?</remarks>
public uint? OriginalFilenameSize { get; set; }
/// <summary>
/// Unicode-encoded original filename?
/// </summary>
/// <remarks>Doesn't exist in some cases?</remarks>
public string? OriginalFilename { get; set; }
/// <summary>
/// Unknown, possibly a string count?
/// </summary>
/// <remarks>
/// Only seen when the preceeding two fields exist
///
/// Observed values:
/// - 01 00 00 00
/// </remarks>
public uint? Unknown1 { get; set; }
/// <summary>
/// Pointer to <see cref="Unknown0"/>?
/// </summary>
public uint FooterOffset { get; set; }
/// <summary>
/// Number of entries that preceed the footer
/// </summary>
public uint EntryCount { get; set; }
/// <summary>
/// Unknown
/// </summary>
/// <remarks>
/// Observed values:
/// - 64 00 00 00
/// </remarks>
public uint Unknown2 { get; set; }
/// <summary>
/// Unknown offset
/// </summary>
/// <remarks>
/// Points to <see cref="Unknown0"/> if no original filename.
/// Points to <see cref="EntryCount"/> if contains an original filename.
/// </remarks>
public uint UnknownOffset { get; set; }
/// <summary>
/// Offset of the start of the file table
/// </summary>
public uint TablePointer { get; set; }
/// <summary>
/// Offset to the start of the file data
/// </summary>
public uint FileDataStart { get; set; }
/// <summary>
/// Hex string that looks like a key or other identifier
/// </summary>
/// <remarks>32 bytes</remarks>
public string? HexString { get; set; }
/// <summary>
/// Unknown
/// </summary>
/// <remarks>
/// Offset pointer to <see cref="FileDataStart"/>
/// relative to the end of the signature if no filename
/// exists.
///
/// Observed values:
/// - 32 00 00 00 (No original filename)
/// - 13 02 00 00 (Original filename)
/// </remarks>
public uint Unknown3 { get; set; }
/// <summary>
/// "ADVINSTSFX"
/// </summary>
public string? Signature { get; set; }
/// <summary>
/// Unknown, always 0? Padding?
/// </summary>
public ushort? Unknown4 { get; set; }
}
}

View File

@@ -0,0 +1,29 @@
namespace SabreTools.Models.AdvancedInstaller
{
/// <summary>
/// Represents the structure at the end of a Caphyon
/// Advanced Installer SFX file. These SFX files store
/// all files uncompressed sequentially in the overlay
/// of an executable.
///
/// The design is similar to the end of central directory
/// in a PKZIP file. The footer needs to be read before
/// the entry table as both the pointer to the start of
/// the table as well as the entry count are included there.
///
/// The layout of this is derived from the layout in the
/// physical file.
/// </summary>
public class SFX
{
/// <summary>
/// Set of file entries
/// </summary>
public FileEntry[]? Entries { get; set; }
/// <summary>
/// Footer representing the central directory
/// </summary>
public Footer? Footer { get; set; }
}
}

View File

@@ -1,205 +0,0 @@
using System.Xml;
using System.Xml.Serialization;
namespace SabreTools.Models.ArchiveDotOrg
{
[XmlRoot("file")]
public class File
{
[XmlAttribute("name")]
public string? Name { get; set; }
/// <remarks>Is this a set of defined values?</remarks>
[XmlAttribute("source")]
public string? Source { get; set; }
[XmlElement("btih")]
public string? BitTorrentMagnetHash { get; set; }
[XmlElement("mtime")]
public string? LastModifiedTime { get; set; }
[XmlElement("size")]
public string? Size { get; set; }
[XmlElement("md5")]
public string? MD5 { get; set; }
[XmlElement("crc32")]
public string? CRC32 { get; set; }
[XmlElement("sha1")]
public string? SHA1 { get; set; }
[XmlElement("filecount")]
public string? FileCount { get; set; }
/// <remarks>Is this a set of defined values?</remarks>
[XmlElement("format")]
public string? Format { get; set; }
[XmlElement("original")]
public string? Original { get; set; }
/// <remarks>Is this a set of defined values?</remarks>
[XmlElement("summation")]
public string? Summation { get; set; }
[XmlElement("matrix_number")]
public string? MatrixNumber { get; set; }
[XmlElement("collection-catalog-number")]
public string? CollectionCatalogNumber { get; set; }
[XmlElement("publisher")]
public string? Publisher { get; set; }
[XmlElement("comment")]
public string? Comment { get; set; }
#region ASR-Related
[XmlElement("asr_detected_lang")]
public string? ASRDetectedLang { get; set; }
[XmlElement("asr_detected_lang_conf")]
public string? ASRDetectedLangConf { get; set; }
[XmlElement("asr_transcribed_lang")]
public string? ASRTranscribedLang { get; set; }
[XmlElement("whisper_asr_module_version")]
public string? WhisperASRModuleVersion { get; set; }
[XmlElement("whisper_model_hash")]
public string? WhisperModelHash { get; set; }
[XmlElement("whisper_model_name")]
public string? WhisperModelName { get; set; }
[XmlElement("whisper_version")]
public string? WhisperVersion { get; set; }
#endregion
#region OCR-Related
[XmlElement("cloth_cover_detection_module_version")]
public string? ClothCoverDetectionModuleVersion { get; set; }
[XmlElement("hocr_char_to_word_hocr_version")]
public string? hOCRCharToWordhOCRVersion { get; set; }
[XmlElement("hocr_char_to_word_module_version")]
public string? hOCRCharToWordModuleVersion { get; set; }
[XmlElement("hocr_fts_text_hocr_version")]
public string? hOCRFtsTexthOCRVersion { get; set; }
[XmlElement("hocr_fts_text_module_version")]
public string? hOCRFtsTextModuleVersion { get; set; }
[XmlElement("hocr_pageindex_hocr_version")]
public string? hOCRPageIndexhOCRVersion { get; set; }
[XmlElement("hocr_pageindex_module_version")]
public string? hOCRPageIndexModuleVersion { get; set; }
[XmlElement("ocr")]
public string? TesseractOCR { get; set; }
[XmlElement("ocr_converted")]
public string? TesseractOCRConverted { get; set; }
[XmlElement("ocr_detected_lang")]
public string? TesseractOCRDetectedLang { get; set; }
[XmlElement("ocr_detected_lang_conf")]
public string? TesseractOCRDetectedLangConf { get; set; }
[XmlElement("ocr_detected_script")]
public string? TesseractOCRDetectedScript { get; set; }
[XmlElement("ocr_detected_script_conf")]
public string? TesseractOCRDetectedScriptConf { get; set; }
[XmlElement("ocr_module_version")]
public string? TesseractOCRModuleVersion { get; set; }
[XmlElement("ocr_parameters")]
public string? TesseractOCRParameters { get; set; }
[XmlElement("pdf_module_version")]
public string? PDFModuleVersion { get; set; }
[XmlElement("word_conf_0_10")]
public string? WordConfidenceInterval0To10 { get; set; }
[XmlElement("word_conf_11_20")]
public string? WordConfidenceInterval11To20 { get; set; }
[XmlElement("word_conf_21_30")]
public string? WordConfidenceInterval21To30 { get; set; }
[XmlElement("word_conf_31_40")]
public string? WordConfidenceInterval31To40 { get; set; }
[XmlElement("word_conf_41_50")]
public string? WordConfidenceInterval41To50 { get; set; }
[XmlElement("word_conf_51_60")]
public string? WordConfidenceInterval51To60 { get; set; }
[XmlElement("word_conf_61_70")]
public string? WordConfidenceInterval61To70 { get; set; }
[XmlElement("word_conf_71_80")]
public string? WordConfidenceInterval71To80 { get; set; }
[XmlElement("word_conf_81_90")]
public string? WordConfidenceInterval81To90 { get; set; }
[XmlElement("word_conf_91_100")]
public string? WordConfidenceInterval91To100 { get; set; }
#endregion
#region Media-Related
[XmlElement("album")]
public string? Album { get; set; }
[XmlElement("artist")]
public string? Artist { get; set; }
[XmlElement("bitrate")]
public string? Bitrate { get; set; }
[XmlElement("creator")]
public string? Creator { get; set; }
[XmlElement("height")]
public string? Height { get; set; }
[XmlElement("length")]
public string? Length { get; set; }
[XmlElement("preview-image")]
public string? PreviewImage { get; set; }
/// <remarks>Is this a set of defined values?</remarks>
[XmlElement("rotation")]
public string? Rotation { get; set; }
[XmlElement("title")]
public string? Title { get; set; }
[XmlElement("track")]
public string? Track { get; set; }
[XmlElement("width")]
public string? Width { get; set; }
#endregion
}
}

View File

@@ -1,12 +0,0 @@
using System.Xml;
using System.Xml.Serialization;
namespace SabreTools.Models.ArchiveDotOrg
{
[XmlRoot("files")]
public class Files
{
[XmlElement("file")]
public File?[]? File { get; set; }
}
}

View File

@@ -1,13 +0,0 @@
namespace SabreTools.Models.AttractMode
{
/// <summary>
/// #Name;Title;Emulator;CloneOf;Year;Manufacturer;Category;Players;Rotation;Control;Status;DisplayCount;DisplayType;AltRomname;AltTitle;Extra;Buttons /// </summary>
/// </summary>
public class MetadataFile
{
[Required]
public string[]? Header { get; set; }
public Row?[]? Row { get; set; }
}
}

View File

@@ -1,51 +0,0 @@
namespace SabreTools.Models.AttractMode
{
public class Row
{
/// <remarks>Also called Romname</remarks>
[Required]
public string? Name { get; set; }
public string? Title { get; set; }
public string? Emulator { get; set; }
public string? CloneOf { get; set; }
public string? Year { get; set; }
public string? Manufacturer { get; set; }
public string? Category { get; set; }
public string? Players { get; set; }
public string? Rotation { get; set; }
public string? Control { get; set; }
public string? Status { get; set; }
public string? DisplayCount { get; set; }
public string? DisplayType { get; set; }
public string? AltRomname { get; set; }
public string? AltTitle { get; set; }
public string? Extra { get; set; }
public string? Buttons { get; set; }
public string? Favorite { get; set; }
public string? Tags { get; set; }
public string? PlayedCount { get; set; }
public string? PlayedTime { get; set; }
public string? FileIsAvailable { get; set; }
}
}

View File

@@ -1,7 +0,0 @@
namespace SabreTools.Models.BDPlus
{
public static class Constants
{
public const string SignatureString = "BDSVM_CC";
}
}

View File

@@ -1,49 +0,0 @@
namespace SabreTools.Models.BDPlus
{
/// <see href="https://github.com/mwgoldsmith/bdplus/blob/master/src/libbdplus/bdsvm/loader.c"/>
public sealed class SVM
{
/// <summary>
/// "BDSVM_CC"
/// </summary>
/// <remarks>8 bytes</remarks>
public string? Signature { get; set; }
/// <summary>
/// Unknown data
/// </summary>
/// <remarks>5 bytes</remarks>
public byte[]? Unknown1 { get; set; }
/// <summary>
/// Version year
/// </summary>
public ushort Year { get; set; }
/// <summary>
/// Version month
/// </summary>
public byte Month { get; set; }
/// <summary>
/// Version day
/// </summary>
public byte Day { get; set; }
/// <summary>
/// Unknown data
/// </summary>
/// <remarks>4 bytes</remarks>
public byte[]? Unknown2 { get; set; }
/// <summary>
/// Length
/// </summary>
public uint Length { get; set; }
/// <summary>
/// Length bytes of data
/// </summary>
public byte[]? Data { get; set; }
}
}

View File

@@ -1,19 +0,0 @@
namespace SabreTools.Models.BFPK
{
/// <summary>
/// BFPK custom archive format
/// </summary>
/// <see cref="https://forum.xentax.com/viewtopic.php?t=5102"/>
public sealed class Archive
{
/// <summary>
/// Header
/// </summary>
public Header? Header { get; set; }
/// <summary>
/// Files
/// </summary>
public FileEntry[]? Files { get; set; }
}
}

View File

@@ -1,11 +0,0 @@
namespace SabreTools.Models.BFPK
{
public static class Constants
{
public static readonly byte[] SignatureBytes = [0x42, 0x46, 0x50, 0x4b];
public const string SignatureString = "BFPK";
public const uint SignatureUInt32 = 0x4b504642;
}
}

View File

@@ -1,34 +0,0 @@
namespace SabreTools.Models.BFPK
{
/// <summary>
/// File entry
/// </summary>
/// <see cref="https://forum.xentax.com/viewtopic.php?t=5102"/>
public sealed class FileEntry
{
/// <summary>
/// Name size
/// </summary>
public int NameSize { get; set; }
/// <summary>
/// Name
/// </summary>
public string? Name { get; set; }
/// <summary>
/// Uncompressed size
/// </summary>
public int UncompressedSize { get; set; }
/// <summary>
/// Offset
/// </summary>
public int Offset { get; set; }
/// <summary>
/// Compressed size
/// </summary>
public int CompressedSize { get; set; }
}
}

View File

@@ -1,28 +0,0 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.BFPK
{
/// <summary>
/// Header
/// </summary>
/// <see cref="https://forum.xentax.com/viewtopic.php?t=5102"/>
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public sealed class Header
{
/// <summary>
/// "BFPK"
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]
public string? Magic;
/// <summary>
/// Version
/// </summary>
public int Version;
/// <summary>
/// Files
/// </summary>
public int Files;
}
}

View File

@@ -1,38 +0,0 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.BMP
{
/// <summary>
/// The BITMAPFILEHEADER structure contains information about the type, size,
/// and layout of a file that contains a DIB.
/// </summary>
/// <see href="https://learn.microsoft.com/en-us/windows/win32/api/wingdi/ns-wingdi-bitmapfileheader"/>
[StructLayout(LayoutKind.Sequential)]
public sealed class BITMAPFILEHEADER
{
/// <summary>
/// The file type; must be BM.
/// </summary>
public ushort Type;
/// <summary>
/// The size, in bytes, of the bitmap file.
/// </summary>
public uint Size;
/// <summary>
/// Reserved; must be zero.
/// </summary>
public ushort Reserved1;
/// <summary>
/// Reserved; must be zero.
/// </summary>
public ushort Reserved2;
/// <summary>
/// The offset, in bytes, from the beginning of the BITMAPFILEHEADER structure to the bitmap bits.
/// </summary>
public uint OffBits;
}
}

View File

@@ -1,97 +0,0 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.BMP
{
/// <summary>
/// The BITMAPINFOHEADER structure contains information about the dimensions and
/// color format of a device-independent bitmap (DIB).
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public sealed class BITMAPINFOHEADER
{
/// <summary>
/// Specifies the number of bytes required by the structure. This value does
/// not include the size of the color table or the size of the color masks,
/// if they are appended to the end of structure.
/// </summary>
public uint Size;
/// <summary>
/// Specifies the width of the bitmap, in pixels.
/// </summary>
public int Width;
/// <summary>
/// Specifies the height of the bitmap, in pixels.
/// - For uncompressed RGB bitmaps, if biHeight is positive, the bitmap is a
/// bottom-up DIB with the origin at the lower left corner. If biHeight is
/// negative, the bitmap is a top-down DIB with the origin at the upper left
/// corner.
/// - For YUV bitmaps, the bitmap is always top-down, regardless of the sign of
/// biHeight. Decoders should offer YUV formats with positive biHeight, but for
/// backward compatibility they should accept YUV formats with either positive
/// or negative biHeight.
/// - For compressed formats, biHeight must be positive, regardless of image orientation.
/// </summary>
public int Height;
/// <summary>
/// Specifies the number of planes for the target device. This value must be set to 1.
/// </summary>
public ushort Planes;
/// <summary>
/// Specifies the number of bits per pixel (bpp). For uncompressed formats, this value
/// is the average number of bits per pixel. For compressed formats, this value is the
/// implied bit depth of the uncompressed image, after the image has been decoded.
/// </summary>
public ushort BitCount;
/// <summary>
/// For compressed video and YUV formats, this member is a FOURCC code, specified as a
/// DWORD in little-endian order. For example, YUYV video has the FOURCC 'VYUY' or
/// 0x56595559. For more information, see FOURCC Codes.
///
/// For uncompressed RGB formats, the following values are possible:
/// - BI_RGB: Uncompressed RGB.
/// - BI_BITFIELDS: Uncompressed RGB with color masks. Valid for 16-bpp and 32-bpp bitmaps.
///
/// Note that BI_JPG and BI_PNG are not valid video formats.
///
/// For 16-bpp bitmaps, if biCompression equals BI_RGB, the format is always RGB 555.
/// If biCompression equals BI_BITFIELDS, the format is either RGB 555 or RGB 565. Use
/// the subtype GUID in the AM_MEDIA_TYPE structure to determine the specific RGB type.
/// </summary>
public uint Compression;
/// <summary>
/// Specifies the size, in bytes, of the image. This can be set to 0 for uncompressed
/// RGB bitmaps.
/// </summary>
public uint SizeImage;
/// <summary>
/// Specifies the horizontal resolution, in pixels per meter, of the target device for
/// the bitmap.
/// </summary>
public int XPelsPerMeter;
/// <summary>
/// Specifies the vertical resolution, in pixels per meter, of the target device for
/// the bitmap.
/// </summary>
public int YPelsPerMeter;
/// <summary>
/// Specifies the number of color indices in the color table that are actually used by
/// the bitmap.
/// </summary>
public uint ClrUsed;
/// <summary>
/// Specifies the number of color indices that are considered important for displaying
/// the bitmap. If this value is zero, all colors are important.
/// </summary>
public uint ClrImportant;
}
}

View File

@@ -1,25 +0,0 @@
namespace SabreTools.Models.BSP
{
public static class Constants
{
/// <summary>
/// Number of lumps in a BSP
/// </summary>
public const int HL_BSP_LUMP_COUNT = 15;
/// <summary>
/// Index for the entities lump
/// </summary>
public const int HL_BSP_LUMP_ENTITIES = 0;
/// <summary>
/// Index for the texture data lump
/// </summary>
public const int HL_BSP_LUMP_TEXTUREDATA = 2;
/// <summary>
/// Number of valid mipmap levels
/// </summary>
public const int HL_BSP_MIPMAP_COUNT = 4;
}
}

View File

@@ -1,29 +0,0 @@
namespace SabreTools.Models.BSP
{
/// <summary>
/// Half-Life Level
/// </summary>
/// <see href="https://github.com/RavuAlHemio/hllib/blob/master/HLLib/BSPFile.h"/>
public sealed class File
{
/// <summary>
/// Header data
/// </summary>
public Header? Header { get; set; }
/// <summary>
/// Lumps
/// </summary>
public Lump?[]? Lumps { get; set; }
/// <summary>
/// Texture header data
/// </summary>
public TextureHeader? TextureHeader { get; set; }
/// <summary>
/// Textures
/// </summary>
public Texture?[]? Textures { get; set; }
}
}

View File

@@ -1,14 +0,0 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.BSP
{
/// <see href="https://github.com/RavuAlHemio/hllib/blob/master/HLLib/BSPFile.h"/>
[StructLayout(LayoutKind.Sequential)]
public sealed class Header
{
/// <summary>
/// Version
/// </summary>
public uint Version;
}
}

View File

@@ -1,19 +0,0 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.BSP
{
/// <see href="https://github.com/RavuAlHemio/hllib/blob/master/HLLib/BSPFile.h"/>
[StructLayout(LayoutKind.Sequential)]
public sealed class Lump
{
/// <summary>
/// Offset
/// </summary>
public uint Offset;
/// <summary>
/// Length
/// </summary>
public uint Length;
}
}

View File

@@ -1,41 +0,0 @@
namespace SabreTools.Models.BSP
{
/// <see href="https://github.com/RavuAlHemio/hllib/blob/master/HLLib/BSPFile.h"/>
public sealed class Texture
{
/// <summary>
/// Name
/// </summary>
public string? Name { get; set; }
/// <summary>
/// Width
/// </summary>
public uint Width { get; set; }
/// <summary>
/// Height
/// </summary>
public uint Height { get; set; }
/// <summary>
/// Offsets
/// </summary>
public uint[]? Offsets { get; set; }
/// <summary>
/// Texture data
/// </summary>
public byte[]? TextureData { get; set; }
/// <summary>
/// Palette size
/// </summary>
public uint PaletteSize { get; set; }
/// <summary>
/// Palette data
/// </summary>
public byte[]? PaletteData { get; set; }
}
}

View File

@@ -1,17 +0,0 @@
namespace SabreTools.Models.BSP
{
/// <see href="https://github.com/RavuAlHemio/hllib/blob/master/HLLib/BSPFile.h"/>
public sealed class TextureHeader
{
/// <summary>
/// Texture count
/// </summary>
public uint TextureCount { get; set; }
/// <summary>
/// Offsets
/// </summary>
/// <remarks>TextureCount entries</remarks>
public uint[]? Offsets { get; set; }
}
}

View File

@@ -1,92 +0,0 @@
namespace SabreTools.Models.CFB
{
/// <summary>
/// Microsoft Compound File Binary (CFB) file format, also known as the
/// Object Linking and Embedding (OLE) or Component Object Model (COM)
/// structured storage compound file implementation binary file format.
/// This structure name can be shortened to compound file.
/// </summary>
/// <see href="https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-CFB/%5bMS-CFB%5d.pdf"/>
public sealed class Binary
{
/// <summary>
/// Compound file header
/// </summary>
public FileHeader? Header { get; set; }
/// <summary>
/// The FAT is the main allocator for space within a compound file.
/// Every sector in the file is represented within the FAT in some
/// fashion, including those sectors that are unallocated (free).
/// The FAT is a sector chain that is made up of one or more FAT sectors.
/// </summary>
/// <remarks>
/// If Header Major Version is 3, there MUST be 128 fields specified to fill a 512-byte sector.
///
/// If Header Major Version is 4, there MUST be 1,024 fields specified to fill a 4,096-byte sector
/// </remarks>
public SectorNumber[]? FATSectorNumbers { get; set; }
/// <summary>
/// The mini FAT is used to allocate space in the mini stream.
/// The mini stream is divided intosmaller, equal-length sectors,
/// and the sector size that is used for the mini stream is specified
/// from the Compound File Header (64 bytes).
/// </summary>
/// <remarks>
/// If Header Major Version is 3, there MUST be 128 fields specified to fill a 512-byte sector.
///
/// If Header Major Version is 4, there MUST be 1,024 fields specified to fill a 4,096-byte sector
/// </remarks>
public SectorNumber[]? MiniFATSectorNumbers { get; set; }
/// <summary>
/// The DIFAT array is used to represent storage of the FAT sectors.
/// The DIFAT is represented by an array of 32-bit sector numbers.
/// The DIFAT array is stored both in the header and in DIFAT sectors.
/// In the header, the DIFAT array occupies 109 entries, and in each
/// DIFAT sector, the DIFAT array occupies the entire sector minus
/// 4 bytes. (The last field is for chaining the DIFAT sector chain.)
/// </summary>
/// <remarks>
/// If Header Major Version is 3, there MUST be 127 fields specified to
/// fill a 512-byte sector minus the "Next DIFAT Sector Location" field.
///
/// If Header Major Version is 4, there MUST be 1,023 fields specified
/// to fill a 4,096-byte sector minus the "Next DIFAT Sector Location" field.
/// </remarks>
public SectorNumber[]? DIFATSectorNumbers { get; set; }
/// <summary>
/// The directory entry array is an array of directory entries that
/// are grouped into a directory sector. Each storage object or stream
/// object within a compound file is represented by a single directory
/// entry. The space for the directory sectors that are holding the
/// array is allocated from the FAT.
/// </summary>
/// <remarks>
/// The first entry in the first sector of the directory chain (also
/// referred to as the first element of the directory array, or stream
/// ID #0) is known as the root directory entry, and it is reserved for
/// two purposes. First, it provides a root parent for all objects that
/// are stationed at the root of the compound file. Second, its function
/// is overloaded to store the size and starting sector for the mini stream.
///
/// The root directory entry behaves as both a stream and a storage object.
/// The root directory entry's Name field MUST contain the null-terminated
/// string "Root Entry" in Unicode UTF-16.
///
/// The object class GUID (CLSID) that is stored in the root directory
/// entry can be used for COM activation of the document's application.
///
/// The time stamps for the root storage are not maintained in the root
/// directory entry. Rather, the root storage's creation and modification
/// time stamps are normally stored on the file itself in the file system.
///
/// The Creation Time field in the root storage directory entry MUST be
/// all zeroes. The Modified Time field in the root storage directory
/// entry MAY be all zeroes.
/// <remarks>
public DirectoryEntry[]? DirectoryEntries { get; set; }
}
}

View File

@@ -1,52 +0,0 @@
using System;
namespace SabreTools.Models.CFB
{
public static class Constants
{
public static readonly byte[] SignatureBytes = [0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1];
public const ulong SignatureUInt64 = 0xE11AB1A1E011CFD0;
/// <see href="https://devblogs.microsoft.com/setup/identifying-windows-installer-file-types/"/>
#region Class IDs
/// <summary>
/// Installer Package (msi), Merge Module (msm), Patch Creation Properties (pcp)
/// </summary>
public static readonly Guid InstallerPackage = new("000c1084-0000-0000-c000-000000000046");
/// <summary>
/// Patch Package (msp)
/// </summary>
public static readonly Guid PatchPackage = new("000C1086-0000-0000-C000-000000000046");
/// <summary>
/// Transform (mst)
/// </summary>
public static readonly Guid Transform = new("000C1082-0000-0000-C000-000000000046");
#endregion
/// <see href="https://learn.microsoft.com/en-us/windows/win32/stg/predefined-property-set-format-identifiers"/>
#region Property Set Format IDs
/// <summary>
/// The Summary Information Property Set
/// </summary>
public static readonly Guid FMTID_SummaryInformation = new("F29F85E0-4FF9-1068-AB91-08002B27B3D9");
/// <summary>
/// The DocumentSummaryInformation and UserDefined Property Sets
/// </summary>
public static readonly Guid FMTID_DocSummaryInformation = new("D5CDD502-2E9C-101B-9397-08002B2CF9AE");
/// <summary>
/// The DocumentSummaryInformation and UserDefined Property Sets
/// </summary>
public static readonly Guid FMTID_UserDefinedProperties = new("D5CDD505-2E9C-101B-9397-08002B2CF9AE");
#endregion
}
}

View File

@@ -1,142 +0,0 @@
using System;
using System.Runtime.InteropServices;
namespace SabreTools.Models.CFB
{
/// <see href="https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-CFB/%5bMS-CFB%5d.pdf"/>
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public sealed class DirectoryEntry
{
/// <summary>
/// This field MUST contain a Unicode string for the storage or stream
/// name encoded in UTF-16. The name MUST be terminated with a UTF-16
/// terminating null character. Thus, storage and stream names are limited
/// to 32 UTF-16 code points, including the terminating null character.
/// When locating an object in the compound file except for the root
/// storage, the directory entry name is compared by using a special
/// case-insensitive uppercase mapping, described in Red-Black Tree.
/// The following characters are illegal and MUST NOT be part of the
/// name: '/', '\', ':', '!'.
/// </summary>
/// <remarks>64 bytes</remarks>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string? Name;
/// <summary>
/// This field MUST be 0x00, 0x01, 0x02, or 0x05, depending on the
/// actual type of object. All other values are not valid.
/// </summary>
public ushort NameLength;
/// <summary>
/// This field MUST match the length of the Directory Entry Name Unicode
/// string in bytes. The length MUST be a multiple of 2 and include the
/// terminating null character in the count. This length MUST NOT exceed 64,
/// the maximum size of the Directory Entry Name field.
/// </summary>
[MarshalAs(UnmanagedType.U1)]
public ObjectType ObjectType;
/// <summary>
/// This field MUST be 0x00 (red) or 0x01 (black). All other values are not valid.
/// </summary>
[MarshalAs(UnmanagedType.U1)]
public ColorFlag ColorFlag;
/// <summary>
/// This field contains the stream ID of the left sibling. If there
/// is no left sibling, the field MUST be set to NOSTREAM (0xFFFFFFFF).
/// </summary>
[MarshalAs(UnmanagedType.U4)]
public StreamID LeftSiblingID;
/// <summary>
/// This field contains the stream ID of the right sibling. If there
/// is no right sibling, the field MUST be set to NOSTREAM (0xFFFFFFFF).
/// </summary>
[MarshalAs(UnmanagedType.U4)]
public StreamID RightSiblingID;
/// <summary>
/// This field contains the stream ID of a child object. If there is no
/// child object, including all entries for stream objects, the field
/// MUST be set to NOSTREAM (0xFFFFFFFF).
/// </summary>
[MarshalAs(UnmanagedType.U4)]
public StreamID ChildID;
/// <summary>
/// This field contains an object class GUID, if this entry is for a
/// storage object or root storage object. For a stream object, this field
/// MUST be set to all zeroes. A value containing all zeroes in a storage
/// or root storage directory entry is valid, and indicates that no object
/// class is associated with the storage. If an implementation of the file
/// format enables applications to create storage objects without explicitly
/// setting an object class GUID, it MUST write all zeroes by default. If
/// this value is not all zeroes, the object class GUID can be used as a
/// parameter to start applications.
/// </summary>
public Guid CLSID;
/// <summary>
/// This field contains the user-defined flags if this entry is for a storage
/// object or root storage object. For a stream object, this field SHOULD be
/// set to all zeroes because many implementations provide no way for
/// applications to retrieve state bits from a stream object. If an
/// implementation of the file format enables applications to create storage
/// objects without explicitly setting state bits, it MUST write all zeroes
/// by default.
/// </summary>
public uint StateBits;
/// <summary>
/// This field contains the creation time for a storage object, or all zeroes
/// to indicate that the creation time of the storage object was not recorded.
/// The Windows FILETIME structure is used to represent this field in UTC.
/// For a stream object, this field MUST be all zeroes. For a root storage
/// object, this field MUST be all zeroes, and the creation time is retrieved
/// or set on the compound file itself.
/// </summary>
public ulong CreationTime;
/// <summary>
/// This field contains the modification time for a storage object, or all
/// zeroes to indicate that the modified time of the storage object was not
/// recorded. The Windows FILETIME structure is used to represent this field
/// in UTC. For a stream object, this field MUST be all zeroes. For a root
/// storage object, this field MAY<2> be set to all zeroes, and the modified
/// time is retrieved or set on the compound file itself.
/// </summary>
public ulong ModifiedTime;
/// <summary>
/// This field contains the first sector location if this is a stream object.
/// For a root storage object, this field MUST contain the first sector of the
/// mini stream, if the mini stream exists. For a storage object, this field MUST
/// be set to all zeroes.
/// </summary>
public uint StartingSectorLocation;
/// <summary>
/// This 64-bit integer field contains the size of the user-defined data if this
/// is a stream object. For a root storage object, this field contains the size
/// of the mini stream. For a storage object, this field MUST be set to all zeroes.
/// </summary>
/// <remarks>
/// For a version 3 compound file 512-byte sector size, the value of this field MUST
/// be less than or equal to 0x80000000. (Equivalently, this requirement can be stated:
/// the size of a stream or of the mini stream in a version 3 compound file MUST be
/// less than or equal to 2 gigabytes (GB).) Note that as a consequence of this
/// requirement, the most significant 32 bits of this field MUST be zero in a version
/// 3 compound file. However, implementers should be aware that some older
/// implementations did not initialize the most significant 32 bits of this field,
/// and these bits might therefore be nonzero in files that are otherwise valid
/// version 3 compound files. Although this document does not normatively specify
/// parser behavior, it is recommended that parsers ignore the most significant 32 bits
/// of this field in version 3 compound files, treating it as if its value were zero,
/// unless there is a specific reason to do otherwise (for example, a parser whose
/// purpose is to verify the correctness of a compound file).
/// </remarks>
public ulong StreamSize;
}
}

View File

@@ -1,474 +0,0 @@
namespace SabreTools.Models.CFB
{
public enum ColorFlag : byte
{
Red = 0x00,
Black = 0x01,
}
public enum ObjectType : byte
{
Unknown = 0x00,
StorageObject = 0x01,
StreamObject = 0x02,
RootStorageObject = 0x05,
}
public enum SectorNumber : uint
{
/// <summary>
/// Regular sector number.
/// </summary>
REGSECT = 0x00000000, // 0x00000000 - 0xFFFFFFF9
/// <summary>
/// Maximum regular sector number.
/// </summary>
MAXREGSECT = 0xFFFFFFFA,
/// <summary>
/// Reserved for future use.
/// </summary>
NotApplicable = 0xFFFFFFFB,
/// <summary>
/// Specifies a DIFAT sector in the FAT.
/// </summary>
DIFSECT = 0xFFFFFFFC,
/// <summary>
/// Specifies a FAT sector in the FAT.
/// </summary>
FATSECT = 0xFFFFFFFD,
/// <summary>
/// End of a linked chain of sectors.
/// </summary>
ENDOFCHAIN = 0xFFFFFFFE,
/// <summary>
/// Specifies an unallocated sector in the FAT, Mini FAT, or DIFAT.
/// </summary>
FREESECT = 0xFFFFFFFF,
}
public enum StreamID : uint
{
/// <summary>
/// Regular stream ID to identify the directory entry.
/// </summary>
REGSID = 0x00000000, // 0x00000000 - 0xFFFFFFF9
/// <summary>
/// Maximum regular stream ID.
/// </summary>
MAXREGSID = 0xFFFFFFFA,
/// <summary>
/// Terminator or empty pointer.
/// </summary>
NOSTREAM = 0xFFFFFFFF,
}
/// <see href="https://learn.microsoft.com/en-us/windows/win32/stg/the-summary-information-property-set"/>
public enum SummaryInformationProperty : uint
{
/// <summary>
/// Title
/// </summary>
PIDSI_TITLE = 0x00000002,
/// <summary>
/// Subject
/// </summary>
PIDSI_SUBJECT = 0x00000003,
/// <summary>
/// Author
/// </summary>
PIDSI_AUTHOR = 0x00000004,
/// <summary>
/// Keywords
/// </summary>
PIDSI_KEYWORDS = 0x00000005,
/// <summary>
/// Comments
/// </summary>
PIDSI_COMMENTS = 0x00000006,
/// <summary>
/// Template
/// </summary>
PIDSI_TEMPLATE = 0x00000007,
/// <summary>
/// Last Saved By
/// </summary>
PIDSI_LASTAUTHOR = 0x00000008,
/// <summary>
/// Revision Number
/// </summary>
PIDSI_REVNUMBER = 0x00000009,
/// <summary>
/// Total Editing Time
/// </summary>
PIDSI_EDITTIME = 0x0000000A,
/// <summary>
/// Last Printed
/// </summary>
PIDSI_LASTPRINTED = 0x0000000B,
/// <summary>
/// Create Time/Date
/// </summary>
PIDSI_CREATE_DTM = 0x0000000C,
/// <summary>
/// Last saved Time/Date
/// </summary>
PIDSI_LASTSAVE_DTM = 0x0000000D,
/// <summary>
/// Number of Pages
/// </summary>
PIDSI_PAGECOUNT = 0x0000000E,
/// <summary>
/// Number of Words
/// </summary>
PIDSI_WORDCOUNT = 0x0000000F,
/// <summary>
/// Number of Characters
/// </summary>
PIDSI_CHARCOUNT = 0x00000010,
/// <summary>
/// Thumbnail
/// </summary>
PIDSI_THUMBNAIL = 0x00000011,
/// <summary>
/// Name of Creating Application
/// </summary>
PIDSI_APPNAME = 0x00000012,
/// <summary>
/// Security
/// </summary>
PIDSI_SECURITY = 0x00000013,
}
/// <remarks>Also includes the DocumentSummaryInformation set</remarks>
/// <see href="https://learn.microsoft.com/en-us/windows/win32/stg/the-documentsummaryinformation-and-userdefined-property-sets"/>
public enum UserDefinedProperty : uint
{
/// <summary>
/// Category - A text string typed by the user that indicates what
/// category the file belongs to (memo, proposal, and so on). It
/// is useful for finding files of same type.
/// </summary>
PIDDSI_CATEGORY = 0x00000002,
/// <summary>
/// PresentationTarget - Target format for presentation (35mm,
/// printer, video, and so on).
/// </summary>
PIDDSI_PRESFORMAT = 0x00000003,
/// <summary>
/// Bytes - Number of bytes.
/// </summary>
PIDDSI_BYTECOUNT = 0x00000004,
/// <summary>
/// Lines - Number of lines.
/// </summary>
PIDDSI_LINECOUNT = 0x00000005,
/// <summary>
/// Paragraphs - Number of paragraphs.
/// </summary>
PIDDSI_PARCOUNT = 0x00000006,
/// <summary>
/// Slides - Number of slides.
/// </summary>
PIDDSI_SLIDECOUNT = 0x00000007,
/// <summary>
/// Notes - Number of pages that contain notes.
/// </summary>
PIDDSI_NOTECOUNT = 0x00000008,
/// <summary>
/// HiddenSlides - Number of slides that are hidden.
/// </summary>
PIDDSI_HIDDENCOUNT = 0x00000009,
/// <summary>
/// MMClips - Number of sound or video clips.
/// </summary>
PIDDSI_MMCLIPCOUNT = 0x0000000A,
/// <summary>
/// ScaleCrop - Set to True (-1) when scaling of the thumbnail
/// is desired. If not set, cropping is desired.
/// </summary>
PIDDSI_SCALE = 0x0000000B,
/// <summary>
/// HeadingPairs - Internally used property indicating the
/// grouping of different document parts and the number of
/// items in each group. The titles of the document parts are
/// stored in the TitlesofParts property. The HeadingPairs
/// property is stored as a vector of variants, in repeating
/// pairs of VT_LPSTR (or VT_LPWSTR) and VT_I4 values. The
/// VT_LPSTR value represents a heading name, and the VT_I4
/// value indicates the count of document parts under that heading.
/// </summary>
PIDDSI_HEADINGPAIR = 0x0000000C,
/// <summary>
/// TitlesofParts - Names of document parts.
/// </summary>
PIDDSI_DOCPARTS = 0x0000000D,
/// <summary>
/// Manager - Manager of the project.
/// </summary>
PIDDSI_MANAGER = 0x0000000E,
/// <summary>
/// Company - Company name.
/// </summary>
PIDDSI_COMPANY = 0x0000000F,
/// <summary>
/// LinksUpToDate - Boolean value to indicate whether the custom
/// links are hampered by excessive noise, for all applications.
/// </summary>
PIDDSI_LINKSDIRTY = 0x00000010,
}
/// <see href="https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-oaut/3fe7db9f-5803-4dc4-9d14-5425d3f5461f"/>
public enum VariantType : ushort
{
/// <summary>
/// The type of the contained field is undefined. When this flag is
/// specified, the VARIANT MUST NOT contain a data field.
/// </summary>
VT_EMPTY = 0x0000,
/// <summary>
/// The type of the contained field is NULL. When this flag is
/// specified, the VARIANT MUST NOT contain a data field.
/// </summary>
VT_NULL = 0x0001,
/// <summary>
/// Either the specified type, or the type of the element or contained
/// field MUST be a 2-byte signed integer.
/// </summary>
VT_I2 = 0x0002,
/// <summary>
/// Either the specified type, or the type of the element or contained
/// field MUST be a 4-byte signed integer.
/// </summary>
VT_I4 = 0x0003,
/// <summary>
/// Either the specified type, or the type of the element or contained
/// field MUST be a 4-byte IEEE floating-point number.
/// </summary>
VT_R4 = 0x0004,
/// <summary>
/// Either the specified type, or the type of the element or contained
/// field MUST be an 8-byte IEEE floating-point number.
/// </summary>
VT_R8 = 0x0005,
/// <summary>
/// Either the specified type, or the type of the element or contained
/// field MUST be CURRENCY.
/// </summary>
VT_CY = 0x0006,
/// <summary>
/// Either the specified type, or the type of the element or contained
/// field MUST be DATE.
/// </summary>
VT_DATE = 0x0007,
/// <summary>
/// Either the specified type, or the type of the element or contained
/// field MUST be BSTR.
/// </summary>
VT_BSTR = 0x0008,
/// <summary>
/// Either the specified type, or the type of the element or contained
/// field MUST be a pointer to IDispatch.
/// </summary>
VT_DISPATCH = 0x0009,
/// <summary>
/// Either the specified type, or the type of the element or contained
/// field MUST be HRESULT.
/// </summary>
VT_ERROR = 0x000A,
/// <summary>
/// Either the specified type, or the type of the element or contained
/// field MUST be VARIANT_BOOL.
/// </summary>
VT_BOOL = 0x000B,
/// <summary>
/// Either the specified type, or the type of the element or contained
/// field MUST be VARIANT. It MUST appear with the bit flag VT_BYREF.
/// </summary>
VT_VARIANT = 0x000C,
/// <summary>
/// Either the specified type, or the type of the element or contained
/// field MUST be a pointer to IUnknown.
/// </summary>
VT_UNKNOWN = 0x000D,
/// <summary>
/// Either the specified type, or the type of the element or contained
/// field MUST be DECIMAL.
/// </summary>
VT_DECIMAL = 0x000E,
/// <summary>
/// Either the specified type, or the type of the element or contained
/// field MUST be a 1-byte integer.
/// </summary>
VT_I1 = 0x0010,
/// <summary>
/// Either the specified type, or the type of the element or contained
/// field MUST be a 1-byte unsigned integer.
/// </summary>
VT_UI1 = 0x0011,
/// <summary>
/// Either the specified type, or the type of the element or contained
/// field MUST be a 2-byte unsigned integer.
/// </summary>
VT_UI2 = 0x0012,
/// <summary>
/// Either the specified type, or the type of the element or contained
/// field MUST be a 4-byte unsigned integer.
/// </summary>
VT_UI4 = 0x0013,
/// <summary>
/// Either the specified type, or the type of the element or contained
/// field MUST be an 8-byte signed integer.
/// </summary>
VT_I8 = 0x0014,
/// <summary>
/// Either the specified type, or the type of the element or contained
/// field MUST be an 8-byte unsigned integer.
/// </summary>
VT_UI8 = 0x0015,
/// <summary>
/// Either the specified type, or the type of the element or contained
/// field MUST be a 4-byte signed integer.
/// </summary>
VT_INT = 0x0016,
/// <summary>
/// Either the specified type, or the type of the element or contained
/// field MUST be a 4-byte unsigned integer.
/// </summary>
VT_UINT = 0x0017,
/// <summary>
/// The specified type MUST be void.
/// </summary>
VT_VOID = 0x0018,
/// <summary>
/// The specified type MUST be HRESULT.
/// </summary>
VT_HRESULT = 0x0019,
/// <summary>
/// The specified type MUST be a unique pointer.
/// </summary>
VT_PTR = 0x001A,
/// <summary>
/// The specified type MUST be SAFEARRAY.
/// </summary>
VT_SAFEARRAY = 0x001B,
/// <summary>
/// The specified type MUST be a fixed-size array.
/// </summary>
VT_CARRAY = 0x001C,
/// <summary>
/// The specified type MUST be user defined.
/// </summary>
VT_USERDEFINED = 0x001D,
/// <summary>
/// The specified type MUST be a NULL-terminated string.
/// </summary>
VT_LPSTR = 0x001E,
/// <summary>
/// The specified type MUST be a zero-terminated string of
/// UNICODE characters.
/// </summary>
VT_LPWSTR = 0x001F,
/// <summary>
/// The type of the element or contained field MUST be a BRECORD.
/// </summary>
VT_RECORD = 0x0024,
/// <summary>
/// The specified type MUST be either a 4-byte or an 8-byte signed
/// integer. The size of the integer is platform specific and
/// determines the system pointer size value.
/// </summary>
VT_INT_PTR = 0x0025,
/// <summary>
/// The specified type MUST be either a 4 byte or an 8 byte unsigned
/// integer. The size of the integer is platform specific and
/// determines the system pointer size value
/// </summary>
VT_UINT_PTR = 0x0026,
/// <summary>
/// The type of the element or contained field MUST be a SAFEARRAY.
/// </summary>
VT_ARRAY = 0x2000,
/// <summary>
/// The type of the element or contained field MUST be a pointer to
/// one of the types listed in the previous rows of this table. If
/// present, this bit flag MUST appear in a VARIANT discriminant
/// with one of the previous flags.
/// </summary>
VT_BYREF = 0x4000
}
}

View File

@@ -1,133 +0,0 @@
using System;
using System.Runtime.InteropServices;
namespace SabreTools.Models.CFB
{
/// <see href="https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-CFB/%5bMS-CFB%5d.pdf"/>
[StructLayout(LayoutKind.Sequential)]
public sealed class FileHeader
{
/// <summary>
/// Iddentification signature for the compound file structure, and MUST be
/// set to the value 0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1.
/// </summary>
public ulong Signature;
/// <summary>
/// Reserved and unused class ID that MUST be set to all zeroes (CLSID_NULL)
/// </summary>
public Guid CLSID;
/// <summary>
/// Version number for nonbreaking changes. This field SHOULD be set to
/// 0x003E if the major version field is either 0x0003 or 0x0004.
/// </summary>
public ushort MinorVersion;
/// <summary>
/// Version number for breaking changes. This field MUST be set to either
/// 0x0003 (version 3) or 0x0004 (version 4).
/// </summary>
public ushort MajorVersion;
/// <summary>
/// This field MUST be set to 0xFFFE. This field is a byte order mark for
/// all integer fields, specifying little-endian byte order.
/// </summary>
public ushort ByteOrder;
/// <summary>
/// This field MUST be set to 0x0009, or 0x000c, depending on the Major
/// Version field. This field specifies the sector size of the compound file
/// as a power of 2.
///
/// If Major Version is 3, the Sector Shift MUST be 0x0009, specifying a
/// sector size of 512 bytes.
///
/// If Major Version is 4, the Sector Shift MUST be 0x000C, specifying a
/// sector size of 4096 bytes.
/// </summary>
public ushort SectorShift;
/// <summary>
/// This field MUST be set to 0x0006. This field specifies the sector size
/// of the Mini Stream as a power of 2. The sector size of the Mini Stream
/// MUST be 64 bytes.
/// </summary>
public ushort MiniSectorShift;
/// <summary>
/// This field MUST be set to all zeroes.
/// </summary>
/// <remarks>6 bytes</remarks>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public byte[]? Reserved;
/// <summary>
/// This integer field contains the count of the number of directory sectors
/// in the compound file.
///
/// If Major Version is 3, the Number of Directory Sectors MUST be zero. This
/// field is not supported for version 3 compound files.
/// </summary>
public uint NumberOfDirectorySectors;
/// <summary>
/// This integer field contains the count of the number of FAT sectors in the
/// compound file.
/// </summary>
public uint NumberOfFATSectors;
/// <summary>
/// This integer field contains the starting sector number for the directory stream.
/// </summary>
public uint FirstDirectorySectorLocation;
/// <summary>
/// This integer field MAY contain a sequence number that is incremented every time
/// the compound file is saved by an implementation that supports file transactions.
/// This is the field that MUST be set to all zeroes if file transactions are not
/// implemented.
/// </summary>
public uint TransactionSignatureNumber;
/// <summary>
/// This integer field MUST be set to 0x00001000. This field specifies the maximum
/// size of a user-defined data stream that is allocated from the mini FAT and mini
/// stream, and that cutoff is 4,096 bytes. Any user-defined data stream that is
/// greater than or equal to this cutoff size must be allocated as normal sectors from
/// the FAT.
/// </summary>
public uint MiniStreamCutoffSize;
/// <summary>
/// This integer field contains the starting sector number for the mini FAT.
/// </summary>
public uint FirstMiniFATSectorLocation;
/// <summary>
/// This integer field contains the count of the number of mini FAT sectors in the
/// compound file.
/// </summary>
public uint NumberOfMiniFATSectors;
/// <summary>
/// This integer field contains the starting sector number for the DIFAT.
/// </summary>
public uint FirstDIFATSectorLocation;
/// <summary>
/// This integer field contains the count of the number of DIFAT sectors in the
/// compound file.
/// </summary>
public uint NumberOfDIFATSectors;
/// <summary>
/// This array of 32-bit integer fields contains the first 109 FAT sector
/// locations of the compound file
/// </summary>
/// <remarks>109 entries</remarks>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 109)]
public SectorNumber[]? DIFAT;
}
}

View File

@@ -1,82 +0,0 @@
using System;
namespace SabreTools.Models.CFB
{
/// <see href="https://github.com/GNOME/msitools/blob/master/libmsi/libmsi-summary-info.c"/>
public sealed class SummaryInformation
{
#region Set Header
/// <summary>
/// This field MUST be set to 0xFFFE. This field is a byte order mark for
/// all integer fields, specifying little-endian byte order.
/// </summary>
public ushort ByteOrder { get; set; }
/// <summary>
/// Format
/// </summary>
public ushort Format { get; set; }
/// <summary>
/// Build
/// </summary>
public ushort Build { get; set; }
/// <summary>
/// Platform ID
/// </summary>
public ushort PlatformID { get; set; }
/// <summary>
/// CLSID
/// </summary>
public Guid CLSID { get; set; }
/// <summary>
/// 4 bytes of reserved data
/// </summary>
public byte[]? Reserved { get; set; }
#endregion
#region Format Header
/// <summary>
/// Format ID, should be <see cref="Constants.FMTID_SummaryInformation"/>
/// </summary>
public Guid FormatID { get; set; }
/// <summary>
/// 16 bytes of unknown data
/// </summary>
public byte[]? Unknown { get; set; }
#endregion
#region Section Header
/// <summary>
/// Location of the section
/// </summary>
public uint Offset { get; set; }
/// <summary>
/// Section count(?)
/// </summary>
public uint SectionCount { get; set; }
/// <summary>
/// Property count
/// </summary>
public uint PropertyCount { get; set; }
/// <summary>
/// Properties
/// </summary>
/// <remarks>Each Variant might be followed by an index and offset value</remarks>
public Variant[]? Properties { get; set; }
#endregion
}
}

View File

@@ -1,45 +0,0 @@
namespace SabreTools.Models.CFB
{
/// <summary>
/// VARIANT is a container for a union that can hold many types of data.
/// </summary>
/// <see href="https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-oaut/b2ee2b50-665e-43e6-a92c-8f2a29fd7add"/>
public sealed class Variant
{
/// <summary>
/// MUST be set to the size, in quad words (64 bits), of the structure.
/// </summary>
public uint Size { get; set; }
/// <summary>
/// MUST be set to 0 and MUST be ignored by the recipient.
/// </summary>
public uint RpcReserved { get; set; }
/// <summary>
/// MUST be set to one of the values specified with a "V".
/// </summary>
public VariantType VariantType { get; set; }
/// <summary>
/// MAY be set to 0 and MUST be ignored by the recipient.
/// </summary>
public ushort Reserved1 { get; set; }
/// <summary>
/// MAY be set to 0 and MUST be ignored by the recipient.
/// </summary>
public ushort Reserved2 { get; set; }
/// <summary>
/// MAY be set to 0 and MUST be ignored by the recipient.
/// </summary>
public ushort Reserved3 { get; set; }
/// <summary>
/// MUST contain an instance of the type, according to the value
/// in the <see cref="VariantType"/> field.
/// </summary>
public object? Union { get; set; }
}
}

View File

@@ -1,31 +0,0 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.CHD
{
/// <see href="https://github.com/mamedev/mame/blob/master/src/lib/util/chd.h"/>
[StructLayout(LayoutKind.Sequential)]
public sealed class CompressedMapEntryV5
{
/// <summary>
/// Compression type
/// </summary>
public byte Compression;
/// <summary>
/// Compressed length
/// </summary>
/// <remarks>Actually UInt24</remarks>
public uint CompLength;
/// <summary>
/// Offset
/// </summary>
/// <remarks>Actually UInt48</remarks>
public ulong Offset;
/// <summary>
/// CRC-16 of the data
/// </summary>
public ushort CRC;
}
}

View File

@@ -1,45 +0,0 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.CHD
{
/// <see href="https://github.com/mamedev/mame/blob/master/src/lib/util/chd.h"/>
[StructLayout(LayoutKind.Sequential)]
public sealed class CompressedMapHeaderV5
{
/// <summary>
/// Length of compressed map
/// </summary>
public uint Length;
/// <summary>
/// Offset of first block
/// </summary>
/// <remarks>Actually UInt48</remarks>
public ulong DataStart;
/// <summary>
/// CRC-16 of the map
/// </summary>
public ushort CRC;
/// <summary>
/// Bits used to encode complength
/// </summary>
public byte LengthBits;
/// <summary>
/// Bits used to encode self-refs
/// </summary>
public byte HunkBits;
/// <summary>
/// Bits used to encode parent unit refs
/// </summary>
public byte ParentUnitBits;
/// <summary>
/// Future use
/// </summary>
public byte Reserved;
}
}

View File

@@ -1,23 +0,0 @@
namespace SabreTools.Models.CHD
{
public static class Constants
{
public const string SignatureString = "MComprHD";
#region Header Sizes
public const int HeaderV1Size = 76;
public const int HeaderV2Size = 80;
public const int HeaderV3Size = 120;
public const int HeaderV4Size = 108;
public const int HeaderV5Size = 124;
#endregion
#region Metadata Parameters
public const uint CHDMETAINDEX_APPEND = uint.MaxValue;
#endregion
}
}

View File

@@ -1,358 +0,0 @@
using System;
namespace SabreTools.Models.CHD
{
/// <see href="https://github.com/mamedev/mame/blob/master/src/lib/util/chdcodec.h"/>
public enum AVHuffCodec
{
DECOMPRESS_CONFIG = 1,
}
/// <see href="https://github.com/mamedev/mame/blob/master/src/lib/util/chdcodec.h"/>
public enum CodecType : uint
{
CHD_CODEC_NONE = 0,
#region General Codecs
/// <remarks>"zlib"</remarks>
ZLIB = 0x7a6c6962,
/// <remarks>"zstd"</remarks>
ZSTD = 0x7a737464,
/// <remarks>"lzma"</remarks>
LZMA = 0x6c7a6d61,
/// <remarks>"huff"</remarks>
HUFFMAN = 0x68756666,
/// <remarks>"flac"</remarks>
FLAC = 0x666c6163,
#endregion
#region General Codecs with CD Frontend
/// <remarks>"cdzl"</remarks>
CD_ZLIB = 0x63647a6c,
/// <remarks>"cdzs"</remarks>
CD_ZSTD = 0x63647a73,
/// <remarks>"cdlz"</remarks>
CD_LZMA = 0x63646c7a,
/// <remarks>"cdfl"</remarks>
CD_FLAC = 0x6364666c,
#endregion
#region A/V Codecs
/// <remarks>"avhu"</remarks>
AVHUFF = 0x61766875,
#endregion
#region Pseudo-Codecs Returned by hunk_info
/// <summary>
/// Copy of another hunk
/// </summary>
CHD_CODEC_SELF = 1,
/// <summary>
/// Copy of a parent's hunk
/// </summary>
CHD_CODEC_PARENT = 2,
/// <summary>
/// Legacy "mini" 8-byte repeat
/// </summary>
CHD_CODEC_MINI = 3,
#endregion
}
/// <see href="https://github.com/mamedev/mame/blob/master/src/lib/util/chd.h"/>
public enum CompressionType : uint
{
#region V1
CHDCOMPRESSION_NONE = 0,
CHDCOMPRESSION_ZLIB = 1,
#endregion
#region V3
CHDCOMPRESSION_ZLIB_PLUS = 2,
#endregion
#region V4
CHDCOMPRESSION_AV = 3,
#endregion
}
/// <see href="https://github.com/mamedev/mame/blob/master/src/lib/util/chd.h"/>
public enum Error : uint
{
NO_INTERFACE = 1,
NOT_OPEN,
ALREADY_OPEN,
INVALID_FILE,
INVALID_DATA,
REQUIRES_PARENT,
FILE_NOT_WRITEABLE,
CODEC_ERROR,
INVALID_PARENT,
HUNK_OUT_OF_RANGE,
DECOMPRESSION_ERROR,
COMPRESSION_ERROR,
CANT_VERIFY,
METADATA_NOT_FOUND,
INVALID_METADATA_SIZE,
UNSUPPORTED_VERSION,
VERIFY_INCOMPLETE,
INVALID_METADATA,
INVALID_STATE,
OPERATION_PENDING,
UNSUPPORTED_FORMAT,
UNKNOWN_COMPRESSION,
WALKING_PARENT,
COMPRESSING
}
/// <see href="https://github.com/mamedev/mame/blob/master/src/lib/util/chd.h"/>
[Flags]
public enum Flags : uint
{
/// <summary>
/// Set if this drive has a parent
/// </summary>
DriveHasParent = 0x00000001,
/// <summary>
/// Set if this drive allows writes
/// </summary>
DriveAllowsWrites = 0x00000002,
}
/// <see href="https://github.com/mamedev/mame/blob/master/src/lib/util/chd.h"/>
[Flags]
public enum MetadataFlags : byte
{
/// <summary>
/// Indicates data is checksummed
/// </summary>
CHD_MDFLAGS_CHECKSUM = 0x01,
}
/// <see href="https://github.com/mamedev/mame/blob/master/src/lib/util/chd.h"/>
public enum MetadataTag : uint
{
CHDMETATAG_WILDCARD = 0,
#region Hard Disk
/// <summary>
/// Standard hard disk metadata
/// </summary>
/// <remarks>"GDDD"</remarks>
HARD_DISK_METADATA_TAG = 0x47444444,
/// <summary>
/// Hard disk identify information
/// </summary>
/// <remarks>"IDNT"</remarks>
HARD_DISK_IDENT_METADATA_TAG = 0x49444e54,
/// <summary>
/// Hard disk key information
/// </summary>
/// <remarks>"KEY "</remarks>
HARD_DISK_KEY_METADATA_TAG = 0x4b455920,
#endregion
#region PCMCIA
/// <summary>
/// PCMCIA CIS information
/// </summary>
/// <remarks>"CIS "</remarks>
PCMCIA_CIS_METADATA_TAG = 0x43495320,
#endregion
#region CD-ROM
/// <remarks>"CHCD"</remarks>
CDROM_OLD_METADATA_TAG = 0x43484344,
/// <remarks>"CHTR"</remarks>
CDROM_TRACK_METADATA_TAG = 0x43485452,
/// <remarks>"CHT2"</remarks>
CDROM_TRACK_METADATA2_TAG = 0x43485432,
#endregion
#region GD-ROM
/// <remarks>"CHGT"</remarks>
GDROM_OLD_METADATA_TAG = 0x43484754,
/// <remarks>"CHGD"</remarks>
GDROM_TRACK_METADATA_TAG = 0x43484744,
#endregion
#region DVD
/// <summary>
/// Standard DVD metadata
/// </summary>
/// <remarks>"DVD "</remarks>
DVD_METADATA_TAG = 0x44564420,
#endregion
#region A/V
/// <summary>
/// Standard A/V metadata
/// </summary>
/// <remarks>"AVAV"</remarks>
AV_METADATA_TAG = 0x41564156,
/// <summary>
/// A/V laserdisc frame metadata
/// </summary>
/// <remarks>"AVLD"</remarks>
AV_LD_METADATA_TAG = 0x41564c44,
#endregion
}
/// <see href="https://github.com/mamedev/mame/blob/master/src/lib/util/chd.cpp"/>
public enum V34EntryType : uint
{
/// <summary>
/// Invalid type
/// </summary>
V34_MAP_ENTRY_TYPE_INVALID = 0,
/// <summary>
/// Standard compression
/// </summary>
V34_MAP_ENTRY_TYPE_COMPRESSED = 1,
/// <summary>
/// Uncompressed data
/// </summary>
V34_MAP_ENTRY_TYPE_UNCOMPRESSED = 2,
/// <summary>
/// Mini: use offset as raw data
/// </summary>
V34_MAP_ENTRY_TYPE_MINI = 3,
/// <summary>
/// Same as another hunk in this file
/// </summary>
V34_MAP_ENTRY_TYPE_SELF_HUNK = 4,
/// <summary>
/// Same as a hunk in the parent file
/// </summary>
V34_MAP_ENTRY_TYPE_PARENT_HUNK = 5,
/// <summary>
/// Compressed with secondary algorithm (usually FLAC CDDA)
/// </summary>
V34_MAP_ENTRY_TYPE_2ND_COMPRESSED = 6,
}
/// <see href="https://github.com/mamedev/mame/blob/master/src/lib/util/chd.cpp"/>
public enum V5CompressionType : uint
{
// These types are live when running
/// <summary>
/// Codec #0
/// </summary>
COMPRESSION_TYPE_0 = 0,
/// <summary>
/// Codec #1
/// </summary>
COMPRESSION_TYPE_1 = 1,
/// <summary>
/// Codec #2
/// </summary>
COMPRESSION_TYPE_2 = 2,
/// <summary>
/// Codec #3
/// </summary>
COMPRESSION_TYPE_3 = 3,
/// <summary>
/// No compression; implicit length = hunkbytes
/// </summary>
COMPRESSION_NONE = 4,
/// <summary>
/// Same as another block in this CHD
/// </summary>
COMPRESSION_SELF = 5,
/// <summary>
/// Same as a hunk's worth of units in the parent CHD
/// </summary>
COMPRESSION_PARENT = 6,
// These additional pseudo-types are used for compressed encodings
/// <summary>
/// Start of small RLE run (4-bit length)
/// </summary>
COMPRESSION_RLE_SMALL,
/// <summary>
/// Start of large RLE run (8-bit length)
/// </summary>
COMPRESSION_RLE_LARGE,
/// <summary>
/// Same as the last COMPRESSION_SELF block
/// </summary>
COMPRESSION_SELF_0,
/// <summary>
/// Same as the last COMPRESSION_SELF block + 1
/// </summary>
COMPRESSION_SELF_1,
/// <summary>
/// Same block in the parent
/// </summary>
COMPRESSION_PARENT_SELF,
/// <summary>
/// Same as the last COMPRESSION_PARENT block
/// </summary>
COMPRESSION_PARENT_0,
/// <summary>
/// Same as the last COMPRESSION_PARENT block + 1
/// </summary>
COMPRESSION_PARENT_1
}
}

View File

@@ -1,25 +0,0 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.CHD
{
/// <see href="https://github.com/mamedev/mame/blob/master/src/lib/util/chd.h"/>
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public abstract class Header
{
/// <summary>
/// 'MComprHD'
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
public string? Tag;
/// <summary>
/// Length of header (including tag and length fields)
/// </summary>
public uint Length;
/// <summary>
/// Drive format version
/// </summary>
public uint Version;
}
}

View File

@@ -1,58 +0,0 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.CHD
{
/// <see href="https://github.com/mamedev/mame/blob/master/src/lib/util/chd.h"/>
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public class HeaderV1 : Header
{
/// <summary>
/// Flags
/// </summary>
[MarshalAs(UnmanagedType.U4)]
public Flags Flags;
/// <summary>
/// Compression type
/// </summary>
[MarshalAs(UnmanagedType.U4)]
public CompressionType Compression;
/// <summary>
/// 512-byte sectors per hunk
/// </summary>
public uint HunkSize;
/// <summary>
/// Total # of hunks represented
/// </summary>
public uint TotalHunks;
/// <summary>
/// Number of cylinders on hard disk
/// </summary>
public uint Cylinders;
/// <summary>
/// Number of heads on hard disk
/// </summary>
public uint Heads;
/// <summary>
/// Number of sectors on hard disk
/// </summary>
public uint Sectors;
/// <summary>
/// MD5 checksum of raw data
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] MD5 = new byte[16];
/// <summary>
/// MD5 checksum of parent file
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] ParentMD5 = new byte[16];
}
}

View File

@@ -1,63 +0,0 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.CHD
{
/// <see href="https://github.com/mamedev/mame/blob/master/src/lib/util/chd.h"/>
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public class HeaderV2 : Header
{
/// <summary>
/// Flags
/// </summary>
[MarshalAs(UnmanagedType.U4)]
public Flags Flags;
/// <summary>
/// Compression type
/// </summary>
[MarshalAs(UnmanagedType.U4)]
public CompressionType Compression;
/// <summary>
/// Seclen-byte sectors per hunk
/// </summary>
public uint HunkSize;
/// <summary>
/// Total # of hunks represented
/// </summary>
public uint TotalHunks;
/// <summary>
/// Number of cylinders on hard disk
/// </summary>
public uint Cylinders;
/// <summary>
/// Number of heads on hard disk
/// </summary>
public uint Heads;
/// <summary>
/// Number of sectors on hard disk
/// </summary>
public uint Sectors;
/// <summary>
/// MD5 checksum of raw data
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[]? MD5 = new byte[16];
/// <summary>
/// MD5 checksum of parent file
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[]? ParentMD5 = new byte[16];
/// <summary>
/// Number of bytes per sector
/// </summary>
public uint BytesPerSector;
}
}

View File

@@ -1,65 +0,0 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.CHD
{
/// <see href="https://github.com/mamedev/mame/blob/master/src/lib/util/chd.h"/>
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public class HeaderV3 : Header
{
/// <summary>
/// Flags
/// </summary>
[MarshalAs(UnmanagedType.U4)]
public Flags Flags;
/// <summary>
/// Compression type
/// </summary>
[MarshalAs(UnmanagedType.U4)]
public CompressionType Compression;
/// <summary>
/// Total # of hunks represented
/// </summary>
public uint TotalHunks;
/// <summary>
/// Logical size of the data (in bytes)
/// </summary>
public ulong LogicalBytes;
/// <summary>
/// Offset to the first blob of metadata
/// </summary>
public ulong MetaOffset;
/// <summary>
/// MD5 checksum of raw data
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[]? MD5 = new byte[16];
/// <summary>
/// MD5 checksum of parent file
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[]? ParentMD5 = new byte[16];
/// <summary>
/// Number of bytes per hunk
/// </summary>
public uint HunkBytes;
/// <summary>
/// SHA1 checksum of raw data
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public byte[]? SHA1 = new byte[20];
/// <summary>
/// SHA1 checksum of parent file
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public byte[]? ParentSHA1 = new byte[20];
}
}

View File

@@ -1,59 +0,0 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.CHD
{
/// <see href="https://github.com/mamedev/mame/blob/master/src/lib/util/chd.h"/>
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public class HeaderV4 : Header
{
/// <summary>
/// Flags
/// </summary>
[MarshalAs(UnmanagedType.U4)]
public Flags Flags;
/// <summary>
/// Compression type
/// </summary>
[MarshalAs(UnmanagedType.U4)]
public CompressionType Compression;
/// <summary>
/// Total # of hunks represented
/// </summary>
public uint TotalHunks;
/// <summary>
/// Logical size of the data (in bytes)
/// </summary>
public ulong LogicalBytes;
/// <summary>
/// Offset to the first blob of metadata
/// </summary>
public ulong MetaOffset;
/// <summary>
/// Number of bytes per hunk
/// </summary>
public uint HunkBytes;
/// <summary>
/// Combined raw+meta SHA1
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public byte[]? SHA1 = new byte[20];
/// <summary>
/// Combined raw+meta SHA1 of parent
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public byte[]? ParentSHA1 = new byte[20];
/// <summary>
/// Raw data SHA1
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public byte[]? RawSHA1 = new byte[20];
}
}

View File

@@ -1,54 +0,0 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.CHD
{
/// <see href="https://github.com/mamedev/mame/blob/master/src/lib/util/chd.h"/>
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public class HeaderV5 : Header
{
/// <summary>
/// Which custom compressors are used?
/// </summary>
public CodecType[] Compressors { get; set; } = new CodecType[4];
/// <summary>
/// Logical size of the data (in bytes)
/// </summary>
public ulong LogicalBytes { get; set; }
/// <summary>
/// Offset to the map
/// </summary>
public ulong MapOffset { get; set; }
/// <summary>
/// Offset to the first blob of metadata
/// </summary>
public ulong MetaOffset { get; set; }
/// <summary>
/// Number of bytes per hunk (512k maximum)
/// </summary>
public uint HunkBytes { get; set; }
/// <summary>
/// Number of bytes per unit within each hunk
/// </summary>
public uint UnitBytes { get; set; }
/// <summary>
/// Raw data SHA1
/// </summary>
public byte[]? RawSHA1 { get; set; }
/// <summary>
/// Combined raw+meta SHA1
/// </summary>
public byte[]? SHA1 { get; set; }
/// <summary>
/// Combined raw+meta SHA1 of parent
/// </summary>
public byte[]? ParentSHA1 { get; set; }
}
}

View File

@@ -1,19 +0,0 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.CHD
{
/// <see href="https://github.com/mamedev/mame/blob/master/src/lib/util/chd.h"/>
[StructLayout(LayoutKind.Sequential)]
public sealed class MapV1
{
/// <summary>
/// Starting offset within the file
/// </summary>
public ulong StartingOffset;
/// <summary>
/// Length of data; If == hunksize, data is uncompressed
/// </summary>
public ulong Length;
}
}

View File

@@ -1,34 +0,0 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.CHD
{
/// <see href="https://github.com/mamedev/mame/blob/master/src/lib/util/chd.h"/>
[StructLayout(LayoutKind.Sequential)]
public sealed class MapV3
{
/// <summary>
/// Starting offset within the file
/// </summary>
public ulong StartingOffset;
/// <summary>
/// 32-bit CRC of the uncompressed data
/// </summary>
public uint CRC32;
/// <summary>
/// Lower 16 bits of length
/// </summary>
public ushort LengthLo;
/// <summary>
/// Upper 8 bits of length
/// </summary>
public byte LengthHi;
/// <summary>
/// Flags, indicating compression info
/// </summary>
public byte Flags;
}
}

View File

@@ -1,39 +0,0 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.CHD
{
/// <see href="https://github.com/mamedev/mame/blob/master/src/lib/util/chd.cpp"/>
[StructLayout(LayoutKind.Sequential)]
public sealed class MetadataEntry
{
/// <summary>
/// Offset within the file of the header
/// </summary>
public ulong Offset;
/// <summary>
/// Offset within the file of the next header
/// </summary>
public ulong Next;
/// <summary>
/// Offset within the file of the previous header
/// </summary>
public ulong Prev;
/// <summary>
/// Length of the metadata
/// </summary>
public uint Length;
/// <summary>
/// Metadata tag
/// </summary>
public MetadataTag Metatag;
/// <summary>
/// Flag bits
/// </summary>
public MetadataFlags Flags;
}
}

View File

@@ -1,20 +0,0 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.CHD
{
/// <see href="https://github.com/mamedev/mame/blob/master/src/lib/util/chd.cpp"/>
[StructLayout(LayoutKind.Sequential)]
public sealed class MetadataHash
{
/// <summary>
/// Tag of the metadata in big-endian
/// </summary>
public MetadataTag Tag;
/// <summary>
/// Hash data
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public byte[]? SHA1;
}
}

View File

@@ -1,14 +0,0 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.CHD
{
/// <see href="https://github.com/mamedev/mame/blob/master/src/lib/util/chd.h"/>
[StructLayout(LayoutKind.Sequential)]
public class UncompressedMapV5
{
/// <summary>
/// Starting offset / hunk size
/// </summary>
public uint StartingOffset;
}
}

View File

@@ -0,0 +1,20 @@
namespace SabreTools.Models.COFF
{
public static class Constants
{
/// <summary>
/// Fixed size of <see cref="FileHeader"/>
/// </summary>
public const int FileHeaderSize = 20;
/// <summary>
/// Fixed size of <see cref="SectionHeader"/>
/// </summary>
public const int SectionHeaderSize = 40;
/// <summary>
/// Fixed size of <see cref="SymbolTableEntries.BaseEntry"/>
/// </summary>
public const int SymbolTableEntrySize = 18;
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.PortableExecutable
namespace SabreTools.Models.COFF
{
/// <summary>
/// At the beginning of an object file, or immediately after the signature
@@ -9,7 +9,7 @@ namespace SabreTools.Models.PortableExecutable
/// </summary>
/// <see href="https://learn.microsoft.com/en-us/windows/win32/debug/pe-format"/>
[StructLayout(LayoutKind.Sequential)]
public sealed class COFFFileHeader
public sealed class FileHeader
{
/// <summary>
/// The number that identifies the type of target machine.

View File

@@ -1,6 +1,6 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.PortableExecutable
namespace SabreTools.Models.COFF
{
/// <summary>
/// COFF line numbers are no longer produced and, in the future, will
@@ -17,7 +17,7 @@ namespace SabreTools.Models.PortableExecutable
/// </summary>
/// <see href="https://learn.microsoft.com/en-us/windows/win32/debug/pe-format"/>
[StructLayout(LayoutKind.Explicit)]
public sealed class COFFLineNumber
public sealed class LineNumber
{
/// <summary>
/// Used when Linenumber is zero: index to symbol table entry for a function.

View File

@@ -0,0 +1,88 @@
namespace SabreTools.Models.COFF
{
/// <summary>
/// Every image file has an optional header that provides information to the loader.
/// This header is optional in the sense that some files (specifically, object files)
/// do not have it. For image files, this header is required. An object file can have
/// an optional header, but generally this header has no function in an object file
/// except to increase its size.
///
/// Note that the size of the optional header is not fixed. The SizeOfOptionalHeader
/// field in the COFF header must be used to validate that a probe into the file for
/// a particular data directory does not go beyond SizeOfOptionalHeader.
///
/// The NumberOfRvaAndSizes field of the optional header should also be used to ensure
/// that no probe for a particular data directory entry goes beyond the optional header.
/// In addition, it is important to validate the optional header magic number for format
/// compatibility.
///
/// The optional header magic number determines whether an image is a PE32 or
/// PE32+ executable.
///
/// PE32+ images allow for a 64-bit address space while limiting the image size to
/// 2 gigabytes. Other PE32+ modifications are addressed in their respective sections.
///
/// The first eight fields of the optional header are standard fields that are defined
/// for every implementation of COFF. These fields contain general information that is
/// useful for loading and running an executable file. They are unchanged for the
/// PE32+ format.
/// </summary>
/// <see href="https://learn.microsoft.com/en-us/windows/win32/debug/pe-format"/>
public class OptionalHeader
{
/// <summary>
/// The unsigned integer that identifies the state of the image file. The most
/// common number is 0x10B, which identifies it as a normal executable file.
/// 0x107 identifies it as a ROM image, and 0x20B identifies it as a PE32+ executable.
/// </summary>
public OptionalHeaderMagicNumber Magic { get; set; }
/// <summary>
/// The linker major version number.
/// </summary>
public byte MajorLinkerVersion { get; set; }
/// <summary>
/// The linker minor version number.
/// </summary>
public byte MinorLinkerVersion { get; set; }
/// <summary>
/// The size of the code (text) section, or the sum of all code sections if there
/// are multiple sections.
/// </summary>
public uint SizeOfCode { get; set; }
/// <summary>
/// The size of the initialized data section, or the sum of all such sections if
/// there are multiple data sections.
/// </summary>
public uint SizeOfInitializedData { get; set; }
/// <summary>
/// The size of the uninitialized data section (BSS), or the sum of all such sections
/// if there are multiple BSS sections.
/// </summary>
public uint SizeOfUninitializedData { get; set; }
/// <summary>
/// The address of the entry point relative to the image base when the executable file
/// is loaded into memory. For program images, this is the starting address. For
/// device drivers, this is the address of the initialization function. An entry point
/// is optional for DLLs. When no entry point is present, this field must be zero.
/// </summary>
public uint AddressOfEntryPoint { get; set; }
/// <summary>
/// The address that is relative to the image base of the beginning-of-code section when
/// it is loaded into memory.
/// </summary>
public uint BaseOfCode { get; set; }
/// <summary>
/// The address that is relative to the image base of the beginning-of-data section when
/// it is loaded into memory.
/// </summary>
public uint BaseOfData { get; set; }
}
}

View File

@@ -1,6 +1,6 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.PortableExecutable
namespace SabreTools.Models.COFF
{
/// <summary>
/// Object files contain COFF relocations, which specify how the section data
@@ -18,7 +18,7 @@ namespace SabreTools.Models.PortableExecutable
/// </summary>
/// <see href="https://learn.microsoft.com/en-us/windows/win32/debug/pe-format"/>
[StructLayout(LayoutKind.Sequential)]
public sealed class COFFRelocation
public sealed class Relocation
{
/// <summary>
/// The address of the item to which relocation is applied. This is the

View File

@@ -1,4 +1,4 @@
namespace SabreTools.Models.PortableExecutable
namespace SabreTools.Models.COFF
{
/// <summary>
/// Each row of the section table is, in effect, a section header. This table
@@ -29,7 +29,8 @@
/// characters. Long names in object files are truncated if they are emitted
/// to an executable file.
/// </summary>
public byte[]? Name { get; set; } = new byte[8];
/// <remarks>8 bytes</remarks>
public byte[]? Name { get; set; }
/// <summary>
/// The total size of the section when loaded into memory. If this value is
@@ -100,11 +101,11 @@
/// <summary>
/// COFF Relocations (Object Only)
/// </summary>
public COFFRelocation?[]? COFFRelocations { get; set; }
public Relocation[]? COFFRelocations { get; set; }
/// <summary>
/// COFF Line Numbers (Deprecated)
/// </summary>
public COFFLineNumber?[]? COFFLineNumbers { get; set; }
public LineNumber[]? COFFLineNumbers { get; set; }
}
}

View File

@@ -1,4 +1,4 @@
namespace SabreTools.Models.PortableExecutable
namespace SabreTools.Models.COFF
{
/// <summary>
/// Immediately following the COFF symbol table is the COFF string table. The
@@ -6,7 +6,7 @@
/// COFF header and adding the number of symbols multiplied by the size of a symbol.
/// </summary>
/// <see href="https://learn.microsoft.com/en-us/windows/win32/debug/pe-format"/>
public sealed class COFFStringTable
public sealed class StringTable
{
/// <summary>
/// At the beginning of the COFF string table are 4 bytes that contain the

View File

@@ -0,0 +1,32 @@
namespace SabreTools.Models.COFF.SymbolTableEntries
{
/// <summary>
/// The symbol table in this section is inherited from the traditional
/// COFF format. It is distinct from Microsoft Visual C++ debug information.
/// A file can contain both a COFF symbol table and Visual C++ debug
/// information, and the two are kept separate. Some Microsoft tools use
/// the symbol table for limited but important purposes, such as
/// communicating COMDAT information to the linker. Section names and file
/// names, as well as code and data symbols, are listed in the symbol table.
///
/// The location of the symbol table is indicated in the COFF header.
///
/// The symbol table is an array of records, each 18 bytes long. Each record
/// is either a standard or auxiliary symbol-table record. A standard record
/// defines a symbol or name.
///
/// Auxiliary symbol table records always follow, and apply to, some standard
/// symbol table record. An auxiliary record can have any format that the tools
/// can recognize, but 18 bytes must be allocated for them so that symbol table
/// is maintained as an array of regular size. Currently, Microsoft tools
/// recognize auxiliary formats for the following kinds of records: function
/// definitions, function begin and end symbols (.bf and .ef), weak externals,
/// file names, and section definitions.
///
/// The traditional COFF design also includes auxiliary-record formats for arrays
/// and structures.Microsoft tools do not use these, but instead place that
/// symbolic information in Visual C++ debug format in the debug sections.
/// </summary>
/// <see href="https://learn.microsoft.com/en-us/windows/win32/debug/pe-format"/>
public abstract class BaseEntry { }
}

View File

@@ -0,0 +1,33 @@
namespace SabreTools.Models.COFF.SymbolTableEntries
{
/// <summary>
/// Auxiliary Format 6: CLR Token Definition (Object Only)
///
/// This auxiliary symbol generally follows the IMAGE_SYM_CLASS_CLR_TOKEN. It is
/// used to associate a token with the COFF symbol table's namespace.
/// </summary>
/// <see href="https://learn.microsoft.com/en-us/windows/win32/debug/pe-format"/>
public class CLRTokenDefinition : BaseEntry
{
/// <summary>
/// Must be IMAGE_AUX_SYMBOL_TYPE_TOKEN_DEF (1).
/// </summary>
public byte AuxType { get; set; }
/// <summary>
/// Reserved, must be zero.
/// </summary>
public byte Reserved1 { get; set; }
/// <summary>
/// The symbol index of the COFF symbol to which this CLR token definition refers.
/// </summary>
public uint SymbolTableIndex { get; set; }
/// <summary>
/// Reserved, must be zero.
/// </summary>
/// <remarks>12 bytes</remarks>
public byte[]? Reserved2 { get; set; }
}
}

View File

@@ -0,0 +1,53 @@
namespace SabreTools.Models.COFF.SymbolTableEntries
{
/// <summary>
/// Auxiliary Format 2: .bf and .ef Symbols
///
/// For each function definition in the symbol table, three items describe
/// the beginning, ending, and number of lines. Each of these symbols has
/// storage class FUNCTION (101):
///
/// A symbol record named .bf (begin function). The Value field is unused.
///
/// A symbol record named .lf (lines in function). The Value field gives the
/// number of lines in the function.
///
/// A symbol record named .ef (end of function). The Value field has the same
/// number as the Total Size field in the function-definition symbol record.
///
// The .bf and .ef symbol records (but not .lf records) are followed by an
// auxiliary record with the following format:
/// </summary>
/// <see href="https://learn.microsoft.com/en-us/windows/win32/debug/pe-format"/>
public class Descriptor : BaseEntry
{
/// <summary>
/// Unused
/// </summary>
public uint Unused1 { get; set; }
/// <summary>
/// The actual ordinal line number (1, 2, 3, and so on) within the source file,
/// corresponding to the .bf or .ef record.
/// </summary>
public ushort Linenumber { get; set; }
/// <summary>
/// Unused
/// </summary>
/// <remarks>6 bytes</remarks>
public byte[]? Unused2 { get; set; }
/// <summary>
/// The symbol-table index of the next .bf symbol record. If the function is the
/// last in the symbol table, this field is set to zero. It is not used for
/// .ef records.
/// </summary>
public uint PointerToNextFunction { get; set; }
/// <summary>
/// Unused
/// </summary>
public ushort Unused3 { get; set; }
}
}

View File

@@ -0,0 +1,20 @@
namespace SabreTools.Models.COFF.SymbolTableEntries
{
/// <summary>
/// Auxiliary Format 4: Files
///
/// This format follows a symbol-table record with storage class FILE (103).
/// The symbol name itself should be .file, and the auxiliary record that
/// follows it gives the name of a source-code file.
/// </summary>
/// <see href="https://learn.microsoft.com/en-us/windows/win32/debug/pe-format"/>
public class FileRecord : BaseEntry
{
/// <summary>
/// An ANSI string that gives the name of the source file. This is padded
/// with nulls if it is less than the maximum length.
/// </summary>
/// <remarks>18 bytes</remarks>
public byte[]? FileName { get; set; }
}
}

View File

@@ -0,0 +1,47 @@
namespace SabreTools.Models.COFF.SymbolTableEntries
{
/// <summary>
/// Auxiliary Format 1: Function Definitions
///
/// A symbol table record marks the beginning of a function definition if it
/// has all of the following: a storage class of EXTERNAL (2), a Type value
/// that indicates it is a function (0x20), and a section number that is
/// greater than zero. Note that a symbol table record that has a section
/// number of UNDEFINED (0) does not define the function and does not have
/// an auxiliary record. Function-definition symbol records are followed by
/// an auxiliary record in the format described below:
/// </summary>
/// <see href="https://learn.microsoft.com/en-us/windows/win32/debug/pe-format"/>
public class FunctionDefinition : BaseEntry
{
/// <summary>
/// The symbol-table index of the corresponding .bf (begin function)
/// symbol record.
/// </summary>
public uint TagIndex { get; set; }
/// <summary>
/// The size of the executable code for the function itself. If the function
/// is in its own section, the SizeOfRawData in the section header is greater
/// or equal to this field, depending on alignment considerations.
/// </summary>
public uint TotalSize { get; set; }
/// <summary>
/// The file offset of the first COFF line-number entry for the function, or
/// zero if none exists.
/// </summary>
public uint PointerToLinenumber { get; set; }
/// <summary>
/// The symbol-table index of the record for the next function. If the function
/// is the last in the symbol table, this field is set to zero.
/// </summary>
public uint PointerToNextFunction { get; set; }
/// <summary>
/// Unused
/// </summary>
public ushort Unused { get; set; }
}
}

View File

@@ -0,0 +1,54 @@
namespace SabreTools.Models.COFF.SymbolTableEntries
{
/// <summary>
/// Auxiliary Format 5: Section Definitions
///
/// This format follows a symbol-table record that defines a section. Such a
/// record has a symbol name that is the name of a section (such as .text or
/// .drectve) and has storage class STATIC (3). The auxiliary record provides
/// information about the section to which it refers. Thus, it duplicates some
/// of the information in the section header.
/// </summary>
/// <see href="https://learn.microsoft.com/en-us/windows/win32/debug/pe-format"/>
public class SectionDefinition : BaseEntry
{
/// <summary>
/// The size of section data; the same as SizeOfRawData in the section header.
/// </summary>
public uint Length { get; set; }
/// <summary>
/// The number of relocation entries for the section.
/// </summary>
public ushort NumberOfRelocations { get; set; }
/// <summary>
/// The number of line-number entries for the section.
/// </summary>
public ushort NumberOfLinenumbers { get; set; }
/// <summary>
/// The checksum for communal data. It is applicable if the IMAGE_SCN_LNK_COMDAT
/// flag is set in the section header.
/// </summary>
public uint CheckSum { get; set; }
/// <summary>
/// One-based index into the section table for the associated section. This is
/// used when the COMDAT selection setting is 5.
/// </summary>
public ushort Number { get; set; }
/// <summary>
/// The COMDAT selection number. This is applicable if the section is a
/// COMDAT section.
/// </summary>
public byte Selection { get; set; }
/// <summary>
/// Unused
/// </summary>
/// <remarks>3 bytes</remarks>
public byte[]? Unused { get; set; }
}
}

View File

@@ -0,0 +1,58 @@
namespace SabreTools.Models.COFF.SymbolTableEntries
{
/// <summary>
/// A standard record defines a symbol or name.
/// </summary>
/// <see href="https://learn.microsoft.com/en-us/windows/win32/debug/pe-format"/>
public class StandardRecord : BaseEntry
{
#region Symbol Name
/// <summary>
/// An array of 8 bytes. This array is padded with nulls on the right if
/// the name is less than 8 bytes long.
/// </summary>
public byte[]? ShortName { get; set; } = new byte[8];
/// <summary>
/// A field that is set to all zeros if the name is longer than 8 bytes.
/// </summary>
public uint Zeroes { get; set; }
/// <summary>
/// An offset into the string table.
/// </summary>
public uint Offset { get; set; }
#endregion
/// <summary>
/// The value that is associated with the symbol. The interpretation of this
/// field depends on SectionNumber and StorageClass. A typical meaning is the
/// relocatable address.
/// </summary>
public uint Value { get; set; }
/// <summary>
/// The signed integer that identifies the section, using a one-based index
/// into the section table. Some values have special meaning.
/// </summary>
public SectionNumber SectionNumber { get; set; }
/// <summary>
/// A number that represents type. Microsoft tools set this field to 0x20
/// (function) or 0x0 (not a function).
/// </summary>
public SymbolType SymbolType { get; set; }
/// <summary>
/// An enumerated value that represents storage class.
/// </summary>
public StorageClass StorageClass { get; set; }
/// <summary>
/// The number of auxiliary symbol table entries that follow this record.
/// </summary>
public byte NumberOfAuxSymbols { get; set; }
}
}

View File

@@ -0,0 +1,45 @@
namespace SabreTools.Models.COFF.SymbolTableEntries
{
/// <summary>
/// Auxiliary Format 3: Weak Externals
///
/// "Weak externals" are a mechanism for object files that allows flexibility at
/// link time. A module can contain an unresolved external symbol (sym1), but it
/// can also include an auxiliary record that indicates that if sym1 is not
/// present at link time, another external symbol (sym2) is used to resolve
/// references instead.
///
/// If a definition of sym1 is linked, then an external reference to the symbol
/// is resolved normally. If a definition of sym1 is not linked, then all references
/// to the weak external for sym1 refer to sym2 instead. The external symbol, sym2,
/// must always be linked; typically, it is defined in the module that contains
/// the weak reference to sym1.
///
/// Weak externals are represented by a symbol table record with EXTERNAL storage
/// class, UNDEF section number, and a value of zero. The weak-external symbol
/// record is followed by an auxiliary record with the following format:
/// </summary>
/// <see href="https://learn.microsoft.com/en-us/windows/win32/debug/pe-format"/>
public class WeakExternal : BaseEntry
{
/// <summary>
/// The symbol-table index of sym2, the symbol to be linked if sym1 is not found.
/// </summary>
public uint TagIndex { get; set; }
/// <summary>
/// A value of IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY indicates that no library search
/// for sym1 should be performed.
/// A value of IMAGE_WEAK_EXTERN_SEARCH_LIBRARY indicates that a library search for
/// sym1 should be performed.
/// A value of IMAGE_WEAK_EXTERN_SEARCH_ALIAS indicates that sym1 is an alias for sym2.
/// </summary>
public uint Characteristics { get; set; }
/// <summary>
/// Unused
/// </summary>
/// <remarks>10 bytes</remarks>
public byte[]? Unused { get; set; }
}
}

View File

@@ -1,621 +0,0 @@
using System;
namespace SabreTools.Models.Charts
{
/// <see href="https://github.com/TheNathannator/GuitarGame_ChartFormats/tree/main/doc/FileFormats/song.ini"/>
/// <remarks>[song]/[Song]</remarks>
public class SongIni
{
#region Song/Chart Metadata
/// <summary>
/// Title of the song.
/// </summary>
/// <remarks>name</remarks>
public string? Name { get; set; }
/// <summary>
/// Artist(s) or band(s) behind the song.
/// </summary>
/// <remarks>artist</remarks>
public string? Artist { get; set; }
/// <summary>
/// Title of the album the song is featured in.
/// </summary>
/// <remarks>album</remarks>
public string? Album { get; set; }
/// <summary>
/// Genre of the song.
/// </summary>
/// <remarks>genre</remarks>
public string? Genre { get; set; }
/// <summary>
/// Sub-genre for the song.
/// </summary>
/// <remarks>sub_genre</remarks>
public string? SubGenre { get; set; }
/// <summary>
/// Year of the songs release.
/// </summary>
/// <remarks>year</remarks>
public string? Year { get; set; }
/// <summary>
/// Community member responsible for charting the song.
/// </summary>
/// <remarks>charter, frets</remarks>
public string? Charter { get; set; }
/// <summary>
/// Version number for the song.
/// </summary>
/// <remarks>version</remarks>
public long? Version { get; set; }
/// <summary>
/// Track number of the song within the album it's from.
/// </summary>
/// <remarks>album_track, track</remarks>
public long? AlbumTrack { get; set; }
/// <summary>
/// Track number of the song within the playlist/setlist it's from.
/// </summary>
/// <remarks>playlist_track</remarks>
public long? PlaylistTrack { get; set; }
/// <summary>
/// Length of the song's audio in milliseconds.
/// </summary>
/// <remarks>song_length</remarks>
public long? SongLength { get; set; }
/// <summary>
/// Timestamp in milliseconds where the song preview starts.
/// </summary>
/// <remarks>preview_start_time</remarks>
public long? PreviewStartTime { get; set; }
/// <summary>
/// Timestamp in milliseconds that the preview should stop at.
/// </summary>
/// <remarks>preview_end_time</remarks>
public long? PreviewEndTime { get; set; }
/// <summary>
/// Flavor text for this song, usually shown after picking the song or during loading.
/// </summary>
/// <remarks>loading_phrase</remarks>
public string? LoadingPhrase { get; set; }
#endregion
#region Song/Chart Metadata (Game-Specific)
/// <summary>
/// (FoFiX) Hex color to use in the song screen for the cassette.
/// </summary>
/// <remarks>cassettecolor</remarks>
public string? CassetteColor { get; set; }
/// <summary>
/// (FoFiX) Miscellaneous tags for the chart.
/// Only known valid value is `cover`.
/// </summary>
/// <remarks>tags</remarks>
public string? Tags { get; set; }
/// <summary>
/// (PS) Two timestamps in milliseconds for preview start and end time.
/// Example: `55000 85000`
/// </summary>
/// <remarks>preview</remarks>
public long[]? Preview { get; set; }
/// <summary>
/// (CH) Playlist that the song should show up in.
/// </summary>
/// <remarks>playlist</remarks>
public string? Playlist { get; set; }
/// <summary>
/// (CH) Sub-playlist that the song should show up in.
/// </summary>
/// <remarks>sub_playlist</remarks>
public string? SubPlaylist { get; set; }
/// <summary>
/// (CH) Indicates if this song is a modchart.
/// Meant for sorting purposes only.
/// </summary>
/// <remarks>modchart</remarks>
public bool? Modchart { get; set; }
/// <summary>
/// (CH) Indicates if the song has lyrics or not.
/// Meant for sorting purposes only.
/// </summary>
/// <remarks>lyrics</remarks>
public bool? Lyrics { get; set; }
#endregion
#region Track Difficulties
/// <summary>
/// Overall difficulty of the song.
/// </summary>
/// <remarks>diff_band</remarks>
public long? DiffBand { get; set; }
/// <summary>
/// Difficulty of the Lead Guitar track.
/// </summary>
/// <remarks>diff_guitar</remarks>
public long? DiffGuitar { get; set; }
/// <summary>
/// Difficulty of the 6-Fret Lead track.
/// </summary>
/// <remarks>diff_guitarghl</remarks>
public long? DiffGuitarGHL { get; set; }
/// <summary>
/// Difficulty of the Guitar Co-op track.
/// </summary>
/// <remarks>diff_guitar_coop</remarks>
public long? DiffGuitarCoop { get; set; }
/// <summary>
/// Difficulty of the 6-Fret Guitar Co-op track.
/// </summary>
/// <remarks>diff_guitar_coop_ghl</remarks>
public long? DiffGuitarCoopGHL { get; set; }
/// <summary>
/// Difficulty of the Pro Guitar track.
/// </summary>
/// <remarks>diff_guitar_real</remarks>
public long? DiffGuitarReal { get; set; }
/// <summary>
/// Difficulty of the Pro Guitar 22-fret track.
/// </summary>
/// <remarks>diff_guitar_real_22</remarks>
public long? DiffGuitarReal22 { get; set; }
/// <summary>
/// Difficulty of the Rhythm Guitar track.
/// </summary>
/// <remarks>diff_rhythm</remarks>
public long? DiffRhythm { get; set; }
/// <summary>
/// Difficulty of the 6-Fret Rhythm Guitar track.
/// </summary>
/// <remarks>diff_rhythm_ghl</remarks>
public long? DiffRhythmGHL { get; set; }
/// <summary>
/// Difficulty of the Bass Guitar track.
/// </summary>
/// <remarks>diff_bass</remarks>
public long? DiffBass { get; set; }
/// <summary>
/// Difficulty of the 6-Fret Bass track.
/// </summary>
/// <remarks>diff_bassghl</remarks>
public long? DiffBassGHL { get; set; }
/// <summary>
/// Difficulty of the Pro Bass track.
/// </summary>
/// <remarks>diff_bass_real</remarks>
public long? DiffBassReal { get; set; }
/// <summary>
/// Difficulty of the Pro Bass 22-fret track.
/// </summary>
/// <remarks>diff_bass_real_22</remarks>
public long? DiffBassReal22 { get; set; }
/// <summary>
/// Difficulty of the Drums track.
/// </summary>
/// <remarks>diff_drums</remarks>
public long? DiffDrums { get; set; }
/// <summary>
/// Difficulty of the Pro Drums track.
/// </summary>
/// <remarks>diff_drums_real</remarks>
public long? DiffDrumsReal { get; set; }
/// <summary>
/// Difficulty of the Drums Real track.
/// </summary>
/// <remarks>diff_drums_real_ps</remarks>
public long? DiffDrumsRealPS { get; set; }
/// <summary>
/// Difficulty of the Keys track.
/// </summary>
/// <remarks>diff_keys</remarks>
public long? DiffKeys { get; set; }
/// <summary>
/// Difficulty of the Pro Keys track.
/// </summary>
/// <remarks>diff_keys_real</remarks>
public long? DiffKeysReal { get; set; }
/// <summary>
/// Difficulty of the Keys Real track.
/// </summary>
/// <remarks>diff_keys_real_ps</remarks>
public long? DiffKeysRealPS { get; set; }
/// <summary>
/// Difficulty of the Vocals track.
/// </summary>
/// <remarks>diff_vocals</remarks>
public long? DiffVocals { get; set; }
/// <summary>
/// Difficulty of the Harmonies track.
/// </summary>
/// <remarks>diff_vocals_harm</remarks>
public long? DiffVocalsHarm { get; set; }
/// <summary>
/// Difficulty of the Dance track.
/// </summary>
/// <remarks>diff_dance</remarks>
public long? DiffDance { get; set; }
#endregion
#region Chart Properties
/// <summary>
/// Forces the Drums track to be Pro Drums.
/// </summary>
/// <remarks>pro_drums, pro_drum (FoFiX)</remarks>
public bool? ProDrums { get; set; }
/// <summary>
/// Forces the Drums track to be 5-lane.
/// </summary>
/// <remarks>five_lane_drums</remarks>
public bool? FiveLaneDrums { get; set; }
/// <summary>
/// Specifies a voice type for the singer (either "male" or "female").
/// </summary>
/// <remarks>vocal_gender</remarks>
public string? VocalGender { get; set; }
/// <summary>
/// Specifies a tuning for 17-fret Pro Guitar.
/// </summary>
/// <remarks>real_guitar_tuning</remarks>
public string? RealGuitarTuning { get; set; }
/// <summary>
/// Specifies a tuning for 22-fret Pro Guitar.
/// </summary>
/// <remarks>real_guitar_22_tuning</remarks>
public string? RealGuitar22Tuning { get; set; }
/// <summary>
/// Specifies a tuning for 17-fret Pro Bass.
/// </summary>
/// <remarks>real_bass_tuning</remarks>
public string? RealBassTuning { get; set; }
/// <summary>
/// Specifies a tuning for 22-fret Pro Bass.
/// </summary>
/// <remarks>real_bass_22_tuning</remarks>
public string? RealBass22Tuning { get; set; }
/// <summary>
/// Specifies the number of lanes for the right hand in Real Keys.
/// </summary>
/// <remarks>real_keys_lane_count_right</remarks>
public long? RealKeysLaneCountRight { get; set; }
/// <summary>
/// Specifies the number of lanes for the left hand in Real Keys.
/// </summary>
/// <remarks>real_keys_lane_count_left</remarks>
public long? RealKeysLaneCountLeft { get; set; }
/// <summary>
/// Delays the chart relative to the audio by the specified number of milliseconds.
/// Higher = later notes. Can be negative.
/// </summary>
/// <remarks>delay</remarks>
[Obsolete]
public long? Delay { get; set; }
/// <summary>
/// Overrides the default sustain cutoff threshold with a specified value in ticks.
/// </summary>
/// <remarks>sustain_cutoff_threshold</remarks>
[Obsolete]
public long? SustainCutoffThreshold { get; set; }
/// <summary>
/// Overrides the default HOPO threshold with a specified value in ticks.
/// </summary>
/// <remarks>hopo_frequency</remarks>
[Obsolete]
public long? HopoFrequency { get; set; }
/// <summary>
/// Sets the HOPO threshold to be a 1/8th step.
/// </summary>
/// <remarks>eighthnote_hopo</remarks>
[Obsolete]
public bool? EighthNoteHopo { get; set; }
/// <summary>
/// Overrides the .mid note number for Star Power on 5-Fret Guitar.
/// Valid values are 103 and 116.
/// </summary>
/// <remarks>multiplier_note, star_power_note (PS)</remarks>
[Obsolete]
public long? MultiplierNote { get; set; }
#endregion
#region Chart Properties (Game-Specific)
/// <summary>
/// (PS) Sets 5 to 4 Lane Drums Fallback Note
/// </summary>
/// <remarks>drum_fallback_blue</remarks>
public bool? DrumFallbackBlue { get; set; }
/// <summary>
/// (FoFiX) Marks a song as a tutorial and hides it from Quickplay.
/// </summary>
/// <remarks>tutorial</remarks>
public bool? Tutorial { get; set; }
/// <summary>
/// (FoFiX) Marks a song as a boss battle.
/// </summary>
/// <remarks>boss_battle</remarks>
public bool? BossBattle { get; set; }
/// <summary>
/// (FoFiX) Overrides the natural HOPO threshold using numbers from 0 to 5.
/// </summary>
/// <remarks>hopofreq</remarks>
[Obsolete]
public long? HopoFreq { get; set; }
/// <summary>
/// (FoFiX) Sets the "early hit window" size.
/// Valid values are "none", "half", or "full".
/// </summary>
/// <remarks>early_hit_window_size</remarks>
public string? EarlyHitWindowSize { get; set; }
/// <summary>
/// (CH) Sets whether or not end events in the chart will be respected.
/// </summary>
/// <remarks>end_events</remarks>
public bool? EndEvents { get; set; }
/// <summary>
/// (PS) Enables .mid SysEx events for guitar sliders/tap notes.
/// </summary>
/// <remarks>sysex_slider</remarks>
public bool? SysExSlider { get; set; }
/// <summary>
/// (PS) Enables .mid SysEx events for Real Drums hi-hat pedal control.
/// </summary>
/// <remarks>sysex_high_hat_ctrl</remarks>
public bool? SysExHighHatCtrl { get; set; }
/// <summary>
/// (PS) Enables .mid SysEx events for Real Drums rimshot hits.
/// </summary>
/// <remarks>sysex_rimshot</remarks>
public bool? SysExRimshot { get; set; }
/// <summary>
/// (PS) Enables .mid SysEx events for guitar open notes.
/// </summary>
/// <remarks>sysex_open_bass</remarks>
public bool? SysExOpenBass { get; set; }
/// <summary>
/// (PS) Enables .mid SysEx events for Pro Guitar/Bass slide directions.
/// </summary>
/// <remarks>sysex_pro_slide</remarks>
public bool? SysExProSlide { get; set; }
/// <summary>
/// (PS) Sound sample set index for guitar.
/// </summary>
/// <remarks>guitar_type</remarks>
public long? GuitarType { get; set; }
/// <summary>
/// (PS) Sound sample set index for bass.
/// </summary>
/// <remarks>bass_type</remarks>
public long? BassType { get; set; }
/// <summary>
/// (PS) Sound sample set index for drums.
/// </summary>
/// <remarks>kit_type</remarks>
public long? KitType { get; set; }
/// <summary>
/// (PS) Sound sample set index for keys.
/// </summary>
/// <remarks>keys_type</remarks>
public long? KeysType { get; set; }
/// <summary>
/// (PS) Sound sample set index for dance.
/// </summary>
/// <remarks>dance_type</remarks>
public long? DanceType { get; set; }
#endregion
#region Images and Other Resources
/// <summary>
/// Name of an icon image to display for this song.
/// Included in either the chart folder or the game the chart was made for, or sourced from this repository of icons.
/// </summary>
/// <remarks>icon</remarks>
public string? Icon { get; set; }
/// <summary>
/// Name for a background image file.
/// </summary>
/// <remarks>background</remarks>
public string? Background { get; set; }
/// <summary>
/// Name for a background video file.
/// </summary>
/// <remarks>video</remarks>
public string? Video { get; set; }
/// <summary>
/// Name for a background video file.
/// </summary>
/// <remarks>video_loop</remarks>
public bool? VideoLoop { get; set; }
/// <summary>
/// Timestamp in milliseconds where playback of an included video will start. Can be negative.
/// This tag controls the time relative to the video, not relative to the chart. Negative values will delay the video, positive values will make the video be at a further point in when the chart starts.
/// </summary>
/// <remarks>video_start_time</remarks>
public long? VideoStartTime { get; set; }
/// <summary>
/// Timestamp in milliseconds where playback of an included video will end. -1 means no time is specified.
/// This is assumed to also be relative to the video, not the chart.
/// </summary>
/// <remarks>video_end_time</remarks>
public long? VideoEndTime { get; set; }
/// <summary>
/// Name for a cover image file.
/// </summary>
/// <remarks>cover</remarks>
public string? Cover { get; set; }
#endregion
#region Images and Other Resources (Game-Specific)
/// <summary>
/// (PS) Name for banner A.
/// </summary>
/// <remarks>link_name_a</remarks>
public string? LinkNameA { get; set; }
/// <summary>
/// (PS) Name for banner B.
/// </summary>
/// <remarks>link_name_b</remarks>
public string? LinkNameB { get; set; }
/// <summary>
/// (PS) Link that clicking banner A will open.
/// </summary>
/// <remarks>banner_link_a</remarks>
public string? BannerLinkA { get; set; }
/// <summary>
/// (PS) Link that clicking banner B will open.
/// </summary>
/// <remarks>banner_link_b</remarks>
public string? BannerLinkB { get; set; }
#endregion
#region Miscellaneous (Game-Specific)
/// <summary>
/// (FoFiX) High score data.
/// </summary>
/// <remarks>scores</remarks>
public string? Scores { get; set; }
/// <summary>
/// (FoFiX) Additional score data.
/// </summary>
/// <remarks>scores_ext</remarks>
public string? ScoresExt { get; set; }
/// <summary>
/// (FoFiX) Play count.
/// </summary>
/// <remarks>count</remarks>
public long? Count { get; set; }
/// <summary>
/// (PS) Player's rating of the song
/// </summary>
/// <remarks>rating</remarks>
public long? Rating { get; set; }
/// <summary>
/// (FoFiX) Career ID for this song.
/// </summary>
/// <remarks>unlock_id</remarks>
public string? UnlockId { get; set; }
/// <summary>
/// (FoFiX) The career ID that must be completed to unlock this song.
/// </summary>
/// <remarks>unlock_require</remarks>
public string? UnlockRequire { get; set; }
/// <summary>
/// (FoFiX) Text to display if the song is locked.
/// </summary>
/// <remarks>unlock_text</remarks>
public string? UnlockText { get; set; }
/// <summary>
/// (FoFiX) Indicates if the song is unlocked.
/// </summary>
/// <remarks>unlock_completed</remarks>
public long? UnlockCompleted { get; set; }
/// <summary>
/// (Editor on Fire) Sets a velocity number for drums accent notes.
/// </summary>
/// <remarks>eof_midi_import_drum_accent_velocity</remarks>
public long? EoFMidiImportDrumAccentVelocity { get; set; }
/// <summary>
/// (Editor on Fire) Sets a velocity number for drums ghost notes.
/// </summary>
/// <remarks>eof_midi_import_drum_ghost_velocity</remarks>
public long? EoFMidiImportDrumGhostVelocity { get; set; }
#endregion
}
}

View File

@@ -1,16 +0,0 @@
namespace SabreTools.Models.Charts
{
/// <see href="https://github.com/TheNathannator/GuitarGame_ChartFormats/blob/main/doc/FileFormats/Other/Frets%20on%20Fire%20X/Careers.md"/>
public class Tier
{
/// <summary>
/// Display name of the tier.
/// </summary>
public string? Name { get; set; }
/// <summary>
/// Name used for associating a song with this tier, and for checking unlock requirements.
/// </summary>
public string? UnlockId { get; set; }
}
}

View File

@@ -1,18 +0,0 @@
namespace SabreTools.Models.Charts
{
/// <see href="https://github.com/TheNathannator/GuitarGame_ChartFormats/blob/main/doc/FileFormats/Other/Frets%20on%20Fire%20X/Careers.md"/>
/// <remarks>[titles]</remarks>
public class TitlesIni
{
/// <summary>
/// A space-separated list of .ini sections to include in the career.
/// </summary>
/// <remarks>sections</remarks>
public string[]? SectionList { get; set; }
/// <summary>
/// This entry points to other sections that should be used as part of the career.
/// </summary>
public Tier[]? Sections { get; set; }
}
}

View File

@@ -1,10 +0,0 @@
namespace SabreTools.Models.ClrMamePro
{
/// <remarks>archive</remarks>
public class Archive
{
/// <remarks>name</remarks>
[Required]
public string? Name { get; set; }
}
}

View File

@@ -1,17 +0,0 @@
namespace SabreTools.Models.ClrMamePro
{
/// <remarks>biosset</remarks>
public class BiosSet
{
/// <remarks>name</remarks>
[Required]
public string? Name { get; set; }
/// <remarks>description</remarks>
[Required]
public string? Description { get; set; }
/// <remarks>default</remarks>
public string? Default { get; set; }
}
}

View File

@@ -1,20 +0,0 @@
namespace SabreTools.Models.ClrMamePro
{
/// <remarks>chip</remarks>
public class Chip
{
/// <remarks>type, (cpu|audio)</remarks>
[Required]
public string? Type { get; set; }
/// <remarks>name</remarks>
[Required]
public string? Name { get; set; }
/// <remarks>flags</remarks>
public string? Flags { get; set; }
/// <remarks>clock, Numeric?</remarks>
public string? Clock { get; set; }
}
}

View File

@@ -1,51 +0,0 @@
namespace SabreTools.Models.ClrMamePro
{
/// <remarks>clrmamepro</remarks>
public class ClrMamePro
{
/// <remarks>name</remarks>
public string? Name { get; set; }
/// <remarks>description</remarks>
public string? Description { get; set; }
/// <remarks>rootdir</remarks>
public string? RootDir { get; set; }
/// <remarks>category</remarks>
public string? Category { get; set; }
/// <remarks>version</remarks>
public string? Version { get; set; }
/// <remarks>date</remarks>
public string? Date { get; set; }
/// <remarks>author</remarks>
public string? Author { get; set; }
/// <remarks>homepage</remarks>
public string? Homepage { get; set; }
/// <remarks>url</remarks>
public string? Url { get; set; }
/// <remarks>comment</remarks>
public string? Comment { get; set; }
/// <remarks>header</remarks>
public string? Header { get; set; }
/// <remarks>type</remarks>
public string? Type { get; set; }
/// <remarks>forcemerging</remarks>
public string? ForceMerging { get; set; }
/// <remarks>forcezipping</remarks>
public string? ForceZipping { get; set; }
/// <remarks>forcepacking</remarks>
public string? ForcePacking { get; set; }
}
}

View File

@@ -1,16 +0,0 @@
namespace SabreTools.Models.ClrMamePro
{
/// <remarks>dipswitch</remarks>
public class DipSwitch
{
/// <remarks>name</remarks>
[Required]
public string? Name { get; set; }
/// <remarks>entry</remarks>
public string[]? Entry { get; set; }
/// <remarks>default, (yes|no) "no"</remarks>
public string? Default { get; set; }
}
}

View File

@@ -1,25 +0,0 @@
namespace SabreTools.Models.ClrMamePro
{
/// <remarks>disk</remarks>
public class Disk
{
/// <remarks>name</remarks>
[Required]
public string? Name { get; set; }
/// <remarks>md5</remarks>
public string? MD5 { get; set; }
/// <remarks>sha1</remarks>
public string? SHA1 { get; set; }
/// <remarks>merge</remarks>
public string? Merge { get; set; }
/// <remarks>status</remarks>
public string? Status { get; set; }
/// <remarks>flags</remarks>
public string? Flags { get; set; }
}
}

View File

@@ -1,22 +0,0 @@
namespace SabreTools.Models.ClrMamePro
{
/// <remarks>driver</remarks>
public class Driver
{
/// <remarks>status, (good|imperfect|preliminary)</remarks>
[Required]
public string? Status { get; set; }
/// <remarks>color, (good|imperfect|preliminary)</remarks>
public string? Color { get; set; }
/// <remarks>sound, (good|imperfect|preliminary)</remarks>
public string? Sound { get; set; }
/// <remarks>palettesize, Numeric?</remarks>
public string? PaletteSize { get; set; }
/// <remarks>blit, (plain|dirty)</remarks>
public string? Blit { get; set; }
}
}

View File

@@ -1,5 +0,0 @@
namespace SabreTools.Models.ClrMamePro
{
/// <remarks>game</remarks>
public class Game : GameBase { }
}

View File

@@ -1,80 +0,0 @@
namespace SabreTools.Models.ClrMamePro
{
/// <summary>
/// Base class to unify the various game-like types
/// </summary>
public abstract class GameBase
{
/// <remarks>name</remarks>
[Required]
public string? Name { get; set; }
/// <remarks>description</remarks>
public string? Description { get; set; }
/// <remarks>year</remarks>
public string? Year { get; set; }
/// <remarks>manufacturer</remarks>
public string? Manufacturer { get; set; }
/// <remarks>category</remarks>
public string? Category { get; set; }
/// <remarks>cloneof</remarks>
public string? CloneOf { get; set; }
/// <remarks>romof</remarks>
public string? RomOf { get; set; }
/// <remarks>sampleof</remarks>
public string? SampleOf { get; set; }
/// <remarks>release</remarks>
public Release[]? Release { get; set; }
/// <remarks>biosset</remarks>
public BiosSet[]? BiosSet { get; set; }
/// <remarks>rom</remarks>
public Rom[]? Rom { get; set; }
/// <remarks>disk</remarks>
public Disk[]? Disk { get; set; }
/// <remarks>sample</remarks>
public Sample[]? Sample { get; set; }
/// <remarks>archive</remarks>
public Archive[]? Archive { get; set; }
#region Aaru Extensions
/// <remarks>media, Appears after Disk</remarks>
public Media[]? Media { get; set; }
#endregion
#region MAME Extensions
/// <remarks>chip, Appears after Archive</remarks>
public Chip[]? Chip { get; set; }
/// <remarks>video, Appears after Chip</remarks>
public Video[]? Video { get; set; }
/// <remarks>sound, Appears after Video</remarks>
public Sound? Sound { get; set; }
/// <remarks>input, Appears after Sound</remarks>
public Input? Input { get; set; }
/// <remarks>dipswitch, Appears after Input</remarks>
public DipSwitch[]? DipSwitch { get; set; }
/// <remarks>driver, Appears after DipSwitch</remarks>
public Driver? Driver { get; set; }
#endregion
}
}

View File

@@ -1,26 +0,0 @@
namespace SabreTools.Models.ClrMamePro
{
/// <remarks>input</remarks>
public class Input
{
/// <remarks>players, Numeric/remarks>
[Required]
public string? Players { get; set; }
/// <remarks>control</remarks>
public string? Control { get; set; }
/// <remarks>buttons, Numeric</remarks>
[Required]
public string? Buttons { get; set; }
/// <remarks>coins, Numeric</remarks>
public string? Coins { get; set; }
/// <remarks>tilt, (yes|no) "no"</remarks>
public string? Tilt { get; set; }
/// <remarks>service, (yes|no) "no"</remarks>
public string? Service { get; set; }
}
}

View File

@@ -1,5 +0,0 @@
namespace SabreTools.Models.ClrMamePro
{
/// <remarks>machine</remarks>
public class Machine : GameBase { }
}

View File

@@ -1,22 +0,0 @@
namespace SabreTools.Models.ClrMamePro
{
/// <remarks>media</remarks>
public class Media
{
/// <remarks>name</remarks>
[Required]
public string? Name { get; set; }
/// <remarks>md5</remarks>
public string? MD5 { get; set; }
/// <remarks>sha1</remarks>
public string? SHA1 { get; set; }
/// <remarks>sha256</remarks>
public string? SHA256 { get; set; }
/// <remarks>spamsum</remarks>
public string? SpamSum { get; set; }
}
}

View File

@@ -1,11 +0,0 @@
namespace SabreTools.Models.ClrMamePro
{
public class MetadataFile
{
/// <remarks>clrmamepro</remarks>
public ClrMamePro? ClrMamePro { get; set; }
/// <remarks>game, machine, resource, set</remarks>
public GameBase?[]? Game { get; set; }
}
}

View File

@@ -1,23 +0,0 @@
namespace SabreTools.Models.ClrMamePro
{
/// <remarks>release</remarks>
public class Release
{
/// <remarks>name</remarks>
[Required]
public string? Name { get; set; }
/// <remarks>region</remarks>
[Required]
public string? Region { get; set; }
/// <remarks>language</remarks>
public string? Language { get; set; }
/// <remarks>date</remarks>
public string? Date { get; set; }
/// <remarks>default</remarks>
public string? Default { get; set; }
}
}

View File

@@ -1,5 +0,0 @@
namespace SabreTools.Models.ClrMamePro
{
/// <remarks>resource</remarks>
public class Resource : GameBase { }
}

View File

@@ -1,91 +0,0 @@
namespace SabreTools.Models.ClrMamePro
{
/// <remarks>rom</remarks>
public class Rom
{
/// <remarks>name</remarks>
[Required]
public string? Name { get; set; }
/// <remarks>size, Numeric</remarks>
[Required]
public string? Size { get; set; }
/// <remarks>crc</remarks>
public string? CRC { get; set; }
/// <remarks>md5</remarks>
public string? MD5 { get; set; }
/// <remarks>sha1</remarks>
public string? SHA1 { get; set; }
/// <remarks>merge</remarks>
public string? Merge { get; set; }
/// <remarks>status</remarks>
public string? Status { get; set; }
/// <remarks>flags</remarks>
public string? Flags { get; set; }
/// <remarks>date</remarks>
public string? Date { get; set; }
#region Hash Extensions
/// <remarks>sha256; Also in No-Intro spec; Appears after SHA1</remarks>
public string? SHA256 { get; set; }
/// <remarks>sha384; Appears after SHA256</remarks>
public string? SHA384 { get; set; }
/// <remarks>sha512; Appears after SHA384</remarks>
public string? SHA512 { get; set; }
/// <remarks>spamsum; Appears after SHA512</remarks>
public string? SpamSum { get; set; }
#endregion
#region DiscImgeCreator Extensions
/// <remarks>xxh3_64; Appears after SpamSum</remarks>
public string? xxHash364 { get; set; }
/// <remarks>xxh3_128; Appears after xxHash364</remarks>
public string? xxHash3128 { get; set; }
#endregion
#region MAME Extensions
/// <remarks>region; Appears after Status</remarks>
public string? Region { get; set; }
/// <remarks>offs; Appears after Flags</remarks>
public string? Offs { get; set; }
#endregion
#region No-Intro Extensions
/// <remarks>serial; Appears after Offs</remarks>
public string? Serial { get; set; }
/// <remarks>header; Appears after Serial</remarks>
public string? Header { get; set; }
#endregion
#region RomVault Extensions
/// <remarks>inverted; Boolean; Appears after Date</remarks>
public string? Inverted { get; set; }
/// <remarks>mia; Boolean; Appears after Inverted</remarks>
public string? MIA { get; set; }
#endregion
}
}

View File

@@ -1,51 +0,0 @@
namespace SabreTools.Models.ClrMamePro
{
/// <remarks>romvault</remarks>
public class RomVault
{
/// <remarks>name</remarks>
public string? Name { get; set; }
/// <remarks>description</remarks>
public string? Description { get; set; }
/// <remarks>rootdir</remarks>
public string? RootDir { get; set; }
/// <remarks>category</remarks>
public string? Category { get; set; }
/// <remarks>version</remarks>
public string? Version { get; set; }
/// <remarks>date</remarks>
public string? Date { get; set; }
/// <remarks>author</remarks>
public string? Author { get; set; }
/// <remarks>homepage</remarks>
public string? Homepage { get; set; }
/// <remarks>url</remarks>
public string? Url { get; set; }
/// <remarks>comment</remarks>
public string? Comment { get; set; }
/// <remarks>header</remarks>
public string? Header { get; set; }
/// <remarks>type</remarks>
public string? Type { get; set; }
/// <remarks>forcemerging</remarks>
public string? ForceMerging { get; set; }
/// <remarks>forcezipping</remarks>
public string? ForceZipping { get; set; }
/// <remarks>forcepacking</remarks>
public string? ForcePacking { get; set; }
}
}

Some files were not shown because too many files have changed in this diff Show More