📄 pppserverdlg.cpp
字号:
// PPPServerDlg.cpp : implementation file
//
#include "stdafx.h"
#include "PPPServer.h"
#include "PPPServerDlg.h"
//#include "aboutdlg.h"
#include "AboutDlg.h"
#include "setposition.h"
#include "setsize.h"
#include "texteditor.h"
#include "setautorundlg.h"
#include "SoftRegisterDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//如何在程序中关闭、重起和硬起动WCE、PPC、SP?
//作者:Daric 来源:BIPLIP.com 时间:2005年5月8日 18:18 阅读3888次
// 关闭(suspend)
//方法1:
//虚拟关机键
//::keybd_event(VK_OFF, 0, 0, 0);
//::keybd_event(VK_OFF, 0, KEYEVENTF_KEYUP, 0);
//方法2:
//调用未公开函数PowerOffSystem()
//extern "C" __declspec(dllimport) void PowerOffSystem();
//Soft reset the device
/*#include <winioctl.h>
#define IOCTL_HAL_REBOOT CTL_CODE(FILE_DEVICE_HAL, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
extern "C" __declspec(dllimport) BOOL KernelIoControl(
DWORD dwIoControlCode,
LPVOID lpInBuf,
DWORD nInBufSize,
LPVOID lpOutBuf,
DWORD nOutBufSize,
LPDWORD lpBytesReturned);
*/
BOOL ResetDevice()
{
return KernelIoControl(IOCTL_HAL_REBOOT, NULL, 0, NULL, 0, NULL);
}
//硬起动(hard reset)
//注意!!!使用此段代码会将您的Pocket PC的用户数据全部清空,
//请勿非法使用,用者后果自负.
//#include <winioctl.h>
//#define IOCTL_HAL_REBOOT CTL_CODE(FILE_DEVICE_HAL, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
/*
extern "C" __declspec(dllimport)void SetCleanRebootFlag(void);
extern "C" __declspec(dllimport) BOOL KernelIoControl(
DWORD dwIoControlCode,
LPVOID lpInBuf,
DWORD nInBufSize,
LPVOID lpOutBuf,
DWORD nOutBufSize,
LPDWORD lpBytesReturned);
*/
BOOL HardResetDevice()
{
SetCleanRebootFlag();
return KernelIoControl(IOCTL_HAL_REBOOT, NULL, 0, NULL, 0, NULL);
}
//=============================================================
CPPPServerDlg *m_main_dlg;
//
CString m_ini_pathname;
CString m_keycode_pathname;
bool m_one_flag=false;
bool m_all_flag=false;
BOOL m_run_watchdlg_flag=FALSE;
HANDLE m_watchdog_thread=NULL;
//软件保护标志
BOOL m_software_protected_flag;
//
//adjust system time
bool m_server_run_flag=false;
HANDLE m_server_thread_handle=NULL;
DWORD m_server_threadid=0;
//
#define SOCKETBUFFSIZE 8192
//20480
#define SD_RECEIVE 0x00
#define SD_SEND 0x01
#define SD_BOTH 0x02
//向客户端发送数据的函数。
//参数1:连接socket;参数2:缓冲区指针;参数3:要发送的字节数,其实就是缓冲区中的数据数;
int WriteSocket(SOCKET fd,char *bp,int len)
{
int cnt;
int rc;
cnt=len;
//我觉得,之所以需要用一个while循环来发送数据,大概是因为send函数也许不能把指定数量数据
//一次都发送完吧,所以需要用一个循环来反复地发送,直至所有的数据都发送完,或者是出错。
while(cnt>0)
{
//send The send function sends data on a connected socket.
//send函数的返回值可用来表示已经成功地发送出去了多少数据,至于客户端能否成功地收到
//这些数据,好像并不能在send函数的返回值中体现出来。其实,能否成功地收到数据是客户端
//的事,跟服务器端无关。也许数据被客户端的防火墙拦截了,这样,客户端就永远也不能收到
//这些数据了,不过,这些乱七八糟的事,服务器端可管不着。
rc=send(fd,bp,cnt,0);
if(rc==SOCKET_ERROR)
{
//CString aa;
//aa="发送错误!\n";
//AfxGetMainWnd()->SendMessageToDescendants(WM_AGE1,(LPARAM)aa.GetBuffer(0),1);
//aa.ReleaseBuffer();
int errorno;
errorno=WSAGetLastError();
return -1;
}
if(rc==0)
{
int errorno;
errorno=WSAGetLastError();
return len-cnt;
}
//发送完了一批数据后,缓冲区指针当然要向后移了。如果指定数量的数据已经发送完了,则
//bp就指向缓冲区的末尾了。
bp+=rc;
//发送完了一批数据,则cnt(用来记录还没发送完的数据)的数值当然需要减去已经发送了的了。
cnt-=rc;
}
return len;
}
//从客户端读取数据的函数。
//参数1:连接套接字;参数2:指向缓冲区的指针;参数3:缓冲区的长度;
//参数4:超时处理
int ReadSocket1(SOCKET fd,char *bp,int len,DWORD timeout)
{
/////////////////////////////////////////////
int cnt;//用来记录缓冲区中的剩余可用空间。
int rc;
cnt=len;
while(cnt>0)
{
//Platform SDK: Windows Sockets The recv function receives data from a connected or bound socket.
//Return Values If no error occurs, recv returns the number of bytes received. If the connection has been gracefully closed, the return value is zero. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.
//cnt参数的值被设定为缓冲区的长度值,所以,在网络速度足够好的情况下,读取cnt这么
//多的字节,没问题。这样的话,此while循环只需要执行一次就会正常退出了。从而,我也
//明白了while循环的作用,就是:用来保证一定要读取cnt这么多的字节,读不够数就
//反复地读,直至读够数了,或者是此连接被关闭掉了。
//我有一个疑问:如果客户端只发过来50个字节的数据,会怎么样呢?其实,这个问题,只需要查到合适的资料,就可以轻松解决,并无任何的难度可言。
//答:?????? timeout process,haha~~
rc=recv(fd,bp,cnt,0);
if(rc==SOCKET_ERROR)
{
int errorno;
errorno=WSAGetLastError();
//CString aa;
//aa="接收错误!\n";
//AfxGetMainWnd()->SendMessageToDescendants(WM_AGE1,(LPARAM)aa.GetBuffer(0),1);
//aa.ReleaseBuffer();
return -1;
}
//If the connection has been gracefully closed, the return value is zero.
if(rc==0)
{
int errorno;
errorno=WSAGetLastError();
return len-cnt;
}
//读取了一些数据之后,缓冲区指针也应该相应地增加。
bp+=rc;
//读取了一些数据之后,缓冲区中的剩余可用空间也应该相应地减小。
cnt-=rc;
}
////////////////////////////
return len;
}
//从服务端读取数据的函数。
//参数1:连接套接字;参数2:指向缓冲区的指针;参数3:缓冲区的长度;
//参数4:超时处理
int ReadSocket(SOCKET fd,char *bp,int len,DWORD timeout)
{
fd_set fdRead;
TIMEVAL tt;
tt.tv_sec=0;//timeout/1000;
tt.tv_usec=0;//(timeout%1000)*1000;
/////////////////////////////////////////////
int iRet=0;
int rc=0;
DWORD bt,et;
bt=et=GetTickCount();
while(TRUE)//cnt>0)
{
FD_ZERO(&fdRead);
FD_SET(fd,&fdRead);
iRet=select(0,&fdRead,NULL,NULL,&tt);
if(iRet==SOCKET_ERROR)
{
break;
}
if(iRet>0)
{
if(FD_ISSET(fd,&fdRead))
{
//read
rc=recv(fd,bp,len,0);
if(rc==SOCKET_ERROR)
{
//接收错误!
int errorno;
errorno=WSAGetLastError();
return -1;
}
//If the connection has been gracefully closed, the return value is zero.
else if(rc==0)
{
int errorno;
errorno=WSAGetLastError();
return 0;
}
else
{
return rc;
}
}
}
//timeout
et=GetTickCount();
if(et-bt>=timeout) break;
}
return -2;
}
//get rand seed,
//使每次产生的随机数不一样
BYTE GetCodeBYTE()
{
BYTE b=0x00;
int n;
n=rand();
n=n%255; // 得到一个0-(MAX_ADD_SHOWWAY-4)的数
//
//in=n+1;
b=n;
return b;
}
//
//取得PPC2003设备机身设备序号的EVC程序和代码 [ 2006-6-17 | Cxty's Blog | 嘻 嚓 啼 歪 的 小 窝 窝 ]
//主要是使用KernelIOControl这个函数
CString GetSerialNumberFromKernelIoControl()
{
DWORD dwOutBytes;
const int nBuffSize = 4096;
byte arrOutBuff[nBuffSize];
int count;
count=0;
begin:
BOOL bRes = ::KernelIoControl(IOCTL_HAL_GET_DEVICEID,
0, 0, arrOutBuff, nBuffSize, &dwOutBytes);
if (bRes)
{
CString strDeviceInfo;
for (unsigned int i = 0; i<dwOutBytes; i++)
{
CString strNextChar;
strNextChar.Format(TEXT("%02X"), arrOutBuff[i]);
strDeviceInfo += strNextChar;
}
CString strDeviceId =
strDeviceInfo.Mid(20,2) + //40
strDeviceInfo.Mid(30,8) + //9
strDeviceInfo.Mid(70,6);
return strDeviceId;
}
else
{ ++count;
if(count<10) goto begin;
return _T("");
}
}
CString GetSerialNumber(CString m_pathname)
{
CString sn;
//sn=TEXT("");
sn=GetSerialNumberFromKernelIoControl();
FILE *fp;
fp=_tfopen(m_pathname,L"rb");
if(!fp)
{
//
fp=_tfopen(m_keycode_pathname,L"wb");
if(fp)
{
//create 32*8 code by random
BYTE ch;
int i;
CString strDeviceInfo;
SYSTEMTIME st;
GetSystemTime(&st);
unsigned int seed;
//seed=st.wHour*3600+st.wMinute*60+st.wSecond*1000+st.wMilliseconds;
seed=st.wHour*3600+st.wMinute*60+st.wSecond+st.wMilliseconds;
srand(seed);
for ( i = 0; i<8; i++)
{
ch=GetCodeBYTE();
CString strNextChar;
strNextChar.Format(TEXT("%02X"), ch);
strDeviceInfo += strNextChar;
}
WORD len=strDeviceInfo.GetLength()*2;
fwrite(&len,2,1,fp);
TCHAR tch;
for(int j=0;j<len/2;j++)
{
tch=strDeviceInfo.GetAt(j);
fwrite(&tch,2,1,fp);
}
//fwrite((char*)strDeviceInfo,len,1,fp);
//write 32+32 byte to file
//len*2+2
fclose(fp);
//
sn=sn+strDeviceInfo;
}
//
//m_software_registered_flag=FALSE;//NOT REGISTER
}
else
{
//取得ID
CString did;
WORD len;
fread(&len,2,1,fp);
TCHAR *str;
str=new TCHAR[len+1];
//for(WORD i=0;i<len;i++)
fread(str,len,1,fp);
str[len/2]=_T('\0');//
did=str;
delete str;
fclose(fp);
//
sn=sn+did;
}
return sn;
}
//
CString GetSoftWareRegisterCode(CString serial)
{
CString sn;
sn=serial;
if(sn.GetLength()<=0||sn.GetLength()%2!=0)
{
return TEXT("1234567890");
}
//全部为大写
//
sn.MakeUpper();
//
CString tmpstr;
int len;
len=sn.GetLength();
//0,1,2,3,4,5,6,7,8,9
//1,8,2,5,0,3,9,6,4,7
TCHAR code[11]={_T('1'),_T('8'),_T('2'),_T('5'),_T('0'),
_T('3'),_T('9'),_T('6'),_T('4'),_T('7'),
_T('\0')
};
//密码=[各项求和后模10]+[原码]+[各项求积后模10]
long he,ji;
he=0;
ji=1;
TCHAR ch,ss,mm;
TCHAR *mstr;
ss=0;
mm=0;
mstr=new TCHAR[len+2+1];
int count;
count=0;
for(int i=0;i<len;i++)
{
ch=sn.GetAt(i);
if(ch>=_T('A')&&ch<=_T('F'))
{
ss=ch-_T('A');
}
else
{
ss=ch-_T('0');
}
//he,ji
if(ss!=0)
{
he=he+ss;
ji=ji*ss;
}
//
if(ss!=0)
{
mm=code[ss];
mstr[count+1]=mm;
count++;
}
//.....
}
//he
ss=labs(he)%10;
mm=code[ss];
mstr[0]=mm;
//ji
ss=labs(ji)%10;
mm=code[ss];
mstr[count+1]=mm;
//
mstr[count+2]=_T('\0');
//
tmpstr=mstr;
//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -