Skip to content

Commit 38abaef

Browse files
committed
now pckdll accepts custom keys
1 parent 5a4dce1 commit 38abaef

File tree

11 files changed

+96
-27
lines changed

11 files changed

+96
-27
lines changed

PckDll/PckClass/PckAlgorithmId.cpp

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,16 @@
44
#include "PckClassLog.h"
55
#endif
66

7-
CPckAlgorithmId::CPckAlgorithmId(unsigned __int32 id)
7+
CPckAlgorithmId::CPckAlgorithmId(unsigned __int32 id, unsigned __int32 CustomPckGuardByte0, unsigned __int32 CustomPckGuardByte1, unsigned __int32 CustomPckMaskDword, unsigned __int32 CustomPckCheckMask)
88
{
9-
SetAlgorithmId(id);
9+
SetAlgorithmId(id, CustomPckGuardByte0, CustomPckGuardByte1, CustomPckMaskDword, CustomPckCheckMask);
1010
}
1111

1212

1313
CPckAlgorithmId::~CPckAlgorithmId()
1414
{}
1515

16-
void CPckAlgorithmId::SetAlgorithmId(unsigned __int32 id, __int32 CustomPckGuardByte0, __int32 CustomPckGuardByte1, __int32 CustomPckMaskDword, __int32 CustomPckCheckMask)
16+
void CPckAlgorithmId::SetAlgorithmId(unsigned __int32 id, unsigned __int32 CustomPckGuardByte0, unsigned __int32 CustomPckGuardByte1, unsigned __int32 CustomPckMaskDword, unsigned __int32 CustomPckCheckMask)
1717
{
1818
//0 Jade Dynasty, Perfect World
1919
//111 Hot Dance Party
@@ -38,4 +38,16 @@ void CPckAlgorithmId::SetAlgorithmId(unsigned __int32 id, __int32 CustomPckGuard
3838
PckCheckMask = 0x59374231 + id * 0x987A223; //key2
3939
break;
4040
}
41+
42+
if(CustomPckMaskDword != 0)
43+
PckMaskDword = CustomPckMaskDword;
44+
45+
if(CustomPckCheckMask != 0)
46+
PckCheckMask = CustomPckCheckMask;
47+
48+
if (CustomPckGuardByte0 != 0)
49+
PckGuardByte0 = CustomPckGuardByte0;
50+
51+
if (CustomPckGuardByte1 != 0)
52+
PckGuardByte1 = CustomPckGuardByte1;
4153
}

PckDll/PckClass/PckAlgorithmId.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
class CPckAlgorithmId
99
{
1010
public:
11-
CPckAlgorithmId(unsigned __int32 id);
11+
CPckAlgorithmId(unsigned __int32 id, unsigned __int32 CustomPckGuardByte0 = 0, unsigned __int32 CustomPckGuardByte1 = 0, unsigned __int32 CustomPckMaskDword = 0, unsigned __int32 CustomPckCheckMask = 0);
1212
~CPckAlgorithmId();
1313

1414
unsigned __int32 GetPckGuardByte0() { return PckGuardByte0; }
@@ -20,7 +20,7 @@ class CPckAlgorithmId
2020
unsigned __int32 PckGuardByte0, PckGuardByte1, PckMaskDword, PckCheckMask;
2121

2222
//void SetAlgorithmId(unsigned __int32 id);
23-
void SetAlgorithmId(unsigned __int32 id, __int32 CustomPckGuardByte0 = 0, __int32 CustomPckGuardByte1 = 0, __int32 CustomPckMaskDword = 0, __int32 CustomPckCheckMask = 0);
23+
void SetAlgorithmId(unsigned __int32 id, unsigned __int32 CustomPckGuardByte0 = 0, unsigned __int32 CustomPckGuardByte1 = 0, unsigned __int32 CustomPckMaskDword = 0, unsigned __int32 CustomPckCheckMask = 0);
2424

2525
};
2626

PckDll/PckClass/PckClassIndexRead.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ BOOL CPckClassIndex::ReadPckFileIndexes()
1818
//Start reading file
1919
BYTE *lpFileBuffer;
2020
if(NULL == (lpFileBuffer = cRead.View(m_PckAllInfo.dwAddressOfFileEntry, cRead.GetFileSize() - m_PckAllInfo.dwAddressOfFileEntry))) {
21-
Logger_el(TEXT_VIEWMAP_FAIL);
21+
//Logger_el(TEXT_VIEWMAP_FAIL);
2222
return FALSE;
2323
}
2424

PckDll/PckClass/PckClassMount.cpp

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,21 @@
1313

1414
BOOL CPckClass::MountPckFile(LPCWSTR szFile)
1515
{
16-
try {
17-
if (!DetectPckVerion(szFile))
18-
return FALSE;
19-
20-
if (!ReadPckFileIndexes())
21-
return FALSE;
22-
//Set the entryType of the last Index to PCK_ENTRY_TYPE_TAIL_INDEX
23-
m_PckAllInfo.lpPckIndexTable[m_PckAllInfo.dwFileCount].entryType = PCK_ENTRY_TYPE_TAIL_INDEX;
24-
return TRUE;
16+
try
17+
{
18+
for(size_t version = 0; version <= GetPckVersionCount(); version++)
19+
{
20+
if(DetectPckVerion(szFile, version))
21+
{
22+
if(ReadPckFileIndexes())
23+
{
24+
//Set the entryType of the last Index to PCK_ENTRY_TYPE_TAIL_INDEX
25+
m_PckAllInfo.lpPckIndexTable[m_PckAllInfo.dwFileCount].entryType = PCK_ENTRY_TYPE_TAIL_INDEX;
26+
return TRUE;
27+
}
28+
}
29+
}
30+
return FALSE;
2531
}
2632
catch (MyException e) {
2733
Logger.e(e.what());

PckDll/PckClass/PckClassVersionDetect.cpp

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ CPckClassVersionDetect::~CPckClassVersionDetect()
115115
Logger.OutputVsIde(__FUNCTION__"\r\n");
116116
}
117117

118-
const PCK_VERSION_ID CPckClassVersionDetect::cPckIDs[] =
118+
PCK_VERSION_ID CPckClassVersionDetect::cPckIDs[] =
119119
{
120120
{ PCK_VERSION_ZX, TEXT("Perfect World"), PCK_V2020, AFPCK_VERSION_202, 0 },
121121
{ PCK_VERSION_ZXNEW, TEXT("Perfect World(New)"), PCK_V2030, AFPCK_VERSION_203, 0 },
@@ -221,14 +221,48 @@ int CPckClassVersionDetect::FillUnknownVersionInfo(DWORD AlgorithmId, DWORD Vers
221221
return PCK_VERSION_INVALID;
222222
}
223223

224+
int CPckClassVersionDetect::FillUnknownVersionInfoByKeys(DWORD AlgorithmId, DWORD Version, const wchar_t* Name, int CustomPckGuardByte0, int CustomPckGuardByte1, int CustomPckMaskDword, int CustomPckCheckMask)
225+
{
226+
if ((PCK_VERSION_INVALID != AlgorithmId) && ((AFPCK_VERSION_202 == Version) || (AFPCK_VERSION_203 == Version))) {
227+
228+
PCK_VERSION_FUNC cPckVersionFuncToAdd;
229+
230+
LPPCK_KEYS lpUnknownPckKeys = &cPckVersionFuncToAdd.cPckXorKeys;
231+
LPPCK_VERSION_FUNC lpUnknownPckVersionFunc = &cPckVersionFuncToAdd;
232+
lpUnknownPckKeys->id = cPckVersionFunc.size();
233+
if (Name && wcslen(Name) > 0)
234+
{
235+
wcscpy_s(lpUnknownPckKeys->name, Name);
236+
}
237+
else
238+
{
239+
swprintf_s(lpUnknownPckKeys->name, L"Unknown format recognized(ver=0x%x id=%d)", Version, AlgorithmId);
240+
}
241+
lpUnknownPckKeys->CategoryId = AFPCK_VERSION_202 == Version ? PCK_V2020 : PCK_V2030;
242+
lpUnknownPckKeys->Version = Version;
243+
244+
SetAlgorithmId(AlgorithmId, &cPckVersionFuncToAdd, CustomPckGuardByte0, CustomPckGuardByte1, CustomPckMaskDword, CustomPckCheckMask);
245+
//cPckVersionFunc.push_back(cPckVersionFuncToAdd);
246+
cPckVersionFunc.insert(cPckVersionFunc.begin(), cPckVersionFuncToAdd);
247+
248+
return cPckVersionFunc.size() - 1;
249+
}
250+
return PCK_VERSION_INVALID;
251+
}
252+
224253
int CPckClassVersionDetect::AddPckVersion(int AlgorithmId, int Version)
225254
{
226255
return FillUnknownVersionInfo(AlgorithmId, Version);
227256
}
228257

229-
void CPckClassVersionDetect::SetAlgorithmId(DWORD id, LPPCK_VERSION_FUNC lpPckVersionFunc)
258+
int CPckClassVersionDetect::AddPckVersionByKeys(int AlgorithmId, int Version, const wchar_t* Name, int CustomPckGuardByte0, int CustomPckGuardByte1, int CustomPckMaskDword, int CustomPckCheckMask)
259+
{
260+
return FillUnknownVersionInfoByKeys(AlgorithmId, Version, Name, CustomPckGuardByte0, CustomPckGuardByte1, CustomPckMaskDword, CustomPckCheckMask);
261+
}
262+
263+
void CPckClassVersionDetect::SetAlgorithmId(DWORD id, LPPCK_VERSION_FUNC lpPckVersionFunc, int CustomPckGuardByte0, int CustomPckGuardByte1, int CustomPckMaskDword, int CustomPckCheckMask)
230264
{
231-
CPckAlgorithmId AlgorithmId(id);
265+
CPckAlgorithmId AlgorithmId(id, CustomPckGuardByte0, CustomPckGuardByte1, CustomPckMaskDword, CustomPckCheckMask);
232266

233267
LPPCK_KEYS lpPckKey = &lpPckVersionFunc->cPckXorKeys;
234268

@@ -382,7 +416,7 @@ void CPckClassVersionDetect::PrintInvalidVersionDebugInfo(const wchar_t * lpszPc
382416
#undef PRINT_TAIL_SIZE
383417

384418
//Read the file header and tail to determine the pck file version and return the version ID
385-
BOOL CPckClassVersionDetect::DetectPckVerion(LPCWSTR lpszPckFile)
419+
BOOL CPckClassVersionDetect::DetectPckVerion(LPCWSTR lpszPckFile, int next)
386420
{
387421
PCKHEAD_V2020 cPckHead;
388422
uint32_t dwTailVals[4];
@@ -425,7 +459,7 @@ BOOL CPckClassVersionDetect::DetectPckVerion(LPCWSTR lpszPckFile)
425459
if (0 != dwTailVals[0])
426460
dwTailVals[1] = dwTailVals[0];
427461

428-
for (int i = 0; i < dwVerionDataCount; i++) {
462+
for (int i = next; i < dwVerionDataCount; i++) {
429463
if ((cPckVersionFunc[i].cPckXorKeys.Version == AFPCK_VERSION_203) &&
430464
(cPckVersionFunc[i].cPckXorKeys.TailVerifyKey2 == dwTailVals[1]) &&
431465
(cPckVersionFunc[i].cPckXorKeys.HeadVerifyKey1 == cPckHead.dwHeadCheckHead)) {
@@ -438,7 +472,7 @@ BOOL CPckClassVersionDetect::DetectPckVerion(LPCWSTR lpszPckFile)
438472
else {
439473

440474
//When the version is 202, the value of TailVerifyKey2 may be HeadVerifyKey2 or 0. This example has appeared on the pck file of the game: Gods and Demons.
441-
for (int i = 0; i < dwVerionDataCount; i++) {
475+
for (int i = next; i < dwVerionDataCount; i++) {
442476
if ((cPckVersionFunc[i].cPckXorKeys.Version == dwTailVals[3]) &&
443477
(cPckVersionFunc[i].cPckXorKeys.TailVerifyKey2 == dwTailVals[1]) &&
444478
(cPckVersionFunc[i].cPckXorKeys.HeadVerifyKey1 == cPckHead.dwHeadCheckHead) &&

PckDll/PckClass/PckClassVersionDetect.h

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,9 @@
4343
#define PCK_VERSION_END_ID 5
4444
#define PCK_VERSION_NORMAL_NUMS 6
4545
#define PCK_VERSION_SP_START_ID 6
46-
#define PCK_VERSION_XAJH 6
47-
#define PCK_VERSION_SP_END_ID 6
46+
#define PCK_VERSION_HISTORY 6
47+
#define PCK_VERSION_XAJH 7
48+
#define PCK_VERSION_SP_END_ID 7
4849

4950
#endif
5051

@@ -91,23 +92,26 @@ class CPckClassVersionDetect :
9192

9293
static int AddPckVersion(int AlgorithmId, int Version);
9394

95+
static int AddPckVersionByKeys(int id, int Version, const wchar_t* Name, int CustomPckGuardByte0, int CustomPckGuardByte1, int CustomPckMaskDword, int CustomPckCheckMask);
96+
9497
protected:
9598
//Detect the pck version and write it to iDetectedPckID, and read the file header and tail at the same time
96-
BOOL DetectPckVerion(LPCWSTR lpszPckFile);
99+
BOOL DetectPckVerion(LPCWSTR lpszPckFile, int next = 0);
97100

98101
private:
99102

100-
static const PCK_VERSION_ID cPckIDs[];
103+
static PCK_VERSION_ID cPckIDs[];
101104
static const PCK_KEYS cPckSPKeys[];
102105
static const PCK_VERSION_FUNC cPckSPVersionFunc[];
103106

104107
//Fill in version information
105108
static void FillGeneralVersionInfo();
106109
static void FillSpecialVersionInfo();
107110
static int FillUnknownVersionInfo(DWORD AlgorithmId, DWORD Version);
111+
static int FillUnknownVersionInfoByKeys(DWORD AlgorithmId, DWORD Version, const wchar_t* Name, int CustomPckGuardByte0, int CustomPckGuardByte1, int CustomPckMaskDword, int CustomPckCheckMask);
108112

109113
//PCK version judgment
110-
static void SetAlgorithmId(DWORD id, LPPCK_VERSION_FUNC lpPckVersionFunc);
114+
static void SetAlgorithmId(DWORD id, LPPCK_VERSION_FUNC lpPckVersionFunc, int CustomPckGuardByte0 = 0, int CustomPckGuardByte1 = 0, int CustomPckMaskDword = 0, int CustomPckCheckMask = 0);
111115

112116
//Data filling and data writing at the beginning and end of the file
113117
static void* FillHeadData_V2020(void *param);

PckDll/PckControlCenter/PckControlCenter.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ class EXPORT_CLASS CPckControlCenter
117117
static uint32_t GetVersionCount();
118118
static LPCWSTR GetVersionNameById(int verID);
119119
static int AddVersionAlgorithmId(int AlgorithmId, int Version);
120+
static int AddVersionAlgorithmIdByKeys(int AlgorithmId, int Version, const wchar_t* Name, int CustomPckGuardByte0, int CustomPckGuardByte1, int CustomPckMaskDword, int CustomPckCheckMask);
120121

121122
#pragma endregion
122123

PckDll/PckControlCenter/PckControlCenterOperation.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,4 +291,9 @@ int CPckControlCenter::AddVersionAlgorithmId(int AlgorithmId, int Version)
291291
return CPckClassVersionDetect::AddPckVersion(AlgorithmId, Version);
292292
}
293293

294+
int CPckControlCenter::AddVersionAlgorithmIdByKeys(int AlgorithmId, int Version, const wchar_t* Name, int CustomPckGuardByte0, int CustomPckGuardByte1, int CustomPckMaskDword, int CustomPckCheckMask)
295+
{
296+
return CPckClassVersionDetect::AddPckVersionByKeys(AlgorithmId, Version, Name, CustomPckGuardByte0, CustomPckGuardByte1, CustomPckMaskDword, CustomPckCheckMask);
297+
}
298+
294299
#pragma endregion

PckDll/include/pck_handle.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ WINPCK_API uint32_t pck_getVersionCount();
4848
WINPCK_API LPCWSTR pck_getVersionNameById(int verID);
4949
//AlgorithmId can not be -1, Version must be AFPCK_VERSION_202(0x00020002) or AFPCK_VERSION_203(0x00020003), return value is id , PCK_VERSION_INVALID = -1
5050
WINPCK_API int pck_addVersionAlgorithmId(int AlgorithmId, int Version);
51-
51+
WINPCK_API int pck_addVersionAlgorithmIdByKeys(int AlgorithmId, int Version, const wchar_t* Name = L"", int CustomPckGuardByte0 = 0, int CustomPckGuardByte1 = 0, int CustomPckMaskDword = 0, int CustomPckCheckMask = 0);
52+
WINPCK_API int pck_AddCustomKeys(int CustomPckGuardByte0 = 0, int CustomPckGuardByte1 = 0, int CustomPckMaskDword = 0, int CustomPckCheckMask = 0);
5253

5354
//Get the current configuration name
5455
WINPCK_API LPCWSTR pck_GetCurrentVersionName();

PckDll/src/pck_handle.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,12 @@ WINPCK_API int pck_addVersionAlgorithmId(int AlgorithmId, int Version)
106106
return CPckControlCenter::AddVersionAlgorithmId(AlgorithmId, Version);
107107
}
108108

109+
110+
WINPCK_API int pck_addVersionAlgorithmIdByKeys(int AlgorithmId, int Version, const wchar_t* Name, int CustomPckGuardByte0, int CustomPckGuardByte1, int CustomPckMaskDword, int CustomPckCheckMask)
111+
{
112+
return CPckControlCenter::AddVersionAlgorithmIdByKeys(AlgorithmId, Version, Name, CustomPckGuardByte0, CustomPckGuardByte1, CustomPckMaskDword, CustomPckCheckMask);
113+
}
114+
109115
//Get the current configuration name
110116
WINPCK_API LPCWSTR pck_GetCurrentVersionName()
111117
{

dlltester/dlltester.cpp

304 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)