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 | } |