Использование для разработки драйверов других компиляторов

Разработка драйверов t11 и t12 возможна с использованием практически любого компилятора, который может корректно создавать WIN32 DLL библиотеки. При этом нужно учитывать следующие моменты:

   Соглашение о вызове. Функции, экспортируемые драйвером, должны быть объявлены как __cdecl.

   Функции в DLL описания протокола драйвера должны иметь совершенно определенные порядковые номера (ordinals). При этом их имена могут быть произвольными. Драйверы t11 и t12 используют для однотипных функций разные порядковые номера (ordinals).

Пример DEF-файла для типа 11:

; type 11

EXPORTS

Check_xxx @1

Get_xxx @2

Prepare_xxx @3

Set_xxx @4

zCompare_xxx @5

zReadAny_xxx @6

DllMain @7

Пример DEF-файла для типа 12:

;type 12

EXPORTS

Check_yyy @1

Close_yyy @2

Get_yyy @3

Open_yyy @4

Set_yyy @5

zCompare_yyy @6

DllMain @7

Таким образом, экспортируемые функции должны быть расположены в алфавитном порядке.

   Компилятор Borland C++ Builder 6.0 неправильно обрабатывает DEF-файлы. Добиться присвоения нужных ordinals удается только в том случае, если определения функций расположены в алфавитном порядке в исходном файле.

   DLL описания интерфейса (media<n>.dll) также экспортирует функции по номерам, в алфавитном порядке.

Пример исходного текста для модуля описания носителя на Borland C++ Builder

 

////////////////////

#include <windows.h>

#include <stdio.h>

 

int __export CloseMedia(long &hndl)

{return 0;}

 

int __export OpenMedia(long &hndl)

{

hndl = 1;

return 0;

}

 

int __export ReadMedia(long &hndl, char *rbuf, int in_count, int &actual_count)

{return 0;}

 

int __export StartMedia(long &hndl)

{return 0;}

 

int __export StopMedia(long &hndl)

{return 0;}

 

int __export WriteMedia(long &hndl, char *sbuf, int out_count, int &actual_count)

{return 0;}

 

////////////////

#pragma argsused

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)

{return TRUE;}

////////////////