Metropoli BBS
VIEWER: nw40.pas MODE: TEXT (ASCII)
unit nw40;

interface

uses DOS;


{General types and Variables}

TYPE
   RequestBuffer	= ARRAY[0..256] of BYTE;
   RequestControl	= RECORD
	   Len : WORD;
	   Fct : BYTE;
	   END;
   ReplyBuffer		= ARRAY[0..512] of BYTE;
   Str2           = String[2];
   ObjectName     = Array[1..48] of Char;

VAR
   reg            : Registers;
   SendBuffer		: RequestBuffer;
	ReceiveBuffer	: ReplyBuffer;


FUNCTION hex2(Number: BYTE): str2;
Function LongSwap(L1: LongInt): LongInt;




{Types and Variables for our test cases}

CONST
   OT_File_ServerL = $400;




{Types and Variables for NW 4.0 function return data}

TYPE NW40_ConnList = Record
                     Fields : Word;
                     Entry  : Array[1..50] of LongInt;
                     END;
TYPE NW40_ExtVolInfo = Record
                       DataLength : Word;
                       volumeType,
                       statusFlagBits,
                       sectorSize,
                       sectorsPerCluster,
                       volumeSizeInClusters,
                       freedClusters,
                       subAllocFreeableClusters,
                       freeableLimboSectors,
                       nonFreeableLimboSectors,
                       nonFreeableAvailSubAllocSectors,
                       notUsableSubAllocSectors,
                       subAllocClusters,
                       dataStreamsCount,
                       limboDataStreamsCount,
                       oldestDeletedFileAgeInTicks,
                       compressedDataStreamsCount,
                       compressedLimboDataStreamsCount,
                       unCompressableDataStreamsCount,
                       preCompressedSectors,
                       compressedSectors,
                       migratedFiles,
                       migratedSectors,
                       clustersUsedByFAT,
                       clustersUsedByDirectories,
                       clustersUsedByExtendedDirs,
                       totalDirectoryEntries,
                       unUsedDirectoryEntries,
                       totalExtendedDirectoryExtants,
                       unUsedExtendedDirectoryExtants,
                       extendedAttributesDefined,
                       extendedAttributeExtantsUsed,
                       directoryServicesObjectID,
                       volumeLastModifiedDateAndTime:    LongInt;
                       volumeName: String;
                       END;
TYPE NW40_ObjectsEffectiveRights = RECORD
                      EffectiveRights:  WORD;
                      reserved:         Array[1..6] of Byte
                      END;
TYPE SERVER_AND_VCONSOLE_INFO = RECORD
                      currentServerTime:  LongInt;
                      vconsoleVersion:	   Byte;
                      vconsoleRevision:	Byte;
                      reserved:           Word;
                      END;

TYPE NW40_BoardList = Record
                      serverTimeAndVConsoleInfo: SERVER_AND_VCONSOLE_INFO;
                      MaxNumOfLANs:      LongInt;
                      ItemsCount:        LongInt;
                      BoardNumber:       Array[1..50] of LongInt
                      END;
TYPE TCPUInfo =       Record
                      pageTableOwnerFlag: LongInt;
                      CPUTypeFlag:        LongInt;
                      coProcessorFlag:    LongInt;
                      busTypeFlag:        LongInt;
                      IOEngineFlag:       LongInt;
                      FSEngineFlag:       LongInt;
                      nonDedicatedFlag:   LongInt;
                      Info:               Array[0..200] of Char; {CPU String; Num CoProc; BusString}
                      END;
TYPE NW40_CPUInfo   = Record
                      serverTimeAndVConsoleInfo: SERVER_AND_VCONSOLE_INFO;
                      NumberOfCPUs:      LongInt;
                      CPUInfo:           TCPUInfo
                      END;
TYPE NW40_CacheCounters = Record
                      serverTimeAndVConsoleInfo: SERVER_AND_VCONSOLE_INFO;
                      {memory counters}
                      readExistingBlockCount:       LongInt;
                      readExistingWriteWaitCount:   LongInt;

                      readExistingPartialReadCount: LongInt;  {2}
                      readExistingReadErrorCount:   LongInt;
                      writeBlockCount:              LongInt;
                      writeEntireBlockCount:        LongInt;

                      getDiskCount:                 LongInt;  {3}
                      getDiskNeedToAllocCount:      LongInt;
                      getDiskSomeoneBeatMeCount:    LongInt;
                      getDiskPartialReadCount:      LongInt;

                      getDiskReadErrorCount:        LongInt;  {4}
                      getAsyncDiskCount:            LongInt;
                      getAsyncDiskNeedToAlloc:      LongInt;
                      getAsyncDiskSomeoneBeatMe:    LongInt;

                      errorDoingAsyncReadCount:     LongInt;  {5}
                      getDiskNoReadCount:           LongInt;
                      getDiskNoReadAllocCount:      LongInt;
                      getDiskNoReadSomeoneBeatMeCount: LongInt;

                      diskWriteCount:               LongInt;  {6}
                      diskWriteAllocCount:          LongInt;
                      diskWriteSomeoneBeatMeCount:  LongInt;
                      writeErrorCount:              LongInt;

                      waitOnSemaphoreCount:         LongInt;  {7}
                      allocBlockWaitForSomeoneCount: LongInt;
                      allocBlockCount:              LongInt;
                      allocBlockWaitCount:          LongInt;
                      {CACHE_MEM_COUNTERS}
                      originalNumOfCacheBuffers:    LongInt;  {8}
                      currentNumOfCacheBuffers:     LongInt;
                      cacheDirtyBlockThreshold:     LongInt;
                      waitNodeCount:                LongInt;

                      waitNodeAllocFailureCount:    LongInt;  {9}
                      moveCacheNodeCount:           LongInt;
                      moveCacheNodeFromAvailCount:  LongInt;
                      accelerateCacheNodeWriteCount:LongInt;

                      removeCacheNodeCount:         LongInt;  {10}
                      removeCacheNodeFromAvailCount:LongInt;
                      {cache trend counters}
                      numCacheChecks:               LongInt;
                      numCacheHits:                 LongInt;

                      numDirtyCacheChecks:          LongInt;  {11}
                      numDirtyCacheHits:            LongInt;
                      cacheUsedWhileChecking:       LongInt;
                      waitForDirtyBlocksDecreaseCount: LongInt;

                      allocBlockFromAvailCount:     LongInt;  {}
                      allocBlockFromLRUCount:       LongInt;
                      allocBlockAlreadyWaiting:     LongInt;
                      LRUSittingTime:               LongInt;
                      {CACHE_INFO}
                      maxByteCount:                 LongInt;
                      minNumOfCacheBuffers:         LongInt;
                      minCacheReportThreshold:      LongInt;
                      allocWaitingCount:            LongInt;

                      numDirtyBlocks:               LongInt;
                      cacheDirtyWaitTime:           LongInt;
                      cacheMaxConcurrentWrites:     LongInt;
                      maxDirtyTime:                 LongInt;

                      numOfDirCacheBuffers:         LongInt;
                      cacheByteToBlockShiftFactor:  LongInt;
                      END;
TYPE NW40_FileServerInfo  = Record
                      serverTimeAndVConsoleInfo: SERVER_AND_VCONSOLE_INFO;
                      NCPStationsInUseCount:           LongInt;
                      NCPStationsPeakCount:            LongInt;
                      NCPTotalRequests:                LongInt;
                      ServerUtilization:               LongInt;
                      replyCancelledCount:             LongInt;
                      writeHeldOffCount:               LongInt;
                      writeHeldOffWithDuplicateRequest:LongInt;
                      invalidRequestTypeCount:         LongInt;
                      beingAbortedCount:               LongInt;
                      alreadyDoingReallocCount:        LongInt;
                      deAllocInvalidSlotCount:         LongInt;
                      deAllocBeingProcessedCount:      LongInt;
                      deAllocForgedPacketCount:        LongInt;
                      deAllocStillTransmittingCount:   LongInt;
                      startStationErrorCount:          LongInt;
                      invalidSlotCount:                LongInt;
                      beingProcessedCount:             LongInt;
                      forgedPacketCount:               LongInt;
                      stillTransmittingCount:          LongInt;
                      reExecuteRequestCount:           LongInt;
                      invalidSequenceNumCount:         LongInt;
                      duplicateIsBeingSentAlreadyCnt:  LongInt;
                      sentPositiveAcknowledgeCount:    LongInt;
                      sentDuplicateReplyCount:         LongInt;
                      noMemForStationCtrlCount:        LongInt;
                      noAvailableConnsCount:           LongInt;
                      reallocSlotCount:                LongInt;
                      reallocSlotCameTooSoonCount:     LongInt;
                      TooManyHops,
                      UnknownNetWork,
                      NoSpaceForService,
                      NoReceiveBuffers,
                      NotMyNetwork:                    Word;
                      NetBIOSPropagated,
                      TotalPacketsServiced,
                      TotalPacketsRouted:              LongInt
                      end;
TYPE NW40_Route =     RECORD
                      NetIDNumber:        LongInt;
                      HopsToNet:          Word;
                      NetStatus:          Word;
                      TimeToNet:          Word;
                      END;
TYPE NWFSE_NETWORK_ROUTER_INFO = RECORD
                      serverTimeAndVConsoleInfo: SERVER_AND_VCONSOLE_INFO;
                      NumberOfEntries:    LongInt;
                      KnownRoutes:        Array[1..20] of NW40_Route
                      END;
TYPE NW40_KnownServer = RECORD
                      Network:            LongInt;
                      Node:               Array[1..6] of BYTE;
                      Socket:             Word;
                      HopsToServer:       Word;
                      ServerName:         ObjectName; {packed !}
                      END;
TYPE NWFSE_NETWORK_SERVER_INFO = RECORD
                      serverTimeAndVConsoleInfo: SERVER_AND_VCONSOLE_INFO;
                      NumberOfEntries:    LongInt;
                      Case Boolean of
                        True:  (KnownServers:       Array[1..20] of NW40_KnownServer);
                        False: (Data:               Array[1..20*SizeOf(NW40_KnownServer)] of Byte);
                      END;
TYPE NW40_RouterInformation = RECORD
                      serverTimeAndVConsoleInfo: SERVER_AND_VCONSOLE_INFO;
                      NetIDNumber:               LongInt;
                      HopsToNetCount:            WORD;
                      NetStatus:                 Word;
                      TimeToNet:                 Word
                      END;
TYPE NW40_NLMsLoaded = RECORD
                      serverTimeAndVConsoleInfo: SERVER_AND_VCONSOLE_INFO;
{                     MoreFlag:                  WORD; }
                      NLMCount:                  LongInt;
                      NLMsReturned:              LongInt;
                      NLMNumbers:                Array[1..50] of LongInt
                      END;
TYPE NW40_OSVersionInformation = RECORD
                      serverTimeAndVConsoleInfo: SERVER_AND_VCONSOLE_INFO;
                      OSMajorVersion:               Byte;
                      OSMinorVersion:               Byte;
                      OSRevisionNum:                Byte;
                      accountingVersion:            Byte;
                      VAPVersion:                   Byte;
                      queueingVersion:              Byte;
                      securityRestrictionsLevel:    Byte;
                      bridgingSupport:              Byte;
                      maxNumOfVolumes:              LongInt;
                      numOfConnSlots:               LongInt;
                      maxLoggedInConns:             LongInt;
                      maxNumOfNameSpaces:           LongInt;
                      maxNumOfLans:                 LongInt;
                      maxNumOfMediaTypes:           LongInt;
                      maxNumOfProtocols:            LongInt;
                      maxMaxSubdirTreeDepth:        LongInt;
                      maxNumOfDataStreams:          LongInt;
                      maxNumOfSpoolPrinters:        LongInt;
                      serialNum:                    LongInt;
                      applicationNum:               Word;
                      END;
TYPE NW40_ProtocolStacks = RECORD
                      serverTimeAndVConsoleInfo: SERVER_AND_VCONSOLE_INFO;
                      StackNumberCount:          LongInt;
                      StackNumbers:              Array[1..50] of LongInt;
                      END;
TYPE NW40_ServerSetCategories = RECORD
                      serverTimeAndVConsoleInfo: SERVER_AND_VCONSOLE_INFO;
                      numberOfSetCategories: LongInt;
                      nextSequenceNumber:    LongInt;
                      categoryName:		      String;
                      END;
TYPE NW40_ServerSetCommandsInfo = RECORD
                      serverTimeAndVConsoleInfo: SERVER_AND_VCONSOLE_INFO;
                      numberOfSetCommands:       LongInt;
                      nextSequenceNumber:        LongInt;
                      setCmdType:                LongInt;
                      setCmdCategory:            LongInt;
                      setCmdFlags:               LongInt;
                      setCmdName:                String;
	                                              {The setCmdName String variable contains
                                                 setCmdValues :   Byte;
                                                 setCmdValue:		Array[1..x] of Byte;
                                                 after the string end}
                      END;
TYPE NW40_IPXSPXInformation = RECORD
                      serverTimeAndVConsoleInfo: SERVER_AND_VCONSOLE_INFO;
                      IPXSendPacketCount:        LongInt;
                      IPXMalformPacketCount:     Word;
                      IPXGetECBRequestCount:     LongInt;
                      IPXGetECBFailCount:        LongInt;
                      IPXAESEventCount:          LongInt;
                      IPXPostponedAESCount:      Word;
                      IPXMaxConfiguredSocketCount: Word;
                      IPXMaxOpenSocketCount:     Word;
                      IPXOpenSocketFailCount:    Word;
                      IPXListenECBCount:         LongInt;
                      IPXECBCancelFailCount:     Word;
                      IPXGetLocalTargetFailCount:Word;
                      SPXMaxConnsCount:          Word;
                      SPXMaxUsedConns:           Word;
                      SPXEstConnReq:             Word;
                      SPXEstConnFail:            Word;
                      SPXListenConnectReq:       Word;
                      SPXListenConnectFail:      Word;
                      SPXSendCount:              LongInt;
                      SPXWindowChokeCount:       LongInt;
                      SPXBadSendCount:           Word;
                      SPXSendFailCount:          Word;
                      SPXAbortedConn:            Word;
                      SPXListenPacketCount:      LongInt;
                      SPXBadListenCount:         Word;
                      SPXIncomingPacketCount:    LongInt;
                      SPXBadInPacketCount:       Word;
                      SPXSuppressedPackCount:    Word;
                      SPXNoSesListenECBCount:    Word;
                      SPXWatchDogDestSesCount:   Word;
                      END;
TYPE NW40_LANCommonInfo     = RECORD
                      notSupportedMask:        LongInt;
                      totalTxPAcketCount:      LongInt;
                      totalRxPacketCount:      LongInt;
                      noECBAvailableCount:     LongInt;
                      packetTxTooBigCount:     LongInt;
                      packetTxTooSmallCount:   LongInt;
                      packetRxOverflowCount:   LongInt;
                      packetRxTooBigCount:     LongInt;
                      packetRxTooSmallCount:   LongInt;
                      packetTxMiscErrorCount:  LongInt;
                      packetRxMiscErrorCount:  LongInt;
                      retryTxCount:            LongInt;
                      checksumErrorCount:      LongInt;
                      hardwareRxMismatchCount: LongInt;
                      reserved:                Array[1..50] of Byte;
                      END;
TYPE NW40_CommonCounters = RECORD
                      serverTimeAndVConsoleInfo: SERVER_AND_VCONSOLE_INFO;
                      statisticsMajorVersion:    Byte;
                      statisticsMinorVersion:    Byte;
                      numberOfGenericCounters:   LongInt;
                      numberOfCounterBlocks:     LongInt;
                      customVariableCount:       LongInt;
                      NextCounterBlock:          LongInt;
                      CommonInfo:                NW40_LANCommonInfo;
                      END;
TYPE NW40_LANConfiguration = RECORD
                      serverTimeAndVConsoleInfo: SERVER_AND_VCONSOLE_INFO;
                      DriverCFG_MajorVersion:       BYTE;
                      DriverCFG_MinorVersion:       BYTE;
                      DriverNodeAddress:            Array[1..6] of BYTE;
                      DriverModeFlags:    	       WORD;
                      DriverBoardNum:    	          WORD;
                      DriverBoardInstance:          WORD;
                      DriverMaxSize:                LongInt;
                      DriverMaxRecvSize:            LongInt;
                      DriverRecvSize:               LongInt;
                      {Reserved1:                   Array[1..3] of LongInt;}
                      DriverCardID:                 WORD;
                      DriverMediaID:                WORD;
                      DriverTransportTime:          WORD;
                      {DriverReserved               Array[1..16] of BYTE;}
                      DriverSrcRouting:             LongInt;
                      DriverLineSpeed:              WORD;
                      DriverReserved:               Word;
                      DriverMajorVersion:           BYTE;
                      DriverMinorVersion:           BYTE;
                      DriverFlags:                  WORD;
                      DriverSendRetries:            WORD;
                      DriverLink:                   LongInt;
                      DriverSharingFlags:           WORD;
                      DriverSlot:                   WORD;
                      DriverIOPortsAndLengths:      Array[1..4] of WORD;
                      DriverMemDecode0:             LongInt;
                      DriverLength0:                WORD;
                      DriverMemDecode1:             LongInt;
                      DriverLength1:                WORD;
                      DriverInterrupt:              Array[1..2] of BYTE;
                      DriverDMAUsage:               Array[1..2] of BYTE;
                      {Reserved2                    Array[1..3] of LongInt;}
                      DriverLogicalName:            Array[1..18] of Char;
                      DriverIOReserved:             Array[1..14] of Byte;
                      DriverCardName:               Array[1..128] of Char;
                      DriverMediaType:              Array[1..40] of Char;
                      DriverCustomVars:             Array[1..180] of BYTE;
                      END;
TYPE NW40_NLMInfo = RECORD
                      identificationNum:     LongInt;
                      flags:                 LongInt;
                      NLMtype:               LongInt;
                      {type 1..12: LAN, DSK, NAM, utility NLM, MSL, OS NLM,
                              paged NLM, HAM, CDM, file system NLM, real mode NLM, hidden NLM}
                      parentID:              LongInt;
                      majorVersion:          LongInt;
                      minorVersion:          LongInt;
                      revision:              LongInt;
                      year:                  LongInt;
                      month:                 LongInt;
                      day:                   LongInt;
                      allocAvailableBytes:   LongInt;
                      allocFreeCount:        LongInt;
                      lastGarbageCollection: LongInt;
                      messageLanguage:       LongInt;  {wrong}
                      numOfReferencedPublics:LongInt;
                      END;
TYPE NW40_NLMInformation = RECORD
                      serverTimeAndVConsoleInfo: SERVER_AND_VCONSOLE_INFO;
                      NLMInfo:               NW40_NLMInfo;
                      NLMStrings:            Array[0..200] of Char;
                      { containing 3 LStrings: NLMFileName, NLMName, CopyRight}
                      END;
TYPE NW40_UserInformation = RECORD
                      serverTimeAndVConsoleInfo: SERVER_AND_VCONSOLE_INFO;
                      connNum:                LongInt;
                      useCount:               LongInt;
                      connServiceType:        Byte;
                      loginTime:              Array[1.. 7] of Byte;
                      status:                 LongInt;
                      expirationTime:         LongInt;

                      objType:                LongInt;
                      transactionFlag:        Byte;
                      logicalLockThreshold:   Byte;
                      recordLockThreshold:    Byte;
                      fileWriteFlags:         Byte;  {Includes active and stop bits}
                      fileWriteState:         Byte;
                      filler:                 Byte;
                      fileLockCount:          Word;
                      recordLockCount:        Word;
                      totalBytesRead:         Array[1.. 6] of Byte;
                      totalBytesWritten:      Array[1.. 6] of Byte;
                      totalRequests:          LongInt;
                      heldRequests:           LongInt;
                      heldBytesRead:          Array[1.. 6] of Byte;
                      heldBytesWritten:       Array[1.. 6] of Byte;
                      UserName:               String;
                      END;
TYPE NW40_LFSCounters = Record
                      readFile,
                      writeFile,
                      deleteFile,
                      renMove,
                      openFile,
                      createFile,
                      createAndOpenFile,
                      closeFile,
                      scanDeleteFile,
                      salvageFile,
                      purgeFile,
                      migrateFile,
                      deMigrateFile,
                      createDir,
                      deleteDir,
                      directoryScans,
                      mapPathToDirNum,
                      modifyDirEntry,
                      getAccessRights,
                      getAccessRightsFromIDs,
                      mapDirNumToPath,
                      getEntryFromPathStrBase,
                      getOtherNSEntry,
                      getExtDirInfo,
                      getParentDirNum,
                      addTrusteeR,
                      scanTrusteeR,
                      delTrusteeR,
                      purgeTrust,
                      findNextTrustRef,
                      scanUserRestNodes,
                      addUserRest,
                      deleteUserRest,
                      rtnDirSpaceRest,
                      getActualAvailDskSp,
                      cntOwnedFilesAndDirs,
                      migFileInfo,
                      volMigInfo,
                      readMigFileData,
                      getVolusageStats,
                      getActualVolUsageStats,
                      getDirUsageStats,
                      NMFileReadsCount,
                      NMFileWritesCount,
                      {/* mapPathToDirectoryNumberOrPhantom:*/ LongInt}
                      { documents are contradicory - tests required;
                        not sure about these counters }
                      mapPathToDirNumOrPhantom,
                      {/* stationHasAccessRightsGrantedBelow:*/ LongInt}
                      stationHasAccessRgtsGntedBelow,
                      {/* getDataStreamLengthsFromPathStringBase:*/ LongInt}
                      gtDataStreamLensFromPathStrBase,
                      checkAndGetDirectoryEntry,
                      getDeletedEntry,
                      getOriginalNameSpace,
                      getActualFileSize,
                      verifyNameSpaceNumber,
                      verifyDataStreamNumber,
                      checkVolumeNumber,
                      commitFile,
                      VMGetDirectoryEntry,
                      createDMFileEntry,
                      renameNameSpaceEntry,
                      logFile,
                      releaseFile,
                      clearFile,
                      setVolumeFlag,
                      clearVolumeFlag,
                      getOriginalInfo,
                      createMigratedDir,
                      F3OpenCreate,
                      F3InitFileSearch,
                      F3ContinueFileSearch,
                      F3RenameFile,
                      F3ScanForTrustees,
                      F3ObtainFileInfo,
                      F3ModifyInfo,
                      F3EraseFile,
                      F3SetDirHandle,
                      F3AddTrustees,
                      F3DeleteTrustees,
                      F3AllocDirHandle,
                      F3ScanSalvagedFiles,
                      F3RecoverSalvagedFiles,
                      F3PurgeSalvageableFile,
                      F3GetNSSpecificInfo,
                      F3ModifyNSSpecificInfo,
                      F3SearchSet,
                      F3GetDirBase,
                      F3QueryNameSpaceInfo,
                      F3GetNameSpaceList,
                      F3GetHugeInfo,
                      F3SetHugeInfo,
                      F3GetFullPathString,
                      F3GetEffectiveDirectoryRights : LongInt
                      END;
TYPE NW40_VolumeSwitchInformation = RECORD
                      serverTimeAndVConsoleInfo: SERVER_AND_VCONSOLE_INFO;
                      TotalLFSCounters:     LongInt;
                      CurrentLFSCounters:   LongInt;
                      LFSCounters:          NW40_LFSCounters
                      END;
TYPE UnicodeName = Array[1..200, 1..2] of Char;
TYPE NW40_PingNDSResult = RECORD
                      PingVersion:       LongInt;
                      TreeNameLength:    LongInt;
                      {TreeName:          UnicodeName; wrong!}
                      TreeName:          Array[1..200] of Char;
                      END;
TYPE NW40_BinderyContext = RECORD
                      NameLength:    LongInt;
                      Name:          UnicodeName;
                      END;


Function RawCall(Fct: BYTE; Req_L: WORD): Word;
Function RawCallWithHeader(Fct, SubFct: BYTE; Req_L: WORD): Word;

Function NW40_ChangeConnectionState(NewState: Byte): Word;
Function NW40_ClearConnectionNumber(Number: LongInt): Word;
Function NW40_GetConnectionList(ObjId: LongInt; SearchNumber: LongInt; Var CL: NW40_ConnList): Word;
Function NW40_SetWatchDogDelayInterval(Minutes: LongInt): Word;
Function NW40_GetExtendedVolumeInformation(VolNr: LongInt; Var VolInfo: NW40_ExtVolInfo): Word;
Function NW40_GetObjectEffectiveRights(ObjID: LongInt; DirHandle: Byte; Path: String; VAR EffRights: Word): Word;
Function NW40_ActiveLANBoardList(StartNumber: LongInt; VAR BoardList: NW40_BoardList): Word;
Function NW40_CPUInformation(CPUNumber: LongInt; VAR CPUInformation: NW40_CPUInfo): Word;
Function NW40_GetCacheInformation(VAR CacheInfo : NW40_CacheCounters): Word;
Function NW40_GetServerInformation(VAR FileServerInfo : NW40_FileServerInfo): Word;
Function NW40_GetKnownNetWorks(StartNumber: LongInt; VAR RouterInfo : NWFSE_NETWORK_ROUTER_INFO): Word;
Function NW40_GetKnownServers(StartNumber, ServerType: LongInt; VAR ServerInfo : NWFSE_NETWORK_SERVER_INFO): Word;
Function NW40_GetNetworkRouterInformation(NetworkNumber: LongInt; VAR RouterInformation: NW40_RouterInformation): Word;
Function NW40_GetNLMsLoaded(StartNumber: LongInt; VAR NLMsLoaded: NW40_NLMsLoaded): Word;
Function NW40_GetOSVersionInformation(VAR OSVersionInformation: NW40_OSVersionInformation): Word;
Function NW40_GetProtocolStackByBoard(LANBoardNumber: LongInt; VAR ProtocolStacks: NW40_ProtocolStacks): Word;
Function NW40_GetServerSetCategories(StartNumber: LongInt; VAR ServerSetCategories: NW40_ServerSetCategories): Word;
Function NW40_GetServerSetCommandsInfo(StartNumber: LongInt; VAR ServerSetCommandsInfo: NW40_ServerSetCommandsInfo): Word;
Function NW40_GetIPXSPXInformation(VAR IPXSPXInformation: NW40_IPXSPXInformation): Word;
Function NW40_GetLANCommonCounters(LANBoardNumber:LongInt; BlockNumber:LongInt; VAR CommonCounters:NW40_CommonCounters): Word;
Function NW40_GetLANConfiguration(LANBoardNumber: LongInt; VAR LANConfiguration: NW40_LANConfiguration): Word;
Function NW40_GetNLMInformation(NLMNumber: LongInt; VAR NLMInformation: NW40_NLMInformation): Word;
Function NW40_GetUserInformation(ConnectionNumber: LongInt; VAR UserInformation: NW40_UserInformation): Word;
Function NW40_GetVolumeSwitchInformation(StartItemNumber: LongInt; VAR VolumeSwitchInfo: NW40_VolumeSwitchInformation): Word;
Function NW40_MonitorNDSConnection: Word;
Function NW40_PingForNDSNCP(VAR PingNDSResult: NW40_PingNDSResult): Word;
Function NW40_ReturnBinderyContext(VAR BinderyContext: NW40_BinderyContext): Word;


Procedure TestAllCalls;



implementation

FUNCTION hex2(Number: BYTE): str2;
CONST  hexa : Array[0..15] of Char = '0123456789ABCDEF';
BEGIN
	hex2[0] := #2;
	hex2[1] := hexa[Number SHR 4];
   hex2[2] := hexa[Number AND $0F];
END;

Function LongSwap(L1: LongInt): LongInt;
VAR L2 : LongInt;
    L1a: Array[1..4] of Byte absolute L1;
    L2a: Array[1..4] of Byte absolute L2;
    i  : Byte;
BEGIN
   For i := 0 to 3 do L2a[i] := L1a[4-i];
   LongSwap := L2
END;


Function  RawCall(Fct: BYTE; Req_L: WORD): Word;
VAR   ReceiveLength : WORD absolute ReceiveBuffer;
BEGIN  {len incl. Function Nr}
	ReceiveLength    := SizeOf(ReceiveBuffer);
   ReceiveBuffer[2] := 0;
	WITH reg DO BEGIN
		DS := seg(SendBuffer);     SI := ofs(SendBuffer);
		ES := seg(ReceiveBuffer);  DI := ofs(ReceiveBuffer);
		CX := Req_L+2; {for IPX}   DX := ReceiveLength;
		AH := $F2;                 AL := Fct
		END;
   MsDos(reg);
   RawCall := reg.AL;
END;


Function RawCallWithHeader(Fct, SubFct: BYTE; Req_L: WORD): Word;
VAR Request : RECORD
      Len : Word;
      Fct : Byte;
	   END absolute SendBuffer;
BEGIN  {len incl. Function Nr}
   Request.Len       := Swap(Req_L);
   Request.Fct       := SubFct;
   RawCallWithHeader := RawCall(Fct, Req_L);
END;





Function NW40_ChangeConnectionState(NewState: Byte): Word;
VAR Req : Record
          RC:      RequestControl;
          State:   LongInt
          END  absolute SendBuffer;
BEGIN
   Req.State := NewState;
   NW40_ChangeConnectionState := RawCallWithHeader($17, $1D, SizeOf(Req)-2);
END;

Function NW40_ClearConnectionNumber(Number: LongInt): Word;
VAR Req : Record
          RC:      RequestControl;
          Conn:    LongInt
          END  absolute SendBuffer;
BEGIN
   Req.Conn := Number;
   NW40_ClearConnectionNumber := RawCallWithHeader($17, $FE, SizeOf(Req)-2);
END;

Function NW40_GetConnectionList(ObjId: LongInt; SearchNumber: LongInt; Var CL: NW40_ConnList): Word;
VAR Req : Record
          RC:      RequestControl;
          ObjID:   LongInt;
          SConn:   LongInt;   {init with -1}
          END  absolute SendBuffer;
BEGIN
   Req.ObjID  := ObjID;
   Req.SConn  := SearchNumber;
   NW40_GetConnectionList := RawCallWithHeader($17, $1F, SizeOf(Req)-2);
   Move(ReceiveBuffer, CL, SizeOf(CL))
END;

Function NW40_SetWatchDogDelayInterval(Minutes: LongInt): Word;
VAR Req : Record
          RC:       RequestControl;
          Interval: LongInt   {in minutes}
          END  absolute SendBuffer;
BEGIN
   Req.Interval := Minutes;
   NW40_SetWatchDogDelayInterval := RawCallWithHeader($17, $1E, SizeOf(Req)-2);
END;


Function NW40_GetExtendedVolumeInformation(VolNr: LongInt; Var VolInfo: NW40_ExtVolInfo): Word;
VAR Req : Record
          RC:      RequestControl;
          VolNr:   LongInt
          END  absolute SendBuffer;
BEGIN
   Req.VolNr := VolNr;
   NW40_GetExtendedVolumeInformation := RawCallWithHeader($16, $33, SizeOf(Req)-2);
   Move(ReceiveBuffer, VolInfo, SizeOf(VolInfo))
END;


Function NW40_GetObjectEffectiveRights(ObjID: LongInt; DirHandle: Byte; Path: String; VAR EffRights: Word): Word;
VAR Req : Record
          RC:      RequestControl;
          ObjID:   LongInt;
          Handle:  Byte;
          Path:    String
          END  absolute SendBuffer;
    Rep : NW40_ObjectsEffectiveRights absolute ReceiveBuffer;
BEGIN
   Req.ObjID := ObjID;
   Req.Handle:= DirHandle;
   Req.Path  := Path;
   NW40_GetObjectEffectiveRights := RawCallWithHeader($16, $32, 9+Length(Path));
   EffRights := Rep.EffectiveRights
END;

Function NW40_ActiveLANBoardList(StartNumber: LongInt; VAR BoardList: NW40_BoardList): Word;
VAR Req : Record
          RC:            RequestControl;
          StartNumber:   LongInt
          END  absolute SendBuffer;
BEGIN
   Req.StartNumber := StartNumber;
   NW40_ActiveLANBoardList := RawCallWithHeader($7B, $14, SizeOf(Req)-2);
   Move(ReceiveBuffer, BoardList, SizeOf(BoardList))
END;


Function NW40_CPUInformation(CPUNumber: LongInt; VAR CPUInformation: NW40_CPUInfo): Word;
VAR Req : Record
          RC:      RequestControl;
          CPUNumber:   LongInt
          END  absolute SendBuffer;
BEGIN
   Req.CPUNumber := CPUNumber;
   NW40_CPUInformation := RawCallWithHeader($7B, $8, SizeOf(Req)-2);
   Move(ReceiveBuffer, CPUInformation, SizeOf(CPUInformation))
END;

Function NW40_GetCacheInformation(VAR CacheInfo : NW40_CacheCounters): Word;
BEGIN
   NW40_GetCacheInformation := RawCallWithHeader($7B, $1, 1);
   Move(ReceiveBuffer, CacheInfo, SizeOf(CacheInfo))
END;


Function NW40_GetServerInformation(VAR FileServerInfo : NW40_FileServerInfo): Word;
BEGIN
   NW40_GetServerInformation := RawCallWithHeader($7B, $2, 1);
   Move(ReceiveBuffer, FileServerInfo, SizeOf(FileServerInfo))
END;


VAR RouterInfo : NWFSE_NETWORK_ROUTER_INFO;
Function NW40_GetKnownNetWorks(StartNumber: LongInt; VAR RouterInfo : NWFSE_NETWORK_ROUTER_INFO): Word;
VAR Req : Record
          RC:            RequestControl;
          StartNumber:   LongInt
          END  absolute SendBuffer;
BEGIN
   Req.StartNumber := StartNumber;
   NW40_GetKnownNetWorks := RawCallWithHeader($7B, $35, SizeOf(Req)-2);
   Move(ReceiveBuffer, RouterInfo, SizeOf(RouterInfo))
END;


Function NW40_GetKnownServers(StartNumber, ServerType: LongInt; VAR ServerInfo : NWFSE_NETWORK_SERVER_INFO): Word;
Const SNL = SizeOf(NW40_KnownServer);  {12+2+48}
VAR Req : Record
          RC:            RequestControl;
          StartNumber, ServerType:   LongInt
          END  absolute SendBuffer;
BEGIN
   Req.StartNumber := StartNumber;
   Req.ServerType  := ServerType;
   NW40_GetKnownServers := RawCallWithHeader($7B, $38, SizeOf(Req)-2);
   Move(ReceiveBuffer, ServerInfo, SizeOf(ServerInfo));
END;

Function NW40_GetNetworkRouterInformation(NetworkNumber: LongInt; VAR RouterInformation: NW40_RouterInformation): Word;
VAR Req : Record
          RC:      RequestControl;
          NetworkNumber:   LongInt
          END  absolute SendBuffer;
BEGIN
   Req.NetworkNumber := NetworkNumber;
   NW40_GetNetworkRouterInformation := RawCallWithHeader($7B, $33, SizeOf(Req)-2);
   Move(ReceiveBuffer, RouterInformation, SizeOf(RouterInformation))
END;


Function NW40_GetNLMsLoaded(StartNumber: LongInt; VAR NLMsLoaded: NW40_NLMsLoaded): Word;
VAR Req : Record
          RC:      RequestControl;
          StartNumber:   LongInt
          END  absolute SendBuffer;
BEGIN
   Req.StartNumber := StartNumber;
   NW40_GetNLMsLoaded := RawCallWithHeader($7B, $0A, SizeOf(Req)-2);
   Move(ReceiveBuffer, NLMsLoaded, SizeOf(NLMsLoaded))
END;

Function NW40_GetOSVersionInformation(VAR OSVersionInformation: NW40_OSVersionInformation): Word;
BEGIN
   NW40_GetOSVersionInformation := RawCallWithHeader($7B, $0D, 1);
   Move(ReceiveBuffer, OSVersionInformation, SizeOf(OSVersionInformation))
END;


Function NW40_GetProtocolStackByBoard(LANBoardNumber: LongInt; VAR ProtocolStacks: NW40_ProtocolStacks): Word;
VAR Req : Record
          RC:      RequestControl;
          LANBoardNumber:   LongInt
          END  absolute SendBuffer;
BEGIN
   Req.LANBoardNumber := LANBoardNumber;
   NW40_GetProtocolStackByBoard := RawCallWithHeader($7B, $29, SizeOf(Req)-2);
   Move(ReceiveBuffer, ProtocolStacks, SizeOf(ProtocolStacks))
END;


Function NW40_GetServerSetCategories(StartNumber: LongInt; VAR ServerSetCategories: NW40_ServerSetCategories): Word;
VAR Req : Record
          RC:      RequestControl;
          StartNumber:   LongInt
          END  absolute SendBuffer;
BEGIN
   Req.StartNumber := StartNumber;
   NW40_GetServerSetCategories := RawCallWithHeader($7B, $3D, SizeOf(Req)-2);
   Move(ReceiveBuffer, ServerSetCategories, SizeOf(ServerSetCategories))
END;


Function NW40_GetServerSetCommandsInfo(StartNumber: LongInt; VAR ServerSetCommandsInfo: NW40_ServerSetCommandsInfo): Word;
VAR Req : Record
          RC:      RequestControl;
          StartNumber:   LongInt
          END  absolute SendBuffer;
BEGIN
   Req.StartNumber := StartNumber;
   NW40_GetServerSetCommandsInfo := RawCallWithHeader($7B, $3C, SizeOf(Req)-2);
   Move(ReceiveBuffer, ServerSetCommandsInfo, SizeOf(ServerSetCommandsInfo))
END;


Function NW40_GetIPXSPXInformation(VAR IPXSPXInformation: NW40_IPXSPXInformation): Word;
BEGIN
   NW40_GetIPXSPXInformation := RawCallWithHeader($7B, $06, 1);
   Move(ReceiveBuffer, IPXSPXInformation, SizeOf(IPXSPXInformation))
END;


Function NW40_GetLANCommonCounters(LANBoardNumber:LongInt; BlockNumber:LongInt; VAR CommonCounters:NW40_CommonCounters): Word;
VAR Req : Record
          RC:      RequestControl;
          LANBoardNumber:   LongInt;
          BlockNumber:      LongInt;  {start with 0}
          END  absolute SendBuffer;
BEGIN
   Req.LANBoardNumber := LANBoardNumber;
   Req.BlockNumber    := BlockNumber;
   NW40_GetLANCommonCounters := RawCallWithHeader($7B, $16, SizeOf(Req)-2);
   Move(ReceiveBuffer, CommonCounters, SizeOf(CommonCounters))
END;


Function NW40_GetLANConfiguration(LANBoardNumber: LongInt; VAR LANConfiguration: NW40_LANConfiguration): Word;
VAR Req : Record
          RC:      RequestControl;
          LANBoardNumber:   LongInt
          END  absolute SendBuffer;
BEGIN
   Req.LANBoardNumber := LANBoardNumber;
   NW40_GetLANConfiguration := RawCallWithHeader($7B, $15, SizeOf(Req)-2);
   Move(ReceiveBuffer, LANConfiguration, SizeOf(LANConfiguration))
END;


Function NW40_GetNLMInformation(NLMNumber: LongInt; VAR NLMInformation: NW40_NLMInformation): Word;
VAR Req : Record
          RC:      RequestControl;
          NLMNumber:   LongInt
          END  absolute SendBuffer;
BEGIN
   Req.NLMNumber := NLMNumber;
   NW40_GetNLMInformation := RawCallWithHeader($7B, $0B, SizeOf(Req)-2);
   Move(ReceiveBuffer, NLMInformation, SizeOf(NLMInformation))
END;


Function NW40_GetUserInformation(ConnectionNumber: LongInt; VAR UserInformation: NW40_UserInformation): Word;
VAR Req : Record
          RC:      RequestControl;
          ConnectionNumber:   LongInt
          END  absolute SendBuffer;
BEGIN
   Req.ConnectionNumber := ConnectionNumber;
   NW40_GetUserInformation := RawCallWithHeader($7B, $04, SizeOf(Req)-2);
   Move(ReceiveBuffer, UserInformation, SizeOf(UserInformation))
END;


Function NW40_GetVolumeSwitchInformation(StartItemNumber: LongInt; VAR VolumeSwitchInfo: NW40_VolumeSwitchInformation): Word;
VAR Req : Record
          RC:      RequestControl;
          StartItemNumber:   LongInt
          END  absolute SendBuffer;
BEGIN
   Req.StartItemNumber := StartItemNumber;
   NW40_GetVolumeSwitchInformation := RawCallWithHeader($7B, $09, SizeOf(Req)-2);
   Move(ReceiveBuffer, VolumeSwitchInfo, SizeOf(VolumeSwitchInfo))
END;


Function NW40_MonitorNDSConnection: Word;
BEGIN
   SendBuffer[0] := $5;
   NW40_MonitorNDSConnection := RawCall($68, 1);
END;


Function NW40_PingForNDSNCP(VAR PingNDSResult: NW40_PingNDSResult): Word;
BEGIN
   FillChar(SendBuffer, 4, 0);
   SendBuffer[0] := 1;
   NW40_PingForNDSNCP := RawCall($68, 2);
   Move(ReceiveBuffer, PingNDSResult, SizeOf(PingNDSResult))
END;


Function NW40_ReturnBinderyContext(VAR BinderyContext: NW40_BinderyContext): Word;
BEGIN
   SendBuffer[0] := $4;
   NW40_ReturnBinderyContext := RawCall($68, 1);
   Move(ReceiveBuffer, BinderyContext, SizeOf(BinderyContext))
END;





Procedure TestAllCalls;
VAR Dummy : Array[1..500] of Byte;  {just a working space for responses}
    ConnList :              NW40_ConnList absolute Dummy;
    VolInfo :               NW40_ExtVolInfo absolute Dummy;
    BoardList :             NW40_BoardList absolute Dummy;
    CPUInformation :        NW40_CPUInfo absolute Dummy;
    CacheInfo :             NW40_CacheCounters absolute Dummy;
    FileServerInfo :        NW40_FileServerInfo absolute Dummy;
    ServerInfo :            NWFSE_NETWORK_SERVER_INFO absolute Dummy;
    RouterInformation :     NW40_RouterInformation absolute Dummy;
    NLMsLoaded :            NW40_NLMsLoaded absolute Dummy;
    OSVersionInformation :  NW40_OSVersionInformation absolute Dummy;
    ProtocolStacks :        NW40_ProtocolStacks absolute Dummy;
    ServerSetCategories :   NW40_ServerSetCategories absolute Dummy;
    ServerSetCommandsInfo : NW40_ServerSetCommandsInfo absolute Dummy;
    IPXSPXInformation :     NW40_IPXSPXInformation absolute Dummy;
    CommonCounters :        NW40_CommonCounters absolute Dummy;
    LANConfiguration :      NW40_LANConfiguration absolute Dummy;
    NLMInformation :        NW40_NLMInformation absolute Dummy;
    UserInformation :       NW40_UserInformation absolute Dummy;
    VolumeSwitchInfo :      NW40_VolumeSwitchInformation absolute Dummy;
    PingNDSResult :         NW40_PingNDSResult absolute Dummy;
    BinderyContext :        NW40_BinderyContext absolute Dummy;
    EffRights:              Word                absolute Dummy;

BEGIN
   {
    This routine just calls all APIs from this unit;
    use a LANalyser to view request and reply packets.

    The support module for the LANalyser to understand NW 4.0 NCP is
    on NetWire NovLib
   }

   WriteLn('ChangeConnectionState:         ', hex2(NW40_ChangeConnectionState(0)));
   WriteLn('ChangeConnectionState:         ', hex2(NW40_ChangeConnectionState(1)));

   WriteLn('NW40_ClearConnectionNumber:    ', hex2(NW40_ClearConnectionNumber(50)));
   WriteLn('NW40_GetConnectionList:        ', hex2(NW40_GetConnectionList($01000000, -1, ConnList)));
   WriteLn('SetWatchDogDelayInterval:      ', hex2(NW40_SetWatchDogDelayInterval(15)));
   WriteLn('GetExtendedVolumeInformation:  ', hex2(NW40_GetExtendedVolumeInformation(0, VolInfo)));
   WriteLn('GetObjectEffectiveRights:      ', hex2(NW40_GetObjectEffectiveRights($01000000, 0, 'SYS:PUBLIC', EffRights)));
   WriteLn('ActiveLANBoardList:            ', hex2(NW40_ActiveLANBoardList(0, BoardList)));
   WriteLn('CPUInformation:                ', hex2(NW40_CPUInformation(0, CPUInformation )));
   WriteLn('GetCacheInformation:           ', hex2(NW40_GetCacheInformation(CacheInfo)));
   WriteLn('GetServerInformation:          ', hex2(NW40_GetServerInformation(FileServerInfo)));
   WriteLn('GetKnownNetWorks:              ', hex2(NW40_GetKnownNetWorks(0, RouterInfo)));
   WriteLn('GetKnownServers:               ', hex2(NW40_GetKnownServers(0, OT_File_ServerL, ServerInfo)));
   WriteLn('GetNetworkRouterInformation:   ', hex2(NW40_GetNetworkRouterInformation(LongSwap($49211010), RouterInformation)));
   WriteLn('GetNLMsLoaded:                 ', hex2(NW40_GetNLMsLoaded(0, NLMsLoaded)));
   WriteLn('GetOSVersionInformation:       ', hex2(NW40_GetOSVersionInformation(OSVersionInformation)));
   WriteLn('GetProtocolStackByBoard:       ', hex2(NW40_GetProtocolStackByBoard(1, ProtocolStacks)));
   WriteLn('GetServerSetCategories:        ', hex2(NW40_GetServerSetCategories(1, ServerSetCategories)));
   WriteLn('GetServerSetCommandsInfo:      ', hex2(NW40_GetServerSetCommandsInfo(1, ServerSetCommandsInfo)));
   WriteLn('GetIPXSPXInformation:          ', hex2(NW40_GetIPXSPXInformation(IPXSPXInformation)));
   WriteLn('GetLANCommonCounters:          ', hex2(NW40_GetLANCommonCounters(1, 0, CommonCounters)));
   WriteLn('GetLANConfiguration:           ', hex2(NW40_GetLANConfiguration(1, LANConfiguration)));
   WriteLn('GetNLMInformation:             ', hex2(NW40_GetNLMInformation(2, NLMInformation)));
   WriteLn('GetUserInformation:            ', hex2(NW40_GetUserInformation(11, UserInformation)));
   WriteLn('GetVolumeSwitchInformation:    ', hex2(NW40_GetVolumeSwitchInformation(1, VolumeSwitchInfo)));

   WriteLn('MonitorNDSConnection:         ', hex2(NW40_MonitorNDSConnection));
   WriteLn('PingForNDSNCP:                ', hex2(NW40_PingForNDSNCP(PingNDSResult)));
   WriteLn('ReturnBinderyContext:         ', hex2(NW40_ReturnBinderyContext(BinderyContext)));
END;


BEGIN

END.




{

TYPE NW40_ZZZ = RECORD
                      serverTimeAndVConsoleInfo: SERVER_AND_VCONSOLE_INFO;
                      END;
Var   ZZZ : NW40_ZZZ absolute Dummy;
Function NW40_XXX(YYY: LongInt; VAR ZZZ: NW40_ZZZ): Word;
VAR Req : Record
          RC:      RequestControl;
          YYY:   LongInt
          END  absolute SendBuffer;
BEGIN
   Req.YYY := YYY;
   NW40_XXX := RawCallWithHeader($7B, $, SizeOf(Req)-2);
   Move(ReceiveBuffer, ZZZ, SizeOf(ZZZ))
END;

   WriteLn('XXX:         ', hex2(NW40_XXX(1, ZZZ)));

TYPE NW40_ZZZ = RECORD
                      serverTimeAndVConsoleInfo: SERVER_AND_VCONSOLE_INFO;
                      END;
Var   ZZZ : NW40_ZZZ absolute Dummy;
Function NW40_XXX(YYY: LongInt; VAR ZZZ: NW40_ZZZ): Word;
VAR Req : Record
          RC:      RequestControl;
          YYY:   LongInt
          END  absolute SendBuffer;
BEGIN
   SendBuffer[0] := $;
   Req.YYY := YYY;
   NW40_XXX := RawCall($6B, $, SizeOf(Req)-2);
   Move(ReceiveBuffer, ZZZ, SizeOf(ZZZ))
END;

   WriteLn('XXX:         ', hex2(NW40_XXX(1, ZZZ)));


}
[ RETURN TO DIRECTORY ]