Я пишу простой кейлоггер / mouselogger на C / C ++ для Windows.Для этого я использую функции Win32 LowLevelMouseProc
и LowLevelKeyboardProc
.
Если уместно, вот мой GitHub gist с моим кодом, который является ультраэлементарным: определить событиеобратный вызов и зарегистрируйте его вместе с обратным вызовом для SIGINT.Я добавлю обобщенную версию в конце вопроса.
Мой вопрос следующий : чтобы минимизировать накладные расходы, как мне сохранить эти события на диск?
Приветствуются ответы как на C, так и на C ++.
Полезно ли просто записывать в буферизованный файл каждый раз, когда я получаю новое событие, и позволить файлу обрабатывать сброс при заполнении буфера?Я слышал о неблокирующем вводе / выводе, но в документе Microsoft говорится, что есть дополнительные издержки.И, наконец, я не уверен, стоит ли мне создавать для этого второй поток.
Я бы хотел использовать некоторую буферизацию, чтобы избежать большого количества дисковых операций ввода-вывода.В идеале я хотел бы записать на диск один раз, прежде чем мой процесс будет убит.Но я понятия не имею, как этого добиться.
КОД:
#include "pch.h"
#include <stdio.h>
#include <Windows.h>
HHOOK handle;
LRESULT CALLBACK lowLevelMouseProc(
_In_ int nCode,
_In_ WPARAM wParam,
_In_ LPARAM lParam
)
{
MSLLHOOKSTRUCT* lp = (MSLLHOOKSTRUCT*)lParam;
if (wParam == WM_MOUSEMOVE) {
// Best way to save pt.x and pt.y to disk?
printf("%d %d \n", lp->pt.x, lp->pt.y);
}
return CallNextHookEx(0, nCode, wParam, lParam);
}
int main()
{
handle = SetWindowsHookExA(WH_MOUSE_LL, &lowLevelMouseProc, NULL, 0);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0));
UnhookWindowsHookEx(handle)
return 0;
}