a9aec9ecdf59fd4fee15156bd17f24aee82d4be4
[reactos.git] / os2 / lib / doscalls / misc / doscalls.c
1 /* $ ld $
2 */
3 /*
4 *
5 * COPYRIGHT: See COPYING in the top level directory
6 * PROJECT: ReactOS OS/2 sub system
7 * FILE: dll/doscalls.c
8 * PURPOSE: Kernelservices for OS/2 apps
9 * PROGRAMMER: Robert K. robertk@mok.lvcm.com
10 * REVISION HISTORY:
11 * 13-03-2002 Created
12 */
13
14 #include <ddk/ntddk.h>
15 #include "doscalls.h"
16
17
18 /* Process variables. This section conains
19 per process variables that are used for caching or
20 other stuff. */
21 DWORD PROC_Pid; // contains the current processes pid. (or is it also in PEB)
22
23
24
25 /* Implementation of the system calls */
26 APIRET STDCALL Dos32Sleep(ULONG msec)
27 {
28 NTSTATUS stat;
29 TIME Interv;
30 Interv.QuadPart= -(10000 * msec);
31 stat = NtDelayExecution( TRUE, &Interv );
32 return 0;
33 }
34
35 APIRET STDCALL Dos32CreateThread(PTID ptid, PFNTHREAD pfn,
36 ULONG param, ULONG flag, ULONG cbStack)
37 {
38 return 0;
39 }
40
41
42 APIRET STDCALL Dos32Open(PSZ pszFileName, PHFILE pHf,
43 PULONG pulAction, ULONG cbFile,
44 ULONG ulAttribute, ULONG fsOpenFlags,
45 ULONG fsOpenMode, PVOID reserved ) //ULONGPEAOP2 peaop2)
46 {
47 /* NTAPI
48 ZwCreateFile(
49 OUT PHANDLE FileHandle,
50 IN ACCESS_MASK DesiredAccess,
51 IN POBJECT_ATTRIBUTES ObjectAttributes,
52 OUT PIO_STATUS_BLOCK IoStatusBlock,
53 IN PLARGE_INTEGER AllocationSize OPTIONAL,
54 IN ULONG FileAttributes,
55 IN ULONG ShareAccess,
56 IN ULONG CreateDisposition,
57 IN ULONG CreateOptions,
58 IN PVOID EaBuffer OPTIONAL,
59 IN ULONG EaLength
60 );*/
61 return 0;
62 }
63
64
65 /* close a Handle. seems finished */
66 APIRET STDCALL Dos32Close(HFILE hFile)
67 {
68 NTSTATUS nErrCode;
69 nErrCode = NtClose( (HANDLE)hFile );
70 switch( nErrCode )
71 {
72 case STATUS_SUCCESS:
73 return NO_ERROR;
74 case STATUS_INVALID_HANDLE:
75 return ERROR_INVALID_HANDLE;
76 case STATUS_HANDLE_NOT_CLOSABLE:
77 return ERROR_FILE_NOT_FOUND;
78 }
79 return nErrCode;
80 }
81
82
83
84
85 APIRET STDCALL Dos32Read(HFILE hFile, PVOID pBuffer,
86 ULONG cbRead, PULONG pcbActual)
87 {
88 NTSTATUS nErrCode;
89 IO_STATUS_BLOCK isbStatus;
90 // read data from file
91 nErrCode = NtReadFile( (HANDLE)hFile, NULL, NULL, NULL,
92 &isbStatus, pBuffer, cbRead,
93 NULL, NULL );
94 // contains the # bytes actually read.
95 *pcbActual = isbStatus.Information;
96 switch(nErrCode)
97 {
98 case STATUS_INVALID_HANDLE:
99 return ERROR_INVALID_HANDLE;
100 // FIXME: complete this
101 }
102 return NO_ERROR;
103 }
104
105 /* Generic write to a stream given by hFile */
106 APIRET STDCALL Dos32Write(HFILE hFile, PVOID pBuffer,
107 ULONG cbWrite, PULONG pcbActual)
108 {
109 NTSTATUS nErrCode;
110 IO_STATUS_BLOCK StatusBlk;
111 nErrCode = NtWriteFile( (HANDLE)hFile, NULL, NULL, NULL,
112 &StatusBlk, pBuffer, cbWrite, 0, NULL );
113 *pcbActual = StatusBlk.Information;
114 // do an errorcode translation FIXME: correct
115 switch(nErrCode)
116 {
117 case STATUS_SUCCESS:
118 case STATUS_PENDING:
119 case STATUS_ACCESS_DENIED:
120 case STATUS_INVALID_HANDLE:
121 case STATUS_FILE_LOCK_CONFLICT:
122 return 0;
123 }
124 return 0;
125 }
126
127
128
129 /*******************************************/
130 /* DosDevIOCtl performs control functions */
131 /* on a device specified by an opened */
132 /* device handle. */
133 /*******************************************/
134 /*HFILE hDevice; Device handle returned by DosOpen, or a standard (open) device handle. */
135 /*ULONG category; Device category. */
136 /*ULONG function; Device-specific function code. */
137 /*PVOID pParams; Address of the command-specific argument list. */
138 /*ULONG cbParmLenMax; Length, in bytes, of pParams. */
139 /*PULONG pcbParmLen; Pointer to the length of parameters. */
140 /*PVOID pData; Address of the data area. */
141 /*ULONG cbDataLenMax; Length, in bytes, of pData. */
142 /*PULONG pcbDataLen; Pointer to the length of data. */
143 /*APIRET ulrc; Return Code.
144
145 ulrc (APIRET) - returns
146 Return Code.
147
148 DosDevIOCtl returns one of the following values:
149
150 0 NO_ERROR
151 1 ERROR_INVALID_FUNCTION
152 6 ERROR_INVALID_HANDLE
153 15 ERROR_INVALID_DRIVE
154 31 ERROR_GEN_FAILURE
155 87 ERROR_INVALID_PARAMETER
156 111 ERROR_BUFFER_OVERFLOW
157 115 ERROR_PROTECTION_VIOLATION
158 117 ERROR_INVALID_CATEGORY
159 119 ERROR_BAD_DRIVER_LEVEL
160 163 ERROR_UNCERTAIN_MEDIA
161 165 ERROR_MONITORS_NOT_SUPPORTED
162
163 */
164 APIRET STDCALL Dos32DevIOCtl(HFILE hDevice, ULONG category, ULONG function,
165 PVOID pParams,ULONG cbParmLenMax,PULONG pcbParmLen,
166 PVOID pData,ULONG cbDataLenMax,PULONG pcbDataLen)
167 {
168 return 0;
169 }
170
171
172
173 APIRET STDCALL Dos32Beep(ULONG freq, ULONG dur)
174 {
175 if( freq<0x25 || freq>0x7FFF )
176 return 395; // ERROR_INVALID_FREQUENCY
177
178 /* HANDLE hBeep;
179 BEEP_SET_PARAMETERS BeepSetParameters;
180 DWORD dwReturned;
181
182 hBeep = Dos32Open("\\\\.\\Beep",
183 FILE_GENERIC_READ | FILE_GENERIC_WRITE,
184 0,
185 NULL,
186 OPEN_EXISTING,
187 0,
188 NULL);
189 if (hBeep == INVALID_HANDLE_VALUE)
190 return FALSE;
191 */
192 // Set beep data
193 /* BeepSetParameters.Frequency = dwFreq;
194 BeepSetParameters.Duration = dwDuration;
195
196 DeviceIoControl(hBeep,
197 IOCTL_BEEP_SET,
198 &BeepSetParameters,
199 sizeof(BEEP_SET_PARAMETERS),
200 NULL,
201 0,
202 &dwReturned,
203 NULL);
204
205 CloseHandle (hBeep);
206
207 return TRUE;
208 */
209
210
211
212 return 0;
213 }
214
215 /* Terminates the current thread or the current Process.
216 Decission is made by action
217 FIXME: move this code to OS2.EXE */
218 VOID STDCALL Dos32Exit(ULONG action, ULONG result)
219 {
220 // decide what to do
221 if( action == EXIT_THREAD)
222 {
223 NtTerminateThread( NULL, result );
224 }
225 else // EXIT_PROCESS
226 {
227 NtTerminateProcess( NULL, result );
228 }
229 }
230
231
232
233 BOOL STDCALL DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )
234 {
235 switch (ul_reason_for_call)
236 {
237 case 1://DLL_PROCESS_ATTACH:
238 case 2://DLL_THREAD_ATTACH:
239 case 3://DLL_THREAD_DETACH:
240 case 0://DLL_PROCESS_DETACH:
241 break;
242 }
243 return TRUE;
244 }
245