Получение C-ой (cишной) структуры в VB

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

Получение C-ой (cишной) структуры в VB

Сообщение ALX_2002 » 03.07.2008 (Чт) 10:53

Доброго времени суток господа. Пришёл вас отвлечь по следующей теме... :) Мучаюсь с библиотекой системы защиты "ВЕРБА"

Библиотека сделана на C. Пытаюсь её адаптировать к VB.

Возникла следующая проблема.

Имеется функция GetDvInfo.

9.4.4 Получение списка ключей, загруженных в драйвер
Получение списка ключей, загруженных в драйвер, производится при помощи функции(wbotho,wsigno):

T16bit WINAPI GetDrvInfo(USR_KEYS_INFO *Keys_Info,
unsigned long *n_Key_Slot);
Параметры:

(o) Keys_Info - указатель на массив из 16 структур USR_KEYS_INFO, куда будет возвращена информация о слотах драйвера, в которые прогружены ключи для шифрования и/или подписи (CKD и/или CKDI). Память под массив резервируется пользователем.

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

Функция в начале работы обнуляет весь массив структур Keys_Info, а затем последовательно заполняет его информацией о найденных загруженных слотах в порядке возрастания их номеров. (В Keys_Info[0] записывается информация о первом найденном загруженном слоте, в Keys_Info[1] — о втором, и т. д.)



Как видно из описания нужно передать указатель (как я понимаю ByRef) массива из 16 элементов. Элементами которого являются структуры USR_KEYS_INFO. Нашёл описание этой C структуры

typedef struct _USR_KEYS_INFO {
char num[11];
char nump[13];
T16bit keys_status;
T8bit version_high;
T8bit version_low;
T32bit KeySlotNumber;
} USR_KEYS_INFO, *PUSR_KEYS_INFO;


Наивно предположил, что смогу сделать нечто типа:

Код: Выделить всё

Private Type
    num as String * 11
    nump as String * 13
    keys_status as ....
    version_high as ....
    version_low as ....
    KeySlotNumber as ....
End Type

Dim KEYS_INFO(16) as USR_KEYS_INFO


Наверняка ошибаюсь. :roll: Упёрся в незнание как создать такую структуру с такими типами данных и даже сотворить тот же указатель на "unsigned long *n_Key_Slot" (второй параметр фунции) для меня вызвало сложность. Обычный DWORD в C и Long в VB приблизительно понятно, но вот беззнаковый Long сотворить в VB не преставляю как.

Вообще представляю себе решение так - с помощью API выделить кусок памяти под загрузку структуры через GlobalAlloc. Передать его функции, а затем в VB-ке через API GetMem4 попытаться по смещению надёргать из него эти данные.... Но наверняка опять что то не учитываю, т.к не имел опыта работы с этими функциями. :roll:

P.S Прошу сильно не пинать за возможно мегатупейшие предположения. )) (подсознательно ощущаю, что это бредовая мысль), но всё же - вдруг возможно как то с этим справиться ? :)

В общем жду любых советов и предложений :) Заранее очень благодарен.

HiSER
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 88
Зарегистрирован: 04.07.2007 (Ср) 18:17

Сообщение HiSER » 03.07.2008 (Чт) 12:12

Такая структура будет, как я думаю:
Код: Выделить всё
Private Type USR_KEYS_INFO
num(10) As Byte
nump(12) As Byte
keys_status As Integer
version_high As Byte
version_low As Byte
KeySlotNumber As Long
End Type

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 03.07.2008 (Чт) 12:52

А функция должна быть объявлена так:
Код: Выделить всё
Declare Function GetDrvInfo Lib "имя_библы" (Keys_Info As USR_KEYS_INFO,ByRef n_Key_Slot As Long) As Integer

В функцию передавать первый элемент массива, и число типа Long, в котором будет возвращено количество слотов.
Весь мир матрица, а мы в нем потоки байтов!

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 03.07.2008 (Чт) 13:53

2 HiSER + Viper:

Кланяюсь в ноги ! :D Сегодня вечером опробую. О результатах отпишусь. :idea: А я уже был готов смириться и отказаться от автоматизации вербы. :roll:

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 08.07.2008 (Вт) 10:39

Совсем збыл. Обещал сообщить о результатах. Всё получилось. Пашет отличо :) Огромное спасибо.

Переправил только первых два параметраструктуры на String * 11 и String * 13, чтобы не конвертировать данные через StrConv для читабельного вида :)

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 08.07.2008 (Вт) 15:03

Товарищи, упёрся в последнюю функцию, с которой никак не могу справиться. Требует параметром - (node_To) строку элементов, имеющих тп unsigned short

Для зашифрования файлов служит функция EnCryptFile(wbotho). (Рекомендуется вместо этой функции использовать функцию EnCryptFileEx).

T16bit WINAPI EnCryptFile (char *file_in,
char *file_out,
T16bit node_From,
P16bit node_To,
char *ser);

Функция имеет параметры:

(i) file_in — указатель на строку полного пути к незашифрованному файлу;

(i) file_out — указатель на строку полного пути к зашифрованному файлу;
Внимание. Размер файла при зашифровании округляется до кратного восьми в большую сторону, а затем увеличивается на (51 + число получателей * 48) байт.

(i) node_From — номер ключа шифрования отправителя (XXXX), представленный в виде числа типа unsigned short;

(i) node_To — список номеров ключей получателей, который представляется строкой элементов, имеющих тип unsigned short, и оканчивается нулем (0);

(i) ser — указатель на строку длиной 6 символов с номером серии (SSSSSS) открытых ключей шифрования получателей. Если в качестве значения этого параметра указать последовательность из шести нулевых символов (\0\0\0\0\0\0), т. е. зашифрованный файл предназначен для пользователей с тем же номером серии, что и у отправителя, то номер серии берется из драйвера хранения ключевой информации.

Пример вызова функции зашифрования:
char ser_To[7] = “000005”;
node_To[0] = 2;
node_To[1] = 3;
node_To[2] = 0;
node_From = 1;
error_code = EnCryptFile("C:\\AUTOEXEC.BAT", "C:\\TEST.TST",
node_From, node_To , ser_To);



Сделал через ж...

Код: Выделить всё

Private Declare Function EnCryptFileA Lib "wbotho.dll" Alias "EnCryptFile" (ByVal file_in As String, ByVal file_out As String, ByVal node_From As Integer, ByVal node_To As String, ByVal ser As String) As Integer

Private Sub Form_Load()
    Dim node_To(1) As Byte
   
    node_To(0) = 101
   
    ret = EnCryptFileA("C:\1.txt", "C:\3.txt", 000, node_To, "000000")
    Debug.Print ret
End Sub



И вот так срабатывает, всё шифрует, но вот в node_To нужно подсунуть 2000 и никак не соображу. как в Byte-овый массив это всунуть. :oops: :oops: :oops:

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 08.07.2008 (Вт) 15:50

Код: Выделить всё
    Dim node_To(3) As Byte
   
    node_To(0) = &h32 ' "2"
    node_To(1) = &h30 ' "0"
    node_To(2) = &h30 ' "0"
    node_To(3) = &h30 ' "0"


Нэ?
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 08.07.2008 (Вт) 16:04

2 Денис: Ммм.. Так вон оно как :) А через что преобразование сдеано, если не секрет ? Эт резалт от HEX ?

Добавлено позже.... Hex(Asc(Char)) Хм... И должно так работать ? :shock: Пока не получилось. Пробую дальше.

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Сообщение Vi » 09.07.2008 (Ср) 8:21

"unsigned short" тип VB не поддерживает, но поддерживает "signed short" как Integer.
Код: Выделить всё
Private Declare Function EnCryptFileA Lib "wbotho.dll" Alias "EnCryptFile" (ByVal file_in As String, ByVal file_out As String, ByVal node_From As Integer, ByRef node_To As Integer, ByVal ser As String) As Integer

Private Sub Form_Load()
    Dim node_To(1) As Integer
   
    node_To(0) = 2000
   
    ret = EnCryptFileA("C:\1.txt", "C:\3.txt", 000, node_To(0), "000000")
    Debug.Print ret
End Sub
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 09.07.2008 (Ср) 10:27

ALX_2002
Вот что нашел! Может поможет?
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 09.07.2008 (Ср) 10:38

2 Vi + Денис:
GRAND MERCI :lol: Всё пашет !!! ))))

День удался.

Сработало c Dim node_To(1) as Integer


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

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

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 29

    TopList