From aea2b7143705c7830a9ee932e6e7153e33082d55 Mon Sep 17 00:00:00 2001 From: Robert Kopferl Date: Sat, 23 Mar 2002 19:23:28 +0000 Subject: [PATCH] initial comit svn path=/trunk/; revision=2773 --- os2/apps/bepslep/Makefile | 32 + os2/apps/bepslep/bepslep.c | 19 + os2/lib/doscalls/doscalls.def | 20 + os2/lib/doscalls/doscalls.rc | 38 + .../doscalls/implemented_functions_info.txt | 1059 +++++++++++++++++ os2/lib/doscalls/makefile | 39 + os2/lib/doscalls/misc/doscalls.c | 245 ++++ os2/lib/doscalls/misc/doscalls.h | 84 ++ os2/lib/doscalls/misc/errorcodes.c | 287 +++++ os2/lib/doscalls/misc/os2def.h | 53 + os2/lib/doscalls/run/process.cpp | 17 + os2/server/makefile | 29 + os2/server/os2ss.cpp | 115 ++ os2/utils/EXE386.H | 558 +++++++++ os2/utils/LXDUMP.EXE | Bin 0 -> 54547 bytes os2/utils/lxtest.EXE | Bin 0 -> 33140 bytes 16 files changed, 2595 insertions(+) create mode 100644 os2/apps/bepslep/Makefile create mode 100644 os2/apps/bepslep/bepslep.c create mode 100644 os2/lib/doscalls/doscalls.def create mode 100644 os2/lib/doscalls/doscalls.rc create mode 100644 os2/lib/doscalls/implemented_functions_info.txt create mode 100644 os2/lib/doscalls/makefile create mode 100644 os2/lib/doscalls/misc/doscalls.c create mode 100644 os2/lib/doscalls/misc/doscalls.h create mode 100644 os2/lib/doscalls/misc/errorcodes.c create mode 100644 os2/lib/doscalls/misc/os2def.h create mode 100644 os2/lib/doscalls/run/process.cpp create mode 100644 os2/server/makefile create mode 100644 os2/server/os2ss.cpp create mode 100644 os2/utils/EXE386.H create mode 100644 os2/utils/LXDUMP.EXE create mode 100644 os2/utils/lxtest.EXE diff --git a/os2/apps/bepslep/Makefile b/os2/apps/bepslep/Makefile new file mode 100644 index 00000000000..61e676c001d --- /dev/null +++ b/os2/apps/bepslep/Makefile @@ -0,0 +1,32 @@ +# $Id: Makefile,v 1.1 2002/03/23 19:23:27 robertk Exp $ +# +# To run it in Win32 console mode, undefine __SUBSYSTEM_WINDOWS__ +# and pass "console" in the ld's --subsystem option. +# +# +PATH_TO_TOP=../../../.. + +PATH_TO_OS2_TOP=../.. + +TARGET_NAME=bepslep + +CFLAGS=-D__SUBSYSTEM_WINDOWS__ + +OBJECTS=$(TARGET_NAME).o + +LIBRARIES=\ + $(PATH_TO_OS2_TOP)/dll/doscalls.dll + +$(TARGET_NAME): $(OBJECTS) $(LIBRARIES) + $(CC) \ + $(CFLAGS) \ + $(OBJECTS) \ + $(LIBRARIES)\ + -o $@ \ + -Wl,--subsystem,windows\ + -nostartfiles \ + -nostdlib + +include $(PATH_TO_TOP)/rules.mak + +# EOF diff --git a/os2/apps/bepslep/bepslep.c b/os2/apps/bepslep/bepslep.c new file mode 100644 index 00000000000..08e6aadb84b --- /dev/null +++ b/os2/apps/bepslep/bepslep.c @@ -0,0 +1,19 @@ + + +#include "../../dll/doscalls/doscalls.h" + +void Eingang() +{ + DosBeep(3000,300); + DosSleep(1000); + DosBeep(4000,200); + DosExit(0,0); +} + +void WinMainCRTStartup() +{ + int a, b; + a= b+3; + b=a+3; + Eingang(); +} \ No newline at end of file diff --git a/os2/lib/doscalls/doscalls.def b/os2/lib/doscalls/doscalls.def new file mode 100644 index 00000000000..27e45b67589 --- /dev/null +++ b/os2/lib/doscalls/doscalls.def @@ -0,0 +1,20 @@ +; Def for doscalls.dll - part of the OS/2-sub system +; for ReactOS. Provides Access to OS/2 kernel services. + +LIBRARY doscalls.dll + +DESCRIPTION "Part of the ReactOS OS/2 sub system, provides base kernel services to OS/2-apps" + +EXPORTS +; FIXME: fill in all exports + +Dos32Sleep=Dos32Sleep@4 @229 +Dos32Close=Dos32Close@4 @257 +Dos32Open=Dos32Open@32 @273 +Dos32Read=Dos32Read@16 @281 +Dos32Write=Dos32Write@16 @282 +Dos32DevIOCtl=Dos32DevIOCtl@36 @284 +Dos32Beep=Dos32Beep@8 @286 +Dos32Exit=Dos32Exit@8 @234 +Dos32CreateThread=Dos32CreateThread@20 @311 + diff --git a/os2/lib/doscalls/doscalls.rc b/os2/lib/doscalls/doscalls.rc new file mode 100644 index 00000000000..c4ff7f0856d --- /dev/null +++ b/os2/lib/doscalls/doscalls.rc @@ -0,0 +1,38 @@ +#include +#include + +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +VS_VERSION_INFO VERSIONINFO + FILEVERSION RES_UINT_FV_MAJOR,RES_UINT_FV_MINOR,RES_UINT_FV_REVISION,RES_UINT_FV_BUILD + PRODUCTVERSION RES_UINT_PV_MAJOR,RES_UINT_PV_MINOR,RES_UINT_PV_REVISION,RES_UINT_PV_BUILD + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "CompanyName", RES_STR_COMPANY_NAME + VALUE "FileDescription", "OS2 subsystem base services\0" + VALUE "FileVersion", RES_STR_FILE_VERSION + VALUE "InternalName", "doscalls\0" + VALUE "LegalCopyright", RES_STR_LEGAL_COPYRIGHT + VALUE "OriginalFilename", "doscalls.dll\0" + VALUE "ProductName", RES_STR_PRODUCT_NAME + VALUE "ProductVersion", RES_STR_PRODUCT_VERSION + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + diff --git a/os2/lib/doscalls/implemented_functions_info.txt b/os2/lib/doscalls/implemented_functions_info.txt new file mode 100644 index 00000000000..91d4c063aec --- /dev/null +++ b/os2/lib/doscalls/implemented_functions_info.txt @@ -0,0 +1,1059 @@ +Creator: robert K. robertk@mok.lvcm.com + +This is a list of all functions of the doscalls.dll from OS/2. +Since ReactOS is an OS with flat model and since we have no +ambitions to support 16-Bit OS/2 apps, we'll not implement souch +functions. Above that, we want to port ReacOS and the OS/2 sub +system to other platforms (i.e. the PowerPC ;-D ). + +Semantics of this file: +Functions with nothing behind are not yet implemented/considered. +Functions with a ??? should be considered later. +Functions with a --- will not be implemented. +Functions with a - xxx are implemented in some file +in the directory xxx: +file- file, pipe io +sync- thread synchronisation +mem - memory considerations +misc- internal and indifferent stuff +mou - mouse sub system +kbd - keyboard sub system +vio - video/console io +run - processes and threads +... + + +1 DosICreateThread ??? +2 Dos16Cwait --- +3 Dos16EnterCritSec --- +4 DosIExecPgm ??? +5 Dos16Exit --- +6 Dos16ExitCritSec +7 Dos16ExitList +8 Dos16GetInfoSeg +9 Dos16GetPrty +10 Dos16KillProcess +11 Dos16SetPrty +12 Dos16Ptrace +13 Dos16HoldSignal +14 Dos16SetSigHandler +15 Dos16FlagProcess +16 Dos16MakePipe +17 DosISysSemClear +18 DosISemRequest +19 DosISysSemSet +20 Dos16SemSetWait +21 DosISemWait +22 Dos16MuxSemWait +23 Dos16CloseSem +24 Dos16CreateSem +25 Dos16OpenSem +26 Dos16ResumeThread +27 Dos16SuspendThread +28 Dos16SetDateTime +29 Dos16TimerAsync +30 Dos16TimerStart +31 Dos16TimerStop +32 Dos16Sleep +33 Dos16GetDateTime +34 Dos16AllocSeg +35 Dos16AllocShrSeg +36 Dos16GetShrSeg +37 Dos16GiveSeg +38 Dos16ReallocSeg +39 Dos16FreeSeg +40 Dos16AllocHuge +41 Dos16GetHugeShift +42 Dos16ReallocHuge +43 Dos16CreateCSAlias +44 Dos16LoadModule +45 Dos16GetProcAddr +46 Dos16FreeModule +47 Dos16GetModHandle +48 Dos16GetModName +49 Dos16GetMachineMode +50 Dos16Beep +51 Dos16CLIAccess +52 Dos16DevConfig +53 Dos16DevIOCtl +54 Dos16SGSwitch +55 Dos16SGSwitchMe +56 Dos16BufReset +57 Dos16ChDir +58 Dos16ChgFilePtr +59 Dos16Close +60 Dos16Delete +61 Dos16DupHandle +62 Dos16FileLocks +63 Dos16FindClose +64 Dos16FindFirst +65 Dos16FindNext +66 Dos16MkDir +67 Dos16Move +68 Dos16NewSize +69 Dos16PortAccess +70 Dos16Open +71 Dos16QCurDir +72 Dos16QCurDisk +73 Dos16QFHandState +74 Dos16QFileInfo +75 Dos16QFileMode +76 Dos16QFSInfo +77 Dos16QHandType +78 Dos16QVerify +79 DosIRead +80 Dos16RmDir +81 Dos16SelectDisk +82 Dos16SetFHandState +83 Dos16SetFileInfo +84 Dos16SetFileMode +85 Dos16SetMaxFH +86 Dos16SetVerify +87 DosIWrite +88 Dos16SystemService +89 Dos16SetVec +90 Dos16SysTrace +91 Dos16GetEnv +92 Dos16GetVersion +93 Dos16QTraceInfo +94 Dos16GetPID +95 Dos16Open2 +96 Dos16LibInit +97 Dos16SetFSInfo +98 Dos16QPathInfo +99 Dos16DevIOCtl2 +100 DosICanonicalize +101 Dos16SetFgnd +102 Dos16SwapTaskInit +103 Dos16ReadPhys +104 Dos16SetPathInfo +105 Dos16SGSwitchProc2 +106 STRUCHECK +107 STRURESUPDATE +108 DosISetRelMaxFH +109 DosIDevIOCtl +110 Dos32ForceDelete +111 Dos32KillThread +112 Dos32QueryRASInfo +113 Dos32DumpProcess +114 Dos32SuppressPopUps +115 THK32ALLOCMEM +116 THK32FREEMEM +117 THK32ALLOCSTACK +118 DosOpen2Compt +119 Dos16GetSTDA +120 Dos16Error +121 Dos16GetSeg +122 Dos16LockSeg +123 Dos16UnlockSeg +124 Dos16SGSwitchProc +125 DosIRamSemWake +126 Dos16SizeSeg +127 Dos16MemAvail +128 DosIRamSemRequest +129 DosPhysicalDisk +130 Dos16GetCP +131 DosISetCP +132 DosGlobalSeg +133 Dos16Profile +134 Dos16SendSignal +135 DosHugeShift +136 DosHugeIncr +137 Dos16Read +138 Dos16Write +139 Dos16ErrClass +140 Dos16SemRequest +141 Dos16SemClear +142 Dos16SemWait +143 Dos16SemSet +144 Dos16ExecPgm +145 Dos16CreateThread +146 Dos16SubSet +147 Dos16SubAlloc +148 Dos16SubFree +149 Dos16ReadAsync +150 Dos16WriteAsync +151 Dos16SearchPath +152 Dos16ScanEnv +153 Dos16SetCP +154 Dos16QProcStatus +155 Dos16GetResource +156 Dos16GetPPID +157 Dos16CallBack +158 DosICallBack +159 DosRetForward +160 Dos16R2StackRealloc +161 Dos16FSRamSemRequest +162 Dos16FSRamSemClear +163 Dos16QAppType +164 Dos16SetProcCP +165 Dos16DynamicTrace +166 Dos16QSysInfo +167 DosIMakeNmPipe +168 DosICallNmPipe +169 DosIConnectNmPipe +170 DosIDisconnectNmPipe +171 DosIPeekNmPipe +172 DosIQNmPipeInfo +173 DosIQNmPHandState +174 DosISetNmPHandState +175 DosITransactNmPipe +176 DosIWaitNmPipe +177 DosISetNmPipeSem +178 DosIQNmPipeSemState +179 DosIRawReadNmPipe +180 DosIRawWriteNmPipe +181 Dos16FSAttach +182 Dos16QFSAttach +183 Dos16FSCtl +184 Dos16FindFirst2 +185 Dos16MkDir2 +186 Dos16FileIO +187 Dos16FindNotifyClose +188 Dos16FindNotifyFirst +189 Dos16FindNotifyNext +190 Dos16SetTraceInfo +191 Dos16EditName +192 Dos16LogMode +193 Dos16LogEntry +194 Dos16GetLogBuffer +195 Dos16LogRegister +196 Dos16LogRead +197 Dos16FindFromName +198 Dos16OPLockRelease +199 Dos16OPLockWait +200 DosICopy +201 Dos16Copy +202 DosIQAppType +203 DosForceDelete +204 DosEnumAttribute +205 Dos16OPLockShutdown +206 DosShutdown +207 DosGetResource2 +208 DosFreeResource +209 Dos32SetMaxFH +210 Dos32SetVerify +211 Dos32ErrClass +212 Dos32Error +213 DosCreateVDM +214 DosMaxPathLen +215 DosPageSize +216 DosLocalInfo +217 DosGlobalInfo +218 Dos32SetFileInfo +219 Dos32SetPathInfo +220 Dos32SetDefaultDisk +221 Dos32SetFHState +222 Dos32SetFSInfo +223 Dos32QueryPathInfo +224 Dos32QueryHType +225 Dos32QueryVerify +226 Dos32DeleteDir +227 Dos32ScanEnv +228 Dos32SearchPath +229 Dos32Sleep +230 Dos32GetDateTime +231 Dos32DevConfig +232 Dos32EnterCritSec +233 Dos32ExitCritSec +234 Dos32Exit run +235 Dos32KillProcess +236 Dos32SetPriority +237 Dos32ResumeThread +238 Dos32SuspendThread +239 Dos32CreatePipe +240 Dos32CallNPipe +241 Dos32ConnectNPipe +242 Dos32DisConnectNPipe +243 Dos32CreateNPipe +244 Dos32PeekNPipe +245 Dos32QueryNPHState +246 Dos32RawReadNPipe +247 Dos32RawWriteNPipe +248 Dos32QueryNPipeInfo +249 Dos32QueryNPipeSemState +250 Dos32SetNPHState +251 Dos32SetNPipeSem +252 Dos32TransactNPipe +253 Dos32WaitNPipe +254 Dos32ResetBuffer +255 Dos32SetCurrentDir +256 Dos32SetFilePtr +257 Dos32Close +258 Dos32Copy +259 Dos32Delete +260 Dos32DupHandle +261 Dos32EditName +262 THK32FREESTACK +263 Dos32FindClose +264 Dos32FindFirst +265 Dos32FindNext +266 Dos16OpenVDD +267 Dos16RequestVDD +268 Dos16CloseVDD +269 Dos32FSAttach +270 Dos32CreateDir +271 Dos32Move +272 Dos32SetFileSize +273 Dos32Open +274 Dos32QueryCurrentDir +275 Dos32QueryCurrentDisk +276 Dos32QueryFHState +277 Dos32QueryFSAttach +278 Dos32QueryFSInfo +279 Dos32QueryFileInfo +280 Dos32WaitChild +281 Dos32Read +282 Dos32Write +283 Dos32ExecPgm +284 Dos32DevIOCtl +285 Dos32FSCtl +286 Dos32Beep +287 Dos32PhysicalDisk +288 Dos32SetCp +289 Dos32SetProcessCp +290 Dos32StopTimer +291 Dos32QueryCp +292 Dos32SetDateTime +293 Thk32AllocBlock +294 Thk32FreeBlock +295 Thk32R3DS +296 Dos32ExitList +297 Dos32AllocProtectedMem +298 Dos32AliasMem +299 Dos32AllocMem +300 Dos32AllocSharedMem +301 Dos32GetNamedSharedMem +302 Dos32GetSharedMem +303 Dos32GiveSharedMem +304 Dos32FreeMem +305 Dos32SetMem +306 Dos32QueryMem +307 Dos32QueryMemState +308 Dos32OpenVDD +309 Dos32RequestVDD +310 Dos32CloseVDD +311 Dos32CreateThread +312 Dos32GetInfoBlocks +313 Dos16AllocProtSeg +314 Dos16AllocShrProtSeg +315 Dos16AllocProtHuge +316 Dos32DynamicTrace +317 Dos32Debug +318 Dos32LoadModule +319 Dos32QueryModuleHandle +320 Dos32QueryModuleName +321 Dos32QueryProcAddr +322 Dos32FreeModule +323 Dos32QueryAppType +324 Dos32CreateEventSem +325 Dos32OpenEventSem +326 Dos32CloseEventSem +327 Dos32ResetEventSem +328 Dos32PostEventSem +329 Dos32WaitEventSem +330 Dos32QueryEventSem +331 Dos32CreateMutexSem +332 Dos32OpenMutexSem +333 Dos32CloseMutexSem +334 Dos32RequestMutexSem +335 Dos32ReleaseMutexSem +336 Dos32QueryMutexSem +337 Dos32CreateMuxWaitSem +338 Dos32OpenMuxWaitSem +339 Dos32CloseMuxWaitSem +340 Dos32WaitMuxWaitSem +341 Dos32AddMuxWaitSem +342 Dos32DeleteMuxWaitSem +343 Dos32QueryMuxWaitSem +344 Dos32SubSetMem +345 Dos32SubAllocMem +346 Dos32SubFreeMem +347 Dos32SubUnsetMem +348 Dos32QuerySysInfo +349 Dos32WaitThread +350 Dos32AsyncTimer +351 Dos32StartTimer +352 Dos32GetResource +353 Dos32FreeResource +354 Dos32SetExceptionHandler +355 Dos32UnsetExceptionHandler +356 Dos32RaiseException +357 Dos32UnwindException +358 Dos32QueryPageUsage +359 Dos16QueryModFromCS +360 Dos32QueryModFromEIP +361 DosFPDataArea +362 Dos32TmrQueryFreq +363 Dos32TmrQueryTime +364 Dos32AliasPerfCtrs +365 Dos32ConfigPerf +366 Dos32DeconPerf +367 Dos32RegisterPerfCtrs +368 Dos32QuerySysState +369 Dos32FlatCS +370 Dos32FlatDS +371 Dos32QueryABIOSSupport +372 Dos32EnumAttribute +373 Dos32QueryDosProperty +374 Dos32SetDosProperty +375 Dos16QueryDosProperty +376 Dos16SetDosProperty +377 Dos32Profile +378 Dos32SetSignalExceptionFocus +379 Dos32SendSignalException +380 Dos32EnterMustComplete +381 Dos32ExitMustComplete +382 Dos32SetRelMaxFH +383 Dos16PutMessage +384 Dos16TrueGetMessage +385 Dos16InsMessage +386 Dos32InsertMessage +387 Dos32PutMessage +388 Dos32TrueGetMessage +389 DosIQueryMessageCP +390 Dos32IQueryMessageCP +391 Dos16CaseMap +392 Dos16GetCollate +393 Dos16GetCtryInfo +394 Dos16GetDBCSEv +395 Dos32QueryCtryInfo +396 Dos32QueryDBCSEnv +397 Dos32MapCase +398 Dos32QueryCollate +399 Dos16MakeNmPipe +400 Dos16QNmPipeInfo +401 Dos16ConnectNmPipe +402 Dos16DisconnectNmPipe +403 Dos16QNmPHandState +404 Dos16SetNmPHandState +405 Dos16PeekNmPipe +406 Dos16WaitNmPipe +407 Dos16TransactNmPipe +408 Dos16CallNmPipe +409 Dos16RawReadNmPipe +410 Dos16RawWriteNmPipe +411 Dos16SetNmPipeSem +412 Dos16QNmPipeSemState +413 StartLazyWriter +414 _QueInst_Data +415 Dos32Shutdown +416 Dos32ICacheModule +417 Dos32ReplaceModule +418 Dos32AcknowledgeSignalException +419 Dos32TIB +420 Dos16TmrQueryFreq +421 Dos16TmrQueryTime +422 Dos16RegisterPerfCtrs +423 Dos16FlatToSel +424 Dos16SelToFlat +425 Dos32FlatToSel +426 Dos32SelToFlat +427 DosIODelayCnt +428 Dos32SetFileLocks +429 Dos32CancelLockRequest +430 Dos32GetLocaleModule +430 LogOpen +431 LogClose +432 LogAddEntries +433 LogGetEntries +434 LogSetState +435 LogSetName +436 LogQueryState +437 Dos16OpenChangeNotify +438 Dos16ResetChangeNotify +439 Dos16CloseChangeNotify +440 Dos32OpenChangeNotify +441 Dos32ResetChangeNotify +442 Dos32CloseChangeNotify +443 Dos16QueryABIOSSupport +444 Dos32ForceSystemDump +447 Dos32GetProcessorStatus +448 Dos32SetProcessorStatus +449 Dos16CreateSpinLock +450 Dos16AcquireSpinLock +451 Dos16ReleaseSpinLock +452 Dos16FreeSpinLock +453 Dos32TestPSD +454 Dos32AllocThreadLocalMemory +455 Dos32FreeThreadLocalMemory +460 Dos32VerifyPIDTID +464 PTDA_LANMAN_SEC +465 PTDA_PID +466 SAS_SEL +467 TCB_OPCOOKIE +468 TCB_OPFLAGS +469 TCB_NEWFLAGS +470 TCB_USER_ID +471 TCB_PROC_ID +472 TCB_FSHARING +473 TCB_SRVATTRIB +474 TCB_ALLOWED +475 TCB_PRTCB +476 TCB_NUMBER +477 TCB_THISSFT +478 TCB_THISCDS +479 TKOPTDA +480 PTDA_CRITSEC +481 PTDA_HOLDSIGCNT +482 PTDA_PPTDAPARENT +483 PTDA_PGDATA +484 PTDA_HANDLE +485 PTDA_MODULE +486 PTDA_LDTHANDLE +487 PTDA_CODEPAGE_TAG +488 PTDA_JFN_LENGTH +489 PTDA_JFN_PTABLE +490 PTDA_JFN_FLG_PTR +491 PTDA_EXTERR_LOCUS +492 PTDA_EXTERR +493 PTDA_EXTERR_ACTION +494 PTDA_EXTERR_CLASS +495 PTDA_PPID +496 PTDA_PROCTYPE +497 PTDA_CURRTCB +498 PTDA_CURRTSD +499 PTDA_SIGNATURE +500 T32EXITLIST +501 T32ALLOCPROTECTEDMEM +502 T32ALIASMEM +503 T32ALLOCMEM +504 T32ALLOCSHAREDMEM +505 T32GETNAMEDSHAREDMEM +506 T32GETSHAREDMEM +507 T32GIVESHAREDMEM +508 T32FREEMEM +509 T32SETMEM +510 T32QUERYMEM +511 T32QUERYMEMSTATE +512 T32OPENVDD +513 T32REQUESTVDD +514 T32CLOSEVDD +515 T32CREATETHREAD +516 T32DYNAMICTRACE +517 T32DEBUG +518 T32QUERYPROCADDR +519 T32CREATEEVENTSEM +520 T32OPENEVENTSEM +521 T32CLOSEEVENTSEM +522 T32RESETEVENTSEM +523 T32POSTEVENTSEM +524 T32WAITEVENTSEM +525 T32QUERYEVENTSEM +526 T32CREATEMUTEXSEM +527 T32OPENMUTEXSEM +528 T32CLOSEMUTEXSEM +529 T32REQUESTMUTEXSEM +530 T32RELEASEMUTEXSEM +531 T32QUERYMUTEXSEM +532 T32CREATEMUXWAITSEM +533 T32OPENMUXWAITSEM +534 T32CLOSEMUXWAITSEM +535 T32WAITMUXWAITSEM +536 T32ADDMUXWAITSEM +537 T32DELETEMUXWAITSEM +538 T32QUERYMUXWAITSEM +539 T32QUERYSYSINFO +540 T32WAITTHREAD +541 DosIOpenL +541 T32GETRESOURCE +542 DosIProtectOpenL +542 T32FREERESOURCE +543 DosISetFileSizeL +543 T32EXCEPTIONCALLBACK +544 DosIProtectSetFileSizeL +544 T32QUERYPAGEUSAGE +545 Dos32ExceptionCallBack +546 TI32ASYNCTIMER +546 THK32STRLEN +547 TI32STARTTIMER +547 THK_UNITHUNK +548 Dos32R3ExceptionDispatcher +549 DosLibiDisp +550 DosLibiDisp16 +551 DosLibiDisp32 +552 DosR3ExitAddr +553 Dos32R3ExitAddr +554 Dos32IRead +555 T32IREAD +556 Dos32IWrite +557 Dos32CreateSpinLock +557 T32IWRITE +558 Dos32AcquireSpinLock +558 T32TMRQUERYFREQ +559 Dos32ReleaseSpinLock +559 T32TMRQUERYTIME +560 Dos32FreeSpinLock +560 T32ALIASPERFCTRS +561 Dos32PMR3WaitEventSem +561 T32CONFIGUREPERF +562 Dos32PMR3PostEventSem +562 T32DECONPERF +563 Dos32QueryThreadAffinity +563 T32REGISTERPERFCTRS +564 Dos32SetThreadAffinity +564 T32QUERYSYSSTATE +565 DosISetFileInfo +566 DosISetPathInfo +567 DosOpenL +567 T32QUERYDOSPROPERTY +568 DosSetFilePtrL +568 T32SETDOSPROPERTY +569 DosIFindNext +570 DosSetFileSizeL +570 T32PROFILE +571 T32QUERYRESOURCESIZE +572 Dos32QueryResourceSize +573 DosQueryResourceSize +574 T32SETSIGNALEXCEPTIONFOCUS +574 DosPMSemWait +575 T32SENDSIGNALEXCEPTION +575 DosPMMuxSemWait +576 T32STARTTIMER +576 THK16_UNITHUNK +577 T32STOPTIMER +577 HT16_STARTUP +578 T32ASYNCTIMER +578 HT16_CLEANUP +579 T32INITIALIZEPORTHOLE +579 HT32_STARTUP +580 Dos32InitializePorthole +581 T32QUERYHEADERINFO +581 HT32_CLEANUP +582 Dos32QueryHeaderInfo +583 DosInitializePorthole +584 DosQueryHeaderInfo +585 T32QUERYPROCTYPE +585 _Dos32IMonRead +586 Dos32QueryProcType +587 DosQueryProcType +588 T32IEXITMUSTCOMPLETE +588 _Dos32IMonWrite +589 DosISigDispatch +590 T32ICACHEMODULE +590 Dos32PMPostEventSem +591 T32DLLTERM +591 Dos32PMWaitEventSem +592 Dos32DllTermDisp +593 T32IRAISEEXCEPTION +593 Dos32PMRequestMutexSem +594 Dos32IRaiseException +595 T32ACKNOWLEDGESIGNALEXC +595 Dos32PMWaitMuxWaitSem +596 Dos32PM16SemChk +597 Dos32IQueryFHState +598 Dos32ISetFHState +599 Dos32LDTSel +600 Dos32R3Frestor +601 DosIFindFirst +602 T32SETFILELOCKS +603 T32CANCELLOCKREQUEST +604 T32IMONREAD +605 T32IMONWRITE +606 DosMonOpen +607 DosMonClose +608 DosMonRead +609 DosMonWrite +610 DosMonReg +611 T32KILLTHREAD +612 TQUERYRASINFO +615 Dos32IProtectWrite +617 DosIProtectSetFileInfo +618 Dos32IProtectSetFileInfo +619 Dos32IProtectSetFHState +620 Dos32IProtectQueryFHState +621 Dos32ProtectSetFilePtr +622 Dos16ProtectClose +623 Dos16ProtectFileIO +624 Dos16ProtectFileLocks +625 DosIProtectRead +626 DosIProtectWrite +627 Dos16ProtectNewSize +628 Dos16ProtectOpen +629 Dos16ProtectQFHandState +630 Dos16ProtectSetFHandState +631 Dos16ProtectQFileInfo +632 Dos16ProtectSetFileInfo +634 Dos16ProtectChgFilePtr +635 Dos16ProtectEnumAttribute +636 Dos32ProtectEnumAttribute +637 Dos32ProtectOpen +638 Dos32ProtectClose +639 Dos32ProtectSetFileLocks +640 Dos32ProtectSetFileSize +641 Dos32ProtectRead +642 Dos32ProtectWrite +643 Dos32ProtectSetFileInfo +644 Dos32ProtectSetFHState +645 Dos32ProtectQueryFHState +646 Dos32ProtectQueryFileInfo +647 Dos32IProtectRead +649 DosCloseMessageFile +650 DosLDRDirtyWorker +651 Dos16LDRDirtyWorker +652 Dos32IGetInfoBlocks +653 T32IGETINFOBLOCKS +656 T32GETPROCESSORSTATUS +657 T32SETPROCESSORSTATUS +658 T32TESTPSD +659 T32QUERYTHREADAFFINITY +660 T32SETTHREADAFFINITY +661 Dos32ReadQueue +662 Dos32PurgeQueue +663 Dos32CloseQueue +664 Dos32QueryQueue +665 Dos32PeekQueue +666 Dos32WriteQueue +667 Dos32OpenQueue +668 Dos32CreateQueue +669 Dos32StartSession +670 Dos32SelectSession +671 Dos32SetSession +672 Dos32StopSession +673 DosRegisterNotification +674 Dos16ReadQueue +675 Dos16PurgeQueue +676 Dos16CloseQueue +677 Dos16QueryQueue +678 Dos16PeekQueue +679 Dos16WriteQueue +680 Dos16OpenQueue +681 Dos16CreateQueue +682 Dos16SMGetmem +683 Dos16SMFreemem +684 Dos16SMGetSGCB +685 Dos16SMInitSGCB +686 Dos16SMSGDoPopup +687 Dos16SMSwitch +688 Dos16SMServeAppReq +689 Dos16GetTimes +690 Dos16SMSetTitle +691 Dos16ScrUnlock +692 Dos16SMDoAppReq +693 Dos16StopSession +694 Dos16SelectSession +695 Dos16ScrLock +696 Dos16SavRedrawWait +697 Dos16SavRedrawUndo +698 Dos16SMSGEndPopup +699 Dos16SetSession +700 Dos16SetMNLockTime +701 Dos16ModeUndo +702 Dos16StartSession +703 Dos16SMGetStatus +704 Dos16ModeWait +705 Dos16SMTerminate +706 Dos16SMGetAppReq +707 Dos16SMInitialize +708 Dos16SMStart +709 Dos16SMParentSwitch +710 Dos16SMPause +711 Dos16SMHDeinit +712 Dos16SMPMPresent +713 Dos16SMRegisterDD +714 Dos16SMNotifyDD +715 Dos16SMNotifyDD2 +716 Dos16SMOpenDD +717 Dos16SMSetSessionType +718 OS2BaseInit +719 MouGetPtrShape +720 MouSetPtrShape +721 MouGetNumMickeys +722 MouGetThreshold +723 MouShellInit +724 MouGetScaleFact +725 MouFlushQue +726 MouGetNumButtons +727 MouClose +728 MouSetThreshold +729 MouSetScaleFact +730 MouGetNumQueEl +731 MouDeRegister +732 MouGetEventMask +733 MouSetEventMask +734 MouOpen +735 MouRemovePtr +736 MouGetPtrPos +737 MouReadEventQue +738 MouSetPtrPos +739 MouGetDevStatus +740 MouSynch +741 MouRegister +742 MouSetDevStatus +743 MouDrawPtr +744 MouInitReal +745 KbdSetCustXt +746 KbdInit +747 KbdGetCp +748 KbdCharIn +749 KbdSetCp +750 KbdLoadInstance +751 KbdSynch +752 KbdRegister +753 KbdStringIn +754 KbdGetStatus +755 KbdSetStatus +756 KbdGetFocus +757 KbdFlushBuffer +758 KbdXlate +759 KbdSwitchFgnd +760 KbdShellInit +761 KbdClose +762 KbdFreeFocus +763 KbdFree +764 KbdDeRegister +765 KbdSetFgnd +766 KbdPeek +767 KbdOpen +768 KbdGetHWId +769 KbdSetHWId +770 VioEndPopup +771 VioGetPhysBuf +772 VioGetAnsi +773 VioFree +774 VioSetAnsi +775 VioDeRegister +776 VioScrollUp +777 VioPrtSc +778 VioGetCurPos +779 VioWrtCellStr +780 VioPopUp +781 VioScrollRt +782 VioWrtCharStr +783 Avs_Prtsc +784 VioSetCurPos +785 VioSrfUnblock +786 VioSrfBlock +787 VioScrUnlock +788 VioWrtTty +789 VioSave +790 VioGetMode +791 VioSetMode +792 VioScrLock +793 VioReadCellStr +794 VioSavRedrawWait +795 VioWrtNAttr +796 VioGetCurType +797 VioSavRedrawUndo +798 VioGetFont +799 VioReadCharStr +800 VioGetBuf +801 VioSetCurType +802 VioSetFont +803 VioHetInit +804 VioModeUndo +805 VioSswSwitch +806 VioModeWait +807 Avs_PrtscToggle +808 VioGetCp +809 VioRestore +810 VioSetCp +811 VioShowBuf +812 VioScrollLf +813 VioRegister +814 VioGetConfig +815 VioScrollDn +816 VioWrtCharStrAtt +817 VioGetState +818 VioPrtScToggle +819 VioSetState +820 VioWrtNCell +821 VioWrtNChar +822 VioShellInit +823 VioAssociate +824 VioCreatePS +825 VioDeleteSetId +826 VioGetDeviceCellSize +827 VioGetOrg +828 VioCreateLogFont +829 VioDestroyPS +830 VioQuerySetIds +831 VioSetOrg +832 VioQueryFonts +833 VioSetDeviceCellSize +834 VioShowPS +835 VioGetPSAddress +836 VioQueryConsole +837 VioRedrawSize +838 VioGlobalReg +839 XVioSetCAState +840 XVioCheckCharType +841 XVioDestroyCA +842 XVioCreateCA +843 VioCheckCharType +844 XVioGetCAState +845 BVSMAIN +846 BVSREDRAWSIZE +847 BVSGETPTRDRAWNAME +848 AnsiInject +849 AnsiKeydef +850 AnsiInterp +851 BKSMAIN +852 BMSMAIN +853 MouGetHotKey +854 MouSetHotKey +855 Dos16SMSysInit +856 QhKeybdHandle +857 QhMouseHandle +858 SMQueueRamSem +859 SMArray +860 SMPIDArray +861 SMInitialized +862 SMArraySize +863 BVSGLOBAL +864 SMGINSTANCE +865 BVHINSTANCE +866 THK32ALIASMEM +867 THK32FREEALIAS +868 THK32ALLOCVARLEN +869 THK32HANDLEBOUNDARY +870 THK32HANDLESTRING +871 THK32DEALLOC +872 THK32XHNDLR +873 Dos32SetExtLIBPATH +874 Dos32QueryExtLIBPATH +875 Dos32PM16SemRst +876 Dos32SysCtl +877 Dos32QueryThreadContext +878 DosSGQueryTopmost +976 Dos32PerfSysCall +981 Dos32OpenL +982 Dos32ProtectOpenL +983 Dos32ProtectSetFileLocksL +984 Dos32ProtectSetFilePtrL +985 Dos32ProtectSetFileSizeL +986 Dos32SetFileLocksL +987 Dos32CancelLockRequestL +988 Dos32SetFilePtrL +989 Dos32SetFileSizeL +990 Dos32ListIOL +991 Dos16FSRamSemRequest2 +992 Dos16FSRamSemClear2 +995 Dos32SystemService +996 Dos32ListIO +997 Dos32CreateThread2 +998 Dos16SetExtLIBPATH +999 Dos16QueryExtLIBPATH +1000 T32EXITLIST +1001 T32ALLOCPROTECTEDMEM +1002 T32ALIASMEM +1003 T32ALLOCMEM +1004 T32ALLOCSHAREDMEM +1005 T32GETNAMEDSHAREDMEM +1006 T32GETSHAREDMEM +1007 T32GIVESHAREDMEM +1008 T32FREEMEM +1009 T32SETMEM +1010 T32QUERYMEM +1011 T32QUERYMEMSTATE +1012 T32OPENVDD +1013 T32REQUESTVDD +1014 T32CLOSEVDD +1015 T32CREATETHREAD +1016 T32DYNAMICTRACE +1017 T32DEBUG +1018 T32QUERYPROCADDR +1019 T32CREATEEVENTSEM +1020 T32OPENEVENTSEM +1021 T32CLOSEEVENTSEM +1022 T32RESETEVENTSEM +1023 T32POSTEVENTSEM +1024 T32WAITEVENTSEM +1025 T32QUERYEVENTSEM +1026 T32CREATEMUTEXSEM +1027 T32OPENMUTEXSEM +1028 T32CLOSEMUTEXSEM +1029 T32REQUESTMUTEXSEM +1030 T32RELEASEMUTEXSEM +1031 T32QUERYMUTEXSEM +1032 T32CREATEMUXWAITSEM +1033 T32OPENMUXWAITSEM +1034 T32CLOSEMUXWAITSEM +1035 T32WAITMUXWAITSEM +1036 T32ADDMUXWAITSEM +1037 T32DELETEMUXWAITSEM +1038 T32QUERYMUXWAITSEM +1039 T32QUERYSYSINFO +1040 T32WAITTHREAD +1041 T32GETRESOURCE +1042 T32FREERESOURCE +1043 T32EXCEPTIONCALLBACK +1044 T32QUERYPAGEUSAGE +1045 T32FORCESYSTEMDUMP +1046 TI32ASYNCTIMER +1047 TI32STARTTIMER +1048 T32QUERYABIOSSUPPORT +1049 T32QUERYMODFROMEIP +1050 T32ALIASPERFCTRS +1051 T32CONFIGUREPERF +1052 T32DECONPERF +1053 T32REGISTERPERFCTRS +1054 T32QUERYSYSSTATE +1055 T32IREAD +1056 T32IWRITE +1057 T32TMRQUERYFREQ +1058 T32TMRQUERYTIME +1059 T32IMONREAD +1060 T32IMONWRITE +1061 T32QUERYRESOURCESIZE +1062 T32PROFILE +1063 T32SETSIGNALEXCEPTIONFOCUS +1064 T32SENDSIGNALEXCEPTION +1065 T32STARTTIMER +1066 T32STOPTIMER +1067 T32ASYNCTIMER +1068 T32INITIALIZEPORTHOLE +1069 T32QUERYHEADERINFO +1070 T32QUERYPROCTYPE +1071 T32IEXITMUSTCOMPLETE +1072 T32ICACHEMODULE +1073 T32DLLTERM +1074 T32IRAISEEXCEPTION +1075 T32ACKNOWLEDGESIGNALEXCEPTION +1076 T32QUERYDOSPROPERTY +1077 T32SETDOSPROPERTY +1078 T32SETFILELOCKS +1079 T32CANCELLOCKREQUEST +1080 T32KILLTHREAD +1081 TQUERYRASINFO +1082 T32DUMPPROCESS +1083 T32SUPPRESSPOPUPS +1084 T32IPROTECTWRITE +1085 T32PROTECTSETFILELOCKS +1086 T32IPROTECTREAD +1087 T32PMPOSTEVENTSEM +1088 T32PMWAITEVENTSEM +1089 T32PMREQUESTMUTEXSEM +1090 T32PMWAITMUXWAITSEM +1091 T32PM16SEMCHK +1092 T32ALLOCTHREADLOCALMEMORY +1093 T32FREETHREADLOCALMEMORY +1094 T32SETEXTLIBPATH +1095 T32QUERYEXTLIBPATH +1096 T32PM16SEMRST +1097 T32VERIFYPIDTID +1098 T32SYSCTL +1099 T32QUERYTHREADCONTEXT +1101 T32PERFSYSCALL +1102 T32LISTIO +1103 T32PMR3WAITEVENTSEM +1104 T32PMR3POSTEVENTSEM +1105 T32CREATETHREAD2 +1106 T32PROTECTSETFILELOCKSL +1107 T32IPROTECTSETFILEPTRL +1108 T32SETFILELOCKSL +1109 T32CANCELLOCKREQUESTL +1110 T32ISETFILEPTRL +1111 T32LISTIOL +1116 T32ISETFILEPTR +1117 T32IPROTECTSETFILEPTR +9004 Dos32CreateRamSem +9005 Dos32CloseRamSem +9006 Dos32OpenRamSem +9007 Dos32RequestRamSem +9008 Dos32ReleaseRamSem +9010 Dos32QueryProcessInfo +9011 Dos32QueryThreadInfo +9018 Dos32FindFromName + + diff --git a/os2/lib/doscalls/makefile b/os2/lib/doscalls/makefile new file mode 100644 index 00000000000..d0e2fe17f4a --- /dev/null +++ b/os2/lib/doscalls/makefile @@ -0,0 +1,39 @@ +# $Id: makefile,v 1.1 2002/03/23 19:23:28 robertk Exp $ + +PATH_TO_TOP = ../../../.. + +TARGET_TYPE = dynlink + +TARGET_NAME = doscalls + +TARGET_BASE = 0x30000000 + +TARGET_CFLAGS = -DDOSCALLS_BASE=$(TARGET_DLLBASE) + +TARGET_LFLAGS = -nostartfiles + +TARGET_SDKLIBS = ntdll.a + +TARGET_GCCLIBS = gcc + +TARGET_OBJECTS = $(TARGET_NAME).o + +TARGET_CLEAN = file/*.o vio/*.o sync/*.o mem/*.o \ + misc/*.o mou/*.o kbd/*.o run/*.o + +TARGET_DEFONLY=yes + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + + +MISC_OBJECTS = misc/doscalls.o +#SYNC_OBJECTS = + + +OBJECTS = $(MISC_OBJECTS) + +$(TARGET_NAME).o: $(OBJECTS) + $(LD) -r $(OBJECTS) -o $(TARGET_NAME).o + diff --git a/os2/lib/doscalls/misc/doscalls.c b/os2/lib/doscalls/misc/doscalls.c new file mode 100644 index 00000000000..a8543137855 --- /dev/null +++ b/os2/lib/doscalls/misc/doscalls.c @@ -0,0 +1,245 @@ +/* $ ld $ +*/ +/* + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS OS/2 sub system + * FILE: dll/doscalls.c + * PURPOSE: Kernelservices for OS/2 apps + * PROGRAMMER: Robert K. robertk@mok.lvcm.com + * REVISION HISTORY: + * 13-03-2002 Created + */ + +#include +#include "doscalls.h" + + +/* Process variables. This section conains + per process variables that are used for caching or + other stuff. */ +DWORD PROC_Pid; // contains the current processes pid. (or is it also in PEB) + + + +/* Implementation of the system calls */ +APIRET APIENTRY Dos32Sleep(ULONG msec) +{ + NTSTATUS stat; + TIME Interv; + Interv.QuadPart= -(10000 * msec); + stat = NtDelayExecution( TRUE, &Interv ); + return 0; +} + +APIRET APIENTRY Dos32CreateThread(PTID ptid, PFNTHREAD pfn, + ULONG param, ULONG flag, ULONG cbStack) +{ + return 0; +} + + +APIRET APIENTRY Dos32Open(PSZ pszFileName, PHFILE pHf, + PULONG pulAction, ULONG cbFile, + ULONG ulAttribute, ULONG fsOpenFlags, + ULONG fsOpenMode, PVOID reserved ) //ULONGPEAOP2 peaop2) +{ +/* NTAPI +ZwCreateFile( +OUT PHANDLE FileHandle, +IN ACCESS_MASK DesiredAccess, +IN POBJECT_ATTRIBUTES ObjectAttributes, +OUT PIO_STATUS_BLOCK IoStatusBlock, +IN PLARGE_INTEGER AllocationSize OPTIONAL, +IN ULONG FileAttributes, +IN ULONG ShareAccess, +IN ULONG CreateDisposition, +IN ULONG CreateOptions, +IN PVOID EaBuffer OPTIONAL, +IN ULONG EaLength +);*/ + return 0; +} + + +/* close a Handle. seems finished */ +APIRET APIENTRY Dos32Close(HFILE hFile) +{ + NTSTATUS nErrCode; + nErrCode = NtClose( (HANDLE)hFile ); + switch( nErrCode ) + { + case STATUS_SUCCESS: + return NO_ERROR; + case STATUS_INVALID_HANDLE: + return ERROR_INVALID_HANDLE; + case STATUS_HANDLE_NOT_CLOSABLE: + return ERROR_FILE_NOT_FOUND; + } + return nErrCode; +} + + + + +APIRET APIENTRY Dos32Read(HFILE hFile, PVOID pBuffer, + ULONG cbRead, PULONG pcbActual) +{ + NTSTATUS nErrCode; + IO_STATUS_BLOCK isbStatus; + // read data from file + nErrCode = NtReadFile( (HANDLE)hFile, NULL, NULL, NULL, + &isbStatus, pBuffer, cbRead, + NULL, NULL ); + // contains the # bytes actually read. + *pcbActual = isbStatus.Information; + switch(nErrCode) + { + case STATUS_INVALID_HANDLE: + return ERROR_INVALID_HANDLE; + // FIXME: complete this + } + return NO_ERROR; +} + +/* Generic write to a stream given by hFile */ +APIRET APIENTRY Dos32Write(HFILE hFile, PVOID pBuffer, + ULONG cbWrite, PULONG pcbActual) +{ + NTSTATUS nErrCode; + IO_STATUS_BLOCK StatusBlk; + nErrCode = NtWriteFile( (HANDLE)hFile, NULL, NULL, NULL, + &StatusBlk, pBuffer, cbWrite, 0, NULL ); + *pcbActual = StatusBlk.Information; + // do an errorcode translation FIXME: correct + switch(nErrCode) + { + case STATUS_SUCCESS: + case STATUS_PENDING: + case STATUS_ACCESS_DENIED: + case STATUS_INVALID_HANDLE: + case STATUS_FILE_LOCK_CONFLICT: + return 0; + } + return 0; +} + + + +/*******************************************/ +/* DosDevIOCtl performs control functions */ +/* on a device specified by an opened */ +/* device handle. */ +/*******************************************/ +/*HFILE hDevice; Device handle returned by DosOpen, or a standard (open) device handle. */ +/*ULONG category; Device category. */ +/*ULONG function; Device-specific function code. */ +/*PVOID pParams; Address of the command-specific argument list. */ +/*ULONG cbParmLenMax; Length, in bytes, of pParams. */ +/*PULONG pcbParmLen; Pointer to the length of parameters. */ +/*PVOID pData; Address of the data area. */ +/*ULONG cbDataLenMax; Length, in bytes, of pData. */ +/*PULONG pcbDataLen; Pointer to the length of data. */ +/*APIRET ulrc; Return Code. + + ulrc (APIRET) - returns + Return Code. + + DosDevIOCtl returns one of the following values: + + 0 NO_ERROR + 1 ERROR_INVALID_FUNCTION + 6 ERROR_INVALID_HANDLE + 15 ERROR_INVALID_DRIVE + 31 ERROR_GEN_FAILURE + 87 ERROR_INVALID_PARAMETER + 111 ERROR_BUFFER_OVERFLOW + 115 ERROR_PROTECTION_VIOLATION + 117 ERROR_INVALID_CATEGORY + 119 ERROR_BAD_DRIVER_LEVEL + 163 ERROR_UNCERTAIN_MEDIA + 165 ERROR_MONITORS_NOT_SUPPORTED + +*/ +APIRET APIENTRY Dos32DevIOCtl(HFILE hDevice, ULONG category, ULONG function, + PVOID pParams,ULONG cbParmLenMax,PULONG pcbParmLen, + PVOID pData,ULONG cbDataLenMax,PULONG pcbDataLen) +{ + return 0; +} + + + +APIRET APIENTRY Dos32Beep(ULONG freq, ULONG dur) +{ + if( freq<0x25 || freq>0x7FFF ) + return 395; // ERROR_INVALID_FREQUENCY + + /* HANDLE hBeep; + BEEP_SET_PARAMETERS BeepSetParameters; + DWORD dwReturned; + + hBeep = Dos32Open("\\\\.\\Beep", + FILE_GENERIC_READ | FILE_GENERIC_WRITE, + 0, + NULL, + OPEN_EXISTING, + 0, + NULL); + if (hBeep == INVALID_HANDLE_VALUE) + return FALSE; +*/ + // Set beep data + /* BeepSetParameters.Frequency = dwFreq; + BeepSetParameters.Duration = dwDuration; + + DeviceIoControl(hBeep, + IOCTL_BEEP_SET, + &BeepSetParameters, + sizeof(BEEP_SET_PARAMETERS), + NULL, + 0, + &dwReturned, + NULL); + + CloseHandle (hBeep); + + return TRUE; +*/ + + + + return 0; +} + +/* Terminates the current thread or the current Process. + Decission is made by action + FIXME: move this code to OS2.EXE */ +VOID APIENTRY Dos32Exit(ULONG action, ULONG result) +{ + // decide what to do + if( action == EXIT_THREAD) + { + NtTerminateThread( NULL, result ); + } + else // EXIT_PROCESS + { + NtTerminateProcess( NULL, result ); + } +} + + + +BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) +{ + switch (ul_reason_for_call) + { + case 1://DLL_PROCESS_ATTACH: + case 2://DLL_THREAD_ATTACH: + case 3://DLL_THREAD_DETACH: + case 0://DLL_PROCESS_DETACH: + break; + } + return TRUE; +} + diff --git a/os2/lib/doscalls/misc/doscalls.h b/os2/lib/doscalls/misc/doscalls.h new file mode 100644 index 00000000000..3873c141c03 --- /dev/null +++ b/os2/lib/doscalls/misc/doscalls.h @@ -0,0 +1,84 @@ +/* $ $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS OS/2 sub system + * FILE: dll/doscalls.h + * PURPOSE: Kernelservices for OS/2 apps + * PROGRAMMER: Robert K. robertk@mok.lvcm.com + * REVISION HISTORY: + * 13-03-2002 Created + */ + + + +#include "os2def.h" + + +// FIXME: use ib headers +#define EXIT_THREAD 0 +#define EXIT_PROCESS 1 +#define NO_ERROR 0 +#define ERROR_INVALID_HANDLE 5 +#define ERROR_FILE_NOT_FOUND 6 +// for this + +// Give the user nicer names that the internal ones +#define DosSleep Dos32Sleep +#define DosCreateThread Dos32CreateThread +#define DosOpen Dos32Open +#define DosClose Dos32Close +#define DosRead Dos32Read +#define DosWrite Dos32Write +#define DosBeep Dos32Beep +#define DosExit Dos32Exit + + +APIRET APIENTRY Dos32Sleep(ULONG msec); + +APIRET APIENTRY Dos32CreateThread(PTID ptid, + PFNTHREAD pfn, + ULONG param, + ULONG flag, + ULONG cbStack); + +APIRET APIENTRY Dos32Open(PSZ pszFileName, + PHFILE pHf, + PULONG pulAction, + ULONG cbFile, + ULONG ulAttribute, + ULONG fsOpenFlags, + ULONG fsOpenMode, + PVOID reserved ); //ULONGPEAOP2 peaop2) + +APIRET APIENTRY Dos32Close(HFILE hFile); + +APIRET APIENTRY Dos32Read(HFILE hFile, + PVOID pBuffer, + ULONG cbRead, + PULONG pcbActual); + +APIRET APIENTRY Dos32Write(HFILE hFile, + PVOID pBuffer, + ULONG cbWrite, + PULONG pcbActual); + +APIRET APIENTRY Dos32DevIOCtl(HFILE hDevice, ULONG category, ULONG function, + PVOID pParams,ULONG cbParmLenMax,PULONG pcbParmLen, + PVOID pData,ULONG cbDataLenMax,PULONG pcbDataLen); + + +APIRET APIENTRY Dos32Beep(ULONG freq, + ULONG dur); + +VOID APIENTRY Dos32Exit(ULONG action, + ULONG result); + + + + + + + + + + diff --git a/os2/lib/doscalls/misc/errorcodes.c b/os2/lib/doscalls/misc/errorcodes.c new file mode 100644 index 00000000000..fdad2c53da3 --- /dev/null +++ b/os2/lib/doscalls/misc/errorcodes.c @@ -0,0 +1,287 @@ +/* $ld$ +*/ + +/* some header*/ + +#include +#include + +/* This file defines a big array of #defines that are + used to translate OS/2 errorcodes to ntdll error codes. */ + +/* OS/2 to NTDLL error mapping */ +#define NO_ERROR STATUS_SUCCESS +#define ERROR_INVALID_FUNCTION STATUS_ILLEGAL_FUNCTION +#define ERROR_FILE_NOT_FOUND 2 /* MSG%FILE_NOT_FOUND */ +#define ERROR_PATH_NOT_FOUND 3 /* MSG%PATH_NOT_FOUND */ +#define ERROR_TOO_MANY_OPEN_FILES 4 /* MSG%OUT_OF_HANDLES */ +#define ERROR_ACCESS_DENIED 5 /* MSG%ACCESS_DENIED */ +#define ERROR_INVALID_HANDLE 6 /* MSG%INVALID_HANDLE */ +#define ERROR_ARENA_TRASHED 7 /* MSG%MEMORY_BLOCKS_BAD */ +#define ERROR_NOT_ENOUGH_MEMORY 8 /* MSG%NO_MEMORY */ +#define ERROR_INVALID_BLOCK 9 /* MSG%INVALID_MEM_ADDR */ +#define ERROR_BAD_ENVIRONMENT 10 /* MSG%INVALID_ENVIRON */ +#define ERROR_BAD_FORMAT 11 /* MSG%INVALID_FORMAT */ +#define ERROR_INVALID_ACCESS 12 /* MSG%INVALID_ACC_CODE */ +#define ERROR_INVALID_DATA 13 /* MSG%INVALID_DATA */ +#define ERROR_INVALID_DRIVE 15 /* MSG%INVALID_DRIVE */ +#define ERROR_CURRENT_DIRECTORY 16 /* MSG%ATT_RD_CURDIR */ +#define ERROR_NOT_SAME_DEVICE 17 /* MSG%NOT_SAME_DEVICE */ +#define ERROR_NO_MORE_FILES 18 /* MSG%NO_MORE_FILES */ +#define ERROR_WRITE_PROTECT 19 /* MSG%ATT_WRITE_PROT */ +#define ERROR_BAD_UNIT 20 /* MSG%UNKNOWN_UNIT */ +#define ERROR_NOT_READY 21 /* MSG%DRIVE_NOT_READY */ +#define ERROR_BAD_COMMAND 22 /* MSG%UNKNOWN_COMMAND */ +#define ERROR_CRC 23 /* MSG%DATA_ERROR */ +#define ERROR_BAD_LENGTH 24 /* MSG%BAD_REQ_STRUCTURE */ +#define ERROR_SEEK 25 /* MSG%SEEK_ERROR */ +#define ERROR_NOT_DOS_DISK 26 /* MSG%UNKNOWN_MEDIA */ +#define ERROR_SECTOR_NOT_FOUND 27 /* MSG%SECTOR_NOT_FOUND */ +#define ERROR_OUT_OF_PAPER 28 /* MSG%OUT_OF_PAPER */ +#define ERROR_WRITE_FAULT 29 /* MSG%WRITE_FAULT */ +#define ERROR_READ_FAULT 30 /* MSG%READ_FAULT */ +#define ERROR_GEN_FAILURE 31 /* MSG%GENERAL_FAILURE */ +#define ERROR_SHARING_VIOLATION 32 /* MSG%SHARING_VIOLATION */ +/* 32%msg%SHAR_VIOLAT_FIND */ +#define ERROR_LOCK_VIOLATION 33 /* MSG%LOCK_VIOLATION */ +#define ERROR_WRONG_DISK 34 /* MSG%INVALID_DISK_CHANGE */ +#define ERROR_FCB_UNAVAILABLE 35 /* MSG%35 */ +#define ERROR_SHARING_BUFFER_EXCEEDED 36 /* MSG%SHARING_BUFF_OFLOW */ +#define ERROR_CODE_PAGE_MISMATCHED 37 /* MSG%ERROR_WRITE_PROTECT */ +#define ERROR_HANDLE_EOF 38 /* MSG%ERROR_BAD_UNIT */ +#define ERROR_HANDLE_DISK_FULL 39 /* MSG%ERROR_NOT_READY */ +/* 40%msg%ERROR_BAD_COMMAND */ +/* 41%msg%ERROR_CRC */ +/* 42%msg%ERROR_BAD_LENGTH */ +/* 43%msg%ERROR_SEEK */ +/* 44%msg%ERROR_NOT_DOS_DISK */ +/* 45%msg%ERROR_SECTOR_NOT_FOUND */ +/* 46%msg%ERROR_OUT_OF_PAPER */ +/* 47%msg%ERROR_WRITE_FAULT */ +/* 48%msg%ERROR_READ_FAULT */ +/* 49%msg%ERROR_GEN_FAILURE */ +#define ERROR_NOT_SUPPORTED 50 /* MSG%NET_REQ_NOT_SUPPORT */ +#define ERROR_REM_NOT_LIST 51 /* MSG%NET_REMOTE_NOT_ONLINE */ +#define ERROR_DUP_NAME 52 /* MSG%NET_DUP_FILENAME */ +#define ERROR_BAD_NETPATH 53 /* MSG%NET_PATH_NOT_FOUND */ +#define ERROR_NETWORK_BUSY 54 /* MSG%NET_BUSY */ +#define ERROR_DEV_NOT_EXIST 55 /* MSG%NET_DEV_NOT_INSTALLED */ +#define ERROR_TOO_MANY_CMDS 56 /* MSG%NET_BIOS_LIMIT_REACHED */ +#define ERROR_ADAP_HDW_ERR 57 /* MSG%NET_ADAPT_HRDW_ERROR */ +#define ERROR_BAD_NET_RESP 58 /* MSG%NET_INCORRECT_RESPONSE */ +#define ERROR_UNEXP_NET_ERR 59 /* MSG%NET_UNEXPECT_ERROR */ +#define ERROR_BAD_REM_ADAP 60 /* MSG%NET_REMOT_ADPT_INCOMP */ +#define ERROR_PRINTQ_FULL 61 /* MSG%NET_PRINT_Q_FULL */ +#define ERROR_NO_SPOOL_SPACE 62 /* MSG%NET_NO_SPACE_TO_PRINT_FL */ +#define ERROR_PRINT_CANCELLED 63 /* MSG%NET_PRINT_FILE_DELETED */ +#define ERROR_NETNAME_DELETED 64 /* MSG%NET_NAME_DELETED */ +#define ERROR_NETWORK_ACCESS_DENIED 65 /* MSG%NET_ACCESS_DENIED */ +#define ERROR_BAD_DEV_TYPE 66 /* MSG%NET_DEV_TYPE_INVALID */ +#define ERROR_BAD_NET_NAME 67 /* MSG%NET_NAME_NOT_FOUND */ +#define ERROR_TOO_MANY_NAMES 68 /* MSG%NET_NAME_LIMIT_EXCEED */ +#define ERROR_TOO_MANY_SESS 69 /* MSG%NET_BIOS_LIMIT_EXCEED */ +#define ERROR_SHARING_PAUSED 70 /* MSG%NET_TEMP_PAUSED */ +#define ERROR_REQ_NOT_ACCEP 71 /* MSG%NET_REQUEST_DENIED */ +#define ERROR_REDIR_PAUSED 72 /* MSG%NET_PRT_DSK_REDIR_PAUSE */ +#define ERROR_SBCS_ATT_WRITE_PROT 73 /* Attempted write on protected disk */ +#define ERROR_SBCS_GENERAL_FAILURE 74 /* General failure */ +#define ERROR_XGA_OUT_MEMORY 75 /* MSG%XGA_OUT_MEMORY */ +#define ERROR_FILE_EXISTS 80 /* MSG%FILE_EXISTS */ +#define ERROR_DUP_FCB 81 /* MSG%none */ +#define ERROR_CANNOT_MAKE 82 /* MSG%CANNOT_MAKE */ +#define ERROR_FAIL_I24 83 /* MSG%NET_FAIL_INT_TWO_FOUR */ +#define ERROR_OUT_OF_STRUCTURES 84 /* MSG%NET_TOO_MANY_REDIRECT */ +#define ERROR_ALREADY_ASSIGNED 85 /* MSG%NET_DUP_REDIRECTION */ +#define ERROR_INVALID_PASSWORD 86 /* MSG%NET_INVALID_PASSWORD */ +#define ERROR_INVALID_PARAMETER 87 /* MSG%NET_INCORR_PARAMETER */ +#define ERROR_NET_WRITE_FAULT 88 /* MSG%NET_DATA_FAULT */ +#define ERROR_NO_PROC_SLOTS 89 /* MSG%NO_PROC_SLOTS */ +#define ERROR_NOT_FROZEN 90 /* MSG%none */ +#define ERROR_SYS_COMP_NOT_LOADED ERROR_NOT_FROZEN +#define ERR_TSTOVFL 91 /* MSG%none */ +#define ERR_TSTDUP 92 /* MSG%none */ +#define ERROR_NO_ITEMS 93 /* MSG%none */ +#define ERROR_INTERRUPT 95 /* MSG%none */ +#define ERROR_DEVICE_IN_USE 99 /* MSG%DEVICE_IN_USE */ +#define ERROR_TOO_MANY_SEMAPHORES 100 /* MSG%TOO_MANY_SEMAPHORES */ +#define ERROR_EXCL_SEM_ALREADY_OWNED 101 /* MSG%EXCL_SEM_ALREADY_OWNED */ +#define ERROR_SEM_IS_SET 102 /* MSG%SEM_IS_SET */ +#define ERROR_TOO_MANY_SEM_REQUESTS 103 /* MSG%TOO_MANY_SEM_REQUESTS */ +#define ERROR_INVALID_AT_INTERRUPT_TIME 104 /* MSG%INVALID_AT_INTERRUPT_TIME */ +#define ERROR_SEM_OWNER_DIED 105 /* MSG%SEM_OWNER_DIED */ +#define ERROR_SEM_USER_LIMIT 106 /* MSG%ERROR_DISK_CHANGE */ +#define ERROR_DISK_CHANGE 107 /* MSG%DISK_CHANGE */ +#define ERROR_DRIVE_LOCKED 108 /* MSG%DRIVE_LOCKED */ +#define ERROR_BROKEN_PIPE 109 /* MSG%BROKEN_PIPE */ +#define ERROR_OPEN_FAILED 110 /* MSG%ERROR_OPEN_FAILED */ +#define ERROR_BUFFER_OVERFLOW 111 /* MSG%ERROR_FILENAME_LONG */ +#define ERROR_DISK_FULL 112 /* MSG%DISK_FULL */ +#define ERROR_NO_MORE_SEARCH_HANDLES 113 /* MSG%NO_SEARCH_HANDLES */ +#define ERROR_INVALID_TARGET_HANDLE 114 /* MSG%ERR_INV_TAR_HANDLE */ +#define ERROR_PROTECTION_VIOLATION 115 /* MSG%none */ +#define ERROR_VIOKBD_REQUEST 116 /* MSG%none */ +#define ERROR_INVALID_CATEGORY 117 /* MSG%INVALID_CATEGORY */ +#define ERROR_INVALID_VERIFY_SWITCH 118 /* MSG%INVALID_VERIFY_SWITCH */ +#define ERROR_BAD_DRIVER_LEVEL 119 /* MSG%BAD_DRIVER_LEVEL */ +#define ERROR_CALL_NOT_IMPLEMENTED 120 /* MSG%BAD_DYNALINK */ +#define ERROR_SEM_TIMEOUT 121 /* MSG%SEM_TIMEOUT */ +#define ERROR_INSUFFICIENT_BUFFER 122 /* MSG%INSUFFICIENT_BUFFER */ +#define ERROR_INVALID_NAME 123 /* MSG%INVALID_NAME */ +/* 123%msg%HPFS_INVALID_VOLUME_CHAR */ +#define ERROR_INVALID_LEVEL 124 /* MSG%INVALID_LEVEL */ +#define ERROR_NO_VOLUME_LABEL 125 /* MSG%NO_VOLUME_LABEL */ +#define ERROR_MOD_NOT_FOUND 126 /* MSG%MOD_NOT_FOUND */ +#define ERROR_PROC_NOT_FOUND 127 /* MSG%PROC_NOT_FOUND */ +#define ERROR_WAIT_NO_CHILDREN 128 /* MSG%none */ +#define ERROR_CHILD_NOT_COMPLETE 129 /* MSG%PROT_MODE_ONLY */ +#define ERROR_DIRECT_ACCESS_HANDLE 130 /* MSG%APPL_SINGLEFRAMECHAR */ +#define ERROR_NEGATIVE_SEEK 131 /* MSG%APPL_DOUBLEFRAMECHAR */ +#define ERROR_SEEK_ON_DEVICE 132 /* MSG%APPL_ARROWCHAR */ +#define ERROR_IS_JOIN_TARGET 133 /* MSG%JOIN_ON_DRIV_IS_TAR */ +#define ERROR_IS_JOINED 134 /* MSG%JOIN_DRIVE_IS */ +#define ERROR_IS_SUBSTED 135 /* MSG%SUB_DRIVE_IS */ +#define ERROR_NOT_JOINED 136 /* MSG%DRIVE_IS_NOT_JOINED */ +#define ERROR_NOT_SUBSTED 137 /* MSG%DRIVE_NOT_SUBSTED */ +#define ERROR_JOIN_TO_JOIN 138 /* MSG%JOIN_CANNOT_JOIN_DRIVE */ +#define ERROR_SUBST_TO_SUBST 139 /* MSG%SUB_CANNOT_SUBST_DRIVE */ +#define ERROR_JOIN_TO_SUBST 140 /* MSG%JOIN_CANNOT_SUB_DRIVE */ +#define ERROR_SUBST_TO_JOIN 141 /* MSG%SUB_CANNOT_JOIN_DRIVE */ +#define ERROR_BUSY_DRIVE 142 /* MSG%DRIVE_IS_BUSY */ +#define ERROR_SAME_DRIVE 143 /* MSG%JOIN_SUB_SAME_DRIVE */ +#define ERROR_DIR_NOT_ROOT 144 /* MSG%DIRECT_IS_NOT_SUBDIR */ +#define ERROR_DIR_NOT_EMPTY 145 /* MSG%DIRECT_IS_NOT_EMPTY */ +#define ERROR_IS_SUBST_PATH 146 /* MSG%PATH_USED_SUBST_JOIN */ +#define ERROR_IS_JOIN_PATH 147 /* MSG%NO_NEEDED_RESOURCES */ +#define ERROR_PATH_BUSY 148 /* MSG%PATH_BUSY */ +#define ERROR_IS_SUBST_TARGET 149 /* MSG%SUB_ON_DRIVE_IS_JOIN */ +#define ERROR_SYSTEM_TRACE 150 /* MSG%SYSTEM_TRACE */ +#define ERROR_INVALID_EVENT_COUNT 151 /* MSG%INVALID_EVENT_COUNT */ +#define ERROR_TOO_MANY_MUXWAITERS 152 /* MSG%TOO_MANY_MUXWAITERS */ +#define ERROR_INVALID_LIST_FORMAT 153 /* MSG%INVALID_LIST_FORMAT */ +#define ERROR_LABEL_TOO_LONG 154 /* MSG%VOLUME_TOO_LONG */ +/* 154%msg%HPFS_VOL_LABEL_LONG */ +#define ERROR_TOO_MANY_TCBS 155 /* MSG%TOO_MANY_TCBS */ +#define ERROR_SIGNAL_REFUSED 156 /* MSG%SIGNAL_REFUSED */ +#define ERROR_DISCARDED 157 /* MSG%DISCARDED */ +#define ERROR_NOT_LOCKED 158 /* MSG%NOT_LOCKED */ +#define ERROR_BAD_THREADID_ADDR 159 /* MSG%BAD_THREADID_ADDR */ +#define ERROR_BAD_ARGUMENTS 160 /* MSG%BAD_ARGUMENTS */ +#define ERROR_BAD_PATHNAME 161 /* MSG%none */ +#define ERROR_SIGNAL_PENDING 162 /* MSG%SIGNAL_PENDING */ +#define ERROR_UNCERTAIN_MEDIA 163 /* MSG%none */ +#define ERROR_MAX_THRDS_REACHED 164 /* MSG%MAX_THRDS_REACHED */ +#define ERROR_MONITORS_NOT_SUPPORTED 165 /* MSG%none */ +#define ERROR_UNC_DRIVER_NOT_INSTALLED 166 /* MSG%UNC_DRIVER_NOT_INSTALLED */ +#define ERROR_LOCK_FAILED 167 /* MSG%LOCK_FAILED */ +#define ERROR_SWAPIO_FAILED 168 /* MSG%SWAPIO_FAILED */ +#define ERROR_SWAPIN_FAILED 169 /* MSG%SWAPIN_ATTEMPT_FAILED */ +#define ERROR_BUSY 170 /* MSG%SEGMENT_BUSY */ +/* 171%msg%INT_TOO_LONG */ +#define ERROR_CANCEL_VIOLATION 173 /* MSG%UNLOCK_VIOLATION */ +#define ERROR_ATOMIC_LOCK_NOT_SUPPORTED 174 /* MSG%none */ +#define ERROR_READ_LOCKS_NOT_SUPPORTED 175 /* MSG%none */ +#define ERROR_INVALID_SEGMENT_NUMBER 180 /* MSG%INVALID_SEGMENT_NUM */ +#define ERROR_INVALID_CALLGATE 181 /* MSG%none */ +#define ERROR_INVALID_ORDINAL 182 /* MSG%INVALID_ORDINAL */ +#define ERROR_ALREADY_EXISTS 183 /* MSG%none */ +#define ERROR_NO_CHILD_PROCESS 184 /* MSG%none */ +#define ERROR_CHILD_ALIVE_NOWAIT 185 /* MSG%none */ +#define ERROR_INVALID_FLAG_NUMBER 186 /* MSG%INVALID_FLAG_NUMBER */ +#define ERROR_SEM_NOT_FOUND 187 /* MSG%SEM_NOT_FOUND */ +#define ERROR_INVALID_STARTING_CODESEG 188 /* MSG%INVALID_STARTING_CODESEG */ +#define ERROR_INVALID_STACKSEG 189 /* MSG%INVALID_STACKSEG */ +#define ERROR_INVALID_MODULETYPE 190 /* MSG%INVALID_MODULETYPE */ +#define ERROR_INVALID_EXE_SIGNATURE 191 /* MSG%INVALID_EXE_SIGNATURE */ +#define ERROR_EXE_MARKED_INVALID 192 /* MSG%EXE_MARKED_INVALID */ +#define ERROR_BAD_EXE_FORMAT 193 /* MSG%BAD_EXE_FORMAT */ +#define ERROR_ITERATED_DATA_EXCEEDS_64k 194 /* MSG%ITERATED_DATA_EXCEEDS_64K */ +#define ERROR_INVALID_MINALLOCSIZE 195 /* MSG%INVALID_MINALLOCSIZE */ +#define ERROR_DYNLINK_FROM_INVALID_RING 196 /* MSG%DYNLINK_FROM_INVALID_RING */ +#define ERROR_IOPL_NOT_ENABLED 197 /* MSG%IOPL_NOT_ENABLED */ +#define ERROR_INVALID_SEGDPL 198 /* MSG%INVALID_SEGDPL */ +#define ERROR_AUTODATASEG_EXCEEDS_64k 199 /* MSG%AUTODATASEG_EXCEEDS_64K */ +#define ERROR_RING2SEG_MUST_BE_MOVABLE 200 /* MSG%CODESEG_CANNOT_BE_64K */ +#define ERROR_RELOC_CHAIN_XEEDS_SEGLIM 201 /* MSG%RELOC_CHAIN_XEEDS_SEGMENT */ +#define ERROR_INFLOOP_IN_RELOC_CHAIN 202 /* MSG%INFLOOP_IN_RELOC_CHAIN */ +#define ERROR_ENVVAR_NOT_FOUND 203 /* MSG%ENVVAR_NOT_FOUND */ +#define ERROR_NOT_CURRENT_CTRY 204 /* MSG%none */ +#define ERROR_NO_SIGNAL_SENT 205 /* MSG%SIGNAL_NOT_SENT */ +#define ERROR_FILENAME_EXCED_RANGE 206 /* MSG%NAME_TOO_LONG */ +#define ERROR_RING2_STACK_IN_USE 207 /* MSG%RING2_STACK_IN_USE */ +#define ERROR_META_EXPANSION_TOO_LONG 208 /* MSG%WILD_CARD_NAME */ +#define ERROR_INVALID_SIGNAL_NUMBER 209 /* MSG%INVALID_SIGNAL_NUMBER */ +#define ERROR_THREAD_1_INACTIVE 210 /* MSG%THREAD_1_INACTIVE */ +#define ERROR_INFO_NOT_AVAIL 211 /* MSG%none */ +#define ERROR_LOCKED 212 /* MSG%LOCKED */ +#define ERROR_BAD_DYNALINK 213 /* MSG%none */ +#define ERROR_TOO_MANY_MODULES 214 /* MSG%TOO_MANY_MODULES */ +#define ERROR_NESTING_NOT_ALLOWED 215 /* MSG%none */ +#define ERROR_CANNOT_SHRINK 216 /* MSG%CANNOT_SHRINK */ +#define ERROR_ZOMBIE_PROCESS 217 /* MSG%none */ +#define ERROR_STACK_IN_HIGH_MEMORY 218 /* MSG%none */ +#define ERROR_INVALID_EXITROUTINE_RING 219 /* MSG%INVALID_EXITROUTINE_RING */ +#define ERROR_GETBUF_FAILED 220 /* MSG%none */ +#define ERROR_FLUSHBUF_FAILED 221 /* MSG%none */ +#define ERROR_TRANSFER_TOO_LONG 222 /* MSG%none */ +#define ERROR_FORCENOSWAP_FAILED 223 /* MSG%none */ +#define ERROR_SMG_NO_TARGET_WINDOW 224 /* PM ID can't be selected */ +#define ERROR_NO_CHILDREN 228 /* MSG%NO_CHILDREN */ +#define ERROR_INVALID_SCREEN_GROUP 229 /* MSG%none */ +#define ERROR_BAD_PIPE 230 /* MSG%ERROR_BAD_PIPE */ +#define ERROR_PIPE_BUSY 231 /* MSG%ERROR_PIPE_BUSY */ +#define ERROR_NO_DATA 232 /* MSG%ERROR_NO_DATA */ +#define ERROR_PIPE_NOT_CONNECTED 233 /* MSG%ERROR_PIPE_NOT_CONNECTED */ +#define ERROR_MORE_DATA 234 /* MSG%ERROR_MORE_DATA */ +#define ERROR_VC_DISCONNECTED 240 /* MSG%ERROR_VC_DISCONNECTED */ +#define ERROR_CIRCULARITY_REQUESTED 250 /* MSG%CIRCULARITY_REQUESTED */ +#define ERROR_DIRECTORY_IN_CDS 251 /* MSG%DIRECTORY_IN_CDS */ +#define ERROR_INVALID_FSD_NAME 252 /* MSG%INVALID_FSD_NAME */ +#define ERROR_INVALID_PATH 253 /* MSG%INVALID_PATH */ +#define ERROR_INVALID_EA_NAME 254 /* MSG%INVALID_EA_NAME */ +#define ERROR_EA_LIST_INCONSISTENT 255 /* MSG%EA_LIST_INCONSISTENT */ +#define ERROR_EA_LIST_TOO_LONG 256 /* MSG%EA_LIST_TOO_LONG */ +#define ERROR_NO_META_MATCH 257 /* MSG%NO_META_MATCH */ +#define ERROR_FINDNOTIFY_TIMEOUT 258 /* MSG%FINDNOTIFY_TIMEOUT */ +#define ERROR_NO_MORE_ITEMS 259 /* MSG%NO_MORE_ITEMS */ +#define ERROR_SEARCH_STRUC_REUSED 260 /* MSG%SEARCH_STRUC_REUSED */ +#define ERROR_CHAR_NOT_FOUND 261 /* MSG%CHAR_NOT_FOUND */ +#define ERROR_TOO_MUCH_STACK 262 /* MSG%TOO_MUCH_STACK */ +#define ERROR_INVALID_ATTR 263 /* MSG%INVALID_ATTR */ +#define ERROR_INVALID_STARTING_RING 264 /* MSG%INVALID_STARTING_RING */ +#define ERROR_INVALID_DLL_INIT_RING 265 /* MSG%INVALID_DLL_INIT_RING */ +#define ERROR_CANNOT_COPY 266 /* MSG%CANNOT_COPY */ +#define ERROR_DIRECTORY 267 /* MSG%DIRECTORY */ +#define ERROR_OPLOCKED_FILE 268 /* MSG%OPLOCKED_FILE */ +#define ERROR_OPLOCK_THREAD_EXISTS 269 /* MSG%OPLOCK_THREAD_EXISTS */ +#define ERROR_VOLUME_CHANGED 270 /* MSG%none */ +#define ERROR_FINDNOTIFY_HANDLE_IN_USE 271 /* MSG%none */ +#define ERROR_FINDNOTIFY_HANDLE_CLOSED 272 /* MSG%none */ +#define ERROR_NOTIFY_OBJECT_REMOVED 273 /* MSG%none */ +#define ERROR_ALREADY_SHUTDOWN 274 /* MSG%none */ +#define ERROR_EAS_DIDNT_FIT 275 /* MSG%none */ +#define ERROR_EA_FILE_CORRUPT 276 /* MSG%ERROR_EAS_CORRUPT */ +#define ERROR_EA_TABLE_FULL 277 /* MSG%EA_TABLE_FULL */ +#define ERROR_INVALID_EA_HANDLE 278 /* MSG%INVALID_EA_HANDLE */ +#define ERROR_NO_CLUSTER 279 /* MSG%NO_CLUSTER */ +#define ERROR_CREATE_EA_FILE 280 /* MSG%ERROR_CREATE_EA_FILE */ +#define ERROR_CANNOT_OPEN_EA_FILE 281 /* MSG%CANNOT_OPEN_FILE */ +#define ERROR_EAS_NOT_SUPPORTED 282 /* MSG%EAS_NOT_SUPPORTED */ +#define ERROR_NEED_EAS_FOUND 283 /* MSG%NEED_EAS_FOUND */ +#define ERROR_DUPLICATE_HANDLE 284 /* MSG%EAS_DISCARDED */ +#define ERROR_DUPLICATE_NAME 285 /* MSG%DUPLICATE_SEM_NAME */ +#define ERROR_EMPTY_MUXWAIT 286 /* MSG%EMPTY_MUXWAIT_SEM */ +#define ERROR_MUTEX_OWNED 287 /* MSG%MUTEX_SEM_OWNED */ +#define ERROR_NOT_OWNER 288 /* MSG%NOT_MUTEX_SEM_OWNER */ +#define ERROR_PARAM_TOO_SMALL 289 /* MSG%QUERY_MUX_PARAM_TOO_SMALL */ +#define ERROR_TOO_MANY_HANDLES 290 /* MSG%TOO_MANY_SEM_HANDLES */ +#define ERROR_TOO_MANY_OPENS 291 /* MSG%TOO_MANY_SEM_OPENS */ +#define ERROR_WRONG_TYPE 292 /* MSG%SEM_WRONG_TYPE */ +#define ERROR_UNUSED_CODE 293 /* MSG%none */ +#define ERROR_THREAD_NOT_TERMINATED 294 /* MSG%none */ +#define ERROR_INIT_ROUTINE_FAILED 295 /* MSG%none */ +#define ERROR_MODULE_IN_USE 296 /* MSG%none */ +#define ERROR_NOT_ENOUGH_WATCHPOINTS 297 /* MSG%none */ +#define ERROR_TOO_MANY_POSTS 298 /* MSG%TOO_MANY_EVENT_SEM_POSTS */ +#define ERROR_ALREADY_POSTED 299 /* MSG%EVENT_SEM_ALREADY_POSTED */ +#define ERROR_ALREADY_RESET 300 /* MSG%EVENT_SEM_ALREADY_RESET */ +#define ERROR_SEM_BUSY 301 /* MSG%SEM_BUSY */ \ No newline at end of file diff --git a/os2/lib/doscalls/misc/os2def.h b/os2/lib/doscalls/misc/os2def.h new file mode 100644 index 00000000000..c29fc22a407 --- /dev/null +++ b/os2/lib/doscalls/misc/os2def.h @@ -0,0 +1,53 @@ +/* This file conains common OS/2 types that are needed to build this dll */ +/* this file should have temporal character until a better idea is born */ + +#ifndef __OS2DEF__ +#define __OS2DEF__ + +typedef unsigned long APIRET; +#define APIENTRY +typedef char *PSZ; +typedef char *NPSZ; +typedef char *NPCH; +#define VOID void +// + +/* define these types only when ntdll is not included */ +#if( !defined( __INCLUDE_NTDEF_H )) + #define CHAR char + #define SHORT short + #define LONG long + typedef char BYTE; + typedef unsigned char UCHAR; + typedef unsigned short USHORT; + typedef unsigned long ULONG; + + typedef CHAR *PCHAR; + typedef SHORT *PSHORT; + typedef LONG *PLONG; + typedef UCHAR *PUCHAR; + typedef USHORT *PUSHORT; + typedef ULONG *PULONG; + typedef VOID *PVOID; +#endif + + +//typedef char *PCH; +//typedef const char *PCSZ; + + +typedef unsigned long LHANDLE; +typedef LHANDLE HMODULE; /* hmod */ +typedef LHANDLE PID; /* pid */ +typedef LHANDLE TID; /* tid */ +typedef LHANDLE HFILE; +typedef HFILE *PHFILE; +typedef HMODULE *PHMODULE; +typedef PID *PPID; +typedef TID *PTID; + +typedef VOID APIENTRY FNTHREAD(ULONG); +typedef FNTHREAD *PFNTHREAD; + + +#endif //__OS2DEF__ \ No newline at end of file diff --git a/os2/lib/doscalls/run/process.cpp b/os2/lib/doscalls/run/process.cpp new file mode 100644 index 00000000000..744fe8d8e66 --- /dev/null +++ b/os2/lib/doscalls/run/process.cpp @@ -0,0 +1,17 @@ + +/* Terminates the current thread or the current Process. + Decission is made by action + FIXME: move this code to OS2.EXE */ +VOID APIENTRY Dos32Exit(ULONG action, ULONG result) +{ + // decide what to do + if( action == EXIT_THREAD) + { + NtTerminateThread( NULL, result ); + } + else // EXIT_PROCESS + { + NtTerminateProcess( NULL, result ); + } +} + diff --git a/os2/server/makefile b/os2/server/makefile new file mode 100644 index 00000000000..87a600d2079 --- /dev/null +++ b/os2/server/makefile @@ -0,0 +1,29 @@ +# $Id: makefile,v 1.1 2002/03/23 19:23:28 robertk Exp $ + +PATH_TO_TOP = ../../.. + +TARGET_TYPE = program + +TARGET_APPTYPE = native + +TARGET_NAME = os2ss + +TARGET_INSTALLDIR = system32 + +TARGET_CFLAGS = -D__NTAPP__ + +#OBJECTS_API = + +OBJECTS_MISC = \ + $(TARGET_NAME).o + +TARGET_OBJECTS = \ + $(OBJECTS_API) +# \ +# $(OBJECTS_MISC) + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF diff --git a/os2/server/os2ss.cpp b/os2/server/os2ss.cpp new file mode 100644 index 00000000000..2ab2050df9c --- /dev/null +++ b/os2/server/os2ss.cpp @@ -0,0 +1,115 @@ +/* $Id: os2ss.cpp,v 1.1 2002/03/23 19:23:28 robertk Exp $ + * + * reactos/subsys/csrss/api/process.c + * + * "\windows\ApiPort" port process management functions + * + * ReactOS Operating System + */ + // TODO: Rewrite the whole file. This is just a copy + +#include +#include + + +/* server variables */ + +int NumProcesses; + + + +/* Native image's entry point */ + +void NtProcessStartup (PPEB Peb) +{ + PRTL_USER_PROCESS_PARAMETERS ProcParams; + PWSTR ArgBuffer; + PWSTR *argv; + ULONG argc = 0; + int i = 0; + int afterlastspace = 0; + OBJECT_ATTRIBUTES ObjectAttributes; + HANDLE CsrssInitEvent; + UNICODE_STRING UnicodeString; + NTSTATUS Status; + + ProcParams = RtlNormalizeProcessParams (Peb->ProcessParameters); + + argv = (PWSTR *)RtlAllocateHeap (Peb->ProcessHeap, + 0, 512 * sizeof(PWSTR)); + ArgBuffer = (PWSTR)RtlAllocateHeap (Peb->ProcessHeap, + 0, + ProcParams->CommandLine.Length + sizeof(WCHAR)); + memcpy (ArgBuffer, + ProcParams->CommandLine.Buffer, + ProcParams->CommandLine.Length + sizeof(WCHAR)); + + while (ArgBuffer[i]) + { + if (ArgBuffer[i] == L' ') + { + argc++; + ArgBuffer[i] = L'\0'; + argv[argc-1] = &(ArgBuffer[afterlastspace]); + i++; + while (ArgBuffer[i] == L' ') + i++; + afterlastspace = i; + } + else + { + i++; + } + } + + if (ArgBuffer[afterlastspace] != L'\0') + { + argc++; + ArgBuffer[i] = L'\0'; + argv[argc-1] = &(ArgBuffer[afterlastspace]); + } + + RtlInitUnicodeString(&UnicodeString, + L"\\CsrssInitDone"); + InitializeObjectAttributes(&ObjectAttributes, + &UnicodeString, + EVENT_ALL_ACCESS, + 0, + NULL); + Status = NtOpenEvent(&CsrssInitEvent, + EVENT_ALL_ACCESS, + &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + DbgPrint("CSR: Failed to open csrss notification event\n"); + } + if (CsrServerInitialization (argc, argv) == TRUE) + { + + NtSetEvent(CsrssInitEvent, + NULL); + + RtlFreeHeap (Peb->ProcessHeap, + 0, argv); + RtlFreeHeap (Peb->ProcessHeap, + 0, + ArgBuffer); + + /* terminate the current thread only */ + NtTerminateThread( NtCurrentThread(), 0 ); + } + else + { + DisplayString( L"CSR: Subsystem initialization failed.\n" ); + + RtlFreeHeap (Peb->ProcessHeap, + 0, argv); + RtlFreeHeap (Peb->ProcessHeap, + 0, + ArgBuffer); + + /* + * Tell SM we failed. + */ + NtTerminateProcess( NtCurrentProcess(), 0 ); +} \ No newline at end of file diff --git a/os2/utils/EXE386.H b/os2/utils/EXE386.H new file mode 100644 index 00000000000..cd78affb80c --- /dev/null +++ b/os2/utils/EXE386.H @@ -0,0 +1,558 @@ + +#ifndef __LX_EXE__ +#define __LX_EXE__ + + +#pragma pack(1) /* Force byte alignment */ + + + + /*_________________________________________________________________* + | | + | | + | OS/2 .EXE FILE HEADER DEFINITION - 386 version 0:32 | + | | + |_________________________________________________________________| + * */ + + +#define BITPERWORD 16 +#define BITPERBYTE 8 +#define OBJPAGELEN 4096 +#define E32MAGIC 0x584c /* New magic number "LX" */ +#define E32RESBYTES1 0 /* First bytes reserved */ +#define E32RESBYTES2 0 /* Second bytes reserved */ +#define E32RESBYTES3 20 /* Third bytes reserved */ +#define E32LEBO 0x00 /* Little Endian Byte Order */ +#define E32BEBO 0x01 /* Big Endian Byte Order */ +#define E32LEWO 0x00 /* Little Endian Word Order */ +#define E32BEWO 0x01 /* Big Endian Word Order */ +#define E32LEVEL 0L /* 32-bit EXE format level */ +#define E32CPU286 0x001 /* Intel 80286 or upwardly compatibile */ +#define E32CPU386 0x002 /* Intel 80386 or upwardly compatibile */ +#define E32CPU486 0x003 /* Intel 80486 or upwardly compatibile */ + + + +struct lx_exe /* New 32-bit .EXE header for OS/2 EXEs and DLLs*/ +{ + unsigned short magic; /* Magic number E32_MAGIC */ + unsigned char border; /* The byte ordering for the .EXE */ + unsigned char worder; /* The word ordering for the .EXE */ + unsigned long level; /* The EXE format level for now = 0 */ + unsigned short cpu; /* The CPU type */ + unsigned short os; /* The OS type */ + unsigned long ver; /* Module version */ + unsigned long mflags; /* Module flags */ + unsigned long mpages; /* Module # pages */ + unsigned long startobj; /* Object # for instruction pointer */ + unsigned long eip; /* Extended instruction pointer */ + unsigned long stackobj; /* Object # for stack pointer */ + unsigned long esp; /* Extended stack pointer */ + unsigned long pagesize; /* .EXE page size */ + unsigned long pageshift; /* Page alignment shift in .EXE */ + unsigned long fixupsize; /* Fixup section size */ + unsigned long fixupsum; /* Fixup section checksum */ + unsigned long ldrsize; /* Loader section size */ + unsigned long ldrsum; /* Loader section checksum */ + unsigned long objtab; /* Object table offset */ + unsigned long objcnt; /* Number of objects in module */ + unsigned long objmap; /* Object page map offset */ + unsigned long itermap; /* Object iterated data map offset */ + unsigned long rsrctab; /* Offset of Resource Table */ + unsigned long rsrccnt; /* Number of resource entries */ + unsigned long restab; /* Offset of resident name table */ + unsigned long enttab; /* Offset of Entry Table */ + unsigned long dirtab; /* Offset of Module Directive Table */ + unsigned long dircnt; /* Number of module directives */ + unsigned long fpagetab; /* Offset of Fixup Page Table */ + unsigned long frectab; /* Offset of Fixup Record Table */ + unsigned long impmod; /* Offset of Import Module Name Table */ + unsigned long impmodcnt; /* Number of entries in Import Module Name Table */ + unsigned long impproc; /* Offset of Import Procedure Name Table */ + unsigned long pagesum; /* Offset of Per-Page Checksum Table */ + unsigned long datapage; /* Offset of Enumerated Data Pages */ + unsigned long preload; /* Number of preload pages */ + unsigned long nrestab; /* Offset of Non-resident Names Table */ + unsigned long cbnrestab; /* Size of Non-resident Name Table */ + unsigned long nressum; /* Non-resident Name Table Checksum */ + unsigned long autodata; /* Object # for automatic data object */ + unsigned long debuginfo; /* Offset of the debugging information */ + unsigned long debuglen; /* The length of the debugging info. in bytes */ + unsigned long instpreload;/* Number of instance pages in preload section of .EXE file */ + unsigned long instdemand; /* Number of instance pages in demand load section of .EXE file */ + unsigned long heapsize; /* Size of heap - for 16-bit apps */ + unsigned long stacksize; /* Size of stack */ + unsigned char res3[E32RESBYTES3]; + /* Pad structure to 196 bytes */ + }; + + + + +/* + * Format of lx_exe.mflags: + * + * Low word has the following format: + * + * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 - bit no + * | | | | | | | | + * | | | | | | | +------- Per-Process Library Initialization + * | | | | | | +--------- SystemDLL (internal fixups discarded) + * | | | | | +----------- No Internal Fixups for Module in .EXE + * | | | | +------------- No External Fixups for Module in .EXE + * | | | +------------------- Incompatible with PM Windowing + * | | +--------------------- Compatible with PM Windowing + * | | Uses PM Windowing API + * | +-------------------------------- Module not Loadable + * +-------------------------------------- Library Module + */ + + +#define E32NOTP 0x8000L /* Library Module - used as NENOTP */ +#define E32NOLOAD 0x2000L /* Module not Loadable */ +#define E32PMAPI 0x0300L /* Uses PM Windowing API */ +#define E32PMW 0x0200L /* Compatible with PM Windowing */ +#define E32NOPMW 0x0100L /* Incompatible with PM Windowing */ +#define E32NOEXTFIX 0x0020L /* NO External Fixups in .EXE */ +#define E32NOINTFIX 0x0010L /* NO Internal Fixups in .EXE */ +#define E32SYSDLL 0x0008L /* System DLL, Internal Fixups discarded*/ +#define E32LIBINIT 0x0004L /* Per-Process Library Initialization */ +#define E32LIBTERM 0x40000000L /* Per-Process Library Termination */ +#define E32APPMASK 0x0300L /* Application Type Mask */ + + +/* + * Format of E32_MFLAGS(x): + * + * High word has the following format: + * + * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 - bit no + * | | + * | +--- Protected memory library module + * +----- Device driver + */ + +#define E32PROTDLL 0x10000L /* Protected memory library module */ +#define E32DEVICE 0x20000L /* Device driver */ +#define E32MODEXE 0x00000L /* .EXE module */ +#define E32MODDLL 0x08000L /* .DLL module */ +#define E32MODPROTDLL 0x18000L /* Protected memory library module */ +#define E32MODPDEV 0x20000L /* Physical device driver */ +#define E32MODVDEV 0x28000L /* Virtual device driver */ +#define E32MODMASK 0x38000L /* Module type mask */ + +/* + * RELOCATION DEFINITIONS - RUN-TIME FIXUPS + */ + + + + +typedef union _offset +{ + unsigned short offset16; + unsigned long offset32; +} + offset; /* 16-bit or 32-bit offset */ + + +/***ET+ r32_rlc - Relocation item */ + +struct r32_rlc /* Relocation item */ +{ + unsigned char nr_stype; /* Source type - field shared with new_rlc */ + unsigned char nr_flags; /* Flag byte - field shared with new_rlc */ + short r32_soff; /* Source offset */ + unsigned short r32_objmod; /* Target object number or Module ordinal */ + + union targetid + { + offset intref; /* Internal fixup */ + + union extfixup + { + offset proc; /* Procedure name offset */ + unsigned long ord; /* Procedure odrinal */ + } + extref; /* External fixup */ + + struct addfixup + { + unsigned short entry; /* Entry ordinal */ + offset addval; /* Value added to the address */ + } + addfix; /* Additive fixup */ + } + r32_target; /* Target data */ + unsigned short r32_srccount; /* Number of chained fixup records */ + unsigned short r32_chain; /* Chain head */ +}; + + + +/* + * In 32-bit .EXE file run-time relocations are written as varying size + * records, so we need many size definitions. + */ + +#define RINTSIZE16 8 +#define RINTSIZE32 10 +#define RORDSIZE 8 +#define RNAMSIZE16 8 +#define RNAMSIZE32 10 +#define RADDSIZE16 10 +#define RADDSIZE32 12 + + + +#if FALSE +/* + * Access macros defined in NEWEXE.H !!! + */ +#define NR_STYPE(x) (x).nr_stype +#define NR_FLAGS(x) (x).nr_flags +#endif + +#define R32_SOFF(x) (x).r32_soff +#define R32_OBJNO(x) (x).r32_objmod +#define R32_MODORD(x) (x).r32_objmod +#define R32_OFFSET16(x) (x).r32_target.intref.offset16 +#define R32_OFFSET32(x) (x).r32_target.intref.offset32 +#define R32_PROCOFF16(x) (x).r32_target.extref.proc.offset16 +#define R32_PROCOFF32(x) (x).r32_target.extref.proc.offset32 +#define R32_PROCORD(x) (x).r32_target.extref.ord +#define R32_ENTRY(x) (x).r32_target.addfix.entry +#define R32_ADDVAL16(x) (x).r32_target.addfix.addval.offset16 +#define R32_ADDVAL32(x) (x).r32_target.addfix.addval.offset32 +#define R32_SRCCNT(x) (x).r32_srccount +#define R32_CHAIN(x) (x).r32_chain + + + +/* + * Format of NR_STYPE(x) + * + * 7 6 5 4 3 2 1 0 - bit no + * | | | | | | + * | | +-+-+-+--- Source type + * | +----------- Fixup to 16:16 alias + * +------------- List of source offset follows fixup record + */ + +#if FALSE + + /* DEFINED in newexe.h !!! */ + +#define NRSTYP 0x0f /* Source type mask */ +#define NRSBYT 0x00 /* lo byte (8-bits)*/ +#define NRSSEG 0x02 /* 16-bit segment (16-bits) */ +#define NRSPTR 0x03 /* 16:16 pointer (32-bits) */ +#define NRSOFF 0x05 /* 16-bit offset (16-bits) */ +#define NRPTR48 0x06 /* 16:32 pointer (48-bits) */ +#define NROFF32 0x07 /* 32-bit offset (32-bits) */ +#define NRSOFF32 0x08 /* 32-bit self-relative offset (32-bits) */ +#endif + + +#define NRSRCMASK 0x0f /* Source type mask */ +#define NRALIAS 0x10 /* Fixup to alias */ +#define NRCHAIN 0x20 /* List of source offset follows */ + /* fixup record, source offset field */ + /* in fixup record contains number */ + /* of elements in list */ + +/* + * Format of NR_FLAGS(x) and R32_FLAGS(x): + * + * 7 6 5 4 3 2 1 0 - bit no + * | | | | | | | + * | | | | | +-+--- Reference type + * | | | | +------- Additive fixup + * | | | +----------- 32-bit Target Offset Flag (1 - 32-bit; 0 - 16-bit) + * | | +------------- 32-bit Additive Flag (1 - 32-bit; 0 - 16-bit) + * | +--------------- 16-bit Object/Module ordinal (1 - 16-bit; 0 - 8-bit) + * +----------------- 8-bit import ordinal (1 - 8-bit; + * 0 - NR32BITOFF toggles + * between 16 and 32 bit + * ordinal) + */ + +#if FALSE + + /* DEFINED in newexe.h !!! */ + +#define NRRTYP 0x03 /* Reference type mask */ +#define NRRINT 0x00 /* Internal reference */ +#define NRRORD 0x01 /* Import by ordinal */ +#define NRRNAM 0x02 /* Import by name */ +#define NRADD 0x04 /* Additive fixup */ +#endif + +#define NRRENT 0x03 /* Internal entry table fixup */ + +#define NR32BITOFF 0x10 /* 32-bit Target Offset */ +#define NR32BITADD 0x20 /* 32-bit Additive fixup */ +#define NR16OBJMOD 0x40 /* 16-bit Object/Module ordinal */ +#define NR8BITORD 0x80 /* 8-bit import ordinal */ +/*end*/ + +/* + * Data structures for storing run-time fixups in linker virtual memory. + * + * Each object has a list of Object Page Directories which specify + * fixups for given page. Each page has its own hash table which is + * used to detect fixups to the same target. + */ + +#define PAGEPERDIR 62 +#define LG2DIR 7 + + +typedef struct _OBJPAGEDIR +{ + DWORD next; /* Virtual pointer to next dir on list */ + WORD ht[PAGEPERDIR]; /* Pointers to individual hash tables */ +} + OBJPAGEDIR; + + + +/* + * OBJECT TABLE + */ + +/***ET+ o32_obj Object Table Entry */ + +struct o32_obj /* Flat .EXE object table entry */ +{ + unsigned long o32_size; /* Object virtual size */ + unsigned long o32_base; /* Object base virtual address */ + unsigned long o32_flags; /* Attribute flags */ + unsigned long o32_pagemap; /* Object page map index */ + unsigned long o32_mapsize; /* Number of entries in object page map */ + unsigned long o32_reserved; /* Reserved */ +}; + + +#define O32_SIZE(x) (x).o32_size +#define O32_BASE(x) (x).o32_base +#define O32_FLAGS(x) (x).o32_flags +#define O32_PAGEMAP(x) (x).o32_pagemap +#define O32_MAPSIZE(x) (x).o32_mapsize +#define O32_RESERVED(x) (x).o32_reserved + + + +/* + * Format of O32_FLAGS(x) + * + * High word of dword flag field is not used for now. + * Low word has the following format: + * + * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 - bit no + * | | | | | | | | | | | | | | | + * | | | | | | | | | | | | | | +--- Readable Object + * | | | | | | | | | | | | | +----- Writeable Object + * | | | | | | | | | | | | +------- Executable Object + * | | | | | | | | | | | +--------- Resource Object + * | | | | | | | | | | +----------- Object is Discardable + * | | | | | | | | | +------------- Object is Shared + * | | | | | | | | +--------------- Object has preload pages + * | | | | | | | +----------------- Object has invalid pages + * | | | | | | +------------------- Object is permanent and swappable + * | | | | | +--------------------- Object is permanent and resident + * | | | | +----------------------- Object is permanent and long lockable + * | | | +----------------------------- 16:16 alias required (80x86 specific) + * | | +-------------------------------- Big/Default bit setting (80x86 specific) + * | +----------------------------------- Object is conforming for code (80x86 specific) + * +-------------------------------------- Object I/O privilege level (80x86 specific) + * + */ + +#define OBJREAD 0x0001L /* Readable Object */ +#define OBJWRITE 0x0002L /* Writeable Object */ +#define OBJRSRC 0x0008L /* Resource Object */ +#define OBJINVALID 0x0080L /* Object has invalid pages */ +#define LNKNONPERM 0x0600L /* Object is nonpermanent - should be */ +#define OBJNONPERM 0x0000L /* zero in the .EXE but LINK386 uses 6 */ +#define OBJPERM 0x0100L /* Object is permanent and swappable */ +#define OBJRESIDENT 0x0200L /* Object is permanent and resident */ +#define OBJCONTIG 0x0300L /* Object is resident and contiguous */ +#define OBJDYNAMIC 0x0400L /* Object is permanent and long locable */ +#define OBJTYPEMASK 0x0700L /* Object type mask */ +#define OBJALIAS16 0x1000L /* 16:16 alias required (80x86 specific) */ +#define OBJBIGDEF 0x2000L /* Big/Default bit setting (80x86 specific) */ +#define OBJIOPL 0x8000L /* Object I/O privilege level (80x86 specific) */ +#if FOR_EXEHDR +/* + * Name these flags differently for EXEHDR.EXE - avoid conflicts with 286 version + */ +#define OBJDISCARD 0x0010L /* Object is Discardable */ +#define OBJSHARED 0x0020L /* Object is Shared */ +#define OBJPRELOAD 0x0040L /* Object has preload pages */ +#define OBJEXEC 0x0004L /* Executable Object */ +#define OBJCONFORM 0x4000L /* Object is conforming for code (80x86 specific) */ +#else +/* + * Life will be easier, if we keep the same names for the following flags: + */ +#define NSDISCARD 0x0010L /* Object is Discardable */ +#define NSMOVE NSDISCARD /* Moveable object is for sure Discardable */ +#define NSSHARED 0x0020L /* Object is Shared */ +#define NSPRELOAD 0x0040L /* Object has preload pages */ +#define NSEXRD 0x0004L /* Executable Object */ +#define NSCONFORM 0x4000L /* Object is conforming for code (80x86 specific) */ +#endif +/*end*/ + +/***ET+ o32_map - Object Page Map entry */ + +struct o32_map /* Object Page Table entry */ +{ + unsigned long o32_pagedataoffset; /* file offset of page */ + unsigned short o32_pagesize; /* # bytes of page data */ + unsigned short o32_pageflags; /* Per-Page attributes */ +}; + + +#define GETPAGEIDX(x) ((x).o32_pagedataoffset) + +#define PUTPAGEIDX(x,i) ((x).o32_pagedataoffset = ((unsigned long)(i))) + +#define PUTPAGESIZ(x,i) ((x).o32_pagesize = ((unsigned int)(i))) + +#define GETPAGESIZ(x) ((x).o32_pagesize) + +#define PAGEFLAGS(x) (x).o32_pageflags + + +#define VALID 0x0000 /* Valid Physical Page in .EXE */ +#define ITERDATA 0x0001 /* Iterated Data Page */ +#define INVALID 0x0002 /* Invalid Page */ +#define ZEROED 0x0003 /* Zero Filled Page */ +#define RANGE 0x0004 /* Range of pages */ +#define ITERDATA2 0x0005 /* Iterated Data Page Type II */ +/*end*/ + +/* + * RESOURCE TABLE + */ + +/***ET+ rsrc32 - Resource Table Entry */ + +struct rsrc32 /* Resource Table Entry */ +{ + unsigned short type; /* Resource type */ + unsigned short name; /* Resource name */ + unsigned long cb; /* Resource size */ + unsigned short obj; /* Object number */ + unsigned long offset; /* Offset within object */ +}; +/*end*/ + + + /* + * Iteration Record format for 'EXEPACK'ed pages. + */ +struct LX_Iter +{ + unsigned short LX_nIter; /* number of iterations */ + unsigned short LX_nBytes; /* number of bytes */ + unsigned char LX_Iterdata; /* iterated data byte(s) */ +}; + + +/* + * ENTRY TABLE DEFINITIONS + */ + +/***ET+ b32_bundle - Entry Table */ + +struct b32_bundle +{ + unsigned char b32_cnt; /* Number of entries in this bundle */ + unsigned char b32_type; /* Bundle type */ + unsigned short b32_obj; /* Object number */ +}; /* Follows entry types */ + +struct e32_entry +{ + unsigned char e32_flags; /* Entry point flags */ + union entrykind + { + offset e32_offset; /* 16-bit/32-bit offset entry */ + struct callgate + { + unsigned short offset; /* Offset in segment */ + unsigned short callgate; /* Callgate selector */ + } + e32_callgate; /* 286 (16-bit) call gate */ + struct fwd + { + unsigned short modord; /* Module ordinal number */ + unsigned long value; /* Proc name offset or ordinal */ + } + e32_fwd; /* Forwarder */ + } + e32_variant; /* Entry variant */ +}; + + + +#define B32_CNT(x) (x).b32_cnt +#define B32_TYPE(x) (x).b32_type +#define B32_OBJ(x) (x).b32_obj + +#define E32_EFLAGS(x) (x).e32_flags +#define E32_OFFSET16(x) (x).e32_variant.e32_offset.offset16 +#define E32_OFFSET32(x) (x).e32_variant.e32_offset.offset32 +#define E32_GATEOFF(x) (x).e32_variant.e32_callgate.offset +#define E32_GATE(x) (x).e32_variant.e32_callgate.callgate +#define E32_MODORD(x) (x).e32_variant.e32_fwd.modord +#define E32_VALUE(x) (x).e32_variant.e32_fwd.value + +#define FIXENT16 3 +#define FIXENT32 5 +#define GATEENT16 5 +#define FWDENT 7 + +/* + * BUNDLE TYPES + */ + +#define EMPTY 0x00 /* Empty bundle */ +#define ENTRY16 0x01 /* 16-bit offset entry point */ +#define GATE16 0x02 /* 286 call gate (16-bit IOPL) */ +#define ENTRY32 0x03 /* 32-bit offset entry point */ +#define ENTRYFWD 0x04 /* Forwarder entry point */ +#define TYPEINFO 0x80 /* Typing information present flag */ + + +/* + * Format for E32_EFLAGS(x) + * + * 7 6 5 4 3 2 1 0 - bit no + * | | | | | | | | + * | | | | | | | +--- exported entry + * | | | | | | +----- uses shared data + * +-+-+-+-+-+------- parameter word count + */ + +#define E32EXPORT 0x01 /* Exported entry */ +#define E32SHARED 0x02 /* Uses shared data */ +#define E32PARAMS 0xf8 /* Parameter word count mask */ + +/* + * Flags for forwarders only: + */ + +#define FWD_ORDINAL 0x01 /* Imported by ordinal */ + + +#pragma pack() /* Restore default alignment */ + +/*end*/ + +#endif /* __LX_EXE__ */ + diff --git a/os2/utils/LXDUMP.EXE b/os2/utils/LXDUMP.EXE new file mode 100644 index 0000000000000000000000000000000000000000..ba1ce7017b08a074093710731cec6670172f3e48 GIT binary patch literal 54547 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 dD=e^W-jlh~jlcOc%u(O4YybcN literal 0 HcmV?d00001 diff --git a/os2/utils/lxtest.EXE b/os2/utils/lxtest.EXE new file mode 100644 index 0000000000000000000000000000000000000000..b9911f334329526eb12b095a4cb7ed87a0235464 GIT binary patch literal 33140 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℘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 literal 0 HcmV?d00001 -- 2.17.1