У меня есть приложение, которое работает с моментальными снимками физической памяти (например, VMware VMEM-файлы). Помимо прочего, он может считывать процессы/модули из моментального снимка по виртуальному, а не по физическому адресу. Это включает в себя восстановление модуля 4KB за один раз через таблицу страниц, что, в свою очередь, означает лот вызовов метода Stream's Seek().Как получить основной дескриптор файла Stream?
По причинам, о которых я не уверен, эти призывы к искам() болота резко опускаются. В результате я ищу способ обойти их - или, по крайней мере, способ реализации управляемого Seek(). Мое лучшее предположение - PInvoke SetFilePointer и работать с этим напрямую, но для этого мне нужно получить IntPtr/SafeFileHandle для потока. У меня есть несколько ограничений:
В API Я работаю с ограничен .NET 3.5, поэтому, к сожалению, не является отображение файла в память вариант.
Я не могу использовать FileStream (у которого уже есть личное поле SafeFileHandle, к которому можно получить доступ с отражением) или PInvoke CreateFile(), чтобы получить снимок другим способом - API включает BinaryReader, который имеет эксклюзивный блокировка моментального снимка.
Конечно, в отличие от FileStream, ни BinaryReader, ни его базовый Stream не имеют ссылки на дескриптор файла. Но, конечно, нужно существовать? В каком случае, как мне его приобрести?
Какой тип «потока»? Не все потоки имеют файлы. –
MemoryMappedFile в .NET 4.0 - это всего лишь управляемая оболочка вокруг собственного API, вы можете реализовать ее без особых проблем в течение 3.5 (следовательно, я уже видел многие реализации там). Тем не менее, мне кажется, что вы в основном зацикливаетесь на использовании файловой системы (помимо некоторого интеллектуального кэширования). Файл с отображением карты на карту дает вам самые быстрые результаты в описанном вами сценарии (по сравнению с готовыми решениями). – Polity
@John Saunders: Спасибо, ваш вопрос побудил меня взглянуть на класс «BinaryReader», после чего я понял, что мне просто нужно опустить свойство «BaseStream» в «FileStream», а затем использовать отражение для доступа к ' SafeFileHandle'. Я был бы рад выбрать это как правильный ответ, если вы хотите его написать. – Wayside