mbbsemu / MBBSEmu

The MajorBBS Emulation Project is an Open Source, Cross-Platform emulator for easily running The MajorBBS & Worldgroup Modules
https://www.mbbsemu.com
MIT License
128 stars 14 forks source link

[SFASEA] Sea Battle - Crash to play with another user #505

Closed ftoledo closed 2 years ago

ftoledo commented 2 years ago

Module Information

imagen

imagen

play with computer at demo mode just works

Software Information:

enusbaum commented 2 years ago

Thanks for reporting this! Did it produce a crash log or does it just freeze up?

ftoledo commented 2 years ago

yes! sorry i miss paste the log:

2021-10-25 09:43:20.0640 Debug MBBSEmu.HostProcess.ExportedModules.Majorbbs.ptrblok (SFASEA) Retrieved Big Memory block FFFF:0000, returned pointer to index 0: 1000:BC24
2021-10-25 09:43:20.0640 Debug MBBSEmu.HostProcess.ExportedModules.Majorbbs.ptrblok (SFASEA) Retrieved Big Memory block FFFF:0000, returned pointer to index 0: 1000:BC24
2021-10-25 09:43:20.0640 Debug MBBSEmu.HostProcess.ExportedModules.Majorbbs.ptrblok (SFASEA) Retrieved Big Memory block FFFF:0000, returned pointer to index 1: 1000:BF8C
2021-10-25 09:43:20.0640 Debug MBBSEmu.HostProcess.ExportedModules.Majorbbs.ptrblok (SFASEA) Retrieved Big Memory block FFFF:0000, returned pointer to index 2: 1000:C2F4
2021-10-25 09:43:20.0640 Debug MBBSEmu.HostProcess.ExportedModules.Majorbbs.ptrblok (SFASEA) Retrieved Big Memory block FFFF:0000, returned pointer to index 3: 1000:C65C
2021-10-25 09:43:20.0640 Debug MBBSEmu.HostProcess.ExportedModules.Majorbbs.ptrblok (SFASEA) Retrieved Big Memory block FFFF:0000, returned pointer to index 4: 1000:C9C4
2021-10-25 09:43:20.0640 Debug MBBSEmu.HostProcess.ExportedModules.Majorbbs.ptrblok (SFASEA) Retrieved Big Memory block FFFF:0000, returned pointer to index 5: 1000:CD2C
2021-10-25 09:43:20.0640 Debug MBBSEmu.HostProcess.ExportedModules.Majorbbs.ptrblok (SFASEA) Retrieved Big Memory block FFFF:0000, returned pointer to index 6: 1000:D094
2021-10-25 09:43:20.0640 Debug MBBSEmu.HostProcess.ExportedModules.Majorbbs.ptrblok (SFASEA) Retrieved Big Memory block FFFF:0000, returned pointer to index 7: 1000:D3FC
2021-10-25 09:43:20.0640 Debug MBBSEmu.HostProcess.ExportedModules.Majorbbs.ptrblok (SFASEA) Retrieved Big Memory block FFFF:0000, returned pointer to index 8: 1000:D764
2021-10-25 09:43:20.0640 Debug MBBSEmu.HostProcess.ExportedModules.Majorbbs.ptrblok (SFASEA) Retrieved Big Memory block FFFF:0000, returned pointer to index 9: 1000:DACC
2021-10-25 09:43:20.0640 Debug MBBSEmu.HostProcess.ExportedModules.Majorbbs.ptrblok (SFASEA) Retrieved Big Memory block FFFF:0000, returned pointer to index 10: 1000:DE34
2021-10-25 09:43:20.0640 Debug MBBSEmu.HostProcess.ExportedModules.Majorbbs.setmbk (SFASEA) Enqueue Previous MCV File: SFASEA.MCV (Pointer: FFFF:0000)
2021-10-25 09:43:20.0640 Debug MBBSEmu.HostProcess.ExportedModules.Majorbbs.setmbk (SFASEA) Set Current MCV File: SFASEA.MCV (Pointer: FFFF:0000)
2021-10-25 09:43:20.0640 Debug MBBSEmu.HostProcess.ExportedModules.Majorbbs.clrprf (SFASEA) Reset Output Buffer
2021-10-25 09:43:20.0652 Debug MBBSEmu.HostProcess.ExportedModules.Majorbbs.cncchr (SFASEA) Returned char: P
2021-10-25 09:43:20.0652 Debug MBBSEmu.HostProcess.ExportedModules.Majorbbs.ptrblok (SFASEA) Retrieved Big Memory block FFFF:0000, returned pointer to index 1: 1000:BF8C
2021-10-25 09:43:20.0652 Debug MBBSEmu.HostProcess.ExportedModules.Majorbbs.ptrblok (SFASEA) Retrieved Big Memory block FFFF:0000, returned pointer to index 2: 1000:C2F4
2021-10-25 09:43:20.0652 Debug MBBSEmu.HostProcess.ExportedModules.Majorbbs.ptrblok (SFASEA) Retrieved Big Memory block FFFF:0000, returned pointer to index 3: 1000:C65C
2021-10-25 09:43:20.0652 Debug MBBSEmu.HostProcess.ExportedModules.Majorbbs.ptrblok (SFASEA) Retrieved Big Memory block FFFF:0000, returned pointer to index 4: 1000:C9C4
2021-10-25 09:43:20.0652 Debug MBBSEmu.HostProcess.ExportedModules.Majorbbs.ptrblok (SFASEA) Retrieved Big Memory block FFFF:0000, returned pointer to index 5: 1000:CD2C
2021-10-25 09:43:20.0652 Debug MBBSEmu.HostProcess.ExportedModules.Majorbbs.ptrblok (SFASEA) Retrieved Big Memory block FFFF:0000, returned pointer to index 6: 1000:D094
2021-10-25 09:43:20.0652 Debug MBBSEmu.HostProcess.ExportedModules.Majorbbs.ptrblok (SFASEA) Retrieved Big Memory block FFFF:0000, returned pointer to index 7: 1000:D3FC
2021-10-25 09:43:20.0652 Debug MBBSEmu.HostProcess.ExportedModules.Majorbbs.ptrblok (SFASEA) Retrieved Big Memory block FFFF:0000, returned pointer to index 8: 1000:D764
2021-10-25 09:43:20.0652 Debug MBBSEmu.HostProcess.ExportedModules.Majorbbs.ptrblok (SFASEA) Retrieved Big Memory block FFFF:0000, returned pointer to index 9: 1000:DACC
2021-10-25 09:43:20.0652 Debug MBBSEmu.HostProcess.ExportedModules.Majorbbs.ptrblok (SFASEA) Retrieved Big Memory block FFFF:0000, returned pointer to index 10: 1000:DE34
2021-10-25 09:43:20.0652 Debug MBBSEmu.HostProcess.ExportedModules.Majorbbs.prfmsg (SFASEA) Added 121 bytes to the buffer from message number 12
2021-10-25 09:43:20.0652 Debug MBBSEmu.HostProcess.ExportedModules.Majorbbs.clrprf (SFASEA) Reset Output Buffer
2021-10-25 09:43:20.0754 Error MBBSEmu.HostProcess.ExportedModules.Majorbbs.Invoke Unknown Exported Function Ordinal in MAJORBBS: 129:CNCUID
Unhandled exception. System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values. (Parameter 'Unknown Exported Function Ordinal in MAJORBBS: 129:CNCUID')
   at MBBSEmu.HostProcess.ExportedModules.Majorbbs.Invoke(UInt16 ordinal, Boolean offsetsOnly)
   at MBBSEmu.HostProcess.ExecutionUnits.ExecutionUnit.ExternalFunctionDelegate(UInt16 ordinal, UInt16 functionOrdinal)
   at MBBSEmu.CPU.CpuCore.Op_Call()
   at MBBSEmu.CPU.CpuCore.Tick()
   at MBBSEmu.HostProcess.ExecutionUnits.ExecutionUnit.Execute(FarPtr entryPoint, UInt16 channelNumber, Boolean simulateCallFar, Boolean bypassState, Queue`1 initialStackValues, UInt16 initialStackPointer)
   at MBBSEmu.Module.MbbsModule.Execute(FarPtr entryPoint, UInt16 channelNumber, Boolean simulateCallFar, Boolean bypassSetState, Queue`1 initialStackValues, UInt16 initialStackPointer)
   at MBBSEmu.HostProcess.MbbsHost.Run(String moduleName, FarPtr routine, UInt16 channelNumber, Boolean simulateCallFar, Queue`1 initialStackValues)
   at MBBSEmu.HostProcess.MbbsHost.WorkerThread()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location ---
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()
Abortado
enusbaum commented 2 years ago

Thanks!

Looks like we're missing this API:

image

We might need to write a test module to see how a real system handles this, but my assumption based on the documentation is that it takes in a char* from the input string and validates the value that is passed in is a valid user name on the system.

This API most likely operates in the same manner was uidkey:

https://github.com/mbbsemu/MBBSEmu/blob/98d9c3b6a14e3fc0e919a645407b9ae695d6437a/MBBSEmu/HostProcess/ExportedModules/Majorbbs.cs#L7291

Where it looks up the registered user by the User ID supplied -- if an invalid username is entered, it probably returns a pointer to a empty char* (0x0)

ftoledo commented 2 years ago

if found the cncuid() at wg3 source:

CHAR *
     cncuid(VOID)                  /* grab a userid; prepares for Btrieve too   */
     {
          CHAR *rp;
          static CHAR retval[UIDSIZ];

          if (*nxtcmd == SIGIDC) {
               return(cncsig());
          }
          setmem(retval,UIDSIZ,0);
          for (rp=retval ; isuidc(*nxtcmd) && rp-retval < UIDSIZ-1 ; nxtcmd++,rp++) {
               *rp=*nxtcmd;
          }
          return(retval);
     }

also found uses at:

root@scarlet:/tmp/3/SRC# grep -r cncuid |grep "\.C"
apps/galrsy/REMSYS.C:               else if (onsysn(cncuid(),1)) {
apps/galreg/REGISTRY.C:               if (dfaAcqEQ(vdatmp,cncuid(),0)) {
apps/galreg/REGISTRY.C:               if (dfaAcqEQ(vdatmp,cncuid(),0)) {
apps/galreg/REGISTRY.C:          if (dfaQueryGE(cncuid(),0)) {
server/wgserver/CNCUTL.C:cncuid(VOID)                  /* grab a userid; prepares for Btrieve too   */
server/wgserver/MAJORBBS.C:     uid=cncuid();

i add the cncuid() case to great swtich at ExportedModules/Majorbbs.cs and try to implement this api


        /// <summary>
        ///     return user
        ///
        ///     Signature: int cncuid (char *uid);
        /// </summary>
        private void cncuid()
        {

            //Get Input
            var inputPointer = Module.Memory.GetVariablePointer("INPUT");
            var nxtcmdPointer = Module.Memory.GetPointer("NXTCMD");
            var inputLength = Module.Memory.GetWord("INPLEN");

            var userName = GetParameterString(0, true);

            _logger.Info($"({Module.ModuleIdentifier}) cncuid({userName})");

            if (string.IsNullOrEmpty(userName))
            {
                Registers.AX = 1;
                return;
            }

#if DEBUG
            _logger.Debug($"({Module.ModuleIdentifier}) Returning {Registers.AX} for cncuid({userName})");
#endif
        }

remember: i no skill here! and missing lot of concepts, I would like to know how to continue with the process :)