Как получить базовый дескриптор файла Stream?

У меня есть приложение, которое работает со снимками физической памяти (например, файлы VMware VMEM). Помимо прочего, он может считывать процессы / модули из снимка по виртуальному, а не по физическому адресу. Это включает в себя реконструкцию модуля по 4 КБ за раз с помощью таблицы страниц, что, в свою очередь, означает много вызовов метода Stream Seek ().

По причинам, в которых я не уверен, эти вызовы Seek () резко ухудшают ситуацию. В результате я ищу способ их обойти - или, по крайней мере, способ обойти управляемую реализацию Seek (). Лучше всего использовать PInvoke SetFilePointer и работать с ним напрямую, но для этого мне нужно получить IntPtr / SafeFileHandle для Stream. У меня есть несколько ограничений:

  1. API, с которым я работаю, ограничен .NET 3.5, поэтому, к сожалению, MemoryMappedFile не подходит.

  2. Я не могу использовать FileStream (в котором уже есть частное поле SafeFileHandle, к которому можно получить доступ с помощью отражения) или PInvoke CreateFile (), чтобы получить снимок другим способом - API включает BinaryReader с эксклюзивной блокировкой. снимок.

Конечно, в отличие от FileStream, ни BinaryReader, ни его базовый Stream не имеют ссылки на дескриптор файла. Но обязательно нужно существовать? В таком случае, как мне его получить?

6
задан Wayside 27 December 2011 в 02:27
поделиться