forked from m417z/Multiline-Ultimate-Assembler
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathwrite_asm.h
More file actions
135 lines (109 loc) · 5.96 KB
/
Copy pathwrite_asm.h
File metadata and controls
135 lines (109 loc) · 5.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#ifndef _WRITE_ASM_V10_H_
#define _WRITE_ASM_V10_H_
#include "options_def.h"
#include "plugin.h"
// linked list of labels
typedef struct _label_node {
struct _label_node *next;
DWORD_PTR dwAddress;
TCHAR *lpLabel;
} LABEL_NODE;
typedef struct _label_head {
LABEL_NODE *next;
LABEL_NODE *last;
} LABEL_HEAD;
// linked list of commands
typedef struct _cmd_node {
struct _cmd_node *next;
BYTE *bCode;
SIZE_T nCodeSize;
TCHAR *lpCommand;
TCHAR *lpComment;
TCHAR *lpResolvedCommandWithLabels;
} CMD_NODE;
typedef struct _cmd_head {
CMD_NODE *next;
CMD_NODE *last;
} CMD_HEAD;
// linked list of anonymous labels
typedef struct _anon_label_node {
struct _anon_label_node *next;
DWORD_PTR dwAddress;
} ANON_LABEL_NODE;
typedef struct _anon_label_head {
ANON_LABEL_NODE *next;
ANON_LABEL_NODE *last;
} ANON_LABEL_HEAD;
// linked list of blocks of commands
typedef struct _cmd_block_node {
struct _cmd_block_node *next;
DWORD_PTR dwAddress;
SIZE_T nSize;
CMD_HEAD cmd_head;
ANON_LABEL_HEAD anon_label_head;
BOOL bIsCodeCave;
TCHAR szCaveName[64];
DWORD_PTR dwEndAddress;
} CMD_BLOCK_NODE;
typedef struct _cmd_block_head {
CMD_BLOCK_NODE *next;
CMD_BLOCK_NODE *last;
} CMD_BLOCK_HEAD;
// special commands
#define SPECIAL_CMD_ALIGN 1
#define SPECIAL_CMD_PAD 2
// functions
LONG_PTR WriteAsm(TCHAR *lpText, TCHAR *lpError);
// 1
static TCHAR *TextToData(LABEL_HEAD *p_label_head, CMD_BLOCK_HEAD *p_cmd_block_head, TCHAR *lpText, TCHAR *lpError);
static LONG_PTR AddressToData(CMD_BLOCK_HEAD *p_cmd_block_head, CMD_BLOCK_NODE **p_cmd_block_node,
DWORD_PTR *pdwAddress, DWORD_PTR *pdwEndAddress, DWORD_PTR *pdwBaseAddress, TCHAR *lpText, TCHAR *lpError);
static LONG_PTR LabelToData(LABEL_HEAD *p_label_head, CMD_BLOCK_NODE *cmd_block_node, DWORD_PTR *pdwAddress, TCHAR *lpText, TCHAR *lpError);
static LONG_PTR SpecialCommandToData(CMD_BLOCK_NODE *cmd_block_node, DWORD_PTR *pdwAddress, DWORD_PTR dwEndAddress, TCHAR *lpText, TCHAR *lpError);
static LONG_PTR CommandToData(CMD_BLOCK_NODE *cmd_block_node, DWORD_PTR *pdwAddress, DWORD_PTR dwBaseAddress, TCHAR *lpText, TCHAR *lpError);
static BOOL IsInComment(TCHAR *pchCommentChar, TCHAR *lpText, TCHAR *lpError);
static LONG_PTR ParseAddress(TCHAR *lpText, DWORD_PTR *pdwAddress, DWORD_PTR *pdwEndAddress, DWORD_PTR *pdwBaseAddress, BOOL *pbIsCodeCave, TCHAR *pszCaveName, TCHAR *lpError);
static BOOL NewCmdBlock(CMD_BLOCK_HEAD *p_cmd_block_head, DWORD_PTR dwAddress, BOOL bIsCodeCave, TCHAR *pszCaveName, TCHAR *lpError);
static LONG_PTR ParseAnonLabel(TCHAR *lpText, DWORD_PTR dwAddress, ANON_LABEL_HEAD *p_anon_label_head, TCHAR *lpError);
static LONG_PTR ParseLabel(TCHAR *lpText, DWORD_PTR dwAddress, LABEL_HEAD *p_label_head, DWORD_PTR *pdwPaddingSize, TCHAR *lpError);
static LONG_PTR ParseAsciiString(TCHAR *lpText, CMD_HEAD *p_cmd_head, SIZE_T *pnSizeInBytes, TCHAR *lpError);
static LONG_PTR ParseUnicodeString(TCHAR *lpText, CMD_HEAD *p_cmd_head, SIZE_T *pnSizeInBytes, TCHAR *lpError);
static LONG_PTR ParseCommand(TCHAR *lpText, DWORD_PTR dwAddress, DWORD_PTR dwBaseAddress, CMD_HEAD *p_cmd_head, SIZE_T *pnSizeInBytes, TCHAR *lpError);
static LONG_PTR ResolveCommand(TCHAR *lpCommand, DWORD_PTR dwBaseAddress, TCHAR **ppNewCommand, TCHAR **ppComment, TCHAR *lpError);
static LONG_PTR ReplaceLabelsWithFooAddress(TCHAR *lpCommand, DWORD_PTR dwCommandAddress, UINT nDeltaSize, TCHAR **ppNewCommand, TCHAR *lpError);
static LONG_PTR ParseSpecialCommand(TCHAR *lpText, UINT *pnSpecialCmd, TCHAR *lpError);
static LONG_PTR ParseAlignSpecialCommand(TCHAR *lpText, LONG_PTR nArgsOffset, DWORD_PTR dwAddress, DWORD_PTR *pdwPaddingSize, TCHAR *lpError);
static LONG_PTR ParsePadSpecialCommand(TCHAR *lpText, LONG_PTR nArgsOffset, BYTE *pbPaddingByteValue, TCHAR *lpError);
static BOOL GetAlignPaddingSize(DWORD_PTR dwAddress, DWORD_PTR dwAlignValue, DWORD_PTR *pdwPaddingSize, TCHAR *lpError);
static BOOL InsertBytes(TCHAR *lpText, SIZE_T nBytesCount, BYTE bByteValue, CMD_HEAD *p_cmd_head, TCHAR *lpError);
static LONG_PTR ParseRVAAddress(TCHAR *lpText, DWORD_PTR *pdwAddress, DWORD_PTR dwParentBaseAddress, DWORD_PTR *pdwBaseAddress, TCHAR *lpError);
static LONG_PTR ParseDWORDPtr(TCHAR *lpText, DWORD_PTR *pdw, TCHAR *lpError);
// 2
static TCHAR *ReplaceLabelsInCommands(LABEL_HEAD *p_label_head, CMD_BLOCK_HEAD *p_cmd_block_head, TCHAR *lpError);
static LONG_PTR ReplaceLabelsFromList(TCHAR *lpCommand, DWORD_PTR dwPrevAnonAddr, DWORD_PTR dwNextAnonAddr,
LABEL_HEAD *p_label_head, CMD_BLOCK_HEAD *p_cmd_block_head, CMD_BLOCK_NODE *cmd_block_node, TCHAR **ppNewCommand, TCHAR *lpError);
// 3
static TCHAR *PatchCommands(CMD_BLOCK_HEAD *p_cmd_block_head, TCHAR *lpError);
static TCHAR *SetComments(CMD_BLOCK_HEAD *p_cmd_block_head, TCHAR *lpError);
static TCHAR *SetLabels(LABEL_HEAD *p_label_head, CMD_BLOCK_HEAD *p_cmd_block_head, TCHAR *lpError);
// Helper functions
static BOOL ReplaceTextsWithAddresses(TCHAR *lpCommand, TCHAR **ppNewCommand,
int text_count, LONG_PTR text_start[4], LONG_PTR text_end[4], DWORD_PTR dwAddress[4], TCHAR *lpError);
static LONG_PTR ReplacedTextCorrectErrorSpot(TCHAR *lpCommand, TCHAR *lpReplacedCommand, LONG_PTR result);
static TCHAR *NullTerminateLine(TCHAR *p);
static TCHAR *SkipSpaces(TCHAR *p);
static TCHAR *SkipDWORD(TCHAR *p);
static TCHAR *SkipLabel(TCHAR *p);
static TCHAR *SkipRVAAddress(TCHAR *p);
static BOOL IsDWORDPtrPowerOfTwo(DWORD_PTR dw);
// Code cave search helpers
static DWORD_PTR FindCodeCave(DWORD_PTR dwHookAddress, SIZE_T nRequiredSize, TCHAR *lpError);
static DWORD_PTR ScanMemoryForCave(DWORD_PTR dwBase, SIZE_T nSize, SIZE_T nRequiredSize, TCHAR *lpError);
static BOOL AddCaveLabel(LABEL_HEAD *p_label_head, TCHAR *lpLabel, DWORD_PTR dwAddress, TCHAR *lpError);
static TCHAR *ReassembleCaveCommands(CMD_BLOCK_HEAD *p_cmd_block_head, TCHAR *lpError);
// Cleanup function
static void FreeLabelList(LABEL_HEAD *p_label_head);
static void FreeCmdBlockList(CMD_BLOCK_HEAD *p_cmd_block_head);
static void FreeCmdList(CMD_HEAD *p_cmd_head);
static void FreeAnonLabelList(ANON_LABEL_HEAD *p_anon_label_head);
#endif // _WRITE_ASM_V10_H_