Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 сентября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Возможности языков семейства Си по истине безграничны, однако, в этой свободе кроются и недостатки: всегда нужно программисту держать ухо востро и контроллировать "переполнение буфера", чтобы потом программа не вылетала в "синий экран" на массе разнообразных версий Windows и железа у пользователей. Те же крэкеры и реверсеры специально ищут в коде программ на Си уязвимости, куда можно подсадить любой вирусный код, об этом более подробно автор рассказывал в своём видеокурсе здесь. Я там многое узнал и теперь мой код стал значительно более безопасный.

Посмотрим, что у нас в clipboard.

Автор: Michael Dunn

  • Скачать исходник - 45 Kb

     [Screen shot 1 - Word clipboard data - 45K]
    Рис. 1: ClipSpy показывает, что Word 97 положил в clipboard после простой операции копирования.

     [Screen shot 2 - Word drag-n-drop data - 22K]
    Рис. 2: ClipSpy показывает содержимое clipboard , если в Word что-нибудь перетащить.

 

Программка ClipSpy работает через MFC класс COleDataObject , который включает интерфейс IDataObject, и обеспечивает доступ к содержимому clipboard. Функция CLeftView::ReadDataAndFillList() отслеживает форматы данных в clipboard и заполняет ими список:

BOOL CLeftView::ReadDataAndFillList ( COleDataObject* pDO )
 
 {
 
 FORMATETC etc;
 
 UINT      uNumFormats = 0;
 
 
 
     // определяем, сколько форматов данных доступно в clipboard.
 
 
 
     pDO->BeginEnumFormats();
 
 
 
     while ( pDO->GetNextFormat ( &etc ))
 
     {
 
         if ( pDO->IsDataAvailable ( etc.cfFormat ))
 
         {
 
             uNumFormats++;
 
         }
 
     }
 
 

ClipSpy проверяет, является ли каждый формат данных встроенным. Если нет, то вызывается функция GetClipboardFormatName()для получения названия формата:

    TCHAR szFormat [256];
 
     GetClipboardFormatName ( etc.cfFormat, szFormat, 256 );
 
 

Затем ClipSpy считывает данные из формата:

HGLOBAL hgData;
 
 UINT    uDataSize;
 
 CClipSpyDoc* pDoc = GetDocument();
 
 
 
     // Получаем HGLOBAL данных.
 
     hgData = pDO->GetGlobalData ( etc.cfFormat );
 
 
 
     if ( NULL != hgData )
 
     {
 
         uDataSize = GlobalSize ( hgData );
 
         pDoc->AddDataBlock ( hgData, uDataSize );
 
     }
 
     else
 
     {
 
         pDoc->AddEmptyBlock();
 
     }
 
 

Функции AddDataBlock() и AddEmptyBlock() это члены класса Документ, которые сохраняют копии данных.

Следующий интересный момент, это CLeftView::OnItemchanged() и CClipSpyView::OnUpdate(). Первая функция определяет изменения и соответственно вызывает функцию UpdateAllViews(), которая в свою очередь вызывает OnUpdate(). OnUpdate() заполняет правый rich edit данными.

 

 





<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU Проект ReactOS