textcolor(12);
cprintf("%Fp\n\n\r",p_psp->stack_ptr);
textcolor(14);
cprintf("\n\rРодитель: ");
textcolor(12);
cprintf("%04X ",p_psp->father_psp);
textcolor(0x8b);
cprintf("\n\n\rНажмите любую клавишу ...\n\r\7");
getch();
clrscr();
textattr(0x0a);
cprintf("▓▓▓▓▓▒▒▒▒▒░░░░░");
cprintf(" Лабораторная работа N11 ");
cprintf("░░░░░▒▒▒▒▒▓▓▓▓▓");
cprintf("▓▓▓▓▓▒▒▒▒▒░░░░░");
cprintf(" Управление программами ");
cprintf("░░░░░▒▒▒▒▒▓▓▓▓▓");
/* Распечатка таблицы файлов */
s=p_psp->JFT_ptr;
textcolor(10);
cprintf("\n\n\rТаблица файлов: ");
textcolor(12);
cprintf("%Fp (%d) ",s,p_psp->JFT_size);
textcolor(11);
if (s==(byte *)p_psp+0x18)
cprintf(" - в этом же PSP");
cprintf("\n\r");
for (i=0; ++i<=p_psp->JFT_size; cprintf("%d ",*(s++)));
textcolor(10);
cprintf("\n\n\rОкружение DOS: ");
textcolor(12);
cprintf("%04X\n\r",p_psp->env_seg);
s=(char *)MK_FP(p_psp->env_seg,0);
textcolor(11);
while(l=strlen(s))
{
cprintf(" %s\n\r",s);
s+=l+1;
}
if (dos_ver>2)
{
/* для DOS 3.0 и дальше можно получить строку вызова */
s++;
l=*((int *)s);
textcolor(10);
cprintf("\n\rЧисло строк вызова: ");
textcolor(12);
cprintf("%d\n\r",l);
s+=2;
textcolor(11);
for(i=0; i<l; i++)
{
cprintf("%s\n\r",s);
s+=strlen(s)+1;
} }
textattr(0x8b);
cprintf("\n\n\n\n\rНажмите любую клавишу ...\7");
textattr(0x07);
cprintf("\n\r");
getch();
clrscr(); }
/* Определение версии DOS */
void get_DOS_version_h(void)
{
rr.h.ah=0x30;
intdos(&rr,&rr);
dos_ver=rr.h.al; }
/* Получение адреса PSP */
void addr_PSP (void)
{
rr.h.ah=0x62;
intdos(&rr,&rr);
pid=rr.x.bx;
}
#include "stdafx.h"
#include <windows.h>
int main(int argc, char* argv[])
{
STARTUPINFO StartUpInfo;
PROCESS_INFORMATION ProcessInfo;
memset(&StartUpInfo,0,sizeof(STARTUPINFO));
StartUpInfo.cb=sizeof(STARTUPINFO);
if (CreateProcess(NULL,"c:\\windows\\system32\\calc.exe",NULL,NULL,FALSE,
NORMAL_PRIORITY_CLASS,NULL,NULL,&StartUpInfo,&ProcessInfo))
{
Sleep(15000);
TerminateProcess(ProcessInfo.hProcess, 0);
}
ExitProcess(0);
}
#include <windows.h>
#include <process.h>
unsigned ThreadFunc( void * arg)
{
char ** str = (char**)arg;
MessageBox(0,str[0],str[1],0);
ExitThread( 0 );
return 0;
}
int main(int argc, char* argv[])
{
char * InitStr1[2] = {"First thread running!","11111"};// строка для первой нити
char * InitStr2[2] = {"Second thread running!","22222"};// строка для второй нити
unsigned long uThreadIDs[2];
HANDLE hThreads[2];
hThreads[0] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,
InitStr1, 0,&uThreadIDs[0]);
hThreads[1] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,
InitStr2, 0,&uThreadIDs[1]);
// Ждем, пока нити не завершат свою работу
WaitForMultipleObjects(2, hThreads, TRUE, INFINITE );
// Закрываем дескрипторы
CloseHandle( hThreads[0] );
CloseHandle( hThreads[1] );
return 0;
}
6. Результати роботи програми
У процесі роботи програми на екран була виведена наступна
інформація:
-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і
-і-і-і-і-і-і-і- Лабораторна робота N11 -і-і-і-і-і-і-і-
-і-і-і-і-і-і-і- Керування програмами -і-і-і-і-і-і-і-
Адреса PID = 0BA0
Команди:
-і-і-і-і
Завершення - int 20h: CD 20
Старий виклик DOS: 9A F0 FE 1D F0
Новий виклик DOS: CD 21 CB
Адреси:
-і-і-і-
Кінець пам'яті: 9FC0:0000
Оброблювач завершення: 0AFA:02B1
Оброблювач Ctrl+Break: 0AFA:014A
Оброблювач критич.помилки: 0AFA:0155
Стік: 0E04:0F94
Батько: 0AFA
Таблиця файлів: 0BA0:0018 (20) - у цьому ж PSP
1 1 1 0 2 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
Оточення DOS: 0A1E
CONFIG=STD
COMSPEC=C:\DOS\COMMAND.COM
PROMPT=$p$g
PATH=D:\WIN;C:\;C:\DOS;C:\ARH;C:\NC;C:\BAT;D:\TP;D:\TP7;D:\BC\BIN
TEMP=d:\~TMP
Число рядків виклику: 1
D:\TC\TC_LAB11.EXE
-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і
7. Висновки:
У ході даної роботи вивчили принципи керування програмами в MS_DOS і придбали практичні навички роботи із префіксом програмбагато сегмента і його полів.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.