Rev 1846 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1846 | Rev 1848 | ||
---|---|---|---|
1 | // ---- ®à¬¨à®¢ ¨¥ IMPORT ᥪ樨 |
1 | // ---- ®à¬¨à®¢ ¨¥ IMPORT ᥪ樨 |
2 | void DoLink() |
2 | void DoLink() |
3 | dword i,j,DirTable,AddrTable,dllName,apiName,byName,hold; |
3 | dword i,j,DirTable,AddrTable,dllName,apiName,byName,hold; |
4 | dword dll,api; |
4 | dword dll,api; |
5 | { |
5 | { |
6 | OptImportTableAdr=outptr-output; |
6 | OptImportTableAdr=outptr-output; |
7 | DirTable=outptr; |
7 | DirTable=outptr; |
8 | if(APIcount==0){ |
8 | if(APIcount==0){ |
9 | OUTDWORD(outptr -output + OptBaseOfCode + 4); |
9 | OUTDWORD(outptr -output + OptBaseOfCode + 4); |
10 | OUTDWORD(0x80000001); |
10 | OUTDWORD(0x80000001); |
11 | OUTDWORD(0); |
11 | OUTDWORD(0); |
12 | OUTDWORD(DirTable-output+40+OptBaseOfCode); |
12 | OUTDWORD(DirTable-output+40+OptBaseOfCode); |
13 | OUTDWORD(outptr-output + OptBaseOfCode - 12); |
13 | OUTDWORD(outptr-output + OptBaseOfCode - 12); |
14 | DirTable=outptr; |
14 | DirTable=outptr; |
15 | outptr = outptr + 20; |
15 | outptr = outptr + 20; |
16 | OUTDWORD('resu'); |
16 | OUTDWORD('resu'); |
17 | OUTDWORD('d.23'); |
17 | OUTDWORD('d.23'); |
18 | OUTDWORD('ll'); |
18 | OUTDWORD('ll'); |
19 | // OUTDWORD(0x72657375); OUTDWORD(0x642E3233); OUTDWORD(0x6C6C); |
19 | // OUTDWORD(0x72657375); OUTDWORD(0x642E3233); OUTDWORD(0x6C6C); |
20 | apiName=outptr; |
20 | apiName=outptr; |
21 | } |
21 | } |
22 | else { |
22 | else { |
23 | EAX=DLLcount+1*20; |
23 | EAX=DLLcount+1*20; |
24 | outptr+=EAX; // ç «® LookupTables |
24 | outptr+=EAX; // ç «® LookupTables |
25 | i=0; |
25 | i=0; |
26 | while(i |
26 | while(i |
27 | EAX=i<<2; |
27 | EAX=i<<2; |
28 | dll=DLLlist[EAX]; |
28 | dll=DLLlist[EAX]; |
29 | EBX=dll; // á뫪 DLL ¢ ᯨ᪥ ¨¤¥â¨ä¨ª â®à®¢ |
29 | EBX=dll; // á뫪 DLL ¢ ᯨ᪥ ¨¤¥â¨ä¨ª â®à®¢ |
30 | byName = DSDWORD[EBX+rectype]; // ¬¯®àâ ¯® ¨¬¥¨? |
30 | byName = DSDWORD[EBX+rectype]; // ¬¯®àâ ¯® ¨¬¥¨? |
31 | if(DSDWORD[EBX+recmodline]){ // 뫨 ¢ë§®¢ë API ¨§ ¤ ®© DLL? |
31 | if(DSDWORD[EBX+recmodline]){ // 뫨 ¢ë§®¢ë API ¨§ ¤ ®© DLL? |
32 | dllName=outptr; |
32 | dllName=outptr; |
33 | ESI=DSDWORD[EBX+recid]; // ª § â¥«ì ¨¬ï DLL |
33 | ESI=DSDWORD[EBX+recid]; // ª § â¥«ì ¨¬ï DLL |
34 | do{ |
34 | do{ |
35 | $LODSB; |
35 | $LODSB; |
36 | OP(byte AL); |
36 | OP(byte AL); |
37 | }while(AL!=0); // ®åà ¨¬ ¨¬ï DLL |
37 | }while(AL!=0); // ®åà ¨¬ ¨¬ï DLL |
38 | AddrTable = outptr; //䨪á¨à㥬 ç «® AddrTable ¤«ï ¤ ®£® DLL |
38 | AddrTable = outptr; //䨪á¨à㥬 ç «® AddrTable ¤«ï ¤ ®£® DLL |
39 | apiName=DSDWORD[EBX+recmodline]+1<<2+AddrTable; |
39 | apiName=DSDWORD[EBX+recmodline]+1<<2+AddrTable; |
40 | j=0; |
40 | j=0; |
41 | while(j |
41 | while(j |
42 | EBX=j<<2+posttype; |
42 | EBX=j<<2+posttype; |
43 | if(DSDWORD[EBX]==POST_API){ |
43 | if(DSDWORD[EBX]==POST_API){ |
44 | EBX=j<<2+postnum; |
44 | EBX=j<<2+postnum; |
45 | api=DSDWORD[EBX]; |
45 | api=DSDWORD[EBX]; |
46 | ECX=api; |
46 | ECX=api; |
47 | if(DSDWORD[ECX+rectype]==dll){ // § ®¡à ¡ âë¢ ¥¬®£® DLL? |
47 | if(DSDWORD[ECX+rectype]==dll){ // § ®¡à ¡ âë¢ ¥¬®£® DLL? |
48 | if(DSDWORD[ECX+recmodline]==0){ // é¥ ¥ ¢¥á¥ ¢ Lookup |
48 | if(DSDWORD[ECX+recmodline]==0){ // é¥ ¥ ¢¥á¥ ¢ Lookup |
49 | DSDWORD[ECX+recmodline]=outptr-output+OptBaseOfCode; |
49 | DSDWORD[ECX+recmodline]=outptr-output+OptBaseOfCode; |
50 | IF(byName){ |
50 | IF(byName){ |
51 | OUTDWORD(apiName - output + OptBaseOfCode - 2); |
51 | OUTDWORD(apiName - output + OptBaseOfCode - 2); |
52 | hold=outptr; |
52 | hold=outptr; |
53 | outptr=apiName; |
53 | outptr=apiName; |
54 | EAX=DSDWORD[ECX+newid]; |
54 | EAX=DSDWORD[ECX+newid]; |
55 | IF(EAX!=0){ // áâì «¨ á? |
55 | IF(EAX!=0){ // áâì «¨ á? |
56 | IF(lstrcmpA(DSDWORD[ECX+recid],EAX)!=0){ |
56 | IF(lstrcmpA(DSDWORD[ECX+recid],EAX)!=0){ |
57 | ESI=api; |
57 | ESI=api; |
58 | ESI=DSDWORD[ESI+newid]; |
58 | ESI=DSDWORD[ESI+newid]; |
59 | GOTO L1; |
59 | GOTO L1; |
60 | } |
60 | } |
61 | } |
61 | } |
62 | ESI=DSDWORD[ECX+recid]; |
62 | ESI=DSDWORD[ECX+recid]; |
63 | L1: |
63 | L1: |
64 | do{ |
64 | do{ |
65 | $LODSB; |
65 | $LODSB; |
66 | OP(byte AL); |
66 | OP(byte AL); |
67 | }while(AL!=0); // ®åà ¨¬ ¨¬ï API |
67 | }while(AL!=0); // ®åà ¨¬ ¨¬ï API |
68 | apiName=outptr; |
68 | apiName=outptr; |
69 | outptr=hold; |
69 | outptr=hold; |
70 | } |
70 | } |
71 | ELSE{ |
71 | ELSE{ |
72 | EAX=DSDWORD[ECX+recnumber]|0x80000000; // ord number |
72 | EAX=DSDWORD[ECX+recnumber]|0x80000000; // ord number |
73 | OUTDWORD(EAX); |
73 | OUTDWORD(EAX); |
74 | } |
74 | } |
75 | } |
75 | } |
76 | } |
76 | } |
77 | } |
77 | } |
78 | j++; |
78 | j++; |
79 | } // end search in post |
79 | } // end search in post |
80 | OUTDWORD(0); |
80 | OUTDWORD(0); |
81 | outptr=hold; |
81 | outptr=hold; |
82 | outptr=DirTable; |
82 | outptr=DirTable; |
83 | OUTDWORD(AddrTable-output+OptBaseOfCode); |
83 | OUTDWORD(AddrTable-output+OptBaseOfCode); |
84 | OUTDWORD(0); |
84 | OUTDWORD(0); |
85 | OUTDWORD(0); |
85 | OUTDWORD(0); |
86 | OUTDWORD(dllName-output+OptBaseOfCode); |
86 | OUTDWORD(dllName-output+OptBaseOfCode); |
87 | OUTDWORD(AddrTable-output+OptBaseOfCode); |
87 | OUTDWORD(AddrTable-output+OptBaseOfCode); |
88 | DirTable=outptr; |
88 | DirTable=outptr; |
89 | outptr=apiName; |
89 | outptr=apiName; |
90 | } |
90 | } |
91 | i++; |
91 | i++; |
92 | } // end search in DLLlist |
92 | } // end search in DLLlist |
93 | } |
93 | } |
94 | outptr=DirTable; |
94 | outptr=DirTable; |
95 | OUTDWORD(0); |
95 | OUTDWORD(0); |
96 | OUTDWORD(0); |
96 | OUTDWORD(0); |
97 | OUTDWORD(0); |
97 | OUTDWORD(0); |
98 | OUTDWORD(0); |
98 | OUTDWORD(0); |
99 | OUTDWORD(0); |
99 | OUTDWORD(0); |
100 | outptr=apiName; |
100 | outptr=apiName; |
101 | OptImportTableSize=outptr-output-OptImportTableAdr; |
101 | OptImportTableSize=outptr-output-OptImportTableAdr; |
102 | OptImportTableAdr=OptImportTableAdr+OptBaseOfCode; |
102 | OptImportTableAdr=OptImportTableAdr+OptBaseOfCode; |
103 | } |
103 | } |
104 | 104 | ||
105 | // ---- ®à¬¨à®¢ ¨¥ EXE |
105 | // ---- ®à¬¨à®¢ ¨¥ EXE |
106 | dword WriteEXE() |
106 | dword WriteEXE() |
107 | dword diskout; // Handle ¢ë室®£® ä ©« |
107 | dword diskout; // Handle ¢ë室®£® ä ©« |
108 | byte exefile[FILENAMESIZE]; |
108 | byte exefile[FILENAMESIZE]; |
109 | { |
109 | { |
110 | wsprintfA(#exefile,"%s.EXE",#rawfilename); |
110 | wsprintfA(#exefile,"%s.EXE",#rawfilename); |
111 | SHOW(#exefile); |
111 | WRITESTR(#exefile); |
112 | diskout=_lcreat(#exefile,0); |
112 | diskout=_lcreat(#exefile,0); |
113 | IF(EAX==0){ |
113 | IF(EAX==0){ |
114 | wsprintfA(#mapstr,"ERROR, unable to create output file %s.\n",#exefile); |
114 | wsprintfA(#mapstr,"ERROR, unable to create output file %s.\n",#exefile); |
115 | WRITESTR(#mapstr); |
115 | WRITESTR(#mapstr); |
116 | return(-1); |
116 | return(-1); |
117 | } |
117 | } |
118 | OptCodeSize=outptr-startptr+1; |
118 | OptCodeSize=outptr-startptr+1; |
119 | OptImageSize=OptCodeSize/OptSectionAlignment; |
119 | OptImageSize=OptCodeSize/OptSectionAlignment; |
120 | OptImageSize+=2; |
120 | OptImageSize+=2; |
121 | OptImageSize=OptImageSize*OptSectionAlignment; |
121 | OptImageSize=OptImageSize*OptSectionAlignment; |
122 | OptImageSize+=0x80000; |
122 | OptImageSize+=0x80000; |
123 | TxtVirtualSize=OptCodeSize+0x80000; |
123 | TxtVirtualSize=OptCodeSize+0x80000; |
124 | TxtSizeOfRawData=OptCodeSize/OptFileAlignment; |
124 | TxtSizeOfRawData=OptCodeSize/OptFileAlignment; |
125 | TxtSizeOfRawData++; |
125 | TxtSizeOfRawData++; |
126 | TxtSizeOfRawData=TxtSizeOfRawData*OptFileAlignment; |
126 | TxtSizeOfRawData=TxtSizeOfRawData*OptFileAlignment; |
127 | _lwrite(diskout,#exeheader,0x160); |
127 | _lwrite(diskout,#exeheader,0x160); |
128 | WriteZero(diskout, 0xA0); |
128 | WriteZero(diskout, 0xA0); |
129 | IF(outptr-output)_lwrite(diskout,output,outptr-output); |
129 | IF(outptr-output)_lwrite(diskout,output,outptr-output); |
130 | EAX=OptCodeSize%OptFileAlignment; |
130 | EAX=OptCodeSize%OptFileAlignment; |
131 | EAX> |
131 | EAX> |
132 | EAX=OptFileAlignment-EBX; |
132 | EAX=OptFileAlignment-EBX; |
133 | EAX++; |
133 | EAX++; |
134 | WriteZero(diskout, EAX); |
134 | WriteZero(diskout, EAX); |
135 | _lclose(diskout); |
135 | _lclose(diskout); |
136 | return(0); |
136 | return(0); |
137 | } |
137 | } |
138 | 138 | ||
139 | // ---- |
139 | // ---- |
140 | WriteZero(dword handle,size) |
140 | WriteZero(dword handle,size) |
141 | byte c; |
141 | byte c; |
142 | { |
142 | { |
143 | c=0; |
143 | c=0; |
144 | loop(size)_lwrite(handle,#c,1); |
144 | loop(size)_lwrite(handle,#c,1); |
145 | } |
145 | } |
146 | >2+postnum; |
146 | >2+postnum; |
147 | ><2+postnum; |
147 | ><2+postnum; |
148 | >2+posttype; |
148 | >2+posttype; |
149 | ><2+posttype; |
149 | ><2+posttype; |
150 | >2+AddrTable; |
150 | >2+AddrTable; |
151 | ><2+AddrTable; |
151 | ><2+AddrTable; |
152 | >2; |
152 | >2; |
153 | ><2; |
153 | ><2; |
154 | > |
154 | > |