This commit is contained in:
Shauren
2015-03-04 12:18:51 +01:00
parent e63872e1ee
commit b60cfa9bf4
3 changed files with 56 additions and 34 deletions

View File

@@ -539,6 +539,13 @@ static int GetGameType(TCascStorage * hs, LPBYTE pbVarBegin, LPBYTE pbLineEnd)
return ERROR_SUCCESS;
}
// Diablo III BETA 2.2.0
if((pbLineEnd - pbVarBegin) == 7 && !_strnicmp((const char *)pbVarBegin, "Diablo3", 7))
{
hs->dwGameInfo = CASC_GAME_DIABLO3;
return ERROR_SUCCESS;
}
// An unknown game
assert(false);
return ERROR_BAD_FORMAT;
@@ -546,6 +553,7 @@ static int GetGameType(TCascStorage * hs, LPBYTE pbVarBegin, LPBYTE pbLineEnd)
// "B29049"
// "WOW-18125patch6.0.1"
// "30013_Win32_2_2_0_Ptr_ptr"
static int GetBuildNumber(TCascStorage * hs, LPBYTE pbVarBegin, LPBYTE pbLineEnd)
{
DWORD dwBuildNumber = 0;
@@ -625,10 +633,12 @@ static int FetchAndVerifyConfigFile(TCascStorage * hs, PQUERY_KEY pFileKey, PQUE
static int ParseInfoFile(TCascStorage * hs, PQUERY_KEY pFileBlob)
{
QUERY_KEY Active = {NULL, 0};
QUERY_KEY TagString = {NULL, 0};
QUERY_KEY CdnHost = {NULL, 0};
QUERY_KEY CdnPath = {NULL, 0};
const char * szLineBegin1 = NULL;
const char * szLinePtr1 = NULL;
const char * szLineBegin2 = NULL;
const char * szLineEnd1 = NULL;
const char * szLineEnd2 = NULL;
@@ -650,46 +660,57 @@ static int ParseInfoFile(TCascStorage * hs, PQUERY_KEY pFileBlob)
szFilePtr++;
}
// Skip the newline character(s)
while(szFilePtr < szFileEnd && (szFilePtr[0] == 0x0D || szFilePtr[0] == 0x0A))
szFilePtr++;
// Find the second line
szLineBegin2 = szFilePtr;
while(szFilePtr < szFileEnd)
while (szFilePtr < szFileEnd)
{
// Check for the end of the line
if(szFilePtr[0] == 0x0D || szFilePtr[0] == 0x0A)
szLinePtr1 = szLineBegin1;
// Skip the newline character(s)
while (szFilePtr < szFileEnd && (szFilePtr[0] == 0x0D || szFilePtr[0] == 0x0A))
szFilePtr++;
// Find the next line
szLineBegin2 = szFilePtr;
while (szFilePtr < szFileEnd)
{
szLineEnd2 = szFilePtr;
break;
// Check for the end of the line
if (szFilePtr[0] == 0x0D || szFilePtr[0] == 0x0A)
{
szLineEnd2 = szFilePtr;
break;
}
szFilePtr++;
}
szFilePtr++;
}
// Find the build key, CDN config key and the URL path
while (szLinePtr1 < szLineEnd1)
{
// Check for variables we need
if (IsInfoVariable(szLinePtr1, szLineEnd1, "Active", "DEC"))
LoadInfoVariable(&Active, szLineBegin2, szLineEnd2, false);
if (IsInfoVariable(szLinePtr1, szLineEnd1, "Build Key", "HEX"))
LoadInfoVariable(&hs->CdnBuildKey, szLineBegin2, szLineEnd2, true);
if (IsInfoVariable(szLinePtr1, szLineEnd1, "CDN Key", "HEX"))
LoadInfoVariable(&hs->CdnConfigKey, szLineBegin2, szLineEnd2, true);
if (IsInfoVariable(szLinePtr1, szLineEnd1, "CDN Hosts", "STRING"))
LoadInfoVariable(&CdnHost, szLineBegin2, szLineEnd2, false);
if (IsInfoVariable(szLinePtr1, szLineEnd1, "CDN Path", "STRING"))
LoadInfoVariable(&CdnPath, szLineBegin2, szLineEnd2, false);
if (IsInfoVariable(szLinePtr1, szLineEnd1, "Tags", "STRING"))
LoadInfoVariable(&TagString, szLineBegin2, szLineEnd2, false);
// Find the build key, CDN config key and the URL path
while(szLineBegin1 < szLineEnd1)
{
// Check for variables we need
if(IsInfoVariable(szLineBegin1, szLineEnd1, "Build Key", "HEX"))
LoadInfoVariable(&hs->CdnBuildKey, szLineBegin2, szLineEnd2, true);
if(IsInfoVariable(szLineBegin1, szLineEnd1, "CDN Key", "HEX"))
LoadInfoVariable(&hs->CdnConfigKey, szLineBegin2, szLineEnd2, true);
if(IsInfoVariable(szLineBegin1, szLineEnd1, "CDN Hosts", "STRING"))
LoadInfoVariable(&CdnHost, szLineBegin2, szLineEnd2, false);
if(IsInfoVariable(szLineBegin1, szLineEnd1, "CDN Path", "STRING"))
LoadInfoVariable(&CdnPath, szLineBegin2, szLineEnd2, false);
if(IsInfoVariable(szLineBegin1, szLineEnd1, "Tags", "STRING"))
LoadInfoVariable(&TagString, szLineBegin2, szLineEnd2, false);
// Move both line pointers
szLinePtr1 = SkipInfoVariable(szLinePtr1, szLineEnd1);
if (szLineBegin1 == NULL)
break;
// Move both line pointers
szLineBegin1 = SkipInfoVariable(szLineBegin1, szLineEnd1);
if(szLineBegin1 == NULL)
break;
szLineBegin2 = SkipInfoVariable(szLineBegin2, szLineEnd2);
if (szLineBegin2 == NULL)
break;
}
szLineBegin2 = SkipInfoVariable(szLineBegin2, szLineEnd2);
if(szLineBegin2 == NULL)
// Stop parsing if found active config
if (Active.pbData != NULL && *Active.pbData == '1')
break;
}

View File

@@ -38,6 +38,7 @@
#define CASC_GAME_HOTS 0x00010000 // Heroes of the Storm
#define CASC_GAME_WOW6 0x00020000 // World of Warcraft - Warlords of Draenor
#define CASC_GAME_DIABLO3 0x00030000 // Diablo 3 Since PTR 2.2.0
#define CASC_GAME_MASK 0xFFFF0000 // Mask for getting game ID
#define CASC_INDEX_COUNT 0x10

View File

@@ -38,7 +38,7 @@ recastnavigation (Recast is state of the art navigation mesh construction toolse
CascLib (An open-source implementation of library for reading CASC storage from Blizzard games since 2014)
https://github.com/ladislav-zezula/CascLib
Version: 4235e5f2033e2de709c83034503d49e532d03630
Version: d1d617d4feecd39bae049e19b0e217a1a84bedc6
zmqpp (C++ binding for 0mq/zmq is a 'high-level' library that hides most of the c-style interface core 0mq provides.)
https://github.com/zeromq/zmqpp