Citat:
Eurora3D Team: Ovo sam ja koristio u jednom poslu ... trebalo je da se pokrene fajl zapisan u nizu (char*) u source fajlu ...
U principu dobar kod , mada ... daleko od toga da ces moci komotno da pozivas funkcije iz dll-a u formatu funkcija(char* ovo,int ono);
Kod ima jednu fn koja se zove, cini mi se, MemoryGetProcAddres kojom mozes da nadjes adresu procedure a posle bi najbolje bilo da koristis inline assembler (ako je VC++) tako sto argumente funkcije obrnutim redom (sa desna na levo) guras u stack i onda pozivas fn. Nesto kao
Code:
__asm{
push arg2
push arg1
call fn
mov rezultat, eax // povratna vrednost je u eax registru
}
Hvala za __asm al nisam jos dotle stigao ..
Probao sam sa MemoryLoadLibrary i ne ide :(
Code:
HMEMORYMODULE hModule = MemoryLoadLibrary((const void*)szBuffer) ;
BuildImportTable() funkcija u MemoryLoadLibrary vraca FALSE ...
I cini mi se da je ovde negde problem
Code:
for (; !IsBadReadPtr(importDesc, sizeof(IMAGE_IMPORT_DESCRIPTOR)) && importDesc->Name; importDesc++)
{
DWORD *thunkRef, *funcRef;
HMODULE handle = LoadLibrary((LPCTSTR)(codeBase + importDesc->Name)); //222 linija
//handle je posle ovog poziva NULL
//a u debugerru "codeBase + importDesc->Name" je KERNEL32.dll
}
module->modules[module->numModules++] = handle;
if (importDesc->OriginalFirstThunk)
{
thunkRef = (DWORD *)(codeBase + importDesc->OriginalFirstThunk);
funcRef = (DWORD *)(codeBase + importDesc->FirstThunk);
} else {
// no hint table
thunkRef = (DWORD *)(codeBase + importDesc->FirstThunk);
funcRef = (DWORD *)(codeBase + importDesc->FirstThunk);
}
for (; *thunkRef; thunkRef++, funcRef++)
{
if IMAGE_SNAP_BY_ORDINAL(*thunkRef)
*funcRef = (DWORD)GetProcAddress(handle, (LPCSTR)IMAGE_ORDINAL(*thunkRef)); // 251 warning message
else {
PIMAGE_IMPORT_BY_NAME thunkData = (PIMAGE_IMPORT_BY_NAME)(codeBase + *thunkRef);
*funcRef = (DWORD)GetProcAddress(handle, (LPCSTR)&thunkData->Name); //254 warning message
}
if (*funcRef == 0)
{
result = 0;
break;
}
}
return result ;
Ovde je *funcRef == 0 i BuildImportTable vraca result = 0
Zanimljive poruke koje dobijam u output prozoru sa compiler warning porukama:
1>.\core\MemoryModule.cpp(251) : warning C4311: 'type cast' : pointer truncation from 'FARPROC' to 'DWORD'
1>.\core\MemoryModule.cpp(254) : warning C4311: 'type cast' : pointer truncation from 'FARPROC' to 'DWORD'
i pored pragma direktive :
// disable warnings about pointer <-> DWORD conversions
#pragma warning( disable : 4311 4312 )
Da napomenem :
Pre nego sto probam da otvorim DLL iz buffer-a pre toga ga snimim u fajl i ucitam ga sa LoadLibrary i radi normalno ...
[Ovu poruku je menjao deerbeer dana 05.06.2008. u 12:44 GMT+1]
Viva lollapalooza