windows-nt/Source/XPSP1/NT/base/fs/fltsamples/filespy/usergui/filespydoc.cpp

219 lines
5 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
// 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);
}