· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Драйвер в ФАСМ

. 1 . 2 . 3 . >>

Посл.отвђт Сообщенiе


Дата: Июл 25, 2004 18:36:00

Происходит ошибка при попытке загрузить драйвер beep.sys (из туториалов Four-F) Драйвер написан на FASM:
format PE native at 10000h
entry start
include 'C:\ра\Fasm\Projects\beep\beep.inc'
section '.code' code readable executable
proc start,pDriverObject,pusRegistryPath
enter
  stdcall MakeBeep1, TONE_1
  stdcall MakeBeep1, TONE_2
  ; Прямой доступ к оборудованию используя функцию HalMakeBeep из модуля hal.dll
  stdcall MakeBeep1, TONE_3
  DO_DELAY
  stdcall MakeBeep1, 0
  mov eax, ERROR_INVALID_PARAMETER
  
  
  
  
return
proc MakeBeep1,dwPitch
enter
     cli
     mov al, 10110110b
     out 43h, al
     mov eax, [dwPitch]
     out 42h, al
     mov al, ah
     out 42h, al
     ; включить динамик
     in al, 61h
     or  al, 11b
     out 61h, al
     sti
     DO_DELAY
     cli
     ; выключить динамик
     in al, 61h
     and al, 11111100b
     out 61h, al
     sti
return
;end section '.code'
section '.idata' import data readable writeable
      _library kernel32,'KERNEL32.DLL',\
	     user32,'USER32.DLL',\
	     gdi32,'GDI32.DLL',\
	     advapi32,'ADVAPI32.DLL',\
	     comctl32,'COMCTL32.DLL',\
	     comdlg32,'COMDLG32.DLL',\
	     shell32,'SHELL32.DLL',\
	     wsock32,'WSOCK32.DLL';,\
	     ;MSVFW32,'MSVFW32.dll'

     include 'C:\FASM135\147\INCLUDE\apia\kernel32.inc'
     include 'C:\FASM135\147\INCLUDE\apia\user32.inc'
     include 'C:\FASM135\147\INCLUDE\apia\gdi32.inc'
     include 'C:\FASM135\147\INCLUDE\apia\advapi32.inc'
     include 'C:\FASM135\147\INCLUDE\apia\comctl32.inc'
     include 'C:\FASM135\147\INCLUDE\apia\comdlg32.inc'
     include 'C:\FASM135\147\INCLUDE\apia\shell32.inc'
     include 'C:\FASM135\147\INCLUDE\apia\wsock32.inc'
;end section '.idata'  

Программа загружающая драйвер:
format PE GUI 4.0
entry start
include 'C:\ра\Fasm\Projects\Usedriver\Usedriver.inc'
section '.code' code readable executable
proc start
enter
	invoke OpenSCManager,0,0, SC_MANAGER_CREATE_SERVICE
	cmp    eax,0
	je   .errNoOpenMan
	mov    [hSCManager],eax
	push eax
  invoke GetFullPathName, DriverName,acDriverPath.size,acDriverPath, esp
  cmp  eax,0
  je  .errName
  pop eax
	invoke CreateService, [hSCManager], NameDrv, OpisDrv, SERVICE_START + DELETE, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_IGNORE, acDriverPath, NULL, NULL, NULL, NULL, NULL
	cmp    eax,0
	je   .errNoCreateServ
	mov [hService], eax
  invoke StartService, [hService], 0, NULL
  invoke DeleteService, [hService]
  invoke CloseServiceHandle, [hService]
  invoke CloseServiceHandle, [hSCManager]
	jmp  .finish
	
	.errNoOpenMan:
	   invoke   MessageBox,0,ErrNoOpenMan,ErrorMessage,MB_OK
	   jmp  .finish
	   
	.errNoCreateServ:
	   invoke   GetLastError
	   stdcall  IntToString,buff,eax
	   invoke   MessageBox,0,buff,ErrorMessage,MB_OK
	   
	   jmp  .finish
	.errName:   
	   invoke   MessageBox,0,ErrName,ErrorMessage,MB_OK
	   
	   jmp  .finish
	.finish:
	  invoke  ExitProcess,0
return

;end section '.code'
section '.idata' import data readable writeable
      _library kernel32,'KERNEL32.DLL',\
	     user32,'USER32.DLL',\
	     gdi32,'GDI32.DLL',\
	     advapi32,'ADVAPI32.DLL',\
	     comctl32,'COMCTL32.DLL',\
	     comdlg32,'COMDLG32.DLL',\
	     shell32,'SHELL32.DLL',\
	     wsock32,'WSOCK32.DLL';,\
	     ;MSVFW32,'MSVFW32.dll'

     include 'C:\FASM135\147\INCLUDE\apia\kernel32.inc'
     include 'C:\FASM135\147\INCLUDE\apia\user32.inc'
     include 'C:\FASM135\147\INCLUDE\apia\gdi32.inc'
     include 'C:\FASM135\147\INCLUDE\apia\advapi32.inc'
     include 'C:\FASM135\147\INCLUDE\apia\comctl32.inc'
     include 'C:\FASM135\147\INCLUDE\apia\comdlg32.inc'
     include 'C:\FASM135\147\INCLUDE\apia\shell32.inc'
     include 'C:\FASM135\147\INCLUDE\apia\wsock32.inc'

Вы даётся сообщение об ошибке:
Не удалось загрузить драйвер устройства Код ошибки 0xc0000018


Дата: Июл 25, 2004 20:21:19

Код я не смотрел, т.к. не ясно в какой момент ошибка, но... c0000018 = "Попытка обращения к неверному адресу".

Кстати, драйвер beep уже есть в системе.


Дата: Июл 25, 2004 20:55:20

А что должен делать beep.sys? А то я удалил записи в реестре о нём.


Дата: Июл 25, 2004 21:23:44

Диалог на эту тему есть на FASM форуме.
include 'C:\ра\Fasm\Projects\beep\beep.inc' что в этой библиотеке?


Дата: Июл 25, 2004 21:24:26

У вас не верно оформленна секция инициялизации драйвера смотрите пример с FASM
;##################################################################### #####
; beeper
; 14.09.2003 - 16.10.2003
; coded by comrade <comrade2k@hotmail.com>
; IRC: #asm, #coders, #win32asm on EFnet
; Web: http://comrade64.cjb.net/
; http://comrade.win32asm.com/
; Much credits to Four-F, BiDark, Kevin Zheng, and Privalov.
;##################################################################### #####
format PE native 4.0 at 10000h
entry DriverEntry
;##################################################################### #####
_TITLE equ "beeper"
_NAME equ "beeper"
_VERSION equ "0.0"
_VERSIONTEXT equ _VERSION
;##################################################################### #####
include "%include%/win32a.inc"
include "%include%/macro/if.inc"
include "%include%/macro/macros.inc"
OFFSET equ
;##################################################################### #####
;##################################################################### #####
;##################################################################### #####
section '.text' code readable executable notpageable
;##################################################################### #####
;##################################################################### #####
;##################################################################### #####
proc DriverEntry,pDriverObject,pusRegistryPath
enter
cli
; speaker ON
in al,61h
or al,11b
out 61h,al
sti
mov ecx,18000000h
@@: loop @B
cli
; speaker OFF
in al,61h
and al,11111100b
out 61h,al
sti
.hal: stdcall [HalMakeBeep],1568
mov ecx,18000000h
@@: loop @B
stdcall [HalMakeBeep],0
.quit: mov eax,0C0000182h
return
;##################################################################### #####
section '.rdata' import readable notpageable
syslibrary hal,"hal.dll"
import hal,HalMakeBeep,"HalMakeBeep"
;##################################################################### #####
szAppTitle db _TITLE,0
;##################################################################### #####
section ".rsrc" resource data readable discardable
; identifiers
IDV_MAIN = 01
; resources
directory RT_VERSION,versions
resource versions,IDV_MAIN,SUBLANG_NEUTRAL+LANG_NEUTRAL,version
; version
version version,VOS__WINDOWS32,VFT_APP,VFT2_UNKNOWN,SUBLANG_NEUTRAL+LANG_NEUTR AL,0,\
"FileDescription",_TITLE,\
"LegalCopyright",<0A9h," comrade">,\
"FileVersion",_VERSION,\
"ProductVersion",_VERSION,\
"ProductName",_TITLE,\
"InternalName",_NAME,\
"OriginalFilename",<_NAME,".exe">
;##################################################################### #####
section '.reloc' data fixups readable discardable
;##################################################################### #####
;##################################################################### #####


Дата: Июл 25, 2004 22:01:56

ProgramMan
Константы. С форума flatassembler взял пару исходников, поправил в соответствии с ними, но всё равно не идёт. Мой загрущик чужой драйвер загружает, а свой не получается.


Дата: Июл 25, 2004 22:40:54

[ pas: А что должен делать beep.sys? ]

А хрен его знает. Он совсем крошечный - возьми посмотри.


[ pas: А то я удалил записи в реестре о нём. ]

:-\ это зачем ? Не правильнее ли свою дровину переименовать.


Дата: Июл 26, 2004 04:15:25

Four-F
Не правильнее ли свою дровину переименовать.
Правильней, но тогда я не знал, что это системная запись :-(. Хотя вроде и без неё пока работает.


Дата: Июл 26, 2004 17:24:14

Почему если я убираю вызов call [imp_HalMakeBeep] возникает ошибка 0с0000018h.
format PE DLL native 4.0 at 10000h 
entry main 

include 'C:\FASM135\fasmw152\INCLUDE\win32a.inc' 

section '.text' code readable executable notpageable 
proc MakeBeep1,dwPitch 
        enter 
;MakeBeep1:
        cli 
        mov     al,0B6h 
        out     43h,al 
        mov     eax,[dwPitch] 
        out     42h,al 
        mov     al,ah 
        out     42h,al 
        in      al,61h 
        or      al,3 
        out     61h,al 
        sti 
        mov     eax,1800000h 
     .delay_loop: 
        dec     eax 
        or      eax,eax 
        jnz     .delay_loop 
        cli 
        in      al,61h 
        and     al,0FCh 
        out     61h,al 
        sti 
        return 
;endp
;MakeBeep2:


proc main,pDriverObject,pDriverPath 
        enter 
;main:
        push    474h 
        call    MakeBeep1 
        push    389h 
        call    MakeBeep1 
        push    620h 
        call    MakeBeep1  
        mov     eax,1800000h 
.delay_loop: 
        dec     eax 
        or      eax,eax 
        jnz     .delay_loop 
        ;push    0 
        ;call    [imp_HalMakeBeep] 
        mov     eax,0C0000182h 
        return 
align 32       
section '.rdata' readable notpageable 

data 13 

  ImportLookup: 
        dd rva szRead_port_uc 
        dd rva szWrite_port_uc 
        dd rva szHalmakebeep 
        dd 0 

end data 
align 32
section 'INIT' import readable notpageable 

        dd rva ImportLookup 
        dd 0 
        dd 0 
        dd rva szHal_dll 
        dd rva ImportAddress 
        times 5 dd 0 

  ImportAddress: 
        imp_READ_PORT_UCHAR         dd rva szRead_port_uc 
        imp_WRITE_PORT_UCHAR        dd rva szWrite_port_uc 
        imp_HalMakeBeep             dd rva szHalmakebeep 

  szHalmakebeep     dw 0 
                    db 'HalMakeBeep',0 
  szRead_port_uc    dw 0 
                    db 'READ_PORT_UCHAR',0 
  szWrite_port_uc   dw 0 
                    db 'WRITE_PORT_UCHAR',0 

  szHal_dll db 'HAL.dll',0 
align 32
section '.reloc' data fixups readable discardable 


Дата: Июл 26, 2004 17:31:46

У тебя в загрузчике есть один баг: если невозможно создать сервис, то нужно попробовать его открыть (OpenService), т.к. в случее если сервис уже создан CreateService возвращает ошибку.
Мой загрущик чужой драйвер загружает, а свой не получается.
Значит плохо правил. Выложи, что получилось.


Дата: Июл 26, 2004 17:37:33 · Поправил: pas

ProgramMan
Но если создать не получается выдаётся сообщение с кодом ошибки. Код приведённый выше работает если функцию call [imp_HalMakeBeep] раскомментировать (c push-ем естественно)
Да ещё
У тебя в загрузчике есть один баг
Это не баг это фишка :-)


Дата: Июл 26, 2004 18:26:08

Это великий и ужасный глюк FASM компилятора!!!
Я с ним сталкивался, но так и ненашёл :(
Похоже что-то там связанно с размером кода или выравневанием...
Такой код например тоже будет работать:
format PE DLL native 4.0 at 10000h
entry main

include '%include%\win32a.inc'

section '.text' code readable executable notpageable

TableGDT:
LTable dw 0h
BTable db '000'
ETable db 0h
proc main,pDriverObject,pDriverPath
push eax
push ebx
SGDT [TableGDT]
mov ax,[LTable]
mov ebx,Dword[BTable]



pop ebx
pop eax
return
endp
section 'INIT' code import readable notpageable
dd rva szHal_dll
times 5 dd 0
szHal_dll db 'HAL.dll',0
section '.reloc' data fixups readable discardable


Дата: Июл 26, 2004 18:28:24

FASM 1.52


Дата: Июл 26, 2004 19:19:03

Загрузил 1.53. Посмотрю, что получится.


Дата: Июл 26, 2004 19:47:37

На нём тоже не всё работает

. 1 . 2 . 3 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.183