FreeBasic умеет делать драйвера?

Предыдущая тема Следующая тема Перейти вниз

FreeBasic умеет делать драйвера?

Сообщение  vbman в Вс Мар 22, 2009 6:31 pm

Я вот тут смотрел на примеры из поставки FreeBasic и обнаружил интересный пример в папке Driver. Это выходит, что на FreeBasic можно писать драйвера? Shocked

У кого каккие мнения на этот счет?

Вот текст драйвера:

Код:

'' NT driver example, written by voodooattack
   
    #include once "win\ddk\winddk.bi"
   
    #undef fb_RtInit
   
    declare function DriverEntry stdcall alias "DriverEntry" (byval pDriverObject as PDRIVER_OBJECT, _
                                                      byval pRegistryPath as PUNICODE_STRING) as NTSTATUS
   
   
   
    static shared dev_name as wstring ptr = @wstr("\Device\FBExample")
    static shared dev_dos_name as wstring ptr = @wstr("\DosDevices\FBExample")
   
    declare sub fb_RtInit stdcall alias "fb_RtInit"()
   
    declare function FBDriver_UnsupportedFunction(byval as PDEVICE_OBJECT, byval as PIRP) as NTSTATUS
    declare function FBDriver_Create(byval as PDEVICE_OBJECT, byval as PIRP) as NTSTATUS
    declare function FBDriver_Close(byval as PDEVICE_OBJECT, byval as PIRP) as NTSTATUS
    declare function FBDriver_IoControl(byval as PDEVICE_OBJECT, byval as PIRP) as NTSTATUS
    declare function FBDriver_Read(byval as PDEVICE_OBJECT, byval as PIRP) as NTSTATUS
    declare function FBDriver_Write(byval as PDEVICE_OBJECT, byval as PIRP) as NTSTATUS
    declare sub FBDriver_Unload(byval as PDRIVER_OBJECT)
   
   
    function DriverEntry(byval pDriverObject as PDRIVER_OBJECT, _
                        byval pRegistryPath as PUNICODE_STRING) as NTSTATUS
       
        dim Status as NTSTATUS = STATUS_SUCCESS
        dim pDeviceObject as PDEVICE_OBJECT = NULL
       
        dim as UNICODE_STRING usDriverName, usDosDeviceName
        dim i as integer
       
        DbgPrint(@!"FBExample: DriverEntry Called \r\n")
       
        RtlInitUnicodeString(@usDriverName, dev_name)
        RtlInitUnicodeString(@usDosDeviceName, dev_dos_name)
   
        Status = IoCreateDevice(pDriverObject, _
                                0, _
                                @usDriverName, _
                                FILE_DEVICE_UNKNOWN, _
                                FILE_DEVICE_SECURE_OPEN, _
                                FALSE, _
                                @pDeviceObject)
       

        if (Status = STATUS_SUCCESS) then
           
            DbgPrint(@!"FBExample: Device created \r\n")
           
            for i = 0 to IRP_MJ_MAXIMUM_FUNCTION - 1
                pDriverObject->MajorFunction(i) = @FBDriver_UnsupportedFunction
            next
           
            with *pDriverObject
                .MajorFunction(IRP_MJ_CLOSE)  = @FBDriver_Close
                .MajorFunction(IRP_MJ_CREATE) = @FBDriver_Create
                .MajorFunction(IRP_MJ_DEVICE_CONTROL) = @FBDriver_IoControl
                .MajorFunction(IRP_MJ_READ) = @FBDriver_Read
                .MajorFunction(IRP_MJ_WRITE) = @FBDriver_Write
                .DriverUnload = @FBDriver_Unload
                .Flags or= DO_DIRECT_IO
                .Flags and= NOT (DO_DEVICE_INITIALIZING)
            end with
           
            IoCreateSymbolicLink(@usDosDeviceName, @usDriverName)
        else
            DbgPrint(@!"FBExample: Error creating device \r\n")
        end if
       
        return Status
       
    end function
   
    sub fb_RtInit()
        DbgPrint(@!"FBExample: fb_RtInit Called \r\n")
        return
    end sub
   
    declare function KeTickCount stdcall alias "KeTickCount" () as PLARGE_INTEGER
   
    function KeTickCount () as LARGE_INTEGER ptr
        static as LARGE_INTEGER c
        KeQueryTickCount(@c)
        return @c
    end function
   
    sub FBDriver_Unload(byval DriverObject as PDRIVER_OBJECT)
       
        dim usDosDeviceName as UNICODE_STRING
       
        DbgPrint(@!"FBExample: unloading.. \r\n")
       
        RtlInitUnicodeString(@usDosDeviceName, dev_dos_name)
       
        IoDeleteSymbolicLink(@usDosDeviceName)
        IoDeleteDevice(DriverObject->DeviceObject)
       
    end sub
   
    function FBDriver_UnsupportedFunction(byval DeviceObject as PDEVICE_OBJECT, byval Irp as PIRP) as NTSTATUS
        DbgPrint(@!"FBExample: Unsupported Function \r\n")
        return STATUS_NOT_SUPPORTED
    end function
   
    function FBDriver_Create(byval DeviceObject as PDEVICE_OBJECT, byval Irp as PIRP) as NTSTATUS
        DbgPrint(@!"FBExample: FBDriver_Create \r\n")
        return STATUS_SUCCESS
    end function

    function FBDriver_Close(byval DeviceObject as PDEVICE_OBJECT, byval Irp as PIRP) as NTSTATUS
        DbgPrint(@!"FBExample: FBDriver_Close \r\n")
        return STATUS_SUCCESS
    end function

    function FBDriver_IoControl(byval DeviceObject as PDEVICE_OBJECT, byval Irp as PIRP) as NTSTATUS
        DbgPrint(@!"FBExample: FBDriver_IoControl \r\n")
        return STATUS_SUCCESS
    end function

    function FBDriver_Read(byval DeviceObject as PDEVICE_OBJECT, byval Irp as PIRP) as NTSTATUS
        DbgPrint(@!"FBExample: FBDriver_Read \r\n")
        return STATUS_SUCCESS
    end function

    function FBDriver_Write(byval DeviceObject as PDEVICE_OBJECT, byval Irp as PIRP) as NTSTATUS
        DbgPrint(@!"FBExample: FBDriver_Write \r\n")
        return STATUS_SUCCESS
    end function

А вот - компиляционный батник:

Код:
@echo off
set drvname=driver

fbc %drvname%.bas -c

link %drvname%.o /DRIVER /align:0x80 /FULLBUILD /base:0x10000 /release /osversion:5.1 /version:5.1 /OPT:ICF /OPT:REF /SECTION:INIT,d /MERGE:_PAGE=PAGE /MERGE:.data=PAGE /MERGE:.ctors=PAGE /MERGE:_INIT=INIT /MERGE:_TEXT=.text /subsystem:native,5.01 /entry:GsDriverEntry@8 bufferoverflowk.lib ntoskrnl.lib /OUT:%drvname%.sys

Я бы всеми четырьмя конечностями был ЗА! rabbit bounce cheers sunny bom lol!
avatar
vbman

Сообщения : 52
Дата регистрации : 2008-11-19
Возраст : 36
Откуда : Украина, Кировоград

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: FreeBasic умеет делать драйвера?

Сообщение  DiG. GeRR в Вс Мар 22, 2009 8:11 pm

Блин, а оказывается правда можно... Только страшновато. Нет отладчика в исходных кодах, поэтому отлаживать сайсом в ассемблерных инструкциях неудобно будет. И большой размер файла, к тому же неоптимизированный код, а для режима ядра это критически важно. А в остальном все рабоче.
Дрова надо писать на си или асме, остальное не признаю...

DiG. GeRR

Сообщения : 101
Дата регистрации : 2009-01-30
Возраст : 25
Откуда : Рудный, Казахстан

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: FreeBasic умеет делать драйвера?

Сообщение  vbman в Вс Мар 22, 2009 8:15 pm

DiG. GeRR пишет:Блин, а оказывается правда можно... Только страшновато. Нет отладчика в исходных кодах, поэтому отлаживать сайсом в ассемблерных инструкциях неудобно будет. И большой размер файла, к тому же неоптимизированный код, а для режима ядра это критически важно. А в остальном все рабоче.
Дрова надо писать на си или асме, остальное не признаю...

А если опция -g? Question
avatar
vbman

Сообщения : 52
Дата регистрации : 2008-11-19
Возраст : 36
Откуда : Украина, Кировоград

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: FreeBasic умеет делать драйвера?

Сообщение  DiG. GeRR в Вс Мар 22, 2009 8:27 pm

-g? Это не так много дает - по большому счету, только имена переменных и функций. Но и дело не в этом. Сложно к тому же будет найти какие-то исходники именно на фб, только на си. А зачем переводить с си, если можно на нем писать?

DiG. GeRR

Сообщения : 101
Дата регистрации : 2009-01-30
Возраст : 25
Откуда : Рудный, Казахстан

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: FreeBasic умеет делать драйвера?

Сообщение  tux в Вс Мар 22, 2009 8:35 pm

Дрова надо писать на си или асме, остальное не признаю...
во превых код на ФБ немногим то хуже, чем на Си, единственное, там меньше оптимизации, а во сторых компилятор транслирует код в ассемблер, а потом компилит в бинарник, и кк тому же встроенный ассемблер никто не отменял, где необходима высокая производительность, то мона прям в коде кусок на асме написать
А зачем переводить с си, если можно на нем писать?
а зачем переводить, когда откомпиленый кусок кода на Си прекрасно линкуется с кодом, написаным на ФБ (гдето на форуме я ето демонстрировал)
avatar
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 29
Откуда : Сибирь

Посмотреть профиль http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Re: FreeBasic умеет делать драйвера?

Сообщение  DiG. GeRR в Вс Мар 22, 2009 8:39 pm

а зачем переводить, когда откомпиленый кусок кода на Си прекрасно линкуется с кодом, написаным на ФБ (гдето на форуме я ето демонстрировал)

И зачем тогда нужен фрибацик? Просто ради спортивного интереса?

DiG. GeRR

Сообщения : 101
Дата регистрации : 2009-01-30
Возраст : 25
Откуда : Рудный, Казахстан

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: FreeBasic умеет делать драйвера?

Сообщение  tux в Вс Мар 22, 2009 8:47 pm

ну а зачем тогда по вашему нужен Си?
лично мне иногда удобней написать код на ФБ, допустим когда надо много работать со строками
Да и всегда хорошо, когда есть алтернативные инструменты для аналогичных задач, у каждого свои предпочтения...
avatar
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 29
Откуда : Сибирь

Посмотреть профиль http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Re: FreeBasic умеет делать драйвера?

Сообщение  Andrew в Чт Мар 26, 2009 9:50 pm

блин, вот это все так красивенько звучит "драайвеерр...". А для чего собсно он нужен в данном случае ???
Это же обычное приложение как и все, только с непосредственным общением с железом, что можно было и с помощью встроенного асма реализовать (как мне кажется).

P.S. Или же оно компилится не в .exe ?

Andrew

Сообщения : 45
Дата регистрации : 2008-09-23
Возраст : 29
Откуда : Киев

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: FreeBasic умеет делать драйвера?

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу

- Похожие темы

 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения