home *** CD-ROM | disk | FTP | other *** search
/ ProfitPress Mega CDROM2 …eeware (MSDOS)(1992)(Eng) / ProfitPress-MegaCDROM2.B6I / MISC / NETWORK / TEL23SRC.ZIP / DEBUG / MCB.C next >
Encoding:
C/C++ Source or Header  |  1991-06-26  |  3.5 KB  |  163 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <dos.h>
  5. #include "defines.h"
  6.  
  7. struct MCB {
  8.     char chain;
  9.     unsigned int pid,
  10.         psize;
  11.     char unused[11];
  12.   };
  13.  
  14. typedef struct MCB huge *PTRMCB;
  15.  
  16. void mcb(void);
  17. void far *ffmcb(void);
  18. void prn_header(void);
  19. void prn_mcb(PTRMCB pm);
  20. void prn_pid_own(unsigned int pid, unsigned int parent);
  21. #ifdef QAK
  22. static void huge *Normalize_Addr(void huge *mem_addr);
  23. #endif
  24.  
  25. void mcb(void )
  26. {
  27.     PTRMCB ptrmcb;
  28.  
  29.     ptrmcb=(PTRMCB)ffmcb();
  30.     prn_header();
  31.     prn_mcb(ptrmcb);
  32.  
  33.     do {
  34.         ptrmcb+=ptrmcb->psize+1;
  35. #ifdef QAK
  36.         ptrmcb=(PTRMCB)Normalize_Addr((void huge *)ptrmcb);
  37. #endif
  38.         prn_mcb(ptrmcb);
  39.       }    while(ptrmcb->chain == 'M');
  40.     printf("===========================================================");
  41.     puts  ("=============");
  42.     getch();
  43. }    /* end mcb() */
  44.  
  45. void far *ffmcb(void)
  46. {
  47.     union REGS regs;
  48.     struct SREGS sregs;
  49.     unsigned far *segmptr;
  50.  
  51.     regs.h.ah=0x52;
  52.     intdosx(®s,®s,&sregs);
  53.  
  54.     segmptr=MK_FP(sregs.es,(regs.x.bx-2));
  55.     return(MK_FP(*segmptr,0));
  56. }    /* end ffmcb() */
  57.  
  58. void prn_header(void)
  59. {
  60.     printf("===========================================================");
  61.     puts  ("=============");
  62.     puts("MCB MCB  ID PID      MB PAR- ENV    OWNER");
  63.     puts("NO. SEG            SIZE ENT  BLK?");
  64.     printf("===========================================================");
  65.     puts  ("=============");
  66. }    /* end prn_header() */
  67.  
  68. void prn_mcb(PTRMCB pm)
  69. {
  70.     static unsigned int cnt=0;
  71.     static unsigned int mcbnum=1;
  72.     unsigned int parid;
  73.     unsigned int mcbseg;
  74.     char envf;
  75.     unsigned int envseg;
  76.  
  77.     parid=*(unsigned far *)MK_FP(pm->pid,0x16);
  78.     mcbseg=FP_SEG(pm);
  79.     envseg=*(unsigned far *)MK_FP(pm->pid,0x2C);
  80.  
  81.     envf=(char)(((mcbseg+1)==envseg) ? 'Y' : 'N');
  82.  
  83.     if(parid==pm->pid)
  84.         cnt++;
  85.  
  86.     if(!envseg && cnt==2)
  87.         envf='Y';
  88.  
  89.     printf("%2.2u%06.4X%2.1c%06.4X%7lu%5.4X %-5.1c",mcbnum++,mcbseg,pm->chain,pm->pid,(unsigned long)pm->psize*(unsigned long)16,parid,envf);
  90.  
  91.     prn_pid_own(pm->pid,parid);
  92. }    /* end prn_mcb() */
  93.  
  94. void prn_pid_own(unsigned int pid, unsigned int parent)
  95. {
  96.     unsigned far *envsegptr;
  97.     char far *envptr;
  98.     unsigned far *envsizeptr;
  99.     unsigned int envsize;
  100.  
  101.     static unsigned char ccnum=0;
  102.  
  103.     static unsigned int prev_pid=0xFFFF;
  104.  
  105.     switch(pid) {
  106.         case 0:
  107.             puts("FREE MEMORY CONTROL BLOCK");
  108.             return;
  109.  
  110.         case 8:
  111.             puts("IBMDOS.COM/MSDOS.SYS");
  112.             return;
  113.       }    /* end switch */
  114.  
  115.     envsegptr=(unsigned far *)MK_FP(pid,0x2C);
  116.  
  117.     envptr=(char far *)MK_FP(*envsegptr,0);
  118.  
  119.     envsizeptr=(unsigned far *)MK_FP(*envsegptr-1,0x3);
  120.  
  121.     envsize=*envsizeptr*16;
  122.  
  123.     if(pid==parent) {
  124.         if(prev_pid!=pid)
  125.             ccnum++;
  126.         printf("COMMAND.COM COPY #%-2u\n",(unsigned int)ccnum);
  127.         prev_pid=pid;
  128.         return;
  129.       }    /* end if */
  130.  
  131.     while(envsize) {
  132.         while(--envsize && *envptr++);
  133.         if(!*envptr && *(unsigned far *)(envptr+1) == 0x1) {
  134.             envptr+=3;
  135.             break;
  136.           }    /* end if */
  137.       }    /* end while */
  138.  
  139.     if(envsize) {
  140.         while(*envptr)
  141.             putchar(*envptr++);
  142.         putchar('\n');
  143.       }    /* end if */
  144.     else
  145.         puts("UNKNOWN OWNER");
  146. }    /* end prn_pid_own() */
  147.  
  148. #ifdef QAK
  149. void huge *Normalize_Addr(void *mem_addr)
  150. {
  151.     unsigned int seg_val,        /* the segment of the address we are normalizing */
  152.         offset_val,                /* the offset of the address we are normalizing */
  153.         temp_val;                /* temporary value for calculating the amount to add to the segment */
  154.  
  155.     seg_val=FP_SEG(mem_addr);
  156.     temp_val=offset_val=FP_OFF(mem_addr);
  157.     temp_val>>=4;
  158.     seg_val+=temp_val;
  159.     offset_val-=(temp_val<<4);
  160.     return((void huge *)MK_FP(seg_val,offset_val));
  161. }    /* end Normalize_Addr() */
  162. #endif
  163.