адаптировать winapi CertCreateCertificateContext под VB

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
mshak
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 29.01.2008 (Вт) 14:17

адаптировать winapi CertCreateCertificateContext под VB

Сообщение mshak » 02.08.2010 (Пн) 10:55

Помогите пожалуйста адаптировать функцию
Код: Выделить всё
PCCERT_CONTEXT WINAPI CertCreateCertificateContext(
  __in  DWORD dwCertEncodingType,
  __in  const BYTE *pbCertEncoded,
  __in  DWORD cbCertEncoded
);

под VB6.
определяю так:
Код: Выделить всё
Option Explicit

Public Declare Function CertCreateCertificateContext Lib "crypt32.dll" _
        (ByVal dwCertEncodingType As Long, pbCertEncoded As Any, _
        ByVal cbCertEncoded As Long) As CERT_CONTEXT

Public Declare Function CertFreeCertificateContext Lib "crypt32.dll" (ByRef pCertContext As CERT_CONTEXT) As Boolean

'=============================
Type CRYPT_BIT_BLOB
  cbData      As Long
  pbData      As Long
  cUnusedBits As Long
End Type

Type CRYPTOAPI_BLOB
  cbData As Long
  pbData As Long
End Type

Type CRYPT_ALGORITHM_IDENTIFIER
  pszObjId   As String
  Parameters As CRYPTOAPI_BLOB
End Type

Type FILETIME
  dwLowDataTime As Long
  dwHighDataTime As Long
End Type

Type CERT_PUBLIC_KEY_INFO
  Algorithm As CRYPT_ALGORITHM_IDENTIFIER
  PublicKey As CRYPT_BIT_BLOB
End Type

Type CERT_INFO
  dwVersion            As Long
  SerialNumber         As CRYPTOAPI_BLOB
  SignatureAlgorithm   As CRYPT_ALGORITHM_IDENTIFIER
  Issuer               As CRYPTOAPI_BLOB
  NotBefore            As FILETIME
  NotAfter             As FILETIME
  Subject              As CRYPTOAPI_BLOB
  SubjectPublicKeyInfo As CERT_PUBLIC_KEY_INFO
  IssuerUniqueId       As CRYPT_BIT_BLOB
  SubjectUniqueId      As CRYPT_BIT_BLOB
  cExtension           As Long
  rgExtension          As Long
End Type

Public Type CERT_CONTEXT
  dwCertEncodingType As Long
  pbCertEncoded As String
  cbCertEncoded As Long
  pCertInfo As CERT_INFO
  hCertStore As Long
End Type

Public Const PKCS_7_ASN_ENCODING As Long = &H10000
Public Const X509_ASN_ENCODING As Long = &H1


но при вызове
Код: Выделить всё
Dim bcert() As Byte
bcert = cert.Export(CAPICOM_ENCODE_BINARY)

Dim cc As CERT_CONTEXT
Dim EncType As Long: EncType = PKCS_7_ASN_ENCODING Or X509_ASN_ENCODING
Dim ret As Boolean

cc = CertCreateCertificateContext(EncType, bcert(0), UBound(bcert))


вываливается с ошибкой Bad DLL Calling convertion

mshak
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 29.01.2008 (Вт) 14:17

Re: адаптировать winapi CertCreateCertificateContext под VB

Сообщение mshak » 02.08.2010 (Пн) 15:13

этот вопрос снят. ибо CertCreateCertificateContext возвращает указатель.
но вылезла другая проблема... когда пытаюсь заполнить свою структуру

Код: Выделить всё
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
....
  ' ccRet - тут указатель полученный с winAPI
  ' cc - Dim cc As CERT_CONTEXT
  Call CopyMemory(ByVal VarPtr(cc), ByVal ccRet, LenB(cc))


VB закрывается без каких либо предупреждений.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: адаптировать winapi CertCreateCertificateContext под VB

Сообщение Хакер » 02.08.2010 (Пн) 15:16

Контролируешь ccRet?

К слову, а зачем делать копию структуры CERT_CONTEXT?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

mshak
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 29.01.2008 (Вт) 14:17

Re: адаптировать winapi CertCreateCertificateContext под VB

Сообщение mshak » 02.08.2010 (Пн) 15:43

ccRet - контролируется на наличие указателя в нем в соответсвии с msdn.
да, не подумал, действительно получается две копии структуры... если правильно понимаю одна моя (cc) и другая, которая создается вызовом функции.
вот только я не знаю как прочитать ту, которая создается API, не скопировав ее.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: адаптировать winapi CertCreateCertificateContext под VB

Сообщение Хакер » 02.08.2010 (Пн) 16:23

Если ccRet — абсолютно точно не ноль, но вызов CopyMemory ведёт к краху, это может говорить о нарушении памяти (в т.ч. стека), которое произошло где-то раньше, но вылезло только сейчас.

как прочитать ту, которая создается API, не скопировав ее.

Подумай, нужно ли вообще тебе её читать. Если нет, нужно просто передавать полученный указатель в другие функции. Если да — читай, как скастовать Long-переменную в указатель на структуру.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

mshak
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 29.01.2008 (Вт) 14:17

Re: адаптировать winapi CertCreateCertificateContext под VB

Сообщение mshak » 03.08.2010 (Вт) 10:44

именно прочитать структуру.
вроде потихоньку разбираюсь...
статью в избранное! и за помощь - большое человеческое Спасибо!


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 102

    TopList