Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1846 yogev_ezra 1
// ---- Формирование IMPORT секции
2
void DoLink()
3
dword i,j,DirTable,AddrTable,dllName,apiName,byName,hold;
4
dword dll,api;
5
{
6
	OptImportTableAdr=outptr-output;
7
	DirTable=outptr;
8
	if(APIcount==0){
9
		OUTDWORD(outptr -output + OptBaseOfCode + 4);
10
		OUTDWORD(0x80000001);
11
		OUTDWORD(0);
12
		OUTDWORD(DirTable-output+40+OptBaseOfCode);
13
		OUTDWORD(outptr-output + OptBaseOfCode - 12);
14
		DirTable=outptr;
15
		outptr = outptr + 20;
16
		OUTDWORD('resu');
17
		OUTDWORD('d.23');
18
		OUTDWORD('ll');
19
//	OUTDWORD(0x72657375); OUTDWORD(0x642E3233); OUTDWORD(0x6C6C);
20
		apiName=outptr;
21
	}
22
	else {
23
		EAX=DLLcount+1*20;
24
		outptr+=EAX;	// на начало LookupTables
25
		i=0;
26
		while(i
27
			EAX=i<<2;
28
			dll=DLLlist[EAX];
29
			EBX=dll;		// Ссылка на DLL в списке идентификаторов
30
			byName = DSDWORD[EBX+rectype];	// Импорт по имени?
31
			if(DSDWORD[EBX+recmodline]){	// Были вызовы API из данной DLL?
32
				dllName=outptr;
33
				ESI=DSDWORD[EBX+recid]; // Указатель на имя DLL
34
				do{
35
					$LODSB;
36
					OP(byte AL);
37
				}while(AL!=0);	// Сохраним имя DLL
38
				AddrTable = outptr; //фиксируем начало AddrTable для данного DLL
39
				apiName=DSDWORD[EBX+recmodline]+1<<2+AddrTable;
40
				j=0;
41
				while(j
42
					EBX=j<<2+posttype;
43
					if(DSDWORD[EBX]==POST_API){
44
						EBX=j<<2+postnum;
45
						api=DSDWORD[EBX];
46
						ECX=api;
47
						if(DSDWORD[ECX+rectype]==dll){		// Из обрабатываемого DLL?
48
							if(DSDWORD[ECX+recmodline]==0){ // Еще не внесен в Lookup
49
								DSDWORD[ECX+recmodline]=outptr-output+OptBaseOfCode;
50
								IF(byName){
51
									OUTDWORD(apiName - output + OptBaseOfCode - 2);
52
									hold=outptr;
53
									outptr=apiName;
54
									EAX=DSDWORD[ECX+newid];
55
									IF(EAX!=0){ // Есть алиас?
56
										IF(lstrcmpA(DSDWORD[ECX+recid],EAX)!=0){
57
											ESI=api;
58
											ESI=DSDWORD[ESI+newid];
59
											GOTO L1;
60
										}
61
									}
62
									ESI=DSDWORD[ECX+recid];
63
L1:
64
									do{
65
										$LODSB;
66
										OP(byte AL);
67
									}while(AL!=0);	// Сохраним имя API
68
									apiName=outptr;
69
									outptr=hold;
70
								}
71
								ELSE{
72
									EAX=DSDWORD[ECX+recnumber]|0x80000000;	// ord number
73
									OUTDWORD(EAX);
74
								}
75
							}
76
						}
77
					}
78
					j++;
79
				} // end search in post
80
				OUTDWORD(0);
81
				outptr=hold;
82
				outptr=DirTable;
83
				OUTDWORD(AddrTable-output+OptBaseOfCode);
84
				OUTDWORD(0);
85
				OUTDWORD(0);
86
				OUTDWORD(dllName-output+OptBaseOfCode);
87
				OUTDWORD(AddrTable-output+OptBaseOfCode);
88
				DirTable=outptr;
89
				outptr=apiName;
90
			}
91
			i++;
92
		} // end search in DLLlist
93
	}
94
	outptr=DirTable;
95
	OUTDWORD(0);
96
	OUTDWORD(0);
97
	OUTDWORD(0);
98
	OUTDWORD(0);
99
	OUTDWORD(0);
100
	outptr=apiName;
101
	OptImportTableSize=outptr-output-OptImportTableAdr;
102
	OptImportTableAdr=OptImportTableAdr+OptBaseOfCode;
103
}
104
 
105
// ---- Формирование EXE
106
dword WriteEXE()
107
dword diskout;	// Handle выходного файла
108
byte exefile[FILENAMESIZE];
109
{
110
	wsprintfA(#exefile,"%s.EXE",#rawfilename);
111
	SHOW(#exefile);
112
	diskout=_lcreat(#exefile,0);
113
	IF(EAX==0){
114
		wsprintfA(#mapstr,"ERROR, unable to create output file %s.\n",#exefile);
115
		WRITESTR(#mapstr);
116
		return(-1);
117
	}
118
	OptCodeSize=outptr-startptr+1;
119
	OptImageSize=OptCodeSize/OptSectionAlignment;
120
	OptImageSize+=2;
121
	OptImageSize=OptImageSize*OptSectionAlignment;
122
	OptImageSize+=0x80000;
123
	TxtVirtualSize=OptCodeSize+0x80000;
124
	TxtSizeOfRawData=OptCodeSize/OptFileAlignment;
125
	TxtSizeOfRawData++;
126
	TxtSizeOfRawData=TxtSizeOfRawData*OptFileAlignment;
127
	_lwrite(diskout,#exeheader,0x160);
128
	WriteZero(diskout, 0xA0);
129
	IF(outptr-output)_lwrite(diskout,output,outptr-output);
130
	EAX=OptCodeSize%OptFileAlignment;
131
	EAX>
132
	EAX=OptFileAlignment-EBX;
133
	EAX++;
134
	WriteZero(diskout, EAX);
135
	_lclose(diskout);
136
	return(0);
137
}
138
 
139
// ----
140
WriteZero(dword handle,size)
141
byte c;
142
{
143
	c=0;
144
	loop(size)_lwrite(handle,#c,1);
145
}