Autor Beitrag
TomT
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 116

Suse 9.1 WinXP
D6 Pers
BeitragVerfasst: Sa 10.05.03 23:38 
Hi,

weiss jemand vielleicht, wie ich in Konsolenanwendungen Interrupts benutzen kann?

z.B:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure Modus13H;
begin
  asm
   mov ax, 13h
   int 10h
  end;
end;

Aufgrund der System- und Treiberarchitektur lässt Windows soweit ich weiss nur Treiber Interrupts auslösen, gibt es eine Möglichkeit, das zu umgehen?

Im vorraus vielen Dank!

MFG TomT

_________________
...und da wurde mir klar, dass eine Toolbar keine Kneipe für Heimwerker ist.
Gast
Gast
Erhaltene Danke: 1



BeitragVerfasst: Di 29.07.03 00:03 
Vielleicht indem du eine DOS-Konsolenanwendung schreibst?

Sagt dir der Begriff Protected Mode was? Protected heisst "geschuetzt" ... deswegen sollte man solche Eskapaden tunlichst vermeiden.

Wir reden doch hoffentlich von Windows?

Mit DeviceIoControl kannste sowohl unter Win9x als auch WinNT (Rechte!) was machen.
Dib2804
Hält's aus hier
Beiträge: 2


D5 , Kylix 2
BeitragVerfasst: Fr 01.08.03 14:44 
Hi

Also ein paar BIOS Interrupte wie man sie früher so schön in asm benutzen konnte können unter Windows mit Hilfe eines Virtuellen Device Drivers (VxD) abgefragt werden.

Dafür gibt es in der Windows Api einen DeviceIoControl aufruf. Leider kenn ich mich nicht genau damit aus aber wenn man z.b den Interrupt 13 ansprechen will würde das z.b so gehen :

Hier ein Beispiel um Floppy Informationen abzurufen über den Interrupt 13 :

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
function FloppyDriveSize (Drive : char) : TDriveType;
 type
   PDIOC_REG = ^TDIOC_Registers;
   TDIOC_Registers = record
     Reg_EBX, Reg_EDX, Reg_ECX, Reg_EAX, 
     Reg_EDI, Reg_ESI, Reg_Flags : DWORD
   end;
 const
   VWIN32_DIOC_DOS_INT13 = 4;
 var
   H : THandle;
   R : TDIOC_Registers;
   C : DWORD;
 begin
   Result := dtFloppy;
   H := CreateFile ('\\.\VWIN32'00nil000);
   if H <> INVALID_HANDLE_VALUE then
   try
     R.Reg_EAX := $800;                    
     R.Reg_EDX := ord (upcase(Drive)) - Ord('A');  
     if DeviceIOControl (H, VWIN32_DIOC_DOS_INT13, @R, 
          SizeOf (R), @R, SizeOf (R), C, niland 
          (R.Reg_Flags and 1 = 0then  
       if R.Reg_EBX and $FF < 3 then       
          Result := dtFloppy5
       else
          Result := dtFloppy3
   finally
     CloseHandle (H)
   end
 end;


Hier wird der Interrupt 13 Service 8 aufgerufen.

MFG
Daniel