📄 interrupthookgui.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 + -