#include <string>
#include <vector>
#ifdef _WIN32
- #include <io.h>
- #include <conio.h>
+#include <io.h>
#else
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
#include <math.h>
#include <vector>
-
+#include <conio.h>
+#include <sstream>
#include "Public.h"
#include "MemoryPool.h"
+#include "RTIReader.h"
+#include "RTReader.h"
using namespace std;
_finddata_t fd;
long handle = _findfirst(sWildCharPathName.c_str(), &fd);
- if (handle != -1)
- {
- do
- {
+ if (handle != -1) {
+ do {
string sName = fd.name;
- if (sName != "." && sName != ".." && !(fd.attrib & _A_SUBDIR))
- {
+ if (sName != "." && sName != ".." && !(fd.attrib & _A_SUBDIR)) {
string sPathName = sPath + sName;
vPathName.push_back(sPathName);
}
int nIndex = sPathName.find_last_of('/');
#endif
string sFileName;
- if (nIndex != -1)
+ if (nIndex != -1) {
sFileName = sPathName.substr(nIndex + 1);
- else
+ }
+ else {
sFileName = sPathName;
- // Info
- printf("%s:\n", sFileName.c_str());
- FILE* file = fopen(sPathName.c_str(), "rb");
- FILE* fileR = fopen(sResultFileName.c_str(), "wb");
+ }
unsigned int distribution[64] = {0};
unsigned int numProcessedChains = 0;
-
- if (file != NULL && fileR != NULL)
- {
+ FILE* fileR;
+ BaseRTReader *reader = NULL;
+ if(sPathName.substr(sPathName.length() - 2, sPathName.length()) == "rt")
+ reader = (BaseRTReader*)new RTReader(sPathName);
+ else if(sPathName.substr(sPathName.length() - 3, sPathName.length()) == "rti")
+ reader = (BaseRTReader*)new RTIReader(sPathName);
+ if(reader == NULL) {
+ printf("%s is not a supported file (Only RT and RTI is supported)\n", sPathName.c_str());
+ return;
+ }
+ // Info
+ printf("%s:\n", sFileName.c_str());
+ if(showDistribution == 0) {
+ fileR = fopen(sResultFileName.c_str(), "wb");
+ }
+ if (fileR != NULL || showDistribution == 1) {
// File length check
- UINT4 nFileLen = GetFileLen(file);
- UINT4 nTotalChainCount = 0;
- if(hascp == 0) nTotalChainCount = nFileLen / 16;
- else nTotalChainCount = nFileLen / 18;
- if ((hascp == 0 && nFileLen % 16 != 0) || (hascp == 1 && nFileLen % 18 != 0))
- {
- printf("file length mismatch\n");
- }
- else
- {
+
+ int size = reader->GetChainsLeft() * sizeof(RainbowChain);
static CMemoryPool mp;
unsigned int nAllocatedSize;
- RainbowChainCP* pChain = (RainbowChainCP*)mp.Allocate(nFileLen, nAllocatedSize);
-
+ RainbowChain* pChain = (RainbowChain*)mp.Allocate(size, nAllocatedSize);
unsigned int chainrowsize = ceil((float)(rti_startptlength + rti_endptlength + rti_cplength) / 8) * 8 ; // The size in bits (in whole bytes)
unsigned int chainrowsizebytes = chainrowsize / 8;
-
- if (pChain != NULL)
- {
- nAllocatedSize = nAllocatedSize / sizeof(RainbowChainCP) * sizeof(RainbowChainCP);
- fseek(file, 0, SEEK_SET);
+ if (pChain != NULL) {
+ nAllocatedSize = nAllocatedSize / sizeof(RainbowChain) * sizeof(RainbowChain);
+ unsigned int nChains = nAllocatedSize / sizeof(RainbowChain);
uint64 curPrefix = 0, prefixStart = 0;
vector<IndexRow> indexes;
- UINT4 nRainbowChainCountRead = 0;
- while (true) // Chunk read loop
- {
+ while(reader->GetChainsLeft() > 0) {
+
/* if (ftell(file) == nFileLen)
break;*/
- UINT4 nReadThisRound;
- memset(pChain, 0x00, nAllocatedSize);
- printf("reading...\n");
+ int nReadThisRound;
clock_t t1 = clock();
- for(nReadThisRound = 0; nReadThisRound < nAllocatedSize / sizeof(RainbowChainCP) && nRainbowChainCountRead < nTotalChainCount; nReadThisRound++)
- {
- if(fread(&pChain[nReadThisRound], 16, 1, file) != 1)
- {
- printf("Error reading file\n"); exit(1);
- }
- if(hascp == 1)
- {
- if(fread(&pChain[nReadThisRound].nCheckPoint, 2, 1, file) != 1)
- {
- printf("Error reading file\n"); exit(2);
- }
- }
- nRainbowChainCountRead++;
- }
+ printf("reading...\n");
+#ifdef _MEMORYDEBUG
+ printf("Grabbing %i chains from file\n", nChains);
+#endif
+ reader->ReadChains(nChains, pChain);
+#ifdef _MEMORYDEBUG
+ printf("Recieved %i chains from file\n", nChains);
+#endif
clock_t t2 = clock();
float fTime = 1.0f * (t2 - t1) / CLOCKS_PER_SEC;
- int nDataRead = nRainbowChainCountRead * 16;
- if(hascp == 1) nDataRead += nRainbowChainCountRead * 2; // Add the index readings too
- printf("%u bytes read, disk access time: %.2f s\n", nDataRead , fTime);
+ printf("reading time: %.2f s\n", fTime);
+ printf("converting %i chains...\n", nChains);
t1 = clock();
-
- for(UINT4 i = 0; i < nReadThisRound; i++)
- {
- if(showDistribution == 1)
- {
+ for(int i = 0; i < nChains; i++) {
+ if(showDistribution == 1) {
distribution[GetMaxBits(pChain[i].nIndexS)-1]++;
}
else
{
uint64 chainrow = pChain[i].nIndexS; // Insert the complete start point
chainrow |= ((uint64)pChain[i].nIndexE & (0xffffffff >> (32 - rti_endptlength))) << rti_startptlength; //
- if(hascp == 1 && rti_cplength > 0)
- {
+/* if(hascp == 1 && rti_cplength > 0) {
chainrow |= (uint64)pChain[i].nCheckPoint << rti_startptlength + rti_endptlength;
- }
+ }*/
fwrite(&chainrow, 1, chainrowsizebytes, fileR);
uint64 prefix = pChain[i].nIndexE >> rti_endptlength;
if(i == 0) curPrefix = prefix;
- if(prefix != curPrefix && numProcessedChains - prefixStart > 0)
- {
- if(prefix < curPrefix)
- {
- printf("**** Error writeChain(): Prefix is smaller than previous prefix. %llu < %llu****\n", prefix, curPrefix);
- exit(1);
- }
- //unsigned char index[11] = {0}; // [0 - 10]
- unsigned int numchains = numProcessedChains - prefixStart;
- IndexRow index;
- index.prefix = curPrefix;
+ if(prefix != curPrefix && numProcessedChains - prefixStart > 0) {
+ if(prefix < curPrefix) {
+ printf("**** Error writeChain(): Prefix is smaller than previous prefix. %llu < %llu****\n", prefix, curPrefix);
+ exit(1);
+ }
+ //unsigned char index[11] = {0}; // [0 - 10]
+ unsigned int numchains = numProcessedChains - prefixStart;
+ IndexRow index;
+ index.prefix = curPrefix;
// index.prefixstart = prefixStart;
- index.numchains = numchains;
- indexes.push_back(index);
- prefixStart = numProcessedChains;
- curPrefix = prefix;
+ index.numchains = numchains;
+ indexes.push_back(index);
+ prefixStart = numProcessedChains;
+ curPrefix = prefix;
}
}
numProcessedChains++;
t2 = clock();
fTime = 1.0f * (t2 - t1) / CLOCKS_PER_SEC;
printf("conversion time: %.2f s\n", fTime);
- if(nRainbowChainCountRead == nTotalChainCount)
- break;
- if(showDistribution == 1)
- {
- for(int i = 0; i < 64; i++)
- {
+ if(showDistribution == 1) {
+ for(int i = 0; i < 64; i++) {
printf("%u - %u\n", (i+1), distribution[i]);
}
+ delete reader;
return;
}
fwrite(&rti_endptlength, 1, 1, pFileIndex);
fwrite(&rti_cplength, 1, 1, pFileIndex);
// fwrite(&m_rti_index_indexlength , 1, 1, pFileIndex);
+
fwrite(&m_rti_index_numchainslength, 1, 1, pFileIndex);
- for(UINT4 i = 0; i < rti_cppos.size(); i++)
- {
+ for(UINT4 i = 0; i < rti_cppos.size(); i++) {
fwrite(&rti_cppos[i], 1, 4, pFileIndex); // The position of the checkpoints
}
// fwrite(&m_rti_index_prefixlength, 1, 1, pFileIndex);
int zero = 0;
fwrite(&indexes[0].prefix, 1, 8, pFileIndex); // Write the first prefix
unsigned int lastPrefix = 0;
- for(UINT4 i = 0; i < indexes.size(); i++)
- {
- if(i == 0)
+ for(UINT4 i = 0; i < indexes.size(); i++) {
+ if(i == 0) {
lastPrefix = indexes[0].prefix;
+ }
+ unsigned int indexrow = 0;
// Checks how big a distance there is between the current and the next prefix. eg cur is 3 and next is 10 = 7.
unsigned int diffSize = indexes[i].prefix - lastPrefix;
- if(i > 0 && diffSize > 1)
- {
+ if(i > 0 && diffSize > 1) {
//indexrow |= indexes[i].prefixstart;
//printf("Diffsize is %u\n", diffSize);
}
fclose(pFileIndex);
}
- else printf("memory allocation fail\n");
-
-
- // Already finished?
-
- }
- fclose(file);
+ else {
+ printf("memory allocation fail\n");
+ }
+ // Already finished?
}
- else
+ else {
printf("can't open file\n");
-
+ }
+ if(reader != NULL)
+ delete reader;
+ if(fileR != NULL) {
+ fclose(fileR);
+ }
+
}
int main(int argc, char* argv[])
int usecp = 0;// How many bits to use from the index
int hascp = 0;
vector<unsigned int> cppositions;
- if (argc == 1)
- {
+ if (argc == 1) {
Usage();
return 0;
}
- else if(argc > 2)
- {
+ else if(argc > 2) {
for (; argi < argc; argi++)
{
- if (strcmp(argv[argi], "-d") == 0 && (argsUsed & 0x8) == 0)
- {
+ if(strcmp(argv[argi], "-d") == 0 && (argsUsed & 0x8) == 0) {
// Enable verbose mode
argsUsed |= 0x8;
showDistribution = 1;
}
- else if (strncmp(argv[argi], "-sptl=", 6) == 0 && (argsUsed & 0x1) == 0)
- {
+ else if (strncmp(argv[argi], "-sptl=", 6) == 0 && (argsUsed & 0x1) == 0) {
// Maximum index for starting point
argsUsed |= 0x1;
sptl = 0;
- for (i = 6; argv[argi][i] >= '0' && argv[argi][i] <= '9'; i++)
- {
+ for (i = 6; argv[argi][i] >= '0' && argv[argi][i] <= '9'; i++) {
sptl *= 10;
sptl += ((int) argv[argi][i]) - 0x30;
}
- if (argv[argi][i] != '\0')
- {
+ if (argv[argi][i] != '\0') {
printf("Error: Invalid number.\n\n");
Usage();
return 1;
}
- if (i > 23) // i - 3 > 20
- {
+ if (i > 23) { // i - 3 > 20
printf("Error: Number is too large.\n\n");
Usage();
return 1;
}
}
- else if (strncmp(argv[argi], "-eptl=", 6) == 0 && (argsUsed & 0x2) == 0)
- {
+ else if (strncmp(argv[argi], "-eptl=", 6) == 0 && (argsUsed & 0x2) == 0) {
// Maximum index for ending points
argsUsed |= 0x2;
eptl = 0;
- for (i = 6; argv[argi][i] >= '0' && argv[argi][i] <= '9'; i++)
- {
+ for (i = 6; argv[argi][i] >= '0' && argv[argi][i] <= '9'; i++) {
eptl *= 10;
eptl += ((int) argv[argi][i]) - 0x30;
}
- if (argv[argi][i] != '\0')
- {
+ if (argv[argi][i] != '\0') {
printf("Error: Invalid number.\n\n");
Usage();
return 1;
}
- if (i > 23) // i - 3 > 20
- {
+ if (i > 23) { // i - 3 > 20
printf("Error: Number is too large.\n\n");
Usage();
return 1;
}
}
- else if(strncmp(argv[argi], "-usecp=", 7) == 0 && (argsUsed & 0x4) == 0)
- {
+ else if(strncmp(argv[argi], "-usecp=", 7) == 0 && (argsUsed & 0x4) == 0) {
argsUsed |= 0x4;
hascp = 1;
usecp = 0;
unsigned int cppos = 0;
- for(i = 7; argv[argi][i] != ' ' && argv[argi][i] != '\n' && argv[argi][i] != 0;)
- {
+ for(i = 7; argv[argi][i] != ' ' && argv[argi][i] != '\n' && argv[argi][i] != 0;) {
if(cppositions.size() > 0) i++;
for (; argv[argi][i] >= '0' && argv[argi][i] <= '9'; i++)
{
cppos = 0;
//}
}
- if (argv[argi][i] != '\0')
- {
+ if (argv[argi][i] != '\0') {
printf("Error: Invalid number.\n\n");
Usage();
return 1;
}
- if (usecp > 16) // i - 3 > 20
- {
+ if (usecp > 16) { // i - 3 > 20
printf("Error: Number is too large.\n\n");
Usage();
return 1;
}
- else printf("Using %i bits of the checkpoints\n", usecp);
+ else {
+ printf("Using %i bits of the checkpoints\n", usecp);
+ }
}
}
#else
GetTableList(argc, argv, vPathName);
#endif
- if (vPathName.size() == 0)
- {
+ if (vPathName.size() == 0) {
printf("no rainbow table found\n");
return 0;
}
- for (UINT4 i = 0; i < vPathName.size(); i++)
- {
+ for (UINT4 i = 0; i < vPathName.size(); i++) {
string sResultFile;
int n = vPathName[i].find_last_of('\\');
- if (n != -1)
- sResultFile = vPathName[i].substr(n+1, vPathName[i].length()) + "i2";
- else
- sResultFile = vPathName[i] + "i2"; // Resulting file is .rt, not .rti
- printf("Using %i of 64 bits. sptl: %i, eptl: %i, cp: %i. Chains will be %i bytes in size\n", (sptl + eptl + usecp), sptl, eptl, usecp, ((sptl + eptl + usecp) / 8));
- if(sptl + eptl + usecp > 64)
- {
+ if (n != -1) {
+ if(vPathName[i].substr(vPathName[i].length() - 3, vPathName[i].length()) == "rti") {
+ sResultFile = vPathName[i].substr(n+1, vPathName[i].length()) + "2";
+ }
+ else {
+ sResultFile = vPathName[i].substr(n+1, vPathName[i].length()) + "i2";
+ }
+ }
+ else {
+ if(vPathName[i].substr(vPathName[i].length() - 3, vPathName[i].length()) == "rti") {
+ sResultFile = vPathName[i] + "2";
+ } else {
+ sResultFile = vPathName[i] + "i2"; // Resulting file is .rt, not .rti
+ }
+ }
+ if(usecp == 0 && showDistribution == 0) {
+ printf("Using %i of 64 bits. sptl: %i, eptl: %i, cp: %i. Chains will be %i bytes in size\n", (sptl + eptl + usecp), sptl, eptl, usecp, ((sptl + eptl + usecp) / 8));
+ }
+ if(sptl + eptl + usecp > 64) {
exit(1);
}
ConvertRainbowTable(vPathName[i], sResultFile, sptl, eptl, showDistribution, hascp, usecp, cppositions);
printf("\n");
}
return 0;
-}
+}
\ No newline at end of file
-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual Studio 2008
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "converti2", "converti2.vcproj", "{066FD6F1-5990-47AD-B095-7AE0029CF5AE}"
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "converti2", "converti2.vcxproj", "{066FD6F1-5990-47AD-B095-7AE0029CF5AE}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rcracki_mt", "..\rcracki_mt\rcracki_mt.vcproj", "{D484ABA1-C117-4AB1-B361-22E5EA62FA00}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rcracki_mt", "..\rcracki_mt\rcracki_mt.vcxproj", "{966DA4B4-E13C-449D-9A93-303C6FEA25C4}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
{066FD6F1-5990-47AD-B095-7AE0029CF5AE}.Debug|Win32.Build.0 = Debug|Win32
{066FD6F1-5990-47AD-B095-7AE0029CF5AE}.Release|Win32.ActiveCfg = Release|Win32
{066FD6F1-5990-47AD-B095-7AE0029CF5AE}.Release|Win32.Build.0 = Release|Win32
- {D484ABA1-C117-4AB1-B361-22E5EA62FA00}.Debug|Win32.ActiveCfg = Debug|Win32
- {D484ABA1-C117-4AB1-B361-22E5EA62FA00}.Debug|Win32.Build.0 = Debug|Win32
- {D484ABA1-C117-4AB1-B361-22E5EA62FA00}.Release|Win32.ActiveCfg = Release|Win32
- {D484ABA1-C117-4AB1-B361-22E5EA62FA00}.Release|Win32.Build.0 = Release|Win32
+ {966DA4B4-E13C-449D-9A93-303C6FEA25C4}.Debug|Win32.ActiveCfg = Debug|Win32
+ {966DA4B4-E13C-449D-9A93-303C6FEA25C4}.Debug|Win32.Build.0 = Debug|Win32
+ {966DA4B4-E13C-449D-9A93-303C6FEA25C4}.Release|Win32.ActiveCfg = Release|Win32
+ {966DA4B4-E13C-449D-9A93-303C6FEA25C4}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{066FD6F1-5990-47AD-B095-7AE0029CF5AE}</ProjectGuid>
+ <RootNamespace>convertrti2</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>../../Common/rt api;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <AdditionalIncludeDirectories>../../Common/rt api;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\Common\rt api\BaseRTReader.cpp" />
+ <ClCompile Include="..\..\Common\rt api\RTIReader.cpp" />
+ <ClCompile Include="..\..\Common\rt api\RTReader.cpp" />
+ <ClCompile Include="converti2.cpp" />
+ <ClCompile Include="..\..\Common\rt api\MemoryPool.cpp" />
+ <ClCompile Include="..\..\Common\rt api\Public.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\Common\rt api\BaseRTReader.h" />
+ <ClInclude Include="..\..\Common\rt api\MemoryPool.h" />
+ <ClInclude Include="..\..\Common\rt api\Public.h" />
+ <ClInclude Include="..\..\Common\rt api\RTIReader.h" />
+ <ClInclude Include="..\..\Common\rt api\RTReader.h" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+ </Filter>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="converti2.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\Common\rt api\MemoryPool.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\Common\rt api\Public.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\Common\rt api\BaseRTReader.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\Common\rt api\RTIReader.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\Common\rt api\RTReader.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\Common\rt api\MemoryPool.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\Common\rt api\Public.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\Common\rt api\RTIReader.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\Common\rt api\RTReader.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\Common\rt api\BaseRTReader.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+</Project>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <LocalDebuggerCommandArguments>C:\Users\mwj\Desktop\tables\*.rti -d</LocalDebuggerCommandArguments>
+ <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
+ </PropertyGroup>
+</Project>
\ No newline at end of file
sFileName = sPathName.substr(nIndex + 1);
else
sFileName = sPathName;
+
// Info
printf("%s:\n", sFileName.c_str());
FILE *fResult = fopen(sResultFileName.c_str(), "wb");
static CMemoryPool mp;
unsigned int nAllocatedSize;
BaseRTReader *reader = NULL;
-
if(sType == "RTI2")
reader = (BaseRTReader*)new RTI2Reader(sFileName);
else if(sType == "RTI")
printf("Invalid table type '%s'", sType.c_str());
return ;
}
-
- RainbowChainCP* pChain = (RainbowChainCP*)mp.Allocate(reader->GetChainsLeft() * sizeof(RainbowChainCP), nAllocatedSize);
+ int size = reader->GetChainsLeft() * sizeof(RainbowChain);
+#ifdef _MEMORYDEBUG
+ printf("Starting allocation of %i bytes\n", size);
+#endif
+ RainbowChain* pChain = (RainbowChain*)mp.Allocate(size, nAllocatedSize);
+#ifdef _MEMORYDEBUG
+ printf("Finished. Got %i bytes\n", nAllocatedSize);
+#endif
if (pChain != NULL)
{
- nAllocatedSize = nAllocatedSize / sizeof(RainbowChainCP) * sizeof(RainbowChainCP); // Round to boundary
- unsigned int nChains = nAllocatedSize / sizeof(RainbowChainCP);
+ nAllocatedSize = nAllocatedSize / sizeof(RainbowChain) * sizeof(RainbowChain); // Round to boundary
+ unsigned int nChains = nAllocatedSize / sizeof(RainbowChain);
while(reader->GetChainsLeft() > 0)
{
+#ifdef _MEMORYDEBUG
+ printf("Grabbing %i chains from file\n", nChains);
+#endif
reader->ReadChains(nChains, pChain);
+#ifdef _MEMORYDEBUG
+ printf("Recieved %i chains from file\n", nChains);
+#endif
for(UINT4 i = 0; i < nChains; i++)
{
fwrite(&pChain[i], 1, 16, fResult);
printf("\n");
}
return 0;
-}
+}
\ No newline at end of file
-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual Studio 2008
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rti2rto", "rti2rto.vcproj", "{E0FBC06A-C902-4468-A614-CBF9F591AA7C}"
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rti2rto", "rti2rto.vcxproj", "{E0FBC06A-C902-4468-A614-CBF9F591AA7C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
#include "Public.h"
#include <string>
#ifdef WIN32
-#include <io.h>
+ #include <io.h>
#endif
using namespace std;
class BaseRTReader
{
public:
- virtual int ReadChains(unsigned int &numChains, RainbowChainCP *pData) = 0;
+ virtual int ReadChains(unsigned int &numChains, RainbowChain *pData) = 0;
virtual unsigned int GetChainsLeft() = 0;
+ virtual ~BaseRTReader() { };
};
#endif
CMemoryPool::~CMemoryPool()
{
- if (m_pMem != NULL)
- {
+ if (m_pMem != NULL) {
+#ifdef _MEMORYDEBUG
+ printf("Freeing %i bytes of memory\n", m_nMemSize);
+#endif
delete m_pMem;
m_pMem = NULL;
m_nMemSize = 0;
unsigned char* CMemoryPool::Allocate(unsigned int nFileLen, unsigned int& nAllocatedSize)
{
- if (nFileLen <= m_nMemSize)
- {
+ if (nFileLen <= m_nMemSize) {
nAllocatedSize = nFileLen;
return m_pMem;
}
unsigned int nTargetSize;
- if (nFileLen < m_nMemMax)
+ if (nFileLen < m_nMemMax) {
nTargetSize = nFileLen;
- else
+ }
+ else {
nTargetSize = m_nMemMax;
-
+ }
// Free existing memory
- if (m_pMem != NULL)
- {
+ if (m_pMem != NULL) {
+#ifdef _MEMORYDEBUG
+ printf("Freeing %i bytes of memory\n", m_nMemSize);
+#endif
delete m_pMem;
m_pMem = NULL;
m_nMemSize = 0;
// Allocate new memory
//printf("allocating %u bytes memory\n", nTargetSize);
-// m_pMem = new unsigned char[nTargetSize];
-m_pMem = new (nothrow) unsigned char[nTargetSize];
-while (m_pMem == NULL && nTargetSize >= 512 * 1024 * 1024 )
-{
- nTargetSize -= 16 * 1024 * 1024;
- m_pMem = new (nothrow) unsigned char[nTargetSize];
-}
- if (m_pMem != NULL)
- {
+ // m_pMem = new unsigned char[nTargetSize];
+#ifdef _MEMORYDEBUG
+ printf("Allocating %i bytes of memory - ", nTargetSize);
+#endif
+
+ m_pMem = new (nothrow) unsigned char[nTargetSize];
+ while (m_pMem == NULL && nTargetSize >= 512 * 1024 * 1024 ) {
+#ifdef _MEMORYDEBUG
+ printf("failed!\n");
+ printf("Allocating %i bytes of memory (backup) - ", nTargetSize);
+#endif
+ nTargetSize -= 16 * 1024 * 1024;
+ m_pMem = new (nothrow) unsigned char[nTargetSize];
+ }
+ if (m_pMem != NULL) {
+#ifdef _MEMORYDEBUG
+ printf("success!\n");
+#endif
m_nMemSize = nTargetSize;
nAllocatedSize = nTargetSize;
return m_pMem;
}
- else
- {
+ else {
nAllocatedSize = 0;
return NULL;
}
unsigned int len = GetFileLen(pFileIndex);
fseek(pFileIndex, 0, SEEK_SET);
- m_pIndex = new unsigned char[len];
+ m_pIndex = new (nothrow) unsigned char[len];
+ if(m_pIndex == NULL) {
+ printf("Error allocating %u MB memory for index in RTI2Reader::RTI2Reader()", len / (1024 * 1024));
+ exit(-2);
+ }
if(fread(m_pIndex, 1, len, pFileIndex) != len)
{
printf("Error while reading index file");
return len / m_chainsizebytes - m_chainPosition;
}
-int RTI2Reader::ReadChains(unsigned int &numChains, RainbowChainCP *pData)
+int RTI2Reader::ReadChains(unsigned int &numChains, RainbowChain *pData)
{
if(strncmp(m_pHeader->header, "RTI2", 4) != 0)
{
pData[chainsProcessed].nIndexE = m_pHeader->prefixstart + indexRow << m_pHeader->rti_endptlength;
// Append the ending point suffix
pData[chainsProcessed].nIndexE |= (chainrow & (0xFFFFFFFFFFFFFFFF >> m_pHeader->rti_cplength)) >> m_pHeader->rti_startptlength;
- pData[chainsProcessed].nCheckPoint = (chainrow >> m_pHeader->rti_startptlength + m_pHeader->rti_endptlength);
+ //pData[chainsProcessed].nCheckPoint = (chainrow >> m_pHeader->rti_startptlength + m_pHeader->rti_endptlength);
curRowPosition++;
chainsProcessed++;
}
public:
RTI2Reader(string Filename);
~RTI2Reader(void);
- int ReadChains(unsigned int &numChains, RainbowChainCP *pData);
+ int ReadChains(unsigned int &numChains, RainbowChain *pData);
unsigned int GetChainsLeft();
static RTI2Header *GetHeader() { return m_pHeader; }
};
printf("index file length mismatch (%u bytes)\n", nIndexFileLen);
else
{
- m_pIndex = new IndexChain[nIndexFileLen / 11];
+ if(m_pIndex != NULL) {
+ delete m_pIndex;
+ m_pIndex = NULL;
+ }
+#ifdef _MEMORYDEBUG
+ printf("Allocating %u MB memory for RTIReader::m_pIndex", nIndexFileLen / 11 / (1024 * 1024));
+#endif
+ m_pIndex = new (nothrow) IndexChain[nIndexFileLen / 11];
+ if(m_pIndex == NULL) {
+ printf("\nFailed allocating %i MB memory.\n", nIndexFileLen / 11 / (1024 * 1024));
+ exit(-2);
+ }
+#ifdef _MEMORYDEBUG
+ printf(" - success!\n");
+#endif
memset(m_pIndex, 0x00, sizeof(IndexChain) * (nIndexFileLen / 11));
fseek(pFileIndex, 0, SEEK_SET);
int nRead = 0;
- int nRows;
+ UINT4 nRows;
for(nRows = 0; (nRows * 11) < nIndexFileLen; nRows++)
{
if(fread(&m_pIndex[nRows].nPrefix, 5, 1, pFileIndex) != 1) break;
}
if(m_pIndex[m_nIndexSize - 1].nFirstChain + m_pIndex[m_nIndexSize - 1].nChainCount > nTotalChainCount) // +1 is not needed here
{
- printf("Corrupted index detected: The index is covering more than the file\n");
+ printf("Corrupted index detected: The index is covering more than the file (%i chains of %i chains)\n", m_pIndex[m_nIndexSize - 1].nFirstChain + m_pIndex[m_nIndexSize - 1].nChainCount, nTotalChainCount);
exit(-1);
}
}
-int RTIReader::ReadChains(unsigned int &numChains, RainbowChainCP *pData)
+int RTIReader::ReadChains(unsigned int &numChains, RainbowChain *pData)
{
// We HAVE to reset the data to 0x00's or we will get in trouble
- memset(pData, 0x00, sizeof(RainbowChainCP) * numChains);
+ memset(pData, 0x00, sizeof(RainbowChain) * numChains);
unsigned int readChains = 0;
unsigned int chainsleft = GetChainsLeft();
- for(int i = 0; i < m_nIndexSize; i++)
+ for(UINT4 i = 0; i < m_nIndexSize; i++)
{
if(m_chainPosition + readChains > m_pIndex[i].nFirstChain + m_pIndex[i].nChainCount) // We found the matching index
continue;
RTIReader(string Filename);
~RTIReader(void);
- int ReadChains(unsigned int &numChains, RainbowChainCP *pData);
+ int ReadChains(unsigned int &numChains, RainbowChain *pData);
unsigned int GetChainsLeft();
};
{
}
-int RTReader::ReadChains(unsigned int &numChains, RainbowChainCP *pData)
+int RTReader::ReadChains(unsigned int &numChains, RainbowChain *pData)
{
unsigned int numRead = fread(pData, 1, 16 * numChains, m_pFile);
numChains = numRead / 16;
public:
RTReader(string Filename);
~RTReader(void);
- int ReadChains(unsigned int &numChains, RainbowChainCP *pData);
+ int ReadChains(unsigned int &numChains, RainbowChain *pData);
unsigned int GetChainsLeft();
};