Changeset 195 for trunk/nom/src/nomgc.c
- Timestamp:
- Jan 17, 2007, 7:33:51 PM (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/nom/src/nomgc.c
r193 r195 55 55 56 56 gboolean bUseGC=FALSE; /* Mark if we use the garbage collector */ 57 GTree* treeRegisteredDLL; 57 58 58 59 static gpointer gcMalloc(gulong ulBytes) … … 96 97 /* fprintf(stderr, " GC memory functions set for GLIB. (%s: %d)\n", __FILE__, __LINE__); */ 97 98 99 /* Cretea tree holding the already registered DLLs */ 100 treeRegisteredDLL=g_tree_new((GCompareFunc)stricmp); 101 98 102 bUseGC=TRUE; 103 } 104 105 106 void test() 107 { 108 gulong ulObj, ulOffset; 109 gchar thePath[CCHMAXPATH]; 110 HMODULE hModule; 111 112 if(DosQueryModFromEIP( &hModule, &ulObj, CCHMAXPATH, thePath, &ulOffset, (ULONG)test)!=0) { 113 hModule=0; 114 return NULLHANDLE; /* Error */ 115 } 116 99 117 } 100 118 … … 271 289 GSList* lTemp; 272 290 273 // printf("Trying to register DLL %s\n", chrDLLName);291 //g_message("Trying to register DLL %s\n", chrDLLName); 274 292 lTemp=hRegisterDLL->dllList; 275 293 while(lTemp) … … 279 297 pModRec=(qsLrec_t*)lTemp->data; 280 298 if(pModRec){ 281 // printf("DLL name: %s\n", pModRec->pName);299 //g_message("DLL name: %s\n", pModRec->pName); 282 300 if(pModRec->pName && (NULLHANDLE!=strstr( pModRec->pName, chrDLLName))) 283 301 { … … 297 315 nomRegisterDataAreaForGC((char*)pObjInfo[iObj].oaddr, 298 316 (char*)(pObjInfo[iObj].oaddr+pObjInfo[iObj].osize)); 317 g_tree_insert(treeRegisteredDLL, g_strdup(chrDLLName), GUINT_TO_POINTER((guint)pModRec->hmte)); 299 318 } 300 319 } … … 307 326 } 308 327 309 #if 0 310 #define BUFSIZE 1024*1024 311 NOMEXTERN HREGDLL NOMLINK nomBeginRegisterDLLWithGC(void) 312 { 313 ULONG rc; 314 HREGDLL hReg=NULLHANDLE; 315 PTIB ptib; 316 PPIB ppib; 317 char * buf; 318 319 rc = DosGetInfoBlocks(&ptib, &ppib); 320 if (rc!=NO_ERROR) 321 return NULLHANDLE; 322 323 buf = malloc(BUFSIZE); 324 if(!buf) 325 return NULLHANDLE; 326 327 memset(buf,0,BUFSIZE); 328 329 rc = DosQuerySysState(QS_PROCESS | QS_SEMAPHORE | QS_MTE | QS_FILESYS | QS_SHMEMORY , 330 QS_MTE, /*0x96*/ ppib->pib_ulpid , 1UL, (PCHAR)buf, BUFSIZE); 331 if (rc==NO_ERROR) { 332 hReg=(qsPtrRec_t*) buf; 333 } 334 else 335 free(buf); 336 337 return hReg; 338 } 339 /* 340 FIXME: 341 342 This function will not find every given DLL because it doesn't follow every import of 343 each DLL. 344 It's only meant for registering the GTK+, GLIB and friends DLLs. This works because GTK2.DLL 345 is directly loaded by the exe and all the friends DLLs are imported by it. 346 347 Feel free to make this function really useful... 348 349 Oh, and some refactoring would be nice, too. 350 351 */ 352 #define OBJREAD 0x0001L 353 #define OBJWRITE 0x0002L 354 #define OBJINVALID 0x0080L 355 NOMEXTERN BOOL NOMLINK nomRegisterDLLByName(const HREGDLL hRegisterDLL, const char* chrDLLName) 356 { 357 qsPrec_t * p; 358 int a=0; 359 360 //printf("Trying to register DLL %s\n", chrDLLName); 361 362 p=hRegisterDLL->pProcRec; 363 while(p && p->RecType == 1) 364 { 365 a++; 366 if (p->cLib) { 367 int i; 368 369 for (i=0; i<p->cLib; i++){ 370 qsLrec_t * pModRec; 371 372 //printf("%d %04X (p: %04x %04X, %04X) ",i, p->pLibRec[i], p, &p->pLibRec[i], &p->pLibRec); 373 374 pModRec=qsFindModuleRec(hRegisterDLL, p->pLibRec[i]); 375 if(pModRec){ 376 // printf("DLL name: %s\n", pModRec->pName); 377 if(NULLHANDLE!=strstr( pModRec->pName, chrDLLName)) 378 { 379 qsLObjrec_t *pObjInfo; 380 //printf(" --> Found DLL %s\n", pModRec->pName); 381 pObjInfo=pModRec->pObjInfo; 382 if(NULLHANDLE!=pObjInfo) 383 { 384 int iObj; 385 for(iObj=0; iObj<pModRec->ctObj ;iObj++) 386 { 387 if (!(pObjInfo[iObj].oflags & OBJWRITE)) continue; 388 if (!(pObjInfo[iObj].oflags & OBJREAD)) continue; 389 if ((pObjInfo[iObj].oflags & OBJINVALID)) continue; 390 printf(" #%d: %04lX, size: %04lX %04lX", 391 iObj, pObjInfo[iObj].oaddr, pObjInfo[iObj].osize, pObjInfo[iObj].oflags); 392 nomRegisterDataAreaForGC((char*)pObjInfo[iObj].oaddr, 393 (char*)(pObjInfo[iObj].oaddr+pObjInfo[iObj].osize)); 394 } 395 } 396 return TRUE; 397 } 398 /* Check the imports of this DLL if any */ 399 if(pModRec->ctImpMod >0) 400 { 401 int iImps; 402 PUSHORT pImpHmte; 403 404 pImpHmte=(PUSHORT)((void*)pModRec + sizeof(qsLrec_t)); 405 406 for(iImps=0; iImps < pModRec->ctImpMod; iImps++) 407 { 408 qsLrec_t * pModImp; 409 // printf(" Trying import #%d (%04X)\n", iImps, pImpHmte[iImps]); 410 pModImp=qsFindModuleRec(hRegisterDLL, pImpHmte[iImps]); 411 if(pModImp){ 412 //printf(" DLL name: %s\n", pModImp->pName); 413 if(NULLHANDLE!=strstr( pModImp->pName, chrDLLName)) 414 { 415 qsLObjrec_t *pObjInfo; 416 //printf(" --> Found DLL %s\n", pModImp->pName); 417 pObjInfo=pModImp->pObjInfo; 418 if(NULLHANDLE!=pObjInfo) 419 { 420 int iObj; 421 for(iObj=0; iObj<pModImp->ctObj ;iObj++) 422 { 423 if (!(pObjInfo[iObj].oflags & OBJWRITE)) continue; 424 if (!(pObjInfo[iObj].oflags & OBJREAD)) continue; 425 if ((pObjInfo[iObj].oflags & OBJINVALID)) continue; 426 427 //printf(" #%d: %04lX, size: %04lX %04lX\n", 428 // iObj, pObjInfo[iObj].oaddr, pObjInfo[iObj].osize, pObjInfo[iObj].oflags); 429 nomRegisterDataAreaForGC((char*)pObjInfo[iObj].oaddr, 430 (char*)(pObjInfo[iObj].oaddr+pObjInfo[iObj].osize)); 431 } 432 } 433 return TRUE; 434 } 435 }/* for() */ 436 }/* for()*/ 437 }/* if() */ 438 } 439 }/* For() */ 440 } 441 break; 442 } 328 329 NOMEXTERN BOOL NOMLINK nomQueryUsingNameIsDLLRegistered(const gchar *chrName) 330 { 331 if(NULLHANDLE!=g_tree_lookup(treeRegisteredDLL, chrName)) 332 return TRUE; 333 443 334 return FALSE; 444 335 } 445 #endif
Note:
See TracChangeset
for help on using the changeset viewer.