Страница: 1 | 2 | 3 |
Вопрос: Драйвер на бейсике - реально?
Добавлено: 22.03.09 18:41
Автор вопроса: VerhoLom
Я вот тут смотрел примеры из поставки FreeBASIC 0.20 и нашел интересную папку с названием Driver. В ней пример драйвера для ХР. Я еще толком не экспериментировал с ним, но, мне кажется, это все не настолько уж нереально. Я бы был за!
Вот код драйвара:
'' 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
А вот батник для компиляции:
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
Кто что думает по этому поводу?
Ответы
Всего ответов: 34
Номер ответа: 1
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #1
Добавлено: 22.03.09 23:23
Почему бы и нет, если этот компилятор это позволяет. Я лично не знаю, что это за бейсик, но погу предположить. Синтаксис разбирается "basic-компилятором" работающим как препроцессор других ЯВУ, на выходе ассемблерный код, компиляция ассемблерного листинга и последующая компоновка. На мой взгляд возможно и даже очень. Есть даже образцы изображения элементов BASIC-синтаксиса на макросах MASM. )) Возможен как промежуточный другой язык, C например.
Номер ответа: 2
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #2
Добавлено: 23.03.09 02:57
порнография все это. для драйверов юзайте Си. Кроссплатформа и стандарт. И производители выкладывают драйвера в сорцах на си. а от драйвера на бейсике, кроме академического интереса, толку мало. Знаний написание драйверов требует высоких. А не просто натянуть кнопку на форму и дважды по ней клацнуть.
Номер ответа: 3
Автор ответа:
Arseny
ICQ: 298826769
Вопросов: 53
Ответов: 1732
Профиль | | #3
Добавлено: 25.03.09 08:03
Кроссплатформа
FreeBasic - тоже кроссплатформа.
Номер ответа: 4
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #4
Добавлено: 25.03.09 15:24
а запорожец - тоже машина
Номер ответа: 5
Автор ответа:
SergeyZuzic
ICQ: 474690219
Вопросов: 5
Ответов: 155
Web-сайт:
Профиль | | #5
Добавлено: 29.03.09 15:18
Лучше юзай C++ на нем можно
Номер ответа: 6
Автор ответа:
VerhoLom
Вопросов: 20
Ответов: 285
Профиль | | #6
Добавлено: 31.03.09 15:54
Для Ra$cal:
На фрибейсике кнопочек не потягаешь... Это компилятор безо всяких студий...
Номер ответа: 7
Автор ответа:
VerhoLom
Вопросов: 20
Ответов: 285
Профиль | | #7
Добавлено: 31.03.09 15:56
Bообще пора уходить от стереотипов, что бейсик доходной язык... Все-таки он развивается!
Номер ответа: 8
Автор ответа:
VerhoLom
Вопросов: 20
Ответов: 285
Профиль | | #8
Добавлено: 31.03.09 15:58
Для mc-black:
код на фрибейсике переводится в ГАСовский код - он и компилируется...
Номер ответа: 9
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #9
Добавлено: 31.03.09 18:26
Значит я был прав. Гнушный ассемблер)))
Номер ответа: 10
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #10
Добавлено: 31.03.09 22:58
а ОО составляющая языка развивается? А то толку от этого басика? Дрова все равно не его фишка. Есть подозрение, что так и не выдет ниче более серьезного, чем семпловые дровишки.
Номер ответа: 11
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #11
Добавлено: 01.04.09 09:01
Решил я посмотреть что там за FreeBASIC: http://www.freebasic.net/
* A large number of variable types available
* Arrays
* BASIC Compatibility
* Built-in gfx library
* Clean Syntax
* Completely *FREE*
* Create OBJ's, LIB's, DLL's, and console or GUI EXE's
* Debugging support
* Enumerations (ENUM's)
* Escape characters inside literal strings
* Function overloading
* Inline Assembly
* Most of the known C libraries can be used directly, without wrappers
* Multi-platform
* Multi-threading
* Name spaces
* Optimized code generation
* Optional function arguments
* Pointers
* Preprocessor
* Typedefs
* Unicode support
* Unlimited number of symbols
* User-defined Types (UDT's)
* Variable initializers (including arrays and UDT's)
Любопытно, что символика программки - темная лошадка. На что это авторы хотели намекнуть?..
Драйвера на нем конечно массово писать не станут.
ООП - это не необходимость для написания драйверов, хотя C++ (наряду с C и ассемблером и их сочетанием) сегодня стандарт в этой области. Большая куча готовых драйверов нам досталась в наследство еще от C-программистов. Конечно, программер умеющий писать драйвера на C++ / C / ассемблере без труда может написать то же самое и на FreeBASIC, только вот станет ли он это делать? Ответ вы знаете.
А факт, что FreeBASIC на это способен - интересно, но не более.
Номер ответа: 12
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #12
Добавлено: 01.04.09 14:23
дык я и не говорю, что ооп надо для драйверов. просто объективно на фрибейсике писать дрова не будут. значит смотритм, как он подходит под прикладные задачи. там ооп как очень требуется. и судя по всему не очень подходит. а вообще похоже что написанию фрибейсика способствовали холивары о способностях бейсиков, и они решили сделать бейсик, с блекджеком и шлюхами, чтобы был аргумент в холиварах. не вижу я в нем смысла. c++ не заменит, а кто юзать будет - хз.
Номер ответа: 13
Автор ответа:
VerhoLom
Вопросов: 20
Ответов: 285
Профиль | | #13
Добавлено: 06.04.09 15:33
в драйвере на С++ не сильно то ООП и попользуешь. RTL, знаете-ли...
Номер ответа: 14
Автор ответа:
VerhoLom
Вопросов: 20
Ответов: 285
Профиль | | #14
Добавлено: 06.04.09 15:35
Я б ы несильно зацикливался на Бейсике в Фрибейсике как языке, т. к. компилируется то все-таки ассемблер... (ГАС)
Номер ответа: 15
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #15
Добавлено: 06.04.09 16:18
На GCC (G++) тот же самый GAS, только язык C++ все-таки богаче оснащен по своей природе )