Frage zu va_arg usw.
-
Hi,
ich bin grad dabei mir ein colour fprintf zu schreiben. Und da haett ich jetzt mal ein paar frage bezueglich va_arg usw.
Hier erst mal mein Code:pTmpArgs = malloc(cValues * sizeof(int)); if(pTmpArgs != NULL) { int iTmp = 0; int iTmpValue; *(pBuffer+sCurBuffer) = '\0'; for(;iTmp < cValues; iTmp++) *(pTmpArgs+iTmp) = va_arg(VaList, int); for(; iTmp > 0; iTmp--) { iTmpValue = *(pTmpArgs + iTmp -1); __asm { push iTmpValue; } } fprintf(fStream, pBuffer); __asm { add iPrinted, eax; mov eax, 4; /*<--hier die goresse mein ich*/ imul eax, cValues; add esp, eax; } free(pTmpArgs);
Dies scheint auch zu funktioniern. Bis jetzt....
Jetzt die Fragen:
1. Ich hab in OllyDbg gesehen das nach printf/frpintf immer die Anzahl der Variablen Argumente * der groesses eines pushes(ka wie ich das nennen soll) zu esp geaddet wird. Sowei ok versteh ich nur die frag is woher weiss ich wie gross die zweite groesse ist? Ich habs jetzt hier hardcodiert aber so is ja bloedi. Kann da iwie sizeof(int) oder so schreiben?2. Is das mit va_arg bzw ... ueberall so implementiert das von hinten nach vorne die Args gepusht werden und nach dem call zu der Funktion einfach noch ein wert zu esp geaddet wird oder kann das ein das das jetzt nur bei mir hier mitn C Compiler von Visual Studio laeuft?
Gruesse & blessed day
C0de4fun
-
C0de4Fun schrieb:
oder kann das ein das das jetzt nur bei mir hier mitn C Compiler von Visual Studio laeuft?
Kann sein. Portabel ist das sicher nicht. Warum nicht einfach die va_Makros nehmen?
-
µngbd schrieb:
C0de4Fun schrieb:
oder kann das ein das das jetzt nur bei mir hier mitn C Compiler von Visual Studio laeuft?
Kann sein. Portabel ist das sicher nicht. Warum nicht einfach die va_Makros nehmen?
Wie gesagt ich will mir ein coloured fprintf schreiben und dabei geh ich folgendermaßen vor:
gleichen Funktionskopf wie fprintf sprich:
int colour_fprintf(FILE*, char*, ...)
Wenn jetzt im Format String z.B. "##r" vorkommt soll alles was danach kommt in rot dargestellt werden. Deshalb geb ich alles was bis jetzt kam aus. Aendere dann die Farbe und gib dann das was danach kommt aus, wenn ein neues "##x" kommt oder halt das ende des strings erreicht wurde. Wenn jetzt im ersten String ein "%.." vorkommt muss ich ja die Argumente auch weiter an fprintf geben. Die hole ich ja mit den Makros:
for(;iTmp < cValues; iTmp++) *(pTmpArgs+iTmp) = va_arg(VaList, int);
und dann ruf ich fprintf mit dem ersten String auf. Und dazu muss ich ja au die Argumente mit uebergeben. Was ich mit nem einfachen "push" machn.
Jetzt die Frage an dich wie sollt na des mit den Makros gehen?
Blessed Day C0de4Fun