ProtectedMode & WinXP & NTVDM

Тема в разделе "WASM.ASSEMBLER", создана пользователем trurl, 5 июл 2005.

  1. trurl

    trurl New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2005
    Сообщения:
    7
    Адрес:
    Ukraine
    Возможно ли перейти в pm в WinXP под NTVDM? Я пытался (из config.nt выгрузив himem, других дров для расширения памяти там нет, хотя это думаю тут непричем), но у меня TDebugger вылетает на комманде lgdt... Мне кажется, что это не из-за ошибки в коде, а защита от перехода в pm. Если же это не так, то почему может вылетать дебагер? Если это так, то есть ли какой-то дебагер, который мне подойдет (сможет "перейти" в pm)? И если таковых нет, то решит ли эту проблему VirtualPC?
     
  2. ProgramMan

    ProgramMan New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2004
    Сообщения:
    263
    Из под NTVDM нельзя выйти в PM. Используй специальные виртуальные машины, например VMW, VirtualPC, Bochs.
     
  3. Nothing

    Nothing New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2003
    Сообщения:
    139
    Адрес:
    Russia
    В pm перейти можно. Например, так делают DPMI-extender'ы прямо из под NTVDM. Только это делается не через lgdt и т.п. а через специальный системный вызов, и естественно переход происходит на 3-е кольцо... Только вот зачем все это? Зачем переходить в pm из под vdm?
     
  4. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    631
    Адрес:
    Russia
    Код (Text):
    1.  
    2. ; V86 -> RING0
    3.  
    4. ; this program should be executed under Win95/98
    5. ; developed under win98
    6.  
    7. ; 1. start in V86, exec int3
    8. ; 2. go to PROT16/RING3 using DPMI, exec int3
    9. ; 3. go to PROT32/RING0 using DPMI/IDT hack, exec int3
    10. ; 4. back to DOS
    11.  
    12. ; © Z0MBiE/29A -- March 22, 1999
    13.  
    14. model tiny
    15. p386
    16. locals __
    17. jumps
    18. codeseg
    19.  
    20. org 100h
    21. start:
    22.  
    23. mov ax, 1600h ; windows running?
    24. int 2fh
    25. cmp al, 4 ; win95/98 ?
    26. jne __exit
    27.  
    28. int 3 ; V86
    29.  
    30. lea sp, endofstack ; set own stack
    31.  
    32. mov ah, 4ah ; resize our memory block
    33. mov bx, memory
    34. int 21h
    35.  
    36. mov ax, 1687h ; DPMI - installation check
    37. int 2fh
    38. or ax, ax
    39. jnz __exit
    40. ; ES:DI = DPMI mode-switch entry point
    41. ; SI=memory(in par.) needed for DPMI private data
    42.  
    43. push es ; init DPMI initproc
    44. push di
    45. pop dpmicall
    46.  
    47. mov ah, 48h ; allocate memory
    48. mov bx, si ; for DPMI private data
    49. int 21h
    50. jc __exit
    51. mov es, ax
    52.  
    53. xor ax, ax ; flags: bit0=0 -> 16-bit program
    54. call dpmicall
    55. jc __exit
    56. ; now in protected mode (16-bit, ring3)
    57.  
    58. int 3 ; PROT16/R3
    59.  
    60. sidt idtr ; read IDTR
    61.  
    62. mov ax, 6 ; save (get&push) ES.base
    63. mov bx, es
    64. int 31h
    65. push cx
    66. push dx
    67.  
    68. mov ax, 7 ; set ES.base
    69. mov bx, es
    70. push idtr_base ; CX:DX=newnase=IDTR.base
    71. pop dx
    72. pop cx
    73. int 31h
    74.  
    75. ; by default ES points to PSP and ES.limit is 0FFh,
    76. ; so we can increase it a little w/o problems
    77.  
    78. ; DPMI host is big madaf**ka, it dont allows you to set selectorlimit >= 2GB
    79.  
    80. mov ax, 8 ; set ES.limit
    81. mov bx, es
    82. mov cx, 0 ; CX:DX=newlimit=maxIDTlimit
    83. mov dx, 256*8-1
    84. int 31h
    85.  
    86. mov ax, 0006h ; get CS.base into CX:DX
    87. mov bx, cs
    88. int 31h
    89.  
    90. add dx, offset __ring0 ;calc lin. addr of __ring0
    91. adc cx, 0 ; [BUGFIX] was: dx
    92. push cx
    93. push dx
    94. pop ebp
    95.  
    96. xchg bp, es:[0] ; INT00 <--> __ring0
    97. rol ebp, 16
    98. xchg bp, es:[6]
    99.  
    100. xor dx, dx
    101. xor cx, cx
    102. div cx ; call INT 00
    103.  
    104. xchg bp, es:[6] ; INT00 <--> __ring0
    105. rol ebp, 16
    106. xchg bp, es:[0]
    107.  
    108. mov ax, 7 ; restore(pop&set) ES.base
    109. mov bx, es
    110. pop dx
    111. pop cx
    112. int 31h
    113.  
    114. __exit: mov ax, 4c00h ; exit
    115. int 21h
    116.  
    117. __ring0: int 3 ; PROT32/R0
    118.  
    119. inc cx ; inc ecx (!)
    120. iret
    121.  
    122. ; ---------------------------------------------------------------------- --  ---
    123.  
    124. dpmicall dd ?
    125.  
    126. idtr label fword
    127. idtr_limit dw ?
    128. idtr_base dd ?
    129.  
    130. even
    131. db 1024 dup (?)
    132. endofstack:
    133.  
    134. memory equ ($-start+256+15)/16
    135.  
    136. end start
    137.  




    ..это не настоящий ring0. любая запись в сегментные

    регистры вызывает gpf. см. топик в разделе "вирология".

    сорри за оффтоп, ваш разговор шел не о win9x :|
     
  5. trurl

    trurl New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2005
    Сообщения:
    7
    Адрес:
    Ukraine
    В pm перехожу, чтобы получить доступ к памяти больше, чем 1 мб и сегментам большим 64 кб. Еще, если не ошибаюсь, это можно сделать с помощью himemов? (Но этот вариант не подходит, поскольку задача стоит совсем в другом...).



    2edge Это перейдет в з. р.?



    2ProgramMan а есть где-то кряк к VMW (я искал, но они не подошли... билд вроде совпадал). VPC не подходит :), оно глючное



    Еще по-этому поводу: мне в принципе pm не нужен, т.е. вполне подойдет компилятор (TC, например), который сможет откомпилить программу под pm DOS? Или такого добра нет?
     
  6. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759




    Про ТС не помню, но вот для паскаля в свое время была хорошая поддержка dos protmode, как от борланд, так и от сторонних разработчиков. Из сишек сразу на ум приходит только watcom/dos4gw.

    Можно ещё какой-нить DOS-extender попробовать. Им для счастья, как правило, достаточно поддержки DPMI.



    Но ntvdm на самом деле всего лишь "для галочки" сделан. Нормальной поддержки DOS программ, в том числе под протмоду, в нт нету...
     
  7. ProgramMan

    ProgramMan New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2004
    Сообщения:
    263
    trurl, если собираешьсяч эксперементировать с небольшим кодом(не windows :)), то лучьше юзай Bochs.

    К VMW 4.* есть серийники
     
  8. trurl

    trurl New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2005
    Сообщения:
    7
    Адрес:
    Ukraine
    2ProgramMan

    А там только серийник надо, а то у меня под 5ый был генератор, но оно потом выдавало, мол надо в сети зарегистрироваться...

    Если только серийник, то можешь скинуть, пожалуйста.



    Насколько я понял, в С++ прога для pm будет отличаться от rm только ключем при компиляции?