Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[Win32] vxd call-ы: А еще немного, плиз !... 26.02.02 02:52 Число просмотров: 980
Автор: Chingachguk <Chingachguk> Статус: Member Отредактировано 26.02.02 06:25 Количество правок: 2
|
Спасибо !! Вроде бы забрезжил свет ...
Во-первых, я разобрался, как читать сектора, переработав код Zef-а:
; Чтение дискеты из win32
.data
StartSector dd 0 ; // starting logical sector number
wSectors dw 1 ; // number of sectors
PoBuffer dd ?
Buffer db 512 dup(0) ; // address of read/write buffer
;...
mov eax,7305h ; //DOS Abs_Disk_Read
mov dword ptr PoBuffer,offset Buffer
mov ebx, offset StartSector ; = (DWORD)&dio;
mov ecx,-1 ; // use DISKIO struct
mov esi,0 ;//Read (for write - 1)
mov edi,2 ; = bDrive - 1;
push ecx
push eax
push 0002a0010h ; 01 - VMM32.VXD, 10 ? - get system time
call dword ptr ORD_0001 ; VxDCall
xor eax,eax
mov ax,word ptr Buffer[512-2]
call PrintEAX ; Для контроля выводим aa55h - маркер boot-а
Мне тока непонятно, почему получается дискеты, ведь я говорил
(mov edi,2 ; = bDrive - 1; ) - диска("C").
> > - Могу я звать VxD так, как делает это kernel32 - > через > > int 30h ? > > только для конкретного билда > вызов-то происходит типа ARPL-exception из V86 mode > т.е. идет КОНКРЕТНАЯ привязка кодов запроса и адресов в > памяти VMM (int 30 обрабатывается в основном этой VxD) > вызывай через KERNEL32.ORD_1 - это работает ВЕЗДЕ
Все, я понял. Ориентируюсь на вызов VxD через kernel.
> > - И где мне описать этот VxDCall, раз в инклюде >> кернела моем его нет ?
> не по имени а по ординалу > пообщайся со своим линкером он тебе объяснит > у меня на ваткоме так: > > ASM> extrn myVxDCallFuckingThing :near > LNK> include myVxDCallFuckingThing kernel32.1
Ага, надо научиться подлинковать эту "kernel32.1". Понял. Но вот что я хотел
сделать-то:
- Научиться звать сервис VxD "Execute V86 Interrupt". Собсна, для доступа к секторам диска(дискеты)-int 13h.(Может, надо поискать такой сервис в апи ? Или прямо такой сервис в VxD ?). Так вот, я нашел сервис в VMM32:
(вызов сервиса)
dw 0001h ; ID VMM32.vxd
dw 0084h ; "Execute V86 interrupt" - Номер сервиса.
Или это тоже надо делать так, как я работал с "int 25h" ??? И откуда там это магическое "mov eax,7305h ; //DOS Abs_Disk_Read" ? А какое число будет, если Int 13h зовешь ?! Странно...
- А еще я хотел понять, кто реально работает с файлами. Что не кернел, я уже понял.(Например, кто обрабатывает дескрипторы и имена файлов).
> > - А как параметры передавать-то(для VxD) ?
> существует 0-4 таблицы экспортов в VxD > 1) V86 service table - документировано в DDK и еще в куче > мест > 2) WIN16 service table - документировано в DDK и почти > совпадает с V86 > 3) VxD service table - документировано неплохо в DDK > 4) WIN32 service table - не документировано НИГДЕ > > и это РАЗНЫЕ таблицы > > каждый исследует самостоятельно > есть пару книжек с кусочками рассказов кто что нарыл > > ps Я немного поэкспереметировал с этим ORD_0001 и
Если нетрудно, кинь мне(vzubko@mail.ru) ту доку, котрая мне поможет сделать Exec V86(или если есть прямой сервис для секторов, то для него). Или лучше DDK скачать ? (Меня его размер пугает - >30Мег).
> > Вроде работает, но с традиционным сообщением, причем > IP > > исключения = на следующей за последним int 3 командой. > Но > > это же не выход - адрес этого ORD так объявлять ... > > скажи мне чем и какими версиями ты собираешь - я тебе > подскажу конкретней
Примерно так:
\masm32\bin\ml /c /coff %1.asm > \masm32\bin\asmbl.txt
...
\masm32\bin\Link /SUBSYSTEM:WINDOWS %1.obj
Спасибо еще раз !!!
|
|
|