FASM Прикрутить кнопку на стандартное окно...

Тема в разделе "WASM.BEGINNERS", создана пользователем rococo795, 16 дек 2016.

  1. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    631
    Адрес:
    Russia
    По идее, сделать проекцию через CreateFileMapping, MapViewOfFile, как раз для таких файлов.
    И работать с ним, забыв что это файл, т.е. как с массивом. Т.е. если (без изменения длины файла!) нужно на сотом гигабайте один байтик поменять, прямо так и поменять его.
    Затем закрыть проекцию, и винда сама все устроит.

    Попробуй погуглить "mapviewoffile работа с большими файлами"
     
  2. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    631
    Адрес:
    Russia
    Только вот чего подумалось,

    адресация смещения по 32-битному регистру нам даст макс. 4гб область для работы с ней.
    Так что.. .. ?
     
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    _edge,
    и на чем хранится такой "файл"? У меня винты по 500Гб то есть по три файла на винчестере? Наверное ТС имеет ввиду файл на 150 Мб:)
     
  4. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Так проецируется только кусочек, который можно отмапить и замапить другой кусочек по другому смещению.
    А вообще это зависит от задачи. Если там нужно "прыгать" по файлу туда-сюда, то целесообразнее использовать ReadFile, WriteFile и SetFilePointerEx.
    Стоит отметить что это справедливо для 32 разрядной платформы, для 64 разрядно можно целиком мапить большой файл.
     
    _edge нравится это.
  5. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    631
    Адрес:
    Russia
    Ну, какой-нибудь BD-remix с разрешением 4k вполне может быть 1 файлом гигов по 40, это данность.

    MTS файлы, которые пишет камера 4к, соответственно, будут еще больше, т.к. в реальном времени особо не посжимаешь (иное дело, какая должна быть пропускная способность у флеш-памяти, но это другой разговор).

    Беглый гуглинг ответа на вопрос, что делать с мэппингом файлов более 4гб, не принес. Use win x64, не вариант
     
  6. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    MapViewOfFile - 3 и 4 параметры.
     
    _edge нравится это.
  7. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Спасибо Вам за ответы...
    На форуме про видео у одного чела проблемма - не открывается этот файл... Выкладывать и качать его - долгий процесс... Так как я могу из .mts выдернуть видеопоток иль аудиопоток - то подумал что как будет время - набросаю ему небольшую прожку... и тут же подумал (я ведь почти что умный!!) что мой кодесик под 32 бита.. и самому стало интересно..... как валять такие большие файлы... А файл вечером уточню - скорее всего так и есть в 150Гб...

    Вот ещё вопрос возник в моёй башке.... вот имеем здоровенный файл.. а можно ли его там на винте, не поднимая в память или порезать или сделать короче - ну каким нибудь космическим бластером через биос? Тут надо фат32 и нтфс смотреть? Возможно ли такое и где сие посмотреть?

    За ответы - душевное спасибо... (правда..)
     
  8. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Да прыгать надо будет....
     
  9. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    631
    Адрес:
    Russia
    Сделать короче (с конца), не поднимая в память, по идее, через SetEndOfFile
     
  10. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    _edge,

    Посмотрю... Спасибо...
     
  11. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    А как узнать номер винта, или что там есть у винта, чтобы привязать программу к нему? А то я иногда привязываю по GetLocalTime,stime - а как к винту привязать? Или может ещё что то наподобие есть?
     
  12. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    GetVolumeInformation

    add

    lpVolumeSerialNumber [out, optional]
    A pointer to a variable that receives the volume serial number.
    This parameter can be NULL if the serial number is not required.
    This function returns the volume serial number that the operating system assigns when a hard disk is formatted. To programmatically obtain the hard disk's serial number that the manufacturer assigns, use the Windows Management Instrumentation (WMI) Win32_PhysicalMedia property SerialNumber.​

    Обязательно обратите внимание на эту заметку.
     
  13. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    TermoSINteZ,

    Спасибо... Всё просмотрю...
     
  14. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Есть несколько способов. Я обычно использую IOCTL_STORAGE_QUERY_PROPERTY и SMART_RCV_DRIVE_DATA.
    Открываешь \\.\PhysicalDriveX - где X - номер диска. Узнать номер можно к примеру через SetupAPI (SetupDiGetClassDevs, SetupDiEnumDeviceInterfaces, SetupDiGetDeviceInterfaceDetail, IOCTL_STORAGE_GET_DEVICE_NUMBER).
    Потом открытому драйву отправляешь IOCTL_STORAGE_QUERY_PROPERTY с StorageDeviceProperty. Возвращается STORAGE_DEVICE_DESCRIPTOR, по смещению 0x18 содержится оффсет на серийник харда, либо 0 если драйвер не возвращает такую информацию.
    Второй способ - смотришь держит ли драйвер SMART_GET_VERSION, затем если так то отправляешь SMART_RCV_DRIVE_DATA в командный регистр записываешь ID_CMD. Возвращается структура IDENTIFY_DEVICE_DATA. Серийник по смещению 0x14.
    Есть еще способы, но я их не юзал никогда.
    Это не хардварный серийник, его легко можно поменять.
     
  15. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Thetrik,

    Спасибо..... Буду пробовать....
    А GetVolumeInformation я уже прочёл ссылку... Как я понял - то каждое форматирование присваивает свой номер...
     
  16. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Таки да, я в курсе.
    Вопрос ведь был о номере вообще.
    И я сделал пометку цитатой из мсдн по поводу того, что это не хардварный серийник, и в этой цитате был ответ на то, как получить хардварный.
    :thank_you:
     
  17. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Да... Я сразу (по совету Вашему) посмотрел ссылку... И вдалеке всё узрел.... Скоро доберусь до этого вопроса.. И то что было дальним - приблизиться!!! :)
    Спасибо...
     
  18. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Не всегда работает. Судя по значению это IOCTL_STORAGE_QUERY_PROPERTY, хотя могу ошибаться - реверсить нет времени пока.
    Так номер винта и номер тома - разные вещи.
     
  19. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Файл 2 гига...
    Если я invoke CreateFile,lpFileIn,GENERIC_READ,0,0,3,0,0 открыл файл прочитал его в память и закрыл....
    то я задействовал оперативную память на размер 2 гига..... Затем после некоторых действий с файлом в памяти я буду записывать новый файл invoke WriteFile,[FileOut],ecx,eax,cbWrite,0 ... при этом что системе нужно будет ещё 2 гига памяти в оперативке? То есть для такой работы нужно 4 гига оперативки??? Проясните пожалуйста...
     
  20. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    631
    Адрес:
    Russia
    Работает механизм виртуальной памяти. Менеджер памяти все время занят проверкой, от чего бы такого избавиться (скинуть страницу в своп, объявить назанятой), таким образом, "в моменте" у тебя не будет возможности при работе с файлом занять слишком много физической (той, что в комп установлена) памяти. А 2,4, сколько доступно твоему приложению - это виртуальная память.