ich bin heute auf etwas merkwürdiges Gestoßen. Es geht um Interrupts in Inline Assembler. Folgender Code mit einer Zugriffsverletzung beendet. Ist es möglich das gar keine Interrupts in Inline Assembler unterstützt werden oder ich habe ich einen Fehler gemacht?
Code:
void MoveMouse()
{
_asm
{
mov ah, 0x04;
mov cx, 500; // X
mov dx, 1000; // Y
int 0x33; //das scheint nicht zu gehen
}
}
In Inline ASM gehen natürlich alle Befehle genau so, als würde man sie direkt mit einem Assembler assemblieren, aber was ich mich gerade frage:
Was macht der Interrupt? Ist er überhaupt vom System zugelassen? Soweit ich weiß, gibt es einige, die das System nicht zulässt.
Oder wird einer der Werte, die du angegeben hast, als Speicheradresse verwendet?
Interrupt 0x33 ist ein Interrupt das vom BIOS bereitgestellt wird. Es ist eigentlich nur für Realmode Betriebssysteme gedacht und funktioniert nicht auf betriebssyteme die protectmode bzw bei X64 im Longmode laufen.
Die BIOS interrupt haben früher zusammen mit dem DOS interrupts unter den Betreibssystem DOS die Pogrammier API Dargestellt.
Unter Windows wirst du ein pogramm dass interrupts benutzt nur noch emuliert ausführen können.
Der NT-Kernel von Windows stellt nur noch einen Interrupt berreit undzwar den 0x2e dieser wird aber nur von der ntdll als verbindungsglied zwischen Usermode und Kernelmode benutzt. Wobei es mittlerweile andere verfahren gibt um aus dem Usermode mit dem kernel im kernelmode zu kommunizieren. wodurch auch dieser interrupt immer mehr verschwindet.
Interrupt 0x33 ist ein Interrupt das vom BIOS bereitgestellt wird. Es ist eigentlich nur für Realmode Betriebssysteme gedacht und funktioniert nicht auf betriebssyteme die protectmode bzw bei X64 im Longmode laufen.
Die BIOS interrupt haben früher zusammen mit dem DOS interrupts unter den Betreibssystem DOS die Pogrammier API Dargestellt.
Ja, davon habe ich auch schon gelesen, das der 0x33 Interrupt noch aus DOS Zeiten stammt. Ich werde es mal unter Win98 testen. Aber wenn ich weiß das Interrupts allgemein gehen wäre ich schon sehr erleichtert
Ja, davon habe ich auch schon gelesen, das der 0x21 Interrupt noch aus DOS Zeiten stammt. Ich werde es mal unter Win98 testen. Aber wenn ich weiß das Interrupts allgemein gehen wäre ich schon sehr erleichtert
Habe in meinen letzten post noch was hinzugefügt da ich nicht gesehn hab das du berreits zurückgeschrieben hast.
32Bit windows systeme haben einen Emulator der es erlaubt pogramme die den Interupt 0x21 benutzen auszuhfüren.
Ansonsten kannst du halt nur den Interrupt 0x2e benutzen. Damit kannst du aber schon ne menge machen da schliesslich die komplette Kernel32.dll auf diesen interrupt aufbaut. Allerdings wirst du keinerlei dokummentationen über die funktionen dieses Interrupts finden.
Ansonsten wen du umbedingt mit Interrupts arbeiten willst dan kannst du auch Linux nehmen. Der Linux kernel stellt nämlich alle seine funktionen als interrupt 0x80 berreit. Oder du nimmst das BS MenuetOs das stellt seine API auch nur als interrupt berreit.
Habe in meinen letzten post noch was hinzugefügt da ich nicht gesehn hab das du berreits zurückgeschrieben hast.
32Bit windows systeme haben einen Emulator der es erlaubt pogramme die den Interupt 0x21 benutzen auszuhfüren.
Ansonsten kannst du halt nur den Interrupt 0x2e benutzen. Damit kannst du aber schon ne menge machen da schliesslich die komplette Kernel32.dll auf diesen interrupt aufbaut. Allerdings wirst du keinerlei dokummentationen über die funktionen dieses Interrupts finden.
Ansonsten wen du umbedingt mit Interrupts arbeiten willst dan kannst du auch Linux nehmen. Der Linux kernel stellt nämlich alle seine funktionen als interrupt 0x80 berreit. Oder du nimmst das BS MenuetOs das stellt seine API auch nur als interrupt berreit.
Funktionieren die Calls in den Kernel nicht mittlerweile per SYSENTER?
Funktionieren die Calls in den Kernel nicht mittlerweile per SYSENTER?
Ja das wird immer öfters als Sysenter gemacht,das hatte ich aber auch angedeutet.
Quote:
Originally Posted by Akorn
Der NT-Kernel von Windows stellt nur noch einen Interrupt berreit undzwar den 0x2e dieser wird aber nur von der ntdll als verbindungsglied zwischen Usermode und Kernelmode benutzt. Wobei es mittlerweile andere verfahren gibt um aus dem Usermode mit dem kernel im kernelmode zu kommunizieren. wodurch auch dieser interrupt immer mehr verschwindet.
Nunja auf anderen Betriebssystemen gibt es ja noch Interrupts.
Und rein theoretisch kannst du auch kernel funktionen mittels Sysenter von deinem programm aus aufrufen, das ist aber weitaus schwieriger da nicht jede Cpu sysenter unterstützt und das benutzen von Sysenter sich auf Intel und Amd Cpu´s unterscheidet.
Warum schade? Gibt nunmal nun bessere Varianten.
Was haben die Interrupts, was andere Methoden nicht haben?
Ob du nun Ausgabefunktionen callst oder den Ausgabe-Interrupt auslöst, ist doch ziemlich egal. Und Sprünge in den Kernel passieren wie gesagt nun per SYSENTER.
Schreib doch dein eigenes Betriebssystem, dann kannst du die Interrupt-Table sogar selbst festlegen :P
Inline ASM 06/07/2010 - General Coding - 5 Replies Huhu was mich schon länger beschäftigt ist die Frage wieso inline assembler unbedingt vermieden werden sollte.
Es geht mir vorallem um windows tools/game hacks.
Wäre nett wenn mich jemand mit ein paar schönen begründungen erleuchten könnte.
[Inline Assembler] Wo liegt der Fehler? 04/11/2010 - General Coding - 8 Replies Hi, ich arbeite seit gestern mit Assembler (inline Assembler). Grundsachen wie Rechnen und einfache Schleifen kann ich schon, aber an diesem nicht sinnvollen Beispiel (das ich nur zum üben nehme :D) bekomme ich einen Zugriffsfehler. Warum?
function Test(x: integer): Integer; assembler;
asm
PUSH EAX;
MOV EAX, X; //Kopiere einen beliebigen Wert in EAX
MOV EDX, 30; //kopiere 30 in EDX
CMP EAX, 20; //WENN EAX = 20 DANN
JE @Start; //Springe zu Start
CDQ; //EAX auf...
[Request] Some help with Inline asm in C++ 09/08/2008 - CO2 Programming - 3 Replies I'm trying to read a "string" (not necessarily human readable characters) that may also contain 0x00's using an injected dll.
Is there a way to (efficiently) copy a string of a length that can be up to 400 bytes or so into a c++ variable?
I have a pointer to the memory location inside EDI.