📄 filemon.c
字号:
if( RecentHiFilters[i][0] ) {
SendMessage( hHiFilter, CB_ADDSTRING, 0,
(LPARAM ) (strcmp( RecentHiFilters[i], " ") ?
RecentHiFilters[i] : ""));
}
}
SendMessage( hInFilter, CB_SETCURSEL, 0, 0);
SendMessage( hExFilter, CB_SETCURSEL, 0, 0);
SendMessage( hHiFilter, CB_SETCURSEL, 0, 0);
// Set the check box stats
CheckDlgButton( hDlg, IDC_READ,
FilterDefinition.logreads ? BST_CHECKED : BST_UNCHECKED );
CheckDlgButton( hDlg, IDC_WRITE,
FilterDefinition.logwrites ? BST_CHECKED : BST_UNCHECKED );
return TRUE;
case WM_COMMAND:
strcpy( oldHighlight, HighlightString );
if ( LOWORD( wParam ) == IDOK ) {
// make sure that max lines is legal
GetDlgItemTextA( hDlg, IDC_FILTERSTRING, newFilter, MAXFILTERLEN );
GetDlgItemTextA( hDlg, IDC_EXFILTERSTRING, newExFilter, MAXFILTERLEN );
GetDlgItemTextA( hDlg, IDC_HIFILTERSTRING, newHiFilter, MAXFILTERLEN );
if( !newFilter[0] ) strcpy( newFilter, " " );
if( !newExFilter[0] ) strcpy( newExFilter, " " );
if( !newHiFilter[0] ) strcpy( newHiFilter, " " );
strcpy( FilterString, newFilter );
strupr( FilterString );
for( i = 0; i < NUMRECENTFILTERS; i++ ) {
if( !stricmp( RecentInFilters[i], newFilter )) {
i++;
break;
}
}
for( j = i-2; j != (DWORD) -1; j-- ) {
strcpy( RecentInFilters[j+1], RecentInFilters[j] );
}
strcpy( RecentInFilters[0], newFilter );
strcpy( ExcludeString, newExFilter );
strupr( ExcludeString );
for( i = 0; i < NUMRECENTFILTERS; i++ ) {
if( !stricmp( RecentExFilters[i], newExFilter )) {
i++;
break;
}
}
for( j = i-2; j != (DWORD) -1; j-- ) {
strcpy( RecentExFilters[j+1], RecentExFilters[j] );
}
strcpy( RecentExFilters[0], newExFilter );
strcpy( HighlightString, newHiFilter );
strupr( HighlightString );
for( i = 0; i < NUMRECENTFILTERS; i++ ) {
if( !stricmp( RecentHiFilters[i], newHiFilter )) {
i++;
break;
}
}
for( j = i-2; j != (DWORD) -1; j-- ) {
strcpy( RecentHiFilters[j+1], RecentHiFilters[j] );
}
strcpy( RecentHiFilters[0], newHiFilter );
if( stricmp( oldHighlight, HighlightString )) {
InvalidateRgn( hWndList, NULL, TRUE );
}
// Get the button states
FilterDefinition.logreads =
(IsDlgButtonChecked( hDlg, IDC_READ ) == BST_CHECKED);
FilterDefinition.logwrites =
(IsDlgButtonChecked( hDlg, IDC_WRITE ) == BST_CHECKED);
EndDialog( hDlg, TRUE );
// Apply the new filter
FilterDefinition.excludefilter[0] = 0;
FilterDefinition.includefilter[0] = 0;
if( strcmp( ExcludeString, " " ) )
strcpy( FilterDefinition.excludefilter, ExcludeString );
if( strcmp( FilterString, " " ) )
strcpy( FilterDefinition.includefilter, FilterString );
if ( ! DeviceIoControl( SysHandle, IOCTL_FILEMON_SETFILTER,
(PVOID) &FilterDefinition, sizeof(FilterDefinition),
NULL, 0, &nb, NULL ) ) {
MessageBox( hDlg, TEXT("Couldn't access device driver"), APPNAME, MB_ICONERROR );
return FALSE;
}
return TRUE;
} else if( LOWORD( wParam ) == IDCANCEL ) {
EndDialog( hDlg, TRUE );
} else if( LOWORD( wParam ) == IDRESET ) {
// initialize the controls to reflect the current filter
SetDlgItemText( hDlg, IDC_FILTERSTRING, "*" );
SetDlgItemText( hDlg, IDC_EXFILTERSTRING, "" );
SetDlgItemText( hDlg, IDC_HIFILTERSTRING, "" );
CheckDlgButton( hDlg, IDC_READ, BST_CHECKED );
CheckDlgButton( hDlg, IDC_WRITE, BST_CHECKED );
if( stricmp( oldHighlight, HighlightString )) {
InvalidateRgn( hWndList, NULL, TRUE );
}
}
break;
case WM_CLOSE:
EndDialog( hDlg, TRUE );
return TRUE;
}
return FALSE;
}
/******************************************************************************
*
* FUNCTION: GetPositionSettings
*
* PURPOSE: Reads the Registry to get the last-set window position.
*
******************************************************************************/
VOID GetPositionSettings()
{
HKEY hKey;
DWORD ParamSize, newPosSize, i;
POSITION_SETTINGS newPositionInfo;
LOGFONT lf;
char *nextString;
char recentExList[(MAXFILTERLEN+1) * NUMRECENTFILTERS + 1];
char recentInList[(MAXFILTERLEN+1) * NUMRECENTFILTERS + 1];
char recentHiList[(MAXFILTERLEN+1) * NUMRECENTFILTERS + 1];
// Delete old settings
RegDeleteKey( HKEY_CURRENT_USER, "Software\\Systems Internals\\Filemon" );
// Default font
GetObject( GetStockObject(SYSTEM_FONT), sizeof lf, &lf );
lf.lfWeight = FW_NORMAL;
lf.lfHeight = 8;
lf.lfWidth = 0;
strcpy( lf.lfFaceName, TEXT("MS Sans Serif") );
PositionInfo.font = lf;
// Fist, set the default settings
PositionInfo.top = CW_USEDEFAULT;
PositionInfo.left = CW_USEDEFAULT;
PositionInfo.width = CW_USEDEFAULT;
PositionInfo.height = CW_USEDEFAULT;
PositionInfo.maximized = FALSE;
PositionInfo.ontop = FALSE;
PositionInfo.hookpipes = FALSE;
PositionInfo.hookslots = FALSE;
PositionInfo.highlightfg = 0x00FFFFFF;
PositionInfo.highlightbg = 0x000000FF;
// set the default listview widths
PositionInfo.column[0] = 35; // seq
PositionInfo.column[1] = 90; // time
PositionInfo.column[2] = 90; // process
PositionInfo.column[3] = 130; // irp
PositionInfo.column[4] = 200; // path
PositionInfo.column[5] = 70; // result
PositionInfo.column[6] = 150; // other
// intialize the hooked drives
PositionInfo.curdriveset = (DWORD) -1;
// duration is default
PositionInfo.timeduration = FALSE;
// initialize history depth
PositionInfo.historydepth = 0;
// initialize filter
recentInList[0] = '*';
recentInList[1] = 0;
recentInList[2] = 0;
recentExList[0] = 0;
recentHiList[0] = 0;
memset( RecentExFilters, 0, sizeof( RecentExFilters ));
memset( RecentInFilters, 0, sizeof( RecentInFilters ));
memset( RecentHiFilters, 0, sizeof( RecentHiFilters ));
PositionInfo.logreads = TRUE;
PositionInfo.logwrites = TRUE;
// first, get the last-entered params from the registry
RegCreateKey(HKEY_CURRENT_USER, FILEMON_SETTINGS_KEY, &hKey );
// get the params and ignore errors
newPosSize = sizeof( PositionInfo );
newPositionInfo.posversion = 0;
RegQueryValueEx( hKey,FILEMON_SETTINGS_VALUE, NULL, NULL, (LPBYTE) &newPositionInfo,
&newPosSize );
ParamSize = sizeof( recentInList );
RegQueryValueEx( hKey,FILEMON_RECENT_INFILTER_VALUE, NULL, NULL, (LPBYTE) &recentInList,
&ParamSize );
ParamSize = sizeof( recentExList );
RegQueryValueEx( hKey,FILEMON_RECENT_EXFILTER_VALUE, NULL, NULL, (LPBYTE) &recentExList,
&ParamSize );
ParamSize = sizeof( recentHiList );
RegQueryValueEx( hKey,FILEMON_RECENT_HIFILTER_VALUE, NULL, NULL, (LPBYTE) &recentHiList,
&ParamSize );
RegCloseKey( hKey );
// only use the registry settings if the version matches
if( newPositionInfo.posversion == POSITION_VERSION ) PositionInfo = newPositionInfo;
// extract global settings from the value returned from the Registry (or the default)
CurDriveSet = PositionInfo.curdriveset;
MaxLines = PositionInfo.historydepth;
TimeIsDuration = PositionInfo.timeduration;
OnTop = PositionInfo.ontop;
HookPipes = PositionInfo.hookpipes;
HookSlots = PositionInfo.hookslots;
ShowMs = PositionInfo.showms;
// get misc device filter
FilterDefinition.logreads = PositionInfo.logreads;
FilterDefinition.logwrites = PositionInfo.logwrites;
// Set up the recent filter arrays
nextString = recentInList;
i = 0;
while( *nextString ) {
strcpy( RecentInFilters[i++], nextString );
nextString = &nextString[strlen(nextString)+1];
}
nextString = recentExList;
i = 0;
while( *nextString ) {
strcpy( RecentExFilters[i++], nextString );
nextString = &nextString[strlen(nextString)+1];
}
nextString = recentHiList;
i = 0;
while( *nextString ) {
strcpy( RecentHiFilters[i++], nextString );
nextString = &nextString[strlen(nextString)+1];
}
strcpy( FilterString, RecentInFilters[0] );
strupr( FilterString );
strcpy( ExcludeString, RecentExFilters[0] );
strupr( ExcludeString );
strcpy( HighlightString, RecentHiFilters[0] );
strupr( HighlightString );
// Get font
LogFont = PositionInfo.font;
hFont = CreateFontIndirect( &LogFont );
// set highlight colors
HighlightFg = PositionInfo.highlightfg;
HighlightBg = PositionInfo.highlightbg;
}
/******************************************************************************
*
* FUNCTION: SavePositionSettings
*
* PURPOSE: Saves the current window settings to the Registry.
*
******************************************************************************/
VOID SavePositionSettings( HWND hWnd )
{
RECT rc;
int i;
char *nextInString, *nextExString, *nextHiString;
char recentExList[(MAXFILTERLEN+1) * NUMRECENTFILTERS + 1];
char recentInList[(MAXFILTERLEN+1) * NUMRECENTFILTERS + 1];
char recentHiList[(MAXFILTERLEN+1) * NUMRECENTFILTERS + 1];
HKEY hKey;
// set version #
PositionInfo.posversion = POSITION_VERSION;
// get the position of the main window
GetWindowRect( hWnd, &rc );
if( !IsIconic( hWnd ) && !IsZoomed( hWnd )) {
PositionInfo.left = rc.left;
PositionInfo.top = rc.top;
PositionInfo.width = rc.right - rc.left;
PositionInfo.height = rc.bottom - rc.top;
}
PositionInfo.showtoolbar = ShowToolbar;
PositionInfo.maximized = IsZoomed( hWnd );
PositionInfo.ontop = OnTop;
PositionInfo.hookpipes = HookPipes;
PositionInfo.hookslots = HookSlots;
// get the history depth
PositionInfo.historydepth = MaxLines;
// get time format
PositionInfo.timeduration = TimeIsDuration;
PositionInfo.showms = ShowMs;
// get the widths of the listview columns
for( i = 0; i < NUMCOLUMNS; i++ ) {
PositionInfo.column[i] = ListView_GetColumnWidth( hWndList, i );
}
// save font
PositionInfo.font = LogFont;
// get misc device filters
PositionInfo.logreads = FilterDefinition.logreads;
PositionInfo.logwrites = FilterDefinition.logwrites;
// save highlight colors
PositionInfo.highlightfg = HighlightFg;
PositionInfo.highlightbg = HighlightBg;
// get the current drive set
PositionInfo.curdriveset = CurDriveSet;
// Save recent filters
recentInList[0] = 0;
nextInString = recentInList;
for( i = 0; i < NUMRECENTFILTERS; i++ ) {
if( !RecentInFilters[i][0] ) {
break;
}
strcpy( nextInString, RecentInFilters[i] );
nextInString = &nextInString[ strlen( nextInString ) + 1];
}
*nextInString = 0;
recentExList[0] = 0;
nextExString = recentExList;
for( i = 0; i < NUMRECENTFILTERS; i++ ) {
if( !RecentExFilters[i][0] ) {
break;
}
strcpy( nextExString, RecentExFilters[i] );
nextExString = &nextExString[ strlen( nextExString ) + 1];
}
*nextExString = 0;
recentHiList[0] = 0;
nextHiString = recentHiList;
for( i = 0; i < NUMRECENTFILTERS; i++ ) {
if( !RecentHiFilters[i][0] ) {
break;
}
strcpy( nextHiString, RecentHiFilters[i] );
nextHiString = &nextHiString[ strlen( nextHiString ) + 1];
}
*nextHiString = 0;
// save connection info to registry
RegOpenKey(HKEY_CURRENT_USER, FILEMON_SETTINGS_KEY, &hKey );
RegSetValueEx( hKey, FILEMON_SETTINGS_VALUE, 0, REG_BINARY, (LPBYTE) &PositionInfo,
sizeof( PositionInfo ) );
RegSetValueEx( hKey, FILEMON_RECENT_INFILTER_VALUE, 0, REG_BINARY, (LPBYTE) &recentInList,
(DWORD) (nextInString - recentInList) + 1 );
RegSetValueEx( hKey, FILEMON_RECENT_EXFILTER_VALUE, 0, REG_BINARY, (LPBYTE) &recentExList,
(DWORD) (nextExString - recentExList) + 1 );
RegSetValueEx( hKey, FILEMON_RECENT_HIFILTER_VALUE, 0, REG_BINARY, (LPBYTE) &recentHiList,
(DWORD) (nextHiString - recentHiList) + 1 );
CloseHandle( hKey );
}
/******************************************************************************
*
* FUNCTION: HookDrives
*
* PURPOSE: Hook the currently selected drives, updating menu checks
*
******************************************************************************/
DWORD HookDrives( HMENU DriveMenu, DWORD MaxDriveSet, DWORD CurDriveSet )
{
DWORD nb;
DWORD drive;
// Tell device driver which drives to monitor
if ( ! DeviceIoControl( SysHandle, IOCTL_FILEMON_SETDRIVES,
&CurDriveSet, sizeof CurDriveSet,
&CurDriveSet, sizeof CurDriveSet,
&nb, NULL ) )
return 0;
// Update menu items
for ( drive = 0; drive < 32; ++drive )
if ( MaxDriveSet & (1<<drive) ) {
if ( CurDriveSet & (1<<drive) )
CheckMenuItem( DriveMenu, IDC_DRIVE+drive, MF_BYCOMMAND|MF_CHECKED );
else
CheckMenuItem( DriveMenu, IDC_DRIVE+drive, MF_BYCOMMAND|MF_UNCHECKED );
}
return CurDriveSet;
}
/******************************************************************************
*
* FUNCTION: Split
*
* PURPOSE: Split a delimited line into components
*
******************************************************************************/
int Split( char * line, char delimiter, char * items[] )
{
int cnt = 0;
for (;;) {
// Add prefix to list of components
items[cnt++] = line;
// Check for more components
line = strchr( line, delimiter );
if ( line == NULL )
return cnt;
// Terminate previous component and move to next
*line++ = '\0';
}
}
/******************************************************************************
*
* FUNCTION: ListAppend
*
* PURPOSE: Add a new line to List window
*
******************************************************************************/
BOOL ListAppend( HWND hWndList, DWORD seq,
LONGLONG perfTime, LONGLONG dateTime,
char * line )
{
LV_ITEM lvI; // list view item structure
int row;
char *items[NUMCOLUMNS];
char timeBuf[64], timeSub[64];
float elapsed;
int itemcnt = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -