mirror of https://github.com/x64dbg/btparser
222 lines
7.1 KiB
Plaintext
222 lines
7.1 KiB
Plaintext
//--------------------------------------
|
|
//--- 010 Editor v2.1.3 Binary Template
|
|
//
|
|
// File: EMFTemplate.bt
|
|
// Author: Dustin D. Trammell <dtrammell@dustintrammell.com>
|
|
// Revision: 0.1
|
|
// Date: 2008/04/08 - 2008/04/08
|
|
// Purpose: Parsing EMF files.
|
|
// References:
|
|
// MS-EMF: Enhanced Metafile Format Specification 2.1, Microsoft
|
|
//--------------------------------------
|
|
|
|
typedef enum <DWORD> {
|
|
EMR_HEADER = 0x00000001,
|
|
EMR_POLYBEZIER = 0x00000002,
|
|
EMR_POLYGON = 0x00000003,
|
|
EMR_POLYLINE = 0x00000004,
|
|
EMR_POLYBEZIERTO = 0x00000005,
|
|
EMR_POLYLINETO = 0x00000006,
|
|
EMR_POLYPOLYLINE = 0x00000007,
|
|
EMR_POLYPOLYGON = 0x00000008,
|
|
EMR_SETWINDOWEXTEX = 0x00000009,
|
|
EMR_SETWINDOWORGEX = 0x0000000A,
|
|
EMR_SETVIEWPORTEXTEX = 0x0000000B,
|
|
EMR_SETVIEWPORTORGEX = 0x0000000C,
|
|
EMR_SETBRUSHORGEX = 0x0000000D,
|
|
EMR_EOF = 0x0000000E,
|
|
EMR_SETPIXELV = 0x0000000F,
|
|
EMR_SETMAPPERFLAGS = 0x00000010,
|
|
EMR_SETMAPMODE = 0x00000011,
|
|
EMR_SETBKMODE = 0x00000012,
|
|
EMR_SETPOLYFILLMODE = 0x00000013,
|
|
EMR_SETROP2 = 0x00000014,
|
|
EMR_SETSTRETCHBLTMODE = 0x00000015,
|
|
EMR_SETTEXTALIGN = 0x00000016,
|
|
EMR_SETCOLORADJUSTMENT = 0x00000017,
|
|
EMR_SETTEXTCOLOR = 0x00000018,
|
|
EMR_SETBKCOLOR = 0x00000019,
|
|
EMR_OFFSETCLIPRGN = 0x0000001A,
|
|
EMR_MOVETOEX = 0x0000001B,
|
|
EMR_SETMETARGN = 0x0000001C,
|
|
EMR_EXCLUDECLIPRECT = 0x0000001D,
|
|
EMR_INTERSECTCLIPRECT = 0x0000001E,
|
|
EMR_SCALEVIEWPORTEXTEX = 0x0000001F,
|
|
EMR_SCALEWINDOWEXTEX = 0x00000020,
|
|
EMR_SAVEDC = 0x00000021,
|
|
EMR_RESTOREDC = 0x00000022,
|
|
EMR_SETWORLDTRANSFORM = 0x00000023,
|
|
EMR_MODIFYWORLDTRANSFORM = 0x00000024,
|
|
EMR_SELECTOBJECT = 0x00000025,
|
|
EMR_CREATEPEN = 0x00000026,
|
|
EMR_CREATEBRUSHINDIRECT = 0x00000027,
|
|
EMR_DELETEOBJECT = 0x00000028,
|
|
EMR_ANGLEARC = 0x00000029,
|
|
EMR_ELLIPSE = 0x0000002A,
|
|
EMR_RECTANGLE = 0x0000002B,
|
|
EMR_ROUNDRECT = 0x0000002C,
|
|
EMR_ARC = 0x0000002D,
|
|
EMR_CHORD = 0x0000002E,
|
|
EMR_PIE = 0x0000002F,
|
|
EMR_SELECTPALETTE = 0x00000030,
|
|
EMR_CREATEPALETTE = 0x00000031,
|
|
EMR_SETPALETTEENTRIES = 0x00000032,
|
|
EMR_RESIZEPALETTE = 0x00000033,
|
|
EMR_REALIZEPALETTE = 0x00000034,
|
|
EMR_EXTFLOODFILL = 0x00000035,
|
|
EMR_LINETO = 0x00000036,
|
|
EMR_ARCTO = 0x00000037,
|
|
EMR_POLYDRAW = 0x00000038,
|
|
EMR_SETARCDIRECTION = 0x00000039,
|
|
EMR_SETMITERLIMIT = 0x0000003A,
|
|
EMR_BEGINPATH = 0x0000003B,
|
|
EMR_ENDPATH = 0x0000003C,
|
|
EMR_CLOSEFIGURE = 0x0000003D,
|
|
EMR_FILLPATH = 0x0000003E,
|
|
EMR_STROKEANDFILLPATH = 0x0000003F,
|
|
EMR_STROKEPATH = 0x00000040,
|
|
EMR_FLATTENPATH = 0x00000041,
|
|
EMR_WIDENPATH = 0x00000042,
|
|
EMR_SELECTCLIPPATH = 0x00000043,
|
|
EMR_ABORTPATH = 0x00000044,
|
|
EMR_RESERVED_69 = 0x00000045,
|
|
EMR_COMMENT = 0x00000046,
|
|
EMR_FILLRGN = 0x00000047,
|
|
EMR_FRAMERGN = 0x00000048,
|
|
EMR_INVERTRGN = 0x00000049,
|
|
EMR_PAINTRGN = 0x0000004A,
|
|
EMR_EXTSELECTCLIPRGN = 0x0000004B,
|
|
EMR_BITBLT = 0x0000004C,
|
|
EMR_STRETCHBLT = 0x0000004D,
|
|
EMR_MASKBLT = 0x0000004E,
|
|
EMR_PLGBLT = 0x0000004F,
|
|
EMR_SETDIBITSTODEVICE = 0x00000050,
|
|
EMR_STRETCHDIBITS = 0x00000051,
|
|
EMR_EXTCREATEFONTINDIRECTW = 0x00000052,
|
|
EMR_EXTTEXTOUTA = 0x00000053,
|
|
EMR_EXTTEXTOUTW = 0x00000054,
|
|
EMR_POLYBEZIER16 = 0x00000055,
|
|
EMR_POLYGON16 = 0x00000056,
|
|
EMR_POLYLINE16 = 0x00000057,
|
|
EMR_POLYBEZIERTO16 = 0x00000058,
|
|
EMR_POLYLINETO16 = 0x00000059,
|
|
EMR_POLYPOLYLINE16 = 0x0000005A,
|
|
EMR_POLYPOLYGON16 = 0x0000005B,
|
|
EMR_POLYDRAW16 = 0x0000005C,
|
|
EMR_CREATEMONOBRUSH = 0x0000005D,
|
|
EMR_CREATEDIBPATTERNBRUSHPT = 0x0000005E,
|
|
EMR_EXTCREATEPEN = 0x0000005F,
|
|
EMR_POLYTEXTOUTA = 0x00000060,
|
|
EMR_POLYTEXTOUTW = 0x00000061,
|
|
EMR_SETICMMODE = 0x00000062,
|
|
EMR_CREATECOLORSPACE = 0x00000063,
|
|
EMR_SETCOLORSPACE = 0x00000064,
|
|
EMR_DELETECOLORSPACE = 0x00000065,
|
|
EMR_GLSRECORD = 0x00000066,
|
|
EMR_GLSBOUNDEDRECORD = 0x00000067,
|
|
EMR_PIXELFORMAT = 0x00000068,
|
|
EMR_DRAWESCAPE = 0x00000069,
|
|
EMR_EXTESCAPE = 0x0000006A,
|
|
EMR_RESERVED_107 = 0x0000006B,
|
|
EMR_SMALLTEXTOUT = 0x0000006C,
|
|
EMR_FORCEUFIMAPPING = 0x0000006D,
|
|
EMR_NAMEDESCAPE = 0x0000006E,
|
|
EMR_COLORCORRECTPALETTE = 0x0000006F,
|
|
EMR_SETICMPROFILEA = 0x00000070,
|
|
EMR_SETICMPROFILEW = 0x00000071,
|
|
EMR_ALPHABLEND = 0x00000072,
|
|
EMR_SETLAYOUT = 0x00000073,
|
|
EMR_TRANSPARENTBLT = 0x00000074,
|
|
EMR_RESERVED_117 = 0x00000075,
|
|
EMR_GRADIENTFILL = 0x00000076,
|
|
EMR_SETLINKEDUFIS = 0x00000077,
|
|
EMR_SETTEXTJUSTIFICATION = 0x00000078,
|
|
EMR_COLORMATCHTOTARGETW = 0x00000079,
|
|
EMR_CREATECOLORSPACEW = 0x0000007A
|
|
} RecordType;
|
|
|
|
typedef struct {
|
|
LONG cx;
|
|
LONG cy;
|
|
} SIZEL;
|
|
|
|
typedef struct _RECTL {
|
|
LONG left;
|
|
LONG top;
|
|
LONG right;
|
|
LONG bottom;
|
|
} RECTL;
|
|
|
|
typedef struct {
|
|
RecordType iType; // Record type EMR_HEADER.
|
|
DWORD nSize; // Record size in bytes. This may be greater
|
|
// than the sizeof(ENHMETAHEADER).
|
|
RECTL rclBounds; // Inclusive-inclusive bounds in device units.
|
|
RECTL rclFrame; // Inclusive-inclusive Picture Frame of
|
|
// metafile in .01 mm units.
|
|
DWORD dSignature; // Signature. Must be ENHMETA_SIGNATURE.
|
|
DWORD nVersion; // Version number.
|
|
DWORD nBytes; // Size of the metafile in bytes.
|
|
DWORD nRecords; // Number of records in the metafile.
|
|
WORD nHandles; // Number of handles in the handle table.
|
|
// Handle index zero is reserved.
|
|
WORD sReserved; // Reserved. Must be zero.
|
|
DWORD nDescription; // Number of chars in the unicode description string.
|
|
// This is 0 if there is no description string.
|
|
DWORD offDescription; // Offset to the metafile description record.
|
|
// This is 0 if there is no description string.
|
|
DWORD nPalEntries; // Number of entries in the metafile palette.
|
|
SIZEL szlDevice; // Size of the reference device in pixels.
|
|
SIZEL szlMillimeters; // Size of the reference device in millimeters.
|
|
} Header;
|
|
|
|
typedef struct {
|
|
WORD desc[header.nDescription];
|
|
} Description;
|
|
|
|
typedef struct {
|
|
RecordType iType; // Record type EMR_XXX
|
|
DWORD nSize; // Record size in bytes
|
|
DWORD dParm[((nSize-8)/4)]; // DWORD Array of parameters
|
|
} Record;
|
|
|
|
typedef struct {
|
|
uchar Reserved;
|
|
uchar Blue;
|
|
uchar Green;
|
|
uchar Red;
|
|
} PaletteEntry;
|
|
|
|
// START
|
|
|
|
LittleEndian();
|
|
|
|
// Header
|
|
Header header;
|
|
|
|
// Optional Description
|
|
FSeek(header.offDescription);
|
|
Description description;
|
|
|
|
// Start of Records (after header)
|
|
FSeek(header.nSize);
|
|
|
|
// Parse the number of records indicated in the header
|
|
local int recCnt = 0;
|
|
for( recCnt = 0; recCnt < header.nRecords - 1; recCnt++ ) {
|
|
Record record;
|
|
}
|
|
// If the last record wasn't EMR_EOF, there should be more records
|
|
// even though they exceed the count in the header
|
|
do {
|
|
Record extrarecord;
|
|
recCnt++;
|
|
} while( record[recCnt-1].iType != EMR_EOF);
|
|
|
|
// Check last record or header for presence of Palette
|
|
local int palCnt = 0;
|
|
for( palCnt = 0; palCnt < header.nPalEntries; palCnt++ ) {
|
|
PaletteEntry paletteentry;
|
|
}
|
|
|