RtlMoveMemory auf Win7/mit Blitz+ nicht benutzbar?

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Xaymar

ehemals "Cgamer"

Betreff: RtlMoveMemory auf Win7/mit Blitz+ nicht benutzbar?

BeitragSa, März 13, 2010 20:01
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
;TEST
Graphics 800, 600,32,2
SetBuffer BackBuffer()

Gbank = CreateBank(800*600*LockedFormat()):ClsColor 51,51,51
While Not KeyHit(1)
Cls

msec = MilliSecs()
LockBuffer
msec1 = MilliSecs()
CopyBufferToBank(GBank)
msec1 = MilliSecs()-msec1

SX = SX + 5
If SX >= 512
SY = SY + 5
SX = 0
EndIf
If SY >= 512
SY = 0
EndIf
For Y = 0 To 128
For X = 0 To 128
Pos = (SY * 1024*4) + (Y * 1024*4) + (SX * 4) + (X * 4)
PokeByte GBank, Pos, X * Y
PokeByte GBank, Pos+1, SX * X * Y
PokeByte GBank, Pos+2, SY * X * Y
PokeByte GBank, Pos+3, SX * SY + X * Y
Next
Next
msec2 = MilliSecs()
CopyBankToBuffer(GBank)
msec2 = MilliSecs()-msec2
UnlockBuffer
msec = MilliSecs()-msec

CopyRectToBank(20, 20, 100, 100, GBank, BackBuffer())

Text 0,0, msec
Text 0,15, msec1
Text 0,30, msec2
Text 0,45, SX
Text 0,60, SY
Flip 0
Wend
End

;ENDTEST
Function LockedFormat(buffer = 0)
Local bnkFormat, format

If buffer = 0 Then buffer = GraphicsBuffer()
bnkFormat = CreateBank(4)
apiRtlMoveMemory bnkFormat, buffer+104, 4
format = PeekInt(bnkFormat, 0)
FreeBank bnkFormat

Return format
End Function

Function LockedPitch(buffer = 0)
Local bnkPitch, pitch

If buffer=0 Then buffer = GraphicsBuffer()
bnkPitch = CreateBank(12)
apiRtlMoveMemory bnkPitch, buffer+92, 12
pitch = PeekInt(bnkPitch, 0)*PeekInt(bnkPitch, 8)/8
FreeBank bnkPitch

Return pitch
End Function

Function BufferWidth(buffer = 0)
Local bnkWidth, width

If buffer = 0 Then Return GraphicsWidth()
bnkWidth = CreateBank(4)
apiRtlMoveMemory bnkWidth, buffer+92, 4
width = PeekInt(bnkWidth, 0)
FreeBank bnkWidth

Return width
End Function

Function BufferHeight(buffer = 0)
Local bnkHeight, height

If buffer = 0 Then Return GraphicsHeight()
bnkHeight = CreateBank(4)
apiRtlMoveMemory bnkHeight, buffer+96, 4
height = PeekInt(bnkHeight, 0)
FreeBank bnkHeight

Return height
End Function

Function CopyRectToBank(X, Y, W, H, bank, buffer = 0)
Local bnkInfo, size

If buffer=0 Then buffer = GraphicsBuffer()
bnkInfo = CreateBank(32)
apiRtlMoveMemory bnkInfo, buffer+72, 32
size = W*H*PeekInt(bnkInfo, 28)/8

End Function

Function CopyBufferToBank(bank, buffer = 0)
Local bnkInfo, size

If buffer=0 Then buffer = GraphicsBuffer()
bnkInfo = CreateBank(32)
apiRtlMoveMemory bnkInfo, buffer+72, 32
size = PeekInt(bnkInfo, 20)*PeekInt(bnkInfo, 24)*PeekInt(bnkInfo, 28)/8

If BankSize(bank)<size Or PeekInt(bnkInfo, 0)=0 Then
FreeBank bnkInfo
Return False
Else
apiRtlMoveMemory bank, PeekInt(bnkInfo, 0), size
FreeBank bnkInfo
Return True
EndIf
End Function

Function CopyBankToBuffer(bank, buffer = 0)
Local bnkInfo, size

If buffer=0 Then buffer = GraphicsBuffer()
bnkInfo = CreateBank(32)
apiRtlMoveMemory bnkInfo, buffer+72, 32
size = PeekInt(bnkInfo, 20)*PeekInt(bnkInfo, 24)*PeekInt(bnkInfo, 28)/8

If BankSize(bank)<size Or PeekInt(bnkInfo, 0)=0 Then
FreeBank bnkInfo
Return False
Else
apiRtlMoveMemory2 PeekInt(bnkInfo, 0), bank, size
FreeBank bnkInfo
Return True
EndIf
End Function


Dieser Code führte bei mir gerade auf Win7 mit Blitz3D und Blitz+ zu einem totalen crash(BlueScreen)

virtual WinXP mit B3D:
user posted image
virtual WinXP mit B+:
user posted image

Win7 mit B3D( ganze 7 sekunden lang hats gelaufen, reichte um nen screenshot zu machen)
user posted image
Win7 mit B+:
Hat den kompletten PC lahmgelegt. Absolut alles war nicht mehr richtig funktionstüchtig.


Mache ich evtl etwas falsch oder ist das nun Betriebssystem bedingt?

(Decls:Code: [AUSKLAPPEN]
.lib "kernel32.dll"
apiRtlMoveMemory(Destination*,Source,Length):"RtlMoveMemory"
apiRtlMoveMemory2(Destination,Source*,Length):"RtlMoveMemory"
)
Warbseite

Noobody

BeitragSa, März 13, 2010 20:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich verstehe die Frage nicht ganz. Du hast vier Tests mit verschiedenen Kombinationen von XP/Win7/B3D/B+ gemacht und das Programm hat in keiner Konstellation funktioniert und bei Gelegenheit auch noch das System abgeschossen - wie kann das nicht am Programm liegen?
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Abrexxes

BeitragSa, März 13, 2010 20:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, du machst nichts falsch. Aber eine "virtuelle" Umgebung ist nun mal keine "echte" und wird auch mit der besten VM der Welt keine "Echte" werden. Gerade direkte Eingriffe auf den Arbeitsspeicher werden immer ein Problem der VMs bleiben.

In diesem Fall greifst du mehr als wahrscheinlich auf einen virtuellen Speicher zurück der aber auf dem Host selbst (Hardware) ganz andere Adressen hat, da kann nur Schrott raus kommen. Aus diesem Grund wird der Speicher auch normalerweise vom OS gemanagt und nicht vom User. Grund für deinen Fehler ist das VM Ihren virtuellen Ram "gemanagt" an das WirtsOS mitteilen, dieses verteilt dann die Adressen. Wenn du nun mittels Systemroutinen auf den Ram eingreifst kann dieses virtuelle System schlecht ahnen wo gerade die "richtigen" Adresses sind. Daher wird auch kein LOW LEVEL Prog in absehbarer Zeit auf virtuellen Maschinen vernünftig laufen, nur höhere APIs. Wink

cu

Xaymar

ehemals "Cgamer"

BeitragSa, März 13, 2010 20:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Das erklärt das mit B+ auf dem virtuellen xp, aber nicht auf win7.

Edit: @Noobody: der Code lief ja mal. zumindest laut archivlog.
Warbseite

Silver_Knee

BeitragSa, März 13, 2010 21:22
Antworten mit Zitat
Benutzer-Profile anzeigen
800*600*LockedFormat()
wäre mit B+ mitteln zumindest total daneben. Da gibt ja LockedFormat andere werte zurück

Xaymar

ehemals "Cgamer"

BeitragSa, März 13, 2010 21:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Die interne Funktion wird durch die im code stehende ersetzt Smile
Warbseite

Silver_Knee

BeitragSa, März 13, 2010 21:54
Antworten mit Zitat
Benutzer-Profile anzeigen
ja aber schaut mal da sind Linien die schräg sind. Das passiert wenn man vertikale Linien mit einer falschen Breite anzeigt. Was die gezeigte Funktion zurückgibt ist ja nicht gleich ersichtlich.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group