Простой драйвер на Free Pascal+MS Link

Тема в разделе "WASM.NT.KERNEL", создана пользователем bugaga, 8 ноя 2007.

  1. bugaga

    bugaga New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2007
    Сообщения:
    361
    FPC (как и большое число 'free' компиляторов), более заточен на работу с линкером LD, которым к сожалению не удалось получить нормально работающий в "subsystem: native" бинарник.

    Однако если учесть некоторые нюансы, то cборку можно произвести и другими линкерами, как например Watcom и Microsoft Link. Это делает возможным компиляцию драйвера, подключение ресурсов и частей кода на других языках, и т.п :)

    Единственное что необходимо учесть - вызвы из внешних библиотек обьявлять более тщательно к примеру:
    Код (Text):
    1. procedure IoDeleteDevice (DeviceObject:pointer); stdcall; external name 'IoDeleteDevice';
    2. //
    3. procedure  Sleep(dwMilliseconds: DWORD); stdcall; external name '_Sleep@4';
    Собственно и всё, в целом же написать, драйвер на FPC ничуть не сложнее чем на других языках...

    Для примера - вариант известного "GiveIO", вариант "содраный" с дельфов, практически в 1:1 (при его компиляции следует задать опцию -Sd ( совместимость с delphi).
    Код (Text):
    1. library GiveIO;
    2. {$I ntddk}
    3.  
    4. var
    5.     IOPM : array [0..$2000] of byte;
    6. const
    7.     DevStr    = '\Device\GiveIO';
    8.     DosStr    = '\DosDevices\GiveIO';
    9.     UdevStr   : UNICODE_STRING = (Length:0);
    10.     UdosStr   : UNICODE_STRING = (Length:0);
    11.     IOPM_size = $2000;
    12.     IOPM_local: pointer = @IOPM;
    13.  
    14. function DrvCreateDispatch (DrvObj:PDRIVER_OBJECT;Irp:pointer):integer; stdcall;
    15. begin
    16.     Ke386IoSetAccessProcess (IoGetCurrentProcess, 1);
    17.     RtlZeroMemory (IOPM_local, $2000);
    18.     Ke386SetIoAccessMap (1, IOPM_local);
    19.     IoCompleteRequest (Irp, 0);
    20.     DrvCreateDispatch := 0;
    21. end;
    22.  
    23. procedure DrvUnload (DrvObj:PDRIVER_OBJECT); stdcall;
    24. begin
    25.     IoDeleteSymbolicLink (UDosStr);
    26.     IoDeleteDevice (DrvObj.DeviceObject);
    27. end;
    28.  
    29. function _DriverEntry (DrvObj: PDRIVER_OBJECT; RegistryPath :pointer):integer;stdcall; //export ;
    30. var DeviceObject : pointer;
    31. begin
    32.     RTlInitUnicodeString (UdevStr, devStr);
    33.     RTlInitUnicodeString (UdosStr, dosStr);
    34.     IoCreateDevice (DrvObj,0,@UDevStr,FILE_DEVICE_UNKNOWN,0,false,DeviceObject);
    35.     IoCreateSymbolicLink (UDosStr, UDevStr);
    36.     DrvObj.CreateDispatch :=  DrvCreateDispatch;
    37.     DrvObj.DriverUnload   :=  DrvUnload;
    38.     Result := STATUS_SUCCESS;
    39. end;
    40.  
    41. asm  jmp _DriverEntry
    42. end.
    FPC создает COFF файл самостоятельно, без создания промежуточного asm файла с вызовом соответствующей тулзы, (хотя об этом можно попросить), и здесь нужно, обратить внимание на опцию -CX. C ней, помимо основного *XXX.o файла, сгенерируеться дополнительный COFF обьектник в виде "ARCH" библиотеки, (файл вида libXXX.a), наиболее подходящий для скармливания линкеру :)

    Поскольку структуры и данные в ней будут разбиты по мелким частям, многие избыточные зависимости и данные (которые может напихать FPC), просто "сойдут на нет", и линкер соберет готовый бинарь, очень чисто, исключительно из самого необходимого.

    В итоге, для окончательной сборки понадобиться простейшая заглушка (MASM):
    Код (Text):
    1. .386
    2. .model flat
    3. extern PASCALMAIN:proc
    4. .code
    5.  
    6. _NtProcessStartup proc
    7. jmp PASCALMAIN
    8. _NtProcessStartup endp
    9.  
    10. FPC_INITIALIZEUNITS proc
    11. retn
    12. FPC_INITIALIZEUNITS endp
    13. end.
    зы: Free Pascal Compiler поддерживает, COM интерфейсы, что позволяет написать, многофункиональный WDM драйвер. ;)
    В аттаче также прога по работе с дровиной и зажиганию ламп клавы, собраная также в лучших дзенских традициях :)

    Спасибо за внимание!)))
     
  2. ftre

    ftre New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2007
    Сообщения:
    34
    в связи с этим возникает вопрос: нафига козе баян?

    З.Ы. даешь дрова на brainfuck
     
  3. bugaga

    bugaga New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2007
    Сообщения:
    361
    Кстати, приложение пользовательского уровня на "Free Pascal +M$ Link" получаеться тоже не сложным.)))
    Код (Text):
    1. program  kb_leds;  
    2.  
    3. //some kernel32 prototypes
    4. procedure  Sleep(dwMilliseconds: DWORD); stdcall; external name '_Sleep@4';
    5. procedure  CloseHandle(hObject: THandle); stdcall;external name '_CloseHandle@4';
    6.  
    7. function  CreateFileA(lpFileName: PAnsiChar; dwDesiredAccess, dwShareMode: Cardinal;
    8.                      lpSecurityAttributes: pointer;
    9.                      dwCreationDisposition, dwFlagsAndAttributes: DWORD;
    10.                      hTemplateFile: Cardinal): Cardinal; stdcall; external name '_CreateFileA@28';
    11.  
    12. //the best random functiion :)
    13. var RandSeed:integer=0;
    14.  
    15. function  Random(eax:integer):integer;
    16. asm
    17.       imul edx,RandSeed,08088405h
    18.       inc  edx
    19.       mov  RandSeed,edx
    20.       mul  edx
    21.       mov  eax,edx
    22. end;
    23.  
    24. //lowlewel holy shit
    25.  
    26. procedure outKB (_al:byte);
    27. asm
    28.       out $60,al
    29. end;
    30.  
    31. function  inpKB:byte;
    32. asm
    33.       in al, $60
    34. end;
    35.  
    36. label loop;
    37.  
    38. begin
    39.  
    40. CloseHandle (CreateFileA('\\.\\giveio', $80000000, 0, nil, 3, $80, 0));
    41.  
    42.  
    43. loop:
    44.       outKB ($ED);
    45.       outKB (random(5));
    46.  
    47.       Sleep(100);
    48.  
    49.       if inpKB > $80  then goto loop;
    50.  
    51.       outKB ($ED);
    52.       outKB (0);
    53. end.
    если еще не окончательно профакал свой брайн, то попробуй сам себе ответить на этот, "чиста-бокланский" вопрос, гденибудь подальше от моей замечательной темы))))
     
  4. apple

    apple Виктор

    Публикаций:
    0
    Регистрация:
    26 апр 2005
    Сообщения:
    907
    Адрес:
    Russia
    Все это хорошо, но зачем нужно писать драйвера на паскальподобных языках???
     
  5. bugaga

    bugaga New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2007
    Сообщения:
    361
    Обьясняю по слогам :
    "для до-сту-па к пор-там"
     
  6. apple

    apple Виктор

    Публикаций:
    0
    Регистрация:
    26 апр 2005
    Сообщения:
    907
    Адрес:
    Russia
    Ну пиши, пиши...
     
  7. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Я лично не против написания дров на Паскале (ИМХО язык замечательный). Тормозит только отсутствие нормального DDK. Когда-то горел желанием развить имеющийся DDDK 0.4, но "перегорел". Вот если б собрать команду энтузиастов и повторить подвиг Four-F...
     
  8. bugaga

    bugaga New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2007
    Сообщения:
    361
    Да а там писать то неособо, по сути копи-пастишь с C/C++, с минимальными правками)))
    И будет вам DDK)))
     
  9. v0id

    v0id New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2006
    Сообщения:
    3
    bugaga, я таким же на делфи страдал))
    а размер ехе скока получается если с мс линком?
     
  10. bugaga

    bugaga New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2007
    Сообщения:
    361
    v0id
    В целом, очень компактный, не больше, чем на асм-е :)
    ps
    В основном юзал FPC в Linux, и остался хорошего впечатления, от этой тулзы (просто не знаю что без него там делал - наверно плакалъ бы).
    Вобщем так и пришла икея, опробовать его и на системном уровне винды.
    pps
    А почему бы и нет?
     
  11. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Было бы прекрасно иметь возможность писать на нем драйверы в никсах....
     
  12. Voodoo

    Voodoo New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2003
    Сообщения:
    297
    Адрес:
    Новосибирск
    =)) хотя идея интересная, но все-таки попахивает извращением.