Передавать и получать необработанные байтовые данные через символ без знака * параметры функции в C

#c #arrays #c #dllimport #unsigned-char

#c #массивы #c #dllimport #unsigned-char

Вопрос:

У меня есть сторонний x.dll и функция экспорта, которая называется «GenerateKeyEx-в C». У меня нет никакой дополнительной информации, такой как .lib, заголовок и т.д. Я нашел параметры функции из x.dll поставщик, и они уже добавлены в код.

Здесь вы можете увидеть определения параметров;

 > [in] ipSeedArray: the seed queried by the ECU (as byte raw data)
> [in] iSeedArraySize: The size of the array
> [in] iSecurityLevel: the security level to be change to
> [in] ipVariant: the ECU variant’s qualifier
> [out] iopKeyArray: the calculated key on return (as byte raw data)
> [in] iMaxKeyArraySize: maximum number of key bytes available
> [out] oActualKeyArraySize: the number of key bytes calculated 
  

Я могу получить доступ и запустить функцию «GenerateKeyEx» без каких-либо ошибок. Функции всегда возвращают 4, что является неопределенной ошибкой для функции. Я думаю, что я не могу передать значения массива (или правильно инициализировать массивы) между функцией main и dll. const unsigned char* ipSeedArray и unsigned char* iopKeyArray указаны как байты необработанных данных (выше), и я неправильно определил массивы для передачи необработанных байтовых данных через unsigned char * ?

 //__stdcall replaced  //__cdecl *f_GenerateKey 
typedef int(*f_GenerateKey)(const unsigned char* ipSeedArray,unsigned int iSeedArraySize,const unsigned int iSecurityLevel,
    const char* ipVariant,unsigned char* iopKeyArray,unsigned int iMaxKeyArraySize,unsigned intamp; oActualKeyArraySize);

int main()
{
    HINSTANCE hGetProcIDDLL = LoadLibrary(L"C:\Users\thego\source\repos\ConsoleApplication1cp\ConsoleApplication1cp\Debug\SeednKey.dll");
    if (!hGetProcIDDLL) {
        std::cout << "could not load the dynamic library" << std::endl;
        return EXIT_FAILURE;
    }
    // resolve function address here
    f_GenerateKey GenerateKey = (f_GenerateKey)GetProcAddress(hGetProcIDDLL, "GenerateKeyEx");
    if (!GenerateKey) {
        std::cout << "could not locate the function" << std::endl;
        return EXIT_FAILURE;
    }
    const int sb = 4;  const int kb = 100;
    const BYTE seedbuffer[sb] = { 0x0B,0xCF,0xFE,0x10 };                            //function in                           
    unsigned int seedbufferSize = sizeof(seedbuffer) / sizeof(seedbuffer[0]);   //function in
    const unsigned int SecurityLevel = 0x01;                                    //function in
    const char Variant[1] = { '0' };                                            //function in
    BYTE keybuffer[kb];                                                         //function out
    for (int i = 0; i < kb;   i) keybuffer[i] = 0x00;
    unsigned int MaxKeykeybuffer = sizeof(keybuffer) / sizeof(keybuffer[0]);    //function in
    unsigned int oSize;                                                     //function out

    int x = GenerateKey(seedbuffer, seedbufferSize, SecurityLevel, Variant, keybuffer, MaxKeykeybuffer, oSize);

    return 0;
}
  

Комментарии:

1. Если показанные «определения параметров» — это все, что вам предоставляет поставщик DLL, то либо их следует удалить как поставщиков, либо их нужно заставить предоставлять фактические объявления функций с точными типами, а также коды возврата «ошибка».

2. Вы правы 🙂 Каков наилучший способ передачи байтовых необработанных данных в функцию и из нее через unsigned char * параметры?

3. Я использую dll, которая содержит функцию GenerateKeyEx, и у нее разные параметры. Я также проверил это через средство просмотра dll. Вы можете найти определение функции здесь ссылка @Hans Passant

4. Почему вы не получаете файл заголовка? Вы занимаетесь обратным проектированием? И если да, то разве этот вопрос не является просто догадкой?

Ответ №1:

Здесь:

 GenerateKey(seedbuffer, SeedArraySize, ...
  

вы используете seedbuffer , в то время как (я предполагаю) вам нужно SeedArray .

Суть в том, что вы передаете массив из 4 байт и сообщаете им, что их 9.

Комментарии:

1. Я обновил код, извините за ненужную часть. SeedArray не использовался при вызове функции.

2. @Katsazuka Я нашел код, который подозрительно похож на вашу DLL, о которой идет речь: github.com/skysky97/seed_to_key/blob/master/algorithm/… Он всегда возвращается 0 . У вас есть этот комментарий в вашем коде: //__stdcall replaced //__cdecl *f_GenerateKey — вы не уверены, что такое соглашение о вызовах?

3. @Katsazuka — к вашему сведению: ваш код отлично работает с этой DLL в моем предыдущем комментарии ^^

4. Я проверил код, который вы отправили выше. Я могу вызвать функцию в этом коде и создать ключ без каких-либо проблем с точно такими же параметрами, которые я использовал для функции dll. Вот почему я не мог понять проблему функции dll.