From 2cab7fc06dced977b5166d0b8b913dfd01ab6032 Mon Sep 17 00:00:00 2001 From: Vincent Povirk Date: Mon, 23 Nov 2009 15:39:35 -0600 Subject: [PATCH 1/2] ole32: Copy the storage filename at stat time, not read time. --- dlls/ole32/stg_stream.c | 3 ++- dlls/ole32/storage32.c | 31 +++++++++++++++++++++---------- dlls/ole32/storage32.h | 4 ++-- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/dlls/ole32/stg_stream.c b/dlls/ole32/stg_stream.c index 8b731dd..332ee8a 100644 --- a/dlls/ole32/stg_stream.c +++ b/dlls/ole32/stg_stream.c @@ -860,7 +860,8 @@ static HRESULT WINAPI StgStreamImpl_Stat( { StorageImpl *root = This->parentStorage->ancestorStorage; - StorageUtl_CopyDirEntryToSTATSTG(pstatstg, + StorageUtl_CopyDirEntryToSTATSTG(root, + pstatstg, ¤tEntry, grfStatFlag); diff --git a/dlls/ole32/storage32.c b/dlls/ole32/storage32.c index 708f263..eb5ed5d 100644 --- a/dlls/ole32/storage32.c +++ b/dlls/ole32/storage32.c @@ -698,6 +698,7 @@ static HRESULT WINAPI StorageBaseImpl_Stat( if (readSuccessful) { StorageUtl_CopyDirEntryToSTATSTG( + This->ancestorStorage, pstatstg, ¤tEntry, grfStatFlag); @@ -3241,14 +3242,10 @@ BOOL StorageImpl_ReadDirEntry( if (SUCCEEDED(readRes)) { - /* replace the name of root entry (often "Root Entry") by the file name */ - WCHAR *entryName = (index == This->base.storageDirEntry) ? - This->filename : (WCHAR *)currentEntry+OFFSET_PS_NAME; - memset(buffer->name, 0, sizeof(buffer->name)); memcpy( buffer->name, - entryName, + (WCHAR *)currentEntry+OFFSET_PS_NAME, DIRENTRY_NAME_BUFFER_LEN ); TRACE("storage name: %s\n", debugstr_w(buffer->name)); @@ -3750,7 +3747,8 @@ static HRESULT WINAPI IEnumSTATSTGImpl_Next( /* * Copy the information to the return buffer. */ - StorageUtl_CopyDirEntryToSTATSTG(currentReturnStruct, + StorageUtl_CopyDirEntryToSTATSTG(This->parentStorage, + currentReturnStruct, ¤tEntry, STATFLAG_DEFAULT); @@ -4179,25 +4177,38 @@ void StorageUtl_WriteGUID(BYTE* buffer, ULONG offset, const GUID* value) } void StorageUtl_CopyDirEntryToSTATSTG( + StorageImpl* storage, STATSTG* destination, const DirEntry* source, int statFlags) { + LPCWSTR entryName; + + if (source->stgType == STGTY_ROOT) + { + /* replace the name of root entry (often "Root Entry") by the file name */ + entryName = storage->filename; + } + else + { + entryName = source->name; + } + /* * The copy of the string occurs only when the flag is not set */ if( ((statFlags & STATFLAG_NONAME) != 0) || - (source->name == NULL) || - (source->name[0] == 0) ) + (entryName == NULL) || + (entryName[0] == 0) ) { destination->pwcsName = 0; } else { destination->pwcsName = - CoTaskMemAlloc((lstrlenW(source->name)+1)*sizeof(WCHAR)); + CoTaskMemAlloc((lstrlenW(entryName)+1)*sizeof(WCHAR)); - strcpyW(destination->pwcsName, source->name); + strcpyW(destination->pwcsName, entryName); } switch (source->stgType) diff --git a/dlls/ole32/storage32.h b/dlls/ole32/storage32.h index 4a953c1..508bd70 100644 --- a/dlls/ole32/storage32.h +++ b/dlls/ole32/storage32.h @@ -428,8 +428,8 @@ void StorageUtl_WriteULargeInteger(BYTE* buffer, ULONG offset, const ULARGE_INTEGER *value); void StorageUtl_ReadGUID(const BYTE* buffer, ULONG offset, GUID* value); void StorageUtl_WriteGUID(BYTE* buffer, ULONG offset, const GUID* value); -void StorageUtl_CopyDirEntryToSTATSTG(STATSTG* destination, const DirEntry* source, - int statFlags); +void StorageUtl_CopyDirEntryToSTATSTG(StorageImpl *storage,STATSTG* destination, + const DirEntry* source, int statFlags); /**************************************************************************** * BlockChainStream definitions. -- 1.6.3.3