procedure MakeBeep1(dwPitch: DWORD); stdcall; assembler; asm cli mov al, 10110110b out 43h, al mov eax, dwPitch out 42h, al mov al, ah out 42h, al {Turn speaker ON} in al, 61h or al, 11b out 61h, al sti push eax mov eax, DELAY @@1: dec eax jnz @@1 pop eax cli {Turn speaker OFF} in al, 61h and al, 11111100b out 61h, al
sti end;
procedure MakeBeep2(dwPitch: DWORD); stdcall; var dwPort, i: DWORD; begin asm cli; end; WRITE_PORT_UCHAR(PUCHAR($43), $b6); WRITE_PORT_UCHAR(PUCHAR($42), dwPitch and $FF); WRITE_PORT_UCHAR(PUCHAR($42), ((dwPitch shr 8) and $FF)); dwPort := READ_PORT_UCHAR(PUCHAR($61)); dwPort := dwPort or 3; WRITE_PORT_UCHAR(PUCHAR($61), dwPort); asm sti end; for i := 1 to DELAY do begin end; asm cli end; { Turn speaker OFF } dwPort := READ_PORT_UCHAR(PUCHAR($61)); dwPort := dwPort and $FC; WRITE_PORT_UCHAR(PUCHAR($61), dwPort); asm sti end; end;
function _DriverEntry(DriverObject:PDriverObject;RegistryPath:PUnicodeString):NTSTATUS; stdcall; var i: integer; begin MakeBeep1(TONE_1); MakeBeep2(TONE_2); HalMakeBeep(TONE_3);
for i := 1 to DELAY do begin end; HalMakeBeep(0); Result := STATUS_DEVICE_CONFIGURATION_ERROR; end;
end. 代码:unit hal;
interface
uses Windows;
const NtHal = 'hal.dll';
function HalMakeBeep(Frequency: ULONG):BOOLEAN; stdcall; function READ_PORT_UCHAR(Port:PUCHAR):UCHAR; stdcall; procedure WRITE_PORT_UCHAR(Port: PUCHAR; Value: UCHAR); stdcall;
implementation
function HalMakeBeep(Frequency: ULONG):BOOLEAN; stdcall; external NtHal name '_HalMakeBeep'; function READ_PORT_UCHAR(Port:PUCHAR):UCHAR; stdcall; external NtHal name '_READ_PORT_UCHAR'; procedure WRITE_PORT_UCHAR(Port: PUCHAR; Value: UCHAR); stdcall; external NtHal name '_WRITE_PORT_UCHAR';