- Use MAXUINT, MAXULONG, MAXDWORD, MAXULONGLONG and MAXULONGLONG instead of ~0 or...
[reactos.git] / reactos / dll / win32 / kernel32 / misc / error.c
1 /* $Id$
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: dll/win32/kernel32/misc/error.c
6 * PURPOSE: Environment functions
7 * PROGRAMMER: Emanuele Aliberti
8 * Thomas Weidenmueller
9 * UPDATE HISTORY:
10 * Created 05/10/98
11 */
12
13
14 #include <k32.h>
15
16 #define NDEBUG
17 #include <debug.h>
18
19
20 /*
21 * @implemented
22 */
23 BOOL
24 WINAPI
25 Beep (DWORD dwFreq, DWORD dwDuration)
26 {
27 HANDLE hBeep;
28 UNICODE_STRING BeepDevice;
29 OBJECT_ATTRIBUTES ObjectAttributes;
30 IO_STATUS_BLOCK IoStatusBlock;
31 BEEP_SET_PARAMETERS BeepSetParameters;
32 NTSTATUS Status;
33
34 /* check the parameters */
35 if ((dwFreq >= 0x25 && dwFreq <= 0x7FFF) ||
36 (dwFreq == 0x0 && dwDuration == 0x0))
37 {
38 /* open the device */
39 RtlInitUnicodeString(&BeepDevice,
40 L"\\Device\\Beep");
41
42 InitializeObjectAttributes(&ObjectAttributes,
43 &BeepDevice,
44 0,
45 NULL,
46 NULL);
47
48 Status = NtCreateFile(&hBeep,
49 FILE_READ_DATA | FILE_WRITE_DATA,
50 &ObjectAttributes,
51 &IoStatusBlock,
52 NULL,
53 0,
54 FILE_SHARE_READ | FILE_SHARE_WRITE,
55 FILE_OPEN_IF,
56 0,
57 NULL,
58 0);
59 if (NT_SUCCESS(Status))
60 {
61 /* Set beep data */
62 BeepSetParameters.Frequency = dwFreq;
63 BeepSetParameters.Duration = dwDuration;
64
65 Status = NtDeviceIoControlFile(hBeep,
66 NULL,
67 NULL,
68 NULL,
69 &IoStatusBlock,
70 IOCTL_BEEP_SET,
71 &BeepSetParameters,
72 sizeof(BEEP_SET_PARAMETERS),
73 NULL,
74 0);
75
76 /* do an alertable wait if necessary */
77 if (NT_SUCCESS(Status) &&
78 (dwFreq != 0x0 || dwDuration != 0x0) && dwDuration != MAXDWORD)
79 {
80 SleepEx(dwDuration,
81 TRUE);
82 }
83
84 NtClose(hBeep);
85 }
86 }
87 else
88 Status = STATUS_INVALID_PARAMETER;
89
90 if (!NT_SUCCESS(Status))
91 {
92 SetLastErrorByStatus (Status);
93 return FALSE;
94 }
95
96 return TRUE;
97 }
98
99 /* EOF */