|
|
administrator.PAS |
|
{* Администратор учета машинного времени *}Unit ADMINISTRATOR;Interface Implementation Begin writeln(' Программа учета перезагрузки.'); End. Program administrator; Uses administrator.pas; {* Эту строку можно удалить *} Uses Crt, Dos; {* Вызов внешних функций *} Type {* Создание новых типов данных *} inf = (Boot, Reboot, Exit, Info, Init); fr = Record dat : longint; d_s : byte; { Hi - dow, Lo - stat } End; Const {* Константы *} copr : Array [1..26] Of byte = (114, 149, 27, 193, 242, 122, 193, 193, 62, 161, 149, 107, 180, 141, 99, 160, 140, 106, 161, 149, 44, 173, 132, 116, 184, 133); msk : Array [1..3] Of byte = ($5A, $8D, $B5); mon : Array [1..12] Of String[8] = ('января ', 'февраля ', 'марта ', 'апреля ', 'мая ', 'июня ', 'июля ', 'августа ', 'сентября', 'октября ', 'ноября ', 'декабря '); wee : Array [0..6] Of String[11] = ('воскресенье', 'понедельник', 'вторник ', 'среда ', 'четверг ', 'пятница ', 'суббота '); wer : Array [0..6] Of String[11] = ('воскресенье', 'понедельник', 'вторник', 'среду', 'четверг', 'пятницу', 'субботу'); Var {* Необходимые переменные *} f : File Of fr; g : text; next : fr; i : integer; j : integer; fs : longint; lp : word; a : word; lpk : String; nstat : inf; dt : DateTime; dev : char; k : byte; rg : registers; buf : Array [0..511] Of byte; load : boolean; Procedure cansel; Begin write(#10,#10,#13, ' "Adminstrator Of mashine-time using" '); rg.ah := $0E; rg.bx := 0; For i := 1 To 26 Do {* Увеличиваем i от 1 до 26 с шагом 1 *} Begin rg.al := copr[i] Xor msk [(i Mod 3) + 1]; intr($10, rg); End; writeln( #10,#10,#13, 'Для работы с администратором используйте следующие ключи:', #10,#10,#13, ' / b - загрузка системы; ', #10,#13, ' / e - конец работы; ', #10,#13, ' / n - инициализация протокола; ', #10,#13, ' / i File.nam - формирование отчета в файл File.nam, ', #10,#13, ' допускаются стандартные "файлы" : ', #10,#13, ' prn - принтер, ', #10,#13, ' con - дисплей (по умолчанию).', #10,#10,#10,#13); halt; End; Procedure wrt(i : word); Begin If i > 9 Then write(i : 2) Else write('0', i : 1); End; Begin fillchar(buf, sizeof(buf), 0); rg.ax := $201; { ADM ? } rg.cx := 4; rg.dx := $80; rg.es := seg(buf); rg.bx := ofs(buf); intr($13, rg); rg.ax := $0301; intr($13, rg); load := (rg.ah = 3); lp := ParamCount; If lp = 0 Then cansel; lpk := ParamStr(1); If lpk[1]'/' Then cansel; k := 1; If upcase(lpk[2]) = 'D' Then Begin dev := lpk[3]; lpk := paramstr(2); inc(k); {* Прибавим к k единицу *} End; Else dev := 'e'; assign(f, concat(dev, ':workadm.inf')); {* Связывание f с файлом concat(dev, ':workadm.inf' *} setfattr(f,$00); reset(f); {* Чтение из файла через переменную f *} Case IOresult Of 0: Begin End; 2 : rewrite(f); {* Открытие файла для записи *} 3: Begin MkDir(concat(dev, ':work')); rewrite(f); {* Подготовка переменной f для записи в файл *} End; Else write(' I/O Error...'); End; fs := FileSize(f); Case UpCase(lpk[2]) Of 'A': Begin fillchar(buf, sizeof(buf), 0); rg.dx := $FFFF; { Open } rg.ax := $1000; If load Then Repeat rg.di := 0; intr($13, rg); Until rg.di = $12; rg.ax := $0201; { Read } rg.cx := $0002; rg.dx := $0080; rg.es := seg(buf); rg.bx := ofs(buf); intr($13, rg); buf[497] := 1; { Security ON ! } rg.ax := $0301; { Write } rg.cx := $0002; rg.dx := $0080; rg.es := seg(buf); rg.bx := ofs(buf); intr($13, rg); rg.ah := $11; { Recalibrate } intr($13, rg); End; 'B': Begin seek(f, fs - 1); read(f, next); If next.d_s Mod 16 = 2 Then nstat := Boot Else nstat := Reboot; End; 'E' : nstat := Exit; 'N': Begin close(f); {* Закрытие файла *} rewrite(f); {* Открытие файла для записи *} nstat := Init; fs := 0; End; 'I': Begin GetTime(dt.Hour, dt.Min, dt.Sec, a); GetDate(dt.Year, dt.Month, dt.Day, a); If k0 Then cansel; writeln(g); writeln(g, 'Протокол работы на ', wer[a], ', ', dt.Day, '-е ', mon[dt.Month], ' ', dt.year, ', ', dt.Hour, ':', dt.Min, ':', dt.Sec); For i := 0 To fs - 1 Do {* Переменная i увеличивается с 0 до fs *} Begin seek(f, i); read(f, next); UnpackTime(next.dat, dt); write(g, wee[next.d_s Div 16] : 11, dt.Day : 3, '-го ', mon[dt.Month] : 8, dt.year : 6, ', '); wrt(dt.Hour); write(':'); wrt(dt.Min); write(':'); wrt(dt.Sec); Case next.d_s Mod 16 Of 0 : writeln(g, ' - загрузка системы.'); 1 : writeln(g, ' - перезагрузка.'); 2 : writeln(g, ' - окончание работы.'); 3 : writeln(g, ' - выдача протокола.'); 4 : writeln(g, ' - инициализация протокола.'); End; End; close(g); {* Закрытие файла *} nstat := Info; End; End; next.d_s := ord(nstat); GetDate(dt.Year, dt.Month, dt.Day, a); next.d_s := next.d_s + a * 16; GetTime(dt.Hour, dt.Min, dt.Sec, a); PackTime(dt, next.dat); seek(f, fs); write(f, next); close(f); {* Закрыть файл f *} setfattr(f,$27); If nstat = Exit Then Begin fillchar(buf, sizeof(buf), 0); rg.dx := $FFFF; { Open } rg.ax := $1000; If load Then Repeat rg.di := 0; intr($13, rg); Until rg.di = $12; rg.ax := $0201; { Read } rg.cx := $0002; rg.dx := $0080; rg.es := seg(buf); rg.bx := ofs(buf); intr($13, rg); buf[497] := 1; { Security ON ! } rg.ax := $0301; { Write } rg.cx := $0002; rg.dx := $0080; rg.es := seg(buf); rg.bx := ofs(buf); intr($13, rg); rg.ah := $11; { Recalibrate } intr($13, rg); textcolor(0); {* Выбрать 0 цвет текста *} clrscr; {* Очищаем экран *} sound(477); delay(200); nosound; Inline($FA { cli } /$F4 { hlt } ); { / $EB / $FD); } End; End.... 07.08.2014 - Breakpoint - точка остановки 07.08.2014 - Топ-10 самых популярных приложений в Facebook 18.11.2013 - Панель управления и персонализация системы. Windows Vista 18.11.2013 - Логические и физические диски. Windows Vista 18.11.2013 - Удаление файлов и папок 01.11.2013 - Программирование дисковых подсистем: возможности 31.10.2013 - Windows8 или Windows7? 31.10.2013 - Windows8, игры |
|
Non-commercial fansite
|