home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_disks / 200-299 / ff204.lzh / PopDir / PopDir.c < prev    next >
C/C++ Source or Header  |  1989-04-30  |  8KB  |  277 lines

  1. /* PopDir v1.4 © Copyright 1989 Jonathan Potter */
  2.  
  3. #include "PopDir.h"
  4.  
  5. main()
  6. {
  7.     struct Gadget *Gadget;
  8.     int GadgetID,whichwin,file,x,y,a;
  9.     int IRQCheck=FALSE;
  10.     IntuitionBase=(struct IntuitionBase *) OpenLibrary("intuition.library",0);
  11.     GfxBase=(struct GfxBase *) OpenLibrary("graphics.library",0);
  12.     finfo=(struct FileInfoBlock *) AllocMem(sizeof(struct FileInfoBlock),MEMF_CHIP|MEMF_CLEAR);
  13.     Window=(struct Window *) OpenWindow(&small);
  14.     whichwin=1;
  15.     (void) SetTaskPri(FindTask((char *) 0), 20);
  16.     for (;;) {
  17.         Wait(1<<Window->UserPort->mp_SigBit);
  18.         while (Msg=GetMsg(Window->UserPort)) {
  19.             ReplyMsg(Msg);
  20.             switch (Msg->Class) {
  21.                 case INACTIVEWINDOW:    
  22.                     med.LeftEdge=Window->LeftEdge;
  23.                     med.TopEdge=Window->TopEdge;
  24.                     small.LeftEdge=Window->LeftEdge;
  25.                     small.TopEdge=Window->TopEdge;
  26.                     CloseWindow(Window);
  27.                     Window=(struct Window *) OpenWindow(&small);
  28.                     whichwin=1;
  29.                     break;
  30.  
  31.                 case CLOSEWINDOW:
  32.                     CloseWindow(Window);
  33.                     if (whichwin==2) {
  34.                         FreeMem(finfo,sizeof(struct FileInfoBlock));
  35.                         CloseLibrary(IntuitionBase);
  36.                         CloseLibrary(GfxBase);
  37.                         OpenWorkBench();
  38.                         exit(0);
  39.                     }
  40.                     Window=(struct Window *) OpenWindow(&med);
  41.                     SetWindowTitles(Window,-1,"PopDir v1.4 © Copyright 1988 Jonathan Potter");
  42.                     whichwin=2;
  43.                     break;
  44.  
  45.                 case GADGETUP:
  46.                     if (whichwin==1) {
  47.                         CloseWindow(Window);
  48.                         Window=(struct Window *) OpenWindow(&med);
  49.                         SetWindowTitles(Window,-1,"PopDir v1.4 © Copyright 1988 Jonathan Potter");
  50.                         whichwin=2;
  51.                         break;
  52.                     }
  53.                     Gadget=(struct Gadget *) Msg->IAddress;
  54.                     GadgetID=Gadget->GadgetID;
  55.                     if (GadgetID>1 && GadgetID<14) {
  56.                         sprintf(dobuffer,Gadget->GadgetText->IText);
  57.                         RefreshGadgets(&StrGad,Window,NULL);
  58.                         break;
  59.                     }
  60.                     else if (GadgetID==14) {
  61.                         if (IRQCheck==FALSE) IRQCheck=TRUE; else IRQCheck=FALSE;
  62.                         break;
  63.                     }
  64.                     whichwin=3;
  65.                     med.LeftEdge=Window->LeftEdge;
  66.                     med.TopEdge=Window->TopEdge;
  67.                     CloseWindow(Window);
  68.                     Window=(struct Window *) OpenWindow(&big);
  69.                     SetWindowTitles(Window,dobuffer,"PopDir v1.4 © Copyright 1988 Jonathan Potter");
  70.                      if ((lock=Lock(dobuffer,ACCESS_READ))==0) {
  71.                         sprintf(ToPrint,"Can't lock requested directory!");
  72.                         PrintIText(Window->RPort,&Files,10,12);
  73.                         sprintf(ToPrint,"Click on Close Gadget to continue");
  74.                         WriteStatus();
  75.                         goto finalquit;
  76.                     }
  77.                     NonExTotal=VirTotal=CleanTotal=KilledTotal=0;
  78.                     Examine(lock,finfo);
  79.                     file=0; y=12; x=10; a=0;
  80.                     if (finfo->fib_DirEntryType<0) {
  81.                         sprintf(ToPrint,"%-30s",finfo->fib_FileName);
  82.                         PrintIText(Window->RPort,&Files,x,y);
  83.                         sprintf(ToPrint,"%-7ld",finfo->fib_Size);
  84.                         PrintIText(Window->RPort,&Files,x+242,y);
  85.                         if (IRQCheck)
  86.                             CheckIRQ(dobuffer,finfo->fib_FileName);
  87.                         sprintf(ToPrint,"Click on Close Gadget to continue");
  88.                         WriteStatus();
  89.                         goto finalquit;;
  90.                     }
  91.                     if (IRQCheck) {
  92.                         if (dobuffer[0]!=0 && dobuffer[1]!=0 &&
  93.                             dobuffer[strlen(dobuffer)-1]!=':' &&
  94.                             dobuffer[strlen(dobuffer)-1]!='/')
  95.                             strcat(dobuffer,"/");
  96.                     }
  97.                     oldlock=CurrentDir(lock);
  98.                     Forbid(); 
  99.                     while ((ExNext(lock,finfo))!=0) {
  100.                         a=1;
  101.                         if (file==0) {
  102.                             sprintf(ToPrint,"Reading directory.. Close gadget to cancel");
  103.                             WriteStatus();
  104.                         }
  105.                         if (Msg=GetMsg(Window->UserPort)) {
  106.                             ReplyMsg(Msg);    
  107.                             if (Msg->Class==CLOSEWINDOW) {
  108.                                 CloseWindow(Window);
  109.                                 Window=(struct Window *) OpenWindow(&med);
  110.                                 SetWindowTitles(Window,-1,"PopDir v1.4 © Copyright 1988 Jonathan Potter");
  111.                                 whichwin=2;
  112.                                 goto quit;
  113.                             }
  114.                         }
  115.                         if (finfo->fib_DirEntryType>0)
  116.                             Files.FrontPen=3;
  117.                         sprintf(ToPrint,"%-30s",finfo->fib_FileName);
  118.                         PrintIText(Window->RPort,&Files,x,y);
  119.                         if (finfo->fib_DirEntryType<0) {
  120.                             sprintf(ToPrint,"%-7ld",finfo->fib_Size);
  121.                             PrintIText(Window->RPort,&Files,x+242,y);
  122.                             if (IRQCheck)
  123.                                 CheckIRQ(dobuffer,finfo->fib_FileName);
  124.                         }
  125.                         Files.FrontPen=1; 
  126.                         if (x==10) x=330;
  127.                         else {
  128.                             x=10;
  129.                             y=y+8;
  130.                         }
  131.                         ++file;
  132.                         if (file>43) {
  133.                             sprintf(ToPrint,"Press any key to continue, or click on Close Gadget to cancel");
  134.                             WriteStatus();
  135.                             Wait(1<<Window->UserPort->mp_SigBit);
  136.                             while (Msg=GetMsg(Window->UserPort)) {    
  137.                                 ReplyMsg(Msg);    
  138.                                 if (Msg->Class==CLOSEWINDOW) {
  139.                                     CloseWindow(Window);
  140.                                     Window=(struct Window *) OpenWindow(&med);
  141.                                     SetWindowTitles(Window,-1,"PopDir v1.4 © Copyright 1988 Jonathan Potter");
  142.                                     whichwin=2;
  143.                                     goto quit;
  144.                                 }
  145.                             }
  146.                             SetAPen(Window->RPort,0);
  147.                             RectFill(Window->RPort,9,10,637,198);
  148.                             file=0; y=12; x=10;
  149.                         }
  150.                     }
  151.                     if (a==0) {
  152.                         sprintf(ToPrint,"Requested directory is empty");
  153.                         PrintIText(Window->RPort,&Files,10,12);
  154.                     }
  155.                     if (IRQCheck)
  156.                         sprintf(ToPrint,"Checked:%d Clean:%d Viruses:%d Killed:%d",
  157.                             NonExTotal+VirTotal+CleanTotal,CleanTotal+NonExTotal,
  158.                             VirTotal,KilledTotal);
  159.                     else sprintf(ToPrint,"Click on close gadget to continue");
  160.                     WriteStatus();
  161.                     quit:
  162.                     Permit();
  163.                     CurrentDir(oldlock);
  164.                     UnLock(lock);
  165.                     finalquit:
  166.                     break;
  167.  
  168.                 default:
  169.                     break;
  170.             }
  171.         }
  172.     }
  173. }
  174.  
  175. CheckIRQ(directory,name)
  176. char *directory;
  177. char *name;
  178. {
  179.     int i=0;
  180.     long hunka,hunkb,hunkc;
  181.     long filebuff[122];
  182.     long inp, *buff, size;
  183.     inp=0; buff=0;
  184.     sprintf(ToPrint,"Checking file \"%s%s\" for IRQ virus...",directory,name);
  185.     WriteStatus();
  186.     if ((inp=Open(name,MODE_OLDFILE))==0) {
  187.         sprintf(ToPrint,"Error! Can't find file \"%s%s\"!",directory,name);
  188.         WriteStatus();
  189.         goto CleanUp;
  190.     }
  191.     Read (inp,(char *)&filebuff[0],487);
  192.     if (filebuff[0]!=0x000003f3) {
  193.         sprintf(ToPrint,"File \"%s%s\" is not executable.",directory,name);
  194.         WriteStatus();
  195.         ++NonExTotal;
  196.         goto CleanUp;
  197.     }
  198.     if (filebuff[5]!=0x00000109) {
  199.         sprintf(ToPrint,"File \"%s%s\" is clean!",directory,name);
  200.         WriteStatus();
  201.         ++CleanTotal;
  202.         goto CleanUp;
  203.     }
  204.     Seek (inp,0,OFFSET_END);
  205.     size=Seek (inp,0,OFFSET_BEGINNING);
  206.     if (size<=0) {
  207.         sprintf(ToPrint,"Error! Seek error on file \"%s%s\"!",directory,name);
  208.         WriteStatus();
  209.         goto CleanUp;
  210.     }
  211.     if ((buff=AllocMem(size,0))==0) {
  212.         sprintf(ToPrint,"Error! Can't allocate memory!");
  213.         WriteStatus();
  214.         goto CleanUp;
  215.     }
  216.     if (Read(inp,(char *)&buff[0],size)!=size) {
  217.         sprintf(ToPrint,"Error reading file \"%s%s\"!",directory,name);
  218.         WriteStatus();
  219.         goto CleanUp;
  220.     }
  221.     hunkc=buff[2]; hunka=buff[3]; hunkb=buff[4];
  222.     while (buff[i++]!=0x000003e9);
  223.     if (((buff[i+1]&0x0000ffff)!=0x0000fffe) ||
  224.         ((buff[i+2]&0xffff0000)!=0x61000000)) {
  225.         sprintf(ToPrint,"File \"%s%s\" is clean!",directory,name);
  226.         WriteStatus();
  227.         ++CleanTotal;
  228.         goto CleanUp;
  229.     }
  230.     Close(inp);
  231.     sprintf(ToPrint,"IRQ virus found in file \"%s%s\"!",directory,name);
  232.     WriteStatus();
  233.     ++VirTotal;
  234.     if ((inp=Open(name,MODE_NEWFILE))==0) {
  235.         sprintf(ToPrint,"Error opening file for write!");
  236.         WriteStatus();
  237.         goto CleanUp;
  238.     }
  239.     buff[2]-=1; buff[4]-=1;
  240.     if (Write(inp,(char *)&buff[0],5*((long)sizeof(long)))!=
  241.         5*((long)sizeof(long))) {
  242.         sprintf(ToPrint,"Write error!");
  243.         WriteStatus();
  244.         goto CleanUp;
  245.     }
  246.     if (Write(inp,(char *)&buff[6],hunkc*((long)sizeof(long)))!=
  247.         hunkc*((long)sizeof(long))) {
  248.         sprintf(ToPrint,"Write error!");
  249.         WriteStatus();
  250.         goto CleanUp;
  251.     }
  252.     i=i+273;
  253.     size=(size/((long)sizeof(long))-i)*((long)sizeof(long));
  254.     if (Write(inp,(char *)&buff[i],size)!=size) {
  255.         sprintf(ToPrint,"Write error!");
  256.         WriteStatus();
  257.         goto CleanUp;
  258.     }
  259.     sprintf(ToPrint,"IRQ virus killed in file \"%s%s\"!",directory,name);
  260.     WriteStatus();
  261.     ++KilledTotal;
  262.     CleanUp:
  263.     if (inp) Close(inp);
  264.     if (buff) FreeMem(buff,size);
  265.     return(0);
  266. }
  267.  
  268. WriteStatus()
  269. {
  270.     SetAPen(Window->RPort,0);
  271.     RectFill(Window->RPort,2,189,637,198);
  272.     Files.FrontPen=3;
  273.     PrintIText(Window->RPort,&Files,10,189);
  274.     Files.FrontPen=1;
  275.     return(0);
  276. }
  277.