Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СПО от Тихомирова / Уч пособие по КР СПО 2009 Ред 15-11-09.doc
Скачиваний:
27
Добавлен:
08.06.2015
Размер:
842.24 Кб
Скачать

1.1.6.2. Вызов функции NtQuerySystemInformation

При получении информации класса 5 объем возвращаемых функцией данных велик – несколько десятков Кбайт и заранее не известен. Поэтому функция вызывается несколько раз, и при каждом новом вызове размер буфера под данные удваивается.

ListSize := $400; { Начальный размер буфера }

InfoClass := 5; // класс информации – сведения о процессах и потоках

GetMem(Result, ListSize);

rc := NtQuerySystemInformation (InfoClass, Result, ListSize, @ReturnLength);

while rc = STATUS_INFO_LENGTH_MISMATCH do

begin

FreeMem(Result);

ListSize := ListSize * 2;

GetMem(Result, ListSize);

rc := NtQuerySystemInformation(InfoClass, Result, ListSize, @ReturnLength);

end;

if rc <> STATUS_SUCCESS then

begin

FreeMem(Result);

Result := nil;

end;

Описание данных, используемых в приведенном фрагменте.

const

STATUS_INFO_LENGTH_MISMATCH = NTSTATUS($C0000004);

STATUS_SUCCESS = NTSTATUS($00000000);

var

ListSize : Integer; Result : pointer;

rc : NTSTATUS; InfoClass : LongInt;

ReturnLength : Integer;

При запросе данных других классов объем данных может быть известен заранее и процедура вызова функции упрощается.

1.1.6.3. Получение сведений о процессах и потоках

При просмотре полученных данных следует руководствоваться рис.1 и методикой работы с указателями в языке Паскаль и материалами курса ООП. Для увеличения значения указателя на величину NextEntryDelta рекомендуется привести указатель к типу Cardinal.

1.1.6.4. Преобразование данных из формата FileTime в формат SystemTime

Значения параметров типа Время возвращаются функцией NtQuerySystemInformation в формате LARGE_INTEGER – 64 битовое значение. Данное значение необходимо привести к типу FILETIME, например FileTime (переменная типа LARGE_INTEGER).

Далее полученное значение (исходное) с помощью процедуры FileTimeToLocalFileTime (Исходное, Результат) преобразовать во время текущего часового пояса. Полученный результат процедурой FileTimeToSystemTime (Результат, Время_В_формате SystemTime) преобразовать в формат SystemTime – это структура с полями год, месяц, день, час, минута и т.д.

1.1.6.5. Вычисление загрузки процессора

Суммарная загрузка процессора определяется за время 1 Сек (по тикам таймера). Необходимо найти отношение r приращения величины времени простоя процессора за время 1 сек к приращению текущего времени CurrentTime – класс 3. Загрузка ЦП в % за последнюю секунду равна (1-r)*100

1.1.7 Формирование протокола использования процессора

Протокол использования процессора должен содержать имя процесса, дату и время старта (запуска) процесса и время завершения прикладного процесса.

Для получения сведений о дате и времени используется процедура

GetProcessTimes (Hp: Thandle; var Ts, Tf, Tk, Tu: TFileTime);

Hp – описатель процесса, значение описателя возвращается функцией OpenProcess(), см. п.4.2;

Ts, Tf, Tk, Tu – возвращаемые функцией значения, соответственно время старта, время завершения процесса, время работы процессора в режиме ядра и время работы процессора в режиме пользователя.

Так как время старта и время завершения представлены по Гринвичу, значения Ts и Tf сначала необходимо преобразовать в значения, соответствующие текущему часовому поясу. Для преобразования используется процедура

FileTimeToLocalFileTime (Tгринв, Tлокал : TFileTime);

Затем полученное значение преобразуется из формата TFileTime в формат TSystemTime с помощью функции FileTimeToSysTemTime (Tft: TFileTime, TSystemTime).

Структура состоит из полей, представляющих год, месяц, день, час, минуту, секунду и миллисекунду в формате Word. Содержимое каждого поля преобразуется в текст с помощью функции IntToStr() и может быть выведено в текстовый файл или на экран.