Лекция 14

Пример использования системных вызовов

Пример1 "Системный вызов ioctl()":

Системный вызов ioctl() универсальное средство управления аппаратными устройствами. Первый аргумент - дескриптор файла того устройства которым требуется управлять, второй аргумент - код запроса на конкретную операцию.

Рассмотрим пример использования этого системного вызова для извлечения компакт-диска из дисковода.

// cdrom-eject.c

#include <fcntl.h>

#include <linux/cdrom.h>

#include <sys/ioctl.h>

#include <sys/stat.h>

#include <sys/types.h>

#include <unistd.h>

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

{

//открытие файла устройства указанного в командной строке

int fd=open(argv[1], O_RDONLY);

//Извлечение диска из устройства

ioctl(fd, CDROMEJECT);

close(fd);

return 0;

}

Пример 2 "Использование API функций для работы с процессом"

Вывод информации в не модальное окно может быть выполнен явно и не явно. При неявном выводе информация создается пользователем. При не явном выводе информация представляет собой значение возвращаемое какой либо системной API функции. В качестве примера вывод идентификатора в консоль

Получить значения идентификатора текущего процесса позволяет функция которая называется DWORD GetCurrentProcessId(void). Алгоритм работы программы следующий:

1. Вызывается функция GetCurrentProcessId(void) и сохраняется в регистре EAX

2. Содержимое ЕАХ преобразуется в строку символов которая помещаетсяв буфер.

3. Адрес начала строки сохраняется в индексном регистре EDI

4. Строка символов передается в функцию MassageBox

5. Вызов функции MassageBox

Исходный модуль на ASM

.386

model flat, stdcall

include c\tasm\examples\wap32\win32.inc

includelib import32.lib

extrn GetCurrentProcessId:proc

extrn MassageboxA:proc

extrn ExitProcess:proc

.data

mesbox_title db "Id of current process: ", 0

textbuf db 11 dup(0), 0

.code

Start:

call GetCurrentProcessId;результат в EAX

; преобразование числа в строку

lea edi, textbuf+11

mov esi,10

Clr_dvd:

xor edx,edx

div esi

add edx,'0'

dec edi

mov Byte PTR[edi],dl

or eax,eax

jnz Clr_Dvd

; создание диалогового окна

push MB_OK

push offset messbox_title

push offset edi

push 0

call MessageBoxA

call ExitProcess

ends

end start

Вариант на С++

#include <windows.h>

#include <iostream.h>

#include <conio.h>

void main()

{

DWORD dwpid=GetCurrentProcessId();

cout<<"Current Id Of Processd:"<<wpid;

getch();

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: