Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задания на лабораторные работы / Лабораторная работа №7.doc
Скачиваний:
55
Добавлен:
28.06.2014
Размер:
174.59 Кб
Скачать

Рекомендуемые для разработки программы средства языка Object Pascal

  1. Сбор информации о компьютере:

// получение в буфере lpBuffer длины nSize имени пользователя текущего сеанса

function GetUserName(lpBuffer: PChar; var nSize: DWORD): BOOL;

{ получение имени компьютера в буфере lpBuffer длины nSize>= MAX_COMPUTERNAME_LENGTH+1 }

function GetComputerName(lpBuffer: PChar; var nSize: DWORD): BOOL;

{ получение в буфере lpBuffer длины uSize >= MAX_PATH пути к каталогу с ОС Windows }

function GetWindowsDirectory(lpBuffer: PChar; uSize: UINT): UINT;

{ получение в буфере lpBuffer длины uSize >= MAX_PATH пути к системному каталогу Windows }

function GetSystemDirectory(lpBuffer: PChar; uSize: UINT): UINT;

// получение типа (nTypeFlag=0) или подтипа (nTypeFlag=1) клавиатуры

function GetKeyboardType(nTypeFlag: Integer): Integer;

{ получение количества кнопок мыши (nIndex=SM_CMOUSEBUTTONS), ширины (nIndex=SM_CXSCREEN) или высоты (nIndex=SM_CYSCREEN) экрана }

function GetSystemMetrics(nIndex: Integer): Integer;

{ получение в буфере lpBuffer длины nBufferLength строки с корневыми каталогами всех дисков, разделенных 0-символами; результат – длина полученной строки без заключительного 0-символа }

function GetLogicalDriveStrings(nBufferLength: DWORD; lpBuffer: PAnsiChar): DWORD;

{ получение в буфере *lpBuffer структуры типа MEMORYSTATUS с характеристиками памяти компьютера (поле dwTotalPhys содержит целое число, равное общему объему физической памяти в байтах) }

procedure GlobalMemoryStatus(var lpBuffer: TMemoryStatus);

{ получение информации об объеме текущего диска (lpRootPathName=NULL): количестве секторов в кластере (lpSectorsPerCluster), размере сектора (lpBytesPerSector), общем количестве кластеров (lpTotalNumberOfClusters), lpNumberOfFreeClusters=NULL }

function GetDiskFreeSpace(lpRootPathName: PChar; var lpSectorsPerCluster, lpBytesPerSector, lpNumberOfFreeClusters, lpTotalNumberOfClusters: DWORD): BOOL;

{ получение информации о текущем диске (lpRootPathName=NULL): метке тома (в буфере lpVolumeNameBuffer длины nVolumeNameSize), серийном номере (в переменной lpVolumeSerialNumber), файловой системе (в буфере lpFileSystemNameBuffer длины nFileSystemNameSize), lpMaximumComponentLength=NULL, lpFileSystemFlags=NULL }

function GetVolumeInformation(lpRootPathName: PChar;

lpVolumeNameBuffer: PChar; nVolumeNameSize: DWORD; lpVolumeSerialNumber: PDWORD; var lpMaximumComponentLength, lpFileSystemFlags: DWORD; lpFileSystemNameBuffer: PChar; nFileSystemNameSize: DWORD): BOOL;

  1. Получение и проверка электронной цифровой подписи (ЭЦП) (константы, типы данных и прототипы функций определены в файле wincrypt.pas):

THandle – тип данных для дескрипторов криптопровайдера, криптографического ключа, хеш-объекта

ALG_ID – тип данных для кодов криптографических алгоритмов

{ инициализация криптопровайдера: в *phProv записывается его дескриптор,

pszContainer=NULL, pszProvider=NULL, dwProvType=PROV_RSA_FULL,

dwFlags=0 или (если при первом запуске программы CryptAcquireContext возвращает FALSE) регистрация нового пользователя в криптопровайдере dwFlags= CRYPT_NEWKEYSET }

function CryptAcquireContext(var hProv:THandle;pszContainer,pszProvider:PChar;

dwProvType,dwFlags:Longint):Longbool;

{ создание в криптопровайдере с дескриптором hProv пары ключей ЭЦП (Algid=AT_SIGNATURE, dwFlags=0) и запись дескриптора открытого ключа в *phKey }

function CryptGenKey(hProv:THandle; Algid:ALG_ID; dwFlags:Longint; var phKey:THandle):Longbool;

{ получение у криптопровайдера с дескриптором hProv дескриптора открытого ключа ЭЦП (dwKeySpec=AT_SIGNATURE) в переменной *phUserKey (если функция возвращает FALSE, то пару ключей ЭЦП нужно создать с помощью функции CryptGenKey) }

function CryptGetUserKey(hProv:THandle; dwKeySpec:Longint; var phUserKey:THandle):Longbool;

{ создание пустого хеш-объекта (hProv – дескриптор инициализированного криптопровайдера, Algid – код алгоритма хеширования, hKey=0, dwFlags=0, в *phHash записывается дескриптор хеш-объекта) }

function CryptCreateHash(hProv:THandle; Algid:ALG_ID; hKey:THandle; dwFlags:Longint; var hHash:THandle):Longbool;

{ добавление в хеш-объект данных из буфера *pbData длины dwDataLen (hHash – дескриптор хеш-объекта, dwFlags=0) }

function CryptHashData(hHash:THandle; pbData:Pointer; dwDataLen,dwFlags: Longint): Longbool;

{ получение для хеш-объекта с дескриптором hHash ЭЦП в буфере pbSignature длины *pdwSigLen (после выполнения функции в эту переменную записывается фактическая длина ЭЦП); dwKeySpec=AT_SIGNATURE, sDescription=NULL, dwFlags=0 }

function CryptSignHash(hHash:THandle; dwKeySpec:Longint; sDescription:PChar; dwFlags:Longint; pbSignature: Pointer; var pdwSigLen: Longint): Longbool;

{ проверка ЭЦП из буфера *pbSignature длины dwSigLen для хеш-объекта с дескриптором hHash с помощью открытого ключа hPubKey (sDescription=NULL, dwFlags=0) }

function CryptVerifySignature(hHash:THandle; pbSignature:Pointer; dwSigLen:Longint; hPubKey:THandle; sDescription:PChar; dwFlags:Longint): Longbool;

// разрушение хеш-объекта с дескриптором hHash

function CryptDestroyHash(hHash:THandle):Longbool;

// разрушение ключа шифрования с дескриптором hKey

function CryptDestroyKey(hKey:THandle):Longbool;

// освобождение криптопровайдера с дескриптором hProv (dwFlags=0)

function CryptReleaseContext(hProv:THandle;dwFlags:Longint):Longbool;

  1. Работа с реестром Windows:

Класс TRegistry (определен в модуле registry):

  • конструктор без параметров;

  • свойства:

RootKey: HKEY (корневой раздел реестра, по умолчанию HKEY_CURRENT_USER);

CurrentKey: HKEY(текущий раздел реестра, только для чтения);

CurrentPath: string(путь к текущему разделу реестра, только для чтения).

  • методы:

{ открытие или (если CanCreate=true) при необходимости создание текущего раздела реестра Key }

function OpenKey(const Key: string; CanCreate: Boolean): Boolean;

{ запись (перезапись) в текущий раздел реестра значения параметра Name из буфера Buffer длины BufSize }

procedure WriteBinaryData(const Name: string; var Buffer; BufSize: Integer);

// запись и закрытие текущего раздела реестра

procedure CloseKey;

// проверка существования в реестре раздела Key

function KeyExists(const Key: string): Boolean;

{ чтение из текущего раздела реестра значения параметра Name в буфер Buffer длины BufSize }

function ReadBinaryData(const Name: string; var Buffer; BufSize: Integer): Integer;

  1. Отображение системного диалога для выбора папки (при установке программы) и получение полного пути к выбранной пользователем папке. Требуется подключение модуля Shlobj.

{ отображение системного диалога; структура lpbi содержит информацию для настройки диалога: функция возвращает указатель на созданный элемент, хранящий размещение выбранной пользователем папки; при отказе пользователя от выбора функция возвращает NULL }

function SHBrowseForFolder(var lpbi: TBrowseInfo): PItemIDList;

{ преобразование размещения папки pidl, полученного с помощью функции SHBrowseForFolder, в полный путь к этой паке в буфере pszPath длиной не менее MAX_PATH байт }

function SHGetPathFromIDList(pidl: PItemIDList; pszPath: PChar): BOOL;

{ освобождение памяти, выделенной при выполнении функции SHBrowseForFolder, указатель на которую данная функция возвратила в качестве результата }

function LocalFree(hMem: HLOCAL): HLOCAL;