![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Использование драйвера
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;