+static BOOLEAN
+KdbpSeekSymFile(PVOID FileContext, ULONG_PTR Target)
+{
+ PROSSYM_KM_OWN_CONTEXT Context = (PROSSYM_KM_OWN_CONTEXT)FileContext;
+ Context->FileOffset.QuadPart = Target;
+ return TRUE;
+}
+
+static BOOLEAN
+KdbpReadSymFile(PVOID FileContext, PVOID Buffer, ULONG Length)
+{
+ PROSSYM_KM_OWN_CONTEXT Context = (PROSSYM_KM_OWN_CONTEXT)FileContext;
+ IO_STATUS_BLOCK Iosb;
+ NTSTATUS Status = MiSimpleRead
+ (Context->FileObject,
+ &Context->FileOffset,
+ Buffer,
+ Length,
+ FALSE,
+ &Iosb);
+ return NT_SUCCESS(Status);
+}
+
+static PROSSYM_OWN_FILECONTEXT
+KdbpCaptureFileForSymbols(PFILE_OBJECT FileObject)
+{
+ PROSSYM_KM_OWN_CONTEXT Context = ExAllocatePool(NonPagedPool, sizeof(*Context));
+ if (!Context) return NULL;
+ ObReferenceObject(FileObject);
+ Context->FileOffset.QuadPart = 0;
+ Context->FileObject = FileObject;
+ Context->Rossym.ReadFileProc = KdbpReadSymFile;
+ Context->Rossym.SeekFileProc = KdbpSeekSymFile;
+ return &Context->Rossym;
+}
+
+static VOID
+KdbpReleaseFileForSymbols(PROSSYM_OWN_FILECONTEXT FileContext)
+{
+ PROSSYM_KM_OWN_CONTEXT Context = (PROSSYM_KM_OWN_CONTEXT)FileContext;
+ ObDereferenceObject(Context->FileObject);
+ ExFreePool(Context);
+}
+