Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Win API


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / WinAPI

Выпуск № 389
от 08.02.2007, 11:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 406, Экспертов: 42
В номере:Вопросов: 3, Ответов: 5


Вопрос № 73798: Здравствуйте. Подзадолбал меня уже Visual своими предупреждениями насчет стандартных строковых С-функций. Например: warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. Я смотрел в MSDN эти "...
Вопрос № 73837: Здраствуйте!!! Я никак не могу найти как рисовать или вставлять текст вне сообщение WM_PAINT. Или какие есть еще функции вывода тектса в рабочию область кроме DrawText() И еще один вопрос: никак не могу определить акселераторы в ресурсах! Если мо...
Вопрос № 73858: Есть ли в составе wininet.dll функция для определения даты создания файла, который нужно скачать. Т.е. основываясь на дате надо определить стоит ли скачивать обнавление....

Вопрос № 73.798
Здравствуйте. Подзадолбал меня уже Visual своими предупреждениями насчет стандартных строковых С-функций. Например:
warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead.
Я смотрел в MSDN эти " ..._s" функции - это почти тоже самое, только добавлен еще один параметр - размер буфера-приемника.
До сих пор я не обращал на такие предупреждения внимания, относился к ним как к "защите от дурака". Но может быть я просто мало знаю и могут быть "подводные камни" на уровне ниже API. Например что нибуть связанное с многопоточностью и т. п. И может приключиться
какой нибудь "unsafe" по не зависящим от меня причинам.
Вопрос такой: Стоит ли применять этот "язык С++ от Microsoft"?
Спасибо.
Отправлен: 02.02.2007, 18:28
Вопрос задал: Lameruga (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: Базанов Иван Александрович
Здравствуйте, Lameruga!
Употреблять стоит - это защита от переполнения буфера приемника.
---------
Программист ошибается дважды: первый раз при рождении, второй при выборе профессии
Ответ отправил: Базанов Иван Александрович (статус: 3-ий класс)
Ответ отправлен: 02.02.2007, 18:53
Оценка за ответ: 4

Отвечает: burbot
Здравствуйте, Lameruga!

С моей точки зрения ответ однозначен - ДА! Использовать стоит. Более того это необходимо если Вы пишете программу, которая выполняет некие функции системного администрирования с привилегиями суперпользователя.

Дело в том, что стандартные функции strcat, strcpy и т.д. не выполняют проверку переполения буфера. Они ориентируются только на то, что каждая строка должна заканчиваться нулевым символом.
Возьмем, к примеру, функцию strcat (добавляет строку в конец другой строки).
Она принимает всего два параметра: указатель на буфер-приемник и указатель на буфер-источник.
Допустим, что размер памяти, отведенный для буфера-приемника, равен 256 байт.
Если в качестве буфера-источника передать строку длиной, скажем, 512 байт и допустить, что буфер-приемник был до выполнения функции пуст, то 256 байт буфера-источника лягут в буфер-приемник, а остальные 256 байт лягут в память сразу после буфера-приемника. А там может быть все, что угодно, как данные, так и код программы.

Как программист Вы знаете, что у Вас буфер-приемник всего 256 байт и не станете передавать функции буфер-источник больше этого размера.

НО!!! Допустим, что Вы сами не знаете заранее длину буфера-источника. Скажем, Вы считываете строку из Edit-контрола какого-либо диалогового окна и передаете считанную строку функции strcat в качестве буфера-источника.
Вот тут-то у Вас и появилось потенциально уязвимое место в Вашей программе, которое с радостью воспримет какой-либо кул-хацкер, написав к Вашей программе так называемый ЭКСПЛОЙТ, т.е. программу, которая использует уязвимость другой программы для разрушения защиты этой программы и выполнения вредоносных действий.
Уязвимость такого рода называется ПЕРЕПОЛНЕНИЕМ БУФЕРА.

Надеюсь, написал хоть и длинно, зато понятно.
Поищите в инете информацию по каким либо эксплойтам на переполнение буфера.
Вы будете удивлены, как их много ;)

Лично я для работы со строками использую либо самописные функции, в которых производится проверка на переполение буфера, либо использую функции типа StringCb... или StringCch... , которые объявлены в файле strsafe.h из состава PlatformSDK.

Всего доброго!
---------
Хорошо смеется тот, кто смеется над собой. (C)
Ответ отправил: burbot (статус: 2-ой класс)
Ответ отправлен: 02.02.2007, 20:10
Оценка за ответ: 5
Комментарий оценки:
Убедили. Respect.


Вопрос № 73.837
Здраствуйте!!! Я никак не могу найти как рисовать или вставлять текст вне сообщение WM_PAINT. Или какие есть еще функции вывода тектса в рабочию область кроме DrawText()
И еще один вопрос: никак не могу определить акселераторы в ресурсах! Если можно сылки на примеры сделаны на Cи!
Спасибо!!!
Отправлен: 02.02.2007, 23:34
Вопрос задал: HITY (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Tek
Здравствуйте, HITY!
По поводу вывода текста:
Есть еще TextOut, ExtTextOut, PolyTextOut, DrawTextEx.
Только чем вас не устраивает DrawText просто. Им можно рисовать и вне WM_PAINT.
Если проблема в отсутствии контекста устройства, то его можно получать функциями GetDC, GetWindowDC, CreateCompatibleDC и т. д.
---------
WinApi - жутко неудобные костыли, MFC и VCL - немногим полезнее, но ничего лучше еще не создано (C)Почти Уинстон Черчилль :)
Ответ отправил: Tek (статус: 9-ый класс)
Ответ отправлен: 05.02.2007, 09:23
Оценка за ответ: 4
Комментарий оценки:
спасибо, но хотелось бы еще пример!!

Отвечает: Лысков Игорь Витальевич
Здравствуйте, HITY!
По поводу акселераторов:
// константы (примерные)
#define IDA_ACCEL 0x100
#define IDM_EXIT 0x200
// выделяем память под handle
HACCEL hAccel ;
// загружаем
hAccel = LoadAccelerators( hInstance, MAKEINTRESOURCE( IDA_ACCEL ) ) ;
// используем
while (GetMessage( &msg, NULL, 0, 0 ))
{
if (!TranslateAccelerator( hWnd, hAccel, &msg ))
{
TranslateMessage( &msg ) ;
DispatchMessage( &msg ) ;
}
}
// ну и описываем в ресурсах
IDA_ACCEL ACCELERATORS MOVEABLE PURE
BEGIN
VK_F7, IDM_EXIT, VIRTKEY, SHIFT, NOINVERT
END
//В результате, при нажатии Shift+F7 придет сообщение WM_COMMAND с параметром IDM_EXIT
PS А вообще, читаем MSDN...
---------
Удачи!
Ответ отправил: Лысков Игорь Витальевич (статус: Практикант)
Ответ отправлен: 05.02.2007, 19:26
Оценка за ответ: 5
Комментарий оценки:
спасибо! только у меня MSDN нет где можно его скачать??


Вопрос № 73.858
Есть ли в составе wininet.dll функция для определения даты создания
файла, который нужно скачать. Т.е. основываясь на дате надо определить стоит ли скачивать обнавление.
Отправлен: 03.02.2007, 07:40
Вопрос задал: Bcd (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: burbot
Здравствуйте, Bcd!

Все зависит от протокола, который Вы используете.

Для FTP:
-----------
Функция FtpFindFirstFile.
В качестве параметра Вы передаете этой функции указатель на структуру WIN32_FIND_DATA. Функция заполняет эту структуру данными. В структуре присутствуют:
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;

Для Gopher:
-----------
Функция GopherFindFirstFile.
В качестве параметра Вы передаете этой функции указатель на структуру GOPHER_FIND_DATA. Функция заполняет эту структуру данными. Вот только даты создания в этой структуре нет. Есть только дата последней модификации:
FILETIME LastModificationTime;

Для HTTP:
------------
С протоколом HTTP будет чуть-чуть посложнее. Для него нет подобных функций. И тоже, насколько мне известно, невозможно получить дату создания. Можно только дату последней модификации. Копайте в сторону HttpOpenRequest, HttpAddRequestHeaders, HttpQueryInfo с флагами HTTP_QUERY_LAST_MODIFIED и HTTP_QUERY_FLAG_SYSTEMTIME.

Всего доброго!
---------
Хорошо смеется тот, кто смеется над собой. (C)
Ответ отправил: burbot (статус: 2-ой класс)
Ответ отправлен: 06.02.2007, 19:30
Оценка за ответ: 5
Комментарий оценки:
Спасибо за обширный ответ!


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
ООО "Мастер-Эксперт Про", Москва, 2007
Авторские права | Реклама на портале
Версия системы: 4.44 beta от 26.01.2007
Яндекс Rambler's Top100

В избранное