source: trunk/src/kernel32/KERNEL32.CPP@ 3399

Last change on this file since 3399 was 3352, checked in by sandervl, 25 years ago

CompareStringW fix

File size: 28.6 KB
Line 
1/* $Id: KERNEL32.CPP,v 1.43 2000-04-08 20:09:42 sandervl Exp $ */
2
3/*
4 * Win32 compatibility file functions for OS/2
5 *
6 * Copyright 1998 Sander van Leeuwen
7 * Copyright 1998 Patrick Haller
8 * Copyright 1998 Peter Fitzsimmons
9 * Copyright 1998 Knut St. Osmundsen
10 *
11 * @(#) KERNEL32.CPP 1.0.1 1998/06/12 PH added HandleManager support
12 *
13 * Project Odin Software License can be found in LICENSE.TXT
14 *
15 */
16
17
18/*****************************************************************************
19 * Includes *
20 *****************************************************************************/
21
22#include <odin.h>
23#include <odinwrap.h>
24#include <os2sel.h>
25
26#include <os2win.h>
27#include <winnt.h>
28#include <winnls.h>
29#include <stdlib.h>
30#include <string.h>
31
32#include "misc.h"
33#include <builtin.h>
34#include "heap.h"
35#include "handlemanager.h"
36#include "wprocess.h"
37#include <versionos2.h>
38
39#define DBG_LOCALLOG DBG_kernel32
40#include "dbglocal.h"
41
42/*****************************************************************************
43 * Defines *
44 *****************************************************************************/
45
46ODINDEBUGCHANNEL(KERNEL32-KERNEL32)
47
48 /* this define enables certain less important debug messages */
49//#define DEBUG_LOCAL 1
50
51
52
53/*****************************************************************************
54 * Name : BOOL WIN32API CloseHandle
55 * Purpose : forward call to Open32
56 * Parameters:
57 * Variables :
58 * Result :
59 * Remark :
60 * Status :
61 *
62 * Author : Patrick Haller [Fri, 1998/06/12 03:44]
63 *****************************************************************************/
64BOOL WIN32API CloseHandle(HANDLE hHandle)
65{
66 dprintf(("KERNEL32: CloseHandle(%08xh)\n",
67 hHandle));
68
69 return HMCloseHandle(hHandle);
70}
71
72
73//******************************************************************************
74HANDLE WIN32API GetStdHandle(DWORD fdwDevice)
75{
76 HANDLE handle;
77
78 /* @@@PH 1998/02/12 Handle Manager Support */
79 handle = HMGetStdHandle(fdwDevice);
80
81 //@@@PH translate handle
82
83 /* handle = GetStdHandle(fdwDevice); */
84 dprintf(("KERNEL32: GetStdHandle for device %X returned %X\n", fdwDevice, handle));
85 return(handle);
86}
87//******************************************************************************
88//******************************************************************************
89BOOL WIN32API SetStdHandle(DWORD IDStdHandle,
90 HANDLE hHandle)
91{
92 dprintf(("KERNEL32: SetStdHandle\n"));
93
94 ///@@@PH translate handle
95
96 return (HMSetStdHandle(IDStdHandle,
97 hHandle));
98}
99//******************************************************************************
100//******************************************************************************
101BOOL WIN32API IsBadWritePtr(LPVOID lpvPtr, UINT cbBytes)
102{
103#ifdef DEBUG
104 BOOL rc;
105
106 rc = O32_IsBadWritePtr(lpvPtr, cbBytes);
107 dprintf(("KERNEL32: IsBadWritePtr: 0x%X size %d rc = %d\n", (int)lpvPtr, cbBytes, rc));
108 return(rc);
109#else
110 return(O32_IsBadWritePtr(lpvPtr, cbBytes));
111#endif
112}
113//******************************************************************************
114//******************************************************************************
115BOOL WIN32API IsBadReadPtr(CONST VOID *lpvPtr, UINT cbBytes)
116{
117#ifdef DEBUG
118 BOOL rc;
119
120 rc = O32_IsBadReadPtr(lpvPtr, cbBytes);
121 dprintf(("KERNEL32: IsBadWritePtr: 0x%X size %d rc = %d\n", (int)lpvPtr, cbBytes, rc));
122 return(rc);
123#else
124 return(O32_IsBadReadPtr(lpvPtr, cbBytes));
125#endif
126}
127//******************************************************************************
128//******************************************************************************
129BOOL WIN32API IsBadCodePtr( FARPROC arg1)
130{
131 dprintf(("KERNEL32: IsBadCodePtr\n"));
132 return O32_IsBadCodePtr(arg1);
133}
134//******************************************************************************
135//******************************************************************************
136BOOL WIN32API IsBadStringPtrA( LPCSTR arg1, UINT arg2)
137{
138 dprintf(("KERNEL32: IsBadStringPtr"));
139 return O32_IsBadStringPtr(arg1, arg2);
140}
141//******************************************************************************
142//******************************************************************************
143BOOL WIN32API IsBadStringPtrW(LPCWSTR arg1, UINT arg2)
144{
145 dprintf(("KERNEL32: OS2IsBadStringPtrW"));
146 return O32_IsBadReadPtr((CONST VOID *)arg1, arg2*2+2);
147}
148//******************************************************************************
149//******************************************************************************
150DWORD WIN32API GetLastError()
151{
152 DWORD rc;
153
154 rc = O32_GetLastError();
155#ifdef DEBUG_LOCAL
156 dprintf(("KERNEL32: GetLastError returned %d\n", rc));
157#endif
158 return(rc);
159}
160//******************************************************************************
161//******************************************************************************
162VOID WIN32API SetLastError( DWORD arg1)
163{
164 dprintf2(("KERNEL32: SetLastError to %d\n", arg1));
165 O32_SetLastError(arg1);
166}
167//******************************************************************************
168//******************************************************************************
169UINT WIN32API GetOEMCP(VOID)
170{
171 dprintf(("KERNEL32: GetOEMCP\n"));
172 return(O32_GetOEMCP());
173}
174//******************************************************************************
175//******************************************************************************
176UINT WIN32API GetACP(VOID)
177{
178 dprintf(("KERNEL32: GetACP\n"));
179 return(O32_GetACP());
180}
181//******************************************************************************
182//******************************************************************************
183BOOL WIN32API GetStringTypeW(DWORD fdwInfoType, LPCWSTR lpSrcStr, int cchSrc, LPWORD lpCharType)
184{
185 int i;
186
187 dprintf(("KERNEL32: GetStringTypeW, not properly implemented\n"));
188 if((DWORD)lpSrcStr == (DWORD)lpCharType || !lpSrcStr || !lpCharType) {
189 O32_SetLastError(ERROR_INVALID_PARAMETER);
190 return(FALSE);
191 }
192 if(cchSrc == -1)
193 cchSrc = UniStrlen((UniChar*)lpSrcStr);
194
195 memset(lpCharType, 0, cchSrc*sizeof(WORD));
196 switch(fdwInfoType) {
197 case CT_CTYPE1:
198 for(i=0;i<cchSrc;i++) {
199 if(lpSrcStr[i] >= (WCHAR)'a' && lpSrcStr[i] <= (WCHAR)'z')
200 lpCharType[i] |= C1_LOWER | C1_ALPHA;
201 else
202 if(lpSrcStr[i] >= (WCHAR)'A' && lpSrcStr[i] <= (WCHAR)'A')
203 lpCharType[i] |= C1_UPPER | C1_ALPHA;
204 else
205 if(lpSrcStr[i] >= (WCHAR)'0' && lpSrcStr[i] <= (WCHAR)'9')
206 lpCharType[i] |= C1_DIGIT;
207 else
208 if(lpSrcStr[i] >= (WCHAR)' ')
209 lpCharType[i] |= C1_SPACE;
210 }
211 break;
212 case CT_CTYPE2:
213 case CT_CTYPE3: //not supported right now
214 break;
215 }
216 return(TRUE);
217}
218//******************************************************************************
219//NOTE: This has one parameter more than the W version! (@#$@#$)
220//******************************************************************************
221BOOL WIN32API GetStringTypeA(LCID Locale, DWORD fdwInfoType, LPCSTR lpSrcStr, int cchSrc, LPWORD lpCharType)
222{
223 int i;
224
225 dprintf(("KERNEL32: GetStringTypeA, not properly implemented\n"));
226 if(lpSrcStr == (LPCSTR)lpCharType || !lpSrcStr || !lpCharType) {
227 O32_SetLastError(ERROR_INVALID_PARAMETER);
228 return(FALSE);
229 }
230 if(cchSrc == -1)
231 cchSrc = strlen(lpSrcStr);
232
233 memset(lpCharType, 0, cchSrc*sizeof(WORD));
234 switch(fdwInfoType) {
235 case CT_CTYPE1:
236 for(i=0;i<cchSrc;i++) {
237 if(lpSrcStr[i] >= 'a' && lpSrcStr[i] <= 'z')
238 lpCharType[i] |= C1_LOWER | C1_ALPHA;
239 else
240 if(lpSrcStr[i] >= 'A' && lpSrcStr[i] <= 'A')
241 lpCharType[i] |= C1_UPPER | C1_ALPHA;
242 else
243 if(lpSrcStr[i] >= '0' && lpSrcStr[i] <= '9')
244 lpCharType[i] |= C1_DIGIT;
245 else
246 if(lpSrcStr[i] >= ' ')
247 lpCharType[i] |= C1_SPACE;
248 }
249 break;
250 case CT_CTYPE2:
251 case CT_CTYPE3: //not supported right now
252 break;
253 }
254 return(TRUE);
255}
256//******************************************************************************
257//******************************************************************************
258BOOL WIN32API GetStringTypeExW(LCID Locale, DWORD fdwInfoType, LPCWSTR lpSrcStr, int cchSrc, LPWORD lpCharType)
259{
260 dprintf(("KERNEL32: GetStringTypeExW, not properly implemented\n"));
261 return(GetStringTypeW(fdwInfoType, lpSrcStr, cchSrc, lpCharType));
262}
263//******************************************************************************
264//******************************************************************************
265BOOL WIN32API GetStringTypeExA(LCID Locale, DWORD fdwInfoType, LPCSTR lpSrcStr, int cchSrc, LPWORD lpCharType)
266{
267 dprintf(("KERNEL32: GetStringTypeExA, not properly implemented\n"));
268 return(GetStringTypeA(Locale, fdwInfoType, lpSrcStr, cchSrc, lpCharType));
269}
270//******************************************************************************
271VOID WIN32API GlobalMemoryStatus( MEMORYSTATUS *arg1)
272{
273 dprintf(("KERNEL32: GlobalMemoryStatus\n"));
274 O32_GlobalMemoryStatus(arg1);
275 dprintf(("dwMemoryLoad %X\n", arg1->dwMemoryLoad));
276 dprintf(("dwTotalPhys %X\n", arg1->dwTotalPhys));
277 dprintf(("dwAvailPhys %X\n", arg1->dwAvailPhys));
278 dprintf(("dwTotalPageFile %X\n", arg1->dwTotalPageFile));
279 dprintf(("dwAvailPageFile %X\n", arg1->dwAvailPageFile));
280 dprintf(("dwTotalVirtual %X\n", arg1->dwTotalVirtual));
281 dprintf(("dwAvailVirtual %X\n", arg1->dwAvailVirtual));
282}
283VOID WIN32API Sleep(DWORD arg1)
284{
285 dprintf2(("KERNEL32: Sleep %d\n", arg1));
286 O32_Sleep(arg1);
287}
288//******************************************************************************
289//******************************************************************************
290DWORD WIN32API GetPriorityClass(HANDLE arg1)
291{
292 dprintf(("KERNEL32: GetPriorityClass\n"));
293 return O32_GetPriorityClass(arg1);
294}
295//******************************************************************************
296//******************************************************************************
297BOOL WIN32API SetPriorityClass(HANDLE arg1, DWORD arg2)
298{
299 dprintf(("KERNEL32: SetPriorityClass\n"));
300 return O32_SetPriorityClass(arg1, arg2);
301}
302//******************************************************************************
303//TODO!
304//******************************************************************************
305int WIN32API LCMapStringW(
306 DWORD /*LCID*/ Locale,
307 DWORD dwMapFlags,
308 LPCWSTR lpSrcStr,
309 int cchSrc,
310 LPWSTR lpDestStr,
311 int cchDest)
312{
313 // quick hack! this code is not done!
314 if(cchSrc == -1)
315 cchSrc = strlen((const char *)lpSrcStr);
316 if(!cchDest)
317 return cchSrc;
318 strncpy((char *)lpDestStr, (const char *)lpSrcStr, max(cchSrc, cchDest));
319 return max(cchSrc, cchDest);
320}
321//******************************************************************************
322//TODO!
323//******************************************************************************
324int WIN32API LCMapStringA(
325 DWORD /*LCID*/ Locale,
326 DWORD dwMapFlags,
327 LPCSTR lpSrcStr,
328 int cchSrc,
329 LPSTR lpDestStr,
330 int cchDest)
331{
332 dprintf(("KERNEL32: LCMapStringA not implemented\n"));
333 if(cchSrc == -1)
334 cchSrc = strlen((const char *)lpSrcStr);
335 if(!cchDest)
336 return cchSrc;
337 strncpy((char *)lpDestStr, (const char *)lpSrcStr, max(cchSrc, cchDest));
338 return max(cchSrc, cchDest);
339}
340//******************************************************************************
341//SvL: 24-6-'97 - Added
342//******************************************************************************
343BOOL WIN32API Beep( DWORD arg1, DWORD arg2)
344{
345 dprintf(("KERNEL32: OS2Beep\n"));
346 return O32_Beep(arg1, arg2);
347}
348//******************************************************************************
349//******************************************************************************
350VOID WIN32API FatalAppExitA( UINT arg1, LPCSTR arg2)
351{
352 dprintf(("KERNEL32: OS2FatalAppExitA\n"));
353 O32_FatalAppExit(arg1, arg2);
354}
355//******************************************************************************
356//******************************************************************************
357VOID WIN32API FatalAppExitW(UINT arg1, LPCWSTR arg2)
358{
359 char *astring;
360
361 dprintf(("KERNEL32: OS2FatalAppExitW\n"));
362 astring = UnicodeToAsciiString((LPWSTR)arg2);
363 O32_FatalAppExit(arg1, astring);
364 //probably won't return, but who cares..
365 FreeAsciiString(astring);
366}
367//******************************************************************************
368//******************************************************************************
369VOID WIN32API FatalExit( UINT arg1)
370{
371 dprintf(("KERNEL32: OS2FatalExit\n"));
372 O32_FatalExit(arg1);
373}
374//******************************************************************************
375//******************************************************************************
376BOOL WIN32API IsBadHugeReadPtr( const void * arg1, UINT arg2)
377{
378 dprintf(("KERNEL32: OS2IsBadHugeReadPtr\n"));
379 return O32_IsBadHugeReadPtr(arg1, arg2);
380}
381//******************************************************************************
382//******************************************************************************
383BOOL WIN32API IsBadHugeWritePtr( PVOID arg1, UINT arg2)
384{
385 dprintf(("KERNEL32: OS2IsBadHugeWritePtr\n"));
386 return O32_IsBadHugeWritePtr(arg1, arg2);
387}
388//******************************************************************************
389//******************************************************************************
390BOOL WIN32API IsDBCSLeadByte(BYTE arg1)
391{
392 dprintf2(("KERNEL32: OS2IsDBCSLeadByte\n"));
393 return O32_IsDBCSLeadByte(arg1);
394}
395//******************************************************************************
396//******************************************************************************
397DWORD WIN32API LoadModule( LPCSTR arg1, PVOID arg2)
398{
399 dprintf(("KERNEL32: OS2LoadModule\n"));
400 return O32_LoadModule(arg1, arg2);
401}
402//******************************************************************************
403//******************************************************************************
404int WIN32API MulDiv(int arg1, int arg2, int arg3)
405{
406 dprintf2(("KERNEL32: MulDiv %d*%d/%d\n", arg1, arg2, arg3));
407 if(arg3 == 0)
408 return 0;
409
410 return O32_MulDiv(arg1, arg2, arg3);
411}
412//******************************************************************************
413UINT WIN32API CompareStringA(LCID lcid, DWORD fdwStyle, LPCSTR lpString1,
414 DWORD cch1, LPCSTR lpString2, DWORD cch2)
415{
416 int i;
417 int fEqual = TRUE;
418 char *string1 = (char *)lpString1, *string2 = (char *)lpString2;
419
420 SetLastError(0);
421
422#ifdef DEBUG
423 if(fdwStyle & SORT_STRINGSORT)
424 dprintf(("KERNEL32: SORT_STRINGSORT not supported!\n"));
425 if(fdwStyle & NORM_IGNORENONSPACE)
426 dprintf(("KERNEL32: NORM_IGNORENONSPACE not supported!\n"));
427 if(fdwStyle & NORM_IGNORESYMBOLS)
428 dprintf(("KERNEL32: NORM_IGNORESYMBOLS not supported!\n"));
429#endif
430
431 if(lpString1 == NULL || lpString2 == NULL)
432 {
433 dprintf(("CompareStringA: (s1=%s,s2=%s): Invalid NULL string\n", lpString1, lpString2));
434 SetLastError(ERROR_INVALID_PARAMETER);
435 return 0;
436 }
437
438 if(cch1 == -1) cch1 = strlen(string1);
439 if(cch2 == -1) cch2 = strlen(string2);
440
441 if(fdwStyle) {
442 //TODO!
443 if(fdwStyle != 0 && fdwStyle != NORM_IGNORECASE)
444 return(0); /*PLF Fri 98-03-13 04:09:32 was return 1 */
445 }
446 if(fdwStyle & NORM_IGNORECASE)
447 fEqual = strnicmp(string1, string2, min(cch1, cch2));
448 else
449 fEqual = strncmp(string1, string2, min(cch1, cch2));
450
451 if (fEqual < 0 ) fEqual = 1;
452 else if(fEqual == 0) fEqual = 2;
453 else if(fEqual > 0) fEqual = 3;
454
455 //If equal, but different length, largest one is the greatest in lexical value
456 if(fEqual == 2 && cch1 != cch2){
457 if(cch1 < cch2)
458 fEqual = 1;
459 else
460 fEqual = 3;
461 }
462 dprintf2(("KERNEL32: OS2CompareStringA '%s' - '%s' returned %d\n", lpString1, lpString2, fEqual));
463 return(fEqual);
464}
465
466//******************************************************************************
467//TODO: Not complete (fdwStyle flags specify compare method)
468//******************************************************************************
469UINT WIN32API CompareStringW(LCID lcid, DWORD fdwStyle, LPCWSTR lpString1,
470 DWORD cch1, LPCWSTR lpString2, DWORD cch2)
471{
472 int i;
473 int fEqual = TRUE;
474 char *string1;
475 char *string2;
476
477 dprintf2(("KERNEL32: OS2CompareStringW '%s' - '%s'\n", string1, string2));
478
479 if(lpString1 == NULL || lpString2 == NULL)
480 {
481 dprintf(("CompareStringW: (s1=%s,s2=%s): Invalid NULL string\n", lpString1, lpString2));
482 SetLastError(ERROR_INVALID_PARAMETER);
483 return 0;
484 }
485
486 if(cch1 == -1) cch1 = lstrlenW(lpString1);
487 if(cch2 == -1) cch2 = lstrlenW(lpString2);
488
489 string1 = UnicodeToAsciiStringN((LPWSTR)lpString1, cch1);
490 string2 = UnicodeToAsciiStringN((LPWSTR)lpString2, cch2);
491
492 fEqual = CompareStringA(lcid, fdwStyle, string1, cch1, string2, cch2);
493 FreeAsciiString(string1);
494 FreeAsciiString(string2);
495
496 return(fEqual);
497}
498//******************************************************************************
499//Borrowed from Wine
500//******************************************************************************
501ODINPROCEDURE1(GetStartupInfoA,LPSTARTUPINFOA,lpStartupInfo)
502{
503 lpStartupInfo->cb = sizeof(STARTUPINFOA);
504 lpStartupInfo->lpReserved = "<Reserved>";
505 lpStartupInfo->lpDesktop = "Desktop";
506 lpStartupInfo->lpTitle = "Title";
507 lpStartupInfo->dwX = 0;
508 lpStartupInfo->dwY = 0;
509 lpStartupInfo->dwXSize = 640;
510 lpStartupInfo->dwYSize = 480;
511 lpStartupInfo->dwXCountChars = 80; // for console
512 lpStartupInfo->dwYCountChars = 25;
513 lpStartupInfo->dwFillAttribute = 0x0720;
514 lpStartupInfo->dwFlags = STARTF_USESHOWWINDOW |
515 STARTF_USEPOSITION |
516 STARTF_USESIZE |
517 STARTF_USECOUNTCHARS |
518 STARTF_USEFILLATTRIBUTE|
519 STARTF_USESTDHANDLES;
520 lpStartupInfo->wShowWindow = SW_SHOWDEFAULT;
521 lpStartupInfo->cbReserved2 = 0;
522 lpStartupInfo->lpReserved2 = NULL; /* must be NULL for VC runtime */
523 /* @@@PH 98/07/13 Handlemanager support */
524 lpStartupInfo->hStdInput = GetStdHandle(STD_INPUT_HANDLE);
525 lpStartupInfo->hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
526 lpStartupInfo->hStdError = GetStdHandle(STD_ERROR_HANDLE);
527 return;
528}
529//******************************************************************************
530//Borrowed from Wine
531//******************************************************************************
532ODINPROCEDURE1(GetStartupInfoW,LPSTARTUPINFOW,lpStartupInfo)
533{
534 static WCHAR lpReserved[] = {'<', 'R','e','s','e','r','v','e','d','>', 0};
535 static WCHAR lpDesktop[] = {'D', 'e','s','k','t','o','p', 0};
536 static WCHAR lpTitle[] = {'T', 'i','t','l','e', 0};
537
538 // forward call to ascii variant
539 GetStartupInfoA((LPSTARTUPINFOA)lpStartupInfo);
540 lpStartupInfo->cb = sizeof(STARTUPINFOW);
541 lpStartupInfo->lpReserved = lpReserved;
542 lpStartupInfo->lpDesktop = lpDesktop;
543 lpStartupInfo->lpTitle = lpTitle;
544 return;
545}
546//******************************************************************************
547//TODO: Not complete or correct, but sufficient for now
548//******************************************************************************
549BOOL WIN32API GetBinaryTypeA(LPCTSTR lpApplicationName, LPDWORD lpBinaryType)
550{
551 dprintf(("KERNEL32: OS2GetBinaryTypeA %s\n", lpApplicationName));
552 if(strstr(lpApplicationName, ".EXE") || strstr(lpApplicationName, ".exe"))
553 *lpBinaryType = SCS_32BIT_BINARY;
554 else
555 if(strstr(lpApplicationName, ".COM") || strstr(lpApplicationName, ".com"))
556 *lpBinaryType = SCS_DOS_BINARY;
557 else
558 if(strstr(lpApplicationName, ".PIF") || strstr(lpApplicationName, ".pif"))
559 *lpBinaryType = SCS_PIF_BINARY;
560 else return(FALSE);
561 return(TRUE);
562}
563//******************************************************************************
564//******************************************************************************
565BOOL WIN32API GetBinaryTypeW(LPCWSTR lpApplicationName, LPDWORD lpBinaryType)
566{
567 BOOL rc;
568 char *astring;
569
570 dprintf(("KERNEL32: OS2GetBinaryTypeW\n"));
571 astring = UnicodeToAsciiString((LPWSTR)lpApplicationName);
572 rc = GetBinaryTypeA(astring, lpBinaryType);
573 FreeAsciiString(astring);
574 return(rc);
575}
576//******************************************************************************
577//TODO: SetLastError
578//******************************************************************************
579BOOL WIN32API GetVersionExA(OSVERSIONINFOA *lpVersionInformation)
580{
581 dprintf(("KERNEL32: OS2GetVersionExA\n"));
582
583 if(lpVersionInformation == NULL || lpVersionInformation->dwOSVersionInfoSize != sizeof(OSVERSIONINFOA))
584 return(FALSE);
585
586 lpVersionInformation->dwMajorVersion = ODINNT_MAJOR_VERSION; //pretend we're NT 4.0
587 lpVersionInformation->dwMinorVersion = ODINNT_MINOR_VERSION;
588 lpVersionInformation->dwBuildNumber = ODINNT_BUILD_NR;
589 lpVersionInformation->dwPlatformId = VER_PLATFORM_WIN32_NT;
590 strcpy(lpVersionInformation->szCSDVersion, ODINNT_CSDVERSION);
591 return(TRUE);
592}
593//******************************************************************************
594//******************************************************************************
595BOOL WIN32API GetVersionExW(OSVERSIONINFOW *lpVersionInformation)
596{
597 dprintf(("KERNEL32: OS2GetVersionExW\n"));
598
599 if(lpVersionInformation == NULL || lpVersionInformation->dwOSVersionInfoSize != sizeof(OSVERSIONINFOW))
600 return(FALSE);
601
602 lpVersionInformation->dwMajorVersion = ODINNT_MAJOR_VERSION; //pretend we're NT 4.0
603 lpVersionInformation->dwMinorVersion = ODINNT_MINOR_VERSION;
604 lpVersionInformation->dwBuildNumber = ODINNT_BUILD_NR;
605 lpVersionInformation->dwPlatformId = VER_PLATFORM_WIN32_NT;
606 lstrcpyW(lpVersionInformation->szCSDVersion, ODINNT_CSDVERSION_W);
607 return(TRUE);
608}
609//******************************************************************************
610//******************************************************************************
611LONG WIN32API GetVersion()
612{
613 dprintf(("KERNEL32: GetVersion\n"));
614 // highword 0 = NT, lowword high byte major ver, low byte minor ver
615/* @@@PH 98/04/04 MFC30 makes assumptions about process control block */
616/* structures that lead to crashes if we don't identify as NT */
617
618 return ODINNT_VERSION;
619}
620//******************************************************************************
621//SvL: 26-6-'97 - Added
622//******************************************************************************
623VOID WIN32API OutputDebugStringW(LPCWSTR arg1)
624{
625 char *astring;
626
627 astring = UnicodeToAsciiString((LPWSTR)arg1);
628 dprintf(("KERNEL32: OS2OutputDebugStringW %s\n", astring));
629 FreeAsciiString(astring);
630}
631//******************************************************************************
632//******************************************************************************
633VOID WIN32API OutputDebugStringA(LPCSTR lpszOutputString)
634{
635 dprintf(("KERNEL32: OutputDebugStringA: %s\n", lpszOutputString));
636 return;
637}
638//******************************************************************************
639//******************************************************************************
640BOOL WIN32API FlushInstructionCache( /*PLF Mon 98-02-09 23:56:49 : STUB STUB STUB STUB STUB */
641 HANDLE hProcess, /* process with cache to flush */
642 LPCVOID lpvBase, /* address of region to flush */
643 DWORD cbFlush) /* length of region to flush */
644
645{
646 dprintf(("FlushInstructionCache() - NIY\n"));
647 return TRUE;
648}
649
650
651int WIN32API GetNumberFormatA(LCID Locale,
652 DWORD dwFlags,
653 LPCSTR lpValue,
654 CONST NUMBERFMTA *lpFormat,
655 LPSTR lpNumberStr,
656 int cchNumber)
657{
658 dprintf(("KERNEL32::OS2GetNumberFormatA(%08x,%08x,%s,%08x,%s,%08x) not implemented.\n",
659 Locale,
660 dwFlags,
661 lpValue,
662 lpFormat,
663 lpNumberStr,
664 cchNumber));
665
666 return 0;
667}
668
669int WIN32API GetNumberFormatW(LCID Locale,
670 DWORD dwFlags,
671 LPCWSTR lpValue,
672 CONST NUMBERFMTW *lpFormat,
673 LPWSTR lpNumberStr,
674 int cchNumber)
675{
676 dprintf(("KERNEL32::OS2GetNumberFormatW(%08x,%08x,%s,%08x,%s,%08x) not implemented.\n",
677 Locale,
678 dwFlags,
679 lpValue,
680 lpFormat,
681 lpNumberStr,
682 cchNumber));
683
684 return 0;
685}
686
687BOOL WIN32API FindCloseChangeNotification(HANDLE hChange)
688{
689 dprintf(("KERNEL32: OS2FindNextChangeNotification, Not implemented\n"));
690
691 return(TRUE);
692}
693
694//******************************************************************************
695//******************************************************************************
696void WIN32API WrongComctl32()
697{
698 O32_MessageBox(NULL,
699 "KERNEL32.36 not implemented",
700 "Win32 for OS/2 Error",
701 MB_OK);
702 ExitProcess(987);
703}
704//******************************************************************************
705
706/***********************************************************************
707* RtlFillMemory (KERNEL32.441)
708*/
709VOID WIN32API RtlFillMemory(LPVOID ptr,
710 UINT len,
711 UINT fill )
712{
713#ifdef DEBUG_LOCAL
714 dprintf(("KERNEL32: RtlFillMemory(%08x,%08x,%08x)\n",
715 ptr,
716 len,
717 fill));
718#endif
719
720 memset(ptr,
721 fill,
722 len );
723}
724
725
726/***********************************************************************
727* RtlMoveMemory (KERNEL32.442)
728*/
729VOID WIN32API RtlMoveMemory(LPVOID dst,
730 LPCVOID src,
731 UINT len )
732{
733 dprintf2(("KERNEL32: RtlMoveMemory(%08x,%08x,%08x)\n",
734 dst,
735 src,
736 len));
737
738 memmove(dst,
739 src,
740 len );
741}
742
743
744/***********************************************************************
745* RtlZeroMemory (KERNEL32.444)
746*/
747VOID WIN32API RtlZeroMemory(LPVOID ptr,
748 UINT len)
749{
750 dprintf2(("KERNEL32: RtlZeroMemory(%08x,%08x)\n",
751 ptr,
752 len));
753
754 memset(ptr,
755 0,
756 len);
757}
758
759//******************************************************************************
760/*KSO Thu 21.05.1998*/
761BOOL WIN32API IsDBCSLeadByteEx(UINT CodePage, BYTE TestChar)
762{
763 dprintf(("KERNEL32: OS2IsDBCSLeadByteEx - not correctly implemented\n"));
764 return O32_IsDBCSLeadByte(TestChar);
765}
766//******************************************************************************
767
768
769
770
771
772
773
774
775/*****************************************************************************
776 * Name : BOOL GetSystemPowerStatus
777 * Purpose : The GetSystemPowerStatus function retrieves the power status of
778 * the system. The status indicates whether the system is running
779 * on AC or DC power, whether the battery is currently charging,
780 * and how much battery life currently remains.
781 * Parameters: LPSYSTEM_POWER_STATUS lpSystemPowerStatus
782 * Variables :
783 * Result : TRUE / FALSE
784 * Remark :
785 * Status : UNTESTED STUB
786 *
787 * Author : Patrick Haller [Mon, 1998/06/15 08:00]
788 *****************************************************************************/
789
790BOOL WIN32API GetSystemPowerStatus(LPSYSTEM_POWER_STATUS lpSystemPowerStatus)
791{
792 dprintf(("Kernel32: GetSystemPowerStatus(%08xh) not properly implemented.\n",
793 lpSystemPowerStatus));
794
795 if(lpSystemPowerStatus == NULL) {
796 SetLastError(ERROR_INVALID_PARAMETER);
797 return FALSE;
798 }
799 lpSystemPowerStatus->ACLineStatus = 1; //online
800 lpSystemPowerStatus->BatteryFlag = 128; //no system battery
801 lpSystemPowerStatus->BatteryLifePercent = 255; //unknown
802 lpSystemPowerStatus->reserved = 0;
803 lpSystemPowerStatus->BatteryLifeTime = -1; //unknown
804 lpSystemPowerStatus->BatteryFullLifeTime= -1; //unknown
805
806 return TRUE;
807}
Note: See TracBrowser for help on using the repository browser.