1. Assembler / Говнокод #11319

    +146

    1. 1
    huiX5uiPH5;;P5;@@5HH4XPPDXDPhuiX5fiTГ

    Было запощено в 11315, но, мне кажется, что этот ГК заслуживает отдельного топика.

    Когда-то давно пытался на ассемблере включить видеорежим 320x200x256 (13h) и порисовать. Но XP сменив режим потеряла управление. Помог только ребут. В тот день, матерясь на MS, я и решил написать эту строчку так, чтобы ее можно было вводить с помощью обычного блокнота на любой машине...

    Системные требования: Windows XP
    Текст набирается в кодировке CP1251. Файл должен иметь расширение COM.

    Запостил: bormand, 29 Июня 2012

    Комментарии (154) RSS

    • Аналог однострочника на Перле?
      И да, повторяющееся "hui" символизирует.
      Ответить
      • > Аналог однострочника на Перле?
        Да нет, довольно безобидный код. Перезагрузка помогает.

        > И да, повторяющееся "hui" символизирует.
        Ну надо было выбрать 2 произвольных байта, чтобы занулить регистр ax. Но так как первый байт push выглядит как h, остальные буквы пришли сами собой...
        Ответить
        • Теперь я знаю, что занулить ax в начале выполнения com-файла можно инструкцией pop ax, потому что DOS заботливо кладёт в стек два нулевых байта.
          Ответить
          • А мне моя версия зануления больше нравится.
            Ответить
            • Главное, запоминается просто: huiX5ui

              Забавно было бы сделать компилятор с какого-нибудь несложного ЯП в опкоды из диапазона ascii.
              Ответить
    • > Текст набирается в кодировке CP1251
      Как неуклюже! Есть же debug для этого

      наркоманская каптча как бы одобряет использование winword для ввода опкодов
      Ответить
      • Да согласен, через debug можно было бы тупо сассемблировать mov ax, 13h; int 10h да сохраниться. Но это слишком просто ;)
        Ответить
    • XP SP3, не работает из-под админа.
      Ответить
    • Апну код как заслуживающий внимания.

      С таким методом написания не нужно искать текстовое представление восьмеричной системы счисления. Код сразу готов к употреблению.

      В копилку: com2txt.
      Ответить
    • Полез искать, кто на ГК писал сразу в машинных кодах и... обнаружил код Борманда.
      Ответить
      • Не самый удачный код, не всё в ascii. Почему-то я тогда додумался только до передачи управления через ret (буква Г в конце).
        Ответить
        • Научись лучше писать на чистом ascii чтобы не было старше 127 и младше 32. Будет во-первых везде работать, во-вторых можно по самым древним сетям слать. Напишешь в таком духе змейку -- выкладывай
          Ответить
          • Дык вроде есть уже com2txt про который писал выше инканус.
            Ответить
          • З.Ы. Ну и навскидку там достаточно написать небольшой декодер base64 и генерить его кодом как в этом топике или в eicar'е. А дальше тупо payload в base64.
            Ответить
            • com2txt так и сделан: небольшой декодер base64 (не уверен, что именно base64; там может быть другой алфавит) плюс payload.
              Ответить
              • ах...
                http://lurkmore.to/Ююк
                Ответить
                • Сама программа UUDECODE для DOS была закодирована чем-то типа com2txt, так что сам декодер можно было безопасно передавать по древним сетям как текстовый файл.
                  Ответить
                  • Может быть, я не помню, а может быть и не знаю.

                    Но старый SMTP, и (кажется UUCP) и местами FIDO и многие другие сети пропускали нормально только 7-bit текст.

                    Буква Н в Фидо же. "Белосежка и семь гомов, я улетаю прямо в ебеса" итд
                    Ответить
                    • Фидо портил только заглавную русскую Н, потому что этот байт для чего-то использовался в сети (типа эскейпа).

                      Про чудовищную книгу о чудовищах закодированный декодер:
                      http://web.archive.org/web/20060104134716/www.kiarchive.ru/pub/msdos/convert/bin2text/uudecode.txt
                      Ответить
                      • Фрагмент UUDECODE.COM:

                        .COM.B&F=
                        %00%@@PZ-rm-rm-L#P_R^[email protected]!PY-!p-!`-!0P]=
                        X-b!P_WR^!5GG!5GG!5GG!5GG!5_RX-`K5pPP^15GG15GG15GG15GG-~!5Z#P^15Q_t#u!
                        COMT_is_copyright_Alex_Pruss.
                        RX3FcEE<Zt+=
                        t"-AA
                        Good-dayR^!5P^15Gu'Hi,Howdy??BJtKM
                        MPOAHAHFNIOHDGALMDJLAOOCCPOKFHJDLIHPPFHFMKMDBCEHFDMCCCCHHPMDAEDHDP
                        KIAOMKMCCCANMNANANANMNANANKKMKMCCCANMNANANANMNANANKKMKMCCCANMNANAN
                        ANMNANANKKLOLMILPPMENMBCHFOLJDCAJLACAADPEKPFPPHOLIPMOFLCOMBEBNJOPL
                        AABADPFKILAABAAFDDAMLIINLIIMLIANLIAPLIIPLIIODMZ
                        S&$ig(Apuu0000000490<


                        Дальше идёт payload в кодировке UUE.
                        Ответить
                      • >>kiae.su
                        верните мой 1997-й...

                        >> Сохраните как UUDECODE.DOC и прочтите
                        ахахаха
                        Ответить
                        • У курчатовского института был хороший ftp-сервер с софтом. Исчез примерно в то время, когда появились Одноклассники, Вконтакте и прочее говно.
                          Ответить
                          • Там были зеркала всяких разных юниксов, и почти каждая статья на citforum.ru (про Интернет, про html, pop, ftp, smtp, unix (обычно это был FreeBSD))) всегда имела ссылку на kiae

                            Даже сейчас можно вбить в гугл "kiae.su site:citforum.ru" и умилиться
                            From [email protected] Thu Mar 16 02:03 EET 1995
                            	Received: from puffin.doc.ic.ac.uk by apollo.polyn.kiae.su with SMTP
                            		(1.38.193.4/16.2) id AA02419; Thu, 16 Mar 1995 02:02:56 +0200
                            	Return-Path: <[email protected]>
                            	Received: from doc.ic.ac.uk by puffin.doc.ic.ac.uk
                            	        id <[email protected]>; Wed, 15 Mar 1995        19:22:26 +0000
                            	To: [email protected]
                            	Subject: <FTP EMAIL> response
                            	Date: Wed, 15 Mar 1995 19:22:26 +0000
                            	From: Email-FTP Gateway Account <[email protected]>
                            	Message-Id: <"puffin.doc.790:15.02.95.19.22.34"@doc.ic.ac.uk>
                            	Status: RO
                            	<FTP EMAIL> response


                            Это про шлюз в FTP из почты:)
                            Ответить
                            • Теперь сам КИАЭ под угрозой. Хотят урезать часть территории и на месте ядерных реакторов построить илитные жилые комплексы. Только Сёме не говорите, а то тут появится тысяча комментариев на тему политики.
                              Ответить
                              • ЕМНИП курчатовцы как раз пилили ДЕМОС (порт бзди) еще в 80х, и так познакомились с этими вашими интернетами, и потом сделали "юзер группу юниксоидов" и провайдер релком который первым установил дайлап связь с Хельсинки, так что они первые юниксоиды были и первые интернетчики на Руси

                                Ща погуглил: да, верно помню. Ache там работал еще....
                                Ответить
            • com2txt так и сделан: небольшой декодер base64 (не уверен, что именно base64; там может быть другой алфавит) плюс payload.
              Ответить
            • А вот чем сжимали UUDECODE.COM:

              ftp://ftp.sac.sk/pub/sac/utilfile/comt010d.zip

              Ссылка живая, в архиве есть даже исходники.
              Ответить
              • P.S. Два алгоритма сжатия.
                -1 сжимает во что-то типа WCT (в payload заглавные латинские буквы)
                -3 сжимает во что-то типа base64 или UUE (в payload разные ASCII-символы).
                Ответить
    • Где здесь Assembler, bormand?
      Я вижу какой-то "hui"
      Ответить
      • Ребята, давайте поможем Борманду:
        push 6975h    ; 'hui' ;
        pop ax        ; 'X'   ; ax = 6975h
        xor ax, 6975h ; '5ui' ; ax = 0
        push ax       ; 'P'   ; в стеке 00, 00
        dec ax        ; 'H'   ; ax = -1
        xor ax, 3B3Bh ; '5;;' ; ax = 0C4C4h
        push ax       ; 'P'   ; в стеке SP->C4 C4 00 00
        xor ax, 403Bh ; '5;@' ; ax = 84FFh
        inc ax        ; '@'   ; ax = 8500h
        xor ax, 4848h ; '5HH' ; ax = 0CD48h
        xor al, 58h   ; '4X'  ; ax = 0CD10h
        push ax       ; 'P'   ; в стеке SP->10 CD C4 C4 00 00
        push ax       ; 'P'   ; в стеке SP->10 CD 10 CD C4 C4 00 00
        inc SP        ; 'D'   ; выталкиваем из стека 1 байт
                              ; инструкцией pop это сделать нельзя,
                              ; потому что pop вытолкнет минимум 2 байта
                              ; в стеке SP->CD 10 CD C4 C4 00 00
        pop ax        ; 'X'   ; ax = 10CDh, в стеке SP->CD C4 C4 00 00
        inc SP        ; 'D'   ; выталкиваем из стека 1 байт
                              ; в стеке SP->C4 C4 00 00
        push ax       ; 'P'   ; в стеке SP->CD 10 C4 C4 00 00
        push 6975h    ; 'hui' ; 
        pop ax        ; 'X'   ; ax = 6975h
        xor ax, 6966h ; '5fi' ; ax = 0013h
        push sp       ; 'T'   ; 
        retn          ; 'Г' (в кодировке 1251, т. е. в виндовой)
                              ; push sp + retn эквивалентно jmp near word ptr [sp]
                              ; переходим к выполнению подпрограммы CD 10 C4 C4 00 00


        Дизассемблируем подпрограмму:
        int 10h       ; CD 10 ; поскольку сейчас ax = 13h, включаем видеорежим 13h
        les sp, ax    ; C4 C4 ; invalid opcode, потому что LES ожидает ссылки на память


        Вероятно, Борманд хотел, чтобы подпрограмма завершалась кодом C3 (retn), но получилось C4, поэтому программа падает.
        Ответить
        • Кстати, про invalid opcode. NTVDM отслеживает это исключение и какой-то из несуществующих опкодов использует для вызова функций своего API. Кажется, именно C4 C4. Следующие два байта за неправильным опкодом NTVDM интерпретирует как номер вызываемой функции.
          Ответить
          • Всё-таки Борманд нас троллит. Дёрнул какую-то функцию API NTVDM, а нам говорит, что виновато переключение видеорежима.

            В чистом ДОС или в других эмуляторах (не NTVDM) программа просто свалится с исключением Invalid Opcode.
            Ответить
          • >> отслеживает это исключение и какой-то из несуществующих опкодов использует для вызова функций своего AP
            ух ты, быстро работает наверное.

            Как можно получить инвалида опкода в программе под ntvdm?
            Надо специально скопелировать real time программу под ntvdm? типа ты знаешь что ее будут запускать под windows, но пишшеь специльно под дос? серьезно? это надо что с собой сделать?
            Ответить
            • Серьёзно. Этот invalid opcode (C4 C4) не использовался нигде, кроме каких-то специальных микрософтовских утилит, предназначенных конкретно для ntvdm.

              А в виртуальной дос-машине Windows 95/98/Me были дополнительные функции DOS, которые предоставляли доступ к длинным именам файлов (их предоставлял vfat.vxd) или ко всякой фигне типа изменения заголовка окна консоли.

              А в OS/2 тоже были какие-то дополнительные функции для досовских программ, запущенных в окне...

              А в борландовских паскалях и сях была эмуляция опкодов 8087, если математический сопроцессор отсутствовал: там был вызов какого-то прерывания, которое подглядывало на следующие два байта в коде за инструкцией INT (чтобы не засорять регистры).
              Ответить
              • Вот теперь когда я подумал про vxdшку для fat32 я понял что в этом нет ничево удивительного

                Эмуляцию ФПУ я помню, там была опция такая у копелятора. В те далекие времена яне думал как она работает, просто знал что у мну есть FPU и всё

                ps:
                >или ко всякой фигне типа изменения заголовка окна консоли.
                так ansi.sys же и ESC последовательнсоте, не?
                Ответить
                • О чём вы пиздите?
                  Ответить
                • Тихо, гусары, не ржать:
                  https://www.google.com/search?q=c4+c4+ntvdm

                  Я наткнулся на эту фигню, когда пытался дизассемблировать com-файлы из System32 какой-то Windows NT (уже не помню, какой).

                  За пределами стандартных утилит Windows NT такой опкод нигде не встречается.
                  Ответить
                  • >>com-файлы из System32
                    16битные файлы лежали в папке system32, и это логично потому что у меня сейчас там лежат 64битные файлы, а 32х битные лежат в wow64
                    Ответить
                    • Соль лежит в банке из-под кофе, на которой наклейка «Сахар».
                      Ответить
                      • Винда один сплошной костыль. И PC костыль. И x86 костыль. Между нами девочками и SUS/Posix тоже костыль. буэээ
                        Ответить
                • >> так ansi.sys же и ESC последовательнсоте, не?

                  Как досовский ansi.sys изменит заголовок окна, если у него нет доступа к WinAPI? Вот единственный шлюз был через доп. функции DOS с большими номерами. А до ansi.vxd тогда не додумались.
                  Ответить
                  • ну когда обычное console appl работает в винде то винда запускает conhost (в былые времена это был код прямо в csrss) которое рисует окошко

                    что мешало ntvdm рожать такие же окошки и потом:

                    1) приложение -> NTVDM (пишет в stdout посредством DOS int. \033...)
                    2) NTVDM -> ядру (через native API) "поменяй мну зоголовко"

                    зы: ansi.sys тут не причем конечно, потому что строго говоря заголовков в обычные мониторы пока не завезли)

                    но все равно можно было так сделать
                    Ответить
                    • Можно было. Но ansi.sys — это прыщеговно *nix-way, а не windows-way.

                      В MS умудрились даже на протяжении нескольких лет одновременно поддерживать ветки NT и не-NT, в которых всё сделано по-разному, и только потом отказались от не-NT.
                      Ответить
                      • >>*nix-way, а не windows-way.
                        его вроде включали когда-то чтобы упростить портирование прыщеговна видимо, но потом отказались и теперь опять у нас только ConsoleAPI.

                        А ветки долго поддерживали: NT 3.51 вышел лет за 10 до полного перехода всего на Win2k/WinXP.
                        И даже там поддерживают до сих пор НЕ юникодные функции чтобы работали win9x аппы.

                        Обычно Pituh этомакрос который резолвится в PituhA если не установлен UNICODE и в PituhW если установлен

                        Очевидно что PituhW есть во всех WinNT
                        Ответить
                • Вспомнил ещё один извращённый API. Внутри VXD в Windows 3.x и 95/98/Me сисколлы выглядели как int 20h (да, номер вектора случайно совпал с тем, который завершает досовскую программу), за которым следовали четыре байта (номер сисколла и какой-то параметр). Т. е. диспетчер сисколлов подглядывал в вызывающий код, чтобы получить номерок, и делал инкремент адреса возврата, чтобы при возврате пропустить байтики, не являющиеся кодом.

                  Получается такая же схема, как у c4 c4 в ntvdm и как у борландовского эмулятора FPU.
                  Ответить
            • >> Надо специально скопелировать real time программу под ntvdm?

              %DDK%\inc\ddk\isvbop.h:
              /** RegisterModule - This Bop call is made from the 16 bit module
               *		     to register a third party DLL with the bop
               *		     manager. This call returns a handle to the
               *		     16bit caller which is to be used later to
               *		     dispatch a call to the DLL.
               *
               *  INPUT:
               *	Client DS:SI - asciiz string of DLL name.
               *      Client ES:DI - asciiz string of Init Routine in the DLL. (Optional)
               *	Client DS:BX - asciiz string to Dispatch routine in the DLL.
               *
               *  OUTPUT:
               *	SUCCESS:
               *	    Client Carry Clear
               *	    Client AX = Handle (non Zero)
               *	FAILURE:
               *	    Client Carry Set
               *	    Client AX = Error Code
               *		    AX = 1 - DLL not found
               *		    AX = 2 - Dispacth routine not found.
               *		    AX = 3 - Init Routine Not Found
               *		    AX = 4 - Insufficient Memory
               *
               *  NOTES:
               *	RegisterModule results in loading the DLL (specified in DS:SI).
               *      Its Init routine (specified in ES:DI) is called. Its Dispatch
               *	routine (specified in DS:BX) is stored away and all the calls
               *      made from DispatchCall are dispacthed to this routine.
               *      If ES and DI both are null than the caller did'nt supply the init
               *      routine.
               */
              
              #define RegisterModule() _asm _emit 0xC4 _asm _emit 0xC4 _asm _emit BOP_3RDPARTY _asm _emit 0x0
              Ответить
              • лол, и правда

                кстати, почему никто не тыкнул меня в то, что я real mode обозвал real time?
                Ответить
                • Я сам не заметил, что time вместо mode. Вероятно, увлёкся.

                  Значит, NTVDM умеет генерировать 16-битные трамплины для вызова DLL из досовской программы реального режима. Где бы ещё найти требования для этой dispatch routine, которую он будет вызывать...
                  Ответить
                  • AAAA! Вызываем MessageBox() из досовской программы, запущенной в NTVDM:
                    http://www.cyberforum.ru/post2903586.html
                    Ответить
              • Программа bormand'а совершила вызов BOP №0 (RegisterModule), который ожидает в DS:SI название DLL, в ES:DI название init routine, в DS:BX название dispatch routine.

                Посмотрим, что у его программы на самом деле в этих регистрах...

                ES=DS=CS, ибо COM-файл; SI, DI, BX содержат мусор, ибо он их не трогал (есть подозрение, что SI=100h, значит, DS:SI указывает на huiX5uiPH5;;P5;@@5HH4XPPDXDPhuiX5fiTГ — вот такое некрасивое название DLL получилось. И NTVDM попытается эту DLL найти...
                Ответить
                • Вру. Проглядел #define BOP_3RDPARTY 0x58.
                  RegisterModule() вызовется, только если после C4 C4 есть байт 58 (hex).

                  А тут вообще произойдёт вызов неизвестного сервиса. В isvbop.h такого нет. Зато есть такие:
                  #define UnRegisterModule() _asm _emit 0xC4 _asm _emit 0xC4 _asm _emit BOP_3RDPARTY _asm _emit 0x1
                  #define DispatchCall()	 _asm _emit 0xC4 _asm _emit 0xC4 _asm _emit BOP_3RDPARTY _asm _emit 0x2
                  #define VDDUnSimulate16() _asm _emit 0xC4 _asm _emit 0xC4 _asm _emit BOP_UNSIMULATE
                  где #define BOP_UNSIMULATE 0xFE
                  Ответить
                  • Нашёл ещё несколько номерков сервисов:
                    https://i.imgur.com/SkJNFH1.png
                    Ответить
                    • Вот та книжка: https://books.google.com/books?isbn=0201601168
                      «El DOS no documentado»

                      Больше нигде BOP_DOS, BOP_WOW, BOP_XMS, BOP_DPMI, BOP_CMD, BOP_DEBUGGER, BOP_REDIR, BOP_NOSUPPORT, BOP_GRABTIMER, BOP_KBD, BOP_VIDEO, BOP_NOTIFICATION, BOP_UNIMPINIT, BOP_SWITCHTOREALMODE не гуглятся.
                      Ответить
                      • para hacer :) Испанский же?

                        Полагаю что MS дали документацию только паре клиентов которые хотели развивать свое 16ти битное говно под NT и не стали публиковать документацию чтобы не провоцировать новых разработок
                        Ответить
                        • Чуть выше я оставил ссылку на киберфорум. Там упоминаются BOP_WAITIFIDLE, BOP_DBGBREAKPOINT, которых нет в книжке. Значит, ещё кто-то про них знает...
                          Ответить
                          • Ты всерьез решил это раскопать, и 16ти битный браузер который использовал бы WinINet например?:)

                            Мне трудно учавствовать в гонке, бо все доступные мне винды уже оче давно 64х битные
                            Ответить
                            • Действительно. А в DOSBOX'е сисколы NTVDM не работают...
                              Ответить
                              • >>в DOSBOX'е сисколы NTVDM не работают..
                                ты мне предланаешь двухтонник на DOSBOX поставить?

                                Я чото сомневаюсь что DOSBOX умеет эмулировать нормальный защищенный режим со страницами, PnP bios и прочие нужные вещи
                                Ответить
                                • У Dosbox'а другая проблема: в нём нельзя использовать свой загрузчик. Он сразу загружает в память свой модифицированный DOS. Кстати, из-под него можно запустить Windows 3.11 с Win32s, но у этой штуки нет ntvdm.

                                  Для загрузки двухтонника нужно использовать что-нибудь помощнее (QEMU, Bochs, VMware, Virtual Box, Virtual PC).
                                  Ответить
                        • Нашёл у себя диск с утёкшими исходниками Windows NT 4.0 и 2000. Там можно найти кучу всяких сервисов. Например:
                          NT_WAIT_BOP	equ	5Ah
                          
                          bop MACRO callid
                              db 0c4h,0c4h,callid
                          endm
                          ...
                          ; EmmIsr  - int 67h isr
                          ;
                          EmmIsr:          ; LIM Isr
                                  bop     67h
                          emmiret:
                                  FIRET
                          
                          ; ret trap for em function 'alter page map & call'
                          EmmRet:
                                  bop     68h
                                  jmp     emmiret
                          ...
                          InitSpcEmm  proc near
                          
                                     ; BOP 66 - initialize LIM memory
                                     ; pass the address of bop 68 to the em manager
                                     ; in ds:dx and to return the number of em pages in BX
                                     ;
                                     ; NOTE: All EMM options come from pif file
                                     ;       There are NO command line options
                                     xor     bx, bx
                                     mov     dx, offset EmmRet
                                     bop     66h
                          ...
                          keyboard_break_caller:
                          	int 1bh	    ;keyboard break
                          	bop %BIOS_CPU_QUIT
                          ...
                          print_screen_caller:
                          	int 5h		    ;print screen
                          	bop %BIOS_CPU_QUIT
                          ;================================================================
                          ; Tim modified int 15 caller. Copied from BIOS2. It gives CPU
                          ; a chance to take other interrupts. Suspect the extra jumps are
                          ; now harmless with IRET hooking.
                          ;int15h_caller:
                          	;int	15h
                          	;bop	%BIOS_CPU_QUIT
                          int15h_caller:
                          	int	15h	; Cassette I/O.
                          	jmp	k1
                          k1:	jmp	k2
                          k2:	jmp	k3
                          k3:	BOP	%BIOS_CPU_QUIT
                          ...
                          unexp_int:
                          	bop %UNEXP_BOP
                                  jmp     iret_com
                          ...
                          int13h_caller:
                          	int	13h
                          	bop %BIOS_CPU_QUIT
                          ...
                          int09h_vector:
                                  push    ax
                                  xor     ax, ax
                                  bop     %BIOS_KB_INT
                                  pop     ax
                                  jmp     iret_com
                          Ответить
                        • BOP 0, который случайно собрал bormand в своей программе, — это reset.

                          /*[
                          	Name:		reset.c
                          	Derived From:	base 2.0
                          	Author:		Henry Nash
                          	Created On:	Unknown
                          	Sccs ID:	@(#)reset.c	1.81 06/20/95
                          	Purpose:
                          		This function is called once the system memory has been
                          		initialised.  It builds the interrupt vector table,
                          		initiailises any physical devices and BIOS handlers.
                          		The CPU will execute a call to the BIOS bootstrap
                          		function after this routine has returned.
                          
                          
                          	(c)Copyright Insignia Solutions Ltd., 1990. All rights reserved.
                          
                          ]*/
                          Ответить
                          • Вроде бы эта штука должна была перезагружать NTVDM, но что-то шло не так, и она вешала всю систему.
                            Ответить
                        • Оставлю на правах офтопика:
                          D:\WIN2K\PRIVATE>grep -i -R --include=*.C* moron .
                          ./SHELL/BROWSEUI/ITBAR.CPP:            // should be fixed in the apps themselves.  Morons!
                          ./SHELL/COMCTL32/IMAGE.C:        // some morons (visual test)
                          ./SHELL/EXT/FTP/FTPDROP.CPP:    We have to do this only because Exchange is a moron.
                          ./SHELL/EXT/TWEAKUI/CONTROL.C:                     *  Lots of morons forget to set the language properly,
                          ./SHELL/SHDOC401/UNICPP/DESKTOP.CPP:            // We are morons.  We changed the IDeskTray interface between IE4
                          ./SHELL/SHDOC401/UNICPP/DESKTOP.CPP:                // We are morons.  We changed the IDeskTray interface between IE4
                          ./SHELL/WIN16/COMMCTRL/TOOLBAR2.C:                // ... morons ... jeffbog 9/13/96
                          Ответить
                          • Продолжим:
                            D:\WIN2K\PRIVATE>grep -i -R --include=*.C* fuck .
                            ./SHELL/APPLETS/WELCOME/HTML/WEBAPP.CPP:        // HighContrast mode is turned on.  This totally fucks our style sheet as most of it wil
                            l
                            ./SHELL/SHELL32/COPY.C:// want to fuck with.
                            ./SHELL/SHELL32/UTIL.CPP:// the fucking alpha cpp compiler seems to fuck up the goddam type "LPITEMIDLIST", so to work
                            ./SHELL/SHELL32/UTIL.CPP:// around the fucking peice of shit compiler we pass the last param as an void *instead of a LPITEMIDLIST
                            ./WINDBG64/DEBUGGER/TL/REMOTE/SHELL/WINDBGRM.C:            // The user fucked up
                            ./WINDOWS/SHELL/CONTROL/MIDI/MAP.C:         //  !!!this is fucked if a map goes to multiple physical devices
                            Ответить
                            • На "shit" было много ложных срабатываний типа "resultsHit", поэтому пришлось убрать флаг "-i". И всё равно пришлось убирать кучу строк со словами типа "shitemid" и "hashitem". Результат:
                              D:\WIN2K\PRIVATE>grep -R --include=*.C* shit .
                              ./SHELL/APPLETS/GRPCONV/GCINST.C:    // launching progman.exe, or doing any DDE bullshit
                              ./SHELL/COMCTL32/MONTHCAL.C:    // TODO: this is bullshit. make it more efficient...
                              ./SHELL/EXT/NETPLWIZ/MNDDLG.CPP:                    // this shit's read only
                              ./SHELL/SHELL32/COPY.C:    // BUGBUG: This is total bullshit. fSysError might as well be a random number after this call.
                              ./SHELL/SHELL32/FSTREE.CPP:            // NOTE: this is bullshit. if we ended up with a max smaller than what
                              ./SHELL/SHELL32/UTIL.CPP:// around the fucking peice of shit compiler we pass the last param as an void *instead of a LPITEMIDLIST
                              ./SHELL/WIN16/COMMCTRL/CTL3D.C:                    // Some ugly shit goin' on here!
                              ./WINDOWS/MEDIA/AVI/AVICAP/CAPDIB.C:        // Holy shit, couldn't change formats, time to punt!
                              ./WINDOWS/MEDIA/AVI/AVICAP_16/CAPDIB.C:        // Holy shit, couldn't change formats, time to punt!
                              ./WINDOWS/MEDIA/AVI/AVICAP_IO/CAPDIB.C:        // Holy shit, couldn't change formats, time to punt!
                              ./WINDOWS/MEDIA/AVI/MSRLE/RLE.C:    //  lets do some majic shit so the compiler generates "good" code.
                              ./WINDOWS/SHELL/RUNDLL32/RUNDLL.C:        // turn off critical error bullshit
                              Ответить
                              • > ./WINDOWS/MEDIA/AVI/MSRLE/RLE.C: // lets do some majic shit so the compiler generates "good" code.
                                Что там?
                                Ответить
                                • Сейчас глянем...
                                  DWORD NEAR _fastcall RgbCompare(RGBQUAD rgb1, RGBQUAD rgb2)
                                  {
                                      DWORD sum=0;
                                  
                                      //
                                      //  lets do some majic shit so the compiler generates "good" code.
                                      //
                                  #define SUMSQ(a,b)                          \
                                      if (a > b)                              \
                                          sum += (WORD)(a-b) * (WORD)(a-b);   \
                                      else                                    \
                                          sum += (WORD)(b-a) * (WORD)(b-a);
                                  
                                      SUMSQ(rgb1.rgbRed,   rgb2.rgbRed);
                                      SUMSQ(rgb1.rgbGreen, rgb2.rgbGreen);
                                      SUMSQ(rgb1.rgbBlue,  rgb2.rgbBlue);
                                  
                                      return sum;
                                  }
                                  Ответить
                                  • Лень искать определение RGBQUAD. Тут вычисляется разность беззнаковых питухов. Чтобы результат возведения в квадрат был правильным, приходится из большего вычитать меньшее (иначе процессор посчитает разность беззнаковой и молча прибавит 256 к множителю).
                                    Ответить
                                • Кстати, вот пара классических статей на эту тему:
                                  http://web.archive.org/web/20040401115821/www.kuro5hin.org/story/2004/2/15/71552/7795

                                  http://www.hulver.com/scoop/story/2004/2/14/54256/0849

                                  Могу что-нибудь выдрать, если заинтересовало.
                                  Ответить
                                • Грепнул по слову "compiler". В исходниках NT4 нашёл 2453 фрагмента, в которых погромисты из Микрософта ругают микрософтовский же конпелятор.
                                  Ответить
                                  • В исходниках W2K всего 739 упоминаний compiler'а.
                                    Ответить
                            • Из другой Винды:
                              D:\NT4\PRIVATE>grep -i -R --include=*.C* fuck .
                              ./MVDM/SOFTPC_NEW/BASE/CCPU386/FPU.C:   /* Don't do it!! It fucks you up!! */
                              ./NET/RAS/SRC/NT/NDIS/RASHUB/RECEIVE.C:         // It's a multicast!  Shit, I'm fucked for [email protected][email protected]
                              ./NTOS/NDIS/ELNK3/RECEIVE.C:        //  to make sure that the fifo is not fucked up with a
                              ./NTOS/NDIS/ELNK3/RECEIVE.C:                // It's fucked up. Reset the receiver
                              ./NTOS/TDI/IRDA/IRLAP/IRLAP.C:/*  THIS FUCKER GOES
                              ./NTOS/TDI/TCPIP/TCP/TCPSEND.C:// STUPID FUCKING COMPILER generates incorrect code for this. Put it back on
                              ./NTOS/W32/NTGDI/DIRECT/DDRAW/DDSBLTO.C:                DWORD dwFlagsForNoGoodFuckingReason,
                              ./NTOS/W32/NTGDI/DIRECT/DDRAW/DDSSTRM.C:                DWORD dwFlagsForNoFuckingGoodReason,
                              ./SDKTOOLS/PPERF/APP/PPERF.C:        //DbgPrint("Init Instance fails fucking windows\n");
                              ./SDKTOOLS/VDMPERF/VDMPERF.C:        DbgPrint("Init Instance fails fucking windows\n");
                              ./TAPI/DEV/CPL/DRV.C:    static char szTemp[MAXSTR];        // this static stuff is fucked
                              ./WINDOWS/MEDIA/MVFS32/BTKEY.C://        *(LONG FAR *)(*pKey) = *(  oh fuck it.
                              ./WINDOWS/SHELL/CONTROL/MIDI/MAP.C:         //  !!!this is fucked if a map goes to multiple physical devices
                              ./WINDOWS/SHELL/SHELLDLL/CLOUDS.CPP:    //BUGBUG: this routine _really_ trusts its caller not to fuck up
                              ./WINDOWS/SHELL/SHELLDLL/COPY.C:// want to fuck with.
                              Ответить
                              • Тут что-то было про компилятор:
                                //* FillTCPHeader - Fill the TCP header in.
                                //
                                //  A utility routine to fill in the TCP header.
                                //
                                //  Input:  SendTCB         - TCB to fill from.
                                //          Header          - Header to fill into.
                                //
                                //  Returns: Nothing.
                                //
                                void
                                FillTCPHeader(TCB *SendTCB, TCPHeader *Header)
                                {
                                #ifdef VXD
                                
                                // STUPID FUCKING COMPILER generates incorrect code for this. Put it back on
                                // the blessed day we get a real compiler.
                                
                                #if 0
                                    _asm {

                                Судя по #ifdef VXD, это код не для NT 4.0, а для Windows 95. А судя по #if 0 перед _asm, что-то пошло не так.
                                Ответить
                                • А вот вариант кода, альтернативный ассемблерной версии:
                                  #else
                                      ushort      S;
                                      ulong       L;
                                  
                                  
                                      Header->tcp_src = SendTCB->tcb_sport;
                                      Header->tcp_dest = SendTCB->tcb_dport;
                                      L = SendTCB->tcb_sendnext;
                                      Header->tcp_seq = net_long(L);
                                      L = SendTCB->tcb_rcvnext;
                                      Header->tcp_ack = net_long(L);
                                      Header->tcp_flags = 0x1050;
                                      *(ulong *)&Header->tcp_xsum = 0;
                                      S = RcvWin(SendTCB);
                                      Header->tcp_window = net_short(S);
                                  #endif
                                  А вот вариант кода для NT:
                                  #else
                                  
                                  	//
                                  	// BUGBUG: Is this worth coding in assembly?
                                  	//
                                      ushort      S;
                                      ulong       L;
                                  
                                  
                                      Header->tcp_src = SendTCB->tcb_sport;
                                      Header->tcp_dest = SendTCB->tcb_dport;
                                      L = SendTCB->tcb_sendnext;
                                      Header->tcp_seq = net_long(L);
                                      L = SendTCB->tcb_rcvnext;
                                      Header->tcp_ack = net_long(L);
                                      Header->tcp_flags = 0x1050;
                                      *(ulong *)&Header->tcp_xsum = 0;
                                      S = RcvWin(SendTCB);
                                      Header->tcp_window = net_short(S);
                                  #endif
                                  Ответить
                                  • А на ассемблере это выглядело так:
                                    _asm {
                                            mov     edx, dword ptr SendTCB
                                            mov     ecx, dword ptr Header
                                            mov     ax, word ptr [edx].tcb_sport
                                            xchg    al, ah
                                            mov     word ptr [ecx].tcp_src, ax
                                            mov     ax, [edx].tcb_dport
                                            xchg    ah, al
                                            mov     [ecx].tcp_dest, ax
                                    
                                            mov     eax, [edx].tcb_sendnext
                                            xchg    ah, al
                                            ror     eax, 16
                                            xchg    ah, al
                                            mov     [ecx].tcp_seq, eax
                                    
                                            mov     eax, [edx].tcb_rcvnext
                                            xchg    ah, al
                                            ror     eax, 16
                                            xchg    ah, al
                                            mov     [ecx].tcp_ack, eax
                                    
                                            mov     [ecx].tcp_flags, 1050H
                                            mov     dword ptr [ecx].tcp_xsum, 0
                                    
                                            push    edx
                                            call    near ptr RcvWin
                                            add     esp, 4
                                    
                                            mov     ecx, Header
                                            xchg    ah, al
                                            mov     [ecx].tcp_window, ax
                                    
                                        }
                                    Ответить
                                  • Кто найдёт отличие версии для VXD от версии для NT, тому ничего.
                                    Ответить
    • В копилку ненормального программирования: нашёл на одном форуме куайн в виде COM-файла:

      VZNNXPH555750K4PP5DM3D01D0X5AC3D21D2XP55 9550K4
      Ответить
      • Чёртов пробел!

        VZNNXPH555750K4PP5DM3D01D0X5AC3D21D2XP559550K4
        Ответить
        • Дизасм куайна: http://govnokod.xyz/id7/
          Собираем в конце программы знак доллара, int 21h; retn. Перед этим заполняем ah номером функции и dx адресом строки (100h = адрес самого исполняемого образа).
          Ответить
    • На правах офтопика. Сборка Portable Executable для Windows с помощью debug.com:
      http://citforum.ru/programming/windows/machine_code/3.shtml
      http://citforum.ru/programming/windows/machine_code/4.shtml

      Потребуются только текстовый редактор, cmd.exe и debug.com. Больше всего времени занимает ввод PE-заголовка.
      Ответить
    • Насру тут. Читал про эмулятор 68К для PPC и про эмулятор PPC для x86 на Маках и добрался до Universal Binary — это контейнер, позволяющий хранить два исполнимых файла в одном, чтобы на одной платформе запускался один, на другой — другой (нечто похожее в Windows и в OS/2: там можно склеить 16-битный экзешник для DOS с экзешником для другой разрядности и другой системы, но до universal binary форточкам и полумуху далеко).

      Оказывается, есть и другие примеры такой технологии:
      https://en.wikipedia.org/wiki/Fat_binary

      ELF, содержащий секции для разных систем, это, конечно, круто, но ничто не сравнится с комбинированным файлом для DOS (x86) + CP/M (8080).
      Ответить
      • Цитирую: «The methods either combine two fully functional programs each built for their corresponding environment, or add stubs which cause the program to exit gracefully if started on the wrong processor. For this to work, the first few instructions in the .COM file have to be valid code for both 8086 and 8080 processors, which would cause the processors to branch into different locations within the code. For example, the utilities in the MYZ80 emulator start with opcode sequence EBh, 52h, EBh. An 8086 sees this as a jump and reads its next instruction from offset +154h whereas an 8080 or compatible goes straight through and reads its next instruction from +103h. A similar sequence used for this purpose is EBh, 03h, C3h.»
        Ответить
        • Короче: один COM-файл содержит код для двух архитектур. Из-за того, что инструкции разными процессорами интерпретируются по-разному, происходит ветвление.

          Интересно, где ещё можно что-то подобное реализовать.
          Ответить
    • Внезапно нашёл NTVDMx64 — порт NTVDM для 64-битных Windows. Как же она работает, если архитектура AMD64 не поддерживает виртуальный 86 в «длинном» режиме?

      Windows NT 4.0 поддерживала довольно странные платформы (MIPS, Alpha, Power PC), но в ней была NTVDM. Досовские программы для x86 на этих платформах выполнялись через эмулятор процессора (Soft PC). В «двухтоннике» поддержку MIPS, Alpha, PPC решили прекратить, а поддержку AMD64 и Итаниума к официальному выпуску завершить не успели, поэтому Soft PC выкинули и во всех более новых Windows NTVDM не умеет эмулировать процессоры.

      NTVDMx64 собрали из спизженных исходников NT 4.0, в которых ещё был Soft PC, но пропатчили их для совместимости с API Windows 7.0 и Windows 10 (на Windows 8 и 8.1 запускается бинарник для десятки).
      Ответить
      • Чуть не забыл ссылочку:
        http://www.columbia.edu/~em36/ntvdmx64.html
        Ответить
        • NTVDMx64 работает!!! У меня на 64-битной Windows 8.1 QBASIC запустился!
          Ответить
          • Графический режим не работает. Только текстовый. Значит, без DOSBOX пока не обойтись.
            Ответить
            • https://pikabu.ru/story/govno_6154557
              Ответить
              • Блядь, русня, какие же вы убогие.
                Ответить
              • Ой блядь, я до сих пор читаю коменты и ржу аж плачу :)
                Ответить
              • >Для первых этажей проблема очень частая
                Пиздарики
                Ответить
              • Русня, почему вы Гагарина запустить осилили, а делать канализацию по нормам - нет?
                Ответить
                • Да никто никого в космос и не запускал - государства тупо пиздели друг другу и своим гражданам, чтобы выебнуться и устрашить врагов.
                  Ответить
                  • Во времена Гагарина не было PHP, так что написать софт для управления полётом было тупо не на чем...
                    Ответить
                • > по нормам
                  Чтобы в неё без проблем пролезали очистки, тряпки и прочая хуйня? Без этого дерьма то она нормально работает.
                  Ответить
                  • Пидорах, ну почему я такие истории про загнивающий не слышал? А бумагу туалетную гавняную почему нельзя в унитаз кидать?
                    Ответить
            • > Графический режим не работает.

              Тут у чувака "Марио" запустился, правда, не с первого раза:
              https://github.com/leecher1337/ntvdmx64/issues/23#issuecomment-372244996

              А я сделал несколько попыток, только чёрный экран. В текстовых режимах работает, графику не хочет. Даже не знаю, где может быть неполадка.
              Ответить
              • Запустилась графическая программа, но не с первого раза.

                Запускаю из explorer.exe — текстовый режим работает, в графическом чёрный экран.
                Запускаю из cmd.exe — работают любые видеорежимы, но не с первого раза.
                Запускаю из command.com в интерактивном режиме — выскакивает MessageBox, что 64-битные Windows не поддерживают 16-битные файлы.
                Запускаю через command.com /c имя_программы.exe — стабильно включается нужный видеорежим.

                NTVDMx64 пытается пропатчить память процесса, но при некоторых условиях ему это не удаётся. Похоже на это:
                https://ru.wikipedia.org/wiki/Состояние_гонки
                Ответить
          • И что в этом такое? Он с расширителем?
            Ответить
            • В этом такое, что по умолчанию все 64-битные окна, начиная с XP, по умолчанию идут без ntvdm и в них одним кликом запустить досовский exe- или com-файл нельзя.

              Dosbox неудобен тем, что его нужно запускать специально, из него нельзя запустить виндовую программу, короче, полная изоляция.

              После установки же ntvdmx64 досовские программы запускаются одним кликом даже из современных 64-битных систем.
              Ответить
              • >по умолчанию все 64-битные окна, начиная с XP, по умолчанию идут без ntvdm и в них одним кликом запустить досовский exe- или com-файл нельзя.
                Ах вот оно что. Что значит по умолчанию?
                Ответить
                • Первая реализация ntvdm на x86-64, которую я увидел — это https://github.com/leecher1337/ntvdmx64
                  Её нужно ставить вручную. Кроме того, сейчас она нарушает авторские права, ибо основана на OpenNT (из Гитхаба OpenNT удалили в 2016 году, но до сих пор можно найти его копии), который в свою очередь основан на утёкших исходниках Windows NT 4.0.

                  Официально Microsoft ещё в Windows XP отказался от ntvdm в 64-битной версии (у Windows 2000 64-битную версию выпустить не успели).
                  Ответить
                  • Да это не Microsoft отказался, а intel не умеет v86 в long mode
                    Ответить
                    • Нет, это Microsoft отказался. Я уже написал, что у них был ntvdm в Windows для AXP, MIPS, PPC — это процессоры вообще не умеют в x86 ни в каком режиме, поэтому ntvdm на них эмулировал x86.
                      Ответить
                      • Если бы интел не выкинул V86 из LongMode то MS бы до сих пор шипал v86-based NTVDM как он зробит для Win10 32bit
                        Ответить
                        • Это да, с V86 слой эмуляции тащить не нужно. Там можно выполнять напрямую, как сейчас 64-битная Винда выполняет 32-битные приложения.

                          Но они бы могли к 64-битной Винде прицепить эмулятор, который у них был в NT4 для других процессоров. Кстати, HAL в 64-битной Винде содержит эмулятор реального режима x86, чтобы можно было использовать функции BIOS.
                          Ответить
                          • >>Но они бы могли к 64-битной Винде прицепить эмулятор, который у них был в NT4 для других процессоров.

                            зачем? Я думаю они рады были выкинуть этот код, представляешь какая боль ево поддерживать?

                            >>BIOS
                            да, мне кажется тут про это уже рассказывали) но там какая то урезанная мумуляция
                            Ответить
                            • Намечается интересная тенденция: в Visual Studio 2017 наряду с msvc зачем-то включили шланг; в Windows 10 включили Бубунту; IE стал отказываться от своих расширений в пользу стандарта w3c. Ещё чуть-чуть, и MS выкинут всё и напишут инструкцию по переходу на Linux, как сделала IBM в начале нулевых, прекратив выпуск OS/2.
                              Ответить
                              • нет ток бубунту но еще и сусю и дебиан

                                В принципе WSL это реализация сисколов лялиховых поверх NT ядра, так что туда можно любой userspace лялиховый завести, хоть слаку хоть генту
                                Ответить
                              • Может, птиса Ксеникс восстанет из пепла?
                                Ответить
                                • Ксеникс был забавен тем что умел без страничной адресации быть

                                  редкий юникс умел

                                  Кста, товарищу выше отвечаю: IBM забил еще и на свой unix Тоже ради линукс, вообще кроме солярок и бздей больше и юниксов то не осталось кроме линукса
                                  Ответить
                                  • Некоторые принципиальные товарищи считают, что Линукс — это не Юникс: монолитное ядро вместо микроядра и микросервисов, вот это всё. Немодульно, короче.
                                    Ответить
                                    • В Юникс тоже нет микроядер обычно

                                      Linux Не юникс бо писан с ноля и кода юникс не содержит
                                      Ответить
                                      • Зато миникс микроядерный
                                        Ответить
                                      • Проверим...
                                        BSD, AIX, HP-UX, IRIX, Solaris, SunOS, SCO — монолитное ядро (у некоторых с загружаемыми/выгружаемыми модулями).

                                        Plan 9, NextStep, Darwin — гибридное ядро.

                                        Микроядро только у QNX, у Minix и у недописанного Hurd.

                                        Танненбаум проиграл что ли?
                                        Ответить
                                        • >>Танненбаум проиграл что ли?
                                          дебаты_линуса_и_таненбаума.txt

                                          Кста, Darwin прошел сертификацию SUS
                                          Ответить
      • Иными словами у нас тут эмулятор PC x86 real mode, просто выполняемый как подсистема винды?

        >> В «двухтоннике» поддержку MIPS, Alpha, PPC решили прекратить, а поддержку AMD64 и Итаниума
        Все верно, только AMD64 к релизу 2k еще не было, а рассказами про то, что скоро станет Itanium пронизана вся windows 2000 Internals. Тогда все верили что скоро настанет

        Интересно, как именно это работает? Процессор выполняет 32битный код, внутри которого крутится эмулятор? Создает ли Exectutive объект PRocess и структуру EPROCESS? Создает ли ядро KPROCESS? Если так, то процесс виден в диспетчере задач и даже честно шедулится)

        В 10 есть еще PicoContainers (проект Drawbridge): через него реализовали WSL, позволяющий запускать даже вообще не PE:)
        Ответить
        • Про "вообще не PE" не удивили: ещё во времена Windows 3.x появился пакет Win32s, который ловил исключения при попытке запустить программу и пытался обработать PE (голые Windows 3.x поддерживали только NE, а по исключению запускали программу через VDM). То есть добавлять поддержку новых форматов без переписывания системы умели ещё в третьих форточках.

          Ну ещё напомню про os2ss и posixss в NT до 2К включительно.
          Ответить
          • А мне кажется что {os2,posix}ss как и любой ss имел PE(NE, или какие-то другие известные CreateProcess) заголовки и работал в строгом соответствии с изначальным сумеречным гением Дейва Калтера (да живет он вечно).

            Kernel32!CreateProcess читал заголовок, и видя что там posix дергал posixx.exe, а видя что там win32 (сосносль или оконное субсистем) дергал уже ntdll.dll!NtCreateProcess
            Ответить
            • Увы, так и было. Что posixss, что более поздние хрени (гуглятся по слову "Interix") использовали PE с особым номером подсистемы в заголовке.

              os2ss умела исполнять только 16-битные NE. Поддержку 32-битных LX так и не реализовали, хотя LX несильно отличается от LE, который был форматом VXD в Windows 3.x и 95/98/Me.

              Но прецедент с Win32s, когда реально был добавлен новый формат, интересный.
              Ответить
              • Вообще вся идея подсистем довольно сильно обосрмашись, надо признать. Изначально считалось что вокруг универсального executive (верхняя часть ядра) будут крутиться разные APIs и Win32 станет одной из них. В ядро даже завезли семантику (вроде "fork") этому API не нужную (до появления WSL она и не использовалась почти).

                Потом Win32 стал главным API для GUI, потом часть его переехала в ядро и у него появились свои сисколы! (часть USER и GDI вызовов), потом OS/2 (16 битная как ты верно заметил) и Posix стали никому не нужны, их выкинули, вот и настал черед NTVDM.

                Кому нужна теперь вся эта абстрактность в win64?

                Похожая история случилась с поддержкой CPU: в какой-то момент из всех платформ осталась только многопроцессная x86 и HAL стал примерно один: многопроцессный APIC (бо PIC не бывает для многопроцессных) HAL с ACPI (бо ACPI есть во всем, что выпущено после 1999 г). Стало не понятно зачем городили огорода
                Ответить
                • Почти верно, но ведь есть Windows RT для ARM, которую ещё ставят на планшеты. Кстати, какой багор у пользователей виндофонов, когда вдруг в один прекрасный день их аппараты превратились в тыкву корпорация Microsoft объявила о прекращении поддержки Windows Phone. Выкупили у Нокии производство смартфонов, чтобы его закрыть.
                  Ответить
                • Кстати, про огород. Вот зачем в реестре путь Software\Microsoft\Windows\CurrentVersio n? Зачем так глубоко прятать? Они изначально предполагали хранить в одном реестре записи для нескольких версий Windows? Они предполагали в одном реестре хранить записи для нескольких операционных систем?
                  Ответить
                  • При обновлении с древней версии вроде там была еще и не current
                    Ответить
        • > Если так, то процесс виден в диспетчере задач и даже честно шедулится)

          В диспетчере задач видно только conhost и ntvdm. У ntvdm есть окно и его видно как приложение. Conhost окон не имеет. Оба процесса запущены от имени юзера.

          Значит, эмулятор — это тупо часть самого ntvdm.exe.

          Кстати, до семёрки conhost не было: консоль поддерживалась службой csrss.
          Ответить
          • >>Кстати, до семёрки conhost не было: консоль поддерживалась службой csrss.
            именно так. Потому сосноль была не кастомизуема кстати: чтобы не тянуть говна в и без того разбухший сервер поддержки win32api

            Кстати, в 10ке conhost это затычка: почти всё реализовано в .dllке, коих там две: старая (для лохов) и новая (которая умеет alt+enter на весь экран, умное выделение итд)
            Ответить
            • А вообще какая кастомизация сейчас доступна?
              Ответить
              • Окошко сосноли имеет look and feel такой же как и в винде
                А в XP это было не так
                Ответить
        • Оказывается, у Windows несколько эмуляторов процессора:

          • В HAL для MIPS (проект HALTYNE) есть эмулятор x86, чтобы можно было исполнить код расширителя BIOS из видеокарточки, предназначенной для PC.

          • В HAL есть ещё один эмулятор x86 (называется x86new), в нём makefile для i386, MIPS и PPC:
          It is a complete 386/486 emulator, but only implements
              real mode execution. Thus 32-bit addressing and operands are supported,
              but paging and protected mode operations are not supported.

          Кем он использовался, не знаю. Как уже где-то на ГК заметили, в современных Виндах эмулятор, встроенный в HAL, используется, чтобы выполнять код функций BIOS, не переключаясь в реальный режим (в 64-битных системах это важно, потому что не покидая «длинный» режим, это сделать невозможно).

          • В NTVDM для Alpha, MIPS, PPC, как я уже заметил, был SoftPC. Код SoftPC и x86new из HAL совершенно разный.

          • Как отдельные продукты выпустили Virtual PC и Hyper-V.
          Ответить
          • Про HALTYNE, если интересно:
            /*++
            
            Copyright (c) 1994  DeskStation Technology, Inc.
            
            Module Name:
            
                xxbios.c
            
            Abstract:
            
                This module is an implementation of an 80286 emulator for performing
                video adapter initialization and INT 10 video BIOS calls.
            Ответить
          • > Кем он использовался, не знаю.
            Он использовался HAL для некоторых Alpha, MIPS и PPC, чтобы исполнять код BIOS от железок, предназначенных для PC.
            Ответить
            • Замечание про свободку: появление на рынке IBM PC, IBM XT, IBM AT с открытой архитектурой привело к тому, что китайцы начали массово клепать железки для IBM PC. В результате для машин на других процессорах (68K, AXP, MIPS, HP RISC, SPARC), но оснащённых разъёмами ISA, EISA или PCI найти железо, предназначенное для IBM PC, оказалось легче, чем родное. Даже в Микрософте сдались и встроили в HAL эмулятор 80x86, чтобы в «илитных» машинах можно было использовать железо от «свободной» платформы. Другие процессоры HAL почему-то не эмулировал.
              Ответить
              • Да, я тоже всегда читал про BIOSы в картах ISA и PCI и думал: а как же это так, ведь PCI вообще не зависит от PC, вон есть даже под PPC например, и драйвер PCI ни в одной ОС не завязан на конкретный проц, и вот на тебе
                Ответить
                • Я уже представил себе NT4 на машине с PPC и PCI. Там будет аж два эмулятора x86: один из HAL, обрабатывающий обращения к BIOS, второй из NTVDM, выполняющий досовские программы. У каждого из эмуляторов будут свои особенные глюки...

                  Кстати, почему в Windows не стали расшаривать код эмулятора, а взяли два разных?

                  Не менее интересно, как на таких машинах обстоят дела в других ОС. Они используют железо напрямую, в обход BIOS, встроенного в карту, или тоже содержат эмулятор, как NT? Достаточно ли крутая у них прошивка в своём ПЗУ, чтобы что-нибудь выводить в видеокарту до загрузки ОС?
                  Ответить
                  • Ну вероятно напрямую, да.
                    Ябло юзало PPC до 2006, но они точно знали что там за железо и могли вшиться вот хоть в firmware.

                    Как ведут себя другие я не знаю, да и есть ли они в 2018 году эти самые другие?
                    Кто последний раз видал sparc?
                    Ответить
                    • Рашен SPARC: http://mcst.ru/r1000
                      На нём сделан неубиваемый ноутбук: http://ineum.ru/nt-mcst4r Но ноутбуку эмулятор не нужен, потому что всё железо фиксированное.
                      Ответить
    • На правах офтопика. Покажу примеры кода из эмуляторов x86. В качестве примера возьму малоизвестную инструкцию AAM.

      Эмулятор из HAL:
      VOID
      XmAaaOp (
          IN PRXM_CONTEXT P
          )
      
      /*++
      
      Routine Description:
      
          This function emulates an aaa opcode.
      
      Arguments:
      
          P - Supplies a pointer to the emulation context structure.
      
      Return Value:
      
          None.
      
      --*/
      
      {
      
          ULONG Carry;
      
          //
          // If AL if greater than 9 or AF is set, then adjust ASCII result.
          //
      
          if (((P->Gpr[AX].Xl & 0xf) > 9) || (P->Eflags.AF != 0)) {
              Carry = (P->Gpr[AX].Xl > 0xf9);
              P->Gpr[AX].Xl = (P->Gpr[AX].Xl + 6) & 0xf;
              P->Gpr[AX].Xh += (UCHAR)(1 + Carry);
              P->Eflags.CF = 1;
              P->Eflags.AF = 1;
      
          } else {
              P->Gpr[AX].Xl &= 0xf;
              P->Eflags.CF = 0;
              P->Eflags.AF = 0;
          }
      
          return;
      }
      Ответить
      • Эмулятор из SoftPC (NTVDM):
        GLOBAL VOID
        AAM
                         
        IFN1(
        	IU32, op1
            )
        
        
           {
           IU8 temp_al;
        
           if ( op1 == 0 )
              Int0();
           
           SET_AH(GET_AL() / op1);
           SET_AL(GET_AL() % op1);
        
           /* set ZF,SF,PF according to result */
           temp_al = GET_AL();
           SET_ZF(temp_al == 0);
           SET_SF((temp_al & BIT7_MASK) != 0);
           SET_PF(pf_table[temp_al]);
        
           /* Set undefined flag(s) */
        #ifdef SET_UNDEFINED_FLAG
           SET_AF(UNDEFINED_FLAG);
           SET_OF(UNDEFINED_FLAG);
           SET_CF(UNDEFINED_FLAG);
        #endif
           }
        Ответить
      • Перепутал. Это была AAA.
        AAM из HAL выглядит так:
        VOID
        XmAamOp (
            IN PRXM_CONTEXT P
            )
        
        /*++
        
        Routine Description:
        
            This function emulates an aam opcode.
        
        Arguments:
        
            P - Supplies a pointer to the emulation context structure.
        
        Return Value:
        
            None.
        
        --*/
        
        {
        
            //
            // Unpack AL into AL and AH after multiplication by dividing by 10
            // and storing the quotient in AH and the remainder in AL.
            //
        
            P->Gpr[AX].Xh = P->Gpr[AX].Xl / P->SrcValue.Byte;
            P->Gpr[AX].Xl = P->Gpr[AX].Xl % P->SrcValue.Byte;
            P->Eflags.SF = (P->Gpr[AX].Xx >> 15) & 0x1;
            P->Eflags.ZF = (P->Gpr[AX].Xx == 0);
            P->Eflags.PF = XmComputeParity(P->Gpr[AX].Xx);
            return;
        }
        Ответить
        • Поехали!
          function XmAamOp (&$P) {
              $P->Gpr[$AX].Xh = $P->Gpr[$AX].Xl / $P->SrcValue.Byte;
              $P->Gpr[$AX].Xl = $P->Gpr[$AX].Xl % $P->SrcValue.Byte;
              $P->Eflags.SF = ($P->Gpr[$AX].Xx >> 15) & 0x1;
              $P->Eflags.ZF = ($P->Gpr[$AX].Xx == 0);
              $P->Eflags.PF = XmComputeParity($P->Gpr[$AX].Xx);
              return;
          }

          Если перепишем "HAL" на "PHP", то сможем установить "Windows" на "PHP".
          Ответить
          • Забыл, что в "PHP" при делении получится плавающий питух. Первая строчка тела функции должна выглядеть так:
            $P->Gpr[$AX].Xh = floor($P->Gpr[$AX].Xl / $P->SrcValue.Byte);
            Ответить
      • ААМ из HALTYNE (MIPS) (да, второй вариант эмулятора в HAL, итого третий) выглядит так:
        static VOID InstAAM()
        
         {
          AH = AL / 0x0A;
          AL = AL % 0x0A;
          ComputeFlags16(AX);
         }
        Ответить

    Добавить комментарий