Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите разобратьсо с функ-й BeginUpdateResource, Переполнение буффера 
:(
    Опции темы
nocopyes
Дата 14.3.2010, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 14.3.2010

Репутация: нет
Всего: нет



Возникла проблема в реализации АПИ функции BeginUpdateResource. Не могу разобратьсо в чем дело, а по сабжу - ВБ крошитцо во время исполнения
Модуль:
Код
Private Declare Function BeginUpdateResource Lib "kernel32" Alias "BeginUpdateResourceA" (ByVal pFileName As String, ByVal bDeleteExistingResources As Long) As Long
Private Declare Function UpdateResource Lib "kernel32" Alias "UpdateResourceA" (ByVal hUpdate As Long, ByVal lpType As String, ByVal lpName As String, ByVal wLanguage As Long, lpData As Any, ByVal cbData As Long) As Long
Private Declare Function EndUpdateResource Lib "kernel32" Alias "EndUpdateResourceA" (ByVal hUpdate As Long, ByVal fDiscard As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function DeleteFile Lib "kernel32.dll" Alias "DeleteFileA" (ByVal lpFileName As String) As Long
Private Const RT_CURSOR = 1&
Private Const RT_BITMAP = 2&
Private Const RT_ICON = 3&
Private Const RT_MENU = 4&
Private Const RT_DIALOG = 5&
Private Const RT_STRING = 6&
Private Const RT_FONTDIR = 7&
Private Const RT_FONT = 8&
Private Const RT_ACCELERATOR = 9&
Private Const RT_RCDATA = 10&
Private Const RT_MESSAGETABLE = (11)
Private Const RT_GROUP_CURSOR = (RT_CURSOR + DIFFERENCE)
Private Const RT_GROUP_ICON = (RT_ICON + DIFFERENCE)
Private Const RT_VERSION = (16)
'---------------------------------------------------
Function chBINRes(FileName As String, sType As String, sName As String, fName As String)
   On Error Resume Next
   Dim mas() As Byte, image_file As Byte, h As Long
   h = BeginUpdateResource(FileName, False)
       Open fName For Binary As #1
       Get #1, , image_file
       imgFileLen = LOF(1)
       Close #1
   ReDim mas(0)
   CopyMemory mas(0), image_file, imgFileLen
   UpdateResource h, sType, sName, 0, mas(0), imgFileLen
   Close
End Function

Форма:
Код
Sub cmd_insert_Click()
   chBINRes "c:\target.exe", RT_RCDATA, "file1", Environ$("TMP")+"\file1.exe"
End Sub

по идее - по нажатию на кнопку на форме должно происходить следующее: в таблицу ресурсов файла c:\target.exe должен добавляться новый ресурс типа RC_DАTА (binаry) содержимое которого берется из файла {tmp_dir}\file1.exe 
но ВБ крошится на CopyMemory. может кто подскажет в чем моя ошибка и как изменить код функции ???
PM MAIL   Вверх
Akina
Дата 14.3.2010, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Неверный размер массива в ReDim, CopyMemory копирует больше байтов, чем помещается в байтовом массиве из ОДНОГО элемента.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
nocopyes
Дата 17.3.2010, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 14.3.2010

Репутация: нет
Всего: нет



Код
   hUpd = BeginUpdateResource(sPath, 0)
          Close
          Open mFile For Binary Access Read As #1
          tmp_bt = String(LOF(1), 0)
          Get #1, , image_file
          Close
   ReDim res_bt(0)
   ReDim Preserve res_bt(UBound(res_bt) + UBound(image_file) + vbNull)
   CopyMemory res_bt(UBound(res_bt) - UBound(image_file) - vbNull), image_file(0), UBound(image_file) + vbNull
   UpdateResource hUpd, RT_RCDATA, sName, 1049, res_bt(0), UBound(res_bt) + vbNull
   EndUpdateResource hUpd, 0

как ни странно, но методом научного тыка сам исправил и код работает
правдо есть исключение - если добавляемый файл нулевой (пустой) то вылазит ошипка
и нужно делать проверку на пустоту image_file или LOF(1) чтобы этого избежать
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0436 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.