_asm { mov eax,ebx add ecx,edx }
asm mov eax,ebx asm add ecx,edxEinen allgemeinen Standard gibt es hierfür nicht
IFDEF masm option casemap :none ENDIFKann ich das nicht als TASM-Nutzer weglassen?
nasm -f elf file.asm -o obj alink file.obj -oEXE file.exe
SendMessageA equ SendMessageA@16
?LoadBitmap
, LoadIcon
, CreateDialogParam
, usw.) oder automatisch mehrere Sprachen unterstützt werden sollen, ansonsten sind normale Datensegmente einfacher zu handhaben.RDTSC
und CMOVxx/FCMOVxx
können uneingeschränkt verwendet werden. Dies trifft auch auf MMX und 3DNow zu, da die MMX/3DNow-Register auf die FPU-Register abgebildet werden und deshalb vom Betriebssystem während eines Taskwechsels automatisch gesichert werden. Befehlssätze, die neue Register verwenden wie SSE und SSE2 benötigen jedoch Betriebssysteme, die auch diese Register sichern können. Aus diesem Grund läßt sich SSE und SSE2 nicht unter Windows95 und älteren NT-Versionen verwenden.VirtualProtect
sowie die Flags im PE-HeaderVirtualProtect
.code
-Section setzen.data
) oder zusätzlich alloziertem Speicher kopieren und dort ausführen.VirtualAllocEx
auf, so daß man diese Funktion ebenso für diesen Zweck verwenden kann. Allerdings bieten die in vielen Bibliotheken enthaltenen malloc()/new() - Funktionen zusätzlich noch den Vorteil, daß sie kleinere Speicherbereiche zuerst aus eigenem reserviertem Speicher verwenden und erst wenn dieser knapp wird auf das Betriebssystem zurückgreifen. Bei new() wird zudem noch der zugehörige Konstruktor aufgerufen.Query
, AddRef
und Release
werden natürlich mitgezählt).CreateWindow
?CreateWindowEx
aufruft und den zusätzlichen Parameter dabei auf 0 setzt.InitDialog
o.ä.SetDlgItemInt
, SendMessage
,...). Es gelten deshalb für die Fensterprozedur dieselben Regeln wie für rekursiv aufrufbare Funktionen; insbesondere müssen innerhalb der Fensterprozedur verwendete Variablen lokale Variablen (d.h. auf dem Stack) sein.DefWindowProc
die Funktion DefFrameProc
aufrufen. Fensterprozeduren für Unterfenster rufen stattdessen die DefMDIChildProc
auf.CreateDC
und DISPLAY als Gerätename.BitBlt
oder MaskBlt
wird es dann angezeigt.ChangeDisplaySettings
auf.KeyboardProc
, MouseProc
, SetWindowsHookEx
, UnhookWindowsHookEx
, usw.). Funktionsaufrufe in DLLs innerhalb eines Prozesses kann man abfangen, indem man die Sprungziele der DLL im Speicher durch die Adressen der eigenen Funktion ersetzt. Wenn das immer noch nicht genügt so kann man mit den Debugfunktionen arbeiten, benötigt dazu aber entsprechende Zugriffsrechte. Weitergehende Informationen befinden sich auf internals.comSIDT
-Instruktion. Allerdings heißt das noch lange nicht daß man auf die Tabelle zugreifen darf... Zudem sind die Interrupts für den Kernel reserviert und folglich vom verwendeten Betriebssystem abhängig.CheckSumMappedFile
, enthalten in imagehlp.dll.FlushInstructionCache()
nach selbstmodifizierendem Code benötigt?GetCommandLine
erhält man die gesamte Kommandozeile als Zeichenkette.FillConsoleOutputCharacter
. Wichtig: Im allgemeinen ist die Breite als auch die Höhe der Konsole (in Zeichen) nicht bekannt. In diesem Fall sollte man erst mal mittels GetConsoleScreenBufferInfo
Höhe und Breite der Konsole ermitteln und daraus die Anzahl benötigter Zeichen errechnen.printf
aus der MSVCRT.DLL:; Hello, World for the Windows Command Line ; Copyright 2007, Daryl Lee %include "win32n.inc" EXTERN exit IMPORT exit msvcrt.dll EXTERN printf IMPORT printf msvcrt.dll segment .data USE32 MsgContent db "Welcome to Windows Assembly Language Programming", 0 segment .code USE32 main: ..start: ; Display message push dword MsgContent call [printf] add esp, 4 ; clean up stack ; Exit with success code push 0 call [exit]
FindFirstFileA
, FindNextFileA
und FindClose
. Achtung: Einige Windows-Include-Dateien verwenden einen falschen Wert für die Konstante MAX_PATH
: Der richtige Wert beträgt 260.GetLastError
und FormatMessage
mciSendString
öffnet man das CDAUDIO-Gerät, setzt den Wert DOOR auf OPEN und schließt es danach mit CLOSE. Beispielcode gibt es vom Test DepartmentBeginUpdateResource
, UpdateResource
und EndUpdateResource
.