StgOpenStorage. Требуется помощь по открытию ОЛЕ хранилища на фасме.

Тема в разделе "WASM.ASSEMBLER", создана пользователем Z3N, 10 фев 2009.

  1. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Нужно открыть оле хранилище с помощью фасма (просто сейчас под рукой нет других компиляторов, да если бы и были, то я всё равно ничего не понял из MSDN). Ну, если хранилище я, может, с горем пополам открою, но вот как прочитать потоки я не представляю.... Честно говоря, я даже не знаю какие там потоки и как они называются, поэтому не знаю как их открыть. Подытожим:
    1. Мне надо открыть хранилище
    2. Получить список потоков
    3. Прочитать поток, который мне надо

    P.S.: Реверсил программу на С++ и не понял ничего...
     
  2. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    StgOpenStorage. На выходе получиш указатель на интерфейс IStorage.
    Дальше читай MSDN http://msdn.microsoft.com/en-us/library/aa380015(VS.85).aspx
    В частности, получить список потоков и вложеных хранилищ можно вызовом IStorage:: EnumElements
    Открыть поток - IStorage::OpenStream
     
  3. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Спасибо конечно, но это не совсем то, что мне надо.
    Но к счастью сработал закон форума (стоит тебе запостить что-нибудь на форуме и ты сразу сам найдёшь всё что тебе нужно).
    Вот ссылка http://netcode.ru/cpp/?lang=&katID=6&skatID=65&artID=2718. Там хороший разбор формата!
     
  4. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Недавно снова пришлось обращаться к ОЛЕ через асм, и я вспомнил про этот пост.
    Решил запостить потому, что подумал, что может пригодиться кому-нибудь кто наконец-то решит воспользоваться поиском на васме.

    В первый раз я написал свой собственный ридер на асме, чтобы читать из ОЛЕ-хранилищ. Во второй раз решил всё-таки разобраться как же работают эти ф-ии в С++. Выяснилось, что это обычный ком. А значить им можно пользоваться без особых проблем. Вот я и перевёл все интерфейсы в формат понятный фасм.

    Лично я предпочитаю не пользоваться этими ф-ями в "сыром" виде и поэтому написал для себя макросы, которые заметно облегчают жизнь (макросов тут нет).
    Удачи!
    Код (Text):
    1. interface   ICompound,\
    2.         QueryInterface,\
    3.         AddRef,\
    4.         Release,\
    5.         CreateStream,\
    6.         OpenStream,\
    7.         CreateStorage,\
    8.         OpenStorage,\
    9.         CopyTo,\
    10.         MoveElementTo,\
    11.         Commit,\
    12.         Revert,\
    13.         EnumElements,\
    14.         DestroyElement,\
    15.         RenameElement,\
    16.         SetElementTimes,\
    17.         SetClass,\
    18.         SetStateBits,\
    19.         Stat
    20. interface   IEnum,\
    21.         QueryInterface,\
    22.         AddRef,\
    23.         Release,\
    24.         Next,\
    25.         Skip,\
    26.         Reset,\
    27.         Clone
    28. interface   IStream,\
    29.         QueryInterface,\
    30.         AddRef,\
    31.         Release,\
    32.         Read,\
    33.         Write,\
    34.         Seek,\
    35.         SetSize,\
    36.         CopyTo,\
    37.         Commit,\
    38.         Revert,\
    39.         LockRegion,\
    40.         UnlockRegion,\
    41.         Stat,\
    42.         Clone
    43. struct  GUID
    44.     .Data1      dd  ?
    45.     .Data2      dw  ?
    46.     .Data3      dw  ?
    47.     .Data4      db  ?,?,?,?,?,?,?,?
    48. ends
    49. struct  ULARGE_INTEGER
    50.     LowPart     dd  ?
    51.     HighPart    dd  ?
    52. ends
    53. struct  STATSTG
    54.     pwcsName            dd              ?
    55.     type                dd              ?
    56.     cbsize              ULARGE_INTEGER
    57.     mtime               FILETIME
    58.     ctime               FILETIME
    59.     atime               FILETIME
    60.     grfMode             dd              ?
    61.     grfLocksSupported   dd              ?
    62.     clsid               GUID
    63.     grfStateBits        dd              ?
    64.     reserved            dd              ?
    65. ends
    66. STGM_READ               equ             0
    67. STGM_SHARE_EXCLUSIVE    equ             10h
    68. S_OK                    equ             0
    69. ; typedef struct tagSTATSTG
    70.     ; {
    71.     ; LPOLESTR pwcsName;
    72.     ; DWORD type;
    73.     ; ULARGE_INTEGER cbSize;
    74.     ; FILETIME mtime;
    75.     ; FILETIME ctime;
    76.     ; FILETIME atime;
    77.     ; DWORD grfMode;
    78.     ; DWORD grfLocksSupported;
    79.     ; CLSID clsid;
    80.     ; DWORD grfStateBits;
    81.     ; DWORD reserved;
    82.     ; }     STATSTG;
    83. ; typedef union _ULARGE_INTEGER {
    84.     ; struct {
    85.         ; DWORD LowPart;
    86.         ; DWORD HighPart;
    87.     ; };
    88.     ; struct {
    89.         ; DWORD LowPart;
    90.         ; DWORD HighPart;
    91.     ; } u;
    92. ; #endif //MIDL_PASS
    93.     ; ULONGLONG QuadPart;
    94. ; } ULARGE_INTEGER;
    95.  ; typedef struct IStorageVtbl
    96.     ; {
    97.         ; BEGIN_INTERFACE
    98.        
    99.         ; HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
    100.             ; IStorage * This,
    101.             ; /* [in] */ __RPC__in REFIID riid,
    102.             ; /* [iid_is][out] */
    103.             ; __RPC__deref_out  void **ppvObject);
    104.        
    105.         ; ULONG ( STDMETHODCALLTYPE *AddRef )(
    106.             ; IStorage * This);
    107.        
    108.         ; ULONG ( STDMETHODCALLTYPE *Release )(
    109.             ; IStorage * This);
    110.        
    111.         ; HRESULT ( STDMETHODCALLTYPE *CreateStream )(
    112.             ; IStorage * This,
    113.             ; /* [string][in] */ __RPC__in const OLECHAR *pwcsName,
    114.             ; /* [in] */ DWORD grfMode,
    115.             ; /* [in] */ DWORD reserved1,
    116.             ; /* [in] */ DWORD reserved2,
    117.             ; /* [out] */ __RPC__deref_out_opt IStream **ppstm);
    118.        
    119.         ; /* [local] */ HRESULT ( STDMETHODCALLTYPE *OpenStream )(
    120.             ; IStorage * This,
    121.             ; /* [string][in] */ const OLECHAR *pwcsName,
    122.             ; /* [unique][in] */ void *reserved1,
    123.             ; /* [in] */ DWORD grfMode,
    124.             ; /* [in] */ DWORD reserved2,
    125.             ; /* [out] */ IStream **ppstm);
    126.        
    127.         ; HRESULT ( STDMETHODCALLTYPE *CreateStorage )(
    128.             ; IStorage * This,
    129.             ; /* [string][in] */ __RPC__in const OLECHAR *pwcsName,
    130.             ; /* [in] */ DWORD grfMode,
    131.             ; /* [in] */ DWORD reserved1,
    132.             ; /* [in] */ DWORD reserved2,
    133.             ; /* [out] */ __RPC__deref_out_opt IStorage **ppstg);
    134.        
    135.         ; HRESULT ( STDMETHODCALLTYPE *OpenStorage )(
    136.             ; IStorage * This,
    137.             ; /* [string][unique][in] */ __RPC__in_opt const OLECHAR *pwcsName,
    138.             ; /* [unique][in] */ __RPC__in_opt IStorage *pstgPriority,
    139.             ; /* [in] */ DWORD grfMode,
    140.             ; /* [unique][in] */ __RPC__deref_opt_in_opt SNB snbExclude,
    141.             ; /* [in] */ DWORD reserved,
    142.             ; /* [out] */ __RPC__deref_out_opt IStorage **ppstg);
    143.        
    144.         ; /* [local] */ HRESULT ( STDMETHODCALLTYPE *CopyTo )(
    145.             ; IStorage * This,
    146.             ; /* [in] */ DWORD ciidExclude,
    147.             ; /* [size_is][unique][in] */ const IID *rgiidExclude,
    148.             ; /* [unique][in] */ SNB snbExclude,
    149.             ; /* [unique][in] */ IStorage *pstgDest);
    150.        
    151.         ; HRESULT ( STDMETHODCALLTYPE *MoveElementTo )(
    152.             ; IStorage * This,
    153.             ; /* [string][in] */ __RPC__in const OLECHAR *pwcsName,
    154.             ; /* [unique][in] */ __RPC__in_opt IStorage *pstgDest,
    155.             ; /* [string][in] */ __RPC__in const OLECHAR *pwcsNewName,
    156.             ; /* [in] */ DWORD grfFlags);
    157.        
    158.         ; HRESULT ( STDMETHODCALLTYPE *Commit )(
    159.             ; IStorage * This,
    160.             ; /* [in] */ DWORD grfCommitFlags);
    161.        
    162.         ; HRESULT ( STDMETHODCALLTYPE *Revert )(
    163.             ; IStorage * This);
    164.        
    165.         ; /* [local] */ HRESULT ( STDMETHODCALLTYPE *EnumElements )(
    166.             ; IStorage * This,
    167.             ; /* [in] */ DWORD reserved1,
    168.             ; /* [size_is][unique][in] */ void *reserved2,
    169.             ; /* [in] */ DWORD reserved3,
    170.             ; /* [out] */ IEnumSTATSTG **ppenum);
    171.        
    172.         ; HRESULT ( STDMETHODCALLTYPE *DestroyElement )(
    173.             ; IStorage * This,
    174.             ; /* [string][in] */ __RPC__in const OLECHAR *pwcsName);
    175.        
    176.         ; HRESULT ( STDMETHODCALLTYPE *RenameElement )(
    177.             ; IStorage * This,
    178.             ; /* [string][in] */ __RPC__in const OLECHAR *pwcsOldName,
    179.             ; /* [string][in] */ __RPC__in const OLECHAR *pwcsNewName);
    180.        
    181.         ; HRESULT ( STDMETHODCALLTYPE *SetElementTimes )(
    182.             ; IStorage * This,
    183.             ; /* [string][unique][in] */ __RPC__in_opt const OLECHAR *pwcsName,
    184.             ; /* [unique][in] */ __RPC__in_opt const FILETIME *pctime,
    185.             ; /* [unique][in] */ __RPC__in_opt const FILETIME *patime,
    186.             ; /* [unique][in] */ __RPC__in_opt const FILETIME *pmtime);
    187.        
    188.         ; HRESULT ( STDMETHODCALLTYPE *SetClass )(
    189.             ; IStorage * This,
    190.             ; /* [in] */ __RPC__in REFCLSID clsid);
    191.        
    192.         ; HRESULT ( STDMETHODCALLTYPE *SetStateBits )(
    193.             ; IStorage * This,
    194.             ; /* [in] */ DWORD grfStateBits,
    195.             ; /* [in] */ DWORD grfMask);
    196.        
    197.         ; HRESULT ( STDMETHODCALLTYPE *Stat )(
    198.             ; IStorage * This,
    199.             ; /* [out] */ __RPC__out STATSTG *pstatstg,
    200.             ; /* [in] */ DWORD grfStatFlag);
    201.        
    202.         ; END_INTERFACE
    203.     ; } IStorageVtbl;
    204.  
    205.     ; interface IStorage
    206.     ; {
    207.         ; CONST_VTBL struct IStorageVtbl *lpVtbl;
    208.     ; };
    209.     ; typedef struct IEnumUnknownVtbl
    210.     ; {
    211.         ; BEGIN_INTERFACE
    212.        
    213.         ; HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
    214.             ; IEnumUnknown * This,
    215.             ; /* [in] */ __RPC__in REFIID riid,
    216.             ; /* [iid_is][out] */
    217.             ; __RPC__deref_out  void **ppvObject);
    218.        
    219.         ; ULONG ( STDMETHODCALLTYPE *AddRef )(
    220.             ; IEnumUnknown * This);
    221.        
    222.         ; ULONG ( STDMETHODCALLTYPE *Release )(
    223.             ; IEnumUnknown * This);
    224.        
    225.         ; /* [local] */ HRESULT ( STDMETHODCALLTYPE *Next )(
    226.             ; IEnumUnknown * This,
    227.             ; /* [in] */ ULONG celt,
    228.             ; /* [out] */ IUnknown **rgelt,
    229.             ; /* [out] */ ULONG *pceltFetched);
    230.        
    231.         ; HRESULT ( STDMETHODCALLTYPE *Skip )(
    232.             ; IEnumUnknown * This,
    233.             ; /* [in] */ ULONG celt);
    234.        
    235.         ; HRESULT ( STDMETHODCALLTYPE *Reset )(
    236.             ; IEnumUnknown * This);
    237.        
    238.         ; HRESULT ( STDMETHODCALLTYPE *Clone )(
    239.             ; IEnumUnknown * This,
    240.             ; /* [out] */ __RPC__deref_out_opt IEnumUnknown **ppenum);
    241.        
    242.         ; END_INTERFACE
    243.     ; } IEnumUnknownVtbl;
    244. ; typedef struct IStreamVtbl
    245.     ; {
    246.         ; BEGIN_INTERFACE
    247.        
    248.         ; HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
    249.             ; IStream * This,
    250.             ; /* [in] */ __RPC__in REFIID riid,
    251.             ; /* [iid_is][out] */
    252.             ; __RPC__deref_out  void **ppvObject);
    253.        
    254.         ; ULONG ( STDMETHODCALLTYPE *AddRef )(
    255.             ; IStream * This);
    256.        
    257.         ; ULONG ( STDMETHODCALLTYPE *Release )(
    258.             ; IStream * This);
    259.        
    260.         ; /* [local] */ HRESULT ( STDMETHODCALLTYPE *Read )(
    261.             ; IStream * This,
    262.             ; /* [length_is][size_is][out] */ void *pv,
    263.             ; /* [in] */ ULONG cb,
    264.             ; /* [out] */ ULONG *pcbRead);
    265.        
    266.         ; /* [local] */ HRESULT ( STDMETHODCALLTYPE *Write )(
    267.             ; IStream * This,
    268.             ; /* [size_is][in] */ const void *pv,
    269.             ; /* [in] */ ULONG cb,
    270.             ; /* [out] */ ULONG *pcbWritten);
    271.        
    272.         ; /* [local] */ HRESULT ( STDMETHODCALLTYPE *Seek )(
    273.             ; IStream * This,
    274.             ; /* [in] */ LARGE_INTEGER dlibMove,
    275.             ; /* [in] */ DWORD dwOrigin,
    276.             ; /* [out] */ ULARGE_INTEGER *plibNewPosition);
    277.        
    278.         ; HRESULT ( STDMETHODCALLTYPE *SetSize )(
    279.             ; IStream * This,
    280.             ; /* [in] */ ULARGE_INTEGER libNewSize);
    281.        
    282.         ; /* [local] */ HRESULT ( STDMETHODCALLTYPE *CopyTo )(
    283.             ; IStream * This,
    284.             ; /* [unique][in] */ IStream *pstm,
    285.             ; /* [in] */ ULARGE_INTEGER cb,
    286.             ; /* [out] */ ULARGE_INTEGER *pcbRead,
    287.             ; /* [out] */ ULARGE_INTEGER *pcbWritten);
    288.        
    289.         ; HRESULT ( STDMETHODCALLTYPE *Commit )(
    290.             ; IStream * This,
    291.             ; /* [in] */ DWORD grfCommitFlags);
    292.        
    293.         ; HRESULT ( STDMETHODCALLTYPE *Revert )(
    294.             ; IStream * This);
    295.        
    296.         ; HRESULT ( STDMETHODCALLTYPE *LockRegion )(
    297.             ; IStream * This,
    298.             ; /* [in] */ ULARGE_INTEGER libOffset,
    299.             ; /* [in] */ ULARGE_INTEGER cb,
    300.             ; /* [in] */ DWORD dwLockType);
    301.        
    302.         ; HRESULT ( STDMETHODCALLTYPE *UnlockRegion )(
    303.             ; IStream * This,
    304.             ; /* [in] */ ULARGE_INTEGER libOffset,
    305.             ; /* [in] */ ULARGE_INTEGER cb,
    306.             ; /* [in] */ DWORD dwLockType);
    307.        
    308.         ; HRESULT ( STDMETHODCALLTYPE *Stat )(
    309.             ; IStream * This,
    310.             ; /* [out] */ __RPC__out STATSTG *pstatstg,
    311.             ; /* [in] */ DWORD grfStatFlag);
    312.        
    313.         ; HRESULT ( STDMETHODCALLTYPE *Clone )(
    314.             ; IStream * This,
    315.             ; /* [out] */ __RPC__deref_out_opt IStream **ppstm);
    316.        
    317.         ; END_INTERFACE
    318.     ; } IStreamVtbl;