📄 tryreaddirectorychangeswview.cpp
字号:
}
else
{
if ( m_hVxD == INVALID_HANDLE_VALUE )
{
DWORD dwErrCode = ::GetLastError();
TCHAR tsErrMsg[256] = _T("Failed in loading \\\\.\\filevxd.vxd: ");
GetSystemErrorString(dwErrCode, tsErrMsg + 35, sizeof(tsErrMsg));
AfxMessageBox(tsErrMsg);
return -1;
}
}
}
#else
else
{
if ( m_hVxD == INVALID_HANDLE_VALUE )
{
DWORD dwReturnBytes = 0;
BOOLEAN fTimeIsDuration = FALSE;
m_hVxD = CreateFile(_T("\\\\.\\filevxd.vxd"), 0, 0, NULL, 0, FILE_FLAG_OVERLAPPED | FILE_FLAG_DELETE_ON_CLOSE, NULL);
if ( m_hVxD == INVALID_HANDLE_VALUE )
{
DWORD dwErrCode = GetLastError();
CString csErrMsg;
csErrMsg.Format(_T("Driver (\\\\.\\filevxd.vxd) is not loaded properly: 0x%08X"), dwErrCode);
MessageBox(csErrMsg);
return dwErrCode;
}
else if ( !DeviceIoControl(m_hVxD, FILEMON_zerostats, NULL, 0, NULL, 0, &dwReturnBytes, NULL) )
{
DWORD dwErrCode = GetLastError();
CString csErrMsg;
csErrMsg.Format(_T("Can't initialize device driver: 0x%08X"), dwErrCode);
MessageBox(csErrMsg);
return dwErrCode;
}
else if ( !DeviceIoControl(m_hVxD, FILEMON_timetype, &fTimeIsDuration, sizeof(BOOLEAN), NULL, 0, &dwReturnBytes, NULL) )
{
}
}
}
#endif
return 0;
}
void CTryReadDirectoryChangesWView::OnDestroy()
{
if ( m_fIsNT )
{
SetEvent(m_hEventArray[1]);
Sleep(0);
EnterCriticalSection(&m_objCriticalSection);
if ( m_hDir != INVALID_HANDLE_VALUE )
{
CancelIo(m_hDir);
CloseHandle(m_hDir);
m_hDir = INVALID_HANDLE_VALUE;
}
CloseHandle(m_hEventArray[1]);
CloseHandle(m_hEventArray[0]);
DeleteCriticalSection(&m_objCriticalSection);
}
#ifndef FORDEMO
else
{
SetEvent(m_hEventArray[1]);
Sleep(0);
EnterCriticalSection(&m_objCriticalSection);
if ( m_hVxD != INVALID_HANDLE_VALUE )
{
DeviceIoControl(m_hVxD, DIRMON_CancelReadChange, NULL, NULL, NULL, NULL, NULL, NULL);
CloseHandle(m_hVxD);
m_hVxD = INVALID_HANDLE_VALUE;
}
CloseHandle(m_hEventArray[1]);
CloseHandle(m_hEventArray[0]);
DeleteCriticalSection(&m_objCriticalSection);
}
#else
else
{
CloseHandle(m_hVxD);
m_hVxD = INVALID_HANDLE_VALUE;
}
#endif
CEditView::OnDestroy();
}
UINT CTryReadDirectoryChangesWView::ReadDirectoryChangesWCompletionRoutine(CTryReadDirectoryChangesWView *pView)
{
if ( pView->m_fIsNT )
{
DWORD dwWait;
BOOL fGotResult;
while ( 1 )
{
dwWait = WaitForMultipleObjects(2, pView->m_hEventArray, FALSE, INFINITE);
// if ( dwWait == WAIT_ABANDONED_0 || dwWait == WAIT_ABANDONED_0 + 1 || dwWait == WAIT_OBJECT_0 + 1 )
if ( dwWait != WAIT_OBJECT_0 )
return 0;
EnterCriticalSection(&pView->m_objCriticalSection);
fGotResult = GetOverlappedResult(pView->m_hDir, &pView->m_objOverlapped, &pView->m_dwBytesReturned, TRUE);
ResetEvent(pView->m_hEventArray[0]);
if ( fGotResult )
{
CString _csEditText, csEditText, csTemp;
LPCTSTR psAction = NULL;
TCHAR tsFilename[MAX_PATH + 1];
PFILE_NOTIFY_INFORMATION p = (PFILE_NOTIFY_INFORMATION)pView->m_cBuf;
pView->GetWindowText(_csEditText);
csTemp.Format(_T("%d:\r\n"), ++pView->m_nReadTimes);
csEditText += csTemp;
while ( 1 )
{
#ifdef UNICODE
memcpy(tsFilename, p->FileName, p->FileNameLength);
tsFilename[p->FileNameLength >> 1] = NULL;
GetLongPathName(tsFilename, tsFilename, sizeof(tsFilename));
#else
WCHAR wsFilename[MAX_PATH * 4 + 1];
memcpy(wsFilename, p->FileName, p->FileNameLength);
wsFilename[p->FileNameLength >> 1] = NULL;
if ( WideCharToMultiByte(CP_THREAD_ACP, 0, wsFilename, (p->FileNameLength >> 1) + 1, tsFilename, sizeof(tsFilename), NULL, NULL) == 0 )
_tcscpy(tsFilename, _T("Error to convert the filename!"));
else
GetLongPathName(tsFilename, tsFilename, sizeof(tsFilename));
#endif
switch ( p->Action )
{
case FILE_ACTION_ADDED:
psAction = _T("File Added"); break;
case FILE_ACTION_REMOVED:
psAction = _T("File Removed"); break;
case FILE_ACTION_MODIFIED:
psAction = _T("File Modified"); break;
case FILE_ACTION_RENAMED_OLD_NAME:
psAction = _T("File Renamed, Old Name"); break;
case FILE_ACTION_RENAMED_NEW_NAME:
psAction = _T("File Renamed, New Name"); break;
default:
psAction = _T("Unknown Action");
}
csTemp.Format(_T("%d. %s: %s\r\n"), ++pView->m_nLineNo, psAction, tsFilename);
csEditText += _T(" ");
csEditText += csTemp;
if ( p->NextEntryOffset )
p = (PFILE_NOTIFY_INFORMATION)((char*)p + p->NextEntryOffset);
else
break;
}
if ( _csEditText.GetLength() + csEditText.GetLength() > 65536 )
_csEditText = csEditText;
else
_csEditText += csEditText;
pView->SetRedraw(FALSE);
pView->SetWindowText(_csEditText);
pView->GetEditCtrl().LineScroll(pView->GetEditCtrl().GetLineCount() - 1);
pView->SetRedraw();
Sleep(100);
ReadDirectoryChangesW(pView->m_hDir, pView->m_cBuf, 65536, TRUE, FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME | FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_SECURITY, NULL, &pView->m_objOverlapped, NULL);
}
LeaveCriticalSection(&pView->m_objCriticalSection);
}
}
#ifndef FORDEMO
else
{
DWORD dwWait;
BOOL fGotResult;
while ( 1 )
{
dwWait = WaitForMultipleObjects(2, pView->m_hEventArray, FALSE, INFINITE);
if ( dwWait != WAIT_OBJECT_0 )
return 0;
EnterCriticalSection(&pView->m_objCriticalSection);
fGotResult = GetOverlappedResult(pView->m_hVxD, &pView->m_objOverlapped, &pView->m_dwBytesReturned, TRUE);
ResetEvent(pView->m_hEventArray[0]);
if ( fGotResult )
{
CString _csEditText, csEditText, csTemp;
LPCTSTR psAction = NULL;
TCHAR tsFilename[MAX_PATH + 1];
PDIRCHANGEITEM p = (PDIRCHANGEITEM)pView->m_cBuf;
pView->GetWindowText(_csEditText);
csTemp.Format(_T("%d:\r\n"), ++pView->m_nReadTimes);
csEditText += csTemp;
while ( 1 )
{
#ifdef UNICODE
MultiByteToWideChar(CP_THREAD_ACP, 0, p->sRelativePathName, strlen(p->sRelativePathName) + 1, tsFilename, sizeof(tsFilename));
#else
_tcscpy(tsFilename, p->sRelativePathName);
#endif
if ( _tcschr(tsFilename, _T('*')) || _tcschr(tsFilename, _T('?')) )
{
PTCHAR ptsFilenameTemp = _tcsrchr(tsFilename, _T('\\'));
if ( ptsFilenameTemp && ptsFilenameTemp != tsFilename )
{
CString csDir = pView->m_csDir;
TCHAR tsFilenameTemp[MAX_PATH];
if ( csDir.GetAt(csDir.GetLength() - 1) != _T('\\') )
csDir += _T('\\');
_tcscpy(tsFilenameTemp, ptsFilenameTemp + 1);
// OutputDebugString(tsFilenameTemp);
*ptsFilenameTemp = 0;
// OutputDebugString((LPCTSTR)(csDir + tsFilename));
GetLongPathName((LPCTSTR)(csDir + tsFilename), tsFilename, sizeof(tsFilename));
// OutputDebugString(tsFilename);
ptsFilenameTemp = tsFilename + _tcslen(tsFilename);
if ( *(ptsFilenameTemp - 1) != _T('\\') )
*ptsFilenameTemp++ = _T('\\');
_tcscpy(ptsFilenameTemp, tsFilenameTemp);
// OutputDebugString(tsFilename);
ptsFilenameTemp = tsFilename + csDir.GetLength();
memmove(tsFilename, ptsFilenameTemp, (_tcslen(ptsFilenameTemp) + 1) * sizeof(TCHAR));
// OutputDebugString(tsFilename);
}
}
else
GetLongPathName(tsFilename, tsFilename, sizeof(tsFilename));
switch ( p->wAction )
{
case DIRMON_ACTION_ADDED: // 0x00000001
psAction = _T("File Added"); break;
case DIRMON_ACTION_REMOVED: // 0x00000002
psAction = _T("File Removed"); break;
case DIRMON_ACTION_MODIFIED: // 0x00000003
psAction = _T("File Modified"); break;
case DIRMON_ACTION_RENAMED_OLD_NAME: // 0x00000004
psAction = _T("File Renamed, Old Name"); break;
case DIRMON_ACTION_RENAMED_NEW_NAME:
psAction = _T("File Renamed, New Name"); break;
default:
psAction = _T("Unknown Action");
}
csTemp.Format(_T("%d. %s: %s\r\n"), ++pView->m_nLineNo, psAction, tsFilename);
csEditText += _T(" ");
csEditText += csTemp;
if ( p->wNextEntryOffset )
p = (PDIRCHANGEITEM)((char*)p + p->wNextEntryOffset);
else
break;
}
if ( _csEditText.GetLength() + csEditText.GetLength() >= 30000 )
_csEditText = csEditText;
else
_csEditText += csEditText;
pView->SetRedraw(FALSE);
pView->SetWindowText(_csEditText);
pView->GetEditCtrl().LineScroll(pView->GetEditCtrl().GetLineCount() - 1);
pView->SetRedraw();
// Sleep(30000);
Sleep(100);
DeviceIoControl(pView->m_hVxD, DIRMON_ReadChange, NULL, NULL, pView->m_cBuf, 65536, NULL, &pView->m_objOverlapped);
}
LeaveCriticalSection(&pView->m_objCriticalSection);
}
return 0;
}
#else
else
return 0;
#endif
}
#ifndef FORDEMO
#else
char g_cStats[MAX_STORE];
void CTryReadDirectoryChangesWView::OnTimer(UINT nIDEvent)
{
if ( m_fIsMonitoring )
{
DWORD startTime;
DWORD dwReturnBytes;
PENTRY ptr;
CString csText;
ULONG len;
CString csTemp;
char *pAction, *pPath, *pEnd;
startTime = GetTickCount();
while ( 1 )
{
if ( !DeviceIoControl(m_hVxD, FILEMON_getstats, NULL, 0, g_cStats, sizeof(g_cStats), &dwReturnBytes, NULL) || dwReturnBytes == 0 )
break;
else if ( dwReturnBytes >= sizeof(int) + 2 )
{
SetRedraw(FALSE);
GetWindowText(csText);
for ( ptr = (PENTRY)g_cStats; (char*)ptr < min(g_cStats + dwReturnBytes, g_cStats + sizeof(g_cStats)); )
{
len = strlen(ptr->text);
if ( ptr->seq > m_nSeqNo )
{
m_nSeqNo = ptr->seq;
for ( pAction = ptr->text; *pAction != '\t'; pAction++ );
for ( pPath = ++pAction; *pPath != '\t'; pPath++ );
*pPath++ = 0;
for ( pEnd = pPath; *pEnd != '\t'; pEnd++ );
*pEnd = 0;
if ( strnicmp(pPath, (LPCSTR)m_csDir, m_csDir.GetLength()) == 0 && strcmp(pAction, "Seek") != 0 && strcmp(pAction, "Lock") != 0 && strcmp(pAction, "Unlock") != 0 && strcmp(pAction, "FindOpen") != 0 && strcmp(pAction, "FindClose") != 0 && strcmp(pAction, "FindNext") != 0 && strcmp(pAction, "Read") != 0 && strcmp(pAction, "GetDiskInfo") != 0 )
{
csTemp.Format(_T("%d. %s: %s, %s\r\n"), ++m_nLineNo, pAction, pPath, (LPCSTR)m_csDir);
csText += csTemp;
}
}
ptr = (PENTRY)(ptr->text + len + 1);
}
SetWindowText(csText);
GetEditCtrl().LineScroll(m_nLineNo);
SetRedraw();
}
if ( GetTickCount() - startTime > 1000 )
break;
}
}
CEditView::OnTimer(nIDEvent);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -