Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Использование драйвера


Страницы:   1 2

Duk_ ©   (2005-07-31 19:12:00) 

Как подключить и использовать драйвер. Если у кого-то есть пример - поделитесь!!!


Eraser   (2005-08-01 21:23:00) [21]

Duk_ ©   (01.08.05 17:59) [9]

n0name: cкинь.
Загрузчик:
procedure Port;
function FullPath: String;
begin
result:='d:\port_please\beeper.sys';
end;
var           hSCManager: SC_Handle;
          acDriverPath: String;
              hService: SC_Handle;
                  temp: PChar;
begin
hSCManager:=OpenSCManager(nil,nil,SC_MANAGER_CREATE_SERVICE);
If hSCManager>0 Then Begin
acDriverPath:='d:\port_please\beeper.sys';
 temp:=nil;
 hService:=CreateService(hSCManager, 'beeper', 'beeper',
                     SERVICE_ALL_ACCESS,
                     SERVICE_KERNEL_DRIVER,
                     SERVICE_DEMAND_START,
                     SERVICE_ERROR_NORMAL,
                     PChar(acDriverPath), nil, nil,
                     nil, nil, nil);

If hService<>0 Then Begin
 Temp:=nil;

 StartService(hService,0,Temp);
 DeleteService(hService);
 CloseServiceHandle(hService);
end Else Application.MessageBox('Can not register driver','PortOut',mb_ok);
CloseServiceHandle(hSCManager);
end Else Application.MessageBox('Can not connect to Service Control Manager','PortOut',mb_ok);
end;


Так что, тут не работает? Что отладчик говорит? Что ф-ии возвращают?


Duk_   (2005-08-01 19:13:00) [22]

...


Duk_   (2005-08-01 17:59:00) [23]

n0name: cкинь.
Загрузчик:
procedure Port;
function FullPath: String;
begin
 result:='d:\port_please\beeper.sys';
end;
var           hSCManager: SC_Handle;
           acDriverPath: String;
               hService: SC_Handle;
                   temp: PChar;
begin
hSCManager:=OpenSCManager(nil,nil,SC_MANAGER_CREATE_SERVICE);
If hSCManager>0 Then Begin
 acDriverPath:='d:\port_please\beeper.sys';
  temp:=nil;
  hService:=CreateService(hSCManager, 'beeper', 'beeper',
                      SERVICE_ALL_ACCESS,
                      SERVICE_KERNEL_DRIVER,
                      SERVICE_DEMAND_START,
                      SERVICE_ERROR_NORMAL,
                      PChar(acDriverPath), nil, nil,
                      nil, nil, nil);

 If hService<>0 Then Begin
  Temp:=nil;

  StartService(hService,0,Temp);
  DeleteService(hService);
  CloseServiceHandle(hService);
 end Else Application.MessageBox('Can not register driver','PortOut',mb_ok);
 CloseServiceHandle(hSCManager);
end Else Application.MessageBox('Can not connect to Service Control Manager','PortOut',mb_ok);
end;

Драйвер:
.386
.model flat, stdcall
option casemap:none

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                  I N C L U D E   F I L E S                                        
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

include \masm32\include\w2k\ntstatus.inc
include \masm32\include\w2k\ntddk.inc

include \masm32\include\w2k\hal.inc

includelib \masm32\lib\w2k\hal.lib

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                           U S E R   D E F I N E D   E Q U A T E S                                
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

TIMER_FREQUENCY equ 1193167   ; 1,193,167 Hz
OCTAVE   equ 2

;PITCH_A  equ 440    ;  440,00 Hz
;PITCH_As  equ 446    ;  466,16 Hz
;PITCH_H  equ 494    ;  493,88 Hz
PITCH_C   equ 523    ;  523,25 Hz
PITCH_Cs  equ 554    ;  554,37 Hz
PITCH_D   equ 587    ;  587,33 Hz
PITCH_Ds  equ 622    ;  622,25 Hz
PITCH_E   equ 659    ;  659,25 Hz
PITCH_F   equ 698    ;  698,46 Hz
PITCH_Fs  equ 740    ;  739,99 Hz
PITCH_G   equ 784    ;  783,99 Hz
PITCH_Gs  equ 831    ;  830,61 Hz
PITCH_A   equ 880    ;  880,00 Hz
PITCH_As  equ 988    ;  987,77 Hz
PITCH_H   equ 1047   ; 1046,50 Hz

; We are going to play c-major chord

TONE_1   equ TIMER_FREQUENCY/(PITCH_C*OCTAVE)
TONE_2   equ TIMER_FREQUENCY/(PITCH_E*OCTAVE)
TONE_3   equ (PITCH_G*OCTAVE); for HalMakeBeep

DELAY   equ 2000000h  ; for my ~1000mHz machine

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                           U S E R   D E F I N E D   M A C R O S                                  
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DO_DELAY MACRO
; Silly method, but it works ;-)
mov eax, DELAY
.while eax
 dec eax
.endw
ENDM

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                          C O D E                                                  
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

.code

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                         MakeBeep1                                                
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

MakeBeep1 proc dwPitch:DWORD

; Direct hardware access

cli

mov al, 10110110y
out 43h, al         ; Timer 8253-5 (AT: 8254.2).

mov eax, dwPitch
out 42h, al

mov al, ah
out 42h, al

; speaker ON
in al, 61h
or  al, 11y
out 61h, al

sti

DO_DELAY

cli

; speaker OFF
in al, 61h
and al, 11111100y
out 61h, al

sti

ret

MakeBeep1 endp

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                            MakeBeep2                                              
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

MakeBeep2 proc dwPitch:DWORD

; Hardware access via HAL using *_PORT_UCHAR/*_PORT_UCHAR functions

cli

invoke WRITE_PORT_UCHAR, 43h, 10110110y

mov eax, dwPitch
and eax, 0FFh
invoke WRITE_PORT_UCHAR, 42h, eax
mov eax, dwPitch
shr eax, 8
and eax, 0FFh
invoke WRITE_PORT_UCHAR, 42h, eax

; speaker ON
invoke READ_PORT_UCHAR, 61h
or  al, 11y
and eax, 0FFh
invoke WRITE_PORT_UCHAR, 61h, eax

sti

DO_DELAY

cli

; speaker OFF
invoke READ_PORT_UCHAR, 61h
and al, 11111100y
and eax, 0FFh
invoke WRITE_PORT_UCHAR, 61h, eax

sti

ret

MakeBeep2 endp

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                       DriverEntry                                                
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING

invoke MakeBeep1, TONE_1
invoke MakeBeep2, TONE_2

; Hardware access via hal.dll function HalMakeBeep
invoke HalMakeBeep, TONE_3
DO_DELAY
invoke HalMakeBeep, 0

mov eax, STATUS_DEVICE_CONFIGURATION_ERROR
ret

DriverEntry endp

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                                                                                  
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

end DriverEntry

Кстати мой загрузчик на асме работает нормально.


n0name   (2005-08-01 16:17:00) [24]

>>Игорь Шевченко ©   (01.08.05 14:47) [6]
Код не мой, где-то нашёл.
>>Duk_ ©   (01.08.05 14:14) [5]
Покажи как ты используешь функции.
Как ты писал драйвер? Пиликает при инициализации?
>>Duk_ ©   (01.08.05 15:47) [7]
Могу скинуть рельно работающий код на мыло, сам пимал - сам проверял, но он большой, чтоб публиковать тут.


Duk_   (2005-08-01 15:47:00) [25]

А реально что-то рабочее, кто-то может дать???


Игорь Шевченко   (2005-08-01 14:47:00) [26]

n0name   (31.07.05 19:57) [1]

А обработка или индикация ошибок нафиг не сдались


Duk_   (2005-08-01 14:14:00) [27]

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


n0name   (2005-08-01 07:51:00) [28]

Не работает, как не работает?
Не компилируется или не устанавливается драйвер, или не запускается?
Подключи WinSvc(насколько я помню).


Eraser   (2005-08-01 01:57:00) [29]

Duk_ ©   (31.07.05 20:46) [2]
Кстати, для чего SendString.


Демонстрирует взаимодействие драйвера с приложением, в данном случае посылается строка драйверу.


Duk_   (2005-07-31 20:46:00) [30]

n0name: Почему-то не работает. Кстати, для чего SendString.


n0name   (2005-07-31 19:57:00) [31]


procedure SendString(Str: PChar);
var
hDriver: dword;
Written: dword;
begin
hDriver := CreateFile('\\.\MyDriver', GENERIC_WRITE,
                      0, nil, OPEN_EXISTING, 0, 0);
WriteFile(hDriver, Str^, lstrlen(Str), Written, nil);
CloseHandle(hDriver);
end;


function InstallDriver: boolean;
const
 DrvName  = 'Driver';
 FullPath = 'c:\driver.sys';
var
 hSCM, hSRV: dword;
 sParam: PChar;
begin
 Result := false;
 hSCM := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
 if hSCM = INVALID_HANDLE_VALUE then Exit;
 // создание системной записи о драйвере
 hSRV := CreateService(hSCM, DrvName, DrvName,
                       SERVICE_ALL_ACCESS,
                       SERVICE_KERNEL_DRIVER,
                       SERVICE_DEMAND_START,
                       SERVICE_ERROR_NORMAL,
                       FullPath, nil, nil,
                       nil, nil, nil);

 if hSRV = INVALID_HANDLE_VALUE then Exit;
 //запускаем драйвер
 StartService(hSRV, 0, sParam);
 //очистка ресурсов
 CloseServiceHandle(hSRV);
 CloseServiceHandle(hSCM);
 Result := true;
end;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо