コード例 #1
0
PVOID gdtAlloc(size_t tSize, BOOL fSwappable)
{
USHORT rc;
SEL sel;

   rc = DosAllocSeg(tSize, &sel, 0);
   if (rc)
      return NULL;
   printf("Allocating %p\n", MAKEP(sel,0));
   fflush(stdout);
   return MAKEP(sel, 0);
}
コード例 #2
0
USHORT NEAR ActivatePhysConn( USHORT ReqHandle, USHORT Mode, ULONG Timeout,
      USHORT MACDS )
{
   PMODULE pModule = MAKEP(MACDS,0);

   return ANDIS_RC_SUCCESS;
}
コード例 #3
0
USHORT NEAR RegisterNullDLC( USHORT ReqHandle, USHORT PortID,
      PENTRYTBL pEntryTbl, USHORT MACDS )
{
   PMODULE pModule = MAKEP(MACDS,0);

   return ANDIS_RC_SUCCESS;
}
コード例 #4
0
USHORT NEAR RetrievePPIStatus( USHORT ReqHandle, PULONG pPPIStatus,
      USHORT MACDS )
{
   PMODULE pModule = MAKEP(MACDS,0);

   return ANDIS_RC_SUCCESS;
}
コード例 #5
0
USHORT NEAR GetPPATParms( USHORT ReqHandle, USHORT PPATSize, PXVPPAT pPPAT,
      USHORT MACDS )
{
   PMODULE pModule = MAKEP(MACDS,0);

   return ANDIS_RC_SUCCESS;
}
コード例 #6
0
USHORT _loadds PASCAL FAR TransmitImmData( USHORT PortID, USHORT ReqHandle,
      USHORT DataLength, ULONG pImmData, USHORT FunctionCode, USHORT MACDS )
{
   PMODULE pModule = MAKEP(MACDS,0);

   if ( FunctionCode != ANDIS_FC_TX_IMM_DATA ) return ANDIS_RC_INVALID_FUNC;

   return ANDIS_RC_SUCCESS;
}
コード例 #7
0
USHORT _loadds PASCAL FAR PPATManagement( USHORT PortID, USHORT ReqHandle,
      USHORT Param1, ULONG pPPAT, USHORT FunctionCode, USHORT MACDS )
{
   PMODULE pModule = MAKEP(MACDS,0);

   if ( FunctionCode != ANDIS_FC_UPDATE_PPAT ) return ANDIS_RC_INVALID_FUNC;

   return ANDIS_RC_SUCCESS;
}
コード例 #8
0
USHORT NEAR ReleasePCM( USHORT ReqHandle, USHORT PortID, USHORT MACDS )
{
   PMODULE pModule = MAKEP(MACDS,0);

   pModule->PCMEntryTbl.PortMgmtInd    = NULL;
   pModule->PCMEntryTbl.RecvImmData    = NULL;
   pModule->PCMEntryTbl.XmitImmDataCnf = NULL;
   pModule->PCMEntryTbl.pcm_ds         = 0;

   return ANDIS_RC_SUCCESS;
}
コード例 #9
0
ファイル: e2init.c プロジェクト: OS2World/DRV-ext2flt
/* Return the entry point for a driver given its handle */
PADDEntryPoint InitGetDriverEP (USHORT FilterHandle)
{
 PDevClassTableStruc	pDCTable;	/* Pointer to list of ADDs */
 PDevClassTableEntry	pDCEntry;	/* Pointer to device entry points */

 pDCTable= E2GetADDTable();		/* Get device class list */
 pDCEntry= pDCTable->DCTableEntries+FilterHandle-1;
					/* Point to entry for ADDHandle */
 return (PVOID) MAKEP(pDCEntry->DCSelector,pDCEntry->DCOffset);
					/* Return the entry point */
}
コード例 #10
0
USHORT _loadds PASCAL FAR ReceiveImmDataConfirm( USHORT PortID,
      USHORT ReqHandle, USHORT Param1, ULONG Param2, USHORT FunctionCode,
      USHORT MACDS )
{
   PMODULE pModule = MAKEP(MACDS,0);

   if ( FunctionCode != ANDIS_FC_RX_IMM_DATA_CNF )
      return ANDIS_RC_INVALID_FUNC;

   return ANDIS_RC_SUCCESS;
}
コード例 #11
0
ファイル: stubfsd.c プロジェクト: OS2World/DRV-ISOFS_Paul
int IFSEXPORT
FS_INIT(
   char far * pszParm,
   unsigned long pDevHlp,
   unsigned long far * pMiniFSD
   )
{
   int rc;
   SEL aselMapping[2];
   char far * p;
   int i;

   Device_Help = (PFN) pDevHlp;

   pidDaemon = 0;

   /* Parse the IFS name. */
   p = pszParm;
   while ((*p == ' ') || (*p == '\t')) p++;
   if (*p) {
      for (i = 0;
           (i < sizeof(FS_NAME)) &&
              (*p) &&
              (*p != ' ') &&
              (*p != '\t');
           i++)
         FS_NAME[i] = *p++;
      FS_NAME[i] = 0;
   }
   
   /* Allocate enough GDT selectors. */
   rc = DevHelp_AllocGDTSelector(aselMapping, 2);
   if (rc) return rc;

   pRequest = MAKEP(aselMapping[0], 0);
   pFSData = MAKEP(aselMapping[1], 0);

   return NO_ERROR;
}
コード例 #12
0
ファイル: pfreebuf.c プロジェクト: mingpen/OpenNT
USHORT MAllocMem(USHORT usSize, CHAR FAR ** ppBuffer) {

    SEL 		   sel;
    unsigned int	   err;

    err = DosAllocSeg(usSize, &sel, 0);
    if (err) {
       return(err);
    }

    *ppBuffer = MAKEP(sel, 0);
    return(0);

}
コード例 #13
0
/**********************************************************************/
#include <mt\stdio.h>
#include <mt\conio.h>
#include <mt\process.h>
#define INCL_BASE
#include <os2.h>
USHORT rc;
PCHAR  Test;
struct _EXCEPTIONREGISTRATIONRECORD
   {
      struct _EXCEPTIONREGISTRATIONRECORD * prev_structure;
      PFN Handler;
   };
typedef struct _EXCEPTIONREGISTRATIONRECORD EXCEPTIONREGISTRATIONRECORD;
typedef struct _EXCEPTIONREGISTRATIONRECORD * PEXCEPTIONREGISTRATIONRECORD;
USHORT EXPENTRY SETEXCEPT(PEXCEPTIONREGISTRATIONRECORD);
USHORT EXPENTRY UNSETEXCEPT(PEXCEPTIONREGISTRATIONRECORD);
TID Tid;
#define STACKSIZE 0x2000
SEL   SelStack;
PCHAR StackPtr;
void   Thread(unsigned far *args);         /* Playing   thread function   */
void cdecl main() {
    EXCEPTIONREGISTRATIONRECORD ExceptReg;
    printf("Setting exception handler\n");
    rc=SETEXCEPT(&ExceptReg);
    DosAllocSeg(STACKSIZE,&SelStack,1);
    StackPtr=MAKEP(SelStack,0);
    Tid=_beginthread(
       Thread,
       (VOID FAR *)StackPtr,
       STACKSIZE,
       NULL);
      getch();
    rc=UNSETEXCEPT(&ExceptReg);
}
コード例 #14
0
USHORT NEAR RegisterPCM( USHORT ReqHandle, USHORT PortID, PENTRYTBL pEntryTbl,
      USHORT MACDS )
{
   PMODULE pModule = MAKEP(MACDS,0);

   if ( pModule->PCMEntryTbl.PortMgmtInd == NULL )
      {
         pModule->PCMEntryTbl.PortMgmtInd    = pEntryTbl->PortMgmtInd;
         pModule->PCMEntryTbl.RecvImmData    = pEntryTbl->RecvImmData;
         pModule->PCMEntryTbl.XmitImmDataCnf = pEntryTbl->XmitImmDataCnf;
         pModule->PCMEntryTbl.pcm_ds         = pEntryTbl->pcm_ds;
      }
   else return ANDIS_RC_ALREADY_REG;

   return ANDIS_RC_SUCCESS;
}
コード例 #15
0
ファイル: paccess.c プロジェクト: mingpen/OpenNT
USHORT MNetAccessEnum (
    const CHAR	     FAR * pszServer,
    CHAR	     FAR * pszBasePath,
    USHORT	     fsRecursive,
    SHORT	     Level,
    CHAR FAR **      ppBuffer,
    USHORT     FAR * pcEntriesRead ) {

    USHORT				       usReturnCode,
					       cbTotalAvail;
    SEL 				       sel;

    // get a 4K buffer
    *ppBuffer = MGetBuffer(BIG_BUFFER_SIZE);
    if (*ppBuffer == NULL)
    {
	return(ERROR_NOT_ENOUGH_MEMORY);
    }

    usReturnCode = NetAccessEnum(pszServer, pszBasePath, fsRecursive, Level,
	    *ppBuffer, BIG_BUFFER_SIZE, pcEntriesRead, & cbTotalAvail);
		
    // is there more data? if so, allocate a big enough buffer to get it
    if(usReturnCode == ERROR_MORE_DATA || usReturnCode == NERR_BufTooSmall)
    {
	NetApiBufferFree(*ppBuffer);

	if (DEBUGALLOC(FULL_SEG_BUFFER_SIZE, & sel, SEG_NONSHARED))
	{
	    return(ERROR_NOT_ENOUGH_MEMORY);
	}
	*ppBuffer = MAKEP(sel, 0);
	usReturnCode = NetAccessEnum(pszServer, pszBasePath, fsRecursive, Level,
	    *ppBuffer, FULL_SEG_BUFFER_SIZE, pcEntriesRead, & cbTotalAvail);
    }

    // If we're returning an error that's not moredata, or there are no
    // entries to return, free the buffer first

    if ((usReturnCode && usReturnCode != ERROR_MORE_DATA &&
	usReturnCode != NERR_BufTooSmall) || *pcEntriesRead == 0) {
	    NetApiBufferFree(*ppBuffer);
    }

    return (usReturnCode);

}
VOID main(VOID)
{
   USHORT usReturn_Code;           /*  Dos function Return Code              */

   PSZ    pszName = SHARENAME;              /*  Shareable memory block name  */
   SEL    selMem_Selector;                  /*  Receive Segment selector     */

   PSZ     pszSemName = SEMNAME;            /*  System semaphore name        */
   HSEM    hsemSemHandle;                   /*  System semaphore Handle      */

   WATCH FAR * Watch_Ptr;          /*  WATCH pointer                         */

                                   /* Get Access to Shareable memory Block   */
   usReturn_Code = DosGetShrSeg(pszName, & selMem_Selector);

   if (usReturn_Code == 0) {
      Watch_Ptr = (WATCH FAR *) MAKEP(selMem_Selector,0);

      DosOpenSem( & hsemSemHandle,          /*  Open System semaphore        */
                  pszSemName);

      DosSemRequest(hsemSemHandle,          /*  Waits for shared resources   */
                    SEM_INDEFINITE_WAIT);

                            /* Restore Init value count if WATCHDOG enabled  */
      if (Watch_Ptr->Flag & ENABLE_MASK)
         Watch_Ptr->Counter = Watch_Ptr->Counter_Init_Value ;

      DosSemClear(hsemSemHandle);             /*  Release  shared resources  */

      DosFreeSeg(selMem_Selector);            /*  Freeing Shared memory      */

   } else {
      DosBeep(262,250);DosBeep(330,250);DosBeep(392,250);DosBeep(494,250);
      DosBeep(392,250);DosBeep(330,250);DosBeep(262,250);

#ifdef DEBUG
      printf("\n -*-*- STARTTPS Error Code %04x -*-*-\n",usReturn_Code);
      printf("  -*-    WatchDog not Started    -*-\n");
#endif

   } /* endif */

   DosExit((USHORT) 0,usReturn_Code);         /*  Exit Process              */

} /* end of main program */
コード例 #17
0
ファイル: e2init.c プロジェクト: OS2World/DRV-ext2flt
/* adapters in turn. */
void InitScanDrivers (void)
{
 PADDEntryPoint		pADDEntry;	/* .ADD entry point adapter */
 PDevClassTableStruc	pDCTable;	/* Pointer to list of ADDs */
 PDevClassTableEntry	pDCEntry;	/* Pointer to device entry */
 int			DeviceCount;

 pDCTable= E2GetADDTable();
 InitPrintVerbose ("Scanning Adapter device drivers:");
 for (DeviceCount= pDCTable->DCCount,pDCEntry= pDCTable->DCTableEntries;
      DeviceCount--;
      pDCEntry++)
 {
  InitPrintVerbose (pDCEntry->DCName);
  pADDEntry = (PVOID) MAKEP(pDCEntry->DCSelector,pDCEntry->DCOffset);
  InitScanAdapter (pADDEntry);
 }
}
コード例 #18
0
ファイル: trace.c プロジェクト: OS2World/DRV-MPU-401
void MPUTRACE_StrategyRead(PREQPACKET prp)
{
   TRACE_EVENT __far *pte;
   USHORT rc;

   printf("MPUTRACE_StrategyRead\n");

   rc = DevHelp_PhysToGDTSelector(prp->s.io.ulAddress, prp->s.io.usCount, selTrace);
   if (rc)
      int3();

   pte = MAKEP(selTrace, 0);

   while (!TraceRead(pte)) {
      printf("MPUTRACE_StrategyRead blocking\n");
      cli();                                          // yes, then block
      fTraceWaiting = TRUE;
      DevHelp_ProcBlock((ULONG) (void __far *) &fTraceEnabled, -1, 1);
      fTraceWaiting = FALSE;
      printf("MPUTRACE_StrategyRead released\n");
   }
}
コード例 #19
0
ファイル: pfreebuf.c プロジェクト: mingpen/OpenNT
CHAR FAR * MGetBuffer(USHORT usSize) {

    CHAR       FAR * pBuffer;
    SEL 	     sel;

    // see if i can use the static buffer
    if (bBigBufferInUse || usSize > BIG_BUFFER_SIZE)
    {
	if (DEBUGALLOC(usSize, & sel, SEG_NONSHARED))
	{
	    return(NULL);
	}
	pBuffer = MAKEP(sel, 0);
    }
    else if (pFirstBuffer)
    {
#if defined(PMEMTRACE)
	usNumStaticAllocs++;
#endif /* defined(PMEMTRACE) */
	pBuffer = pFirstBuffer;
	bBigBufferInUse = TRUE;
    }
    else
    {
#if defined(PMEMTRACE)
	usNumStaticAllocs++;
#endif /* defined(PMEMTRACE) */
	if (!MAllocMem(BIG_BUFFER_SIZE, & pFirstBuffer))
	{
	    return(NULL);
	}
	pBuffer = pFirstBuffer;
	bBigBufferInUse = TRUE;
    }

    return (pBuffer);

}
コード例 #20
0
ファイル: pbios.c プロジェクト: mingpen/OpenNT
USHORT MNetBiosEnum (
    const CHAR FAR *  pszServer,
    SHORT	      Level,
    CHAR       FAR ** ppBuffer,
    USHORT     FAR *  pcEntriesRead ) {

    USHORT	      usReturnCode,
		      cbTotalAvail;
    SEL 	      sel;

    // get a 4K buffer
    *ppBuffer = MGetBuffer(BIG_BUFFER_SIZE);
    if (*ppBuffer == NULL)
    {
	return(ERROR_NOT_ENOUGH_MEMORY);
    }

    usReturnCode = NetBiosEnum(pszServer, Level, *ppBuffer, BIG_BUFFER_SIZE,
	    pcEntriesRead, & cbTotalAvail);

    // is there more data? if so, allocate a big enough buffer to get it
    if(usReturnCode == ERROR_MORE_DATA || usReturnCode == NERR_BufTooSmall) {
	NetApiBufferFree(*ppBuffer);

	if (DEBUGALLOC(FULL_SEG_BUFFER_SIZE, & sel, SEG_NONSHARED))
	{
	    return(ERROR_NOT_ENOUGH_MEMORY);
	}
	*ppBuffer = MAKEP(sel, 0);
	usReturnCode = NetBiosEnum(pszServer, Level, *ppBuffer, FULL_SEG_BUFFER_SIZE,
	    pcEntriesRead, & cbTotalAvail);

    }

    return (usReturnCode);

}
コード例 #21
0
ファイル: diskinf2.c プロジェクト: OS2World/DRV-FAT32
BOOL DumpDirectory(PDRIVEINFO pDrive, ULONG ulDirCluster, PSZ pszPath)
{
static BYTE szLongName[512];
int iIndex;
PDIRENTRY pDir;
PBYTE pbCluster;
PBYTE pbPath;
USHORT usClusters;
ULONG ulCluster;
ULONG ulBytesNeeded;
BYTE _huge * p;
PDIRENTRY pEnd;
BYTE bCheckSum, bCheck;
ULONG ulClustersNeeded;
ULONG ulClustersUsed;
ULONG ulEntries;
static BYTE szShortName[13];


   if (!ulDirCluster)
      {
      printf("ERROR: Cluster for %s is 0!\n", pszPath);
      return TRUE;
      }

   if (ulDirCluster == pDrive->bpb.RootDirStrtClus)
      {
      PULONG pulCluster;
      ReadFATSector(pDrive, 0);
      pulCluster = (PULONG)pDrive->pbFATSector;
      printf("MEDIA BYTES in FAT: %8.8lX\n",
         *pulCluster);

      pulCluster = (PULONG)pDrive->pbFATSector + 1;
      printf("DiskStatus: %8.8lX\n",
         *pulCluster);
//      vDumpSector(pDrive->pbFATSector);
      }

   //pDrive->ulTotalDirs++;

   pbPath = malloc(512);
   usClusters = GetClusterCount(pDrive, ulDirCluster);
   ulTotalClusters += usClusters;

   if (fDetailed > 2)
      printf("\n\nDirectory of %s (%u clusters)\n\n", pszPath, usClusters);

   ulBytesNeeded = (ULONG)pDrive->bpb.SectorsPerCluster * (ULONG)pDrive->bpb.BytesPerSector * usClusters;
   pbCluster = calloc(usClusters, pDrive->bpb.SectorsPerCluster * pDrive->bpb.BytesPerSector);
   if (!pbCluster)
      {
      printf("ERROR:Not enough memory!\n");
      return FALSE;
      }

   ulCluster = ulDirCluster;
   p = pbCluster;
   while (ulCluster != FAT_EOF)
      {
      ReadCluster(pDrive, ulCluster);
      memcpy(p, pDrive->pbCluster, pDrive->bpb.SectorsPerCluster * pDrive->bpb.BytesPerSector);
      ulCluster = GetNextCluster(pDrive, ulCluster);
      p += pDrive->bpb.SectorsPerCluster * pDrive->bpb.BytesPerSector;
      }

   memset(szLongName, 0, sizeof szLongName);
   pDir = (PDIRENTRY)pbCluster;
   pEnd = (PDIRENTRY)(pbCluster + ulBytesNeeded - sizeof (DIRENTRY));
   ulEntries = 0;
   bCheck = 0;
   while (pDir <= pEnd)
      {
      if (fDetailed > 3)
         {
         ULONG ulOffset = (PBYTE)pDir - pbCluster;
         if (ulOffset && !(ulOffset % 4096))
            printf("-------- NEXT CLUSTER ----------\n");
         }
      if (pDir->bFileName[0] && pDir->bFileName[0] != 0xE5)
         {
         if (pDir->bAttr == FILE_LONGNAME)
            {
            if (fDetailed > 3)
               {
               printf("(longname)\n");
               vDumpDirEntry(pDir);
               }
            if (strlen(szLongName) && bCheck != pDir->bReserved)
               {
               printf("A lost long filename was found: %s\n",
                  szLongName);
               memset(szLongName, 0, sizeof szLongName);
               }
            bCheck = pDir->bReserved;
            fGetLongName(pDir, szLongName, sizeof szLongName);
            }
         else 
            {
            bCheckSum = 0;
            for (iIndex = 0; iIndex < 11; iIndex++)
               {
               if (bCheckSum & 0x01)
                  {
                  bCheckSum >>=1;
                  bCheckSum |= 0x80;
                  }
               else
                  bCheckSum >>=1;
               bCheckSum += pDir->bFileName[iIndex];
               }
            if (strlen(szLongName) && bCheck != bCheckSum)
               {
               printf("The longname %s does not belong to %s\\%s\n",
                  szLongName, pszPath, MakeName(pDir, szShortName, sizeof szShortName));
               memset(szLongName, 0, sizeof szLongName);
               }

            if (fDetailed > 2)
               {
               printf("%-8.8s.%-3.3s %2.2X ",
                  pDir->bFileName,
                  pDir->bExtention,
                  pDir->bAttr);
               if (pDir->bAttr & FILE_DIRECTORY)
                  printf("<DIR>      ");
               else
                  printf("%10lu ", pDir->ulFileSize);

               printf("%8.8lX ", MAKEP(pDir->wClusterHigh, pDir->wCluster));
               if (pDir->fEAS)
                  printf("%2.2X ", pDir->fEAS);
               else
                  printf("   ");

               printf("%s\n", szLongName);
               }
            if (!(pDir->bAttr & FILE_DIRECTORY))
               {

               ulClustersNeeded = pDir->ulFileSize / pDrive->usClusterSize +
                  (pDir->ulFileSize % pDrive->usClusterSize ? 1:0);
               ulClustersUsed = GetClusterCount(pDrive,(ULONG)pDir->wClusterHigh * 0x10000 + pDir->wCluster);
               ulTotalClusters += ulClustersUsed;
               if (ulClustersNeeded != ulClustersUsed)
                  {
                  printf("File allocation error detected for %s\\%s\n",
                     pszPath, MakeName(pDir, szShortName, sizeof szShortName));
                  printf("%lu clusters needed, %lu clusters allocated\n",
                     ulClustersNeeded, ulClustersUsed);
                  }
               }
            memset(szLongName, 0, sizeof szLongName);
            }
         ulEntries++;
         }
コード例 #22
0
ファイル: usbinit.c プロジェクト: fatso83/casio-wmp1
/************************ END OF SPECIFICATIONS ***********************/
void USBInit( RPH FAR *pRP )
{
   PRPINITOUT      pRPO;          /* output request packet far pointer */
   PRPINITIN       pRPI;          /* input request packet far pointer */
   UINT            ctrlID;
   KeyData         keyData[3]={"V",CFSTR_TYPE_DEC,0,0,
      "REQ:",CFSTR_TYPE_STRING,0,0,
      "I13",CFSTR_TYPE_DEC,0,0}; // 31/05/1999 MB
   PSZ             cmdLine;
   ULONG           cmdRStatus, errColumn;
   USHORT          cmdRc;

#ifdef   DEBUG
   dsPrint(DBG_HLVLFLOW, "USBD: USBInit started\r\n");
#endif

   pRP->Status = STATUS_DONE;
   if (ghDriver) // initialization already passed
      return;

   pRPI = (PRPINITIN) pRP;
   pRPO = (PRPINITOUT) pRP;

   Device_Help = ((PRPINITIN)pRP)->DevHlpEP;  /* save devhlp entry point */

   // process CONFIG.SYS BASEDEV= line parameters
   cmdLine=(PSZ) MAKEP( SELECTOROF(pRPI->InitArgs),
                        OFFSETOF(((PDDD_PARM_LIST)pRPI->InitArgs)->cmd_line_args) );
   cmdRStatus=ProcessConfigString(cmdLine, sizeof(keyData)/sizeof(keyData[0]), (KeyData FAR *)&keyData);
   cmdRc=LOUSHORT(cmdRStatus); errColumn=(ULONG)HIUSHORT(cmdRStatus);
   switch (cmdRc)  // set cmd line processing errors
   {
   case CFSTR_UNKWN_KEYS:
      SetLongValue( gVMessages[INIT_MESSAGE_UNKNOWNKWD], errColumn );
      gMessageCount=AddToMsgArray( gMessageIDs, INIT_MESSAGE_UNKNOWNKWD, gMessageCount, MAX_INIT_MESSAGE_COUNT );
      break;
   case CFSTR_CONVERR:
      SetLongValue( gVMessages[INIT_MESSAGE_INVNUMERIC], errColumn );
      gMessageCount=AddToMsgArray( gMessageIDs, INIT_MESSAGE_INVNUMERIC, gMessageCount, MAX_INIT_MESSAGE_COUNT );
      break;
   default:
      break;
   }
   if (keyData[1].value &&  // check for HCD layer drivers
       !CheckHCDDriversLoaded( cmdLine, LOUSHORT(keyData[1].value), HIUSHORT(keyData[1].value) ))
   {
      pRP->Status = STATUS_DONE | STERR | ERROR_I24_QUIET_INIT_FAIL; // 05/16/2000 MB - exit code changed to quiet exit code
      gMessageCount=AddToMsgArray( gMessageIDs, INIT_MESSAGE_NO_HCD, gMessageCount, MAX_INIT_MESSAGE_COUNT );
   }
   gVerbose= keyData[0].keyStatus!=CFSTR_STATUS_NOTFOUND;

   gDelayHostStart = keyData[2].keyStatus!=CFSTR_STATUS_NOTFOUND; // 31/05/1999 MB
   if(gDelayHostStart && (pRP->Status == STATUS_DONE) )  // 05/16/2000 MB - fixed error code processing
   {
      USHORT         ctxOffset;  
      USHORT         rc;

      ctxOffset=(USHORT)(LONG)(StartHostCtxHookRtn); // IRQ processing thread
      rc = DevHelp_AllocateCtxHook((NPFN)ctxOffset, &gStartHostHookHandle);

      if (rc)
      {
         pRP->Status = STATUS_DONE | STERR | STATUS_ERR_UNKCMD;
         gMessageCount=AddToMsgArray( gMessageIDs, INIT_MESSAGE_SETCTXFAILED, gMessageCount, MAX_INIT_MESSAGE_COUNT );
#ifdef DEBUG
      dsPrint(DBG_CRITICAL, " USBD: USBDInit failed to allocate CTX hook routine\r\n");
#endif
      }
   }

   /*---------------------------------------------------*/
   /* Register device driver with resource manager      */
   /*---------------------------------------------------*/
   if (pRP->Status == STATUS_DONE)
      RegisterUSBD();

   if (pRP->Status == STATUS_DONE)
   {
      //	initialize local structures
      setmem((PSZ)&gHostControllers,0,sizeof(gHostControllers));
      setmem((PSZ)&gClassDrivers,0,sizeof(gClassDrivers));
      setmem((PSZ)&gDevices,0,sizeof(gDevices));
      setmem((PSZ)&gHubs,0,sizeof(gHubs));
      for (ctrlID=1; ctrlID<gMaxControllers; ctrlID++)
      {
         gSetAddress[ctrlID]=gSetAddress[0];
         gSetConfiguration[ctrlID]=gSetConfiguration[0];
         gDeviceStruct[ctrlID]=gDeviceStruct[0];
         gGetConfiguration[ctrlID]=gGetConfiguration[0];
         gGetHubConfigurationLength[ctrlID]=gGetHubConfigurationLength[0];
      }
   }

   if (pRP->Status == STATUS_DONE)
   {
      SetLongValue( gVMessages[INIT_MESSAGE_LOADED], (ULONG)gDriverStruct.MajorVer );   
      SetLongValue( gVMessages[INIT_MESSAGE_LOADED], (ULONG)gDriverStruct.MinorVer );   
      gMessageCount=AddToMsgArray( gMessageIDs, INIT_MESSAGE_LOADED, gMessageCount, MAX_INIT_MESSAGE_COUNT );
      pRPO->CodeEnd = ((USHORT) &USBInit) - 1;         /* set end of code segment */
      pRPO->DataEnd = ((USHORT) &gInitDataStart) - 1;  /* set end of data segment */
   }
   else
   {
      pRPO->CodeEnd = 0;          /* set end of code segment */
      pRPO->DataEnd = 0;       /* set end of data segment */
   }

   TTYWrite(gVMessages, gMessageIDs, gMessageCount);

#ifdef   DEBUG
   dsPrint1(DBG_HLVLFLOW, "USBD: USBInit ended. Status %x\r\n", pRP->Status);
#endif
   return;
}
コード例 #23
0
ファイル: joyinit.c プロジェクト: OS2World/DRV-USBLib
void JOYInit()
{
   KeyData keyData[2] = {"V",       CFSTR_TYPE_DEC, 0, 0,
      "DEVICE:", CFSTR_TYPE_DEC, 0, 0};
   PSZ    kbdCmdLine;
   ULONG  cmdRStatus, errColumn;
   USHORT cmdRc, i;

#ifdef DEBUG
   dsPrint (DBG_HLVLFLOW, "USBJOY: Init Entry\r\n");
#endif

   pRP->Status = STATUS_DONE;

   if (ghDriver)
     return;  // initialization already passed
   Device_Help = ((PRPINITIN)pRP)->DevHlpEP; // save DevHlp Entry Point

   kbdCmdLine = (PSZ)MAKEP (SELECTOROF (((PRPINITIN)pRP)->InitArgs),
                            OFFSETOF   (((PRPINITIN)pRP)->InitArgs));
   cmdRStatus = ProcessConfigString (kbdCmdLine, 2, (KeyData FAR *)&keyData);
   cmdRc      = LOUSHORT (cmdRStatus);
   errColumn  = (ULONG)HIUSHORT (cmdRStatus);

   switch (cmdRc)
   {
     case CFSTR_UNKWN_KEYS:
        SetLongValue (gVMessages[INIT_MESSAGE_UNKNOWNKWD], errColumn);
        gMessageCount = AddToMsgArray (gMessageIDs, INIT_MESSAGE_UNKNOWNKWD, gMessageCount, MAX_INIT_MESSAGE_COUNT);
      break;
     case CFSTR_CONVERR:
       SetLongValue (gVMessages[INIT_MESSAGE_INVNUMERIC], errColumn );
       gMessageCount = AddToMsgArray (gMessageIDs, INIT_MESSAGE_INVNUMERIC, gMessageCount, MAX_INIT_MESSAGE_COUNT);
   }

   gVerbose   = (BYTE)(keyData[0].keyStatus != CFSTR_STATUS_NOTFOUND);
   if (keyData[1].keyStatus == CFSTR_STATUS_OK)
      gDevice = (keyData[1].value < MAX_JOYS)? (BYTE)keyData[1].value : (BYTE)NULL;
   else gDevice = NULL;

   if (DevHelp_AttachDD ("USBHID$ ", (NPBYTE)&gIDCTable)) // obtain USBHID's IDC entry point
   {
      pRP->Status |= STERR;
      gMessageCount = AddToMsgArray (gMessageIDs, INIT_MESSAGE_NO_HID, gMessageCount, MAX_INIT_MESSAGE_COUNT);
      #ifdef DEBUG
         dsPrint (DBG_HLVLFLOW, "USBJOY: Init Faild to Attach to USBHID$ \r\n");
      #endif
   }
   else
   {
     gpHIDIDC  = (PUSBIDCEntry)gIDCTable.ProtIDCEntry;
     gdsHIDIDC = gIDCTable.ProtIDC_DS;
   }

   if (pRP->Status == STATUS_DONE)
   {
      RegisterJOY();                                              // register driver with RM

      gNoOfJOYs = 0;
      for (i = 0; i < MAX_JOYS; i++)
        gJOY[i].active = 0;

      ((PRPINITOUT)pRP)->CodeEnd = ((USHORT)&JOYInit);        // set end of code segment
      ((PRPINITOUT)pRP)->DataEnd = ((USHORT)&gInitDataStart); // set end of data segment
      SetLongValue (gVMessages[INIT_MESSAGE_LOADED], (ULONG)gDriverStruct.MajorVer);
      SetLongValue (gVMessages[INIT_MESSAGE_LOADED], (ULONG)gDriverStruct.MinorVer);
      SetLongValue (gVMessages[INIT_MESSAGE_LOADED], (ULONG)gDevice);
      gMessageCount = AddToMsgArray (gMessageIDs, INIT_MESSAGE_LOADED, gMessageCount, MAX_INIT_MESSAGE_COUNT);
   }
   else
   {
      ((PRPINITOUT)pRP)->CodeEnd = 0;
      ((PRPINITOUT)pRP)->DataEnd = 0;
   }
   if (gVerbose) TTYWrite (gVMessages, gMessageIDs, gMessageCount);

#ifdef DEBUG
   dsPrint1 (DBG_HLVLFLOW, "USBJOY: Init Status = %x\r\n", pRP->Status);
#endif
   return;
}
コード例 #24
0
USHORT NEAR ActivateMode( USHORT ReqHandle, USHORT MACMode, USHORT MACDS )
{
   PMODULE pModule = MAKEP(MACDS,0);

   return ANDIS_RC_SUCCESS;
}
コード例 #25
0
USHORT NEAR ResetPort( USHORT ReqHandle, USHORT ResetType, USHORT MACDS )
{
   PMODULE pModule = MAKEP(MACDS,0);

   return ANDIS_RC_SUCCESS;
}
コード例 #26
0
ファイル: RESIRQ.C プロジェクト: OS2World/DRV-USBLib
static void DataRW (PRP_GENIOCTL pRP)
{
  USBRB  FAR *pRB  = (USBRB FAR *)pRP->ParmPacket;
  USHORT usToggleGrp =  (pRB->flags &USRB_FLAGS_TTYPE_IN)?0:1;
  PUSB_IORB  pIoRB = (PUSB_IORB)pRB->requestData2;
  USHORT rc;
  UCHAR  ucEndpoint  = pRB->endPointId &DEV_ENDPT_ADDRMASK;
  USHORT usToggleBit = 1<< ucEndpoint;
  PLIBUSB_BULK_REQ pBulkReq;

#ifdef DEBUG
  dsPrint2 ( DBG_DETAILED, 
            "USBRESMGR: DataRW to Device[%x], L=%x\r\n",
            pIoRB->pDevice, pRB->buffer1Length);
  dsPrint4 ( DBG_IRQFLOW,
             "USBRESMGR: Endpoint %d Toggle Group %d, Value %0x UpdateBit %0x\r\n",
             pRB->endPointId &DEV_ENDPT_ADDRMASK,
             usToggleGrp,
             pIoRB->pDevice->wToggle[usToggleGrp],
             usToggleBit);
#endif
  // Safty check that the RB wasn't freed and re used while the USB transaction was done
  if (pIoRB->ulID != pRB->requestData3)
  {
    DevHelp_Beep(2200,200);
    return;
  }

  if(DevHelp_PhysToGDTSelector(pIoRB->pPhys,
	                           sizeof(LIBUSB_BULK_REQ),
	                           gSelIoRB[SEL_BULK]))
  {
    DevHelp_Beep(4400,500);
    DevHelp_UnLock(pIoRB->ulLockData);
    DevHelp_UnLock(pIoRB->ulLockParam);
    if(DevHelp_OpenEventSem (pIoRB->ulEventDone) == 0)  
    {
      DevHelp_PostEventSem (pIoRB->ulEventDone);
      DevHelp_CloseEventSem (pIoRB->ulEventDone);
    }
    FreeIoRB(pIoRB);
    return;
  }

  pBulkReq = MAKEP(gSelIoRB[SEL_BULK], NULL);

  if (pRP->rph.Status == USB_IDC_RC_IOFAILED)
  {
    DevHelp_Beep(440,500);
    #ifdef DEBUG
      dsPrint1 (DBG_DETAILED, "USBRESMGR: IO failed Status = %d\r\n",
                pRB->status);
    #endif
    if (pRB->status & USRB_STATUS_STALLED)
    {
      ClearStalled (pIoRB->pDevice, ucEndpoint);
      pIoRB->pDevice->wToggle[usToggleGrp]  |= usToggleBit;
      pBulkReq->usStatus = USB_IORB_STALLED;
    }
    else
      pBulkReq->usStatus = USB_IORB_FAILED;

    DevHelp_UnLock(pIoRB->ulLockData);
    DevHelp_UnLock(pIoRB->ulLockParam);
    if(DevHelp_OpenEventSem (pIoRB->ulEventDone) == 0)  
    {
      DevHelp_PostEventSem (pIoRB->ulEventDone);
      DevHelp_CloseEventSem (pIoRB->ulEventDone);
    }
    FreeIoRB(pIoRB);

  }
  else
  {
    // No I/O Errors
    if (! (pRB->flags & USRB_FLAGS_DET_DTGGLEON))
    {
      #ifdef DEBUG
        dsPrint (DBG_DETAILED, "USBRESMGR: Set Toggle Bit\r\n");
      #endif
      pIoRB->pDevice->wToggle[usToggleGrp]  |= usToggleBit;
    }
    else
    {
      #ifdef DEBUG
        dsPrint (DBG_DETAILED, "USBRESMGR: Clear Toggle Bit\r\n");
      #endif
      pIoRB->pDevice->wToggle[usToggleGrp]  &= ~usToggleBit;
    }
    #ifdef DEBUG
      dsPrint1 ( DBG_DETAILED, "USBRESMGR: New Toggle Value %0x\r\n",
                 pIoRB->pDevice->wToggle[usToggleGrp] );
    #endif
    pBulkReq->usDataProcessed = pBulkReq->usDataProcessed + pRB->buffer1Length;
    pBulkReq->usDataRemain    = pBulkReq->usDataRemain - pRB->buffer1Length;
    pIoRB->usDataProcessed = pBulkReq->usDataProcessed;
    pIoRB->usDataRemain = pBulkReq->usDataRemain;
    #ifdef DEBUG
      dsPrint3 ( DBG_DETAILED, "USBRESMGR: Processed %d bytes, remaining %d (buffersize %d)\r\n",
                 pBulkReq->usDataProcessed, pBulkReq->usDataRemain, pRB->buffer1Length );
    #endif
    if(pBulkReq->usDataRemain)
    {
      #ifdef DEBUG
        dsPrint (DBG_DETAILED, "USBRESMGR: Next Buffer\r\n");
      #endif
      ProcessIoRB(pIoRB);
    }
    else
    {
      #ifdef DEBUG
        dsPrint (DBG_DETAILED, "USBRESMGR: Done\r\n");
      #endif
      pBulkReq->usStatus = USB_IORB_DONE;
      DevHelp_UnLock(pIoRB->ulLockData);
      DevHelp_UnLock(pIoRB->ulLockParam);
      if(DevHelp_OpenEventSem (pIoRB->ulEventDone) == 0)  
      {
        DevHelp_PostEventSem (pIoRB->ulEventDone);
        DevHelp_CloseEventSem (pIoRB->ulEventDone);
      }
      else
      {
        #ifdef DEBUG
          dsPrint (DBG_DETAILED, "USBRESMGR: Open Semaphore failed\r\n");
        #endif
      }
      FreeIoRB(pIoRB);
    }
  }
  
}
コード例 #27
0
ファイル: RESIRQ.C プロジェクト: OS2World/DRV-USBLib
static void IrqRW (PRP_GENIOCTL pRP)
{
  USBRB  FAR *pRB    = (USBRB FAR *)pRP->ParmPacket;
  USHORT usToggleGrp = (pRB->flags &USRB_FLAGS_TTYPE_IN)?0:1;
  PUSB_IORB  pIoRB   = (PUSB_IORB)pRB->requestData2;
  USHORT rc;
  UCHAR  ucEndpoint  = pRB->endPointId &DEV_ENDPT_ADDRMASK;
  USHORT usToggleBit = 1<< ucEndpoint;
  PLIBUSB_IRQ_DATA pIrqData;

#ifdef DEBUG
  dsPrint2 ( DBG_DETAILED, 
            "USBRESMGR: IrqRW to Device[%x], L=%x\r\n",
            pIoRB->pDevice, pRB->buffer1Length);
  dsPrint4 ( DBG_IRQFLOW,
             "USBRESMGR: Endpoint %d Toggle Group %d, Value %0x UpdateBit %0x\r\n",
             pRB->endPointId &DEV_ENDPT_ADDRMASK,
             usToggleGrp,
             pIoRB->pDevice->wToggle[usToggleGrp],
             usToggleBit);
#endif
  // Safty check that the RB wasn't freed and re used while the USB transaction was done
  if (pIoRB->ulID != pRB->requestData3)
  {
    return;
  }

  if(DevHelp_PhysToGDTSelector(pIoRB->pPhysData,
	                           sizeof(LIBUSB_BULK_REQ),
	                           gSelIoRB[SEL_IRQ]))
  {
    DevHelp_Beep(4400,500);
    DevHelp_UnLock(pIoRB->ulLockData);
    DevHelp_UnLock(pIoRB->ulLockParam);
    if(DevHelp_OpenEventSem (pIoRB->ulEventDone) == 0)  
    {
      DevHelp_PostEventSem (pIoRB->ulEventDone);
      DevHelp_CloseEventSem (pIoRB->ulEventDone);
    }
    FreeIoRB(pIoRB);
    return;
  }

  pIrqData = MAKEP(gSelIoRB[SEL_BULK], NULL);

  if (pRP->rph.Status == USB_IDC_RC_IOFAILED)
  {
    DevHelp_Beep(440,500);
    #ifdef DEBUG
      dsPrint1 (DBG_DETAILED, "USBRESMGR: IO failed Status = %d\r\n",
                pRB->status);
    #endif
    if (pRB->status & USRB_STATUS_STALLED)
    {
      ClearStalled (pIoRB->pDevice, ucEndpoint);
      pIoRB->pDevice->wToggle[usToggleGrp]  |= usToggleBit;
      pIrqData->usStatus = USB_IORB_STALLED;
    }
    else
      pIrqData->usStatus = USB_IORB_FAILED;

    DevHelp_UnLock(pIoRB->ulLockData);
    DevHelp_UnLock(pIoRB->ulLockParam);
    if(DevHelp_OpenEventSem (pIoRB->ulEventDone) == 0)  
    {
      DevHelp_PostEventSem (pIoRB->ulEventDone);
      DevHelp_CloseEventSem (pIoRB->ulEventDone);
    }
    FreeIoRB(pIoRB);

  }
  else
  {
    // No I/O Errors
    BOOL fChanged=FALSE;
    UCHAR i;

    if (! (pRB->flags & USRB_FLAGS_DET_DTGGLEON))
    {
      #ifdef DEBUG
        dsPrint (DBG_DETAILED, "USBRESMGR: Set Toggle Bit\r\n");
      #endif
      pIoRB->pDevice->wToggle[usToggleGrp]  |= usToggleBit;
    }
    else
    {
      #ifdef DEBUG
        dsPrint (DBG_DETAILED, "USBRESMGR: Clear Toggle Bit\r\n");
      #endif
      pIoRB->pDevice->wToggle[usToggleGrp]  &= ~usToggleBit;
    }
    #ifdef DEBUG
      dsPrint1 ( DBG_DETAILED, "USBRESMGR: New Toggle Value %0x\r\n",
                 pIoRB->pDevice->wToggle[usToggleGrp] );
    #endif
    
    for(i = 0; i < pRB->buffer1Length; i++)
    {
      if(pIrqData->ucBufferCurrent[i] != pIrqData->ucBufferLast[i])
        fChanged = TRUE;
      pIrqData->ucBufferCurrent[i] = pIrqData->ucBufferLast[i];
    }
    if(fChanged || pIrqData->usRes==0)
    {
      pIrqData->usRes = 1;
      if(DevHelp_OpenEventSem (pIrqData->ulEventChanged) == 0)  
      {
        DevHelp_PostEventSem (pIrqData->ulEventChanged);
        DevHelp_CloseEventSem (pIrqData->ulEventChanged);
      }
    }
    #ifdef DEBUG
      dsPrint (DBG_DETAILED, "USBRESMGR: Next Buffer\r\n");
    #endif
    ProcessIoRB(pIoRB);
  }
}
コード例 #28
0
USHORT NEAR ReleaseNullDLC( USHORT ReqHandle, USHORT PortID, USHORT MACDS )
{
   PMODULE pModule = MAKEP(MACDS,0);

   return ANDIS_RC_SUCCESS;
}
コード例 #29
0
ファイル: cells.c プロジェクト: OS2World/DEV-SAMPLES-vgalib
main() {
printf("Cells - A Cellular Automata Demo for OS/2 2.0  \n");
printf("        By John E. Stone                       \n");
printf("For comments send E-Mail to: [email protected]  \n");
printf("\n\n\n\n\n");
printf("The number of states is how many different colors\n");
printf("a pixel can take on.  The larger the number of states\n");
printf("the longer it takes to complete, and it may even become\n");
printf("stagnant with more than 20 states.\n\n");
printf("\nProcess ID=%d\n",getpid());
printf("Would you like cells to continue processing when it\n");
printf("isn't visible on the screen? (1=no, 0=yes)                 \n");
scanf("%u",&VWAIT);
if ((VWAIT<0) || (VWAIT>1)) VWAIT=0;

printf("\n\nEnter the number of states in the system: (5-25) \n");
scanf("%d",&temp2);
st=10;
srand(getpid());

if ((temp2>4) || (temp2<26)) { st=temp2; }


/* setup for graphics mode */
phys.pBuf=(unsigned char *) 0xA0000;
phys.cb=65536;

moda.cb=12;
moda.fbType=3;
moda.color=8;
moda.row=25;
moda.col=40;
moda.hres=320;
moda.vres=200;

VioGetMode(&orig, HANDLE);
VioSetMode(&moda, HANDLE);
VioGetPhysBuf(&phys, 0);
ptr0=MAKEP(phys.asel[0], 0);
VioScrLock(1, &status, HANDLE); /* Wait for exclusive screenlock */

cls(ptr0,0);

for (i=0; i<=xs; i++) {
  for (j=0; j<=ys; j++) {
         nz[i][j]=(char) rand() % st;
         oz[i][j]=nz[i][j];
  }
}
numchange=1;

while ((kbhit()==0) && (numchange>0)) {
numchange=0;
for (i=0; i<=xs; i++) {
  for (j=0; j<=ys; j++) {
    for (x=0; x<=3; x++)  {
             k=(i+nx[x]+xc) % xc;
             l=(j+ny[x]+yc) % yc;
             if (oz[k][l]==((oz[i][j]+1) % st)) {
                 nz[i][j]=(oz[k][l] % st);
		 numchange++;
	     }
    }
  }
}

memcpy(oz,nz,sizeof(nz));
VioScrLock(VWAIT,&status,HANDLE);
if (!status) {
for (i=0; i<VRES; i++) {
  for (j=0; j<HRES; j++) {
    temp=COLORSET+nz[j][i];
    putpixel(ptr0,j,i,temp);
  }
}
}

VioScrUnLock(HANDLE);
}

VioScrLock(WAIT,&status,HANDLE);
cls(ptr0,0);

VioScrUnLock(HANDLE);

} /* end of cells.c */
コード例 #30
0
ファイル: ea_mgr.c プロジェクト: OPSF/uClinux
int set_ea(char FAR *i_eas, char *name)
{
 #ifdef HAVE_EAS
  int rc=0;
  char FAR *eas;
  unsigned int i, total;
  #if TARGET==OS2
   #ifdef __32BIT__
    FILESTATUS4 fs;
    EAOP2 eaop;
    char FAR *real_pfeal;
    PFEA2LIST pfeal;
    PFEA2 pf, opf;
   #else
    EAOP eaop;
    PFEALIST pfeal;
    PFEA pf;
    FILESTATUS2 fs;
    SEL selector;
   #endif
  #elif TARGET==WIN32
   PFEALIST pfeal0, pfeal;
   PFEA pf;
   struct nt_sid *sid;
   unsigned char *pstreambuf, *streambuf;
   WIN32_STREAM_ID w32sid;
   unsigned long stream_len;
  #endif

  eas=i_eas;
  if(discard_ea(name))
   return(-1);
  if((total=mget_word(eas))==0)
   return(0);
  #if TARGET==OS2
   #ifdef __32BIT__
    /* This takes the 4-byte prefixes into account (are the V1.2 EAs still
       valid if they flow beyond 64K when the oNextEntryOffset is applied?).
       Also, we ensure that it is aligned properly. In theory, there may be
       a way to crash this (72K doesn't consider the multitude of EAs) but we
       don't know/care about it -- ASR 17/10/2000 */
    real_pfeal=(char FAR *)farmalloc_msg(73728);
    pfeal=(PFEA2LIST)align_dword(real_pfeal);
    eaop.fpFEA2List=pfeal;
   #else
    if(DosAllocSeg(65535U, &selector, SEG_NONSHARED))
     return(-1);
    pfeal=(PFEALIST)MAKEP(selector, 0);
    eaop.fpFEAList=pfeal;
   #endif
  #elif TARGET==WIN32
   pstreambuf=(char *)farmalloc_msg(65536+260*total);
   pfeal=pfeal0=(PFEALIST)(streambuf=align_dword(pstreambuf));
  #endif
  eas+=2;
  pf=&pfeal->list[0];
  for(i=0; i<total; i++)
  {
   #if TARGET==OS2&&defined(__32BIT__)
    opf=pf;
   #endif
   #if TARGET==WIN32
    pf=&pfeal->list[0];
   #endif
   pf->fEA=mget_byte(eas++);
   pf->cbName=mget_byte(eas++);
   pf->cbValue=mget_word(eas);
   eas+=2;
   #if TARGET==OS2&&defined(__32BIT__)
     far_memmove((char FAR *)pf+sizeof(FEA2)-1, eas, pf->cbName);
     *((char FAR *)pf+sizeof(FEA2)-1+pf->cbName)='\0';
   #else /* Win32 or OS/2-16 */
     far_memmove((char FAR *)pf+sizeof(FEA), eas, pf->cbName);
     *((char FAR *)pf+sizeof(FEA)+pf->cbName)='\0';
   #endif
   eas+=pf->cbName;
   #if TARGET==OS2&&defined(__32BIT__)
    far_memmove((char FAR *)pf+sizeof(FEA2)+pf->cbName, eas, pf->cbValue);
   #else /* Win32 or OS/2-16 */
    far_memmove((char FAR *)pf+sizeof(FEA)+pf->cbName+1, eas, pf->cbValue);
   #endif
   eas+=pf->cbValue;
   #if SFX_LEVEL>=ARJ
    #if TARGET==OS2&&defined(__32BIT__)
     if(ea_filter((char FAR *)pf+sizeof(FEA2), 0)&&((pf->fEA&FEA_NEEDEA)||!crit_eas))
    #else /* Win32 or OS/2-16 */
     if(ea_filter((char FAR *)pf+sizeof(FEA), 0)&&((pf->fEA&FEA_NEEDEA)||!crit_eas))
    #endif
   #endif
   /* Update the offsets */
   #if TARGET==OS2
    #ifdef __32BIT__
     pf=(PFEA2)((char FAR *)pf+sizeof(FEA2)+pf->cbName+pf->cbValue);
    #else
     pf=(PFEA)((char FAR *)pf+sizeof(FEA)+pf->cbName+1+pf->cbValue);
    #endif
    /* Align at DWORD boundary and issue the list fixups */
    #ifdef __32BIT__
     pf=(PFEA2)align_dword((char FAR *)pf);
     opf->oNextEntryOffset=(i+1==total)?0:(char FAR *)pf-(char FAR *)opf;
    #endif
   #elif TARGET==WIN32
    pfeal=(PFEALIST)((char FAR *)pfeal+sizeof(FEALIST)+pf->cbName+1+pf->cbValue);
    if(i<total-1)
     pfeal=(PFEALIST)align_dword((char FAR*)pfeal);
    pfeal0->cbList=(i==total-1)?
                   0:
                   (((char FAR *)pfeal)-((char FAR *)pfeal0));
    pfeal0=pfeal;
   #endif
  }
  #if TARGET==OS2
   pfeal->cbList=(char FAR *)pf-(char FAR *)pfeal;
   #ifdef __32BIT__
    rc=DosSetPathInfo((PSZ)name, FIL_QUERYEASIZE, (PBYTE)&eaop, sizeof(eaop), 0);
    farfree(real_pfeal);
   #else
    rc=DosSetPathInfo((PSZ)name, FIL_QUERYEASIZE, (PBYTE)&eaop, sizeof(eaop), 0, 0L);
    DosFreeSeg(selector);
   #endif
   if(!rc)
   {
    #ifdef __32BIT__
     if(DosQueryPathInfo(name, FIL_QUERYEASIZE, (PVOID)&fs, sizeof(fs)))
    #else
     if(DosQPathInfo(name, FIL_QUERYEASIZE, (PVOID)&fs, sizeof(fs), 0L))
    #endif
     rc=-1;
    else
     if(fs.cbList<=4)
      rc=-1;
   }
  #elif TARGET==WIN32
   if((sid=open_streams(name, 1))==NULL)
    rc=-1;
   else
   {
    memset(&w32sid, 0, sizeof(w32sid));
    w32sid.dwStreamId=BACKUP_EA_DATA;
    w32sid.Size.LowPart=stream_len=(((char FAR *)pfeal)-streambuf);
    if(create_stream(&w32sid, sid)||write_stream(streambuf, stream_len, sid)<stream_len)
     rc=-1;
    close_streams(sid);
   }
   free(pstreambuf);
  #endif
  return(rc);
 #else
  return(-1);
 #endif
}