El programa va a mostrar todas las cadenas que hay en un array de cadenas o matríz de caracteres, son 13 cadenas en total, pero originalmente lo usaba con 4.
La modificación que le hice fue la necesidad de crear un hilo aparte para mostrar las cadenas en scroll, y suspender el hilo principal.
El hilo principal nunca se resume y para salir del programa se sale con ExitProcess desde el hilo secundario.
El intervalo de tiempo entre las cadenas se hace con 'Sleep'.
Como ustedes ya saben, cuando se crea un hilo con CreateThread se le debe pasar un argumento que es la rutina con la cual empieza a ejecutarse el hilo. Esta rutina lleva un parámetro, que lo recibe al crearse el hilo porque dicho parámetro se pasa a CreateThread como argumento.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682453(v=vs.85).aspx
El tamaño del vector de cadenas se puede sacar con sizeof, pero en este caso se hace restando las direcciones de memoria del último elemento menos el primero.
Para iniciar el 'scrolling' se presiona 1, y para salir del programa se presiona 2.
Aclarado todo eso, muestro el código
Código
// // By 85 // Credits: LTFX // elhacker.net // etalking.com.ar // boyscout_arg@hotmail.com // 2013 // //////////////////////////////////////////////////////////////////////////////////////////////// #include<windows.h> #include<stdio.h> #include<stdlib.h> //////////////////////////////////////////////////////////////////////////////////////////////// #define MAX_MESSAGES 13 #define STRINGSIZE 0x40 #define INTERVAL 500 bool activar=false; char* resetMessage = "setinfo \"xxxxx\" \"\""; char* blankMessage = "setinfo \"xxxxx\" \"%s\""; //allow up to 13 messages char gHudMessage5[MAX_MESSAGES][256] = { "","","","","","","","","","","","","" }; // a "hack" way to scroll list without copying strings int indexRedirect[MAX_MESSAGES] = { 0,1,2,3,4,5,6,7,8,9,10,11,12 }; HANDLE hThread; //////////////////////////////////////////////////////////////////////////////////////////////// void gSetHudMessage5(const char* message) { int dest = indexRedirect[0]; indexRedirect[0] = indexRedirect[1]; indexRedirect[1] = indexRedirect[2]; indexRedirect[2] = indexRedirect[3]; indexRedirect[3] = indexRedirect[4]; indexRedirect[4] = indexRedirect[5]; indexRedirect[5] = indexRedirect[6]; indexRedirect[6] = indexRedirect[7]; indexRedirect[7] = indexRedirect[8]; indexRedirect[8] = indexRedirect[9]; indexRedirect[9] = indexRedirect[10]; indexRedirect[10] = indexRedirect[11]; indexRedirect[11] = indexRedirect[12]; indexRedirect[12] = dest; strcpy(gHudMessage5[dest],message); } //////////////////////////////////////////////////////////////////////////////////////////////// void Thread(const char* value){ DWORD* ptrValue = (DWORD*)value; DWORD OFFS = 0x0;//0x00000000; DWORD BLOCK = ((ptrValue+(STRINGSIZE*(MAX_MESSAGES-1)))-ptrValue); //sizeof(messagelist); while(1){ system("cls"); SYSTEMTIME SysTime; GetLocalTime(&SysTime); char* formatstring = (SysTime.wMinute<10) ? "%d:0%d\n" : "%d:%d\n"; printf(formatstring, SysTime.wHour, SysTime.wMinute); printf("Presione 1 para activar/desactivar el scroll! (Salir=2)\n"); if(GetAsyncKeyState(0x31)>0) { activar=!activar; } if(activar) { char* val = (char*)(ptrValue+(OFFS/sizeof(DWORD))); if(val && val[0]!=0) { char message[STRINGSIZE]; message[0] = 0;// Antes de usar strcat! strcat( message , "Elhacker.net" ); strcat( message , ": " ); strcat( message , val ); strcat( message , "\n" ); gSetHudMessage5(message); printf("\nHooK MSN v 1.0\n"); for(int i=0; i<MAX_MESSAGES; i++){ printf(gHudMessage5[indexRedirect[i]]); } if(OFFS==BLOCK) { OFFS=0x0;//0x00000000; } else { OFFS+=STRINGSIZE;//0x00000040; } } } if(GetAsyncKeyState(0x32)>0){ ExitProcess(0); //ResumeThread(hThread);// Can't from this thread //break; } Sleep(INTERVAL); } } //////////////////////////////////////////////////////////////////////////////////////////////// int main(){ char messagelist[MAX_MESSAGES][STRINGSIZE]; strcpy(messagelist[0],"Hola"); strcpy(messagelist[1],"Mi"); strcpy(messagelist[2],"Nombre"); strcpy(messagelist[3],"Es"); strcpy(messagelist[4],"David"); strcpy(messagelist[5],"Y"); strcpy(messagelist[6],"Esto"); strcpy(messagelist[7],"Es"); strcpy(messagelist[8],"Un"); strcpy(messagelist[9],"Mensaje"); strcpy(messagelist[10],"Scroll"); strcpy(messagelist[11],"XD"); strcpy(messagelist[12],"XD"); char* value = (char*)&messagelist; // Determinar el tamaño del bloque restando final con inicio // DWORD add1 = (DWORD)&messagelist[0]; // DWORD add2 = (DWORD)&messagelist[12]; // DWORD diff = (DWORD)(add2-add1); // printf("%X\n",diff); // system("pause"); DWORD tID; //tID = GetCurrentThreadId(); CreateThread(0,1<<24,(unsigned long (__stdcall *)(void *))Thread,value,0,&tID); //printf("tID: %d\n",tID); //hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, GetCurrentThreadId()); //Returns a "pseudo handle" that can only be used from the calling thread. hThread = GetCurrentThread(); SuspendThread(hThread); //ResumeThread(hThread); system("pause"); return (0); }
Esta era su aplicación original
PROJECT:
http://www.mediafire.com/?q6dq36cdd9hxvxb