1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
#include "opensslthread.h"
OpensslThread::OpensslThread(void *_data, OpensslThread_Type _type):
type(_type),data(_data)
{
assert((type > OpensslThread_Type_NOTHING && type < OpensslThread_Type_LAST));
assert((data != NULL));
}
OpensslThread::~OpensslThread()
{
}
static void openssl_hash_FramAction(void *data)
{
if(data == NULL)
return;
Openssl_Hash_pack *handle = (Openssl_Hash_pack *)data;
IPluginFunction *pFunc = handle->hash_callback;
assert((pFunc != NULL));
if(pFunc != NULL)
{
pFunc->PushCell(handle->success);
if(handle->output == NULL)
pFunc->PushString("");
else
pFunc->PushString(handle->output);
pFunc->PushCell(handle->UserData);
pFunc->Execute(NULL);
}
if(handle->output != NULL)
delete handle->output;
if(handle->path != NULL)
delete handle->path;
delete handle;
}
void OpensslThread::RunFileHash()
{
Openssl_Hash_pack *handle = (Openssl_Hash_pack *)data;
handle->success = false;
assert((handle->path != NULL));
char realpath[PLATFORM_MAX_PATH];
g_pSM->BuildPath(Path_Game, realpath, sizeof(realpath), "%s", handle->path);
FILE *pFile = fopen(realpath, "rb");
if(!pFile)
return;
unsigned char *output = NULL;
int outlength;
if(!g_OpensslManager.HashFile(handle->algorithm, pFile, &output, &outlength))
goto clean;
assert((output != NULL));
if(output != NULL)
{
handle->output = new char[outlength*2+1];
int pos = 0;
for(int i=0; i<outlength; i++)
{
sprintf(&handle->output[pos],"%02x",(unsigned char)output[i]);
pos+=2;
}
handle->success = true;
}
clean:
if(output != NULL)
delete output;
fclose(pFile);
}
void OpensslThread::RunThread(IThreadHandle *pHandle)
{
if(type == OpensslThread_Type_HASH_FILE)
{
RunFileHash();
}
}
void OpensslThread::OnTerminate(IThreadHandle *pHandle, bool cancel)
{
if(type == OpensslThread_Type_HASH_FILE)
{
smutils->AddFrameAction(openssl_hash_FramAction, data);
}
delete this;
}
|