source: trunk/src/kernel32/oslibdos.cpp@ 1570

Last change on this file since 1570 was 1432, checked in by sandervl, 26 years ago

Shared memory mapping changes

File size: 9.1 KB
Line 
1/* $Id: oslibdos.cpp,v 1.5 1999-10-24 22:51:22 sandervl Exp $ */
2
3/*
4 * Wrappers for OS/2 Dos* API
5 *
6 * Copyright 1998 Sander van Leeuwen (sandervl@xs4all.nl)
7 *
8 *
9 * Project Odin Software License can be found in LICENSE.TXT
10 *
11 */
12#define INCL_BASE
13#define INCL_DOSEXCEPTIONS
14#define INCL_DOSMEMMGR
15#define INCL_DOSPROCESS
16#include <os2wrap.h> //Odin32 OS/2 api wrappers
17#include <stdlib.h>
18#include <stdio.h>
19#include <string.h>
20#include <win32type.h>
21#include <misc.h>
22#include "initterm.h"
23#include "oslibdos.h"
24
25APIRET APIENTRY DosAliasMem(PVOID pb, ULONG cb, PPVOID ppbAlias, ULONG fl);
26
27//******************************************************************************
28//******************************************************************************
29DWORD OSLibDosAliasMem(LPVOID pb, ULONG cb, LPVOID *ppbAlias, ULONG fl)
30{
31 return DosAliasMem(pb, cb, ppbAlias, fl);
32}
33//******************************************************************************
34//******************************************************************************
35DWORD OSLibDosAllocMem(LPVOID *lplpMemAddr, DWORD size, DWORD flags)
36{
37 return DosAllocMem(lplpMemAddr, size, flags | flAllocMem);
38}
39//******************************************************************************
40//******************************************************************************
41DWORD OSLibDosFreeMem(LPVOID lpMemAddr)
42{
43 return DosFreeMem(lpMemAddr);
44}
45//******************************************************************************
46//NOTE: If name == NULL, allocated gettable unnamed shared memory
47//******************************************************************************
48DWORD OSLibDosAllocSharedMem(LPVOID *lplpMemAddr, DWORD size, DWORD flags, LPSTR name)
49{
50 APIRET rc;
51 char *sharedmemname = NULL;
52
53 if(name) {
54 sharedmemname = (char *)malloc(strlen(name) + 16);
55 strcpy(sharedmemname, "\\SHAREMEM\\");
56 strcat(sharedmemname, name);
57 }
58 else flags |= OBJ_GETTABLE;
59
60 rc = DosAllocSharedMem(lplpMemAddr, sharedmemname, size, flags);
61 if(name) {
62 free(sharedmemname);
63 }
64 return rc;
65}
66//******************************************************************************
67//NOTE: If name == NULL, assume gettable unnamed shared memory
68//******************************************************************************
69DWORD OSLibDosGetNamedSharedMem(LPVOID *lplpMemAddr, LPSTR name)
70{
71 APIRET rc;
72 char *sharedmemname = NULL;
73
74 if(name) {
75 sharedmemname = (char *)malloc(strlen(name) + 16);
76 strcpy(sharedmemname, "\\SHAREMEM\\");
77 strcat(sharedmemname, name);
78 rc = DosGetNamedSharedMem(lplpMemAddr, sharedmemname, PAG_READ|PAG_WRITE);
79 if(name) {
80 free(sharedmemname);
81 }
82 }
83 else rc = DosGetSharedMem((LPVOID)*(DWORD *)lplpMemAddr, PAG_READ|PAG_WRITE);
84
85 return rc;
86}
87//******************************************************************************
88//******************************************************************************
89DWORD OSLibDosQueryMem(LPVOID lpMemAddr, DWORD *lpRangeSize, DWORD *lpAttr)
90{
91 return DosQueryMem(lpMemAddr, lpRangeSize, lpAttr);
92}
93//******************************************************************************
94//******************************************************************************
95DWORD OSLibDosSetMem(LPVOID lpMemAddr, DWORD size, DWORD flags)
96{
97 APIRET rc;
98
99 rc = DosSetMem(lpMemAddr, size, flags);
100 switch(rc) {
101 case ERROR_INVALID_ADDRESS:
102 return OSLIB_ERROR_INVALID_ADDRESS;
103 case ERROR_ACCESS_DENIED:
104 return OSLIB_ERROR_ACCESS_DENIED;
105 default:
106 return rc;
107 }
108}
109//******************************************************************************
110//******************************************************************************
111DWORD OSLibDosOpen(char *lpszFileName, DWORD flags)
112{
113 APIRET rc;
114 HFILE hFile;
115 ULONG ulAction;
116 DWORD os2flags = OPEN_FLAGS_NOINHERIT;
117
118
119 if(flags & OSLIB_ACCESS_READONLY)
120 os2flags |= OPEN_ACCESS_READONLY;
121 else
122 if(flags & OSLIB_ACCESS_READWRITE)
123 os2flags |= OPEN_ACCESS_READWRITE;
124
125 if(flags & OSLIB_ACCESS_SHAREDENYNONE)
126 os2flags |= OPEN_SHARE_DENYNONE;
127 else
128 if(flags & OSLIB_ACCESS_SHAREDENYREAD)
129 os2flags |= OPEN_SHARE_DENYREAD;
130 else
131 if(flags & OSLIB_ACCESS_SHAREDENYWRITE)
132 os2flags |= OPEN_SHARE_DENYWRITE;
133
134 rc = DosOpen(lpszFileName, /* File path name */
135 &hFile, /* File handle */
136 &ulAction, /* Action taken */
137 0L, /* File primary allocation */
138 0L, /* File attribute */
139 OPEN_ACTION_FAIL_IF_NEW |
140 OPEN_ACTION_OPEN_IF_EXISTS, /* Open function type */
141 os2flags,
142 0L); /* No extended attribute */
143
144 if(rc) {
145 return 0;
146 }
147 else return hFile;
148}
149//******************************************************************************
150//******************************************************************************
151DWORD OSLibDosClose(DWORD hFile)
152{
153 return DosClose(hFile);
154}
155//******************************************************************************
156//******************************************************************************
157DWORD OSLibDosGetFileSize(DWORD hFile)
158{
159 ULONG ulLocal, filesize = 0;
160
161 DosSetFilePtr(hFile, 0L, FILE_BEGIN, &ulLocal);
162 DosSetFilePtr(hFile, 0L, FILE_END, &filesize);
163 DosSetFilePtr(hFile, 0L, FILE_BEGIN, &ulLocal);
164 return filesize;
165}
166//******************************************************************************
167//******************************************************************************
168DWORD OSLibDosRead(DWORD hFile, LPVOID lpBuffer, DWORD size, DWORD *nrBytesRead)
169{
170 return DosRead(hFile, lpBuffer, size, nrBytesRead);
171}
172//******************************************************************************
173//******************************************************************************
174DWORD OSLibDosWrite(DWORD hFile, LPVOID lpBuffer, DWORD size, DWORD *nrBytesWritten)
175{
176 return DosWrite(hFile, lpBuffer, size, nrBytesWritten);
177}
178//******************************************************************************
179//******************************************************************************
180DWORD OSLibDosSetFilePtr(DWORD hFile, DWORD offset, DWORD method)
181{
182 DWORD os2method;
183 DWORD newoffset;
184 APIRET rc;
185
186 switch(method) {
187 case OSLIB_SETPTR_FILE_CURRENT:
188 os2method = FILE_CURRENT;
189 break;
190 case OSLIB_SETPTR_FILE_BEGIN:
191 os2method = FILE_BEGIN ;
192 break;
193 case OSLIB_SETPTR_FILE_END:
194 os2method = FILE_END;
195 break;
196 default:
197 return OSLIB_ERROR_INVALID_PARAMETER;
198 }
199 rc = DosSetFilePtr(hFile, offset, os2method, &newoffset);
200 if(rc) {
201 return -1;
202 }
203 else return newoffset;
204}
205//******************************************************************************
206//******************************************************************************
207//@@@PH Note: this routine is nothing but a QUICK'N'DIRTY HACK!
208//@@@PH this function should be implemented accordingly to NTDLL's
209// RtlSecondsSince1980ToTime
210// RtlTimeToSecondsSince1980
211static void iFDATEFTIME2FILETIME(FDATE fdOS2, FTIME ftOS2, LPFILETIME pftWin32)
212{
213 float f;
214 #define facSECOND 2 // as encoded in OS/2
215 #define facMINUTE 60
216 #define facHOUR 3600
217 #define facDAY 86400
218 #define facMONTH facDAY * 30 // cough, cough :)
219 #define facYEAR facDAY * 365
220
221 /* pftWin32 is 100ns based from 01.01.1601 00:00:00 */
222 f = (fdOS2.year + 379) * facYEAR // 1980 - 1601
223 + (fdOS2.month - 0 ) * facMONTH
224 + (fdOS2.day - 1 ) * facDAY
225 + (ftOS2.hours ) * facHOUR
226 + (ftOS2.minutes ) * facMINUTE
227 + (ftOS2.twosecs ) * facSECOND;
228
229 f *= 10000; // convert to 100ns base
230 pftWin32->dwHighDateTime = (f / (float)(0xffffffff) );
231 pftWin32->dwLowDateTime = (f - (float)((float)pftWin32->dwHighDateTime *
232 (float)0xffffffff) );
233}
234
235BOOL OSLibDosGetFileAttributesEx(PSZ pszName,
236 ULONG ulDummy,
237 PVOID pBuffer)
238{
239 APIRET rc; /* API return code */
240 FILESTATUS3 fs3; /* file information structure */
241 LPWIN32_FILE_ATTRIBUTE_DATA lpFad = (LPWIN32_FILE_ATTRIBUTE_DATA) pBuffer;
242
243 // Note: we only handle standard "GetFileExInfoStandard" requests
244 rc = DosQueryPathInfo(pszName, /* query the file information */
245 FIL_STANDARD,
246 &fs3,
247 sizeof(fs3));
248 if (rc != NO_ERROR) /* check for errors */
249 return FALSE; /* raise error condition */
250
251 // convert structure
252 lpFad->dwFileAttributes = fs3.attrFile; // directly interchangeable
253 iFDATEFTIME2FILETIME(fs3.fdateCreation, fs3.ftimeCreation, &lpFad->ftCreationTime);
254 iFDATEFTIME2FILETIME(fs3.fdateLastAccess, fs3.ftimeLastAccess, &lpFad->ftLastAccessTime);
255 iFDATEFTIME2FILETIME(fs3.fdateLastWrite, fs3.ftimeLastWrite, &lpFad->ftLastWriteTime);
256
257 /* @@@PH we might add Aurora support ...
258 lpFad->nFileSizeHigh = info.nFileSizeHigh;
259 */
260 lpFad->nFileSizeHigh = 0;
261 lpFad->nFileSizeLow = fs3.cbFile;
262
263 return TRUE;
264}
Note: See TracBrowser for help on using the repository browser.