- •Содержание задания
- •Индивидуальные варианты заданий (обираемая информация о компьютере)
- •Возможный вид главной формы программы-инсталлятора
- •Возможный вид дополнительной диалоговой формы основной программы
- •Классы библиотеки Framework Class Library и объекты для использования в приложениях на платформе .Net
- •Рекомендуемые для разработки программы средства языка Object Pascal
Возможный вид главной формы программы-инсталлятора

Кнопка «Установить программу» разблокируется после ввода имени раздела реестра, хранящего электронную цифровую подпись под собранной при установке программы информацией, и ввода имени устанавливаемой программы. Кнопка «Закрыть» разблокируется после завершения процесса установки программы. В указаниях по выполнению лабораторных работ эта форма имеет имя 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++
Сбор информации о компьютере:
// получение в буфере 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);
Получение и проверка электронной цифровой подписи (ЭЦП) (константы, типы данных и прототипы функций определены в файле 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);
Работа с реестром 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);
Работа с реестром 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);
Отображение системного диалога для выбора папки (при установке программы) и получение полного пути к выбранной пользователем папке. Требуется подключение файла 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);
