Пример использования системных вызовов
Пример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();
}