fix Beep() to make it work with xp's beep.sys

svn path=/trunk/; revision=18798
This commit is contained in:
Thomas Bluemel 2005-10-27 20:00:27 +00:00
parent f64f737e97
commit d0cd0df7fe

View file

@ -42,33 +42,73 @@ STDCALL
Beep (DWORD dwFreq, DWORD dwDuration) Beep (DWORD dwFreq, DWORD dwDuration)
{ {
HANDLE hBeep; HANDLE hBeep;
UNICODE_STRING BeepDevice;
OBJECT_ATTRIBUTES ObjectAttributes;
IO_STATUS_BLOCK IoStatusBlock;
BEEP_SET_PARAMETERS BeepSetParameters; BEEP_SET_PARAMETERS BeepSetParameters;
DWORD dwReturned; NTSTATUS Status;
hBeep = CreateFileW(L"\\\\.\\Beep", /* check the parameters */
FILE_GENERIC_READ | FILE_GENERIC_WRITE, if ((dwFreq >= 0x25 && dwFreq <= 0x7FFF) ||
(dwFreq == 0x0 && dwDuration == 0x0))
{
/* open the device */
RtlInitUnicodeString(&BeepDevice,
L"\\Device\\Beep");
InitializeObjectAttributes(&ObjectAttributes,
&BeepDevice,
0, 0,
NULL, NULL,
OPEN_EXISTING,
0,
NULL); NULL);
if (hBeep == INVALID_HANDLE_VALUE)
return FALSE;
Status = NtCreateFile(&hBeep,
FILE_READ_DATA | FILE_WRITE_DATA,
&ObjectAttributes,
&IoStatusBlock,
NULL,
0,
FILE_SHARE_READ | FILE_SHARE_WRITE,
FILE_OPEN_IF,
0,
NULL,
0);
if (NT_SUCCESS(Status))
{
/* Set beep data */ /* Set beep data */
BeepSetParameters.Frequency = dwFreq; BeepSetParameters.Frequency = dwFreq;
BeepSetParameters.Duration = dwDuration; BeepSetParameters.Duration = dwDuration;
DeviceIoControl(hBeep, Status = NtDeviceIoControlFile(hBeep,
NULL,
NULL,
NULL,
&IoStatusBlock,
IOCTL_BEEP_SET, IOCTL_BEEP_SET,
&BeepSetParameters, &BeepSetParameters,
sizeof(BEEP_SET_PARAMETERS), sizeof(BEEP_SET_PARAMETERS),
NULL, NULL,
0, 0);
&dwReturned,
NULL);
CloseHandle (hBeep); /* do an alertable wait if necessary */
if (NT_SUCCESS(Status) &&
(dwFreq != 0x0 || dwDuration != 0x0) && dwDuration != (DWORD)-1)
{
SleepEx(dwDuration,
TRUE);
}
NtClose(hBeep);
}
}
else
Status = STATUS_INVALID_PARAMETER;
if (!NT_SUCCESS(Status))
{
SetLastErrorByStatus (Status);
return FALSE;
}
return TRUE; return TRUE;
} }