mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 23:52:57 +00:00
fix Beep() to make it work with xp's beep.sys
svn path=/trunk/; revision=18798
This commit is contained in:
parent
f64f737e97
commit
d0cd0df7fe
1 changed files with 64 additions and 24 deletions
|
@ -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) ||
|
||||||
0,
|
(dwFreq == 0x0 && dwDuration == 0x0))
|
||||||
NULL,
|
{
|
||||||
OPEN_EXISTING,
|
/* open the device */
|
||||||
0,
|
RtlInitUnicodeString(&BeepDevice,
|
||||||
NULL);
|
L"\\Device\\Beep");
|
||||||
if (hBeep == INVALID_HANDLE_VALUE)
|
|
||||||
|
InitializeObjectAttributes(&ObjectAttributes,
|
||||||
|
&BeepDevice,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
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 */
|
||||||
|
BeepSetParameters.Frequency = dwFreq;
|
||||||
|
BeepSetParameters.Duration = dwDuration;
|
||||||
|
|
||||||
|
Status = NtDeviceIoControlFile(hBeep,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
&IoStatusBlock,
|
||||||
|
IOCTL_BEEP_SET,
|
||||||
|
&BeepSetParameters,
|
||||||
|
sizeof(BEEP_SET_PARAMETERS),
|
||||||
|
NULL,
|
||||||
|
0);
|
||||||
|
|
||||||
|
/* 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 FALSE;
|
||||||
|
}
|
||||||
/* Set beep data */
|
|
||||||
BeepSetParameters.Frequency = dwFreq;
|
|
||||||
BeepSetParameters.Duration = dwDuration;
|
|
||||||
|
|
||||||
DeviceIoControl(hBeep,
|
|
||||||
IOCTL_BEEP_SET,
|
|
||||||
&BeepSetParameters,
|
|
||||||
sizeof(BEEP_SET_PARAMETERS),
|
|
||||||
NULL,
|
|
||||||
0,
|
|
||||||
&dwReturned,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
CloseHandle (hBeep);
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue