Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2012, 20:14   #1
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию udf для firebird

Доброе время суток. Необходимо подключить udf к серверу firebird. Код UDF:
Код:
#include "stdafx.h"
#include "openssl/des.h"
#include "windows.h"
#include "string"
#include "stdio.h"

#ifdef __cplusplus 
#define EXPORT extern "C" __declspec (dllexport) 
#else 
#define EXPORT __declspec (dllexport) 
#endif 

EXPORT char* calc_hash(char* u, char* p);

BOOL APIENTRY DllMain( HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
    return TRUE;
}

EXPORT char* calc_hash(char* u, char* p)		//генерация хеша(имя пользователя,пароль)
{
//описание переменных и их инициализация
	unsigned char des_key[]={ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef};
	char username [32]; 
	char password [32];
	unsigned char hash[8];
	strcpy (username, u);
	strcpy (password, p);
	char encrypt[256];
	char temp[256];
	DES_cblock iv,iv2;
	DES_key_schedule ks1, ks2;
	int len=0;
	int j,user_len,password_len;
	memset (encrypt,0,sizeof(encrypt));
	user_len = strlen(username);
	password_len = strlen(password);
	memset (iv,0,8);
	memset (iv2,0,8);
	
	//аутентификация
	strupr (username);
	strupr (password);
	//расширение
	for (len=1,j=0; j<user_len; len++,j++)
	{
		encrypt[len] = username[j];
		len++;
	}

	for (j=0; j<password_len; len++,j++)
	{
		encrypt[len] = password[j];
		len++;
	}

	len=len-1;

	//первый шаг
	DES_set_key((DES_cblock*) des_key, &ks1);
	DES_ncbc_encrypt((unsigned char*) encrypt, (unsigned char*) temp, len, &ks1, &iv, DES_ENCRYPT);

	//второй шаг
	DES_set_key((DES_cblock*) &iv, &ks2);
	DES_ncbc_encrypt((unsigned char*) encrypt, (unsigned char*) temp, len, &ks2, &iv2, DES_ENCRYPT);
	memcpy (hash,iv2,8);

	//результирующее преобразование
	char tmp[3]="";
	tmp[2] = '\0';
	char temp_str[17]="";
	temp_str[16]='\0';
	
	for(int i=0;i<8;i++)
	{
		sprintf(tmp,"%2.X",hash[i]);
		strcat(temp_str,tmp);
	}
	return temp_str;
}
Вот так подключаю ее в firebird
Код:
DECLARE EXTERNAL FUNCTION calc_hash
    CSTRING(256),
    CSTRING(256)
RETURNS CSTRING(256)
ENTRY_POINT 'calc_hash' MODULE_NAME 'generate_hash'
При использовании выдает следующую ошибку:
Invalid token.
invalid request BLR at offset 63.
function CALC_HASH is not defined.
module name or entrypoint could not be found.

Как исправить? Если открыть в IDA экспорт dll, есть две функции
calc_hash 1001114F 1
DllEntryPoint 100110FA

Пробовала делать так:
Код:
DECLARE EXTERNAL FUNCTION calc_hash
    CSTRING(256),
    CSTRING(256)
RETURNS CSTRING(256)
ENTRY_POINT 'DllEntryPoint' MODULE_NAME 'generate_hash'
такая же ошибка...

dll лежит в папке UDF сервера Firebird, где и должна лежать
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 14.11.2012, 20:59   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Полный путь указать не пробовала?
Или может грантов на выполнение не хватает? Я не знаю как у огнептички с грантами дела обстоят...

Такой момент еще:
Цитата:
ENTRY_POINT 'function_name' MODULE_NAME 'library_name'
http://www.firebirdsql.su/doku.php?i...ernal_function
А у тебя там точка входа в либу а не в функцию.
I'm learning to live...

Последний раз редактировалось Stilet; 14.11.2012 в 21:03.
Stilet вне форума Ответить с цитированием
Старый 15.11.2012, 07:24   #3
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

Проблема точно не в пути и не в грантах.
calc_hash функция, насколько понимаю указывать нужно ее
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 15.11.2012, 13:17   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну! А ты что указала?
Цитата:
ENTRY_POINT 'DllEntryPoint'
Я имел ввиду что тут и нужно указывать тфою функу
Код:
ENTRY_POINT 'calc_hash'
Ну пройдись ты по ссылке то, там пример же есть
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.11.2012, 16:43   #5
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

написано было выше
Код:
DECLARE EXTERNAL FUNCTION calc_hash
    CSTRING(256),
    CSTRING(256)
RETURNS CSTRING(256)
ENTRY_POINT 'calc_hash' MODULE_NAME 'generate_hash'
на ссылке была
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 15.11.2012, 17:01   #6
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

все решено, нужно было просто библиотеку, функции которой использует моя, засунуть в папку udf
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с UDF Ericnex БД в Delphi 16 01.07.2015 15:36
Работа с UDF-функциями Ericnex БД в Delphi 2 06.09.2012 05:57
Firebird.Не могу подключить UDF. -COREY- БД в Delphi 0 08.05.2012 15:15
UDF Cartman18 БД в Delphi 0 06.05.2010 21:52
Ошибка при декларировании функции в Firebird из UDF shurik_7866 БД в Delphi 1 30.07.2007 08:55