Skip to content

The Norton Guide Database File Format

Background

The following text is a rough guide to the file format of a Norton Guide database. The information has been pieced together from other sources and from my investigations while writing Norton Guide readers. It isn't fully complete but it should be enough to get anyone started.

If you are able to fill in any of the blanks please feel free to drop me a line with any information you've got.

Introduction

A Norton Guide database consists of a header followed by a series of encrypted records. There are three record types, each of which have an associated ID:

Record Type ID
Short Entry 0
Long Entry 1
Menu 2

Encryption

Short, long and menu entries are all encrypted. The encryption is a simple XOR 26 scheme. Example C code to decrypt this is:

unsigned char ng_decrypt( unsigned char b )
{
    return( (unsigned char) ( b ^ 0x1A ) );
}

Compression

The text of short, long and menu entries uses a simple form of run-length encoding for spaces. If, when reading text, you encounter a byte value of 255 you should read the next byte and take that as a count of spaces.

The Header

Field Size Notes
Magic Value short 0x474e is a Norton Guide database, 0x4845 is an Expert Help database.
Unknown short
Unkknown short
Menu count short Count of the number of main menus.
Title char[40] The text is NUL terminated if the length is less than 40 characters.
Credit line 1 char[66] The text is NUL terminated if the length is less than 66 characters.
Credit line 2 char[66] The text is NUL terminated if the length is less than 66 characters.
Credit line 3 char[66] The text is NUL terminated if the length is less than 66 characters.
Credit line 4 char[66] The text is NUL terminated if the length is less than 66 characters.
Credit line 5 char[66] The text is NUL terminated if the length is less than 66 characters.

The Short Entry

Field Size Notes
ID short Value is always 0
Length short The length of the record in bytes.
Line Count short The count of lines in the entry.
Unknown short
Parent Line short The number of the line in the parent entry that points to this entry.
Parent long The file offset of the parent entry.
Menu short The number of the menu that points to this entry.
Menu Prompt short The number of the menu prompt that points to this entry.
Unkonwn char[8]
Pointers long[Line Count] This is an array of file offsets, each offset points to the entry that each line jumps to.
Lines Line Count lines of NUL terminated text.

The Long Entry

Field Size Notes
ID short Value is always 1
Length short The length of the record in bytes.
Line Count short The count of lines in the entry.
See Also Flag short Flag to indicate if there are any see-also items.
Parent Line short The number of the line in the parent entry that points here.
Parent long The file offset of the parent entry.
Menu short The number of the menu that points to this entry.
Menu Prompt short The number of the menu prompt that points to this entry.
Previous long The file offset of the previous entry.
Next long The file offset of the next entry.
Lines Line Count lines of NUL terminated text.

Plus, if and only if the See Also Flag is not 0...

Field Size Notes
See Also Count short The count of see also entries.
Pointers long An array of file offsets, each offset points to the entry associated with the see also.
See Alsos See Also Count lines of NUL terminated text.

The Menu Entry

Field Size Notes
ID short Value is always 2
Length short The length of the record in bytes.
Prompt Count short The count of the number of prompts in the menu.
Unknown char[20]
Pointers long[Prompt Count] This is an array of file offsets, each offset points to the entry that each menu prompt jumps to.
Unkonwn char[8*Prompt Count]
Title The menu's title, a NUL terminated string with a maximum of 40 characters1
Prompts The menu prompts, Prompt Count NUL terminated strings with a maximum of 50 characters each2


  1. Although I have found guides with longer titles, so it's a good idea to take this into account. 

  2. Although I have found guides with longer prompts, so it's a good idea to take this into account.