Subversion Repositories Kolibri OS

Rev

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
>
146
>
147
>
147
>
148
>
148
>
149
>
149
>
150
>
150
>
151
>
151
>
152
>
152
>
153
>
153
>
154
>
154
>