DSM/Mitsubishi CAPS: Difference between revisions
m →DOSCAPS |
|||
(33 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
This entry details my [https://en.wikipedia.org/wiki/Data_archaeology data archaeology] work on the Mitsubishi WINCAPS/CAPS (Computerized Automatic Part Searching System) software developed by and/or for [https://en.wikipedia.org/wiki/Mitsubishi_Motors Mitsubishi Motors Corporation]. | |||
==Subpages== | |||
* [[DSM/Mitsubishi_CAPS/Database_Files]] | |||
==External Links== | |||
* http://stealth316.com/2-wincaps.htm | |||
** https://web.archive.org/web/20220329084933/http://stealth316.com/2-wincaps.htm | |||
==Known Versions== | |||
Here are lists of Mitsubishi CAPS/WINCAPS versions | |||
===CAPS (MS-DOS)=== | |||
{| class="wikitable" | |||
!Version | |||
!Date | |||
|- | |||
|colspan="2"|C:\WINCAPS\CAPS\CAPS.EXE | |||
|- | |||
|? | |||
|1996/08/01 | |||
|} | |||
===WINCAPS (Windows CAPS)=== | |||
{| class="wikitable" | |||
!Version | |||
!Year in About Dialog | |||
!Year in splash screen | |||
|- | |||
|colspan="3"|C:\WINCAPS\CAPS.EXE | |||
|- | |||
|2.66 | |||
|1997 | |||
|1994 | |||
|- | |||
|3.41 | |||
|1997 | |||
|1994 | |||
|} | |||
==DOSCAPS== | |||
Pretty sure there is a DOS CAPS, or at least DOS access layer to the database files given the two strings in C:\WINCAPS\CAPS\CAPS.exe: | |||
<pre> | |||
seg048:0008 0000002C C C Library - (C)Copyright Microsoft Corp 1986 | |||
seg048:3693 0000002B C \r\nerror 2004: DOS 2.0 or later required\r\n$ | |||
</pre> | |||
==File Formats== | ==File Formats== | ||
===VIN Lookup=== | |||
SHARYO.IDX Lookup: | |||
{| class="wikitable" | |||
!Read start | |||
!Bytes read | |||
|- | |||
|0 | |||
|2048 | |||
|- | |||
|4096 | |||
|2048 | |||
|- | |||
|229376 | |||
|2048 | |||
|- | |||
|229376 | |||
|4096 | |||
|- | |||
|21,833,728 | |||
|2048 | |||
|- | |||
|21,831,680 | |||
|4096 | |||
|} | |||
SHARYO.DAT Lookup: | |||
{| class="wikitable" | |||
!Read start | |||
!Bytes read | |||
|- | |||
|35,073,568 | |||
|2048 | |||
|- | |||
|35,069,952 | |||
|8192 | |||
|} | |||
===IDX - Index=== | ===IDX - Index=== | ||
Index files are broken up into 2048 byte chunks, which I will refer to as "pages". Index | Index files are broken up into 2048 byte chunks, which I will refer to as "pages". Index files must be at least one page in size, meaning the smallest IDX file will be 2048 bytes, filled mostly with null bytes(00h) if it only has a couple of "records" (there are 96 records per page in some pages in SHARYO.IDX for example). | ||
====Header==== | ====Header==== | ||
The first 32 bytes of each page is the "header" | The first 32 bytes of each page is the "header". | ||
=====Example===== | |||
SHARYO.IDX - First page header example | |||
<pre> | |||
#Header - 32 bytes: | |||
Byte : 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | |||
Hex : 53 48 41 52 59 4F 20 20 49 44 58 00 11 01 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 | |||
ASCII: S H A R Y O I D X | |||
Data*: PA PA NU 17 1 6 | |||
*in decimal | |||
</pre> | |||
=====Byte Breakdown===== | |||
{| class="wikitable" | {| class="wikitable" | ||
!Byte # | !Byte # | ||
!Name | |||
!Description | !Description | ||
|- | |- | ||
|0-7 | |0-7 | ||
| | |Filename/Table name | ||
|(Usually) matches file name, if filename < 8 bytes it is padded with 20h bytes, Uppercase ASCII | |||
|- | |- | ||
|8-10 | |8-10 | ||
|49h 44h 58h, literal: "IDX", Uppercase ASCII | |File extension | ||
|Always 49h 44h 58h, literal: "IDX", Uppercase ASCII | |||
|- | |- | ||
|11 | |11 | ||
|Always 00h, separator or null byte for | |Null byte | ||
|Always 00h, separator or null byte for a string | |||
|- | |- | ||
|12 | |12 | ||
| | |Record length | ||
|The length of records included in the page, in bytes, appears to remain the same throughout the entire index file | |||
|- | |- | ||
|13 | |13 | ||
|The | |Page low | ||
|The page count, low-byte, starts at 1, increments by 1 every page | |||
|- | |- | ||
|14- | |14 | ||
| | |Page high | ||
|The page count, high-byte, byte 13 will overflow into this byte at FFh | |||
|- | |||
|15 | |||
|Depth | |||
|Tree depth, starts at 00h (root), max is 3? | |||
|- | |||
|16 | |||
|Node low | |||
|Node in the tree depth, starts at 00h, resets when depth increases | |||
|- | |||
|17 | |||
|Node high | |||
|Node in the tree depth, byte 16 will overflow into this byte at FFh | |||
|- | |||
|18 | |||
|Entry | |||
|Entry in the node, node per page I believe? | |||
|- | |||
|19 | |||
|Entry high? | |||
|Overflow for byte 18? | |||
|- | |||
|20 | |||
|isLeaf | |||
|Binary, marks the page's record's "pointer bytes" as containing the byte offset to read from the associated DAT file, | |||
depth will not increase past the first page the flag set? | |||
|- | |||
|21 | |||
|? | |||
|Unknown/unobserved | |||
|- | |- | ||
|22 | |22 | ||
| | |Record count | ||
|The number of records contained on the page | |||
|- | |||
|23-31 | |||
|? | |||
|Unknown/unobserved | |||
|} | |} | ||
==== | ====Index Entry==== | ||
=====Byte Breakdown===== | |||
{| class="wikitable" | {| class="wikitable" | ||
!Byte # | !Byte # | ||
!Name | |||
!Description | !Description | ||
|- | |||
|0-(n-1) | |||
|Data bytes | |||
|This is a record's data bytes, n = byte 12 in the page's header | |||
|- | |||
|n, n+1, n+2 | |||
|Pointer bytes | |||
|Non-leaf nodes will point to a page offset, that offset being in the next depth of the tree | |||
isLeaf nodes will contain the byte offset pointing to the data record of interest | |||
|} | |} | ||
====Examples==== | ====More Examples==== | ||
<pre> | <pre> | ||
Line 77: | Line 230: | ||
#VIN (02) - 21 bytes \/-- Count Column (2) | #VIN (02) - 21 bytes \/-- Count Column (2) | ||
{ | { 17 bytes } | ||
Byte : 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | Byte : 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | ||
Hex : 34 41 33 41 43 38 34 4C 33 59 45 30 35 31 32 36 31 02 00 00 00 | Hex : 34 41 33 41 43 38 34 4C 33 59 45 30 35 31 32 36 31 02 00 00 00 | ||
Line 111: | Line 264: | ||
<pre> | <pre> | ||
| Always 11?? | | Always 11?? | ||
#Header 2 (Start at 2048 Bytes) - 32 Bytes \/ | #Header 2 (Start at 2048 Bytes) - 32 Bytes \/ \/Page (2) \/ Number of records | ||
Byte : 0 1 2 3 4 5 6 7 8 9 10 11 12 | Byte : 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | ||
Hex : 53 48 41 52 59 4F 20 20 49 44 58 00 11 | Hex : 53 48 41 52 59 4F 20 20 49 44 58 00 11 02 00 01 01 00 01 00 00 00 60 00 00 00 00 00 00 00 00 00 | ||
ASCII: S H A R Y O I D X ' | ASCII: S H A R Y O I D X ' | ||
Data : PA PA NU 11 | Data : PA PA NU 11 2 1 1 1 60 | ||
#Indexes from page 2 | |||
{ 17 bytes } \/-- Count Column (8) | |||
Hex : 32 36 41 58 4E 20 20 45 30 38 37 35 34 31 20 20 20 08 00 00 00 | |||
ASCII: 2 6 A X N E 0 8 7 5 4 1 | |||
Data : PA PA PA PA PA 8 NU NU NU | |||
Hex : 33 34 42 31 52 20 20 45 30 39 35 37 37 32 20 20 20 09 00 00 00 | |||
ASCII: 3 4 B 1 R E 0 9 5 7 7 2 | |||
Data : PA PA PA PA PA 9 NU NU NU | |||
Hex : 33 34 42 33 52 20 20 45 30 38 32 30 37 30 20 20 20 0A 00 00 00 | |||
ASCII: 3 4 B 3 R E 0 8 2 0 7 0 | |||
Data : PA PA PA PA PA 10 NU NU NU | |||
</pre> | </pre> | ||
<pre> | <pre> | ||
#Header 3 | |||
Byte : 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | |||
Hex : 53 48 41 52 59 4F 20 20 49 44 58 00 11 03 00 01 01 00 02 00 00 00 60 00 00 00 00 00 00 00 00 00 | |||
ASCII: S H A R Y O I D X ' | |||
Data : PA PA NU 11 3 1 1 2 60 | |||
#Indexes from page 3 \/-- Count Column (68) | #Indexes from page 3 \/-- Count Column (68) | ||
Hex : 34 41 33 41 43 38 34 4C 39 59 45 30 31 38 33 37 36 68 00 00 00 | Hex : 34 41 33 41 43 38 34 4C 39 59 45 30 31 38 33 37 36 68 00 00 00 | ||
Line 137: | Line 310: | ||
</pre> | </pre> | ||
==DAT - | ===DAT - Data=== |
Latest revision as of 20:32, 26 April 2023
This entry details my data archaeology work on the Mitsubishi WINCAPS/CAPS (Computerized Automatic Part Searching System) software developed by and/or for Mitsubishi Motors Corporation.
Subpages
External Links
Known Versions
Here are lists of Mitsubishi CAPS/WINCAPS versions
CAPS (MS-DOS)
Version | Date |
---|---|
C:\WINCAPS\CAPS\CAPS.EXE | |
? | 1996/08/01 |
WINCAPS (Windows CAPS)
Version | Year in About Dialog | Year in splash screen |
---|---|---|
C:\WINCAPS\CAPS.EXE | ||
2.66 | 1997 | 1994 |
3.41 | 1997 | 1994 |
DOSCAPS
Pretty sure there is a DOS CAPS, or at least DOS access layer to the database files given the two strings in C:\WINCAPS\CAPS\CAPS.exe:
seg048:0008 0000002C C C Library - (C)Copyright Microsoft Corp 1986 seg048:3693 0000002B C \r\nerror 2004: DOS 2.0 or later required\r\n$
File Formats
VIN Lookup
SHARYO.IDX Lookup:
Read start | Bytes read |
---|---|
0 | 2048 |
4096 | 2048 |
229376 | 2048 |
229376 | 4096 |
21,833,728 | 2048 |
21,831,680 | 4096 |
SHARYO.DAT Lookup:
Read start | Bytes read |
---|---|
35,073,568 | 2048 |
35,069,952 | 8192 |
IDX - Index
Index files are broken up into 2048 byte chunks, which I will refer to as "pages". Index files must be at least one page in size, meaning the smallest IDX file will be 2048 bytes, filled mostly with null bytes(00h) if it only has a couple of "records" (there are 96 records per page in some pages in SHARYO.IDX for example).
Header
The first 32 bytes of each page is the "header".
Example
SHARYO.IDX - First page header example
#Header - 32 bytes: Byte : 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Hex : 53 48 41 52 59 4F 20 20 49 44 58 00 11 01 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 ASCII: S H A R Y O I D X Data*: PA PA NU 17 1 6 *in decimal
Byte Breakdown
Byte # | Name | Description |
---|---|---|
0-7 | Filename/Table name | (Usually) matches file name, if filename < 8 bytes it is padded with 20h bytes, Uppercase ASCII |
8-10 | File extension | Always 49h 44h 58h, literal: "IDX", Uppercase ASCII |
11 | Null byte | Always 00h, separator or null byte for a string |
12 | Record length | The length of records included in the page, in bytes, appears to remain the same throughout the entire index file |
13 | Page low | The page count, low-byte, starts at 1, increments by 1 every page |
14 | Page high | The page count, high-byte, byte 13 will overflow into this byte at FFh |
15 | Depth | Tree depth, starts at 00h (root), max is 3? |
16 | Node low | Node in the tree depth, starts at 00h, resets when depth increases |
17 | Node high | Node in the tree depth, byte 16 will overflow into this byte at FFh |
18 | Entry | Entry in the node, node per page I believe? |
19 | Entry high? | Overflow for byte 18? |
20 | isLeaf | Binary, marks the page's record's "pointer bytes" as containing the byte offset to read from the associated DAT file,
depth will not increase past the first page the flag set? |
21 | ? | Unknown/unobserved |
22 | Record count | The number of records contained on the page |
23-31 | ? | Unknown/unobserved |
Index Entry
Byte Breakdown
Byte # | Name | Description |
---|---|---|
0-(n-1) | Data bytes | This is a record's data bytes, n = byte 12 in the page's header |
n, n+1, n+2 | Pointer bytes | Non-leaf nodes will point to a page offset, that offset being in the next depth of the tree
isLeaf nodes will contain the byte offset pointing to the data record of interest |
More Examples
NU = NULL BYTE (00h) PA = PADDING (20h)
SEIBI.IDX - 2048 bytes
Byte : 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 Hex : 53 45 49 42 49 20 20 20 49 44 58 00 09 01 00 00 00 00 00 00 01 00 01 00 00 00 00 00 00 00 00 00 39 39 39 39 39 39 39 39 39 01 ASCII: S E I B I I D X 9 9 9 9 9 9 9 9 9
UNKATA.IDX - 2048 bytes
Byte : 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 Hex : 55 4E 4B 41 54 41 20 20 49 44 58 00 09 01 00 00 00 00 00 00 01 00 01 00 00 00 00 00 00 00 00 00 39 39 39 39 39 39 39 39 39 01 ASCII: U N K A T A I D X 9 9 9 9 9 9 9 9 9
SHARYO.IDX - bytes
#Header - 32 bytes: \/ Page (1) \/ Number of records Byte : 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Hex : 53 48 41 52 59 4F 20 20 49 44 58 00 11 01 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 ASCII: S H A R Y O I D X Data : PA PA NU 11 1 6 #VIN (02) - 21 bytes \/-- Count Column (2) { 17 bytes } Byte : 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 Hex : 34 41 33 41 43 38 34 4C 33 59 45 30 35 31 32 36 31 02 00 00 00 ASCII: 4 A 3 A C 8 4 L 3 Y E 0 5 1 2 6 1 Data : 2 NU NU NU #VIN (03) - 21 bytes Hex : 34 41 33 43 53 34 34 54 58 4D 45 30 30 36 31 30 36 03 00 00 00 ASCII: 4 A 3 C S 4 4 T X M E 0 0 6 1 0 6 Data : 3 NU NU NU #VIN (04) - 21 bytes Hex : 4A 41 33 41 4D 36 34 4A 37 52 59 30 30 35 33 35 33 04 00 00 00 ASCII: J A 3 A M 6 4 J 7 R Y 0 0 5 3 5 3 Data : 4 NU NU NU #VIN (05) - 21 bytes Hex : 4A 41 34 47 4A 33 31 53 31 4D 4A 30 31 33 39 31 34 05 00 00 00 ASCII: J A 4 G J 3 1 S 1 M J 0 1 3 9 1 4 Data : 5 NU NU NU #VIN (06) - 21 bytes Hex : 4A 41 37 4C 53 32 31 47 34 52 50 30 31 32 37 33 34 06 00 00 00 ASCII: J A 7 L S 2 1 G 4 R P 0 1 2 7 3 4 Data : 6 NU NU NU #??? (07) - 18 bytes Hex : 5A 31 36 41 57 59 30 59 30 30 31 36 39 37 20 20 20 07 ... \ ASCII: Z 1 6 A W Y 0 Y 0 0 1 6 9 7 ... + 1893 Null Bytes (2048 byte total header space) Data : PA PA PA 7 ... /
| Always 11?? #Header 2 (Start at 2048 Bytes) - 32 Bytes \/ \/Page (2) \/ Number of records Byte : 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Hex : 53 48 41 52 59 4F 20 20 49 44 58 00 11 02 00 01 01 00 01 00 00 00 60 00 00 00 00 00 00 00 00 00 ASCII: S H A R Y O I D X ' Data : PA PA NU 11 2 1 1 1 60 #Indexes from page 2 { 17 bytes } \/-- Count Column (8) Hex : 32 36 41 58 4E 20 20 45 30 38 37 35 34 31 20 20 20 08 00 00 00 ASCII: 2 6 A X N E 0 8 7 5 4 1 Data : PA PA PA PA PA 8 NU NU NU Hex : 33 34 42 31 52 20 20 45 30 39 35 37 37 32 20 20 20 09 00 00 00 ASCII: 3 4 B 1 R E 0 9 5 7 7 2 Data : PA PA PA PA PA 9 NU NU NU Hex : 33 34 42 33 52 20 20 45 30 38 32 30 37 30 20 20 20 0A 00 00 00 ASCII: 3 4 B 3 R E 0 8 2 0 7 0 Data : PA PA PA PA PA 10 NU NU NU
#Header 3 Byte : 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Hex : 53 48 41 52 59 4F 20 20 49 44 58 00 11 03 00 01 01 00 02 00 00 00 60 00 00 00 00 00 00 00 00 00 ASCII: S H A R Y O I D X ' Data : PA PA NU 11 3 1 1 2 60 #Indexes from page 3 \/-- Count Column (68) Hex : 34 41 33 41 43 38 34 4C 39 59 45 30 31 38 33 37 36 68 00 00 00 ASCII: 4 A 3 A C 8 4 L 9 Y E 0 1 8 3 7 6 h Data : 68 NU NU NU Hex : 34 41 33 41 45 34 35 47 31 33 45 31 33 38 36 34 30 69 00 00 00 ASCII: 4 A 3 A E 4 5 G 1 3 E 1 3 8 6 4 0 i Data : 69 NU NU NU Hex : 34 41 33 41 45 34 35 47 36 31 45 30 33 30 33 32 30 6A 00 00 00 ASCII: 4 A 3 A E 4 5 G 6 1 E 0 3 0 3 2 0 j Data : 6A NU NU NU Hex: ASCII: Data: