список запущенных программ

Тема в разделе "LANGS.C", создана пользователем ZEVSIK, 14 мар 2009.

  1. ZEVSIK

    ZEVSIK New Member

    Публикаций:
    0
    Регистрация:
    4 мар 2009
    Сообщения:
    13
    Надо получить список запущенных программ в OS DOS 16.
     
  2. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    DOS 16 - это что за чудо?
     
  3. ZEVSIK

    ZEVSIK New Member

    Публикаций:
    0
    Регистрация:
    4 мар 2009
    Сообщения:
    13
    Я к тому что DOS 16 bit, а не DOS for windows 32.
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    ZEVSIK
    Код (Text):
    1. #include <stdio.h>
    2. #include <stdlib.h>
    3.  
    4. void main(void)
    5. {
    6.   system("mem /p");
    7.   puts("Press Enter to exit");
    8.   getchar();
    9. }
     
  5. ZEVSIK

    ZEVSIK New Member

    Публикаций:
    0
    Регистрация:
    4 мар 2009
    Сообщения:
    13
    q_q Надо без использования других программ из своей прграммы вывести.
     
  6. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    ZEVSIK
    Можно пройти по цепочке mcb (memory control block), определяя программу-владельца каждого блока.
     
  7. ZEVSIK

    ZEVSIK New Member

    Публикаций:
    0
    Регистрация:
    4 мар 2009
    Сообщения:
    13
    Можно пройти по цепочке mcb (memory control block), определяя программу-владельца каждого блока.
    Как начать? Какова структура? Где почитать? спсб.
     
  8. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    ZEVSIK
    > Как начать?
    Воспользоваться какой-нибудь (ya, google, rambler etc.) поисковой системой, указав в строке поиска: "memory control block".
     
  9. ZEVSIK

    ZEVSIK New Member

    Публикаций:
    0
    Регистрация:
    4 мар 2009
    Сообщения:
    13
    Код (Text):
    1. #include<dos.h>
    2.  
    3. #include<stdio.h>
    4. #include<conio.h>
    5.  
    6. #include<stdlib.h>
    7.  
    8.  
    9.  
    10. #pragma pack(1)
    11.  
    12. typedef struct _CVT_
    13.  {
    14.  unsigned mcb_seg;
    15.  void far *dev_cb;
    16.  void far *file_tab;
    17.  void far *clock_dr;
    18.  void far *con_dr;
    19.  unsigned max_btbl;
    20.  void far *disk_buf;
    21.  void far *drv_info;
    22.  void far *fcb_tabl;
    23.  unsigned fcb_size;
    24.  unsigned char num_bdev;
    25.  unsigned char lastdriv;
    26.  } CVT;
    27.  
    28.  
    29.  
    30. typedef struct _MCB_
    31.  {
    32.  unsigned char type;
    33.  unsigned owner;
    34.  unsigned size;
    35.  char reserve[ 11 ];
    36.  char pgmname[ 8 ];      // ? ?
    37.  } MCB;
    38. #pragma pack()
    39.  
    40.  
    41.  
    42.  
    43. #define FP_MAKE(seg,off) ((void far *) \
    44.         ((((unsigned long) (unsigned)(seg)) << 16L) |   \
    45.         ((unsigned long) (unsigned) (off))))
    46.  
    47.  
    48.  
    49.  
    50.  
    51. CVT far *get_mcvt(void)
    52.  {
    53.  union REGS inregs, outregs;
    54.  struct SREGS segregs;
    55.  inregs.h.ah = 0x52;
    56.  intdosx( &inregs, &outregs, &segregs );
    57.  return( (CVT far*)FP_MAKE(segregs.es,outregs.x.bx-2) );
    58.  }
    59.  
    60.  
    61.  
    62.  
    63.  
    64. MCB far *get_fmcb(CVT far *cvt)
    65.  {
    66.  return( (MCB far *) FP_MAKE (cvt->mcb_seg, 0) );
    67.  }
    68.  
    69.  
    70.  
    71. MCB far *get_nmcb( MCB far *mcb )
    72.  {
    73.  unsigned seg, off;
    74.  
    75.  if( mcb->type == 'M' )
    76.   {
    77.   seg = FP_SEG( mcb ) + mcb->size + 1;
    78.   off = FP_OFF( mcb );
    79.   return( (MCB far *) FP_MAKE (seg,off) );
    80.   }
    81.  else return( (MCB far *)0 );
    82.  }
    83.  
    84.  
    85. void main( void )
    86.  {
    87.  CVT far *cvt;
    88.  
    89.  MCB far *mcb;
    90.  
    91.  int i;
    92.  
    93.  cvt = get_mcvt();
    94.  mcb = get_fmcb(cvt);
    95.  for(;;)
    96.   {
    97.   if(mcb == (MCB far *)0) break;
    98.   printf("%Fp %c   %04X     %04X\n",
    99.   mcb,
    100.   mcb->type,
    101.   mcb->owner,
    102.   mcb->size);
    103.  
    104.  
    105.   printf( "%s\n", mcb->size );
    106.  
    107.   for( i=0; i<8; i++ )
    108.   printf( "%c", mcb->pgmname[ i ] );
    109.   printf( "\n" );
    110.   getch();
    111.  
    112.   mcb = get_nmcb( mcb );
    113.   }
    114.  
    115.  exit(0);
    116.  }
    Подскажите, кто знает, почему вместо имен программ лезет всякая муть.
    mcb->pgmname должен содержать "имя программы, находящейся в данном блоке" но что-то не получается.
     
  10. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    ZEVSIK
    1) ошибка в определении структуры mcb
    Код (Text):
    1. typedef struct _MCB_
    2.  {
    3.  unsigned char type;
    4.  unsigned owner;
    5.  unsigned size;
    6.  char reserve[ 3 ];      // !!! не 11, а 3
    7.  char pgmname[ 8 ];      // ? ?
    8.  } MCB;
    2) выводить надо до первого нуль-символа
    Код (Text):
    1.     for( i=0; i<8 && mcb->pgmname[ i ]; i++ )
    2.       printf( "%c", mcb->pgmname[ i ] );
    3.     printf( "\n" );
    3) имя программы есть не у каждого mcb:
    3.1) для mcb->owner == 0, т.е. у свободного mcb, нет имени программы;
    3.2) afaik для mcb->owner == 8 тоже нет имени;
    3.3.) если mcb->owner очередного mcb "похож" на psp, то надо проверять не является этот mcb средой/окружением/environment'омесли да, то, скорее всего, имя программы надо искать через родителя, либо псоле переменных окружения есть полный пусть запущенной программы.
     
  11. ZEVSIK

    ZEVSIK New Member

    Публикаций:
    0
    Регистрация:
    4 мар 2009
    Сообщения:
    13
    q_q Я извиняюсь что туплю, но не мог бы ты примерчик подкинуть, а то непонятно:
    и что значит
    ...
    Я пример с Delphi переводил и совсем запутался напр вот это:
    Код (Text):
    1.      psp = ( ProgramSegmentPrefix * ) MK_FP ( MCB->BlockOwner, 0 ); //possible PSP
    2.  
    3.      //Almost all programs have a tag of 0x20CD; DOS MODE is one that uses 0x27CD in some versions.
    4.      }
    5.     if( (psp->PSPtag != 0x20CD) && (psp->PSPtag != 0x27CD) )
    6.      {
    7.      //printf( "System        <DOS %d.%d>",  DosVerNum, DOSVersion );   // not valid PSP
    8.      }
    9.     else
    10.      {
    11.      MCBenv = ( MemoryControlBlock * ) MK_FP ( psp->Environment-1, 0 );    // MCB of environment
     
  12. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    ZEVSIK
    > непонятно 3.2) afaik для mcb->owner == 8
    В поле mcb->owner содержится сегментный адрес psp владельца, если он равен нулю, то владельцем mcb является он сам, т.е. mcb свободен.
    Если mcb->owner окажется меньше чем адрес первого mcb, то блок принадлежит ОС, скорее всего он будет один, самый первый.
    Я не встречал в mcb->owner чисел меньших адреса первого mcb отличных от нуля или восьми, поэтому написал восемь, а вообще можно сравнивать с адресом первого mcb.

    > пример с Delphi переводил
    С этого "Show Memory Control Blocks" by JOSE ANTONIO NODA?

    > напр вот это
    Да, это проверка "похожести".
    Если выполняется условие, что psp->PSPtag == 0x20CD, то MCB->BlockOwner очень похож на psp, если еще окажется, что psp->Environment == FP_SEG(mcb), то MCB->BlockOwner очень-очень похож на psp, а mcb от его окружения.

    Про psp->PSPtag == 0x27CD ничего сказать не могу.
     
  13. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Какие еще запущеные программы в досе? :) Дос же однозадачный - там только прерывания есть. Почему не просканировать область 0:0 -> 0:400 и не посмотреть куда векторы кажут?
     
  14. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    _DEN_
    afair, comamnd.com/vc.com остаются в памяти, когда запускаешь другую программу.
     
  15. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    _DEN_
    в ДОСе может быть (и обычно так и есть) много программ запущено
    из них выполняется только одна, однозадачность типа, как ты правильно заметил
     
  16. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    На сколько я помню, соответствующая функция 21-го прерывания называлась "передать управление и остаться резидентной"
     
  17. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    это 31 функция
    а я про 4b

    я просто придрался к твоему слову - "запускать" можно было много программ, ну тысячу, лишь бы памяти хватило
    выполняться - да, только одна, текущая
     
  18. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    _DEN_
    > просканировать область 0:0 -> 0:400 и ... посмотреть куда векторы кажут
    Imho цепочка перехватчиков нормальное состояние для DOS, поэтому "список запущенных программ" тут не получить.
     
  19. ZEVSIK

    ZEVSIK New Member

    Публикаций:
    0
    Регистрация:
    4 мар 2009
    Сообщения:
    13
    Не получается найти в psp. Подскажите.
    Код (Text):
    1. #include<dos.h>
    2.  
    3. #include<stdio.h>
    4. #include<conio.h>
    5.  
    6. #include<stdlib.h>
    7. #include<string.h>
    8.  
    9.  
    10. typedef unsigned char BYTE;
    11. typedef unsigned int  WORD;
    12. typedef unsigned long DWORD;
    13.  
    14.  
    15. enum bool{ false, true };
    16.  
    17. #pragma pack(1)
    18.  
    19. typedef struct _CVT_
    20.  {
    21.  unsigned mcb_seg;
    22.  void far *dev_cb;
    23.  void far *file_tab;
    24.  void far *clock_dr;
    25.  void far *con_dr;
    26.  unsigned max_btbl;
    27.  void far *disk_buf;
    28.  void far *drv_info;
    29.  void far *fcb_tabl;
    30.  unsigned fcb_size;
    31.  unsigned char num_bdev;
    32.  unsigned char lastdriv;
    33.  } CVT;
    34.  
    35.  
    36. typedef struct _MCB_
    37.  {
    38.  unsigned char type;
    39.  unsigned owner;
    40.  unsigned size;
    41.  char reserve[ 3 ];
    42.  char pgmname[ 8 ];
    43.  } MCB;
    44.  
    45.  
    46.  
    47. typedef struct _PSP_  // PSP -- only needed fields are shown
    48.  {
    49.  unsigned int tag;                // 0x20CD or 0x27CD if PSP}  { 00 0x00 }
    50.  unsigned int misc[ 21 ];            // 02 0x02
    51.  unsigned int environment;           // 44 0x2C
    52.  } PSP;
    53.  
    54.  
    55. #pragma pack()
    56.  
    57.  
    58.  
    59.  
    60.  
    61.  
    62.  
    63.  
    64. #define FP_MAKE(seg,off) ((void far *) \
    65.         ((((unsigned long) (unsigned)(seg)) << 16L) |   \
    66.         ((unsigned long) (unsigned) (off))))
    67.  
    68.  
    69.  
    70. CVT far *get_mcvt(void)
    71.  {
    72.  union REGS inregs, outregs;
    73.  struct SREGS segregs;
    74.  inregs.h.ah = 0x52;
    75.  intdosx( &inregs, &outregs, &segregs );
    76.  return( (CVT far*)FP_MAKE(segregs.es,outregs.x.bx-2) );
    77.  }
    78.  
    79.  
    80.  
    81.  
    82. MCB far *get_fmcb(CVT far *cvt)
    83.  {
    84.  return( (MCB far *) FP_MAKE (cvt->mcb_seg, 0) );
    85.  }
    86.  
    87.  
    88.  
    89. MCB far *get_nmcb( MCB far *mcb )
    90.  {
    91.  unsigned seg, off;
    92.  
    93.  if( mcb->type == 'M' )
    94.   {
    95.   seg = FP_SEG( mcb ) + mcb->size + 1;
    96.   off = FP_OFF( mcb );
    97.   return( (MCB far *) FP_MAKE (seg,off) );
    98.   }
    99.  else return( (MCB far *)0 );
    100.  }
    101.  
    102.  
    103.  
    104.  
    105. // получает номер версии DOS
    106. void get_DOS_ver_h( BYTE *dos )
    107.  {
    108.  union REGS r;
    109.  r.h.ah = 0x30;
    110.  intdos( &r, &r );
    111.  *dos = r.h.al;
    112.  
    113.  }
    114.  
    115.  
    116.  
    117.  
    118. void main( void )
    119.  {
    120.  CVT far *cvt;
    121.  MCB far *cmcb, far *mcb_owner, far *mcb_env;
    122.  PSP *psp;
    123.  
    124.  char BlockType[ 10 ];
    125.  
    126.  
    127.  WORD othersegm, fathersegm, csegm, envsize;
    128.  BYTE *envstr, dos;
    129.  
    130.  
    131.  int i, envlen;
    132.  
    133.  get_DOS_ver_h( &dos );
    134.  
    135.  
    136.  cvt = get_mcvt();
    137.  cmcb = get_fmcb(cvt);
    138.  
    139.  csegm = ( WORD )cmcb;
    140.  
    141.  for(;;)
    142.   {
    143.   if(cmcb == (MCB far *)0) break;
    144.  
    145.  
    146.   if( cmcb->owner == 0 )
    147.    {
    148.    printf( "Free Space    <unallocated>\n" );
    149.    }
    150.   else
    151.    {
    152.    psp = ( PSP * ) FP_MAKE ( cmcb->owner, 0 ); // possible PSP
    153.  
    154.    // Almost all programs have a tag of $20CD; DOS MODE is one that uses $27CD in some versions.
    155.    if( (psp->tag == 0x20CD) || (psp->tag == 0x27CD) )
    156.     {
    157.     printf( "Not valid PSP\n" );   // not valid PSP
    158.     }
    159.    else
    160.     {
    161.     mcb_env = ( MCB * ) MK_FP ( psp->environment-1, 0 );    // MCB of environment
    162.  
    163.  
    164.     if( cmcb->owner == (csegm+1) )
    165.      {
    166.      strcpy( BlockType, "Program     " );
    167.      }
    168.     else if( psp->environment == (csegm+1) )
    169.      {
    170.      strcpy( BlockType, "Environment " );
    171.      if( cmcb->owner != mcb_env->owner )
    172.       {
    173.       if( dos != 4 )
    174.        {
    175.        printf( "<unknown>" ); // different owner; unknown in 3.X
    176.        }
    177.       else
    178.        {
    179.        // in DOS 4.0 short name is in MCB
    180.        mcb_owner = ( MCB * ) MK_FP ( cmcb->owner-1, 0 );    // MCB of owner block
    181.  
    182.        for( i=0; mcb_owner->pgmname[ i ]!='\0' && i<8; i++ )
    183.         {
    184.         printf( "%c", mcb_owner->pgmname[ i ] );
    185.         }
    186.        printf( "\n" );
    187.        }
    188.       }
    189.  
    190.      }
    191.     else
    192.      {
    193.      // environment must have same owner as MCB
    194.      if( dos < 3 )
    195.       {
    196.       printf( "<unknown>" );  // DOS 1.X or 2.X
    197.       }
    198.      else
    199.       {
    200.  
    201.  
    202.       // Здесь не  знвю что делать.
    203.  
    204. /*
    205.       for( i=0; (i < 100); i++ )
    206.        {
    207.        printf( "%c", psp->environment[ i ] );
    208.        }
    209.      getch();
    210.  
    211.  
    212.  
    213.  
    214.       printf( "%X", envsize );
    215.       getch();
    216. */
    217.  
    218.  
    219.  
    220.  
    221.  
    222.       }
    223.      
    224.  
    225.  
    226.  
    227.  
    228.  
    229.      }
    230.  
    231.  
    232.  
    233.  
    234.  
    235.  
    236.  
    237.  
    238.  
    239.  
    240.  
    241.  
    242.  
    243.  
    244.  
    245.  
    246.  
    247.  
    248.  
    249.  
    250.  
    251.  
    252.  
    253.  
    254.  
    255.  
    256.    
    257.  
    258.  
    259.  
    260.  
    261.     }
    262.  
    263.  
    264.    if( cmcb->owner == fathersegm )
    265.     {
    266.     printf( "COMMAND.COM\n" );
    267.     }
    268.    else
    269.     {
    270.  
    271.     }
    272.    }
    273.  
    274.   cmcb = get_nmcb( cmcb );
    275.   }
    276.  
    277.  exit(0);
    278.  }
    Как прояснить?
     
  20. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    ZEVSIK
    Если выполняется if( (psp->tag == 0x20CD) || (psp->tag == 0x27CD) ), то это означает, что cmcb->owner "похож" на psp, а не наоборот как у тебя.