-
-
Notifications
You must be signed in to change notification settings - Fork 2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Question about .drm's internal structure #1
Comments
Sections in DRMs are flat arbitrary structures loaded into memory, where pointers are enough space for actual pointers that get resolved (overwritten) when the section is loaded at runtime. Which is why the bytes are Unfortunately the DRM format doesn't really have any indication of what type of structure any given section is. The game knows this based on what it's loading. |
> pointers are enough space for actual pointers that get resolved (overwritten) when the section is loaded at runtime >The game knows this based on what it's loading. Has there been any at all insights on fields marked "Unknown" since the release of your code, BTW? Thanks again for your work. I imagine that analyzing it all from scratch must have been hell of an effort. |
Consider something like this: struct foo
{
int bar;
baz* qux;
int quux;
quux* corge;
}; This would be stored flat in the .drm as a segment, the pointers would have nonsense values (
There's some comments in the code that reads the resolvers. Local resolver: Gibbed.CrystalDynamics/projects/Gibbed.DeusEx3.FileFormats/DRM/Resolver.cs Lines 99 to 101 in 6b2dd22
Remote resolver: Gibbed.CrystalDynamics/projects/Gibbed.DeusEx3.FileFormats/DRM/Resolver.cs Lines 123 to 126 in 6b2dd22
The resolver types in my code extract the necessary parts of the resolver bitflags, so that's handled for you. |
Hi,
I'd like to know more about layouts of data stored in .drm files from DXHR (more specifically, in DTPData sections). I managed to adapt your code to produce more meaningful (as I hoped) dumps of their content, but still can't figure out how the data works. I suppose the key here lies in Resolvers tables that each section has, but when I try to analyze them... it just doesn't make any sense to me. I can't see any data type or length markers, any consistent scheme in how various sections refer to each other, nor any "starting point" from which a chain to data I need could be traced. The only rock solid fact I figured is that every PointerOffset address refers to a EBBEEBBE byte sequence, but that's that. There are data segments not addressed by any DataOffset, there are DataOffset addresses pointing beyond the edge of MemoryStream data field, there are EBBEEBBE's not addressed by any PointerAddress or addressed by a DataOffset, and lots of other stuff I can't make sense of. Whatever shadow of a pattern I may seem to establish looking at data in several .drm's is being promptly debunked by a different .drm where the same pattern fails despite all expectations.
I'm specifically interested in dialogue-oriented information, data fields containing audio file names and line numbers in locals.bin file. I believe that DTPData sections with flag 0x54 are hubs for sections that contain the real data, and in those .drm's I explored I could "visually" trace the connectivity... just not strictly enough to build a parser on it.
If you have any clues (or know somebody who does) about ways for meaningful data to be extracted from .drm's , I'd be extremely grateful.
Thank you!
The text was updated successfully, but these errors were encountered: