Friday, 27 September 2013

Why i haven't got any beep from my kernel driver

Why i haven't got any beep from my kernel driver

I want to do beep whis IOCTL_BEEP_SET, but i hear only some slight knock
out from speaker.. Where is my problem? I want to create code that i can
run on difference versions of Windows. And don't want to write port and
using HalMakeBeep().
NTSTATUS Beep(IN DWORD dwFreq, IN DWORD dwDuration)
{
HANDLE hBeep;
UNICODE_STRING BeepDevice;
OBJECT_ATTRIBUTES oaBeepAttr;
IO_STATUS_BLOCK IoStatusBlock;
BEEP_SET_PARAMETERS BeepParameters;
NTSTATUS Status;
RtlInitUnicodeString(&BeepDevice, DD_BEEP_DEVICE_NAME_U);
InitializeObjectAttributes(&oaBeepAttr,&BeepDevice, 0, NULL, NULL);
Status = ZwCreateFile(&hBeep,
FILE_READ_DATA|FILE_WRITE_DATA|SYNCHRONIZE,
&oaBeepAttr,
&IoStatusBlock,
NULL,
0,
FILE_SHARE_READ|FILE_SHARE_WRITE,
FILE_OPEN_IF,
FILE_SYNCHRONOUS_IO_NOALERT,
NULL,
0);
if (!NT_SUCCESS(Status))
{
DbgPrint("ZwCreateFile error = 0x%x\n", Status);
return STATUS_UNSUCCESSFUL;
}
if ((dwFreq >= BEEP_FREQUENCY_MINIMUM && dwFreq <=BEEP_FREQUENCY_MAXIMUM) ||
(dwFreq == 0x0 && dwDuration == 0x0))
{
BeepParameters.Frequency = dwFreq;
BeepParameters.Duration = dwDuration;
Status = ZwDeviceIoControlFile(hBeep,
NULL,
NULL,
NULL,
&IoStatusBlock,
IOCTL_BEEP_SET,
&BeepParameters,
sizeof(BeepParameters),
NULL,
0);
if (Status != STATUS_SUCCESS && Status != STATUS_PENDING )
{
DbgPrint("ZwDeviceIoControlFile returns error
0x%X\nIO_STATUS_BLOCK 0x%X 0x%X 0x%X\n",
Status,IoStatusBlock.Status, IoStatusBlock.Pointer,
IoStatusBlock.Information);
}
DbgPrint("ZwDeviceIoControlFile returns error 0x%X\nIO_STATUS_BLOCK
0x%X 0x%X 0x%X\n", Status,IoStatusBlock.Status, IoStatusBlock.Pointer,
IoStatusBlock.Information);
}
else
{
DbgPrint("Wrong parameters\n");
ZwClose(hBeep);
return STATUS_INVALID_PARAMETER;
}
ZwClose(hBeep);
return STATUS_UNSUCCESSFUL;
}

No comments:

Post a Comment