#include <stdio.h>
#include <stdarg.h>
#include <windows.h>
//if you still need to use the original function this has to be done
//before including the header where print is redefined..
typedef int (*realprintf)(const char*, ...);
realprintf real_printf = printf;
//this define must be in a global header file
#define printf my_printf
int my_printf(char* format, ...){
char *ret = 0;
char buf[1024]; //avoid malloc/free for short strings if we can
bool alloced = false;
if(!format) return 0;
va_list args;
va_start(args,format);
int size = _vscprintf(format, args);
if(size==0){va_end(args); return 0;}
if(size < 1020){
ret = &buf[0];
}else{
alloced = true;
size++; //for null
ret = (char*)malloc(size+2);
if(ret==0){va_end(args); return 0;}
}
_vsnprintf(ret, size, format, args);
ret[size]=0; //explicitly null terminate
va_end(args);
//here is where you could forward the char* to a UI handler..
MessageBoxA(0,ret,"Hooked printf!",0);
if(alloced) free(ret);
return 0;
}
void main(void){
printf("this is my test!");
real_printf("this works as normal")
}