5 * COPYRIGHT: See COPYING in the top level directory
6 * PROJECT: ReactOS OS/2 sub system
8 * PURPOSE: Kernelservices for OS/2 apps
9 * PROGRAMMER: Robert K. robertk@mok.lvcm.com
14 #include <ddk/ntddk.h>
18 /* Process variables. This section conains
19 per process variables that are used for caching or
21 DWORD PROC_Pid
; // contains the current processes pid. (or is it also in PEB)
25 /* Implementation of the system calls */
26 APIRET STDCALL
Dos32Sleep(ULONG msec
)
30 Interv
.QuadPart
= -(10000 * msec
);
31 stat
= NtDelayExecution( TRUE
, &Interv
);
35 APIRET STDCALL
Dos32CreateThread(PTID ptid
, PFNTHREAD pfn
,
36 ULONG param
, ULONG flag
, ULONG cbStack
)
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)
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,
56 IN ULONG CreateDisposition,
57 IN ULONG CreateOptions,
58 IN PVOID EaBuffer OPTIONAL,
65 /* close a Handle. seems finished */
66 APIRET STDCALL
Dos32Close(HFILE hFile
)
69 nErrCode
= NtClose( (HANDLE
)hFile
);
74 case STATUS_INVALID_HANDLE
:
75 return ERROR_INVALID_HANDLE
;
76 case STATUS_HANDLE_NOT_CLOSABLE
:
77 return ERROR_FILE_NOT_FOUND
;
85 APIRET STDCALL
Dos32Read(HFILE hFile
, PVOID pBuffer
,
86 ULONG cbRead
, PULONG pcbActual
)
89 IO_STATUS_BLOCK isbStatus
;
90 // read data from file
91 nErrCode
= NtReadFile( (HANDLE
)hFile
, NULL
, NULL
, NULL
,
92 &isbStatus
, pBuffer
, cbRead
,
94 // contains the # bytes actually read.
95 *pcbActual
= isbStatus
.Information
;
98 case STATUS_INVALID_HANDLE
:
99 return ERROR_INVALID_HANDLE
;
100 // FIXME: complete this
105 /* Generic write to a stream given by hFile */
106 APIRET STDCALL
Dos32Write(HFILE hFile
, PVOID pBuffer
,
107 ULONG cbWrite
, PULONG pcbActual
)
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
119 case STATUS_ACCESS_DENIED
:
120 case STATUS_INVALID_HANDLE
:
121 case STATUS_FILE_LOCK_CONFLICT
:
129 /*******************************************/
130 /* DosDevIOCtl performs control functions */
131 /* on a device specified by an opened */
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.
145 ulrc (APIRET) - returns
148 DosDevIOCtl returns one of the following values:
151 1 ERROR_INVALID_FUNCTION
152 6 ERROR_INVALID_HANDLE
153 15 ERROR_INVALID_DRIVE
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
164 APIRET STDCALL
Dos32DevIOCtl(HFILE hDevice
, ULONG category
, ULONG function
,
165 PVOID pParams
,ULONG cbParmLenMax
,PULONG pcbParmLen
,
166 PVOID pData
,ULONG cbDataLenMax
,PULONG pcbDataLen
)
173 APIRET STDCALL
Dos32Beep(ULONG freq
, ULONG dur
)
175 if( freq
<0x25 || freq
>0x7FFF )
176 return 395; // ERROR_INVALID_FREQUENCY
179 BEEP_SET_PARAMETERS BeepSetParameters;
182 hBeep = Dos32Open("\\\\.\\Beep",
183 FILE_GENERIC_READ | FILE_GENERIC_WRITE,
189 if (hBeep == INVALID_HANDLE_VALUE)
193 /* BeepSetParameters.Frequency = dwFreq;
194 BeepSetParameters.Duration = dwDuration;
196 DeviceIoControl(hBeep,
199 sizeof(BEEP_SET_PARAMETERS),
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
)
221 if( action
== EXIT_THREAD
)
223 NtTerminateThread( NULL
, result
);
227 NtTerminateProcess( NULL
, result
);
233 BOOL STDCALL
DllMain( HANDLE hModule
, DWORD ul_reason_for_call
, LPVOID lpReserved
)
235 switch (ul_reason_for_call
)
237 case 1://DLL_PROCESS_ATTACH:
238 case 2://DLL_THREAD_ATTACH:
239 case 3://DLL_THREAD_DETACH:
240 case 0://DLL_PROCESS_DETACH: