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

Возможный вид главной формы программы-инсталлятора

Кнопка «Установить программу» разблокируется после ввода имени раздела реестра, хранящего электронную цифровую подпись под собранной при установке программы информацией, и ввода имени устанавливаемой программы. Кнопка «Закрыть» разблокируется после завершения процесса установки программы. В указаниях по выполнению лабораторных работ эта форма имеет имя Form1.

Возможный вид дополнительной диалоговой формы основной программы

Может быть создана с помощью глобальной функции InputBox библиотеки Visual Component Library систем Delphi и C++ Builder.

Классы библиотеки Framework Class Library и объекты для использования в приложениях на платформе .Net

Класс System.Environment – параметры операционной среды.

Свойство String* SystemDirectory – путь к папке System32.

Свойство String* MachineName – имя компьютера.

Свойство __int64 WorkingSet – объем физической памяти, доступной процессу.

Метод String* GetEnvironmentVariable(String* variable) – получение значения, специфицируемого variable (USERNAME, WINDIR и др.).

Метод String* GetFolderPath(Environment.SpecialFolder folder) –получение пути к системной папке, специфицируемой folder (System).

Метод String* GetLogicalDrives() [] – получение массива строк, каждая из которых содержит имя логического диска.

Класс System.Windows.Forms.SystemInformation – получение информации об операционной системе.

Свойство int MouseButtons – количество кнопок мыши.

Свойство Size PrimaryMonitorSize – высота (поле Size.Height)и ширина (поле Size.Width)монитора.

Свойство String* UserName − имя пользователя.

Свойство String* ComputerName – имя компьютера.

Класс Microsoft.Win32.Registry – доступ к системному реестру.

Свойство RegistryKey* CurrentUser – раздел HKEY_CURRENT_USER.

Класс Microsoft.Win32.RegistryKey – доступ к подразделу реестра.

Метод RegistryKey* CreateSubKey(String* subkey) – создание или открытие подраздела.

Метод RegistryKey* OpenSubKey(String* name) – открытие существующего подраздела.

Метод void SetValue(String* name, Object* value) – запись значения value параметра name.

Метод Object* GetValue(String* name) – чтение значения параметра.

Метод void Close() – закрытие раздела реестра.

Класс System.Security.Cryptography.RSACryptoServiceProvider – реализация асимметричного криптоалгоритма RSA.

Класс System.Security.Cryptography.RSAPKCS1SignatureFormatter – получение ЭЦП по алгоритму RSA.

Конструктор RSAPKCS1SignatureFormatter(AsymmetricAlgorithm* key) – создание объекта вычисления ЭЦП закрытым ключом из объекта асимметричного криптоалгоритма key.

Метод void SetHashAlgorithm(String* strName) – задание алгоритма хеширования.

Метод unsigned char CreateSignature(unsigned char rgbHash[])[] – вычисление подписи для данных rgbHash.

Класс System.Security.Cryptography.RSAPKCS1SignatureDeformatter − проверка ЭЦП по алгоритму RSA.

Конструктор RSAPKCS1SignatureDeformatter(AsymmetricAlgorithm* key) – создание объекта проверки ЭЦП открытым ключом из объекта асимметричного криптоалгоритма.

Метод void SetHashAlgorithm(String* strName) – задание алгоритма хеширования.

Метод bool VerifySignature(unsigned char rgbHash [], unsigned char rgbSignature []) – проверка ЭЦП rgbSignature под данными rgbHash.

Объект Shell.Application – доступ к оболочке Windows.

Метод BrowseForFolder(Hwnd,sTitle,iOptions,[vRootFolder]) – отображение окна выбора папки с родительским окном Hwnd (или 0), текстом внутри окна sTitle, опциями (аналогичными полям структуры BROWSEINFO) iOptions и возможной корневой папкой для выбора vRootFolder; возвращается ссылка на объект Folder.

Объект Folder – папка, выбранная пользователем в стандартном диалоговом окне.

Свойство Self – ссылка на объект FolderItem, связанный с этой папкой.

Объект FolderItem – информация об объекте оболочки Windows.

Свойство Path – полный путь к папке, включая ее имя.

Объект Scripting.FileSystemObject – информация об объектах файловой системы.

Метод GetDrive (drivespec) – получение ссылки на объект Drive с информацией о диске drivespec.

Объект Drive – информация о диске.

Свойство VolumeName – метка дискового тома.

Свойство TotalSize – размер в байтах.

Свойство FileSystem – файловая система.

Свойство SerialNumber – серийный номер.

Рекомендуемые для разработки программы средства языка Си++ и систем C++ Builder и Visual C++

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

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

BOOL GetUserName(LPTSTR lpBuffer, LPDWORD nSize);

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

BOOL GetComputerName(LPTSTR lpBuffer, LPDWORD nSize);

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

UINT GetWindowsDirectory(LPTSTR lpBuffer,UINT uSize);

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

UINT GetSystemDirectory(LPTSTR lpBuffer, UINT uSize);

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

int GetKeyboardType(int nTypeFlag);

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

int GetSystemMetrics(int nIndex);

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

DWORD GetLogicalDriveStrings(DWORD nBufferLength, LPTSTR lpBuffer);

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

VOID GlobalMemoryStatus(LPMEMORYSTATUS lpBuffer);

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

BOOL GetDiskFreeSpace(LPCTSTR lpRootPathName, LPDWORD lpSectorsPerCluster, LPDWORD lpBytesPerSector, LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters);

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

BOOL GetVolumeInformation(LPCTSTR lpRootPathName, LPTSTR lpVolumeNameBuffer, DWORD nVolumeNameSize, LPDWORD lpVolumeSerialNumber, LPDWORD lpMaximumComponentLength, LPDWORD lpFileSystemFlags, LPTSTR lpFileSystemNameBuffer, DWORD nFileSystemNameSize);

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

HCRYPTPROV, HCRYPTKEY, HCRYPTHASH – типы данных для дескрипторов криптопровайдера (CSP), криптографического ключа, хеш-объекта

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

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

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

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

BOOL CryptAcquireContext(HCRYPTPROV *phProv, LPCSTR pszContainer,

LPCSTR pszProvider, DWORD dwProvType, DWORD dwFlags);

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

BOOL CryptGenKey(HCRYPTPROV hProv, ALG_ID Algid,

DWORD dwFlags, HCRYPTKEY *phKey);

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

BOOL CryptGetUserKey(HCRYPTPROV hProv, DWORD dwKeySpec,

HCRYPTKEY *phUserKey);

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

BOOL CryptCreateHash(HCRYPTPROV hProv, ALG_ID Algid,

HCRYPTKEY hKey, DWORD dwFlags, HCRYPTHASH *phHash);

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

BOOL CryptHashData(HCRYPTHASH hHash, CONST BYTE *pbData,

DWORD dwDataLen, DWORD dwFlags);

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

BOOL CryptSignHash(HCRYPTHASH hHash, DWORD dwKeySpec,

LPCTSTR sDescription, DWORD dwFlags, BYTE *pbSignature,

DWORD *pdwSigLen);

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

BOOL CryptVerifySignature(HCRYPTHASH hHash, BYTE *pbSignature,

DWORD dwSigLen, HCRYPTKEY hPubKey, LPCTSTR sDescription,

DWORD dwFlags);

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

BOOL CryptDestroyHash(HCRYPTHASH hHash);

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

BOOL CryptDestroyKey(HCRYPTKEY hKey);

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

BOOL CryptReleaseContext(HCRYPTPROV hProv, DWORD dwFlags);

  1. Работа с реестром Windows в C++ Builder:

Класс TRegistry (определен в файле vcl\registry.hpp):

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

  • свойства:

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

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

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

  • методы:

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

bool OpenKey(const AnsiString Key, bool CanCreate);

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

void WriteBinaryData(const AnsiString Name, void *Buffer, int BufSize);

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

void CloseKey();

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

bool KeyExists(const AnsiString Key);

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

int ReadBinaryData(const AnsiString Name, void *Buffer, int BufSize);

  1. Работа с реестром Windows в Visual C++:

Класс CWinApp:

  • поля:

LPCTSTR m_pszRegistryKey (текущий раздел реестра, предназначенный для хранения настроек приложения, по умолчанию внутри НКЕУ_CURRENT_USER\Software)

LPCTSTR m_pszProfileName (имя подраздела реестра внутри текущего раздела, по умолчанию совпадает с именем приложения)

  • методы:

/* запись в раздел lpszSection (внутри текущий раздел \ имя подраздела) параметра lpszEntry из буфера pData длины nBytes */

BOOL WriteProfileBinary ( LPCTSTR lpszSection, LPCTSTR lpszEntry, LPBYTE pData, UINT nBytes);

/* чтение значения параметра lpszEntry из раздела lpszSection (внутри текущий раздел \ имя подраздела) в буфер *ppData длины *pBytes */

BOOL GetProfileBinary ( LPCTSTR lpszSection, LPCTSTR lpszEntry, LPBYTE *ppData, UINT *pBytes);

/* Функция для выделения памяти под значение поля класса CWinApp при его изменении (создание дубликата строки strSource для возможности его освобождения деструктором класса) */

wchar_t *_wcsdup( const wchar_t *strSource);

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

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

LPITEMIDLIST SHBrowseForFolder(LPBROWSEINFO lpbi);

// вариант предыдущей функции для Microsoft Visual Studio

PIDLIST_ABSOLUTE SHBrowseForFolder(LPBROWSEINFO lpbi);

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

BOOL SHGetPathFromIDList(LPCITEMIDLIST pidl, LPSTR pszPath);

// вариант предыдущей функции для Microsoft Visual Studio

BOOL SHGetPathFromIDList(PCIDLIST_ABSOLUTE pidl, LPTSTR pszPath);

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

HLOCAL LocalFree(HLOCAL hMem);

void CoTaskMemFree(LPVOID pv);