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

📄 interrupthookgui.cpp

📁 HOOK所有IDT表项,在GUI中记录IDT回调函数调用次数,并且查看中断信息
💻 CPP
字号:
/*
InterruptHook
Copyright (C) 2003  Alexander M.

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*/

#include "stdafx.h"
#include "InterruptHookGUI.h"
#include "registry.h"
#include "driver.h"

/* Compiler problem? */
// #include "..\interrupthook\iocontrol.h"
#define	IOCTL_HOOK_INT			0xC07FE003
#define IOCTL_UNHOOK_INT		0xC07FE007
#define	IOCTL_HOOK_ALL_INT		0xC07FE00B
#define IOCTL_DUMP_IDT			0xC07FE00C
#define IOCTL_GET_INT_COUNTS	0xC07FE010
#define	IOCTL_GET_START_TIME	0xC07FE014

// Global Variables:
HINSTANCE	hInst;								// current instance
HWND		hList;
HANDLE		hDriver;

DWORD		iStartTime			= 0;
__int64		FirstCounts[256]	= { 0 };
__int64		Counts[256]			= { 0 };

UINT		iSelectedIRQ		= 0;

int CALLBACK DlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
void OnDetails( HWND hDlg );
void ShowDeviceList( HWND hList, list< PDEVICE > &DeviceList );
void ShowDeviceDetails( HWND hDlg, HWND hList, list< PDEVICE > &DeviceList );

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
	INITCOMMONCONTROLSEX	icc = { sizeof(INITCOMMONCONTROLSEX), ICC_LISTVIEW_CLASSES };

	/* >= NT 4.0 */
	if( GetVersion() >= 0x80000000 )
	{
		MessageBox( NULL, "Windows NT 4.0 or higher is required to use this software!", "Wrong Windows version", MB_ICONERROR );
		return 0;
	}

	if( MessageBox( NULL, "USE THIS SOFTWARE ON YOUR OWN RISK!!!\nREAD CODEPROJECT ARTICLE FOR DETAILS!!!\nDO YOU AGREE WITH THIS?", "WARNING", MB_ICONWARNING | MB_YESNO | MB_DEFBUTTON2 | MB_SYSTEMMODAL ) == IDNO )
		return 0;

	InstallDriver();
	StartDriver();

	hInst = hInstance;
	InitCommonControlsEx( &icc );
	DialogBoxParam( hInstance, MAKEINTRESOURCE( IDD_MAIN ), NULL, DlgProc, WM_INITDIALOG );

	UninstallDriver();
	return 0;
}

int CALLBACK DlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
	DWORD		dwOut;
	LVCOLUMN	lvC;
	LVITEM		lvI;
	DWORD		i;
	char		szBuffer[64];
	__int64		iTemp;
	DWORD		dwTick;
	double		dFreq;
	static UINT	iTimes = 0;
	HMENU		hMenu, hSubMenu;
	UINT		iItem;

	switch( uMsg )
	{
		case WM_INITDIALOG:
			/* Open driver */
			hDriver = CreateFile( 
				"\\\\.\\InterruptHook", 
				GENERIC_READ | GENERIC_WRITE, 
				0, 
				NULL, 
				OPEN_EXISTING, 
				FILE_ATTRIBUTE_NORMAL, 
				NULL );

			if( hDriver == INVALID_HANDLE_VALUE )
			{
				MessageBox( hDlg, "Could not open the filter driver!", "Error", MB_ICONERROR );
				EndDialog( hDlg, 0 );
				return 0;
			}

			DeviceIoControl( 
				hDriver, 
				IOCTL_HOOK_ALL_INT, 
				NULL, 
				NULL, 
				NULL, 
				NULL, 
				&dwOut, 
				NULL );
			
			/* setup list view ctrl */
			hList = GetDlgItem( hDlg, IDC_INTERRUPTLIST );

			ListView_SetExtendedListViewStyle( hList, LVS_EX_FULLROWSELECT );

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

			lvC.cx			= 80;
			lvC.pszText		= "#";
			lvC.fmt			= LVCFMT_RIGHT;
			ListView_InsertColumn( hList, 1, &lvC );

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

			lvC.cx			= 190;
			lvC.pszText		= "Usage";
			lvC.fmt			= LVCFMT_LEFT;
			ListView_InsertColumn( hList, 3, &lvC );

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

			for( i = 0; i < 256; i++ )
			{
				lvI.iItem = i;
			
				sprintf( szBuffer, "0x%.2X", i );
				ListView_InsertItem( hList, &lvI );

				ListView_SetItemText( hList, i, 1, "0" );
				ListView_SetItemText( hList, i, 2, "<n/a>" );
			}

			ListView_SetItemText( hList, 0, 3, "Divide Error(Fault)" );
			ListView_SetItemText( hList, 1, 3, "Debug(Fault/Trap)" );
			ListView_SetItemText( hList, 2, 3, "Unused(Interrupt)" );
			ListView_SetItemText( hList, 3, 3, "Breakpoint(Trap)" );
			ListView_SetItemText( hList, 4, 3, "Overflow(Trap)" );
			ListView_SetItemText( hList, 5, 3, "BOUND Range Exceeded(Fault)" );
			ListView_SetItemText( hList, 6, 3, "Invalid Opcode(Fault)" );
			ListView_SetItemText( hList, 7, 3, "No Coprocessor Available(Fault)" );
			ListView_SetItemText( hList, 8, 3, "Double Fault(Abort)" );
			ListView_SetItemText( hList, 9, 3, "Coprocessor Segment Overrun(Fault)" );
			ListView_SetItemText( hList, 10, 3, "Invalid TSS(Fault)" );
			ListView_SetItemText( hList, 11, 3, "Segment Not Present(Fault)" );
			ListView_SetItemText( hList, 12, 3, "Stack-Segment Fault(Fault)" );
			ListView_SetItemText( hList, 13, 3, "General Protection(Fault)" );
			ListView_SetItemText( hList, 14, 3, "Page Fault(Fault)" );
			ListView_SetItemText( hList, 15, 3, "(Intel Reserved)" );
			ListView_SetItemText( hList, 16, 3, "Floating-Point Exception(Fault)" );
			ListView_SetItemText( hList, 17, 3, "Alignment Check(Fault)" );
			ListView_SetItemText( hList, 18, 3, "Machine Check(Abort)" );
			ListView_SetItemText( hList, 19, 3, "Streaming SIMD Extensions(Fault)" );
			ListView_SetItemText( hList, 0x2B, 3, "Win32 Subsystem" );
			ListView_SetItemText( hList, 0x2D, 3, "Debug Output" );
			ListView_SetItemText( hList, 0x2E, 3, "Windows NT Native API" );
			ListView_SetItemText( hList, 0x30, 3, "IRQ0" );
			ListView_SetItemText( hList, 0x31, 3, "IRQ1" );
			ListView_SetItemText( hList, 0x32, 3, "IRQ2" );
			ListView_SetItemText( hList, 0x33, 3, "IRQ3" );
			ListView_SetItemText( hList, 0x34, 3, "IRQ4" );
			ListView_SetItemText( hList, 0x35, 3, "IRQ5" );
			ListView_SetItemText( hList, 0x36, 3, "IRQ6" );
			ListView_SetItemText( hList, 0x37, 3, "IRQ7" );
			ListView_SetItemText( hList, 0x38, 3, "IRQ8" );
			ListView_SetItemText( hList, 0x39, 3, "IRQ9" );
			ListView_SetItemText( hList, 0x3A, 3, "IRQ10" );
			ListView_SetItemText( hList, 0x3B, 3, "IRQ11" );
			ListView_SetItemText( hList, 0x3C, 3, "IRQ12" );
			ListView_SetItemText( hList, 0x3D, 3, "IRQ13" );
			ListView_SetItemText( hList, 0x3E, 3, "IRQ14" );
			ListView_SetItemText( hList, 0x3F, 3, "IRQ15" );

			/* Get starting values */
			DeviceIoControl( 
				hDriver, 
				IOCTL_GET_INT_COUNTS, 
				NULL, 
				NULL, 
				&FirstCounts, 
				sizeof(FirstCounts), 
				&dwOut, 
				NULL );

			iStartTime = GetTickCount();

			/* Timer */
			SetTimer( hDlg, ID_REFRESHTIMER, 50, NULL );
			break;

		case WM_COMMAND:
			switch( LOWORD( wParam ) )
			{
				case IDC_EXIT:
					PostMessage( hDlg, WM_CLOSE, NULL, NULL );
					break;

				case IDC_ABOUT:
					MessageBox( hDlg, "InterruptHook by Alexander M.\nServerAlex@web.de", "About", MB_ICONINFORMATION );
					break;

				case IDM_DETAILS:
					OnDetails( hDlg );
					break;

				default:
					break;
			}
			break;

		case WM_CONTEXTMENU:
			if( wParam == (WPARAM)hList && 
				( iItem = ListView_GetSelectionMark( hList ) ) != -1 )
			{
				hMenu = LoadMenu( hInst, MAKEINTRESOURCE( IDM_CONTEXTMENU ) );
				hSubMenu = GetSubMenu( hMenu, 0 );
				
				if( iItem < 0x30 || iItem > 0x3F )
					EnableMenuItem( hSubMenu, IDM_DETAILS, MF_BYCOMMAND | MF_GRAYED );
				else
					EnableMenuItem( hSubMenu, IDM_DETAILS, MF_BYCOMMAND | MF_ENABLED );
				
				TrackPopupMenu( 
					hSubMenu, 
					TPM_LEFTALIGN | TPM_LEFTBUTTON, 
					LOWORD( lParam ), 
					HIWORD( lParam ), 
					NULL, 
					hDlg, 
					NULL );
				DestroyMenu( hMenu );
			}
			break;

		case WM_TIMER:
			DeviceIoControl( 
				hDriver, 
				IOCTL_GET_INT_COUNTS, 
				NULL, 
				NULL, 
				&Counts, 
				sizeof(Counts), 
				&dwOut, 
				NULL );

			dwTick = GetTickCount();
			dwTick -= iStartTime;
			dwTick /= 1000;

			for( i = 0; i < 256; i++ )
			{
				sprintf( szBuffer, "%i", Counts[i] );
				ListView_SetItemText( hList, i, 1, szBuffer );

				iTemp = Counts[i] - FirstCounts[i];

				if( iTemp > 0 && iTimes == 10 )
				{
					dFreq = (double)dwTick / (double)iTemp;
					dFreq = 1.0f / dFreq;

					sprintf( szBuffer, "%.2fx", dFreq );
					ListView_SetItemText( hList, i, 2, szBuffer );
				}
			}

			if( iTimes == 10 )
				iTimes = 0;
				
			iTimes++;
			break;

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

	return 0;
}

int CALLBACK IrqDetailsDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
	char					szTopic[128];
	static list< PDEVICE >	DeviceList;

	switch( uMsg )
	{
		case WM_INITDIALOG:
			sprintf( szTopic, "Details on IRQ%i", iSelectedIRQ );
			SetWindowText( hDlg, szTopic );

			QueryDeviceListForIrq( iSelectedIRQ, DeviceList );
			ShowDeviceList( GetDlgItem( hDlg, IDC_DEVICE ), DeviceList );
			ShowDeviceDetails( hDlg, GetDlgItem( hDlg, IDC_DEVICE ), DeviceList );
			break;

		case WM_COMMAND:
			switch( LOWORD( wParam ) )
			{
				case IDC_DEVICE:
					if( HIWORD( wParam ) == CBN_SELCHANGE )
						ShowDeviceDetails( hDlg, GetDlgItem( hDlg, IDC_DEVICE ), DeviceList );
					break;

				default:
					if( wParam == IDCANCEL || wParam == IDOK )
						PostMessage( hDlg, WM_CLOSE, 0, 0 );

					break;
			}
			break;

		case WM_CLOSE:
			CleanupDeviceList( DeviceList );
			EndDialog( hDlg, 0 );
			break;

		default:
			break;
	}

	return 0;
}

void ShowDeviceList( HWND hList, list< PDEVICE > &DeviceList )
{
	list< PDEVICE >::iterator it;
	PDEVICE pDev;
	UINT	i = 0;

	SendMessage( hList, CB_RESETCONTENT, 0, 0 );
		
	for( it = DeviceList.begin(); it != DeviceList.end(); it++ )
	{
		pDev = *it;
		SendMessage( hList, CB_ADDSTRING, 0, (LPARAM)pDev->pszDesc );
		i++;
	}

	if( !i )
		SendMessage( hList, CB_ADDSTRING, 0, (LPARAM)"No Devices Available" );

	SendMessage( hList, CB_SETCURSEL, 0, 0 );
}

void ShowDeviceDetails( HWND hDlg, HWND hList, list< PDEVICE > &DeviceList )
{
	list< PDEVICE >::iterator it;
	list< PMEMORY >::iterator itmem;
	list< PPORT >::iterator itport;
	list< UINT >::iterator itirq;
	PDEVICE				pDev;
	PMEMORY				pMem;
	PPORT				pPort;
	UINT				e = 0, i;
	HWND				hMem, hIo, hIrq;
	char				szBuffer[32];
	char				szDesc[128];

	i = (UINT)SendMessage( hList, CB_GETCURSEL, 0, 0 );
	SendMessage( hList, CB_GETLBTEXT, i, (LPARAM)szDesc );
	hMem = GetDlgItem( hDlg, IDC_MEMLIST );
	hIo = GetDlgItem( hDlg, IDC_IOLIST );
	hIrq = GetDlgItem( hDlg, IDC_IRQLIST );

	SendMessage( hMem, LB_RESETCONTENT, 0, 0 );
	SendMessage( hIo, LB_RESETCONTENT, 0, 0 );
	SendMessage( hIrq, LB_RESETCONTENT, 0, 0 );

	for( it = DeviceList.begin(); it != DeviceList.end(); it++ )
	{
		pDev = *it;
		
		if( !strcmp( pDev->pszDesc, szDesc ) )
		{
			for( itmem = pDev->MemoryList.begin(); itmem != pDev->MemoryList.end(); itmem++ )
			{
				pMem = *itmem;

				sprintf( szBuffer, "0x%.8X - 0x%.8X", pMem->iAddr.LowPart, pMem->iAddr.LowPart + pMem->iLen - 1 );
				SendMessage( hMem, LB_ADDSTRING, 0, (LPARAM)szBuffer );
			}

			for( itport = pDev->IoList.begin(); itport != pDev->IoList.end(); itport++ )
			{
				pPort = *itport;

				sprintf( szBuffer, "0x%.4X - 0x%.4X", pPort->iPort.LowPart, pPort->iPort.LowPart + pPort->iLen - 1 );
				SendMessage( hIo, LB_ADDSTRING, 0, (LPARAM)szBuffer );
			}

			for( itirq = pDev->IrqList.begin(); itirq != pDev->IrqList.end(); itirq++ )
			{
				sprintf( szBuffer, "%i", *itirq );
				SendMessage( hIrq, LB_ADDSTRING, 0, (LPARAM)szBuffer );
			}
			break;
		}
	}
}

void OnDetails( HWND hDlg )
{
	UINT iCount, iItem;

	iItem = ListView_GetSelectionMark( hList );
	iCount = ListView_GetSelectedCount( hList );

	if( iCount > 1 )
	{
		MessageBox( hDlg, "Only one selection possible!", "Error", MB_ICONERROR );
		return;
	}

	iSelectedIRQ = iItem - 0x30;
	DialogBoxParam( hInst, MAKEINTRESOURCE( IDD_IRQDETAILS ), hDlg, IrqDetailsDlgProc, WM_INITDIALOG );
}

⌨️ 快捷键说明

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