Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
пример КП.DOC
Скачиваний:
0
Добавлен:
07.08.2019
Размер:
126.98 Кб
Скачать

2.7 Виконання програми

Утиліта перегляду та редагування змінних середовища ДОС працює так.

Спочатку запускається програма. На вході є можливість задати параметри командної строки.

Після того як оброблені задані параметри програма виводить на екран вікно. Після того як на екрані буде відображене головне вікно, в нього виводиться список всіх змінних й їхніх значень. Також на екрані є декілька інформаційних строк.

Перший рядок, розташовано у самій верхній позиції має інформацію про назву програми та розробника програми.

Нижче відображається версія операційної системи ДОС.

Ще нижче відображається адреса, за якою знаходиться системна структура даних, яка включає до себе усю системну інформацію, а також і інформацію про змінні середовища операційної системи.

На четвертій зверху рядку відображена інформація про максимально допустиму довжину середовища операційної системи та про дійсний розмір середовища операційної системи.

Під інформаційними рядками знаходиться меню – список який складається з імен змінних та їх значень.

Нижче цього списку знаходиться рядок меню, в якому описано дії усіх функціональних клавіш програми.

Після цього програма переходить у режим очікування натискання якої-небудь клавіші. Якщо буде натиснуті наступні клавіші то програма відреагує на їхнє натискання. Це клавіші DEL, INS, ALT-C, F10, стрілки нагору й униз, ENTER. Всі інші клавіші ігноруються програмою.

При натисканні на клавішу DEL буде вилучений поточний запис, виділена підсвіченим курсором. Для остаточного видалення запису необхідно підтвердити видалення натисканням клавіші Y в англійському режимі клавіатури.

При натисканні клавіші INS буде зроблена спроба додати нову змінну оточення. Ця функція запитує в користувача рядок утримуюче ім'я змінної знак присвоювання й значення змінної. Після цього уведений рядок перевіряється на правильність й якщо рядок не містить явних помилок викликається системна функція для встановлення нової змінної оточення.

За допомогою клавіш ALT-С можна змінювати значення поточної змінної. При виклику даної функції пропонується ввести нове значення змінної. Після того як воно ведено, це значення зберігається за допомогою системної функції ДОС.

За допомогою клавіші F10 можна зберегти всі значення зроблені з оточенням операційної системи й вийти із програми.

При натисканні клавіш стрілка нагору й униз відбувається переміщення за списком змінні середовища.

3. Висновки

В даному курсовому проекті розроблена програма аналізу блоку завантаження середовища ДОС.

В результаті розробки проекту я розширив свої знання про текстовий режим комп’ютера, та як з ним працювати за допомогою мови С, а також про прямий доступ до системних сервісів та функцій операційної системи MS-DOS. Я поглибив свої знання що до роботи з операційною систему напряму, через Ії функції та сервіси, почерпнув багато інформації про структуру внутрішніх даних системи та структури комп’ютера.

Також я здобув навички у написані програм, які використовую командну строку процесора MS-DOS, а також дуже багато дізнався про методи роботи з операційною системою за допомогою мови високого рівня С.

При написані курсового проекту я також ознайомився з різноманітними утилітами операційної системи, вивчив деякі навички системного програмування, а також відчув різницю між прикладним та системним програмуванням.

Додаток А

Схема алгоритму програми

Так

Ні

Ні

Ні

Ні

Так

Так

Так

Додаток Б

Роздрук лістингу програми

#include <stdio.h>

#include <stdlib.h>

#include <dos.h>

#include <string.h>

#include <malloc.h>

#define envSeg(p) (*((unsigned short far *)MK_FP(p->arenaOwner, 0x2C)))

#define parSeg(p) (*((unsigned short far *)MK_FP(p->arenaOwner, 0x16)))

#define VERSION "1.1"

#define GENV_SUCCESS 0 // Successful

#define GENV_ERROR -1 // General Error

#define GENV_NOSPACE -2 // Insufficient space in env. for new var.

typedef struct Arena

{

unsigned char arenaSignature;

unsigned short arenaOwner;

unsigned short arenaSize;

unsigned char reserved[3];

unsigned char arenaName[8];

} ARENA;

char far *gEnvPtr;

ARENA far * GetFirstArenaPtr(void)

{

/*

Int 21 Fn 52 U - DOS 2+ Internal - "sysvars" - Get List Of Lists [D]

AH = 52h

Return: ES:BX -> DOS list of lists (see #0793)

ES:[BX-2] contains the segment of the Memory Control Block

Format of DOS memory control block (see also below):

Offset Size Description (Table 0794)

00h BYTE block type: 5Ah if last block in chain, otherwise 4Dh

01h WORD PSP segment of owner or special flag value (see #0795)

03h WORD size of memory block in paragraphs

05h 3 BYTEs unused by MS-DOS

(386MAX) if locked-out block, region start/prev region end

---DOS 2.x,3.x---

08h 8 BYTEs unused

---DOS 4+ ---

08h 8 BYTEs ASCII program name if PSP memory block or DR-DOS UMB,

else garbage

null-terminated if less than 8 characters

Notes: the next MCB is at segment (current + size + 1)

under DOS 3.1+, the first memory block is the DOS data segment,

containing installable drivers, buffers, etc. Under DOS 4+ it is

divided into subsegments, each with its own memory control block

(see #0798), the first of which is at offset 0000h.

for DOS 5+, blocks owned by DOS may have either "SC" or "SD" in bytes

08h and 09h. "SC" is system code or locked-out inter-UMB memory,

"SD" is system data, device drivers, etc.

(Table 0795)

Values for special flag PSP segments:

0000h free

0006h DR-DOS XMS UMB

0007h DR-DOS excluded upper memory ("hole")

0008h belongs to DOS

FFF7h 386MAX v6.01+ ???

FFFAh 386MAX UMB control block (see #0655 at AX=4402h"386MAX")

FFFDh 386MAX locked-out memory

FFFEh 386MAX UMB (normally immediately follows its control block)

FFFFh 386MAX v6.01+ device driver

Some versions of DR-DOS use only seven characters of the program name,

placing a NUL in the eighth byte.

*/

unsigned int myseg;

_asm

{

push es

push ax

push bx

mov ah,52h

int 21h

mov ax,es

mov ax,es:[bx-2]

mov [myseg],ax

pop bx

pop ax

pop es

}

#ifdef DEBUG

printf("myseg = 0x%04x\n",myseg);

#endif

return ((ARENA far *) MK_FP(myseg, 0));

}

void far * GetMasterEnvPtr(void)

{

ARENA far *aPtr;

unsigned int myseg;

aPtr = GetFirstArenaPtr();

if (aPtr != NULL)

{

// while not last block in chain --- 0x5A signifies last block

while (aPtr->arenaSignature == 0x4D)

{

myseg = FP_SEG(aPtr) + 1;

if (aPtr->arenaOwner == myseg)

{

if (envSeg(aPtr) > aPtr->arenaOwner)

{

if (parSeg(aPtr) == aPtr->arenaOwner)

{

return (MK_FP(envSeg(aPtr), 0));

}

}

}

myseg += aPtr->arenaSize;

aPtr = (ARENA far * ) MK_FP(myseg, 0);

}

}

return(NULL);

}

unsigned int get_envsize(unsigned int envptr)

{

unsigned int retval;

retval = ( (ARENA far *) MK_FP(envptr-1, 0) )->arenaSize << 4;

return (retval);

}

short global_put_env(char *varName, char *varText)

{

void far *envPtr;

char far *eptr;

char far *p;

char far *q;

size_t varLen;

size_t reqLen;

size_t envSize;

envPtr = gEnvPtr;

if (envPtr == NULL)

return(GENV_ERROR);

else

{

eptr = (char far *) envPtr;

p = (char far *) envPtr;

varLen = strlen(varName);

if (varText)

reqLen = varLen + strlen(varText) + 2;

else

reqLen = varLen + 2;

envSize = get_envsize(FP_SEG(envPtr));

while (*(unsigned short far *) eptr)

{

eptr++;

if (FP_OFF(eptr) == 0x7FFF) return(-1);

}

if ((FP_OFF(eptr) + reqLen) >= envSize)

return(GENV_NOSPACE);

strupr(varName);

// Don't always want to upper-case the variable text

// if (varText) strupr(varText);

while (p < eptr)

{

if ((_fstrncmp(varName, p, varLen ) == 0) &&

(*(p + varLen) == '='))

{

q = p;

q += _fstrlen(q);

if (*(unsigned short far *) q == 0)

{

p--;

break;

}

q++;

movedata(FP_SEG(q), FP_OFF(q), FP_SEG(p), FP_OFF(p),

FP_OFF(eptr) - FP_OFF(q) + 2);

while(*(unsigned short far *) p) p++;

break;

}

while (*p) p++;

if (*(unsigned short far *) p) p++;

}

if (varText == NULL)

{

*(unsigned short far *) p = 0;

return (GENV_SUCCESS);

}

p++;

_fstrcpy(p, varName);

_fstrcat(p, "=");

_fstrcat(p, varText);

p += reqLen;

*p = '\0';

}

return (GENV_SUCCESS);

}

void dump_env(void)

{

// double 0 indicates end of environment

printf("[Current Environment - Master EnvPtr is %Fp]\n",gEnvPtr);

while (*( unsigned short far * ) gEnvPtr)

{

if (*gEnvPtr != 0)

putchar(*gEnvPtr);

else

putchar('\n');

gEnvPtr++;

}

printf("\n");

}

int main(int argc, char *argv[])

{

if (argc >= 2 && (argv[1][0] == '-' || argv[1][0] == '/') &&

(argv[1][1] == '?' || argv[1][1] == 'h' || argv[1][1] == 'H'))

{

printf("Global Environment Variable List/Set/Clear v%s\n",VERSION);

printf("Usage: %s [varName] [varText]\n"

" If varName exists and varText is not provided,\n"

" then varName is cleared, "

"otherwise varName is set to varText\n",

(strrchr(argv[0],'\\') + 1));

return (1);

}

gEnvPtr = (char far *) GetMasterEnvPtr();

if (gEnvPtr == NULL)

{

printf("Error getting Master Env Ptr!\n");

return (2);

}

if (argc == 1)

global_put_env(NULL, NULL);

else if (argc == 2)

global_put_env(argv[1], NULL);

else

global_put_env(argv[1], argv[2]);

dump_env();

return (0);

}