Нужно открыть оле хранилище с помощью фасма (просто сейчас под рукой нет других компиляторов, да если бы и были, то я всё равно ничего не понял из MSDN). Ну, если хранилище я, может, с горем пополам открою, но вот как прочитать потоки я не представляю.... Честно говоря, я даже не знаю какие там потоки и как они называются, поэтому не знаю как их открыть. Подытожим: 1. Мне надо открыть хранилище 2. Получить список потоков 3. Прочитать поток, который мне надо P.S.: Реверсил программу на С++ и не понял ничего...
StgOpenStorage. На выходе получиш указатель на интерфейс IStorage. Дальше читай MSDN http://msdn.microsoft.com/en-us/library/aa380015(VS.85).aspx В частности, получить список потоков и вложеных хранилищ можно вызовом IStorage:: EnumElements Открыть поток - IStorage::OpenStream
Спасибо конечно, но это не совсем то, что мне надо. Но к счастью сработал закон форума (стоит тебе запостить что-нибудь на форуме и ты сразу сам найдёшь всё что тебе нужно). Вот ссылка http://netcode.ru/cpp/?lang=&katID=6&skatID=65&artID=2718. Там хороший разбор формата!
Недавно снова пришлось обращаться к ОЛЕ через асм, и я вспомнил про этот пост. Решил запостить потому, что подумал, что может пригодиться кому-нибудь кто наконец-то решит воспользоваться поиском на васме. В первый раз я написал свой собственный ридер на асме, чтобы читать из ОЛЕ-хранилищ. Во второй раз решил всё-таки разобраться как же работают эти ф-ии в С++. Выяснилось, что это обычный ком. А значить им можно пользоваться без особых проблем. Вот я и перевёл все интерфейсы в формат понятный фасм. Лично я предпочитаю не пользоваться этими ф-ями в "сыром" виде и поэтому написал для себя макросы, которые заметно облегчают жизнь (макросов тут нет). Удачи! Код (Text): interface ICompound,\ QueryInterface,\ AddRef,\ Release,\ CreateStream,\ OpenStream,\ CreateStorage,\ OpenStorage,\ CopyTo,\ MoveElementTo,\ Commit,\ Revert,\ EnumElements,\ DestroyElement,\ RenameElement,\ SetElementTimes,\ SetClass,\ SetStateBits,\ Stat interface IEnum,\ QueryInterface,\ AddRef,\ Release,\ Next,\ Skip,\ Reset,\ Clone interface IStream,\ QueryInterface,\ AddRef,\ Release,\ Read,\ Write,\ Seek,\ SetSize,\ CopyTo,\ Commit,\ Revert,\ LockRegion,\ UnlockRegion,\ Stat,\ Clone struct GUID .Data1 dd ? .Data2 dw ? .Data3 dw ? .Data4 db ?,?,?,?,?,?,?,? ends struct ULARGE_INTEGER LowPart dd ? HighPart dd ? ends struct STATSTG pwcsName dd ? type dd ? cbsize ULARGE_INTEGER mtime FILETIME ctime FILETIME atime FILETIME grfMode dd ? grfLocksSupported dd ? clsid GUID grfStateBits dd ? reserved dd ? ends STGM_READ equ 0 STGM_SHARE_EXCLUSIVE equ 10h S_OK equ 0 ; typedef struct tagSTATSTG ; { ; LPOLESTR pwcsName; ; DWORD type; ; ULARGE_INTEGER cbSize; ; FILETIME mtime; ; FILETIME ctime; ; FILETIME atime; ; DWORD grfMode; ; DWORD grfLocksSupported; ; CLSID clsid; ; DWORD grfStateBits; ; DWORD reserved; ; } STATSTG; ; typedef union _ULARGE_INTEGER { ; struct { ; DWORD LowPart; ; DWORD HighPart; ; }; ; struct { ; DWORD LowPart; ; DWORD HighPart; ; } u; ; #endif //MIDL_PASS ; ULONGLONG QuadPart; ; } ULARGE_INTEGER; ; typedef struct IStorageVtbl ; { ; BEGIN_INTERFACE ; HRESULT ( STDMETHODCALLTYPE *QueryInterface )( ; IStorage * This, ; /* [in] */ __RPC__in REFIID riid, ; /* [iid_is][out] */ ; __RPC__deref_out void **ppvObject); ; ULONG ( STDMETHODCALLTYPE *AddRef )( ; IStorage * This); ; ULONG ( STDMETHODCALLTYPE *Release )( ; IStorage * This); ; HRESULT ( STDMETHODCALLTYPE *CreateStream )( ; IStorage * This, ; /* [string][in] */ __RPC__in const OLECHAR *pwcsName, ; /* [in] */ DWORD grfMode, ; /* [in] */ DWORD reserved1, ; /* [in] */ DWORD reserved2, ; /* [out] */ __RPC__deref_out_opt IStream **ppstm); ; /* [local] */ HRESULT ( STDMETHODCALLTYPE *OpenStream )( ; IStorage * This, ; /* [string][in] */ const OLECHAR *pwcsName, ; /* [unique][in] */ void *reserved1, ; /* [in] */ DWORD grfMode, ; /* [in] */ DWORD reserved2, ; /* [out] */ IStream **ppstm); ; HRESULT ( STDMETHODCALLTYPE *CreateStorage )( ; IStorage * This, ; /* [string][in] */ __RPC__in const OLECHAR *pwcsName, ; /* [in] */ DWORD grfMode, ; /* [in] */ DWORD reserved1, ; /* [in] */ DWORD reserved2, ; /* [out] */ __RPC__deref_out_opt IStorage **ppstg); ; HRESULT ( STDMETHODCALLTYPE *OpenStorage )( ; IStorage * This, ; /* [string][unique][in] */ __RPC__in_opt const OLECHAR *pwcsName, ; /* [unique][in] */ __RPC__in_opt IStorage *pstgPriority, ; /* [in] */ DWORD grfMode, ; /* [unique][in] */ __RPC__deref_opt_in_opt SNB snbExclude, ; /* [in] */ DWORD reserved, ; /* [out] */ __RPC__deref_out_opt IStorage **ppstg); ; /* [local] */ HRESULT ( STDMETHODCALLTYPE *CopyTo )( ; IStorage * This, ; /* [in] */ DWORD ciidExclude, ; /* [size_is][unique][in] */ const IID *rgiidExclude, ; /* [unique][in] */ SNB snbExclude, ; /* [unique][in] */ IStorage *pstgDest); ; HRESULT ( STDMETHODCALLTYPE *MoveElementTo )( ; IStorage * This, ; /* [string][in] */ __RPC__in const OLECHAR *pwcsName, ; /* [unique][in] */ __RPC__in_opt IStorage *pstgDest, ; /* [string][in] */ __RPC__in const OLECHAR *pwcsNewName, ; /* [in] */ DWORD grfFlags); ; HRESULT ( STDMETHODCALLTYPE *Commit )( ; IStorage * This, ; /* [in] */ DWORD grfCommitFlags); ; HRESULT ( STDMETHODCALLTYPE *Revert )( ; IStorage * This); ; /* [local] */ HRESULT ( STDMETHODCALLTYPE *EnumElements )( ; IStorage * This, ; /* [in] */ DWORD reserved1, ; /* [size_is][unique][in] */ void *reserved2, ; /* [in] */ DWORD reserved3, ; /* [out] */ IEnumSTATSTG **ppenum); ; HRESULT ( STDMETHODCALLTYPE *DestroyElement )( ; IStorage * This, ; /* [string][in] */ __RPC__in const OLECHAR *pwcsName); ; HRESULT ( STDMETHODCALLTYPE *RenameElement )( ; IStorage * This, ; /* [string][in] */ __RPC__in const OLECHAR *pwcsOldName, ; /* [string][in] */ __RPC__in const OLECHAR *pwcsNewName); ; HRESULT ( STDMETHODCALLTYPE *SetElementTimes )( ; IStorage * This, ; /* [string][unique][in] */ __RPC__in_opt const OLECHAR *pwcsName, ; /* [unique][in] */ __RPC__in_opt const FILETIME *pctime, ; /* [unique][in] */ __RPC__in_opt const FILETIME *patime, ; /* [unique][in] */ __RPC__in_opt const FILETIME *pmtime); ; HRESULT ( STDMETHODCALLTYPE *SetClass )( ; IStorage * This, ; /* [in] */ __RPC__in REFCLSID clsid); ; HRESULT ( STDMETHODCALLTYPE *SetStateBits )( ; IStorage * This, ; /* [in] */ DWORD grfStateBits, ; /* [in] */ DWORD grfMask); ; HRESULT ( STDMETHODCALLTYPE *Stat )( ; IStorage * This, ; /* [out] */ __RPC__out STATSTG *pstatstg, ; /* [in] */ DWORD grfStatFlag); ; END_INTERFACE ; } IStorageVtbl; ; interface IStorage ; { ; CONST_VTBL struct IStorageVtbl *lpVtbl; ; }; ; typedef struct IEnumUnknownVtbl ; { ; BEGIN_INTERFACE ; HRESULT ( STDMETHODCALLTYPE *QueryInterface )( ; IEnumUnknown * This, ; /* [in] */ __RPC__in REFIID riid, ; /* [iid_is][out] */ ; __RPC__deref_out void **ppvObject); ; ULONG ( STDMETHODCALLTYPE *AddRef )( ; IEnumUnknown * This); ; ULONG ( STDMETHODCALLTYPE *Release )( ; IEnumUnknown * This); ; /* [local] */ HRESULT ( STDMETHODCALLTYPE *Next )( ; IEnumUnknown * This, ; /* [in] */ ULONG celt, ; /* [out] */ IUnknown **rgelt, ; /* [out] */ ULONG *pceltFetched); ; HRESULT ( STDMETHODCALLTYPE *Skip )( ; IEnumUnknown * This, ; /* [in] */ ULONG celt); ; HRESULT ( STDMETHODCALLTYPE *Reset )( ; IEnumUnknown * This); ; HRESULT ( STDMETHODCALLTYPE *Clone )( ; IEnumUnknown * This, ; /* [out] */ __RPC__deref_out_opt IEnumUnknown **ppenum); ; END_INTERFACE ; } IEnumUnknownVtbl; ; typedef struct IStreamVtbl ; { ; BEGIN_INTERFACE ; HRESULT ( STDMETHODCALLTYPE *QueryInterface )( ; IStream * This, ; /* [in] */ __RPC__in REFIID riid, ; /* [iid_is][out] */ ; __RPC__deref_out void **ppvObject); ; ULONG ( STDMETHODCALLTYPE *AddRef )( ; IStream * This); ; ULONG ( STDMETHODCALLTYPE *Release )( ; IStream * This); ; /* [local] */ HRESULT ( STDMETHODCALLTYPE *Read )( ; IStream * This, ; /* [length_is][size_is][out] */ void *pv, ; /* [in] */ ULONG cb, ; /* [out] */ ULONG *pcbRead); ; /* [local] */ HRESULT ( STDMETHODCALLTYPE *Write )( ; IStream * This, ; /* [size_is][in] */ const void *pv, ; /* [in] */ ULONG cb, ; /* [out] */ ULONG *pcbWritten); ; /* [local] */ HRESULT ( STDMETHODCALLTYPE *Seek )( ; IStream * This, ; /* [in] */ LARGE_INTEGER dlibMove, ; /* [in] */ DWORD dwOrigin, ; /* [out] */ ULARGE_INTEGER *plibNewPosition); ; HRESULT ( STDMETHODCALLTYPE *SetSize )( ; IStream * This, ; /* [in] */ ULARGE_INTEGER libNewSize); ; /* [local] */ HRESULT ( STDMETHODCALLTYPE *CopyTo )( ; IStream * This, ; /* [unique][in] */ IStream *pstm, ; /* [in] */ ULARGE_INTEGER cb, ; /* [out] */ ULARGE_INTEGER *pcbRead, ; /* [out] */ ULARGE_INTEGER *pcbWritten); ; HRESULT ( STDMETHODCALLTYPE *Commit )( ; IStream * This, ; /* [in] */ DWORD grfCommitFlags); ; HRESULT ( STDMETHODCALLTYPE *Revert )( ; IStream * This); ; HRESULT ( STDMETHODCALLTYPE *LockRegion )( ; IStream * This, ; /* [in] */ ULARGE_INTEGER libOffset, ; /* [in] */ ULARGE_INTEGER cb, ; /* [in] */ DWORD dwLockType); ; HRESULT ( STDMETHODCALLTYPE *UnlockRegion )( ; IStream * This, ; /* [in] */ ULARGE_INTEGER libOffset, ; /* [in] */ ULARGE_INTEGER cb, ; /* [in] */ DWORD dwLockType); ; HRESULT ( STDMETHODCALLTYPE *Stat )( ; IStream * This, ; /* [out] */ __RPC__out STATSTG *pstatstg, ; /* [in] */ DWORD grfStatFlag); ; HRESULT ( STDMETHODCALLTYPE *Clone )( ; IStream * This, ; /* [out] */ __RPC__deref_out_opt IStream **ppstm); ; END_INTERFACE ; } IStreamVtbl;