Page 1 of 1

Reading nVault Files

Posted: Sat Sep 26, 2026 4:55 pm
by Archive-Poster
I wrote this code for those who may have the need to iterate through all entries in a nVault file. Please let me know if you notice any errors or have any requests/questions.

The below code will display all entries in the server console in the below format.

Code: Select all

nVault | Magic=1851149396 Version=512 Entries=2

Entry=1 KeyLen=22 ValLen=29 TimeStamp=1272719603
Key="This is an example key"
Val="This is the data for this key"
 
Entry=2 KeyLen=27 ValLen=9 TimeStamp=1272719618
Key="This is another example key"
Val="More data"

Code: Select all

#include <amxmodx>
#include <amxmisc>

// - From nvault.h -
#define VAULT_MAGIC   0x6E564C54     //nVLT
#define VAULT_VERSION 0x0200         //second version

/*  
    nVault File Format
 
    VAULT_MAGIC       (uint32)
    VAULT_VERSION     (uint16)
    ENTRIES           (int32)
    [
        TimeStamp     (int32)
        KeyLen        (uint8)
        ValLen        (uint16)
        KeyData       ([])
        ValData       ([])
    ]                                 
*/

new const Version[] = "0.1";

const MaxKeyLen  = 255;     //Max 255
const MaxValLen  = 512;     //Max 65535
const DataBuffer = 128;     //Make this the greater of (MaxKeyLen / 4) or (MaxValLen / 4)

public plugin_init() 
{
    register_plugin( "nVault File Reader" , Version , "bugsy" );
    
    ReadVault( "TheVaultFile" );
}

public ReadVault( const szVault[] )
{
    new szFile[ 64 ] , iFile;
    new iVaultMagic , iVaultVersion , iVaultEntries;
    new iKeyLen , iValLen , iTimeStamp;
    new szKey[ MaxKeyLen + 1 ] , szVal[ MaxValLen + 1 ] , RawData[ DataBuffer ];
    
    formatex( szFile[ get_datadir( szFile , charsmax( szFile ) ) ] , charsmax( szFile ) , "/vault/%s.vault" , szVault );
    
    iFile = fopen( szFile , "rb" );

    if ( !iFile )
        return 0;
    
    // Vault Magic
    fread_raw( iFile , RawData , 1 , BLOCK_INT );
    iVaultMagic = RawData[ 0 ];
    
    if ( iVaultMagic != VAULT_MAGIC )
        set_fail_state( "Error reading nVault: Vault Magic" );
    
    // Vault Version
    fread_raw( iFile , RawData , 1 , BLOCK_SHORT );
    iVaultVersion = RawData[ 0 ] & 0xFFFF;
    
    if ( iVaultVersion != VAULT_VERSION )
        set_fail_state( "Error reading nVault: Vault Version" );
        
    // Vault Entries
    fread_raw( iFile , RawData , 1 , BLOCK_INT );
    iVaultEntries = RawData[ 0 ];

    server_print( "nVault | Magic=%d Version=%d Entries=%d" , iVaultMagic , iVaultVersion , iVaultEntries );
    server_print( " " );

    for ( new iEntry = 0 ; iEntry < iVaultEntries ; iEntry++ )
    {
        // TimeStamp
        fread_raw( iFile , RawData , 1 , BLOCK_INT );
        iTimeStamp = RawData[ 0 ];
        
        // Key Length
        fread_raw( iFile , RawData , 1 , BLOCK_BYTE );
        iKeyLen = RawData[ 0 ] & 0xFF;
        
        // Val Length
        fread_raw( iFile , RawData , 1 , BLOCK_SHORT );
        iValLen = RawData[ 0 ] & 0xFFFF;
        
        // Key Data
        fread_raw( iFile , RawData , iKeyLen , BLOCK_CHAR );
        ReadString( szKey , iKeyLen , charsmax( szKey ) , RawData );
    
        // Val Data
        fread_raw( iFile , RawData , iValLen , BLOCK_CHAR );
        ReadString( szVal , iValLen , charsmax( szVal ) , RawData );

        server_print( "Entry=%d KeyLen=%d ValLen=%d TimeStamp=%d" , iEntry , iKeyLen , iValLen , iTimeStamp );
        server_print( "Key=^"%s^"" , szKey );
        server_print( "Val=^"%s^"" , szVal );
        server_print( " " );
    }
    
    fclose( iFile );
    
    return iVaultEntries;
}

ReadString( szDestString[] , iLen , iMaxLen , SourceData[] )
{
    new iStrPos = -1;
    new iRawPos = 0;
    
    while ( ( ++iStrPos < iLen ) && ( iStrPos < iMaxLen ) && ( iRawPos < DataBuffer ) )
    {
        szDestString[ iStrPos ] = ( SourceData[ iRawPos ] >> ( ( iStrPos % 4 ) * 8 ) ) & 0xFF;
        
        if ( iStrPos && ( ( iStrPos % 4 ) == 3 ) )
            iRawPos++
    }
    
    szDestString[ iStrPos ] = EOS;
}