Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line | 
|---|---|---|---|
| 128 | pmbaty | 1 | // Chess Giants key generator | 
        
| 2 | |||
| 3 | #include <windows.h> | 
        ||
| 4 | #include <commctrl.h> | 
        ||
| 5 | #include "rsrc.h" | 
        ||
| 6 | |||
| 7 | |||
| 8 | // global variables used in this module only | 
        ||
| 9 | static HINSTANCE hAppInstance;  | 
        ||
| 10 | |||
| 11 | |||
| 12 | // function prototypes | 
        ||
| 13 | int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, char *lpCmdLine, int nCmdShow);  | 
        ||
| 14 | static int WINAPI MainDialogProc (HWND hWnd, unsigned int message, unsigned int wParam, long lParam);  | 
        ||
| 15 | static unsigned long ComputeRegistrationCode (const char *email);  | 
        ||
| 16 | static void CenterWindow (HWND hWnd);  | 
        ||
| 17 | |||
| 18 | |||
| 19 | int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, char *lpCmdLine, int nCmdShow)  | 
        ||
| 20 | { | 
        ||
| 21 |    // program entrypoint | 
        ||
| 22 | |||
| 23 | hAppInstance = hInstance; // save application instance  | 
        ||
| 24 | |||
| 25 | InitCommonControls ();  | 
        ||
| 26 | OleInitialize (NULL); // initialize OLE (for XP style)  | 
        ||
| 27 | |||
| 28 |    // fire up the main dialog box | 
        ||
| 29 | DialogBox (hAppInstance, (char *) DIALOG_MAIN, 0, MainDialogProc);  | 
        ||
| 30 | |||
| 31 | OleUninitialize ();  | 
        ||
| 32 | |||
| 33 | return (0); // return to Windows  | 
        ||
| 34 | } | 
        ||
| 35 | |||
| 36 | |||
| 37 | static int WINAPI MainDialogProc (HWND hWnd, unsigned int message, unsigned int wParam, long lParam)  | 
        ||
| 38 | { | 
        ||
| 39 |    // mesage handler for main dialog box | 
        ||
| 40 | |||
| 41 | static char email[256];  | 
        ||
| 42 | |||
| 43 |    // have we just fired up this window ? | 
        ||
| 44 | if (message == WM_INITDIALOG)  | 
        ||
| 45 |    { | 
        ||
| 46 |       // center window on screen | 
        ||
| 47 | CenterWindow (hWnd);  | 
        ||
| 48 | |||
| 49 |       // set dialog icons (small one for title bar & big one for task manager) | 
        ||
| 50 | SendMessage (hWnd, WM_SETICON, ICON_SMALL, (LPARAM) LoadIcon (hAppInstance, (char *) ICON_MAIN));  | 
        ||
| 51 | SendMessage (hWnd, WM_SETICON, ICON_BIG, (LPARAM) LoadIcon (hAppInstance, (char *) ICON_MAIN));  | 
        ||
| 52 | |||
| 53 | return (1);  | 
        ||
| 54 |    } | 
        ||
| 55 | |||
| 56 |    // else did we click the close button on the title bar ? | 
        ||
| 57 | else if (message == WM_CLOSE)  | 
        ||
| 58 |    { | 
        ||
| 59 | EndDialog (hWnd, 0); // if so, tell the dialog box to exit  | 
        ||
| 60 | return (1);  | 
        ||
| 61 |    } | 
        ||
| 62 | |||
| 63 |    // else did we alter a control INSIDE the window ? | 
        ||
| 64 | else if (message == WM_COMMAND)  | 
        ||
| 65 |    { | 
        ||
| 66 |       // was something entered in the edit box ? | 
        ||
| 67 | if ((HIWORD (wParam) == EN_CHANGE) && (LOWORD (wParam) == EDITBOX_EMAIL))  | 
        ||
| 68 |       { | 
        ||
| 69 | GetDlgItemText (hWnd, EDITBOX_EMAIL, email, sizeof (email));  | 
        ||
| 70 | if (strlen (email) > sizeof ("a@b.c") - 1)  | 
        ||
| 71 | SetDlgItemInt (hWnd, EDITBOX_ACTIVATIONCODE, ComputeRegistrationCode (email), 0);  | 
        ||
| 72 |          else | 
        ||
| 73 | SetDlgItemText (hWnd, EDITBOX_ACTIVATIONCODE, "More chars!");  | 
        ||
| 74 | |||
| 75 | return (1);  | 
        ||
| 76 |       } | 
        ||
| 77 | |||
| 78 |    } | 
        ||
| 79 | |||
| 80 | return (0);  | 
        ||
| 81 | } | 
        ||
| 82 | |||
| 83 | |||
| 84 | static unsigned long ComputeRegistrationCode (const char *email)  | 
        ||
| 85 | { | 
        ||
| 86 |    // quick helper to see if the program is registered. It contains an address to potential crackers. | 
        ||
| 87 |    // Notice: user's email address may be a wchar_t array, and thus may contain Unicode characters. | 
        ||
| 88 |    // /!\ WARNING: THE CRACKER MESSAGE SHOULD NEVER CHANGE, AND NEITHER SHOULD THE ALGORITHM BELOW /!\ | 
        ||
| 89 | |||
| 90 | static const char crackermsg[] = "Please, respect my work. DON'T PUBLISH if you crack my program. Thank you and happy cracking :)";  | 
        ||
| 91 | |||
| 92 | unsigned long correct_activationcode;  | 
        ||
| 93 | int byte_index;  | 
        ||
| 94 | int length;  | 
        ||
| 95 | |||
| 96 |    // compute the maximal length of the string for which we need to checksum | 
        ||
| 97 | length = strlen (email);  | 
        ||
| 98 | if (length > sizeof (crackermsg) - 1)  | 
        ||
| 99 | length = sizeof (crackermsg) - 1; // bound it to the length of the cracker message  | 
        ||
| 100 | |||
| 101 |    // hash the supplied e-mail | 
        ||
| 102 | correct_activationcode = 5381; // start value  | 
        ||
| 103 | for (byte_index = 0; byte_index < sizeof (crackermsg) - 1; byte_index++)  | 
        ||
| 104 | correct_activationcode = ((correct_activationcode << 5) + correct_activationcode)  | 
        ||
| 105 | + ((unsigned long) (length > 0 ? tolower (email[byte_index % length]) : 1) // prevent zero divide  | 
        ||
| 106 | ^ (unsigned long) crackermsg[byte_index]); // hash = hash * 33 + (char(email) ^ char(crackermsg))  | 
        ||
| 107 | correct_activationcode &= 0x7FFFFFFF; // make sure the results remain positive  | 
        ||
| 108 | |||
| 109 |    // return the correct code | 
        ||
| 110 | return (correct_activationcode);  | 
        ||
| 111 | } | 
        ||
| 112 | |||
| 113 | |||
| 114 | static void CenterWindow (HWND hWnd)  | 
        ||
| 115 | { | 
        ||
| 116 |    // this function centers the specified window on screen. | 
        ||
| 117 | |||
| 118 |    RECT rRect; | 
        ||
| 119 | int width;  | 
        ||
| 120 | int height;  | 
        ||
| 121 | int x;  | 
        ||
| 122 | int y;  | 
        ||
| 123 | |||
| 124 |    // get the current rectangle of the current window | 
        ||
| 125 | GetWindowRect (hWnd, &rRect);  | 
        ||
| 126 | width = rRect.right - rRect.left;  | 
        ||
| 127 | height = rRect.bottom - rRect.top;  | 
        ||
| 128 | |||
| 129 |    // draw window in the center of the screen | 
        ||
| 130 | x = GetSystemMetrics (SM_CXSCREEN) / 2 - width / 2;  | 
        ||
| 131 | y = GetSystemMetrics (SM_CYSCREEN) / 2 - height / 2;  | 
        ||
| 132 | |||
| 133 |    // now ask to change the position of the window | 
        ||
| 134 | SetWindowPos (hWnd, NULL, x, y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);  | 
        ||
| 135 | |||
| 136 | return; // finished  | 
        ||
| 137 | } |