Доступ до віддалених полів МСВ дозволяє побудувати програми, визначаючі поточний стан оперативної памяті. Далі наведено приклад декількох Сі-функцій, які використовують безпосередній доступ до МСВ-блоків MS-DOS:

Scan_mcb() – аналізує вміст МСВ блока;

Firstpsp() – повертає сегмент першого PSP в пам’яті;

Exe_name() – визначає іім’я файла програми-власника блока памяті.

Функції використовують структуру МСВ та ряд символьних констант, які зручно обєднати у власний файл, наприклад, з імям mcb.h:

/*************************  МСВ  ***********************/

/*  Заготовочний файл для роботи з МСВ блоками памяті  */

/******************************************************/

#if!defined(DEF_MCB) /*застерігає від повторного описування */

struct MCB{

char first_symb; /*Перший символ МСВ-блока:

=M’ – не останній блок;

=Z’ – останній блок. */

unsigned owner _psp;   /*індикатор зайнятості блоку:

=0 – блок вільний;

=PIDпрограми-власника.*/

unsigned block_size;  /*розмір блока в параграфах*/

char unsigned[11];      /*блоки МСВ які не використовуються*/

};

/* Описання прототипів функцій 6.5 для роботи з МСВ.*/

int scan_mcb(unsigned, unsigned *,unsigned *);

char far* exe_name(unsigned);

unsigned firstpsp(void);

/*Описання повертаючих символьних констант*/

#define OK                       0  /*блок пам’яті звільнений */

#define MCB_ERROR      1  /*блок має не коректний МСВ*/

#define LAST                    130  /*блок – останній в ланцюжку МСВ*/

#define NOT_LAST         131  /* блок – не останній в ланцюжку МСВ */

#define DEF_MCB           1  /*описування використовується лише раз*/

#endif

Відмітимо, що при компіляції програм, які використовують структуру МСВ, необхідно задати вирівнювання на границі байту, а не слова.

/*L6_7.c – функція scan_mcb()

Аналізує МСВ-блок, описаний блок памяті, розміщений з адреси start_seg:0000. Сам МСВ розміщується з адреси start_seg-1:0000.

Повертає:

NOT_LAST                     - даний блок – не останній в ланцюжку МСВ;

LAST                                - даний блок – останній в ланцюжку МСВ;

MCB_ERROR                  - даний блок описується не коректним МСВ;

next_block_seg                  - сегмент, з якого починається наступний блок памяті; для останнього блоку – число параграфів до кінця оперативної памяті.

owner_psp                        - байти 1-2 МСВ: 0 – для вільного блоку пам’яті; сегмент PSP програми-власника блока в противному разі.

*/

#include <dos.h>

#include “mcb.h”

int scan_mcb(unsigned start_seg, unsigned * next_block_seg, unsigned * owner_psp)

{ struct MCB far * work;

register int ret;

work=(struct MCB far*) MK_Fp ()start_seg –1,0);

/*Аналіз першого байту МСВ.*/

switch(work->first_symb){

case ’M’:

ret=NOT_LAST;

*next_block_seg=start_seg+work->block_size+1;

*owner_psp=work->owner+psp;

break;

case ‘Z’:

*next_block_seg=work->block_size;

*owner_psp=work->owner_psp;

ret=LAST;

break;

defoult: ret=MCB_ERROR;

}

return ret;

}