Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502

Взятие значения по смещению более 2х гигабайт

17.12.2020, 19:56. Показов 1261. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
Не могу понять что не так.
Файл размером 2.5 гигабайт (2 567 251 063 байт) открыт целиком MapViewOfFile.
Приложение х64. Сканирую файл. При определенном совпадении мне необходимо получить данные
расположенное где то в глубине файла.
C++
1
DWORD data = *(DWORD *)((DWORD_PTR)(Проекция +  текущее смещение в файле + значение));
Однако получаю непрерывные исключения.
Я посмотрел при каких случаях это происходит.
значение - 2 396 188 277 текущее смещение в файле 1647037
значение - 2 227 788 445 текущее смещение в файле 2020629
значение - 2 506 089 824 текущее смещение в файле 2229954
значение - 2 340 521 019 текущее смещение в файле 2890997
значение - 2 504 330 894 текущее смещение в файле 3346886
значение - 2 206 832 147 текущее смещение в файле 6474075
Размер файла не превышается, однако переход на 2гиг вперед вызывает исключение, Почему??

Добавлено через 2 минуты
значение 1 191 396 633 текущее смещение в файле 6358132
А вот так все нормально.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.12.2020, 19:56
Ответы с готовыми решениями:

Поиск и просмотр содержания в файле более 50 гигабайт
Всем привет! Прошу помощи, уважаемых форумчан, сам я "безрукий офисный планктон", но пользоваться немножко компьютером умею. ...

Crucial MX500 250GB 3D - 100 и более Гигабайт в день
Добрый день, в середине января 2019, приобрёл/ установил SSD накопитель...

Взятие значения поля input
Всем привет. Подскажите, пожалуйста. У меня есть 2 формы на одной странице, которые имеют следующий вид: Форма 1: <div...

8
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
17.12.2020, 21:04
Цитата Сообщение от zombivadim Посмотреть сообщение
значение 1 191 396 633 текущее смещение в файле 6358132
А вот так все нормально.
Покажи весь код
0
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
17.12.2020, 21:14  [ТС]
oleg-m1973,
Да кажется до меня начинает доходить.
Получилась, подстава, я брал значение через структуру, где оно определено как LONG.
Вот и переполнение происходит.
Надо подумать как такого избегать в будущем.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
17.12.2020, 21:18
Цитата Сообщение от zombivadim Посмотреть сообщение
Да кажется до меня начинает доходить.
Получилась, подстава, я брал значение через структуру, где оно определено как LONG.
Скорее всего, у тебя проблема в DWORD. Он четыре байта
0
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
17.12.2020, 21:28  [ТС]
oleg-m1973,
Понимаете что получается. Вот это условие не работает
C++
1
if(текущее смещение в файле + значение < меньше размера файла)
Получается мне надо все к ULONGLONG привести
C++
1
if((ULONGLONG)текущее смещение в файле + (ULONGLONG)значение < меньше размера файла)
Тогда DWORD не переполнится.
Может есть более простой способ?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
17.12.2020, 21:29
Цитата Сообщение от zombivadim Посмотреть сообщение
Понимаете что получается. Вот это условие не работает
Покажи код. Зачем ты пересказываешь его своими словами?
0
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
17.12.2020, 21:47  [ТС]
oleg-m1973,
Так это и есть весь код. В нем пять строчек
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
for (DWORD i = 0; i < size_file; i++)
{
 
if (i == size_file - 4)break;
 
PIMAGE структура = (PIMAGE)((DWORD_PTR)WIN + i);
 
if (структура->значение + i + 4) < size_file)
{
DWORD data = *(DWORD *)((DWORD_PTR)WIN + i + структура->значение ));
}
 
}
структура->значение -- это LONG
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
17.12.2020, 21:53
Цитата Сообщение от zombivadim Посмотреть сообщение
for (DWORD i = 0; i < size_file; i++)
Ты вроде упоминал "Файл размером 2.5 гигабайт". В этом цикле ты по нему пробегаешься, по DWORD?
0
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
17.12.2020, 23:13  [ТС]
oleg-m1973,
Да

Добавлено через 1 минуту
Диапазон от 0 до 4 294 967 295
Зачем больше?

Добавлено через 1 час 12 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
int overflow(DWORD offset, DWORD jump)
{
    DWORD result = offset + jump;
    if (result < offset || result < jump)return 1;
    else if(result > size_file)return 1;
    else return 0;
}
 
if (!overflow(смещение, значение))
{
продолжаем
}
Вот так должно по идее работать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.12.2020, 23:13
Помогаю со студенческими работами здесь

Взятие выбранного значения из DropDownList
Здравствуйте! Почему какое бы значение я не выбрал в DropDownList извлекается то, что было установлено 1-ым при загрузки страницы? ...

Взятие предыдущего значения, если Null
Всем привет. Подскажите пожалуйста момент. Есть таблица Quotes (Day date, CurrencyValue money) Даты в ней уникальны, но они могут идти...

Взятие интеграла от функции, имеющей отрицательные значения
Всем привет! С микрофона программа получает информацию ввиде сигнала (синусоиды). Она может принимать значения от -1 до 1. Выполняется...

Поиск адреса по смещению
Здравствуйте, такой вопрос, нашёл в Cheat Engine поинтер на нужный мне адрес, как посредством c# мне получить этот адрес ? Скрин смещений

Получить значение по смещению
У меня в регистре данных лежат два числа dataseg segment para 'data' var1 dw 3 var2 dw 5 dataseg ends Данные...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru