stoneage8.5/石器时代8.5客户端最新源代码/石器源码/system/tool.cpp

878 lines
15 KiB
C++
Raw Normal View History

2020-06-22 17:49:02 +08:00
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
/* WIN32_LEAN_AND_MEAN?define???WINDOWS.H???
????<EFBFBD><EFBFBD>?????<EFBFBD><EFBFBD>??????????????
????????????????? */
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <Mmsystem.h>
#include "iphlpapi.h"
#pragma comment(lib, "iphlpapi.lib ")
#include "../systeminc/version.h"
#include "../systeminc/tool.h"
#ifdef _TIME_GET_TIME
LARGE_INTEGER tickCount;
LARGE_INTEGER CurrentTick;
#endif
void Delay(ULONG ulMicroSeconds)
{
LARGE_INTEGER timeStop;
LARGE_INTEGER timeStart;
LARGE_INTEGER Freq;
ULONG ulTimeToWait;
if (!QueryPerformanceFrequency(&Freq))
return;
ulTimeToWait = Freq.QuadPart * ulMicroSeconds / 1000 / 1000;
QueryPerformanceCounter(&timeStart);
timeStop = timeStart;
while (timeStop.QuadPart - timeStart.QuadPart < ulTimeToWait)
{
QueryPerformanceCounter(&timeStop);
}
}
BOOL isXP()
{
OSVERSIONINFOEX os;
os.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
if (GetVersionEx((OSVERSIONINFO *)&os))
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ汾<DDB0><E6B1BE>Ϣ<EFBFBD>жϲ<D0B6><CFB2><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>
switch (os.dwMajorVersion){ //<2F>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><E6B1BE>
case 4:
return FALSE;
case 5:
return TRUE;
case 6:
return FALSE;
default:
return FALSE;
}
}
else
{
return FALSE;
}
}
unsigned int TimeGetTime(void)
{
#ifdef _TIME_GET_TIME
static __int64 time;
QueryPerformanceCounter(&CurrentTick);
return (unsigned int)(time = CurrentTick.QuadPart / tickCount.QuadPart);
//return GetTickCount();
#else
return GetTickCount();
//return timeGetTime();
#endif
}
static int copyStringUntilDelim(unsigned char *, char delim, int, unsigned char *);
// ??<3F><>???????<3F>t??????????
int wordchk(char **pp)
{
char *p = *pp;
while (*p != 0)
{
switch (*p)
{
case '\t':
p++;
break;
case ' ':
p++;
break;
default:
*pp = p;
return 1;
}
}
return 0;
}
// ??<3F><>????????<3F><>???????????<3F>h
int getword(char **pp, char *q)
{
int i = 0;
char *p = *pp;
wordchk(&p);
for (i = 0; *p != ' ' && *p != '\t' && *p != '\0'; p++, q++, i++)
{
*q = *p;
}
*q = '\0';
*pp = p;
return i;
}
#if 0
// ?????????
void freadline( char *ptbuf, FILE *fp )
{
char buf;
int i;
for( i = 0; ; i++ )
{
if( feof( fp ) != 0 )
{
*ptbuf--;
*ptbuf = '\0';
break;
}
fread( &buf, 1, sizeof( unsigned char ), fp );
if( buf == ' ' )
{
*ptbuf++ = buf;
}else if (buf == '\t'){
*ptbuf++ = buf;
}else if (buf != 0x0d && buf != 0x0a){
*ptbuf++ = buf;
}else{
*ptbuf++ = '\0';
break;
}
}
while ( feof(fp ) == 0 ){
fread( &buf ,1 , sizeof(unsigned char) , fp );
if (buf != 0x0d && buf != 0x0a ){
fseek( fp, -1, SEEK_CUR);
break;
}
}
}
#endif
// ?<3F><>???<3F>i?????<3F><>???<3F><>????<3F>h??
int strstr2(char **pp, char *q)
{
char *p = *pp;
int i;
wordchk(&p);
for (i = 1; *p++ == *q++; i++)
{
if (*q == 0)
{
*pp = p;
return i;
}
}
return 0;
}
// ??<3F><>????????<3F><>???????<3F>k???<3F><>??
int strint2(char **pp)
{
char moji[1024] = "";
char *p = *pp;
getword(&p, moji);
*pp = p;
return atoi(moji);
}
// ??<3F><>????????<3F><>??????long??<3F>k???<3F><>??
long strlong2(char **pp)
{
char moji[1024] = "";
char *p = *pp;
getword(&p, moji);
*pp = p;
return atol(moji);
}
// ?<3F><>?<3F><>??<3F>S??????????<3F><>?
// ??<3F>k<EFBFBD><6B>NULL?? ... ?<3F><>?<3F><>????????
// NULL ... <20><>???<3F><><EFBFBD>Z???
inline unsigned char *searchDelimPoint(unsigned char *src, unsigned char delim)
{
unsigned char *pt = src;
while (1)
{
if (*pt == '\0')
return (unsigned char *)0;
if (*pt < 0x80)
{
// 1bayte<74><65>????
if (*pt == delim)
{
// ?<3F><>?<3F><>???????????????<3F><>?
pt++;
return pt;
}
pt++;
}
else
{
// 2byte<74><65>????
pt++;
if (*pt == '\0')
return (unsigned char *)0;
pt++;
}
}
}
/*
????<EFBFBD><EFBFBD>???????????????????<EFBFBD><EFBFBD><EFBFBD>e????????<EFBFBD><EFBFBD>???
??????????
char *src : ???<EFBFBD><EFBFBD>??
char delim : ????
int count : ????????????????
int maxlen : out ??????<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?????
char *out : <EFBFBD><EFBFBD>?
??<EFBFBD>k 0<EFBFBD><EFBFBD>?????<EFBFBD><EFBFBD>???
1:<EFBFBD><EFBFBD>??<EFBFBD><EFBFBD><EFBFBD>Z?<EFBFBD><EFBFBD>???
*/
int getStringToken(char *src, char delim, int count, int maxlen, char *out)
{
int c = 1;
int i;
unsigned char *pt;
pt = (unsigned char *)src;
for (i = 0; i < count - 1; i++)
{
if (pt == (unsigned char *)0)
break;
pt = searchDelimPoint(pt, delim);
}
if (pt == (unsigned char *)0)
{
out[0] = '\0';
return 1;
}
return copyStringUntilDelim(pt, delim, maxlen, (unsigned char *)out);
}
/*
<EFBFBD><EFBFBD>????<EFBFBD><EFBFBD>????<EFBFBD><EFBFBD>?????????????????????
char *src : ??<EFBFBD><EFBFBD>??
char delim : ????
int maxlen : ?<EFBFBD><EFBFBD>??????
char *out : <EFBFBD><EFBFBD>?
??<EFBFBD>k 0<EFBFBD><EFBFBD>?????<EFBFBD><EFBFBD>???
1:<EFBFBD><EFBFBD>??<EFBFBD><EFBFBD><EFBFBD>Z?<EFBFBD><EFBFBD>???
*/
static int copyStringUntilDelim(unsigned char *src, char delim,
int maxlen, unsigned char *out)
{
int i;
for (i = 0; i < maxlen; i++)
{
if (src[i] < 0x80)
{
// 1byte<74><65>????
if (src[i] == delim)
{
// ?<3F><>?<3F><>????<3F><>??
out[i] = '\0';
return 0;
}
// ???<3F><>?????
out[i] = src[i];
// <20><><EFBFBD>Z<EFBFBD><5A>???<3F><>??
if (out[i] == '\0')
return 1;
}
else
{
// 2byte<74><65>????
// ???<3F><>?????
out[i] = src[i];
i++;
if (i >= maxlen) // ??????<3F><>???<3F><>??
break;
// ???<3F><>?????
out[i] = src[i];
// <20><><EFBFBD>Z<EFBFBD><5A>???<3F><>????????????????
if (out[i] == '\0')
return 1;
}
}
out[i] = '\0';
return 1;
}
/*
<EFBFBD><EFBFBD>???????int<EFBFBD>k??????
char *src : ???<EFBFBD><EFBFBD>??
char delim: ???????<EFBFBD><EFBFBD>??
int count :????????? ??????????
return value : <EFBFBD>k
*/
int getIntegerToken(char *src, char delim, int count)
{
char s[128];
getStringToken(src, delim, count, sizeof(s)-1, s);
if (s[0] == '\0')
return -1;
return atoi(s);
}
/*
double???????????
char *src : ???<EFBFBD><EFBFBD>??
char delim: ???????<EFBFBD><EFBFBD>??
int count :????????? ??????????
return value: <EFBFBD>k
*/
double getDoubleToken(char *src, char delim, int count)
{
char s[128];
getStringToken(src, delim, count, sizeof(s)-1, s);
return strtod(s, NULL);
}
/*
chop??(UNIX?<EFBFBD><EFBFBD>?<EFBFBD><EFBFBD>??)
char *src : ??<EFBFBD><EFBFBD>??? ???????<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>???????
*/
void chop(char *src)
{
int i;
for (i = 0;; i++)
{
if (src[i] == 0)
break;
if (src[i] == '\n' && src[i + 1] == '\0')
{
src[i] = '\0';
break;
}
}
}
/*
int?<EFBFBD><EFBFBD>?????????
int *a : <EFBFBD><EFBFBD>??????
int siz : <EFBFBD><EFBFBD>?????
int count : ???????????
<EFBFBD><EFBFBD>????????????
*/
void shiftIntArray(int *a, int siz, int count)
{
int i;
for (i = 0; i < siz - count; i++)
{
a[i] = a[i + count];
}
for (i = siz - count; i < siz; i++)
{
a[i] = 0;
}
}
// 62<36><32><EFBFBD><EFBFBD>???int?<3F><>???
// 0-9,a-z(10-35),A-Z(36-61)
int a62toi(char *a)
{
int ret = 0;
int fugo = 1;
while (*a != NULL)
{
ret *= 62;
if ('0' <= (*a) && (*a) <= '9')
ret += (*a) - '0';
else
if ('a' <= (*a) && (*a) <= 'z')
ret += (*a) - 'a' + 10;
else
if ('A' <= (*a) && (*a) <= 'Z')
ret += (*a) - 'A' + 36;
else
if (*a == '-')
fugo = -1;
else
return 0;
a++;
}
return ret*fugo;
}
/*
<EFBFBD><EFBFBD>???????int<EFBFBD>k??????
char *src : ???<EFBFBD><EFBFBD>??
char delim: ???????<EFBFBD><EFBFBD>??
int count :????????? ??????????
return value : <EFBFBD>k
*/
int getInteger62Token(char *src, char delim, int count)
{
char s[128];
getStringToken(src, delim, count, sizeof(s)-1, s);
if (s[0] == '\0')
return -1;
return a62toi(s);
}
/*
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>??<EFBFBD><EFBFBD><EFBFBD><EFBFBD>??????<EFBFBD><EFBFBD>???<EFBFBD>{????
char *s1 : <EFBFBD><EFBFBD>???
char *s2 : <EFBFBD><EFBFBD>???
int len : ?<EFBFBD><EFBFBD><EFBFBD>{?<EFBFBD><EFBFBD>???
*/
int strncmpi(char *s1, char *s2, int len)
{
int i;
int c1, c2;
for (i = 0; i < len; i++)
{
if (s1[i] == '\0' || s2[i] == '\0')
return 0;
c1 = tolower(s1[i]);
c2 = tolower(s2[i]);
if (c1 != c2)
return 1;
}
return 0;
}
RECT intToRect(int left, int top, int right, int bottom)
{
RECT rc = { left, top, right, bottom };
return rc;
}
/*****************************************************************
???????<EFBFBD><EFBFBD>??????1?<EFBFBD>\?<EFBFBD><EFBFBD>????????
0?<EFBFBD><EFBFBD>??SJIS??
******************************************************************/
int isOnlySpaceChars(char *data)
{
int i = 0;
int returnflag = 0;
while (data[i] != '\0')
{
returnflag = 0;
if ((unsigned char)data[i] == ' ')
returnflag = 1;
if (IsDBCSLeadByte(data[i]))
{
if ((unsigned char)data[i] == 0x81
&& (unsigned char)data[i + 1] == 0x40)
{
returnflag = 1;
}
i++;
}
if (returnflag == 0)
return 0;
i++;
}
if (i == 0)
return 0;
return returnflag;
}
/****************************
<EFBFBD><EFBFBD>????????<EFBFBD><EFBFBD><EFBFBD>V???
buffer: ????
string: <EFBFBD><EFBFBD><EFBFBD>V??<EFBFBD><EFBFBD>??
whereToinsert: ???<EFBFBD><EFBFBD><EFBFBD>V???
****************************/
void insertString(char *buffer, char *string, int whereToInsert)
{
int stringLength, bufferLength, i;
stringLength = strlen(string);
bufferLength = strlen(buffer);
for (i = 0; i <= bufferLength - whereToInsert; i++)
{
buffer[bufferLength + stringLength - i] = buffer[bufferLength - i];
}
for (i = 0; i < stringLength; i++)
{
buffer[whereToInsert + i] = string[i];
}
}
/****************************
<EFBFBD><EFBFBD>???????<EFBFBD><EFBFBD><EFBFBD>V???
buffer: ????
character: <EFBFBD><EFBFBD><EFBFBD>V??<EFBFBD><EFBFBD>??
whereToinsert: ???<EFBFBD><EFBFBD><EFBFBD>V???
****************************/
void insertChar(char *buffer, char character, int whereToInsert)
{
int bufferLength, i;
bufferLength = strlen(buffer);
for (i = 0; i <= bufferLength - whereToInsert; i++)
{
buffer[bufferLength + 1 - i] = buffer[bufferLength - i];
}
buffer[whereToInsert] = character;
}
/*************************************************************
??????????????????
*************************************************************/
typedef struct tagEscapeChar
{
char escapechar;
char escapedchar;
} EscapeChar;
static EscapeChar escapeChar[] =
{
{ '\n', 'n' },
{ ',', 'c' },
{ '|', 'z' },
{ '\\', 'y' },
};
// ?????<3F><>??<3F>G<EFBFBD>Ч<EFBFBD>????
// ??<3F>k<EFBFBD><6B><EFBFBD>G<EFBFBD>Ч<EFBFBD>?(?????<3F><>?????????<3F><>??<3F><>?)
char makeCharFromEscaped(char c)
{
int i;
for (i = 0; i < sizeof(escapeChar) / sizeof(escapeChar[0]); i++)
{
if (escapeChar[i].escapedchar == c)
{
c = escapeChar[i].escapechar;
break;
}
}
return c;
}
/*----------------------------------------
* makeEscapeString??<EFBFBD><EFBFBD>???<EFBFBD><EFBFBD>???????
* ??
* src char* ????<EFBFBD><EFBFBD>????????<EFBFBD>v??
* <EFBFBD><EFBFBD>?<EFBFBD>k
* src ?<EFBFBD><EFBFBD>??(???<EFBFBD>V??????????)
----------------------------------------*/
char *makeStringFromEscaped(char *src)
{
int srclen = strlen(src);
int searchindex = 0;
for (int i = 0; i < srclen; i++){
if (IsDBCSLeadByte(src[i])){
src[searchindex++] = src[i++];
src[searchindex++] = src[i];
}
else{
if (src[i] == '\\'){
int j;
i++;
for (j = 0; j < sizeof(escapeChar) / sizeof(escapeChar[0]); j++)
if (escapeChar[j].escapedchar == src[i]){
src[searchindex++] = escapeChar[j].escapechar;
goto NEXT;
}
src[searchindex++] = src[i];
}
else
src[searchindex++] = src[i];
}
NEXT:
;
}
src[searchindex] = '\0';
return src;
}
/*----------------------------------------
* ????????
* ??
* src char* ????<EFBFBD><EFBFBD>??
* dest char* ????????<EFBFBD><EFBFBD>??
* sizeofdest int dest ? ???
* <EFBFBD><EFBFBD>?<EFBFBD>k
* dest ?<EFBFBD><EFBFBD>??(???<EFBFBD>V??????????)
----------------------------------------*/
char *makeEscapeString(char *src, char *dest, int sizeofdest)
{
int srclen = strlen(src);
int destindex = 0;
for (int i = 0; i < srclen; i++){
if (destindex + 1 >= sizeofdest)
break;
if (IsDBCSLeadByte(src[i])){
if (destindex + 2 < sizeofdest){
dest[destindex++] = src[i++];
dest[destindex++] = src[i];
}
else
break;
}
else{
BOOL dirty = FALSE;
char escapechar = '\0';
for (int j = 0; j < sizeof(escapeChar) / sizeof(escapeChar[0]); j++)
if (src[i] == escapeChar[j].escapechar){
dirty = TRUE;
escapechar = escapeChar[j].escapedchar;
break;
}
if (dirty == TRUE){
if (destindex + 2 < sizeofdest){
dest[destindex++] = '\\';
dest[destindex++] = escapechar;
}
else
break;
}
else
dest[destindex++] = src[i];
}
}
dest[destindex] = '\0';
return dest;
}
/***************************************************************
????????? by Jun
***************************************************************/
/*
char *src <EFBFBD><EFBFBD>????adress
int srclen <EFBFBD><EFBFBD>????src???<EFBFBD><EFBFBD>?
int keystring ????????????
char *encoded ????????<EFBFBD><EFBFBD>????<EFBFBD>t??????????
int *encodedlen ????????<EFBFBD><EFBFBD>???<EFBFBD><EFBFBD>?????????
int maxencodedlen ?<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?????????
*/
void jEncode(char *src, int srclen, int key,
char *encoded, int *encodedlen, int maxencodedlen)
{
char sum = 0;
int i;
if (srclen + 1 > maxencodedlen)
{
// ???????<3F><>?? 1 ????
// ????????????????<3F>O????????
*encodedlen = maxencodedlen;
for (i = 0; i < (*encodedlen); i++)
{
encoded[i] = src[i];
}
}
if (srclen + 1 <= maxencodedlen)
{
// ??????????
*encodedlen = srclen + 1;
for (i = 0; i < srclen; i++)
{
sum = sum + src[i];
// <20>I<EFBFBD>d??7?<3F><>????2?<3F><>???????????<3F>T<EFBFBD><54>
if (((key % 7) == (i % 5)) || ((key % 2) == (i % 2)))
{
src[i] = ~src[i];
}
}
for (i = 0; i < (*encodedlen); i++)
{
if (abs((key%srclen)) > i)
{
encoded[i] = src[i] + sum*((i*i) % 3); // ?????????
}
else
// key%srclen??<3F>t?<3F>u??????????<3F>t?
if (abs((key%srclen)) == i)
{
encoded[i] = sum;
}
else
if (abs((key%srclen)) < i)
{
encoded[i] = src[i - 1] + sum*((i*i) % 7); // ?????????
}
}
}
}
/*
char *src ?????????
int srclen ??????????????<EFBFBD><EFBFBD>?
int key ????????<EFBFBD>i???
char *decoded ???????<EFBFBD><EFBFBD>???<EFBFBD><EFBFBD>?
int *decodedlen ???????<EFBFBD><EFBFBD>???<EFBFBD><EFBFBD>?
*/
void jDecode(char *src, int srclen, int key, char *decoded, int *decodedlen)
{
char sum;
int i;
*decodedlen = srclen - 1;
sum = src[abs(key % (*decodedlen))];
for (i = 0; i < srclen; i++)
{
if (abs((key % (*decodedlen))) > i)
{
decoded[i] = src[i] - sum*((i*i) % 3);
}
if (abs((key % (*decodedlen))) < i)
{
decoded[i - 1] = src[i] - sum*((i*i) % 7);
}
}
for (i = 0; i < (*decodedlen); i++)
{
if (((key % 7) == (i % 5)) || ((key % 2) == (i % 2)))
{
decoded[i] = ~decoded[i];
}
}
}
bool GetMacAddress(char *strMac)
{
PIP_ADAPTER_INFO pAdapterInfo;
DWORD AdapterInfoSize;
TCHAR szMac[32] = { 0 };
DWORD Err;
AdapterInfoSize = 0;
Err = GetAdaptersInfo(NULL, &AdapterInfoSize);
if ((Err != 0) && (Err != ERROR_BUFFER_OVERFLOW)){
//TRACE("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣʧ<CFA2>ܣ<EFBFBD>");
return FALSE;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD>ڴ<EFBFBD>
pAdapterInfo = (PIP_ADAPTER_INFO)GlobalAlloc(GPTR, AdapterInfoSize);
if (pAdapterInfo == NULL){
//TRACE("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD>ڴ<EFBFBD>ʧ<EFBFBD><CAA7>");
return FALSE;
}
if (GetAdaptersInfo(pAdapterInfo, &AdapterInfoSize) != 0){
//TRACE(_T("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣʧ<CFA2>ܣ<EFBFBD>\n"));
GlobalFree(pAdapterInfo);
return FALSE;
}
sprintf_s(strMac, 64, "%02X-%02X-%02X-%02X-%02X-%02X",
pAdapterInfo->Address[0],
pAdapterInfo->Address[1],
pAdapterInfo->Address[2],
pAdapterInfo->Address[3],
pAdapterInfo->Address[4],
pAdapterInfo->Address[5]);
GlobalFree(pAdapterInfo);
return TRUE;
}