Changeset 4164 for trunk/src/win32k/libconv.c
- Timestamp:
- Sep 2, 2000, 11:08:23 PM (25 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/win32k/libconv.c
r1678 r4164 1 /* $Id: libconv.c,v 1. 2 1999-11-10 01:45:29bird Exp $1 /* $Id: libconv.c,v 1.3 2000-09-02 21:07:53 bird Exp $ 2 2 * 3 3 * Very simple OMF/LIB dumper. … … 21 21 22 22 int fCodeToCode16 = 0; 23 int fRemoveExtra = 0; 23 24 24 25 /*@IntFunc********************************************************************** … … 26 27 *******************************************************************************/ 27 28 int processFile(const char *pszFilename, const char *pszFilenameOut); 28 void *processRecord(void *pvRecord, void *pvBase, FILE *phNew );29 void *processRecord(void *pvRecord, void *pvBase, FILE *phNew, unsigned short *ausTrans); 29 30 30 31 … … 35 36 int argi = 1; 36 37 38 if (argc == 4) 39 { 40 argi = 2; 41 fRemoveExtra = 1; 42 } 37 43 if (argc != 3) 38 44 printf("syntax error - requires two filename, in.lib and out.lib\n"); … … 78 84 if (fread(pvFile, cbFile, 1, phFile) == 1) 79 85 { 86 unsigned short * ausTrans = calloc(sizeof(unsigned short), cbFile / 16 ); /* Assumes page size of 16 FIXME! */ 80 87 void *pvNew = pvFile; 88 81 89 82 90 /* main loop */ 83 91 while (pvNew < (void*)(cbFile + (int)pvFile)) 84 pvNew = processRecord(pvNew, pvFile, phNew );92 pvNew = processRecord(pvNew, pvFile, phNew, ausTrans); 85 93 } 86 94 else … … 103 111 104 112 105 void *processRecord(void *pvRecord, void *pvBase, FILE *phNew )113 void *processRecord(void *pvRecord, void *pvBase, FILE *phNew, unsigned short *ausTrans) 106 114 { 107 115 static char *apszLNames[256]; 108 116 static int cpszLNames = 0; 109 117 static int iCode16 = 0; 118 static int cbPage = 16; /* fixme todo TODO FIXME ASSUMES: pagesize = 16 */ 110 119 void *pvRet = pvRecord; 111 120 int cbRecord; … … 116 125 { 117 126 case LIBHDR: 118 fChanged = 1;119 fwrite(pvRecord, 1, 3, phNew);120 127 if (*(unsigned short*)((int)pvRecord+1) < 6) 121 fwrite((char*)pvRecord+3, 1, *(unsigned short*)((int)pvRecord+1), phNew); 122 else 123 { 124 i = 0; 125 fwrite(&i, 1, 2, phNew); 126 fwrite(&i, 1, 2, phNew); 127 fwrite(&i, 1, 2, phNew); 128 fwrite((char*)pvRecord+3+6, 1, *(unsigned short*)((int)pvRecord+1) - 6, phNew); 129 } 130 cbRecord = *((unsigned short*)((int)pvRecord+1)) + 3; 131 break; 132 133 case 0x98: /* 16-bit segdef */ 134 cbRecord = *((unsigned short*)((int)pvRecord+1)) + 3; 128 fprintf(stderr, "error: not supported LIBHDR\n"); 129 cbRecord = *((unsigned short*)((int)pvRecord+1)) + 3; 130 break; 131 132 case THEADR: 133 /* Add entry to the translation table - used to translate block numbers in the dictionary */ 134 ausTrans[((char*)pvRecord - (char*)pvBase) / cbPage] = (unsigned short)(ftell(phNew) / cbPage); 135 cbRecord = *((unsigned short*)((int)pvRecord+1)) + 3; 136 break; 137 138 case SEGDEF: /* 16-bit segdef */ 139 cbRecord = *((unsigned short*)((int)pvRecord+1)) + 3; 140 *((char*)pvRecord + 9) = 0; 135 141 i = *(char*)((int)pvRecord + 6); 136 142 if (cbRecord == 10 && i <= cpszLNames && strcmp(apszLNames[i-1], "CODE") == 0) 137 143 { 138 144 *(char*)((int)pvRecord + 6) = iCode16+1; 139 } 145 } 146 i = *(char*)((int)pvRecord + 6); 147 if (cbRecord == 10 && (*((char *)pvRecord + 3) & 0xE0) == 0x20 && i <= cpszLNames && strcmp(apszLNames[i-1], "CODE16_IOSEG") == 0) 148 { /* change alignment of this segment... */ 149 /* fprintf(stderr, "debug %s 0x%02x\n", apszLNames[*(char*)((int)pvRecord + 6) - 1], (*((char *)pvRecord + 3) & 0xFF)); */ 150 *((char*)pvRecord + 3) = 0x40 | (*((char*)pvRecord + 3) & 0x1F); 151 } 140 152 break; 141 153 … … 148 160 /* it seems to be somthing funny here! - lets try aligning it to on a 16 bytes boundrary... */ 149 161 /* PS. I know this I have a wrong approch to the lib files, not using the directory... */ 162 /* Aug 13 2000 4:24am: The alignment of modules are found in the library header. 163 * It's the size of the library header. 164 * Not implemented yet. TODO FIXME BUGBUG ASSUMES 165 */ 150 166 fChanged = 1; 151 167 fwrite(pvRecord, 1, cbRecord, phNew); … … 153 169 if (*((unsigned char*)((int)pvRecord+cbRecord)) == 0x00) 154 170 { 155 if ((ul % 16) > 0)156 cbRecord += 16 - (ul % 16);171 if ((ul % cbPage) > 0) 172 cbRecord += cbPage - (ul % cbPage); 157 173 } 158 174 /*if (*((unsigned char*)pvRecord + cbRecord) != LIBEND)*/ 159 175 { 160 176 ul = ftell(phNew); 161 while (ul++ % 16!= 0)177 while (ul++ % cbPage != 0) 162 178 fputc(0, phNew); 163 179 } … … 166 182 } break; 167 183 184 case PUBDEF: 185 { 186 cbRecord = *((unsigned short*)((int)pvRecord+1)) + 3; 187 *((char*)pvRecord + cbRecord - 1) = 0; 188 break; 189 } 190 168 191 case LNAMES: 169 192 { 170 193 char *apszConv[] = 171 194 { 172 "CODE", "CODE", 173 "_CODE", "CODE16", 174 "TEXT", "CODE16", 175 "_TEXT", "CODE16", 176 "DATA", "FAR_DATA", 177 "_DATA", "DATA16", 178 "DGROUP", "DATA16_GROUP", 179 "_BSS", "DATA16BSS", 180 "BSS", "DATA16BSS", 181 "_CONST", "DATA16CONST", 182 "CONST", "DATA16CONST", 195 /* classes */ 196 "CODE", "CODE", 197 "IOSEG_CODE", "CODE", 198 "DATA", "FAR_DATA", 199 "BSS", "DATA16BSS", 200 "CONST", "DATA16CONST", 201 /* segment names */ 202 "_TEXT", "CODE16", 203 "_IOSEG", "CODE16_IOSEG", 204 "_CODE", "CODE16", /* dhcalls */ 205 "_DATA", "DATA16", 206 "_BSS", "DATA16BSS", 207 "_CONST", "DATA16CONST", 208 /* groups */ 209 "DGROUP", "DATA16_GROUP", 183 210 NULL, NULL 184 211 }; … … 242 269 fputc(0, phNew); 243 270 break; 244 271 } 245 272 246 273 case LIBEND: 247 cbRecord = *((unsigned short*)((int)pvRecord+1)) + 3; 248 fwrite(pvRecord, 1, cbRecord, phNew); 274 { 275 /* align dictionary at 512 byte (3 is min size of this record) */ 276 int cBlocks; 277 unsigned short int cbSize = (((ftell(phNew) + 3 + 0x1ff) & ~0x1ff) - ftell(phNew)) - 3; 278 unsigned long int offDict = ftell(phNew) + cbSize + 3; 279 cbRecord = cbSize + 3; 280 fwrite(pvRecord, 1, 1, phNew); 281 fwrite(&cbSize, 1, sizeof(cbSize), phNew); 282 while (cbSize-- > 0) 283 fwrite("\0", 1, 1, phNew); 284 285 /* update header record. */ 286 fseek(phNew, 3, SEEK_SET); 287 fwrite(&offDict, 1, sizeof(offDict), phNew); 288 fseek(phNew, offDict, SEEK_SET); 289 290 /* Translate the dictionary */ 291 pvRecord = (void*)((char*)pvRecord + *(unsigned short*)((char*)pvRecord + 1) + 3); 292 cBlocks = *(unsigned short *)((char*)pvBase + 7); 293 for (i = 0; i < cBlocks; i++) 294 { 295 int j; 296 char *pchBlock = (char*)pvRecord + i * 512; 297 for (j = 0; j < 37; j++) 298 { 299 if (pchBlock[j] > 19 && pchBlock[j] < 0xff) 300 { 301 unsigned short *pusBlock = (unsigned short*)&pchBlock[pchBlock[j] * 2]; 302 pusBlock = (unsigned short *) ((char*)pusBlock + *(char*)pusBlock + 1); 303 if (ausTrans[*pusBlock] == 0) 304 fprintf(stderr, "error: dictionary entry don't point to a THEADR page!\n"); 305 else 306 *pusBlock = ausTrans[*pusBlock]; 307 } 308 } 309 310 } 311 312 /* Write the dictionary */ 313 fwrite(pvRecord, 512, cBlocks, phNew); 249 314 return (void*)0xffffffff; /* FINE */ 250 break; 315 } 316 317 case COMENT: 318 { 319 cbRecord = *((unsigned short*)((int)pvRecord+1)) + 3; 320 switch (*((unsigned char*)((int)pvRecord+4))) 321 { 322 /* remove "Link Pass Separator" */ 323 case 0xA2: 324 /* remove "LIBMOD" - The VAC 3.6.5 Linker don't like these! */ 325 case 0xA3: 326 fChanged = fRemoveExtra; 327 break; 328 } 329 break; 330 } 331 332 /* 333 * Remove checksum 334 */ 335 /* 336 case GRPDEF: 337 case FIXUPP: 338 case FIXUPP2: 339 case LEDATA: 340 { 341 cbRecord = *((unsigned short*)((int)pvRecord+1)) + 3; 342 *((char*)pvRecord + cbRecord - 1) = 0; 343 break; 344 } 345 */ 251 346 252 347 default:
Note:
See TracChangeset
for help on using the changeset viewer.