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.
1425 lines
36 KiB
1425 lines
36 KiB
//+------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1994.
|
|
//
|
|
// File: bmp_stg2.cxx
|
|
//
|
|
// Contents: Generic Storage parser based test file 2
|
|
//
|
|
// Classes: CStorageParser
|
|
//
|
|
// Functions: Parse and Execute functions for each instruction.
|
|
//
|
|
// History: 20-June-94 t-vadims Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
#include <headers.cxx>
|
|
#pragma hdrstop
|
|
|
|
#include <bmp_stg.hxx>
|
|
#include <tchar.h>
|
|
|
|
#define STGTY_ANY 0 // any storage element, stream or storage
|
|
|
|
//
|
|
// Static array of info for each instruction
|
|
//
|
|
SInstrInfo CStorageParser::m_aInstructions[] =
|
|
{ { TEXT("StgIsStorageFile"),
|
|
TEXT("StgIsStorageFile "),
|
|
Parse_StgIsStorageFile,
|
|
Execute_StgIsStorageFile,
|
|
NULL },
|
|
|
|
{ TEXT("StgCreateDocFile"),
|
|
TEXT("StgCreateDocFile "),
|
|
Parse_StgCreateDocFile,
|
|
Execute_StgCreateDocFile,
|
|
NULL },
|
|
|
|
{ TEXT("OpenStorage"),
|
|
TEXT("StgOpenStorage "),
|
|
Parse_StgOpenStorage,
|
|
Execute_StgOpenStorage ,
|
|
NULL },
|
|
|
|
{ TEXT("CExposedDocFile::AddRef"),
|
|
TEXT("IStorage::AddRef "),
|
|
Parse_IStorageAddRef,
|
|
Execute_IStorageAddRef ,
|
|
NULL },
|
|
|
|
{ TEXT("CExposedDocFile::Release"),
|
|
TEXT("IStorage::Release "),
|
|
Parse_IStorageRelease,
|
|
Execute_IStorageRelease ,
|
|
NULL },
|
|
|
|
{ TEXT("CExposedDocFile::Commit"),
|
|
TEXT("IStorage::Commit "),
|
|
Parse_IStorageCommit,
|
|
Execute_IStorageCommit ,
|
|
NULL },
|
|
|
|
{ TEXT("CExposedDocFile::Revert"),
|
|
TEXT("IStorage::Revert "),
|
|
Parse_IStorageRelease,
|
|
Execute_IStorageRelease ,
|
|
NULL },
|
|
|
|
{ TEXT("CExposedDocFile::CreateStream"),
|
|
TEXT("IStorage::CreateStream"),
|
|
Parse_IStorageCreateStream,
|
|
Execute_IStorageCreateStream ,
|
|
NULL },
|
|
|
|
{ TEXT("CExposedDocFile::OpenStream"),
|
|
TEXT("IStorage::OpenStream "),
|
|
Parse_IStorageOpenStream,
|
|
Execute_IStorageOpenStream ,
|
|
NULL },
|
|
|
|
{ TEXT("CExposedDocFile::CreateStorage"),
|
|
TEXT("IStorage::CreateStorage"),
|
|
Parse_IStorageCreateStorage,
|
|
Execute_IStorageCreateStorage ,
|
|
NULL },
|
|
|
|
{ TEXT("CExposedDocFile::OpenStorage"),
|
|
TEXT("IStorage::OpenStorage"),
|
|
Parse_IStorageOpenStorage,
|
|
Execute_IStorageOpenStorage ,
|
|
NULL },
|
|
|
|
{ TEXT("CExposedDocFile::DestroyElement"),
|
|
TEXT("IStorage::DestroyElement"),
|
|
Parse_IStorageDestroyElement,
|
|
Execute_IStorageDestroyElement ,
|
|
NULL },
|
|
|
|
{ TEXT("CExposedDocFile::RenameElement"),
|
|
TEXT("IStorage::RenameElement"),
|
|
Parse_IStorageRenameElement,
|
|
Execute_IStorageRenameElement ,
|
|
NULL },
|
|
|
|
{ TEXT("CExposedDocFile::SetStateBits"),
|
|
TEXT("IStorage::SetStateBits"),
|
|
Parse_IStorageSetStateBits,
|
|
Execute_IStorageSetStateBits ,
|
|
NULL },
|
|
|
|
{ TEXT("CExposedDocFile::SetElementTimes"),
|
|
TEXT("IStorage::SetElementTimes"),
|
|
Parse_IStorageSetElementTimes,
|
|
Execute_IStorageSetElementTimes ,
|
|
NULL },
|
|
|
|
{ TEXT("CExposedDocFile::SetClass"),
|
|
TEXT("IStorage::SetClass "),
|
|
Parse_IStorageSetClass,
|
|
Execute_IStorageSetClass ,
|
|
NULL },
|
|
|
|
{ TEXT("CExposedDocFile::Stat"),
|
|
TEXT("IStorage::Stat "),
|
|
Parse_IStorageStat,
|
|
Execute_IStorageStat ,
|
|
NULL },
|
|
|
|
{ TEXT("CExposedStream::AddRef"),
|
|
TEXT("IStream::AddRef "),
|
|
Parse_IStreamAddRef,
|
|
Execute_IStreamAddRef ,
|
|
NULL },
|
|
|
|
{ TEXT("CExposedStream::Release"),
|
|
TEXT("IStream::Release "),
|
|
Parse_IStreamRelease,
|
|
Execute_IStreamRelease ,
|
|
NULL },
|
|
|
|
{ TEXT("CExposedStream::Commit"),
|
|
TEXT("IStream::Commit "),
|
|
Parse_IStreamCommit,
|
|
Execute_IStreamCommit ,
|
|
NULL },
|
|
|
|
{ TEXT("CExposedStream::Clone"),
|
|
TEXT("IStream::Clone "),
|
|
Parse_IStreamClone,
|
|
Execute_IStreamClone ,
|
|
NULL },
|
|
|
|
{ TEXT("CExposedStream::Revert"),
|
|
TEXT("IStream::Revert "),
|
|
Parse_IStreamRevert,
|
|
Execute_IStreamRevert ,
|
|
NULL },
|
|
|
|
{ TEXT("CExposedStream::SetSize"),
|
|
TEXT("IStream::SetSize "),
|
|
Parse_IStreamSetSize,
|
|
Execute_IStreamSetSize ,
|
|
NULL },
|
|
|
|
{ TEXT("CExposedStream::Write"),
|
|
TEXT("IStream::Write "),
|
|
Parse_IStreamWrite,
|
|
Execute_IStreamWrite ,
|
|
GetName_IStreamWrite },
|
|
|
|
{ TEXT("CExposedStream::Read"),
|
|
TEXT("IStream::Read "),
|
|
Parse_IStreamRead,
|
|
Execute_IStreamRead ,
|
|
GetName_IStreamRead },
|
|
|
|
{ TEXT("CExposedStream::Seek"),
|
|
TEXT("IStream::Seek "),
|
|
Parse_IStreamSeek,
|
|
Execute_IStreamSeek ,
|
|
GetName_IStreamSeek },
|
|
|
|
{ TEXT("CExposedStream::Stat"),
|
|
TEXT("IStream::Stat "),
|
|
Parse_IStreamStat,
|
|
Execute_IStreamStat ,
|
|
NULL }
|
|
};
|
|
|
|
|
|
//
|
|
// Number of instructions in the above array
|
|
//
|
|
ULONG CStorageParser::m_iMaxInstruction =
|
|
sizeof(CStorageParser::m_aInstructions) /
|
|
sizeof(CStorageParser::m_aInstructions[0]);
|
|
|
|
|
|
//
|
|
// Tries to find an "almost" matching name in the storage.
|
|
// Used to get around bug of loging functions, that print a '.' instead of unprintable
|
|
// characters.
|
|
SCODE CStorageParser::CheckForElementName(LPINSTRDATA pInstrData, DWORD dwType)
|
|
{
|
|
HRESULT hr;
|
|
LPENUMSTATSTG pEnum;
|
|
STATSTG StatStg;
|
|
BOOL bFound = FALSE;
|
|
|
|
|
|
hr = m_apStorages[pInstrData->ThisID]->EnumElements(0, NULL, 0, &pEnum);
|
|
|
|
while (!bFound && pEnum->Next(1, &StatStg, NULL) == S_OK)
|
|
{
|
|
if (StatStg.type == dwType || dwType == STGTY_ANY)
|
|
{
|
|
// if the names are the same except for the first letter, copy that letter.
|
|
if (wcscmp(StatStg.pwcsName + 1, pInstrData->wszParam + 1) == 0)
|
|
{
|
|
pInstrData->wszParam[0] = StatStg.pwcsName[0];
|
|
bFound = TRUE;
|
|
}
|
|
|
|
}
|
|
m_piMalloc->Free(StatStg.pwcsName);
|
|
}
|
|
|
|
pEnum->Release();
|
|
return bFound ? S_OK : E_FAIL;
|
|
}
|
|
|
|
|
|
/*
|
|
--------::In StgIsStorageFile(stgtest.bm)
|
|
--------::Out StgIsStorageFile(). ret == 1
|
|
*/
|
|
SCODE CStorageParser::Parse_StgIsStorageFile(LPINSTRDATA pInstrData,
|
|
LPTSTR pszPart1,
|
|
LPTSTR pszPart2)
|
|
{
|
|
#ifdef UNICODE
|
|
swscanf(pszPart1 + 31, L"%[^)]",pInstrData->wszParam);
|
|
#else
|
|
TCHAR szName[MAX_PATH];
|
|
sscanf(pszPart1 + 31, "%[^)]", szName);
|
|
mbstowcs(pInstrData->wszParam, szName, strlen(szName)+1);
|
|
#endif
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
ULONG CStorageParser::Execute_StgIsStorageFile(LPINSTRDATA pInstrData)
|
|
{
|
|
CStopWatch sw;
|
|
ULONG ulTime;
|
|
HRESULT hr;
|
|
|
|
sw.Reset();
|
|
hr = StgIsStorageFile(pInstrData->wszParam);
|
|
ulTime = sw.Read();
|
|
|
|
Log (m_aInstructions[pInstrData->ulInstrID].szPrintName, hr);
|
|
|
|
return ulTime;
|
|
}
|
|
|
|
|
|
/*
|
|
--------::In OpenStorage(stgtest.bm, 00000000, 10, 00000000, 0, 0012F540, 0012F4F8)
|
|
--------::Out OpenStorage(). *ppstgOpen == 00000000, ret == 80030050
|
|
*/
|
|
SCODE CStorageParser::Parse_StgOpenStorage(LPINSTRDATA pInstrData,
|
|
LPTSTR pszPart1,
|
|
LPTSTR pszPart2)
|
|
{
|
|
ULONG ulStorageID;
|
|
TCHAR szName[MAX_PATH];
|
|
|
|
_stscanf(pszPart1 + 26, TEXT("%[^,], %*x, %lx"), szName, &pInstrData->dwParam1);
|
|
#ifdef UNICODE
|
|
wcscpy(pInstrData->wszParam, szName);
|
|
#else
|
|
mbstowcs(pInstrData->wszParam, szName, strlen(szName)+1);
|
|
#endif
|
|
_stscanf(pszPart2 + 44, TEXT("%lx"), &ulStorageID);
|
|
|
|
pInstrData->OutID = FindStorageID(ulStorageID);
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
ULONG CStorageParser::Execute_StgOpenStorage(LPINSTRDATA pInstrData)
|
|
{
|
|
CStopWatch sw;
|
|
ULONG ulTime;
|
|
HRESULT hr;
|
|
|
|
sw.Reset();
|
|
hr = StgOpenStorage(pInstrData->wszParam, NULL, pInstrData->dwParam1,
|
|
NULL, 0, &m_apStorages[pInstrData->OutID]);
|
|
ulTime = sw.Read();
|
|
|
|
Log (m_aInstructions[pInstrData->ulInstrID].szPrintName, hr);
|
|
|
|
return ulTime;
|
|
}
|
|
|
|
|
|
/*
|
|
--------::In StgCreateDocFile(stgtest.bm, 1011, 0, 0012F53C)
|
|
--------::Out StgCreateDocFile(). *ppstgOpen == 50000A5C, ret == 0
|
|
*/
|
|
SCODE CStorageParser::Parse_StgCreateDocFile(LPINSTRDATA pInstrData,
|
|
LPTSTR pszPart1,
|
|
LPTSTR pszPart2)
|
|
{
|
|
ULONG ulStorageID;
|
|
TCHAR szName[MAX_PATH];
|
|
|
|
_stscanf(pszPart1 + 31, TEXT("%[^,], %lx"),
|
|
szName, &pInstrData->dwParam1);
|
|
#ifdef UNICODE
|
|
wcscpy(pInstrData->wszParam, szName);
|
|
#else
|
|
mbstowcs(pInstrData->wszParam, szName, strlen(szName)+1);
|
|
#endif
|
|
_stscanf(pszPart2 + 49, TEXT("%lx"), &ulStorageID);
|
|
|
|
pInstrData->OutID = FindStorageID(ulStorageID);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
ULONG CStorageParser::Execute_StgCreateDocFile(LPINSTRDATA pInstrData)
|
|
{
|
|
CStopWatch sw;
|
|
ULONG ulTime;
|
|
HRESULT hr;
|
|
OLECHAR *pwszName;
|
|
|
|
pwszName = pInstrData->wszParam;
|
|
|
|
if (wcscmp(pwszName, L"(null)") == 0)
|
|
pwszName = NULL;
|
|
|
|
sw.Reset();
|
|
hr = StgCreateDocfile(pwszName, pInstrData->dwParam1,
|
|
0, &m_apStorages[pInstrData->OutID]);
|
|
ulTime = sw.Read();
|
|
|
|
Log (m_aInstructions[pInstrData->ulInstrID].szPrintName, hr);
|
|
|
|
return ulTime;
|
|
}
|
|
|
|
/*
|
|
50000A5C::In CExposedDocFile::AddRef()
|
|
50000A5C::Out CExposedDocFile::AddRef(). ret == 0
|
|
*/
|
|
SCODE CStorageParser::Parse_IStorageAddRef(LPINSTRDATA pInstrData,
|
|
LPTSTR pszPart1,
|
|
LPTSTR pszPart2)
|
|
{
|
|
ULONG ulStorageID;
|
|
|
|
_stscanf(pszPart1, TEXT("%lx"), &ulStorageID);
|
|
|
|
pInstrData->ThisID = FindStorageID(ulStorageID);
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
ULONG CStorageParser::Execute_IStorageAddRef(LPINSTRDATA pInstrData)
|
|
{
|
|
CStopWatch sw;
|
|
ULONG ulTime;
|
|
|
|
if (FAILED(CheckThisStorageID(pInstrData->ThisID)))
|
|
return TEST_FAILED;
|
|
|
|
sw.Reset();
|
|
m_apStorages[pInstrData->ThisID]->AddRef();
|
|
ulTime = sw.Read();
|
|
|
|
Log (m_aInstructions[pInstrData->ulInstrID].szPrintName, S_OK);
|
|
|
|
return ulTime;
|
|
}
|
|
|
|
|
|
/*
|
|
50000A5C::In CExposedDocFile::Release()
|
|
50000A5C::Out CExposedDocFile::Release(). ret == 0
|
|
*/
|
|
SCODE CStorageParser::Parse_IStorageRelease(LPINSTRDATA pInstrData,
|
|
LPTSTR pszPart1,
|
|
LPTSTR pszPart2)
|
|
{
|
|
ULONG ulStorageID;
|
|
|
|
_stscanf(pszPart1, TEXT("%lx"), &ulStorageID);
|
|
|
|
pInstrData->ThisID = FindStorageID(ulStorageID);
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
ULONG CStorageParser::Execute_IStorageRelease(LPINSTRDATA pInstrData)
|
|
{
|
|
CStopWatch sw;
|
|
ULONG ulTime;
|
|
|
|
if (FAILED(CheckThisStorageID(pInstrData->ThisID)))
|
|
return TEST_FAILED;
|
|
|
|
sw.Reset();
|
|
m_apStorages[pInstrData->ThisID]->Release();
|
|
ulTime = sw.Read();
|
|
|
|
Log (m_aInstructions[pInstrData->ulInstrID].szPrintName, S_OK);
|
|
|
|
return ulTime;
|
|
}
|
|
|
|
/*
|
|
50000A5C::In CExposedDocFile::Revert()
|
|
50000A5C::Out CExposedDocFile::Revert(). ret == 0
|
|
*/
|
|
SCODE CStorageParser::Parse_IStorageRevert(LPINSTRDATA pInstrData,
|
|
LPTSTR pszPart1,
|
|
LPTSTR pszPart2)
|
|
{
|
|
ULONG ulStorageID;
|
|
|
|
_stscanf(pszPart1, TEXT("%lx"), &ulStorageID);
|
|
|
|
pInstrData->ThisID = FindStorageID(ulStorageID);
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
ULONG CStorageParser::Execute_IStorageRevert(LPINSTRDATA pInstrData)
|
|
{
|
|
CStopWatch sw;
|
|
ULONG ulTime;
|
|
HRESULT hr;
|
|
|
|
if (FAILED(CheckThisStorageID(pInstrData->ThisID)))
|
|
return TEST_FAILED;
|
|
|
|
sw.Reset();
|
|
hr = m_apStorages[pInstrData->ThisID]->Revert();
|
|
ulTime = sw.Read();
|
|
|
|
Log (m_aInstructions[pInstrData->ulInstrID].szPrintName, hr);
|
|
|
|
return ulTime;
|
|
}
|
|
|
|
/*
|
|
50000A5C::In CExposedDocFile::Commit(0)
|
|
50000A5C::Out CExposedDocFile::Commit(). ret == 0
|
|
*/
|
|
SCODE CStorageParser::Parse_IStorageCommit(LPINSTRDATA pInstrData,
|
|
LPTSTR pszPart1,
|
|
LPTSTR pszPart2)
|
|
{
|
|
ULONG ulStorageID;
|
|
|
|
_stscanf(pszPart1, TEXT("%lx"), &ulStorageID);
|
|
_stscanf(pszPart1 + 38, TEXT("%lx"), &pInstrData->dwParam1);
|
|
|
|
pInstrData->ThisID = FindStorageID(ulStorageID);
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
ULONG CStorageParser::Execute_IStorageCommit(LPINSTRDATA pInstrData)
|
|
{
|
|
CStopWatch sw;
|
|
ULONG ulTime;
|
|
HRESULT hr;
|
|
|
|
if (FAILED(CheckThisStorageID(pInstrData->ThisID)))
|
|
return TEST_FAILED;
|
|
|
|
sw.Reset();
|
|
hr = m_apStorages[pInstrData->ThisID]->Commit(pInstrData->dwParam1);
|
|
ulTime = sw.Read();
|
|
|
|
Log (m_aInstructions[pInstrData->ulInstrID].szPrintName, hr);
|
|
|
|
return ulTime;
|
|
}
|
|
|
|
/*
|
|
50000A5C::In CExposedDocFile::CreateStream(CONTENTS, 1011, 0, 0, 0012F54C)
|
|
50000A5C::Out CExposedDocFile::CreateStream(). *ppstm == 500008F4, ret == 0
|
|
*/
|
|
SCODE CStorageParser::Parse_IStorageCreateStream(LPINSTRDATA pInstrData,
|
|
LPTSTR pszPart1,
|
|
LPTSTR pszPart2)
|
|
{
|
|
ULONG ulStreamID;
|
|
ULONG ulStorageID;
|
|
TCHAR szName[MAX_PATH];
|
|
|
|
_stscanf(pszPart1, TEXT("%lx"), &ulStorageID);
|
|
_stscanf(pszPart1 + 44, TEXT("%[^,], %lx"),
|
|
szName, &pInstrData->dwParam1);
|
|
#ifdef UNICODE
|
|
wcscpy(pInstrData->wszParam, szName);
|
|
#else
|
|
mbstowcs(pInstrData->wszParam, szName, strlen(szName)+1);
|
|
#endif
|
|
_stscanf(pszPart2 + 58, TEXT("%lx"), &ulStreamID);
|
|
|
|
pInstrData->ThisID = FindStorageID(ulStorageID);
|
|
pInstrData->OutID = FindStreamID(ulStreamID);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
ULONG CStorageParser::Execute_IStorageCreateStream(LPINSTRDATA pInstrData)
|
|
{
|
|
CStopWatch sw;
|
|
ULONG ulTime;
|
|
HRESULT hr;
|
|
|
|
if (FAILED(CheckThisStorageID(pInstrData->ThisID)))
|
|
return TEST_FAILED;
|
|
|
|
sw.Reset();
|
|
hr = m_apStorages[pInstrData->ThisID]->CreateStream(pInstrData->wszParam,
|
|
pInstrData->dwParam1,
|
|
0, 0,
|
|
&m_apStreams[pInstrData->OutID]);
|
|
ulTime = sw.Read();
|
|
|
|
Log(m_aInstructions[pInstrData->ulInstrID].szPrintName, hr);
|
|
return ulTime;
|
|
}
|
|
|
|
|
|
/*
|
|
50000A5C::In CExposedDocFile::OpenStream(CONTENTS, 0 12, 0, 0012F54C)
|
|
50000A5C::Out CExposedDocFile::OpenStream(). *ppstm == 500008F4, ret == 0
|
|
*/
|
|
SCODE CStorageParser::Parse_IStorageOpenStream(LPINSTRDATA pInstrData,
|
|
LPTSTR pszPart1,
|
|
LPTSTR pszPart2)
|
|
{
|
|
ULONG ulStreamID;
|
|
ULONG ulStorageID;
|
|
TCHAR szName[MAX_PATH];
|
|
|
|
_stscanf(pszPart1, TEXT("%lx"), &ulStorageID);
|
|
_stscanf(pszPart1 + 42, TEXT("%[^,], %*x %lx"),
|
|
szName, &pInstrData->dwParam1);
|
|
#ifdef UNICODE
|
|
wcscpy(pInstrData->wszParam, szName);
|
|
#else
|
|
mbstowcs(pInstrData->wszParam, szName, strlen(szName)+1);
|
|
#endif
|
|
_stscanf(pszPart2 + 56, TEXT("%lx"), &ulStreamID);
|
|
_stscanf(pszPart2 + 73, TEXT("%lx"), &pInstrData->dwParam2);
|
|
|
|
pInstrData->ThisID = FindStorageID(ulStorageID);
|
|
pInstrData->OutID = FindStreamID(ulStreamID);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
ULONG CStorageParser::Execute_IStorageOpenStream(LPINSTRDATA pInstrData)
|
|
{
|
|
CStopWatch sw;
|
|
ULONG ulTime;
|
|
HRESULT hr;
|
|
SCODE sc;
|
|
|
|
if (FAILED(CheckThisStorageID(pInstrData->ThisID)))
|
|
return TEST_FAILED;
|
|
|
|
sw.Reset();
|
|
hr = m_apStorages[pInstrData->ThisID]->OpenStream(pInstrData->wszParam, 0,
|
|
pInstrData->dwParam1, 0,
|
|
&m_apStreams[pInstrData->OutID]);
|
|
ulTime = sw.Read();
|
|
|
|
// check if we failed but script indicated succes, which means that a name could be wrong
|
|
if (FAILED(hr) && SUCCEEDED(pInstrData->dwParam2))
|
|
{
|
|
sc = CheckForElementName(pInstrData, STGTY_STREAM);
|
|
if (SUCCEEDED(sc))
|
|
{
|
|
sw.Reset();
|
|
hr = m_apStorages[pInstrData->ThisID]->OpenStream(pInstrData->wszParam, 0,
|
|
pInstrData->dwParam1, 0,
|
|
&m_apStreams[pInstrData->OutID]);
|
|
ulTime = sw.Read();
|
|
}
|
|
}
|
|
|
|
Log(m_aInstructions[pInstrData->ulInstrID].szPrintName, hr);
|
|
return ulTime;
|
|
}
|
|
|
|
/*
|
|
50000A5C::In CExposedDocFile::CreateStorage(STORAGE1, 1011, 0, 0, 0012F54C)
|
|
50000A5C::Out CExposedDocFile::CreateStorage(). *ppstm == 500008F4, ret == 0
|
|
*/
|
|
SCODE CStorageParser::Parse_IStorageCreateStorage(LPINSTRDATA pInstrData,
|
|
LPTSTR pszPart1,
|
|
LPTSTR pszPart2)
|
|
{
|
|
ULONG ulStorageID1;
|
|
ULONG ulStorageID2;
|
|
TCHAR szName[MAX_PATH];
|
|
|
|
_stscanf(pszPart1, TEXT("%lx"), &ulStorageID1);
|
|
_stscanf(pszPart1 + 45, TEXT("%[^,], %lx"),
|
|
szName, &pInstrData->dwParam1);
|
|
#ifdef UNICODE
|
|
wcscpy(pInstrData->wszParam, szName);
|
|
#else
|
|
mbstowcs(pInstrData->wszParam, szName, strlen(szName)+1);
|
|
#endif
|
|
_stscanf(pszPart2 + 59, TEXT("%lx"), &ulStorageID2);
|
|
|
|
pInstrData->ThisID = FindStorageID(ulStorageID1);
|
|
pInstrData->OutID = FindStorageID(ulStorageID2);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
ULONG CStorageParser::Execute_IStorageCreateStorage(LPINSTRDATA pInstrData)
|
|
{
|
|
CStopWatch sw;
|
|
ULONG ulTime;
|
|
HRESULT hr;
|
|
|
|
if (FAILED(CheckThisStorageID(pInstrData->ThisID)))
|
|
return TEST_FAILED;
|
|
|
|
sw.Reset();
|
|
hr = m_apStorages[pInstrData->ThisID]->CreateStorage(pInstrData->wszParam,
|
|
pInstrData->dwParam1,
|
|
0, 0,
|
|
&m_apStorages[pInstrData->OutID]);
|
|
ulTime = sw.Read();
|
|
|
|
Log(m_aInstructions[pInstrData->ulInstrID].szPrintName, hr);
|
|
return ulTime;
|
|
}
|
|
|
|
/*
|
|
50000A5C::In CExposedDocFile::OpenStorage(CONTENTS, 00000000, 1011, 00000000, 0, 0012F54C)
|
|
50000A5C::Out CExposedDocFile::OpenStorage(). *ppstm == 500008F4, ret == 0
|
|
*/
|
|
SCODE CStorageParser::Parse_IStorageOpenStorage(LPINSTRDATA pInstrData,
|
|
LPTSTR pszPart1,
|
|
LPTSTR pszPart2)
|
|
{
|
|
ULONG ulStorageID1;
|
|
ULONG ulStorageID2;
|
|
TCHAR szName[MAX_PATH];
|
|
|
|
_stscanf(pszPart1, TEXT("%lx"), &ulStorageID1);
|
|
_stscanf(pszPart1 + 43, TEXT("%[^,], %*lx, %lx"),
|
|
szName, &pInstrData->dwParam1);
|
|
#ifdef UNICODE
|
|
wcscpy(pInstrData->wszParam, szName);
|
|
#else
|
|
mbstowcs(pInstrData->wszParam, szName, strlen(szName)+1);
|
|
#endif
|
|
_stscanf(pszPart2 + 57, TEXT("%lx"), &ulStorageID2);
|
|
_stscanf(pszPart2 + 74, TEXT("%lx"), &pInstrData->dwParam2);
|
|
|
|
pInstrData->ThisID = FindStorageID(ulStorageID1);
|
|
pInstrData->OutID = FindStorageID(ulStorageID2);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
ULONG CStorageParser::Execute_IStorageOpenStorage(LPINSTRDATA pInstrData)
|
|
{
|
|
CStopWatch sw;
|
|
ULONG ulTime;
|
|
HRESULT hr;
|
|
SCODE sc;
|
|
|
|
if (FAILED(CheckThisStorageID(pInstrData->ThisID)))
|
|
return TEST_FAILED;
|
|
|
|
sw.Reset();
|
|
hr = m_apStorages[pInstrData->ThisID]->OpenStorage(pInstrData->wszParam,
|
|
NULL,
|
|
pInstrData->dwParam1,
|
|
NULL, 0,
|
|
&m_apStorages[pInstrData->OutID]);
|
|
ulTime = sw.Read();
|
|
|
|
// check if we failed but script indicated succes, which means that a name could be wrong
|
|
if (FAILED(hr) && SUCCEEDED(pInstrData->dwParam2))
|
|
{
|
|
sc = CheckForElementName(pInstrData, STGTY_STORAGE);
|
|
if (SUCCEEDED(sc))
|
|
{
|
|
sw.Reset();
|
|
hr = m_apStorages[pInstrData->ThisID]->OpenStorage(pInstrData->wszParam, NULL,
|
|
pInstrData->dwParam1, NULL, 0,
|
|
&m_apStorages[pInstrData->OutID]);
|
|
ulTime = sw.Read();
|
|
}
|
|
}
|
|
Log(m_aInstructions[pInstrData->ulInstrID].szPrintName, hr);
|
|
return ulTime;
|
|
}
|
|
|
|
|
|
/*
|
|
50000A5C::In CExposedDocFile::DestroyElement(CONTENTS)
|
|
50000A5C::Out CExposedDocFile::DestroyElement(). ret == 0
|
|
*/
|
|
SCODE CStorageParser::Parse_IStorageDestroyElement(LPINSTRDATA pInstrData,
|
|
LPTSTR pszPart1,
|
|
LPTSTR pszPart2)
|
|
{
|
|
ULONG ulStorageID;
|
|
|
|
_stscanf(pszPart1, TEXT("%lx"), &ulStorageID);
|
|
#ifdef UNICODE
|
|
swscanf(pszPart1 + 46, L"%[^,]", pInstrData->wszParam);
|
|
#else
|
|
TCHAR szName[MAX_PATH];
|
|
sscanf(pszPart1 + 46, "%[^,]", szName);
|
|
mbstowcs(pInstrData->wszParam, szName, strlen(szName)+1);
|
|
#endif
|
|
_stscanf(pszPart2 + 57, TEXT("%lx"), &pInstrData->dwParam1);
|
|
|
|
pInstrData->ThisID = FindStorageID(ulStorageID);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
ULONG CStorageParser::Execute_IStorageDestroyElement(LPINSTRDATA pInstrData)
|
|
{
|
|
CStopWatch sw;
|
|
ULONG ulTime;
|
|
HRESULT hr;
|
|
SCODE sc;
|
|
|
|
if (FAILED(CheckThisStorageID(pInstrData->ThisID)))
|
|
return TEST_FAILED;
|
|
|
|
sw.Reset();
|
|
hr = m_apStorages[pInstrData->ThisID]->DestroyElement(pInstrData->wszParam);
|
|
ulTime = sw.Read();
|
|
|
|
// check if we failed but script indicated succes, which means that a name could be wrong
|
|
if (FAILED(hr) && SUCCEEDED(pInstrData->dwParam1))
|
|
{
|
|
sc = CheckForElementName(pInstrData, STGTY_ANY);
|
|
if (SUCCEEDED(sc))
|
|
{
|
|
sw.Reset();
|
|
hr = m_apStorages[pInstrData->ThisID]->DestroyElement(pInstrData->wszParam);
|
|
ulTime = sw.Read();
|
|
}
|
|
}
|
|
Log(m_aInstructions[pInstrData->ulInstrID].szPrintName, hr);
|
|
|
|
return ulTime;
|
|
}
|
|
|
|
|
|
/*
|
|
50000A5C::In CExposedDocFile::SetStateBits(%lu, %lu)
|
|
50000A5C::Out CExposedDocFile::SetStateBits(). ret == ??
|
|
*/
|
|
SCODE CStorageParser::Parse_IStorageSetStateBits(LPINSTRDATA pInstrData,
|
|
LPTSTR pszPart1,
|
|
LPTSTR pszPart2)
|
|
{
|
|
ULONG ulStorageID;
|
|
|
|
_stscanf(pszPart1, TEXT("%lx"), &ulStorageID);
|
|
_stscanf(pszPart1 + 44, TEXT("%lu, %lu"),
|
|
&pInstrData->dwParam1, &pInstrData->dwParam2);
|
|
|
|
pInstrData->ThisID = FindStorageID(ulStorageID);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
ULONG CStorageParser::Execute_IStorageSetStateBits(LPINSTRDATA pInstrData)
|
|
{
|
|
CStopWatch sw;
|
|
ULONG ulTime;
|
|
HRESULT hr;
|
|
|
|
if (FAILED(CheckThisStorageID(pInstrData->ThisID)))
|
|
return TEST_FAILED;
|
|
|
|
sw.Reset();
|
|
hr = m_apStorages[pInstrData->ThisID]->SetStateBits(pInstrData->dwParam1, pInstrData->dwParam2);
|
|
ulTime = sw.Read();
|
|
|
|
Log(m_aInstructions[pInstrData->ulInstrID].szPrintName, hr);
|
|
|
|
return ulTime;
|
|
}
|
|
|
|
|
|
/*
|
|
50000A5C::In CExposedDocFile::SetClass(?)
|
|
50000A5C::Out CExposedDocFile::SetClass(). ret == ??
|
|
*/
|
|
SCODE CStorageParser::Parse_IStorageSetClass(LPINSTRDATA pInstrData,
|
|
LPTSTR pszPart1,
|
|
LPTSTR pszPart2)
|
|
{
|
|
ULONG ulStorageID;
|
|
|
|
_stscanf(pszPart1, TEXT("%lx"), &ulStorageID);
|
|
|
|
pInstrData->ThisID = FindStorageID(ulStorageID);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
ULONG CStorageParser::Execute_IStorageSetClass(LPINSTRDATA pInstrData)
|
|
{
|
|
CStopWatch sw;
|
|
ULONG ulTime;
|
|
HRESULT hr;
|
|
static const CLSID ClsID =
|
|
{0x0000013a,0x0001,0x0008,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}};
|
|
|
|
|
|
if (FAILED(CheckThisStorageID(pInstrData->ThisID)))
|
|
return TEST_FAILED;
|
|
|
|
sw.Reset();
|
|
hr = m_apStorages[pInstrData->ThisID]->SetClass(ClsID);
|
|
ulTime = sw.Read();
|
|
|
|
Log(m_aInstructions[pInstrData->ulInstrID].szPrintName, hr);
|
|
|
|
return ulTime;
|
|
}
|
|
|
|
|
|
/*
|
|
5000A0FC::In CExposedDocFile::SetElementTimes(contents, 0012F518, 0012F518, 00000000)
|
|
5000A0FC::Out CExposedDocFile::SetElementTimes(). ret == 80030005
|
|
*/
|
|
SCODE CStorageParser::Parse_IStorageSetElementTimes(LPINSTRDATA pInstrData,
|
|
LPTSTR pszPart1,
|
|
LPTSTR pszPart2)
|
|
{
|
|
ULONG ulStorageID;
|
|
TCHAR szName[MAX_PATH];
|
|
|
|
_stscanf(pszPart1, TEXT("%lx"), &ulStorageID);
|
|
_stscanf(pszPart1 + 47, TEXT("%[^,], %lx, %lx, %lx"),
|
|
szName, &pInstrData->dwParam1,
|
|
&pInstrData->dwParam2, &pInstrData->dwParam3);
|
|
#ifdef UNICODE
|
|
wcscpy(pInstrData->wszParam, szName);
|
|
#else
|
|
mbstowcs(pInstrData->wszParam, szName, strlen(szName)+1);
|
|
#endif
|
|
|
|
pInstrData->ThisID = FindStorageID(ulStorageID);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
ULONG CStorageParser::Execute_IStorageSetElementTimes(LPINSTRDATA pInstrData)
|
|
{
|
|
CStopWatch sw;
|
|
ULONG ulTime;
|
|
HRESULT hr;
|
|
FILETIME ft;
|
|
SYSTEMTIME st;
|
|
LPFILETIME pft1, pft2, pft3;
|
|
|
|
if (FAILED(CheckThisStorageID(pInstrData->ThisID)))
|
|
return TEST_FAILED;
|
|
|
|
// get current time
|
|
GetSystemTime(&st);
|
|
SystemTimeToFileTime(&st, &ft);
|
|
|
|
pft1 = pInstrData->dwParam1 ? &ft : NULL;
|
|
pft2 = pInstrData->dwParam2 ? &ft : NULL;
|
|
pft3 = pInstrData->dwParam3 ? &ft : NULL;
|
|
|
|
sw.Reset();
|
|
hr = m_apStorages[pInstrData->ThisID]->SetElementTimes(pInstrData->wszParam,
|
|
pft1, pft2, pft3);
|
|
ulTime = sw.Read();
|
|
|
|
Log(m_aInstructions[pInstrData->ulInstrID].szPrintName, hr);
|
|
|
|
return ulTime;
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
50000A5C::In CExposedDocFile::RenameElement(Name1, Name2)
|
|
50000A5C::Out CExposedDocFile::RenameElement(). ret == ??
|
|
*/
|
|
SCODE CStorageParser::Parse_IStorageRenameElement(LPINSTRDATA pInstrData,
|
|
LPTSTR pszPart1,
|
|
LPTSTR pszPart2)
|
|
{
|
|
ULONG ulStorageID;
|
|
|
|
pInstrData->wszParam2 = (OLECHAR *)m_piMalloc->Alloc(MAX_PATH * sizeof(OLECHAR));
|
|
if (pInstrData->wszParam2 == NULL)
|
|
{
|
|
Log(TEXT("Can't allocate memory in for RenameElement"), E_OUTOFMEMORY);
|
|
return E_FAIL;
|
|
}
|
|
_stscanf(pszPart1, TEXT("%lx"), &ulStorageID);
|
|
#ifdef UNICODE
|
|
swscanf(pszPart1 + 45, L"%[^,], %[^)]",
|
|
pInstrData->wszParam, pInstrData->wszParam2);
|
|
#else
|
|
TCHAR szName[MAX_PATH], szName2[MAX_PATH];
|
|
_stscanf(pszPart1 + 45, "%[^,], %[^)]",
|
|
szName, szName2);
|
|
mbstowcs(pInstrData->wszParam, szName, strlen(szName)+1);
|
|
mbstowcs(pInstrData->wszParam2, szName2, strlen(szName2)+1);
|
|
#endif
|
|
_stscanf(pszPart2 + 56, TEXT("%lx"), &pInstrData->dwParam1);
|
|
|
|
pInstrData->ThisID = FindStorageID(ulStorageID);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
ULONG CStorageParser::Execute_IStorageRenameElement(LPINSTRDATA pInstrData)
|
|
{
|
|
CStopWatch sw;
|
|
ULONG ulTime;
|
|
HRESULT hr;
|
|
SCODE sc;
|
|
|
|
if (FAILED(CheckThisStorageID(pInstrData->ThisID)))
|
|
return TEST_FAILED;
|
|
|
|
sw.Reset();
|
|
hr = m_apStorages[pInstrData->ThisID]->RenameElement(pInstrData->wszParam,
|
|
pInstrData->wszParam2);
|
|
ulTime = sw.Read();
|
|
|
|
// check if we failed but script indicated succes,
|
|
// which means that a name could be wrong
|
|
if (FAILED(hr) && SUCCEEDED(pInstrData->dwParam1))
|
|
{
|
|
sc = CheckForElementName(pInstrData, STGTY_ANY);
|
|
if (SUCCEEDED(sc))
|
|
{
|
|
sw.Reset();
|
|
hr = m_apStorages[pInstrData->ThisID]->RenameElement(pInstrData->wszParam,
|
|
pInstrData->wszParam2);
|
|
ulTime = sw.Read();
|
|
}
|
|
}
|
|
|
|
m_piMalloc->Free(pInstrData->wszParam2);
|
|
Log(m_aInstructions[pInstrData->ulInstrID].szPrintName, hr);
|
|
return ulTime;
|
|
}
|
|
|
|
/*
|
|
50000A5C::In CExposedDocFile::Stat(xxxxxxxx)
|
|
50000A5C::Out CExposedDocFile::Stat(). ret == ??
|
|
*/
|
|
SCODE CStorageParser::Parse_IStorageStat(LPINSTRDATA pInstrData,
|
|
LPTSTR pszPart1,
|
|
LPTSTR pszPart2)
|
|
{
|
|
ULONG ulStorageID;
|
|
|
|
_stscanf(pszPart1, TEXT("%lx"), &ulStorageID);
|
|
pInstrData->ThisID = FindStorageID(ulStorageID);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
ULONG CStorageParser::Execute_IStorageStat(LPINSTRDATA pInstrData)
|
|
{
|
|
CStopWatch sw;
|
|
ULONG ulTime;
|
|
HRESULT hr;
|
|
STATSTG StatStg;
|
|
|
|
if (FAILED(CheckThisStorageID(pInstrData->ThisID)))
|
|
return TEST_FAILED;
|
|
|
|
sw.Reset();
|
|
hr = m_apStorages[pInstrData->ThisID]->Stat(&StatStg, STATFLAG_NONAME);
|
|
ulTime = sw.Read();
|
|
|
|
Log(m_aInstructions[pInstrData->ulInstrID].szPrintName, hr);
|
|
|
|
return ulTime;
|
|
}
|
|
|
|
/*
|
|
50000A5C::In CExposedStream::AddRef()
|
|
50000A5C::Out CExposedStream::AddRef(). ret == 0
|
|
*/
|
|
SCODE CStorageParser::Parse_IStreamAddRef(LPINSTRDATA pInstrData,
|
|
LPTSTR pszPart1,
|
|
LPTSTR pszPart2)
|
|
{
|
|
ULONG ulStreamID;
|
|
|
|
_stscanf(pszPart1, TEXT("%lx"), &ulStreamID);
|
|
|
|
pInstrData->ThisID = FindStreamID(ulStreamID);
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
ULONG CStorageParser::Execute_IStreamAddRef(LPINSTRDATA pInstrData)
|
|
{
|
|
CStopWatch sw;
|
|
ULONG ulTime;
|
|
ULONG ulRes;
|
|
|
|
if (FAILED(CheckThisStreamID(pInstrData->ThisID)))
|
|
return TEST_FAILED;
|
|
sw.Reset();
|
|
ulRes = m_apStreams[pInstrData->ThisID]->AddRef();
|
|
ulTime = sw.Read();
|
|
|
|
Log (m_aInstructions[pInstrData->ulInstrID].szPrintName, S_OK);
|
|
|
|
return ulTime;
|
|
}
|
|
|
|
|
|
/*
|
|
50000A5C::In CExposedStream::Release()
|
|
50000A5C::Out CExposedStream::Release(). ret == 0
|
|
*/
|
|
SCODE CStorageParser::Parse_IStreamRelease(LPINSTRDATA pInstrData,
|
|
LPTSTR pszPart1,
|
|
LPTSTR pszPart2)
|
|
{
|
|
ULONG ulStreamID;
|
|
|
|
_stscanf(pszPart1, TEXT("%lx"), &ulStreamID);
|
|
|
|
pInstrData->ThisID = FindStreamID(ulStreamID);
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
ULONG CStorageParser::Execute_IStreamRelease(LPINSTRDATA pInstrData)
|
|
{
|
|
CStopWatch sw;
|
|
ULONG ulTime;
|
|
|
|
if (FAILED(CheckThisStreamID(pInstrData->ThisID)))
|
|
return TEST_FAILED;
|
|
|
|
sw.Reset();
|
|
m_apStreams[pInstrData->ThisID]->Release();
|
|
ulTime = sw.Read();
|
|
|
|
Log (m_aInstructions[pInstrData->ulInstrID].szPrintName, S_OK);
|
|
|
|
return ulTime;
|
|
}
|
|
|
|
/*
|
|
50000A5C::In CExposedStream::Revert()
|
|
50000A5C::Out CExposedStream::Revert(). ret == 0
|
|
*/
|
|
SCODE CStorageParser::Parse_IStreamRevert(LPINSTRDATA pInstrData,
|
|
LPTSTR pszPart1,
|
|
LPTSTR pszPart2)
|
|
{
|
|
ULONG ulStreamID;
|
|
|
|
_stscanf(pszPart1, TEXT("%lx"), &ulStreamID);
|
|
|
|
pInstrData->ThisID = FindStreamID(ulStreamID);
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
ULONG CStorageParser::Execute_IStreamRevert(LPINSTRDATA pInstrData)
|
|
{
|
|
CStopWatch sw;
|
|
ULONG ulTime;
|
|
HRESULT hr;
|
|
|
|
if (FAILED(CheckThisStreamID(pInstrData->ThisID)))
|
|
return TEST_FAILED;
|
|
|
|
sw.Reset();
|
|
hr = m_apStreams[pInstrData->ThisID]->Revert();
|
|
ulTime = sw.Read();
|
|
|
|
Log (m_aInstructions[pInstrData->ulInstrID].szPrintName, hr);
|
|
|
|
return ulTime;
|
|
}
|
|
|
|
/*
|
|
50000A5C::In CExposedStream::Commit(0)
|
|
50000A5C::Out CExposedStream::Commit(). ret == 0
|
|
*/
|
|
SCODE CStorageParser::Parse_IStreamCommit(LPINSTRDATA pInstrData,
|
|
LPTSTR pszPart1,
|
|
LPTSTR pszPart2)
|
|
{
|
|
ULONG ulStreamID;
|
|
|
|
_stscanf(pszPart1, TEXT("%lx"), &ulStreamID);
|
|
_stscanf(pszPart1 + 37, TEXT("%lx"), &pInstrData->dwParam1);
|
|
|
|
pInstrData->ThisID = FindStreamID(ulStreamID);
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
ULONG CStorageParser::Execute_IStreamCommit(LPINSTRDATA pInstrData)
|
|
{
|
|
CStopWatch sw;
|
|
ULONG ulTime;
|
|
HRESULT hr;
|
|
|
|
if (FAILED(CheckThisStreamID(pInstrData->ThisID)))
|
|
return TEST_FAILED;
|
|
|
|
sw.Reset();
|
|
hr = m_apStreams[pInstrData->ThisID]->Commit(pInstrData->dwParam1);
|
|
ulTime = sw.Read();
|
|
|
|
Log (m_aInstructions[pInstrData->ulInstrID].szPrintName, hr);
|
|
|
|
return ulTime;
|
|
}
|
|
|
|
/*
|
|
50000A5C::In CExposedStream::SetSize(10)
|
|
50000A5C::Out CExposedStream::SetSize(). ret == 0
|
|
*/
|
|
SCODE CStorageParser::Parse_IStreamSetSize(LPINSTRDATA pInstrData,
|
|
LPTSTR pszPart1,
|
|
LPTSTR pszPart2)
|
|
{
|
|
ULONG ulStreamID;
|
|
|
|
_stscanf(pszPart1, TEXT("%lx"), &ulStreamID);
|
|
_stscanf(pszPart1 + 38, TEXT("%lu"), &pInstrData->dwParam1);
|
|
|
|
pInstrData->ThisID = FindStreamID(ulStreamID);
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
ULONG CStorageParser::Execute_IStreamSetSize(LPINSTRDATA pInstrData)
|
|
{
|
|
CStopWatch sw;
|
|
ULONG ulTime;
|
|
HRESULT hr;
|
|
ULARGE_INTEGER liSize;
|
|
|
|
if (FAILED(CheckThisStreamID(pInstrData->ThisID)))
|
|
return TEST_FAILED;
|
|
|
|
LISet32(liSize, pInstrData->dwParam1);
|
|
|
|
sw.Reset();
|
|
hr = m_apStreams[pInstrData->ThisID]->SetSize(liSize);
|
|
ulTime = sw.Read();
|
|
|
|
Log (m_aInstructions[pInstrData->ulInstrID].szPrintName, hr);
|
|
|
|
return ulTime;
|
|
}
|
|
|
|
/*
|
|
50000A5C::In CExposedStream::Write(xxxxxxxx, 1234, xxxxxxxx)
|
|
50000A5C::Out CExposedStream::Write(). ret == 0
|
|
*/
|
|
SCODE CStorageParser::Parse_IStreamWrite(LPINSTRDATA pInstrData,
|
|
LPTSTR pszPart1,
|
|
LPTSTR pszPart2)
|
|
{
|
|
ULONG ulStreamID;
|
|
|
|
_stscanf(pszPart1, TEXT("%lx"), &ulStreamID);
|
|
_stscanf(pszPart1 + 46, TEXT("%lu"), &pInstrData->dwParam1);
|
|
|
|
pInstrData->ThisID = FindStreamID(ulStreamID);
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
ULONG CStorageParser::Execute_IStreamWrite(LPINSTRDATA pInstrData)
|
|
{
|
|
CStopWatch sw;
|
|
ULONG ulTime;
|
|
HRESULT hr;
|
|
BYTE *pData;
|
|
|
|
pData = (BYTE *) m_piMalloc->Alloc(pInstrData->dwParam1);
|
|
if (pData == NULL)
|
|
{
|
|
Log(TEXT("Can't allocate memory for write"), E_OUTOFMEMORY);
|
|
return TEST_FAILED;
|
|
}
|
|
|
|
if (FAILED(CheckThisStreamID(pInstrData->ThisID)))
|
|
return TEST_FAILED;
|
|
|
|
sw.Reset();
|
|
hr = m_apStreams[pInstrData->ThisID]->Write(pData, pInstrData->dwParam1, NULL);
|
|
ulTime = sw.Read();
|
|
|
|
Log (m_aInstructions[pInstrData->ulInstrID].szPrintName, hr);
|
|
m_piMalloc->Free(pData);
|
|
|
|
return ulTime;
|
|
}
|
|
|
|
|
|
TCHAR *CStorageParser::GetName_IStreamWrite(LPINSTRDATA pInstrData)
|
|
{
|
|
_stscanf(m_szBuffer, TEXT("IStream::Write %-8lu"), pInstrData->dwParam1);
|
|
return m_szBuffer;
|
|
}
|
|
|
|
|
|
/*
|
|
50000A5C::In CExposedStream::Read(xxxxxxxx, 1234, xxxxxxxx)
|
|
50000A5C::Out CExposedStream::Read(). ret == 0
|
|
*/
|
|
SCODE CStorageParser::Parse_IStreamRead(LPINSTRDATA pInstrData,
|
|
LPTSTR pszPart1,
|
|
LPTSTR pszPart2)
|
|
{
|
|
ULONG ulStreamID;
|
|
|
|
_stscanf(pszPart1, TEXT("%lx"), &ulStreamID);
|
|
_stscanf(pszPart1 + 45, TEXT("%lu"), &pInstrData->dwParam1);
|
|
|
|
pInstrData->ThisID = FindStreamID(ulStreamID);
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
ULONG CStorageParser::Execute_IStreamRead(LPINSTRDATA pInstrData)
|
|
{
|
|
CStopWatch sw;
|
|
ULONG ulTime;
|
|
HRESULT hr;
|
|
BYTE *pData;
|
|
|
|
pData = (BYTE *) m_piMalloc->Alloc(pInstrData->dwParam1);
|
|
if (pData == NULL)
|
|
{
|
|
Log(TEXT("Can't allocate memory for read"), E_OUTOFMEMORY);
|
|
return TEST_FAILED;
|
|
}
|
|
|
|
if (FAILED(CheckThisStreamID(pInstrData->ThisID)))
|
|
return TEST_FAILED;
|
|
|
|
sw.Reset();
|
|
hr = m_apStreams[pInstrData->ThisID]->Read(pData, pInstrData->dwParam1, NULL);
|
|
ulTime = sw.Read();
|
|
|
|
Log (m_aInstructions[pInstrData->ulInstrID].szPrintName, hr);
|
|
m_piMalloc->Free(pData);
|
|
|
|
return ulTime;
|
|
}
|
|
|
|
TCHAR *CStorageParser::GetName_IStreamRead(LPINSTRDATA pInstrData)
|
|
{
|
|
_stscanf(m_szBuffer, TEXT("IStream::Read %-8lu"), pInstrData->dwParam1);
|
|
return m_szBuffer;
|
|
}
|
|
|
|
/*
|
|
50000A5C::In CExposedStream::Seek(0, 1234, xxxxxxxx)
|
|
50000A5C::Out CExposedStream::Seek(). ulPos == %lu, ret == 0
|
|
*/
|
|
SCODE CStorageParser::Parse_IStreamSeek(LPINSTRDATA pInstrData,
|
|
LPTSTR pszPart1,
|
|
LPTSTR pszPart2)
|
|
{
|
|
ULONG ulStreamID;
|
|
|
|
_stscanf(pszPart1, TEXT("%lx"), &ulStreamID);
|
|
_stscanf(pszPart1 + 35, TEXT("%ld, %lu"),
|
|
&pInstrData->dwParam1, &pInstrData->dwParam2);
|
|
|
|
pInstrData->ThisID = FindStreamID(ulStreamID);
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
ULONG CStorageParser::Execute_IStreamSeek(LPINSTRDATA pInstrData)
|
|
{
|
|
CStopWatch sw;
|
|
ULONG ulTime;
|
|
HRESULT hr;
|
|
LARGE_INTEGER liSize;
|
|
|
|
if (FAILED(CheckThisStreamID(pInstrData->ThisID)))
|
|
return TEST_FAILED;
|
|
|
|
LISet32(liSize, pInstrData->dwParam1);
|
|
|
|
sw.Reset();
|
|
hr = m_apStreams[pInstrData->ThisID]->Seek(liSize,
|
|
pInstrData->dwParam2,
|
|
NULL);
|
|
ulTime = sw.Read();
|
|
|
|
Log (m_aInstructions[pInstrData->ulInstrID].szPrintName, hr);
|
|
|
|
return ulTime;
|
|
}
|
|
|
|
TCHAR *CStorageParser::GetName_IStreamSeek(LPINSTRDATA pInstrData)
|
|
{
|
|
_stscanf(m_szBuffer, TEXT("IStream::Seek %lu %lu"),
|
|
pInstrData->dwParam1, pInstrData->dwParam2);
|
|
|
|
return m_szBuffer;
|
|
}
|
|
|
|
|
|
/*
|
|
500074A4::In CExposedStream::Clone(0012DCE8)
|
|
500074A4::Out CExposedStream::Clone(). *ppstm == 50007324, ret == 0
|
|
*/
|
|
SCODE CStorageParser::Parse_IStreamClone(LPINSTRDATA pInstrData,
|
|
LPTSTR pszPart1,
|
|
LPTSTR pszPart2)
|
|
{
|
|
ULONG ulStreamID1;
|
|
ULONG ulStreamID2;
|
|
|
|
_stscanf(pszPart1, TEXT("%lx"), &ulStreamID1);
|
|
_stscanf(pszPart2 + 50, TEXT("%lx"), &ulStreamID2);
|
|
|
|
pInstrData->ThisID = FindStreamID(ulStreamID1);
|
|
pInstrData->OutID = FindStreamID(ulStreamID2);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
ULONG CStorageParser::Execute_IStreamClone(LPINSTRDATA pInstrData)
|
|
{
|
|
CStopWatch sw;
|
|
ULONG ulTime;
|
|
HRESULT hr;
|
|
|
|
if (FAILED(CheckThisStreamID(pInstrData->ThisID)))
|
|
return TEST_FAILED;
|
|
|
|
sw.Reset();
|
|
hr = m_apStreams[pInstrData->ThisID]->Clone(&m_apStreams[pInstrData->OutID]);
|
|
ulTime = sw.Read();
|
|
|
|
Log(m_aInstructions[pInstrData->ulInstrID].szPrintName, hr);
|
|
return ulTime;
|
|
}
|
|
|
|
/*
|
|
50000A5C::In CExposedStream::Stat(xxxxxxxx)
|
|
50000A5C::Out CExposedStream::Stat). ret == 0
|
|
*/
|
|
SCODE CStorageParser::Parse_IStreamStat(LPINSTRDATA pInstrData,
|
|
LPTSTR pszPart1,
|
|
LPTSTR pszPart2)
|
|
{
|
|
ULONG ulStreamID;
|
|
|
|
_stscanf(pszPart1, TEXT("%lx"), &ulStreamID);
|
|
|
|
pInstrData->ThisID = FindStreamID(ulStreamID);
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
ULONG CStorageParser::Execute_IStreamStat(LPINSTRDATA pInstrData)
|
|
{
|
|
CStopWatch sw;
|
|
ULONG ulTime;
|
|
HRESULT hr;
|
|
STATSTG StatStg;
|
|
|
|
if (FAILED(CheckThisStreamID(pInstrData->ThisID)))
|
|
return TEST_FAILED;
|
|
|
|
|
|
sw.Reset();
|
|
hr = m_apStreams[pInstrData->ThisID]->Stat(&StatStg, STATFLAG_NONAME);
|
|
ulTime = sw.Read();
|
|
|
|
Log (m_aInstructions[pInstrData->ulInstrID].szPrintName, hr);
|
|
|
|
return ulTime;
|
|
}
|