campo-sirio/ba/autorun.cpp
luca fd0b1c6708 Patch level :2.0 488
Files correlati     :
Ricompilazione Demo : [ ]
Commento            :AO20003 (speriamo in via definitiva!)


git-svn-id: svn://10.65.10.50/trunk@11209 c028cbd2-c16b-5b4b-a496-9718f37d4682
2003-06-03 14:39:38 +00:00

442 lines
11 KiB
C++
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#define WIN32_LEAN_AND_MEAN
#define STRICT
#include <windows.h>
#include <shellapi.h>
#include <fstream.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
extern "C"
{
#include "../xvaga/hlapi_c.h"
#include "../xvaga/skeylink.h"
}
void ErrorBox(LPCSTR str)
{
MessageBox(GetFocus(), str, "Installazione", MB_ICONSTOP|MB_OK);
}
void WarningBox(LPCSTR str)
{
MessageBox(GetFocus(), str, "Installazione", MB_ICONEXCLAMATION|MB_OK);
}
/****************************/
/* Gestione chiave Hardlock */
/****************************/
bool HardlockGarble(unsigned int* data)
{
HL_CODE(data, 1);
return TRUE;
}
unsigned int HardlockLogin(int& year)
{
unsigned int serno = 0xFFFF;
unsigned char REFKEY[16] = "CAMPOKEY";
unsigned char VERKEY[16] = "ìpÙˆ¬cê<";
if (HL_LOGIN(26952, LOCAL_DEVICE, REFKEY, VERKEY) == STATUS_OK)
{
unsigned int eprom[64]; memset(eprom, 0, sizeof(eprom));
HL_READBL((unsigned char*)eprom);
unsigned int data[4];
memcpy(data, eprom, sizeof(data));
HardlockGarble(data);
if (data[0] == 0xFAE8)
serno = data[1];
else
serno = 0;
memcpy(data, &eprom[60], sizeof(data));
if (HardlockGarble(data))
year = (int)data[0];
}
return serno;
}
/**************************/
/* Gestione chiave Eutron */
/**************************/
void EncodeEutronPassword(char* str)
{
const char* const key = "QSECOFR-";
char tmp[16];
for (int i = 0; str[i]; i++)
tmp[i] = str[i] + (i < 8 ? key[i] : str[i - 8]);
tmp[i] = '\0';
strcpy(str, tmp);
}
unsigned int EutronLogin(int& year)
{
unsigned int serno = 0xFFFF;
KEY_NET eutron_key;
memset(&eutron_key, 0, sizeof(KEY_NET));
eutron_key.net_command = NET_KEY_OPEN;
eutron_key.command = LOCATING_MODE;
const char* chiaro = "AGA.CAMPO";
char cifrato[16];
strcpy(cifrato, chiaro);
EncodeEutronPassword(cifrato);
memset(eutron_key.label, 0, LABEL_LENGTH);
strcpy((char*)eutron_key.label, chiaro);
memset(eutron_key.password, 0, PASSWORD_LENGTH);
strcpy((char*)eutron_key.password, cifrato);
smartlink(&eutron_key);
if (eutron_key.status == ST_OK)
{
eutron_key.net_command = NET_KEY_ACCESS;
eutron_key.command = BLOCK_READING_MODE;
short* pointer = (short*)(&eutron_key.data[0]);
short* number = (short*)(&eutron_key.data[2]);
*pointer = 0; // Posizione in cui leggere
*number = 8; // Words da leggere
smartlink(&eutron_key);
if (eutron_key.status == ST_OK)
{
serno = (unsigned int)atol((const char*)eutron_key.data+4);
const unsigned short y = *(unsigned short*)(eutron_key.data+12);
if (y > 2000 && y < 3000)
year = y;
}
}
return serno;
}
/***********************************/
/* Gestione cifratura lista codici */
/***********************************/
static char key[16] = "";
void BuildKey()
{
for (int i = 0; i < 8; i++)
key[i] = 'A'+ rand()%26;
}
void DecodeString(char* data)
{
char tmp[256];
BuildKey();
for (int i = 0; data[i]; i++)
tmp[i] = data[i] - (i < 8 ? key[i] : tmp[i - 8]);
tmp[i] = '\0';
strcpy(data, tmp);
}
int ThisYear()
{
int anno = 2003;
time_t lt;
if (time(&lt) == 0)
{
struct tm* timeloc = localtime(&lt) ;
if (timeloc != NULL)
anno = timeloc->tm_year + 1900;
}
return anno;
}
int VersionYear()
{
char ver[32];
GetPrivateProfileString("ba", "Versione", "", ver, sizeof(ver), "./program/zip/install.ini");
ver[4] = '\0';
return atoi(ver);
}
void ProgramName(char* name)
{
char ver[80];
GetPrivateProfileString("Main", "Producer", "", ver, sizeof(ver), "./program/zip/install.ini");
if (ver[0] != '\0')
{
const char * const encryption_key = "QSECOFR-";
for (int i = 0; ver[i]; i++)
name[i] = ver[i] - (i < 8 ? encryption_key[i] : name[i - 8]);
name[i] = '\0';
}
else
strcpy(name, "Campo");
}
bool DongleTest()
{
int yearKey = 0;
unsigned int serno = HardlockLogin(yearKey);
if (serno == 0xFFFF)
serno = EutronLogin(yearKey);
if (serno == 0 || serno == 0xFFFF)
return TRUE; // Chiave inesistente o invisibile = Prima installazione
const int verYear = VersionYear();
if (yearKey >= verYear) // Chiave già programmata con assistenza pagata
return TRUE;
bool ok = FALSE;
ifstream keys("./program/zip/dninst.zip", ios::in | ios::nocreate);
if (keys.good())
{
char line[256];
keys.getline(line, sizeof(line));
srand(883);
DecodeString(line);
const int ass_year = atoi(line);
if (ass_year > yearKey) // Non devo abbassare l'anno di assistenza!
{
srand(ass_year);
while (!keys.eof())
{
keys.getline(line, sizeof(line));
DecodeString(line);
unsigned int sn = (unsigned int)atol(line);
if (sn == serno || line[0] == '*')
{
ok = TRUE;
break;
}
}
if (ok)
{
wsprintf(line, "Il contratto di manutenzione %d verrà attivato automaticamente", ass_year);
WarningBox(line);
}
else
{
wsprintf(line, "È necessario contattare l'assistenza tecnica\n"
"per l'abilitazione del contratto di manutenzione %d", verYear);
WarningBox(line);
}
}
}
else
{
ErrorBox("Impossibile verificare il contratto di manutenzione");
}
return ok;
}
unsigned int Run(LPCSTR app)
{
unsigned int ret = WinExec(app, SW_SHOWNORMAL);
if (ret <= 32)
{
char s[128];
wsprintf(s,"Impossibile eseguire\n%s\nErrore %d", app, (int)ret);
ErrorBox(s);
}
return ret;
}
/*
* MainWndProc
*
* Purpose:
* Window procedure for main window. The main window is a dialog.
*
*/
LRESULT CALLBACK MainWndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_ERASEBKGND:
{
/* Repaint lo sfondo quando necessario*/
HDC hdc = (HDC) wParam;
HPEN hpenOld = (HPEN)SelectObject(hdc, GetStockObject(NULL_PEN));
RECT rect; GetClientRect(hwnd,&rect);
COLORREF cStart = GetSysColor(COLOR_ACTIVECAPTION);
COLORREF cStop = GetSysColor(27 /*COLOR_GRADIENTACTIVECAPTION*/);
int deltaR = GetRValue(cStop) - GetRValue(cStart);
int deltaG = GetGValue(cStop) - GetGValue(cStart);
int deltaB = GetBValue(cStop) - GetBValue(cStart);
const int ysize=rect.bottom-rect.top;
const int step = 4;
for (int y=rect.bottom; y>=rect.top-step; y-=step)
{
int r = GetRValue(cStart) + deltaR * y / rect.bottom;
int g = GetGValue(cStart) + deltaG * y / rect.bottom;
int b = GetBValue(cStart) + deltaB * y / rect.bottom;
HBRUSH hbrush = CreateSolidBrush(RGB(r,g,b));
HBRUSH hbrushOld = (HBRUSH)SelectObject(hdc, hbrush);
Rectangle(hdc, rect.left, y, rect.right, y+step+1);
SelectObject(hdc, hbrushOld);
DeleteObject(hbrush);
}
SelectObject(hdc, hpenOld);
}
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
RECT rct;
const char* s1 = "Installa la versione commerciale protetta. E' necessario disporre di una chiave di protezione hardware.";
const char* s2 = "Installa la versione Demo. La versione Demo è priva di protezione hardware ma soggetta ad alcune limitazioni.";
const char* s4 = "Termina installazione";
const char* s5 = "Scelta installazione";
HDC hdc = BeginPaint(hwnd, &ps);
GetWindowRect(GetDesktopWindow(),&rct);
SetBkMode(hdc, TRANSPARENT);
const int offx=(rct.right - rct.left-640)/2;
const int offy=(rct.bottom - rct.top-260)/2;
rct.left = offx+300;
rct.top = offy;
rct.right = rct.left+350;
rct.bottom = offy+60;
SetTextColor(hdc, GetSysColor(COLOR_CAPTIONTEXT));
DrawText(hdc, s1, strlen(s1), &rct, DT_LEFT|DT_WORDBREAK);
rct.top += 80; rct.bottom += 80;
DrawText(hdc, s2, strlen(s2), &rct, DT_LEFT|DT_WORDBREAK);
rct.top += 80; rct.bottom += 80;
DrawText(hdc, s4, strlen(s4), &rct, DT_LEFT|DT_WORDBREAK);
/* Titolo con ombreggiatura */
HFONT hfont = CreateFont(64, 0, 0, 0, FW_BOLD, TRUE, FALSE, FALSE, ANSI_CHARSET, OUT_TT_PRECIS, CLIP_TT_ALWAYS, PROOF_QUALITY, VARIABLE_PITCH | FF_SWISS, "Arial");
HFONT hfontOld = (HFONT)SelectObject(hdc, hfont);
SetTextColor(hdc, RGB(0,0,0));
TextOut(hdc, 20, 20, s5, strlen(s5));
SetTextColor(hdc, GetSysColor(COLOR_CAPTIONTEXT));
TextOut(hdc, 16, 16, s5, strlen(s5));
SelectObject(hdc, hfontOld);
DeleteObject(hfont);
EndPaint(hwnd, &ps);
}
break;
case WM_COMMAND:
{
if (wParam == 1000)
{
if (DongleTest())
Run("program\\disk1\\setup.exe");
}
else if (wParam == 1001)
{
Run("demo\\disk1\\setup.exe");
}
else if (wParam != 2)
return 0;
PostQuitMessage(0);
}
break;
case WM_CHAR:
if (wParam == VK_ESCAPE)
PostQuitMessage(0);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefDlgProc(hwnd, msg, wParam, lParam);
}
return NULL;
}
/*
* InitApplication
*
* Purpose:
* Registers window class
*
* Parameters:
* hinst hInstance of application
*
* Return Value:
* TRUE if initialization succeeded, FALSE otherwise.
*/
BOOL InitApplication (HINSTANCE hinst)
{
WNDCLASS wc;
wc.style = CS_DBLCLKS | CS_SAVEBITS | CS_BYTEALIGNWINDOW;
wc.lpfnWndProc = MainWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = DLGWINDOWEXTRA;
wc.hInstance = hinst;
wc.hIcon = LoadIcon(hinst, MAKEINTRESOURCE(103));
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = HBRUSH(COLOR_WINDOW + 1);
wc.lpszMenuName = NULL;
wc.lpszClassName = "MainWndClass";
return RegisterClass(&wc);
}
/*
* WinMain
*
* Purpose:
* Main entry point of application.
*
*/
int PASCAL WinMain (HINSTANCE hInst, HINSTANCE hinstPrev, LPSTR pCmdLine, int nCmdShow)
{
MSG msg;
if (!hinstPrev)
if (!InitApplication(hInst)) // Register window class
return FALSE;
RECT rect;
GetWindowRect(GetDesktopWindow(),&rect);
HWND hwndDlg=CreateWindow("MainWndClass","Scelta installazione",WS_VISIBLE| WS_CAPTION | WS_SYSMENU | WS_MAXIMIZE,
rect.left,rect.top,rect.right,rect.bottom,NULL,NULL,hInst,NULL );
const int offx=(rect.right - rect.left-700)/2;
const int offy=(rect.bottom - rect.top-260)/2;
char name[80];
ProgramName(name);
char prompt[128];
strcpy(prompt, name);
/* Disegna i pulsanti */
CreateWindow("BUTTON",prompt, WS_CHILD | WS_VISIBLE,
offx, offy, 300, 32, hwndDlg , (HMENU)1000, hInst, NULL );
strcat(prompt, " DEMO");
CreateWindow("BUTTON", prompt, WS_CHILD | WS_VISIBLE,
offx, offy+80, 300, 32, hwndDlg , (HMENU)1001, hInst, NULL );
CreateWindow("BUTTON","Uscita",
WS_CHILD| WS_VISIBLE,offx,offy+160,300,32, hwndDlg ,(HMENU)2,hInst,NULL );
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (msg.wParam);
}