Seite 1 von 1

(ASM-LIB) CheckFunction (V1.02)

Verfasst: 26.04.2005 02:46
von Deeem2031
Und gleich noch eine :mrgreen:
Die LIB besteht aus 3 Befehlen (StartCheck(),StopCheck() und ProcessCheck())
Die Procs überprüfen ob die Register zwischen StartCheck() und StopCheck() verändert wurden, dürfte also nur für LIB-Progger oder leute die ASM-Code benutzen interessant sein.

Eigentlich wollte ich mit dieser Lib zuerst nur eine Procedure überprüfen indem ich deren pointer übergebe. (CheckFunction(@Proc(),arg1,arg2,...))
Da aber @Procedure() zwar vom Syntax her vom Compiler akzeptiert wird, aber nicht das macht was es soll (nämlich den pointer zurück geben) funktionierte die ganze Sache nicht. (Ist kein Bug, hab Fred schon gefragt ;) )
Also kam ich paar Minuten später auf die Idee es mit den 3 Procs zu machen (Eigentlich braucht man nur StartCheck() und StopCheck(), aber ProcessCheck() vereinfacht das auswerten)

Download: http://www.deeem2031.de/CheckFunction.zip

Procs:
StartCheck()
*Result = StopCheck()
Result = ProcessCheck(flags.l)

Beispiel:

Code: Alles auswählen

DisableDebugger

ResetCPURegister()
ResetCPUFlags()
StartCheck()
InitNetwork()
*Result.CheckResult = StopCheck()
If ProcessCheck(#CheckFunction_Important) = 0
  icon = 0 ; :)
Else
  icon = 16 ; :(
EndIf

output.s = "---Register---"+#CRLF$
output + "Esp: "+Str(*Result\Esp)+#CRLF$
output + "Eax: "+Str(*Result\Eax)+#CRLF$
output + "Ebx: "+Str(*Result\Ebx)+#CRLF$
output + "Ecx: "+Str(*Result\Ecx)+#CRLF$
output + "Edx: "+Str(*Result\Edx)+#CRLF$
output + "Esi: "+Str(*Result\Esi)+#CRLF$
output + "Edi: "+Str(*Result\Edi)+#CRLF$
output + "Ebp: "+Str(*Result\Ebp)+#CRLF$
output + #CRLF$
output + "---Flags---"+#CRLF$
output + "CF: "+Str(*Result\flags&#CheckFunction_Flag_CarryFlag)+#CRLF$
output + "PF: "+Str(*Result\flags&#CheckFunction_Flag_ParityFlag)+#CRLF$
output + "AF: "+Str(*Result\flags&#CheckFunction_Flag_AuxiliaryFlag)+#CRLF$
output + "ZF: "+Str(*Result\flags&#CheckFunction_Flag_ZeroFlag)+#CRLF$
output + "SF: "+Str(*Result\flags&#CheckFunction_Flag_SignFlag)+#CRLF$
output + "TF: "+Str(*Result\flags&#CheckFunction_Flag_Trapflag)+#CRLF$
output + "IF: "+Str(*Result\flags&#CheckFunction_Flag_InterruptFlag)+#CRLF$
output + "DF: "+Str(*Result\flags&#CheckFunction_Flag_DirectionFlag)+#CRLF$
output + "OF: "+Str(*Result\flags&#CheckFunction_Flag_OverflowFlag)+#CRLF$
output + "IOPL: "+Str(*Result\flags&#CheckFunction_Flag_IOPrivilegeLevel)+#CRLF$
output + "NT: "+Str(*Result\flags&#CheckFunction_Flag_NestedTaskFlag)+#CRLF$
output + "RF: "+Str(*Result\flags&#CheckFunction_Flag_ResumeFlag)+#CRLF$
output + "VM: "+Str(*Result\flags&#CheckFunction_Flag_VirtualModeFlag)+#CRLF$
  
MessageRequester("Change",output,icon)
Wenn von ProcessCheck() 0 zurückgegeben wird heißt es das keiner der angegebenen Register sich verändert hat, andernfalls ist es die Anzahl der Register die sich geändert haben.
Soll heißen wenn ProcessCheck() Null zurückgibt ist alles ok :)
Was man mit dem Rückgabewert von StopCheck() anfängt kann man dem Beispiel entnehmen. Die Werte sind die Differenzen zwischen Aufruf von StartCheck() und StopCheck(). Wobei Eax, Ecx und Edx sogut wie keine Rolle spielen.

Ansonsten ist nurnoch zu sagen das man StartCheck() und StopCheck() nicht als Parameter einer Procedure angeben darf, da die Werte dadurch verfälscht werden.

Re: (ASM-LIB) CheckFunction (V1.00)

Verfasst: 26.04.2005 07:17
von Danilo
Deeem2031 hat geschrieben:Da aber @Procedure() zwar vom Syntax her vom Compiler akzeptiert wird, aber nicht das macht was es soll (nämlich den pointer zurück geben) funktionierte die ganze Sache nicht. (Ist kein Bug, hab Fred schon gefragt ;) )
Was meinst Du denn damit?

Das funktioniert schon so wie es sollte - es gibt den Pointer
zu der Procedure zurück.
Wird zum Beispiel für Callbacks gebraucht, aber auch sowas
funktioniert:

Code: Alles auswählen

Procedure Beep(freq)
  Beep_(freq,50)
EndProcedure

For a = 0 To 3500 Step 100
  CallFunctionFast(@Beep(),a)
Next a
Also alles so wie es soll.

Verfasst: 26.04.2005 11:03
von Deeem2031
Eben nicht. Versuch das ganze doch mit einer Procedure aus einer UserLibrary, oder einfach nur @InitNetwork() oder so...
Da wirst du nie die Adresse der Procedure zurückbekommen, dein Beispiel funktioniert nur weil du die Procedure im PBCode drin stehen hast.

Verfasst: 26.04.2005 13:00
von Danilo
Deeem2031 hat geschrieben:Eben nicht. Versuch das ganze doch mit einer Procedure aus einer UserLibrary, oder einfach nur @InitNetwork() oder so...
Da wirst du nie die Adresse der Procedure zurückbekommen, dein Beispiel funktioniert nur weil du die Procedure im PBCode drin stehen hast.
Das ist schon klar. Du redest von 'Procedure', und darunter
verstehe ich eben lokale Prozeduren im PB-Source.
Zu dem Rest sagen ja die meisten 'Befehle' oder 'PB-Funktionen',
wodurch Dein Beitrag eben nicht eindeutig war und ich einfach
mal nachfragte... :)

Verfasst: 28.04.2005 00:25
von Deeem2031
Mir ist vorhin aufgefallen, dass ich den Ebp-Register vergessen habe :roll:
Bei der Gelegenheit habe ich auch gleich ProcessCheck() etwas flexibler gemacht und der Procedure einen flags.l Parameter geschenkt.

Der Link ist der selbe wie vorher: http://www.deeem2031.de/CheckFunction

Den Rest dürfte das Beispiel erklären:

Code: Alles auswählen

Structure CheckResult
  Esp.l
  Eax.l
  Ebx.l
  Ecx.l
  Edx.l
  Esi.l
  Edi.l
  Ebp.l
EndStructure

Enumeration
  #CheckFunction_Esp = 1<<0
  #CheckFunction_Eax = 1<<1
  #CheckFunction_Ebx = 1<<2
  #CheckFunction_Ecx = 1<<3
  #CheckFunction_Edx = 1<<4
  #CheckFunction_Esi = 1<<5
  #CheckFunction_Edi = 1<<6
  #CheckFunction_Ebp = 1<<7
EndEnumeration

#CheckFunction_Important = #CheckFunction_Esp|#CheckFunction_Ebx|#CheckFunction_Esi|#CheckFunction_Edi|#CheckFunction_Ebp

StartCheck()
InitNetwork()
*Result.CheckResult = StopCheck()
If ProcessCheck(#CheckFunction_Important) = 0
  Debug ":)"
EndIf

MessageRequester("Change","Esp: "+Str(*Result\Esp)+#CRLF$+"Eax: "+Str(*Result\Eax)+#CRLF$+"Ebx: "+Str(*Result\Ebx)+#CRLF$+"Ecx: "+Str(*Result\Ecx)+#CRLF$+"Edx: "+Str(*Result\Edx)+#CRLF$+"Esi: "+Str(*Result\Esi)+#CRLF$+"Edi: "+Str(*Result\Edi)+#CRLF$+"Ebp: "+Str(*Result\Ebp))

Verfasst: 28.04.2005 13:36
von NicTheQuick
Diese Enumeration würde ich aber in eine RES-Datei machen.

Verfasst: 28.04.2005 13:46
von freedimension

Code: Alles auswählen

Enumeration
  #CheckFunction_Esp = 1<<0
  #CheckFunction_Eax = 1<<1
  #CheckFunction_Ebx = 1<<2
  #CheckFunction_Ecx = 1<<3
  #CheckFunction_Edx = 1<<4
  #CheckFunction_Esi = 1<<5
  #CheckFunction_Edi = 1<<6
  #CheckFunction_Ebp = 1<<7
EndEnumeration
Hat das einen Vorteil gegenüber

Code: Alles auswählen

  #CheckFunction_Esp = 1
  #CheckFunction_Eax = 2
  #CheckFunction_Ebx = 4
  #CheckFunction_Ecx = 8
  #CheckFunction_Edx = 16
  #CheckFunction_Esi = 32
  #CheckFunction_Edi = 64
  #CheckFunction_Ebp = 128
? Nur so eine Frage, ist aber wohl Geschmacksache, aber zumindest das Enumeration kannst du weglassen ;)

Verfasst: 28.04.2005 14:06
von ts-soft
>> ? Nur so eine Frage, ist aber wohl Geschmacksache, aber zumindest das Enumeration kannst du weglassen
Die Enumeration dient ja auch zusätzlich zur optischen Hervorhebung einer Konstantendeklaration. Finde ich also ganz gut. Das andere ist, wenn man keine Lust hat, alle Werte im Kopf zu verdoppeln Bild oder eine Geschmacksfrage

Verfasst: 30.04.2005 02:48
von Deeem2031
@freedimension:

Wie ts-soft schon sagte: Dem Compiler ist es egal, aber es ist übersichtlicher.

Version 1.02:

Neu:
-ResetCPUFlags() und ResetCPURegister()
-die CheckResult-Structure und die Flags sind nun in einer .res vereint

Und da es mit der Resident schon zwei Dateien sind und die ich sowieso als Archiv hochladen musste, hab ich auch gleich einen BeispielCode, eine Readme, den Resident-SourceCode, den Asm-SourceCode und die Library-desc Datei dazugepackt.

Neuer Link: http://www.deeem2031.de/CheckFunction.zip