An analysis of the files used by Visual Source Safe 6.0
July 2008, Anthony Dunk
NOTE: The information in this document is not guaranteed to be correct. You use it at your own risk. Always keep a backup of your source safe repository files.
The VSS/data folder
VSS's main "data" folder contains sub-folders "a" thru "z" which contain
the files that are checked into Source Safe and their deltas. It also contains folders called "labels", "locks", and "loggedin".
As well, the following files are present in the main folder:
- aaaaaaaa.cnt - an 8-byte file which contains the name of the last file added to source safe e.g. "AAAAAAAA"
- crcs.dat - Initially 72 bytes, grows by 4 bytes for each folder or 8 bytes for each file added to source safe control. Contains a CRC checksum value used to speed up the get and check-out processes.
- names.dat - Initially 107 bytes - grows when files added with names which do not fit into the old DOS 8.3 filename format. The DOS equivalent filename is recorded using the tilda ("~") notation.
- rights.dat - Initially 720 bytes, grows by 148 bytes for each folder or user added. Stores relationships between users and project rights.
- rights.bak - Backup file. Always seems to be an exact copy of rights.dat.
- status.dat - Initially 76 bytes, grows by 4 bytes for each folder or file added to source safe control. A cache which records the files that are checked out.
- um.dat - User management file - a list of all VSS users, their passwords, and the database identifier (GUID) - usually 64 bytes per user starting from offset 0x007c (Nof users at offset 0x3c)
- version.dat - A two-byte binary file containing the version of VSS used to create the VSS database (e.g. 0x06 0x00)
The um.dat file
This is the user management file, and has the following contents:
0x0000: ID String = "UserManagement@Microsoft"
0x003c: Number of VSS users recorded (2-byte int)
0x007c: Length of next user record (4-byte int)
0x0080: User record is as layed out below (Usually 64 bytes, except for last record in file which is 60 bytes because the last field is absent)
0x0002: Checksum of this record (2 bytes) (Must be recomputed if anything changes in user record otherwise VSS reports um.dat is corrupt)
0x0004: User name (32 bytes, including zero terminator) (e.g. "Admin")
0x0024: Hash of password for this user or 0x90 0x6e if no password (2 bytes)
0x0026: Permissions flag: 0x00=Read-Write, 0x01=Read-Only
0x0028: Offset of 148 byte record for this user in the file rights.dat (4 bytes)
0x003c: Length of next user record (4-byte int)
There is a command-line program which will convert a VSS password to the hash value stored in the um.dat file here,
but the actual 15 character cipher text used by VSS has been intentionally obscured with x's.
The rights.dat file
0x0114: Number of users in the um.dat file.
0x0120: A table of 8 byte entries for each user. First 4 bytes are offset in this file to rights info for that user (which is an 148 byte record).
The 5th byte is permissions for this user(0x0F=Read-Write, 0x01=Read-Only)
The names.dat file
0x0000: ID (50 00 00 00 48 4E)
0x0018: File size in bytes (4-byte int)
0x0058: Table of short file names in 8.3 format starts.
The "loggedin" folder
This folder simply contains a zero-sized file called xxxx.log for each user that is currently
using VSS, where xxxx is the user name. It can also contain the file Admin.lck if the database is locked.
The "labels" folder
The labels folder contains text files which list the versions of projects to be labelled for each user label created.
The "locks" folder
This is used if VSS locking is enabled.
The "a" thru "z" data folders
These folders each contain a series of files with names such as caaaaaaa and caaaaaaa.a. The file with no suffix is the file that contains
the history information, while the file associated with it which has a ".a" or ".b" suffix is the data file and holds the current contents of the file as
last checked-in by the user. Each time a file is checked in the suffix alternates between ".a" and ".b". (Sometimes problems can occur in VSS which leave the history and data files out of sync with each other. These problems can usually be remedied by swapping the suffix on the affected file from ".a" to ".b" or vice-versa. However, Microsoft recommends against doing this because it can make the file history inaccessible. They say you should restore the file pair from a recent backup instead. Refer to the link at the bottom of this page).
The history/log file has the following header contents, amongst other things:
0x0000: ID string = "SourceSafe@Microsoft"
0x0020: Flag: 01=Folder, 02=File
0x0022: Values 0x06 0x00 - Version of Source Safe perhaps
0x003e: Number of history entries
0x006B: The character suffix for the associated data file (usually 0x41 ("A") or 0x42 ("B"))
The VSS/users folder
This folder contains the Template.ini file which is used when a new VSS user is created.
There is also a folder for each existing user and each contains a text file called ss.ini which contains user settings for VSS as well as the
working folder for each project. This is supposed to be kept less than 64K in size.