// Chess Giants key generator
 
 
 
#include <windows.h>
 
#include <commctrl.h>
 
#include "rsrc.h"
 
 
 
 
 
// global variables used in this module only
 
static HINSTANCE hAppInstance;
 
 
 
 
 
// function prototypes
 
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, char *lpCmdLine, int nCmdShow);
 
static int WINAPI MainDialogProc (HWND hWnd, unsigned int message, unsigned int wParam, long lParam);
 
static unsigned long ComputeRegistrationCode (const char *email);
 
static void CenterWindow (HWND hWnd);
 
 
 
 
 
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, char *lpCmdLine, int nCmdShow)
 
{
 
   // program entrypoint
 
 
 
   hAppInstance = hInstance; // save application instance
 
 
 
   InitCommonControls ();
 
   OleInitialize (NULL); // initialize OLE (for XP style)
 
 
 
   // fire up the main dialog box
 
   DialogBox (hAppInstance, (char *) DIALOG_MAIN, 0, MainDialogProc);
 
 
 
   OleUninitialize ();
 
 
 
   return (0); // return to Windows
 
}
 
 
 
 
 
static int WINAPI MainDialogProc (HWND hWnd, unsigned int message, unsigned int wParam, long lParam)
 
{
 
   // mesage handler for main dialog box
 
 
 
   static char email[256];
 
 
 
   // have we just fired up this window ?
 
   if (message == WM_INITDIALOG)
 
   {
 
      // center window on screen
 
      CenterWindow (hWnd);
 
 
 
      // set dialog icons (small one for title bar & big one for task manager)
 
      SendMessage (hWnd, WM_SETICON, ICON_SMALL, (LPARAM) LoadIcon (hAppInstance, (char *) ICON_MAIN));
 
      SendMessage (hWnd, WM_SETICON, ICON_BIG, (LPARAM) LoadIcon (hAppInstance, (char *) ICON_MAIN));
 
 
 
      return (1);
 
   }
 
 
 
   // else did we click the close button on the title bar ?
 
   else if (message == WM_CLOSE)
 
   {
 
      EndDialog (hWnd, 0); // if so, tell the dialog box to exit
 
      return (1);
 
   }
 
 
 
   // else did we alter a control INSIDE the window ?
 
   else if (message == WM_COMMAND)
 
   {
 
      // was something entered in the edit box ?
 
      if ((HIWORD (wParam) == EN_CHANGE) && (LOWORD (wParam) == EDITBOX_EMAIL))
 
      {
 
         GetDlgItemText (hWnd, EDITBOX_EMAIL, email, sizeof (email));
 
         if (strlen (email
) > sizeof ("a@b.c") - 1)  
            SetDlgItemInt (hWnd, EDITBOX_ACTIVATIONCODE, ComputeRegistrationCode (email), 0);
 
         else
 
            SetDlgItemText (hWnd, EDITBOX_ACTIVATIONCODE, "More chars!");
 
 
 
         return (1);
 
      }
 
 
 
   }
 
 
 
   return (0);
 
}
 
 
 
 
 
static unsigned long ComputeRegistrationCode (const char *email)
 
{
 
   // quick helper to see if the program is registered. It contains an address to potential crackers.
 
   // Notice: user's email address may be a wchar_t array, and thus may contain Unicode characters.
 
   // /!\ WARNING: THE CRACKER MESSAGE SHOULD NEVER CHANGE, AND NEITHER SHOULD THE ALGORITHM BELOW /!\
 
 
 
   static const char crackermsg[] = "Please, respect my work. DON'T PUBLISH if you crack my program. Thank you and happy cracking :)";
 
 
 
   unsigned long correct_activationcode;
 
   int byte_index;
 
   int length;
 
 
 
   // compute the maximal length of the string for which we need to checksum
 
   if (length > sizeof (crackermsg) - 1)
 
      length = sizeof (crackermsg) - 1; // bound it to the length of the cracker message
 
 
 
   // hash the supplied e-mail
 
   correct_activationcode = 5381; // start value
 
   for (byte_index = 0; byte_index < sizeof (crackermsg) - 1; byte_index++)
 
      correct_activationcode = ((correct_activationcode << 5) + correct_activationcode)
 
                                 + ((unsigned long) (length 
> 0 ? tolower (email
[byte_index 
% length
]) : 1) // prevent zero divide  
                                    ^ (unsigned long) crackermsg[byte_index]); // hash = hash * 33 + (char(email) ^ char(crackermsg))
 
   correct_activationcode &= 0x7FFFFFFF; // make sure the results remain positive
 
 
 
   // return the correct code
 
   return (correct_activationcode);
 
}
 
 
 
 
 
static void CenterWindow (HWND hWnd)
 
{
 
   // this function centers the specified window on screen.
 
 
 
   RECT rRect;
 
   int width;
 
   int height;
 
   int x;
 
   int y;
 
 
 
   // get the current rectangle of the current window
 
   GetWindowRect (hWnd, &rRect);
 
   width = rRect.right - rRect.left;
 
   height = rRect.bottom - rRect.top;
 
 
 
   // draw window in the center of the screen
 
   x = GetSystemMetrics (SM_CXSCREEN) / 2 - width / 2;
 
   y = GetSystemMetrics (SM_CYSCREEN) / 2 - height / 2;
 
 
 
   // now ask to change the position of the window
 
   SetWindowPos (hWnd, NULL, x, y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
 
 
 
   return; // finished
 
}