Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужен проимер кода для DPMI 
:(
    Опции темы
fenist
Дата 9.3.2004, 18:05 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Была когдато такая штука DPMI(она и сейчас есть, но уже не актуальна) и вот очень хочеца мне в ней разобратьцца
Нуже пример как под DPMI взять кусок памяти, почитать из него и положть на место.
Есть кусок кода - пример
---------------
mov ax,0 ;Funktion 0
mov cx,1 ;Allocate 1 Descriptor
int 31h
mov MemDesk,AX
mov ax,0501h ;Allocate Memory
mov cx,0
mov bx,1 ;010000h Bytes of Memory
int 31h ;DPMI CALL
jc TooLessMemory
mov AX,0007h ;Function 7:Set Basis Address
mov BX,MemDesk
mov dx,cx ;Low Part of Linear Address
mov cx,bx ;upper Part of Linear Address
int 31h ;DPMI CALL
mov BX,MemDesk
mov ax,0008h ;Function 8:Set Limit of descriptor
mov cx,0ffffh
mov dx,0
int 31h ;set Limit
mov BX,MemDesk
mov fs,BX ; FS selector to 64K XMS Memory Location!
---------------
ok взяли мы эти 64 кила, но при попытке что-либо прочесть/записать - програма вылетает - с громкой руганью на страницы памяти. Проверял под разными дос расширителями, и подразными виндами (98,200,ХР) результат - GP Может быть дело в уровнях привелегий? По умолчанию создается дескриптор для Ring 0, а прочесть пытаюсь с 3-го?
Проверял код:
WASM: Pmode, Dos4GW, DOS32, wdosX...
TASM: Анологично
FASM: win

Дайте кто нибудь рабочий пример под DPMI!!! А лучше на мыло киньте - [email protected]

SAR:ALU FENIST

  Вверх
Chingachguk
Дата 9.3.2004, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Я как-то баловался с этой штукой - не знаю, поможет тебе это или нет:

Цитата

.386
NewProgramSize equ 5000h        ; New Program Size = ~20 KBytes
NewStackOfs    equ NewProgramSize - 0002h
PSPSize        equ 100h
NewCodeSize    equ 1000h        ; New code size exept PSP
V86StackSize  equ 200h
NewPrgStruc    struc            ; New program MAP
PSP            db PSPSize dup(?); Old and new PSP
OurCode        db (NewCodeSize-PSPSize) dup(?)
V86Stack      db V86StackSize dup(?) ; For call v86 interrupt
DPMIArea      db ?            ; Segment for DPMI jump structure
NewPrgStruc    ends            ; New program MAP - end
CallDPMIStruc struc
RegEDI  dd ?
RegESI  dd ?
RegEBP  dd ?
Rezer  dd ?
RegEBX  dd ?
RegEDX  dd ?
RegECX  dd ?
RegEAX  dd ?
flags  dw ?
RegES  dw ?
RegDS  dw ?
RegFS  dw ?
RegGS  dw ?
RegIP  dw ?
RegCS  dw ?
RegSP  dw ?
RegSS  dw ?
CallDPMIStruc ends
text segment byte public use16
assume cs:text,ds:text
org 100h
begin:  mov  sp,NewStackOfs    ; Set new stack
        mov  bx,NewProgramSize shr 4
        mov  ah,4ah
        int  21h                ; Set new program size
        jnc  @MemFree
        call @Error
        jmp  @GoDos
@MemFree:
;-----------------------------------------------------------------------------
;INT 2F - DOS Protected-Mode Interface - INSTALLATION CHECK
; AX = 1687h
;Return: AX = 0000h if installed
;    BX = flags
;  bit 0: 32-bit programs supported
;    CL = processor type (02h=80286, 03h=80386, 04h=80486)
;    DH = DPMI major version
;    DL = two-digit DPMI minor version (binary)
;    SI = number of paragraphs of DOS extender private data
;    ES:DI -> DPMI mode-switch entry point (see #2001)
; AX nonzero if not installed
;SeeAlso: AX=1686h,AX=43E0h,AX=DE01h/BX=4450h,AX=FB42h/BX=0001h
;SeeAlso: INT 31/AX=0400h,INT 31/AX=5702h,INT D4/AH=10h
;
;(Table 2001)
;Call DPMI mode switch entry point with:
; AX = flags
;    bit 0: set if 32-bit program
; ES = real mode segment of buffer for DPMI private data (ignored if
;  SI was zero)
;Return: CF set on error
;    program still in real mode
;    AX = error code (DPMI 1.0+)
;        8011h unable to allocate all necessary descriptors
;        8021h 32-bit program specified, but 16-bit DPMI host
; CF clear if successful
;    CS = 16-bit selector corresponding to real-mode CS
;    SS = selector corresponding to real-mode SS (64K limit)
;    DS = selector corresponding to real-mode DS (64K limit)
;    ES = selector to program's PSP (100h byte limit)
;    FS = GS = 0
;    high word of ESP = 0 if 32-bit program
;    program now in protected mode
;Note: this entry point is only called for the initial switch to protected
;  mode
        mov  ax,1687h
        int  2fh
        test ax,ax
        jz  @DPMIOK
        mov  dx,offset NoDPMI
        call Message
        jmp  @GoDos
@DPMIOk:
        call DPMI_Info
        call Swith_Protected
@GoDos: mov  ax,4c00h
        int  21h
DPMI_Info proc near
        mov  word ptr ds:DPMIEntry,di
        mov  word ptr ds:DPMIEntry+2,es
        mov  ax,es
        push ds
        pop  es
        push di
        mov  di,offset EntPo + 17
        call HexChar
        pop  ax
        mov  di,offset EntPo + 22
        call HexChar
        mov  ax,dx
        mov  di,offset DPMIVer + 39
        call HexChar
        mov  dx,offset DPMIVer
        call Message
        xor  ch,ch
        sub  cl,2
        shl  cl,1
        mov  di,cx
        mov  dx,ProcOfs[di]
        call Message
        mov  dx,offset Bit32
        test bl,1
        jnz  @32Ok
        mov  byte ptr Bit32+28,'N'
@32Ok:  call Message
        mov  dx,offset EntPo
        call Message
        retn
DPMI_Info endp
Swith_Protected proc near
; Swith to Protected Mode
        call DPMICall_Ini
        mov  ax,cs
        add  ax,(DPMIArea shr 4) ; Segment for DPMI jump structure
        mov  es,ax
        mov  ax,0000h
        mov  bx,0000h
        call dword ptr DPMIEntry
        jnc  @InPro
        mov  dx,offset SwError
        call Message
        retn
@InPro: mov  dx,offset InProt
        call Message
;@Stop:  in  al,60h
;        cmp  al,57
;        jnz  @Stop

;INT 31 P - DPMI 0.9+ - SET SEGMENT LIMIT
; AX = 0008h
; BX = selector
; CX:DX = segment limit
;Return: CF clear if successful
; CF set on error
;    AX = error code (DPMI 1.0+) (8021h,8022h,8025h) (see #2398)
;Notes: CX must be zero for 16-bit DPMI implementations
; limits greater than 1MB must be page aligned (low 12 bits set)
; only modify descriptors allocated with INT 31/AX=0000h
; DPMI 1.0+ automatically reloads any segment registers containing the
;  selector being modified
; not supported by MS Windows 3.0 in Standard mode

        mov  ax,0008h
        mov  bx,es
        xor  cx,cx
        mov  dx,1000h
        int  31h            ; Set new limit
        jnc  @NewLimit
        mov  dx,offset LimError
        call Message
        jmp  @ToRealMode
@NewLimit:
        mov  al,es:[101h]    ; Exeption ! If not new limit set...

; mov  si,offset TestCMD
; int  2eh

        mov  bl,2eh  ; Call int 2eh
        mov  word ptr CallDPMIS.RegESI,offset TestCMD
        lahf
        and  ah,0feh
        mov  bh,ah
        mov  cx,0
        mov  di,offset CallDPMIS
        and  edi,0ffffh
        push ds
        pop  es
        mov  ax,0300h
        int  31h
        jnc  @CallV86_OK
        mov  dx,offset CallV86Error
        call Message
        jmp  @ToRealMode
@CallV86_OK:

;INT 31 P - DPMI 0.9+ - SIMULATE REAL MODE INTERRUPT
; AX = 0300h
; BL = interrupt number
; BH = flags
;    bit 0: reset the interrupt controller and A20 line (DPMI 0.9)
;      reserved, must be 0 (DPMI 1.0+)
;    others: reserved, must be 0
; CX = number of words to copy from protected mode to real mode stack
; ES:(E)DI = selector:offset of real mode call structure (see #2403)
;Return: CF clear if successful
;    real mode call structure modified (all fields except SS:SP, CS:IP
;      filled with return values from real mode interrupt)
; CF set on error
;    AX = error code (DPMI 1.0+) (8012h,8013h,8014h,8021h)(see #2398)
; protected mode stack unchanged
        mov  bl,16h  ; Call int 16h
        mov  byte ptr CallDPMIS.RegEAX+1,0 ; reg ah=0h
        lahf
        and  ah,0feh
        mov  bh,ah
        mov  cx,0
        mov  di,offset CallDPMIS
        and  edi,0ffffh
        push ds
        pop  es
        mov  ax,0300h
        int  31h
        jnc  @CallV86
        mov  dx,offset CallV86Error
        call Message
        jmp  @ToRealMode
@CallV86:
; Goto real mode
@ToRealMode:
        mov  ax,4c00h
        int  21h            ; Goto real mode ?!
        retn
Swith_Protected endp
DPMICall_Ini proc near
        mov  bx,offset CallDPMIS
        mov  [bx].RegEDI,edi
        mov  [bx].RegESI,esi
        mov  [bx].RegEBP,ebp
        mov  [bx].Rezer,0
        mov  [bx].RegEBX,ebx
        mov  [bx].RegEDX,edx
        mov  [bx].RegECX,ecx
        mov  [bx].RegEAX,eax
        lahf
        shr  ax,8
        mov  [bx].flags,ax
        mov  [bx].RegES,es
        mov  [bx].RegDS,ds
        mov  [bx].RegFS,fs
        mov  [bx].RegGS,gs
        call $+3
        pop  ax
        mov  [bx].RegIP,ax
        mov  [bx].RegCS,cs
        mov  [bx].RegSP,NewPrgStruc.V86Stack+V86StackSize-2
        mov  [bx].RegSS,ss
        retn
DPMICall_Ini endp
@Error: mov  dx,offset ErrorMess
        call Message
        retn
Message proc near
        mov  ah,09h
int  21h
retn
Message endp
PutKeys proc near
        cld
@Key:  lodsw
        test ax,ax
        jnz  @NoEndKey
        retn
@NoEndKey:
        mov  cx,ax
        call PutKey
        jmp  short @Key
PutKeys endp
PutKey proc near
        mov  ah,05h
        int  16h
        retn
PutKey endp
HexChar proc near
        pusha
        mov  cx,4
        mov  bx,offset TabHex
@GetHex:rol  ax,4
        push ax
        and  al,0fh
        xlat
        stosb
        pop  ax
        loop @GetHex
        popa
        retn
TabHex  db '0123456789abcdef'
HexChar endp
DecChar proc near
        pusha
        mov  cx,5
        mov  bx,10000
@GetDec:
        xor  dx,dx
        div  bx
        add  al,'0'
        stosb
        push dx
        xor  dx,dx
        mov  ax,bx
        mov  bx,10
        div  bx
        mov  bx,ax
        pop  ax
        loop @GetDec
        popa
        retn
DecChar endp
ErrorMess    db 'Error !',13,10,'$'
NoDPMI      db 'DPMI isn"t present !!!',13,10,'$'
DPMIVer      db 'major version of DPMI spec supported = 0000',13,10,'$'
ProcOfs      dw offset Proc286,offset Proc386,offset Proc486
Proc286      db 'Current processor is 80286',13,10,'$'
Proc386      db 'Current processor is 80386',13,10,'$'
Proc486      db 'Current processor is 80486',13,10,'$'
Bit32        db 'Supported 32-bits programs: Y',13,10,'$'
EntPo        db 'DPMI entry point 0000:0000',13,10,'$'
SwError      db 'Error at switched to PM !!!',13,10,'$'
InProt      db 'We are in Protected Mode ! Press any key...',13,10,'$'
LimError    db 'Error at change selector limit !!!',13,10,'$'
CallV86Error db 'Error at call V86 Interrupt !!!',13,10,'$'

TestFile    db 'test.log',0
TestCMD      db 8,'test.bat',0dh 

DPMIEntry  dd ?
CallDPMIS CallDPMIStruc <>
;Offset Size Description (Table 2403)
text ends
end begin



--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
oleg1973
Дата 12.3.2004, 04:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 7
Всего: 34



только оно под ХР работать не будет smile.gif


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0451 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.