You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
218 lines
5.2 KiB
218 lines
5.2 KiB
// FileSpyDoc.cpp : implementation of the CFileSpyDoc class
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "FileSpyApp.h"
|
|
|
|
#include "global.h"
|
|
#include "FileSpyDoc.h"
|
|
#include "filespyview.h"
|
|
#include "fastioview.h"
|
|
#include "fsfilterview.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CFileSpyDoc
|
|
|
|
IMPLEMENT_DYNCREATE(CFileSpyDoc, CDocument)
|
|
|
|
BEGIN_MESSAGE_MAP(CFileSpyDoc, CDocument)
|
|
//{{AFX_MSG_MAP(CFileSpyDoc)
|
|
ON_COMMAND(ID_FILE_SAVE, OnFileSave)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CFileSpyDoc construction/destruction
|
|
|
|
CFileSpyDoc::CFileSpyDoc()
|
|
{
|
|
// TODO: add one-time construction code here
|
|
|
|
}
|
|
|
|
CFileSpyDoc::~CFileSpyDoc()
|
|
{
|
|
}
|
|
|
|
BOOL CFileSpyDoc::OnNewDocument()
|
|
{
|
|
if (!CDocument::OnNewDocument())
|
|
return FALSE;
|
|
|
|
// TODO: add reinitialization code here
|
|
// (SDI documents will reuse this document)
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CFileSpyDoc serialization
|
|
|
|
void CFileSpyDoc::Serialize(CArchive& ar)
|
|
{
|
|
if (ar.IsStoring())
|
|
{
|
|
// TODO: add storing code here
|
|
}
|
|
else
|
|
{
|
|
// TODO: add loading code here
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CFileSpyDoc diagnostics
|
|
|
|
#ifdef _DEBUG
|
|
void CFileSpyDoc::AssertValid() const
|
|
{
|
|
CDocument::AssertValid();
|
|
}
|
|
|
|
void CFileSpyDoc::Dump(CDumpContext& dc) const
|
|
{
|
|
CDocument::Dump(dc);
|
|
}
|
|
#endif //_DEBUG
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CFileSpyDoc commands
|
|
|
|
|
|
void CFileSpyDoc::OnFileSave()
|
|
{
|
|
// TODO: Add your command handler code here
|
|
OPENFILENAME OpenFileName;
|
|
WCHAR sFilePath[1024];
|
|
WCHAR sFileName[1024];
|
|
WCHAR sFileStr[2048];
|
|
WCHAR sStr[1024];
|
|
WCHAR CRLF[3];
|
|
WCHAR TAB[1];
|
|
HANDLE hFile;
|
|
long nSaved;
|
|
int nMBRet, ti, nCount, tj;
|
|
CFileSpyView *pIrp = (CFileSpyView *) pSpyView;
|
|
CFastIoView *pFast = (CFastIoView *) pFastIoView;
|
|
CFsFilterView *pFsFilter = (CFsFilterView *) pFsFilterView;
|
|
DWORD nBytesWritten;
|
|
|
|
|
|
if (pIrp->GetListCtrl().GetItemCount() == 0 && pFast->GetListCtrl().GetItemCount() == 0)
|
|
{
|
|
MessageBox(NULL, L"Nothing to save", L"FileSpy", MB_OK);
|
|
return;
|
|
}
|
|
|
|
wcscpy(sFilePath, L"FILESPY.LOG");
|
|
sFileName[0] = 0;
|
|
OpenFileName.lStructSize = sizeof(OpenFileName);
|
|
OpenFileName.hwndOwner = AfxGetMainWnd()->m_hWnd;
|
|
OpenFileName.hInstance = AfxGetInstanceHandle();
|
|
OpenFileName.Flags = OFN_HIDEREADONLY|OFN_NOREADONLYRETURN|OFN_PATHMUSTEXIST;
|
|
OpenFileName.lpstrFilter = NULL;
|
|
OpenFileName.lpstrCustomFilter = NULL;
|
|
OpenFileName.nFilterIndex = 0;
|
|
OpenFileName.lpstrFileTitle = sFileName;
|
|
OpenFileName.nMaxFileTitle = 512;
|
|
OpenFileName.lpstrInitialDir = NULL;
|
|
OpenFileName.lpstrTitle = NULL;
|
|
OpenFileName.lpstrDefExt = NULL;
|
|
OpenFileName.lpfnHook = NULL;
|
|
OpenFileName.lpstrFile = sFilePath;
|
|
OpenFileName.nMaxFile = 512;
|
|
|
|
if (!GetSaveFileName(&OpenFileName))
|
|
{
|
|
return;
|
|
}
|
|
hFile = CreateFile(sFilePath, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
if (hFile != INVALID_HANDLE_VALUE)
|
|
{
|
|
nMBRet = MessageBox(NULL, L"The selected file already exists. Do you want to append to it?", L"FileSpy", MB_YESNOCANCEL);
|
|
if (nMBRet == IDCANCEL)
|
|
{
|
|
return;
|
|
}
|
|
if (nMBRet == IDYES)
|
|
{
|
|
SetFilePointer(hFile, 0, NULL, FILE_END);
|
|
}
|
|
else
|
|
{
|
|
CloseHandle(hFile);
|
|
hFile = CreateFile(sFilePath, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hFile = CreateFile(sFilePath, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
}
|
|
if (hFile == INVALID_HANDLE_VALUE)
|
|
{
|
|
MessageBox(NULL, L"File creation error", L"FileSpy - Error", MB_OK);
|
|
return;
|
|
}
|
|
|
|
CRLF[0] = 0x0D;
|
|
CRLF[1] = 0x0A;
|
|
CRLF[2] = 0;
|
|
TAB[0] = 0x9;
|
|
TAB[1] = 0;
|
|
|
|
WriteFile(hFile, CRLF, 2, &nBytesWritten, NULL);
|
|
//
|
|
// Write IRP header string
|
|
//
|
|
|
|
|
|
//
|
|
// Start saving the traces now
|
|
// First save IRP traces and then FASTIO
|
|
//
|
|
nCount = pIrp->GetListCtrl().GetItemCount();
|
|
for (ti = 0; ti < nCount; ti++)
|
|
{
|
|
pIrp->GetListCtrl().GetItemText(ti, 0, sStr, 1024);
|
|
wcscpy(sFileStr, sStr);
|
|
for (tj = 1; tj < 10; tj++)
|
|
{
|
|
wcscat(sFileStr, TAB);
|
|
pIrp->GetListCtrl().GetItemText(ti, tj, sStr, 1024);
|
|
wcscat(sFileStr, sStr);
|
|
}
|
|
wcscat(sFileStr, CRLF);
|
|
WriteFile(hFile, sFileStr, wcslen(sFileStr), &nBytesWritten, NULL);
|
|
}
|
|
nSaved = nCount;
|
|
|
|
//
|
|
// FastIO View now
|
|
//
|
|
nCount = pFast->GetListCtrl().GetItemCount();
|
|
for (ti = 0; ti < nCount; ti++)
|
|
{
|
|
pFast->GetListCtrl().GetItemText(ti, 0, sStr, 1024);
|
|
wcscpy(sFileStr, sStr);
|
|
for (tj = 1; tj < 11; tj++)
|
|
{
|
|
wcscat(sFileStr, TAB);
|
|
pFast->GetListCtrl().GetItemText(ti, tj, sStr, 1024);
|
|
wcscat(sFileStr, sStr);
|
|
}
|
|
wcscat(sFileStr, CRLF);
|
|
WriteFile(hFile, sFileStr, wcslen(sFileStr), &nBytesWritten, NULL);
|
|
}
|
|
CloseHandle(hFile);
|
|
nSaved += nCount;
|
|
swprintf(sStr, L"%ld traces saved", nSaved);
|
|
MessageBox(NULL, sStr, L"FileSpy", MB_OK);
|
|
}
|