Page 1 of 1

VESA VBE always failed

Posted: Mon Oct 10, 2011 1:27 am
by 0x3D5
I am trying to use the int 0x10(VIDEO BIOS) but it always returns al != 0x4f(VBE Function failed). This is the code that I write in a driver:

Code: Select all

USHORT GetVbeMode()  

{  

__asm  

{  

cli  

mov eax,cr0  

mov Cr0Reg,eax  

and eax,0xffffffff  

mov cr0,eax  

 

mov eax,0x4F03      ;VESA VBE Function  

  

INT 0x10            ;VIDEO BIOS  

   

cmp al,0x4F  

jnz falhou          ;always al != 4f  



mov Resultado,bx  

mov eax,Cr0Reg  

mov cr0,eax  

sti  

jmp final  

   

falhou  

mov Resultado,0  

mov eax,Cr0Reg  

mov cr0,eax  

sti  

jmp final  

   

final:  

}  

return Resultado;  

} 
What is wrong at this code that I write???

Re: VESA VBE always failed

Posted: Mon Oct 10, 2011 1:46 am
by Combuster

Code: Select all

mov eax,cr0 
mov Cr0Reg,eax 
and eax,0xffffffff 
mov cr0,eax
(...)
mov eax,Cr0Reg 
mov cr0,eax 
nop
nop
nop
nop
:roll:

Re: VESA VBE always failed

Posted: Mon Oct 10, 2011 1:46 am
by gerryg400

Code: Select all

mov eax,cr0  
mov Cr0Reg,eax  
and eax,0xffffffff  
mov cr0,eax  
What is this supposed to do ? Are you trying to get from 32bit protected mode to real mode ? That's not how to do it.

Even if you fix the obvious bug in your code, it still won't do what you want it to do.

Re: VESA VBE always failed

Posted: Mon Oct 10, 2011 2:00 am
by 0x3D5
I am trying to switch to real mode to call the INT 0x10

Re: VESA VBE always failed

Posted: Mon Oct 10, 2011 2:07 am
by gerryg400
0x3D5 wrote:I am trying to switch to real mode to call the INT 0x10
Switching to real mode requires a lot more than simply changing a bit in CR0. (and your code does not modify CR0). You need to restore the entire real mode environment that the BIOS expects. You need to reverse all the operations that you performed to go from real mode to protected mode.