mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 17:25:55 +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)
|
||||
{
|
||||
HANDLE hBeep;
|
||||
UNICODE_STRING BeepDevice;
|
||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||
IO_STATUS_BLOCK IoStatusBlock;
|
||||
BEEP_SET_PARAMETERS BeepSetParameters;
|
||||
DWORD dwReturned;
|
||||
NTSTATUS Status;
|
||||
|
||||
hBeep = CreateFileW(L"\\\\.\\Beep",
|
||||
FILE_GENERIC_READ | FILE_GENERIC_WRITE,
|
||||
0,
|
||||
NULL,
|
||||
OPEN_EXISTING,
|
||||
0,
|
||||
NULL);
|
||||
if (hBeep == INVALID_HANDLE_VALUE)
|
||||
/* check the parameters */
|
||||
if ((dwFreq >= 0x25 && dwFreq <= 0x7FFF) ||
|
||||
(dwFreq == 0x0 && dwDuration == 0x0))
|
||||
{
|
||||
/* open the device */
|
||||
RtlInitUnicodeString(&BeepDevice,
|
||||
L"\\Device\\Beep");
|
||||
|
||||
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;
|
||||
|
||||
/* 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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue