Сейчас на форуме: tyns777, zds (+3 невидимых)

 eXeL@B —› Программирование —› нужно разобраться COM CAPICOM
Посл.ответ Сообщение

Ранг: 85.5 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 13 ноября 2009 14:01 · Поправил: DMD
· Личное сообщение · #1

всех приветствую

собственно проблема - как работать с CAPICOM в асме (fasm)?

об инсталляции самого CAPICOM - не говорим.. и так понятно.

CoInitialize + CoCreateInstance - тут все понятно...
меня интересует интерфейс Utilities
ссылка на msdn
msdn.microsoft.com/en-us/library/aa388176(VS.85).aspx

CLSID {22A85CE1-F011-4231-B9E4-7E7A0438F71B} ; ProgID - "CAPICOM.Utilities.1"
IID {EB166CF6-2AE6-44DA-BD96-0C1635D183FE} ; "IUtilities"

методы этого интерфейса - тоже известны...
но в каком порядке они "лежат" в vtable?!?!

и вот еще одна непонятность:
попробовал последовательно получать указатели на интерфейсы CAPICOM.Utilities.1

Code:
  1. "IUnknown"        004020F0  CC 21 3F 00
  2. "IDispatch"       004020F0  CC 21 3F 00
  3. "IObjectSafety"   004020F0  D0 21 3F 00
  4. "ISupportErrorInfo"        004020F0  C8 21 3F 00
  5. "IUtilities"      004020F0  CC 21 3F 00
  6.  
  7.  


те. указатели на "IUnknown" "IDispatch" "IUtilities" - все эквивалентны.. как такое может быть?!

тем более что указатели, полученные и через IUnknown "QueryInterface" и через прямой вызов CoCreateInstance, совпадают.

Code:
  1. "IUtilities"
  2. 004020F0  CC 21 3F 00                                      М!?.
  3.  
  4. 003F21CC  B0 25 CA 00 9C 25 CA 00 00 00 00 00 01 00 00 00  °%К.њ%К........
  5. 003F21DC  B8 AA BA 00 FF FF FF FF 00 00 00 00 00 00 00 00  ёЄє.яяяя........
  6. 003F21EC  00 00 00 00 00 00 00 00 01 F0 AD BA 00 00 00 00  ........р­є....
  7. 003F21FC  80 AA BA 00 FF FF FF FF 00 00 00 00 00 00 00 00  ЂЄє.яяяя........
  8. 003F220C  00 00 00 00 00 00 00 00 00 00 00 00 AB AB AB AB  ............««««
  9. 003F221C  AB AB AB AB 00 00 00 00 00 00 00 00 43 00 0D 00  ««««........C...
  10. 003F222C  EE 04 EE 00 90 03 3F 00 90 03 3F 00 EE FE EE FE  оо.ђ?.ђ?.оюою
  11.  
  12.  via "IUnknown"
  13. 00402110  CC 21 3F 00                                      М!?.
  14.  
  15.  
  16.  


но опять не все ясно: методов у "IUtilities" - 9, а в таблице всего два элемента

Ps
статьи на васм'е не особо помогли... кое-что там уже давно устарело... да и многое не описано.



Ранг: 516.1 (!), 39thx
Активность: 0.280
Статус: Участник

Создано: 13 ноября 2009 15:18 · Поправил: Av0id
· Личное сообщение · #2

может что-нибудь в этом духе?

Code:
  1. format PE GUI 4.0
  2. entry start
  3.  
  4. include '%fasminc%\win32a.inc'
  5.  
  6. align 4
  7.  
  8. struc GUID param1,param2,param3,param4
  9. {
  10.   .Data1 dd param1
  11.   .Data2 dw param2
  12.   .Data3 dw param3
  13.   .Data4 dq param4
  14. }
  15.  
  16. struct IUtilities
  17.   QueryInterface dd ?
  18.   AddRef dd ?
  19.   Release dd ?
  20.   Base64Decode dd ?
  21.   Base64Encode dd ?
  22.   BinaryStringToByteArray dd ?
  23.   BinaryToHex dd ?
  24.   ByteArrayToBinaryString dd ?
  25.   GetRandom dd ?
  26.   HexToBinary dd ?
  27.   LocalTimeToUTCTime dd ?
  28.   UTCTimeToLocalTime dd ?
  29. ends
  30.  
  31. macro comcall pobj, func, [param] {
  32.  if ~ param eq
  33.   reverse
  34.    pushd param
  35.  end if
  36.  
  37.  common
  38.   if pobj in <eax,ebx,ecx,edx,esi,edi>
  39.     local ..pobj
  40.     label ..pobj at pobj
  41.     push dword pobj
  42.     mov eax, [..pobj]
  43.   else
  44.     mov eax, pobj
  45.     push eax
  46.     mov eax, [eax]
  47.   end if
  48.   call dword [eax + func]
  49. }
  50.  
  51. ...
  52.  
  53. section '.bss' data readable
  54.  
  55. CLASS_Utilities GUID 022A85CE1h,0F011h,04231h,0B9E4h,07E7A0438F71Bh
  56. IID_IUtilities GUID 0EB166CF6h,02AE6h,044DAh,0BD96h,00C1635D183FEh
  57.  
  58. ...
  59.  
  60. ... псевдо-код ...
  61.  
  62. CoCreateInstance(...CLASS_Utilities...)
  63. QueryInterface(...IID_IUtilities...)
  64.  
  65. ... fasm ...
  66.  
  67. comcall  [hCapiCom],IUtilities.Base64Decode,ecx
  68.  




Ранг: 85.5 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 13 ноября 2009 20:28 · Поправил: DMD
· Личное сообщение · #3

Av0id пишет:
может что-нибудь в этом духе?


нет, в этом духе не подойдет
приведенный вариант псевдо-кода - это практически классическое описание COM
вся ерунда в том, что struct IUtilities описана "руками" как
Code:
  1. struct IUtilities
  2.   QueryInterface dd ?
  3.   AddRef dd ?
  4.   Release dd ?
  5.   Base64Decode dd ?
  6.   Base64Encode dd ?
  7.   BinaryStringToByteArray dd ?
  8.   BinaryToHex dd ?
  9.   ByteArrayToBinaryString dd ?
  10.   GetRandom dd ?
  11.   HexToBinary dd ?
  12.   LocalTimeToUTCTime dd ?
  13.   UTCTimeToLocalTime dd ?
  14.  

а после получения указателя на этот интерфейс в памяти имеем следующее:

Code:
  1. "IUtilities"
  2. 004020F0  CC 21 3F 00                                      М!?.
  3.  
  4. 003F21CC  B0 25 CA 00 9C 25 CA 00 00 00 00 00 01 00 00 00
  5. 003F21DC  B8 AA BA 00 FF FF FF FF 00 00 00 00 00 00 00 00
  6. 003F21EC  00 00 00 00 00 00 00 00 01 F0 AD BA 00 00 00 00
  7. 003F21FC  80 AA BA 00 FF FF FF FF 00 00 00 00 00 00 00 00
  8. 003F220C  00 00 00 00 00 00 00 00 00 00 00 00 AB AB AB AB
  9. 003F221C  AB AB AB AB 00 00 00 00 00 00 00 00 43 00 0D 00
  10. 003F222C  EE 04 EE 00 90 03 3F 00 90 03 3F 00 EE FE EE FE
  11.  


те. в vtable имеем всего два элемента,,,,

что я и описал #1

ps
может быть я и не прав, но при получении указателей через IUnknown обрабатывать его счетчик через AddRef мне не пришлось - он сам увеличивался.

pps
если последовательность элементов struct IUtilities взята "от M$"... тогда это не факт



Ранг: 516.1 (!), 39thx
Активность: 0.280
Статус: Участник

Создано: 14 ноября 2009 11:55
· Личное сообщение · #4

а IID и CLSID правильны?



Ранг: 85.5 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 16 ноября 2009 15:06 · Поправил: DMD
· Личное сообщение · #5

мда...
все же удалось в fasm заставить эту (не знаю как по-мягче ее назвать) концепцию закодировать стринг в Base64.

сначала ответы на вопросы:

CLSID {22A85CE1-F011-4231-B9E4-7E7A0438F71B} ; ProgID - "CAPICOM.Utilities.1"
IID {EB166CF6-2AE6-44DA-BD96-0C1635D183FE} ; "IUtilities"
это все правильно...

предложенная структура vtable:

struct IUtilities
QueryInterface dd ?
AddRef dd ?
Release dd ?
Base64Decode dd ?
Base64Encode dd ?
BinaryStringToByteArray dd ?
BinaryToHex dd ?
ByteArrayToBinaryString dd ?
GetRandom dd ?
HexToBinary dd ?
LocalTimeToUTCTime dd ?
UTCTimeToLocalTime dd ?
ends

похоже, была взята из msdn и.. гм .. неверна.. точнее, почти верна и к тому же на msdn она приведена в алфавитном порядке.

по-уму, эта таблица выглядит так:

QueryInterface
AddRef
Release
GetTypeInfoCount
GetTypeInfo
GetIDsOfNames
Invoke
GetRandom
Base64Encode
Base64Decode
BinaryToHex
HexToBinary
BinaryStringToByteArray
ByteArrayToBinaryString
LocalTimeToUTCTime
UTCTimeToLocalTime

о проблемах по порядку:
- спасибо Hangatyr'у за указание о первом (опущенном во всех описаниях) параметре (статья за 2004 год!).
никто не обозвал это указателем_на_Context - а зря... что-то было проще в понимании.
- указатели_на_указатели - эта фишка вымотает любые нервы
- структура стрингов: с явным указанием длины в [$-4]
- коды ошибок на столько разнообразны, на сколько и засекречены. что где искать - неизвестно.
E_OUTOFMEMORY 8007000E Out of memory error не вполне помогает при поиске ошибки в описании стринга и его длины.

может быть, на высокоуровневых языках многое будет проще чем на асме.
но в любом случае, если потребуется выполнить, на пример, скрипт на VB в асме (пример есть на васм), те. с пустого места определить последовательность элементарных действий (методов) для выполнения поставленной задачи будет не совсем просто.

а так, для простых действий (кодирование/декодирование и пр.) использовать вполне можно.



Ранг: 516.1 (!), 39thx
Активность: 0.280
Статус: Участник

Создано: 16 ноября 2009 19:07
· Личное сообщение · #6

capicom sdk подними и узнаешь про коды ошибок, указатели на указатели - это типично для всей COM

ps. выложишь пример?



Ранг: 85.5 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 17 ноября 2009 12:23 · Поправил: DMD
· Личное сообщение · #7

Av0id пишет:
capicom sdk подними и узнаешь про коды ошибок


смотрел... не нашел,,,
тут и то лучше описано (коды ошибок):
http://msdn.microsoft.com/en-us/library/ee265170(BTS.10).aspx -> COM

http://msdn.microsoft.com/en-us/library/aa375685(VS.85).aspx -> CAPICOM

Av0id пишет:
выложишь пример

код под такую последовательность:
CLSID -> GUID_IUnknow -> IUnknown(_IID_IUtilities)

(но можно пользоваться и такой последовательностью:
CLSID -> GUID_IUtilities)

Code:
  1.          invoke    MultiByteToWideChar, 0, 0, _CLSID, -1, buffer, 100h
  2.          invoke    CLSIDFromString,  buffer, _rez_A
  3.  
  4.          invoke    MultiByteToWideChar, 0, 0, _GUID_IUnknow, -1, buffer, 100h
  5.          invoke    CLSIDFromString,  buffer, _rez_B
  6.  
  7.          invoke    CoInitialize, NULL
  8.          invoke    CoCreateInstance, _rez_A, 0, 1, _rez_B, adr_IUnknown
  9.  
  10.          invoke    MultiByteToWideChar, 0, 0, _IID, -1, buffer, 100h
  11.          invoke    CLSIDFromString,  buffer, _rez_B
  12.  
  13.          mov       edx, dword [adr_IUnknown]
  14.          mov       edx, [edx]
  15.          push      adr_Interface
  16.          push      _rez_B
  17.          push      dword [adr_IUnknown]
  18.          call      dword [edx + 0]
  19.  
  20. ; struct IUtilities
  21. ; QueryInterface equ 0x00
  22. ; AddRef
  23. ; Release
  24. ; GetTypeInfoCount
  25. ;
  26. ; GetTypeInfo equ 0x10
  27. ; GetIDsOfNames
  28. ; Invoke
  29. ; GetRandom
  30. ;
  31. ; Base64Encode equ 0x20
  32. ; Base64Decode
  33. ; BinaryToHex
  34. ; HexToBinary
  35. ;
  36. ; BinaryStringToByteArray equ 0x30
  37. ; ByteArrayToBinaryString
  38. ; LocalTimeToUTCTime
  39. ; UTCTimeToLocalTime
  40. ; ends
  41.  
  42.          stdcall   Get_Length, Input_String          ; Length of string
  43.          mov       dword [Input_String_length], eax  ; save "Length"
  44.  
  45.          mov       edx, [adr_Interface]     ; Base64Encode
  46.          mov       edx, dword [edx]         ;
  47.          push      adr_Out_string           ;
  48.          push      Input_String             ;
  49.          push      [adr_Interface]          ;
  50.          call      dword [edx + 20h]        ;
  51.  
  52.          invoke    WideCharToMultiByte, 0, 0, [adr_Out_string], -1, out_buffer_sample, 100h, NULL, NULL
  53.  
  54.  - - -
  55.  
  56.          _CLSID          db  "{22A85CE1-F011-4231-B9E4-7E7A0438F71B}", 0       ; ProgID - "CAPICOM.Utilities.1"
  57.          _GUID_IUnknow   db  "{00000000-0000-0000-C000-000000000046}", 0       ; "IUnknown"
  58.  
  59.     ; _IID db "{00000000-0000-0000-C000-000000000046}", 0 ; "IUnknown"
  60.     ;
  61.     ; _IID db "{00020400-0000-0000-C000-000000000046}", 0 ; "IDispatch"
  62.     ;
  63.     ; _IID db "{CB5BDC81-93C1-11CF-8F20-00805F2CD064}", 0 ; "IObjectSafety"
  64.     ;
  65.     ; _IID db "{DF0B3D60-548F-101B-8E65-08002B2BD119}", 0 ; "ISupportErrorInfo"
  66.     ;
  67.          _IID            db  "{EB166CF6-2AE6-44DA-BD96-0C1635D183FE}", 0       ; "IUtilities"
  68.  
  69.          _rez_A    rb 10h
  70.          _rez_B    rb 10h
  71.  
  72.          adr_IUnknown   dd ?
  73.                         dd ?
  74.          adr_Interface  dd ?
  75.          adr_Out_string dd ?
  76.  
  77. ; Input_String_Structure ;
  78.                    rb 0Ch                             ;
  79.          Input_String_length  dd ?                    ;
  80.          Input_String         db "foob", 0            ;
  81.          align 10h                                    ;
  82.          out_buffer_sample  rb 20h
  83.          buffer    rb 50h
  84.  
  85.  * * *
  86.  * * *
  87.  
  88. 00402140  66 6F 6F 62 00 90 90 90 90 90 90 90 90 90 90 90  foob.ђђђђђђђђђђђ
  89. 00402150  2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D  ----------------
  90. 00402160  5A 6D 39 76 59 67 3D 3D 0D 0A 00 00 00 00 00 00  Zm9vYg==........
  91. 00402170  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
  92.  


у меня есть замечание & еще несколько вопросов:
- к результату добавляются два байта 0х0D +0х0A.. нужно это учитывать..

- можно ли бойтись без инсталляции всего пакета? (мы подразумеваем CAPICOM)
я о regsvr32.exe + CAPICOM.dll...
и самый насущный в приложении СОМ вопрос по fasm:
ок, мы получили указатель на интерфейс, вытащили указатель на vtable + "руками" описали структуру vtable. можно ли как-нибуть это связать?
что бы пользоваться call [.Base64Decode] а не call [edx+0xC0]



Ранг: 516.1 (!), 39thx
Активность: 0.280
Статус: Участник

Создано: 19 ноября 2009 17:39 · Поправил: Av0id
· Личное сообщение · #8

нет, в этом духе не подойдет

только в итоге получилось почему-то именно в этом духе

DMD пишет:
ок, мы получили указатель на интерфейс, вытащили указатель на vtable + "руками" описали структуру vtable. можно ли как-нибуть это связать?
что бы пользоваться call [.Base64Decode] а не call [edx+0xC0]


см. мой первый пост внимательнее, макрос comcall и пример его использования там же

в твоем случае:
comcall [adr_Interface],IUtilities.Base64Encode,Input_String,adr_Out_string

смотрел... не нашел,,,

плохо смотрел



Ранг: 85.5 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 20 ноября 2009 10:58
· Личное сообщение · #9




 eXeL@B —› Программирование —› нужно разобраться COM CAPICOM
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати