windows-nt/Source/XPSP1/NT/com/ole32/stg/props/nffdrt/main.cxx

569 lines
13 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
#include "pch.hxx"
#include "tbtest.hxx"
#define OPEN 1
#define CREATE 2
extern "C" CLSID CLSID_ThumbnailUpdater;
EXTERN_C const IID IID_IFlatStorage = { /* b29d6138-b92f-11d1-83ee-00c04fc2c6d4 */
0xb29d6138,
0xb92f,
0x11d1,
{0x83, 0xee, 0x00, 0xc0, 0x4f, 0xc2, 0xc6, 0xd4}
};
void
Call_CreateUpdater(REFIID riid, void** ppv)
{
HRESULT sc;
sc = CoCreateInstance(CLSID_ThumbnailUpdater,
NULL,
CLSCTX_INPROC_SERVER,
riid,
ppv);
if(FAILED(sc))
{
printf("CoCreateInstance of Thumbnaile Updater failed %x\n", sc);
exit(0);
}
}
HRESULT
Call_IFilterStatus(IFilterStatus *pIFS,
WCHAR * pwszFileName)
{
HRESULT sc;
sc = pIFS->PreFilter(pwszFileName);
if(FAILED(sc))
{
printf("PreFilter returned %x\n", sc);
exit(0);
}
return S_OK;
}
HRESULT
Call_CheckTime()
{
FILETIME mtime, ctime, atime;
DWORD rc;
HANDLE hFile;
hFile = CreateFile( g_tszFileName,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if(INVALID_HANDLE_VALUE == hFile)
{
printf("CheckTime File Open error %x\n", GetLastError());
return S_OK;
}
if(!GetFileTime(hFile, &ctime, &atime, &mtime))
{
printf("GetFileTime Failed %x\n", GetLastError());
exit(0);
}
CloseHandle(hFile);
printf("file ctime=%x:%x, atime=%x:%x, mtime=%x:%x\n", ctime, atime, mtime);
return S_OK;
}
IStorage *
Call_CreateOplockStorageFile(DWORD mode)
{
IOplockStorage *pIOpStg;
IStorage *pstg;
HRESULT sc;
Call_CreateUpdater(IID_IOplockStorage, (void**)&pIOpStg);
switch(mode)
{
case CREATE:
sc = pIOpStg->CreateStorageEx(
g_tszFileName,
STGM_CREATE | STGM_READWRITE | STGM_SHARE_EXCLUSIVE,
STGFMT_FILE,
0,
IID_IFlatStorage,
(void**)&pstg);
break;
case OPEN:
sc = pIOpStg->OpenStorageEx(
g_tszFileName,
STGM_READWRITE | STGM_SHARE_EXCLUSIVE,
STGFMT_FILE,
0,
IID_IFlatStorage,
(void**)&pstg);
break;
default:
printf("Bad file open mode\n");
exit(0);
break;
}
if(FAILED(sc))
{
printf("IOplockStorage::{Create/Open}StorageEx failed %x\n", sc);
exit(0);
}
if(NULL != pIOpStg)
pIOpStg->Release();
return pstg;
}
IStorage *
Call_CreateStorageFile(DWORD mode)
{
HRESULT hr;
IStorage *pstg;
DWORD stgfmt = STGFMT_FILE;
if(g_AnyStorage)
stgfmt = STGFMT_ANY;
switch(mode)
{
case CREATE:
hr = StgCreateStorageEx(
g_tszFileName,
STGM_CREATE | STGM_READWRITE | STGM_SHARE_EXCLUSIVE,
stgfmt,
0,0,0,
IID_IFlatStorage,
(void**)&pstg);
break;
case OPEN:
hr = StgOpenStorageEx(
g_tszFileName,
STGM_READWRITE | STGM_SHARE_EXCLUSIVE,
stgfmt,
0,0,0,
IID_IFlatStorage,
(void**)&pstg);
break;
default:
printf("Bad file open mode\n");
exit(0);
break;
}
if(FAILED(hr))
{
printf("Stg{Create/Open}StorageEx failed %x\n", hr);
exit(0);
}
return pstg;
}
CLSID CLSID_JunkClassFile = { /* ce8103fd-905b-11d1-83eb-00c04fc2c6d4 */
0xce8103fd,
0x905b,
0x11d1,
{0x83, 0xeb, 0x00, 0xc0, 0x4f, 0xc2, 0xc6, 0xd4}
};
void
Call_SetClass(IStorage *pstg)
{
HRESULT sc;
sc = pstg->SetClass(CLSID_JunkClassFile);
if(FAILED(sc))
{
printf("SetClass Failed %x\n", sc);
exit(0);
}
}
void
Call_Stat(
IStorage *pstg,
STATSTG *pstat)
{
HRESULT sc;
sc = pstg->Stat(pstat, 0);
if(FAILED(sc))
{
printf("Stat failed %x\n");
exit(0);
}
printf("Pathname is: %ws\n", pstat->pwcsName);
if( IsEqualGUID(pstat->clsid, CLSID_JunkClassFile) )
printf("Class GUID is OK\n");
else if( IsEqualGUID(pstat->clsid, CLSID_NULL) )
printf("Class GUID is NULL_CLSID\n");
else
printf("Class GUID is not the JunkClassGuid!!\n");
}
void
Call_QI(IUnknown *punk, REFIID riid, void **pv)
{
HRESULT hr;
hr = punk->QueryInterface(riid, pv);
if(FAILED(hr))
{
printf("QI failed %x\n", hr);
exit(0);
}
}
IStream *
Call_OpenStream(IStorage *pstg, DWORD grfMode, int num)
{
WCHAR name[80];
IStream *pstm;
HRESULT hr;
wsprintf(name, L"%02d", num);
if(grfMode & STGM_CREATE)
{
hr = pstg->CreateStream(name, grfMode|STGM_SHARE_EXCLUSIVE, 0, 0, &pstm);
}
else
{
hr = pstg->OpenStream(name, 0, grfMode|STGM_SHARE_EXCLUSIVE, 0, &pstm);
}
if(FAILED(hr))
{
printf("CreateStream(%s) failed %x\n", name, hr);
exit(0);
}
return pstm;
}
IStream *
Call_OpenCONTENTSStream(IStorage *pstg)
{
IStream *pstm;
HRESULT hr;
hr = pstg->OpenStream(L"CONTENTS", 0,
STGM_READ | STGM_SHARE_EXCLUSIVE,
0,
&pstm);
if(FAILED(hr) || NULL == pstm)
{
printf("OpenContentStream failed %x\n", hr);
exit(0);
}
return pstm;
}
IPropertyStorage *
Call_OpenPropStg(IStorage *pstg, DWORD mode, REFFMTID fmtid )
{
IPropertySetStorage *ppropsetstg = NULL;
IPropertyStorage *ppropstg = NULL;
HRESULT hr = S_OK;
hr = pstg->QueryInterface( IID_IPropertySetStorage, (void**)&ppropsetstg );
if( FAILED(hr) )
{
printf( "QI for IPropertySetStorage failed %x\n", hr );
exit(0);
}
switch(mode)
{
case CREATE:
hr = ppropsetstg->Create(fmtid, NULL,
PROPSETFLAG_DEFAULT,
STGM_CREATE | STGM_READWRITE | STGM_SHARE_EXCLUSIVE,
&ppropstg );
break;
case OPEN:
hr = ppropsetstg->Open(fmtid,
STGM_READWRITE | STGM_SHARE_EXCLUSIVE,
&ppropstg );
break;
default:
printf("Bad file open mode\n");
exit(0);
break;
}
if(FAILED(hr))
{
printf("OpenPropStg failed %x\n", hr);
exit(0);
}
if( NULL != ppropsetstg )
ppropsetstg->Release();
return ppropstg;
}
void
Call_SuppressChanges(ITimeAndNoticeControl *ptnc)
{
HRESULT hr;
hr = ptnc->SuppressChanges(0, 0);
if(FAILED(hr))
{
printf("SuppressChanges failed %x\n", hr);
exit(0);
}
printf("--------SuppressChanges called\n");
}
void
TestPause(char * sz)
{
if(g_Pause)
{
printf("Before %s: press <return> to continue.", sz);
getchar();
}
}
EXTERN_C void
__cdecl
wmain(
int argc,
WCHAR **argv)
{
IStorage *pstg=NULL;
ITimeAndNoticeControl *ptnc=NULL;
IFilterStatus *pIFS=NULL;
DWORD fOpenMode;
STATSTG stat;
LONG cRefs;
CoInitialize(NULL);
ParseArgs(argc, argv);
if(g_CheckTime)
Call_CheckTime();
if(g_CheckIsStg)
printf("StgIsStorageFile = %x\n", StgIsStorageFile(g_tszFileName));
if(g_UseUpdater)
{
Call_CreateUpdater(IID_IFilterStatus, (void**)&pIFS);
Call_IFilterStatus(pIFS, g_tszFileName);
pIFS->Release();
}
else if(!g_NoOpenStg)
{
if(g_CreateStg)
fOpenMode = CREATE;
else
fOpenMode = OPEN;
if(g_OplockFile)
pstg = Call_CreateOplockStorageFile(fOpenMode);
else
pstg = Call_CreateStorageFile(fOpenMode);
if(g_AddRefStg)
{
pstg->AddRef();
pstg->Release();
}
if(g_SuppressTime)
{
Call_QI(pstg, IID_ITimeAndNoticeControl, (void**)&ptnc);
Call_SuppressChanges(ptnc);
ptnc->Release();
}
if(g_SetClass)
Call_SetClass(pstg);
if(g_Stat)
Call_Stat(pstg, &stat);
TestPause("OpenStream");
if(!g_NoOpenStm)
{
char readBuffer[1024];
ULONG cb, cbXfred;
IStream *pstm=NULL;
IStream *pstmContents=NULL;
IPropertyStorage *ppropstg=NULL;
PROPSPEC propspec;
PROPVARIANT propvar;
HRESULT hr;
if(g_CreateStm)
{
pstm = Call_OpenStream(pstg, STGM_CREATE|STGM_READWRITE, 1);
ppropstg = Call_OpenPropStg(pstg, CREATE, FMTID_SummaryInformation);
}
else
{
pstm = Call_OpenStream(pstg, STGM_READWRITE, 1);
pstmContents = Call_OpenCONTENTSStream(pstg);
ppropstg = Call_OpenPropStg(pstg, OPEN, FMTID_SummaryInformation);
}
if(g_AddRefStm)
{
pstm->AddRef();
pstm->Release();
}
if( g_ReleaseStg )
{
pstg->Release();
pstg = NULL;
}
if(g_WriteStm)
{
TestPause("WriteStream");
hr = pstm->Write((void*)"First ", 6, &cbXfred);
if(FAILED(hr))
{
printf("First Write Failed with %x\n", hr);
exit(0);
}
hr = pstm->Write((void*)"Second", 6, &cb);
if(FAILED(hr))
{
printf("Second Write Failed with %x\n", hr);
exit(0);
}
printf("Wrote %d bytes, in two pieces\n", cbXfred+cb);
propspec.ulKind = PRSPEC_PROPID;
propspec.propid = PIDSI_TITLE;
propvar.vt = VT_LPSTR;
propvar.pszVal = "My Title";
hr = ppropstg->WriteMultiple( 1, &propspec, &propvar, PID_FIRST_USABLE );
if(FAILED(hr))
{
printf( "First WriteMultiple failed with %x\n", hr );
exit(0);
}
propspec.propid = PIDSI_COMMENTS;
propvar.pszVal = "My Comments";
hr = ppropstg->WriteMultiple( 1, &propspec, &propvar, PID_FIRST_USABLE );
if(FAILED(hr))
{
printf( "Second WriteMultiple failed with %x\n", hr );
exit(0);
}
printf("Wrote two properties\n");
}
if(g_ReadStm)
{
TestPause("ReadStream");
hr = pstm->Read((void*)readBuffer, sizeof(readBuffer), &cbXfred);
if(FAILED(hr))
{
printf("Read Failed with %x\n", hr);
exit(0);
}
readBuffer[cbXfred] = '\0';
printf("Read %d bytes: \"%s\"\n", cbXfred, readBuffer);
propspec.ulKind = PRSPEC_PROPID;
propspec.propid = PIDSI_TITLE;
hr = ppropstg->ReadMultiple( 1, &propspec, &propvar );
if(FAILED(hr))
{
printf("ReadMultiple failed with %x\n", hr );
exit(0);
}
printf("ReadMultiple the title: \"%s\"\n", propvar.pszVal );
PropVariantClear(&propvar);
}
if(NULL != pstm)
{
if( 0 != (cRefs = pstm->Release()))
printf("Last release of the Stream and still %d References!!\n", cRefs);
pstm = NULL;
}
if(NULL != pstmContents)
{
if(0 != (cRefs = pstmContents->Release()))
printf("Last release of the PropertyStorage and still %d References!!\n", cRefs);
pstmContents = NULL;
}
if(NULL != ppropstg)
{
if(0 != (cRefs = ppropstg->Release()))
printf("Last release of the PropertyStorage and still %d References!!\n", cRefs);
ppropstg = NULL;
}
}
if(NULL != pstg)
{
TestPause("Last Release");
if(0 != (cRefs = pstg->Release()))
{
printf("Last release of the Storage and still %d References!!\n", cRefs);
}
pstg = NULL;
}
}
if(g_CheckTime)
Call_CheckTime();
CoUninitialize();
exit(0);
}