DSM/Mitsubishi CAPS
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 database 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 11 1 6
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 01h 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 | Marks the page as containing records the contain the byte offset to read from the DAT file,
depth will not increase past the first page once set |
21 | ? | Unknown/unobserved |
22 | Record count | The number of records contained on this page |
23-31 | ? | Unknown/unobserved |
index entry
Byte # | Description | |
---|---|---|
0-n | Data bytes | This is a record's data bytes, n = the page's header at byte |
n+1, n+2, n+3 | 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
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: