223 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			223 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
#include "StdAfx.h"
 | 
						||
 | 
						||
#include "hlapi_c.h"
 | 
						||
#define EYECAST (Word DATAFAR_ *)
 | 
						||
 | 
						||
#include "connect.h"
 | 
						||
#include "server.h"
 | 
						||
#include "tracing.h"
 | 
						||
 | 
						||
#ifdef _DEBUG
 | 
						||
#define new DEBUG_NEW
 | 
						||
#undef THIS_FILE
 | 
						||
static char THIS_FILE[] = __FILE__;
 | 
						||
#endif
 | 
						||
 | 
						||
// @doc INTERNAL
 | 
						||
 | 
						||
// @rdesc Ritorna il valore corrispondente alla chiave appartenente
 | 
						||
//        ad una sezione del file di configurazione
 | 
						||
 | 
						||
static CString GetIniString(LPCSTR sec, // @parm Sezione
 | 
						||
		 			        LPCSTR key, // @parm Chiave
 | 
						||
					        LPCSTR def) // @parm Valore di default
 | 
						||
{
 | 
						||
	// Nome del file .ini
 | 
						||
	static CString m_strIniFile;
 | 
						||
	
 | 
						||
	// Lunghezza massima di un nome di directory
 | 
						||
	// o di un valore del file .ini
 | 
						||
	const DWORD dwSize = _MAX_DIR + 1;
 | 
						||
 | 
						||
	// Costruisce il nome del file .ini se necessario
 | 
						||
	if (m_strIniFile.IsEmpty())
 | 
						||
	{
 | 
						||
		GetCurrentDirectory(dwSize, m_strIniFile.GetBuffer(dwSize));
 | 
						||
		m_strIniFile.ReleaseBuffer();
 | 
						||
		m_strIniFile += "\\prawin.ini";
 | 
						||
	}
 | 
						||
 | 
						||
	// Legge il valore della chiave nella sezione specificata
 | 
						||
	CString tmp;
 | 
						||
	char* buf = tmp.GetBuffer(dwSize);
 | 
						||
	GetPrivateProfileString(sec, key, def, buf, dwSize, m_strIniFile);
 | 
						||
	tmp.ReleaseBuffer();
 | 
						||
	return tmp;
 | 
						||
}
 | 
						||
 | 
						||
#define HLBLOCK 1
 | 
						||
 | 
						||
unsigned short THardlockServer::GetSer()
 | 
						||
{
 | 
						||
	_SerNo = 0xFFFF;
 | 
						||
 | 
						||
    if (HL_AVAIL() == STATUS_OK)
 | 
						||
	{
 | 
						||
		Word Val[4] = { 0, 0, 0, 0 }; 
 | 
						||
		HL_READ(0, EYECAST &Val[0]);
 | 
						||
		HL_READ(1, EYECAST &Val[1]);
 | 
						||
		HL_READ(2, EYECAST &Val[2]);
 | 
						||
		HL_READ(3, EYECAST &Val[3]);
 | 
						||
		HL_CODE(EYECAST Val, HLBLOCK);
 | 
						||
		if (Val[0] == 0xFAE8)
 | 
						||
			_SerNo = Val[1];
 | 
						||
		else
 | 
						||
			_SerNo = 0;
 | 
						||
	}
 | 
						||
	
 | 
						||
	Trace(-1, "Hardlock serial number is %s: %d", 
 | 
						||
		     (_SerNo == 0xFFFF) ? "Bad" : "OK", (int)_SerNo);
 | 
						||
	
 | 
						||
	return _SerNo;
 | 
						||
}
 | 
						||
 | 
						||
unsigned short THardlockServer::GetUsers()
 | 
						||
{
 | 
						||
	_Users = 0;
 | 
						||
	_AssistanceYear = 0;
 | 
						||
	if (_SerNo == 0)
 | 
						||
	{
 | 
						||
		_Users = 4;
 | 
						||
		_AssistanceYear = 1998;
 | 
						||
	}
 | 
						||
	else
 | 
						||
	{
 | 
						||
		if (_SerNo != 0xFFFF)
 | 
						||
		{
 | 
						||
			Word Val[4] = { 0, 0, 0, 0 }; 
 | 
						||
			HL_READ(60, EYECAST &Val[0]);
 | 
						||
			HL_READ(61, EYECAST &Val[1]);
 | 
						||
			HL_READ(62, EYECAST &Val[2]);
 | 
						||
			HL_READ(63, EYECAST &Val[3]);
 | 
						||
			HL_CODE(Val, HLBLOCK);
 | 
						||
			_AssistanceYear = Val[0];
 | 
						||
			_Users = Val[1];
 | 
						||
		}
 | 
						||
	}
 | 
						||
	Trace(-1, "Assistance Year is %d", (int)_AssistanceYear);
 | 
						||
	Trace(-1, "Maximum number of users is %d", (int)_Users);
 | 
						||
	return _Users;
 | 
						||
}
 | 
						||
 | 
						||
BOOL THardlockServer::GetAut()
 | 
						||
{
 | 
						||
  if (_SerNo == 0xFFFF) 
 | 
						||
	  return FALSE;
 | 
						||
 | 
						||
  if (_SerNo == 0) 
 | 
						||
	  return TRUE;
 | 
						||
  
 | 
						||
  HL_READ(48, EYECAST &_int_tab[0]);
 | 
						||
  HL_READ(49, EYECAST &_int_tab[1]);
 | 
						||
  HL_READ(50, EYECAST &_int_tab[2]);
 | 
						||
  HL_READ(51, EYECAST &_int_tab[3]);
 | 
						||
  HL_CODE(_int_tab, HLBLOCK);
 | 
						||
  
 | 
						||
  for (int i = 0; i < 4; i++) 
 | 
						||
	_int_tab[i] ^= _SerNo;
 | 
						||
  if (_int_tab[3]) 
 | 
						||
    return(FALSE);
 | 
						||
  
 | 
						||
  return TRUE;
 | 
						||
}
 | 
						||
 | 
						||
BOOL THardlockServer::Login() const
 | 
						||
{
 | 
						||
	const char* const REFKEY = "CAMPOKEY";
 | 
						||
	const char* const VERKEY = "<EFBFBD>pو<EFBFBD>c<EFBFBD><";
 | 
						||
 | 
						||
	unsigned char ref[9]; strcpy((char*)ref, REFKEY);
 | 
						||
	unsigned char ver[9]; strcpy((char*)ver, VERKEY);
 | 
						||
 | 
						||
    const int status = HL_LOGIN(26952, LOCAL_DEVICE, ref, ver);
 | 
						||
 | 
						||
	Trace(-1, "Hardlock login %s: %d",
 | 
						||
		     status == STATUS_OK ? "OK" : "Failed", status);
 | 
						||
 | 
						||
    return status == STATUS_OK;
 | 
						||
}
 | 
						||
 | 
						||
void THardlockServer::Logout() const
 | 
						||
{
 | 
						||
    HL_LOGOUT();
 | 
						||
}
 | 
						||
 | 
						||
BOOL THardlockServer::OnConnect(const CString& topic)
 | 
						||
{
 | 
						||
	BOOL ok = Connections() <= MaxUsers();
 | 
						||
	if (!ok)
 | 
						||
		Trace(0, "Refusing Topic %s", (const char*)topic);
 | 
						||
	return ok;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
TConnection* THardlockServer::OnCreateConnection(DWORD id)
 | 
						||
{
 | 
						||
	TConnection* c = NULL;
 | 
						||
	if (Connections() <= MaxUsers())
 | 
						||
	{
 | 
						||
		Trace(0, "Connecting %lu", id);
 | 
						||
		c = new TPrassiConnection(this, id);
 | 
						||
	}
 | 
						||
	else
 | 
						||
		Trace(0, "Refusing Connection %lu", id);
 | 
						||
	return c;
 | 
						||
}
 | 
						||
 | 
						||
BOOL THardlockServer::OnRemoveConnection(DWORD id)
 | 
						||
{
 | 
						||
	Trace(0, "Disconnecting %lu", id); 
 | 
						||
	return BASE_SERVER::OnRemoveConnection(id);
 | 
						||
}
 | 
						||
 | 
						||
THardlockServer::THardlockServer() 
 | 
						||
             : BASE_SERVER("HARDLOCK")
 | 
						||
{
 | 
						||
	 _SerNo = 0xFFFF;
 | 
						||
	 _int_tab[0] = 0xFFFF;
 | 
						||
	 _int_tab[1] = 0xFFFF;
 | 
						||
	 _int_tab[2] = 0xFFFF;
 | 
						||
	 _int_tab[3] = 0x0000;
 | 
						||
 | 
						||
	 Login();
 | 
						||
	 GetSer();
 | 
						||
	 GetUsers();
 | 
						||
}
 | 
						||
 | 
						||
THardlockServer::~THardlockServer()
 | 
						||
{
 | 
						||
	 Logout();
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
///////////////////////////////////////////////////////////
 | 
						||
// Start/Stop server
 | 
						||
 | 
						||
static THardlockServer* pDDE = NULL;
 | 
						||
 | 
						||
BOOL StopServer()
 | 
						||
{
 | 
						||
	BOOL ok = pDDE != NULL;
 | 
						||
	if (ok)
 | 
						||
	{
 | 
						||
		delete pDDE;
 | 
						||
		pDDE = NULL;
 | 
						||
	}
 | 
						||
	return ok;
 | 
						||
}
 | 
						||
 | 
						||
THardlockServer& GetServer()
 | 
						||
{
 | 
						||
	ASSERT(pDDE);
 | 
						||
	return *pDDE;
 | 
						||
}
 | 
						||
 | 
						||
BOOL StartServer()
 | 
						||
{
 | 
						||
	BOOL ok = pDDE == NULL;
 | 
						||
	if (ok)
 | 
						||
		pDDE = new THardlockServer;
 | 
						||
	return ok;
 | 
						||
}
 | 
						||
 |