информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Страшный баг в WindowsЗа кого нас держат?Все любят мед
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[Win32] Как вызвать Int 2f: я как раз счас это изучаю... 22.02.02 02:45  Число просмотров: 1032
Автор: Chingachguk <Chingachguk> Статус: Member
<"чистая" ссылка>
Я полный чайник в винде, но счас как раз это все изучаю.

Вот что я пока напарил по этому вопросу:

- в дельфи и сях точно(или почти точно есть ф-ции типа "Эмулировать прерывание реального режима". Ей пероедается структура из регистров, которые подсовываются в момент его вызова) По крайней мере, люди так звали Int 25h/26h и int 21h;

- Сначала я думал, что эта хрень просто апи из kernel-а или юзера.dll или исчо откуда, но, посмотрев свои inc-и, думаю, что это не так.

- Есть такая шняга, как VxD. Они бывают статические и динамические, последние может грузить win32-код через CreateFile(\\..\имя_vxd) и по хэндлу работать с ними.

- Я нашел, что между собой они могут общаться через int 20h:

int 20h
dw Номер сервиса нужного VxD
dw ID VxD

Например, vmm32.vxd можно звать так:

dw 1h - Это ее ID;
dw 084h - Это ее сервис, "Execute V86 mode interrupt"

Как они параметры(регистры для execut-а) друг другу передают - хз.

- Трабл в том, что так могут звать друг друга ТОЛЬКО vxd, а мы грим о win32 коде. Но отрадно то, что в отладчике, написав в win32 такой вызов, я увидел именно это: VxDCall 0001 0084 !

- Для юзеровских прог есть вроде такая вещь, как DeviceIoControl.
Вроде бы можно динамическую vxd так загрузить, но на своем примере я так и не смог пока открыть через CreateFile ни одну VxD, блин :(((((

Вот так.
Буду признателен, если сможешь чем-то просвятить меня по этому поводу.
Спасибо.

<programming>
[Win32] Как вызвать Int 2f 1508 из 32бит кода в 95/98???!!! 21.02.02 08:12  
Автор: Zef <Alloo Zef> Статус: Elderman
Отредактировано 21.02.02 08:13  Количество правок: 1
<"чистая" ссылка>
[Win32] Как вызвать Int 2f 1508 из 32бит кода в 95/98???!!! 22.02.02 23:31  
Автор: z0 <z0> Статус: Member
<"чистая" ссылка>
существует много способов заставить бегемота танцевать польку-бабочку
выбирай:
1) EXE-сателлит DOS16
просто, надежно, медленно, обмен через файл
2) DLL-сателлит WIN16
нужен 32->16->32 thunk, может не работать int2f, обмен через память
3) DYNAMIC VXD-сателлит
трудно и долго кодить-отлаживать, обмен идеальный
4) RING0 код в твоей проге
на соискание научной степени "доктор хакерских наук"

все сателлиты можно хранить прямо в екзешнике и поэтому естественно допускается любая степень шифрования
[Win32] Как вызвать Int 2f: я как раз счас это изучаю... 22.02.02 02:45  
Автор: Chingachguk <Chingachguk> Статус: Member
<"чистая" ссылка>
Я полный чайник в винде, но счас как раз это все изучаю.

Вот что я пока напарил по этому вопросу:

- в дельфи и сях точно(или почти точно есть ф-ции типа "Эмулировать прерывание реального режима". Ей пероедается структура из регистров, которые подсовываются в момент его вызова) По крайней мере, люди так звали Int 25h/26h и int 21h;

- Сначала я думал, что эта хрень просто апи из kernel-а или юзера.dll или исчо откуда, но, посмотрев свои inc-и, думаю, что это не так.

- Есть такая шняга, как VxD. Они бывают статические и динамические, последние может грузить win32-код через CreateFile(\\..\имя_vxd) и по хэндлу работать с ними.

- Я нашел, что между собой они могут общаться через int 20h:

int 20h
dw Номер сервиса нужного VxD
dw ID VxD

Например, vmm32.vxd можно звать так:

dw 1h - Это ее ID;
dw 084h - Это ее сервис, "Execute V86 mode interrupt"

Как они параметры(регистры для execut-а) друг другу передают - хз.

- Трабл в том, что так могут звать друг друга ТОЛЬКО vxd, а мы грим о win32 коде. Но отрадно то, что в отладчике, написав в win32 такой вызов, я увидел именно это: VxDCall 0001 0084 !

- Для юзеровских прог есть вроде такая вещь, как DeviceIoControl.
Вроде бы можно динамическую vxd так загрузить, но на своем примере я так и не смог пока открыть через CreateFile ни одну VxD, блин :(((((

Вот так.
Буду признателен, если сможешь чем-то просвятить меня по этому поводу.
Спасибо.

[Win32] О том, как заюзать int 21/25/26 см. мой предыдущий сабж. 22.02.02 06:03  
Автор: Zef <Alloo Zef> Статус: Elderman
<"чистая" ссылка>
[Win32] Не ткнешь носом ?.. 22.02.02 11:56  
Автор: Chingachguk <Chingachguk> Статус: Member
<"чистая" ссылка>
Я посмотрел еще раз тему
"На то и 2000, чтобы не прыгали в r0"

Но, кроме числа слэшей вот тут:

; Оказывется, чтобы получить хендл для доступа
; к дискам под 95 надо сделать так:
; hDevice = CreateFile("\\\\.\\vwin32",...

(4 а не 2)

ничего не нашел :(

Так как же звать ф-ции VxD(Хотя бы стандартных, vmm32, хотя бы) ?...
[Win32] vxd call-ы 22.02.02 17:24  
Автор: z0 <z0> Статус: Member
Отредактировано 22.02.02 17:43  Количество правок: 1
<"чистая" ссылка>
> Но, кроме числа слэшей вот тут:

число слешей зависит от языка на котором кодишь
на асме - 2 (и на самом деле)
на си - 4

а по-поводу vxd call - по-моему так дохрена на эту тему написано...
[Win32] vxd call-ы: Так не выходит... 23.02.02 02:43  
Автор: Chingachguk <Chingachguk> Статус: Member
Отредактировано 23.02.02 02:47  Количество правок: 1
<"чистая" ссылка>
> > Но, кроме числа слэшей вот тут:
>
> число слешей зависит от языка на котором кодишь
> на асме - 2 (и на самом деле)
> на си - 4
>
> а по-поводу vxd call - по-моему так дохрена на эту тему
> написано...

Вот код примера. С его помощью я пытаюсь позвать vmm32.vxd, загрузив его CreateFile. Пробовал также и другие vxd, например, hasp95.vxd от 1C(для защиты):

.data
VxDName db "\\.\VMM32.VXD",0

Success db "The VxD is successfully loaded!",0
Failure db "The VxD is not loaded!",0
Unload db "The VxD is now unloaded!",0
MsgTitle db "DeviceIoControl Example",0

MsgText db "I'm called from a VxD!",0
InBuffer dd offset MsgTitle
dd offset MsgText
;...
.code
start:

invoke CreateFile,addr VxDName,0,0,0,0,FILE_FLAG_DELETE_ON_CLOSE,0
.if eax!=INVALID_HANDLE_VALUE
mov hVxD,eax
invoke MessageBox,NULL,addr Success,addr AppName,MB_OK+MB_ICONINFORMATION
invoke DeviceIoControl,hVxD,1,addr InBuffer,8,NULL,NULL,NULL,NULL
invoke CloseHandle,hVxD

invoke MessageBox,NULL,addr Unload,addr AppName,MB_OK+MB_ICONINFORMATION
.else
invoke MessageBox,NULL,addr Failure,NULL,MB_OK+MB_ICONERROR
.endif
;...
И мне всегда выдается, что vxd "The VxD is not loaded!"...

Про то, что надо задавать полное имя до файла(C:\WIN..), я проходил ...

Либо мне попадались статические VxD, которые нельзя грузить из win32-приложений, либо вообще нихрена не понимаю Ж(((
[Win32] vxd call-ы: пояснения 24.02.02 02:47  
Автор: z0 <z0> Статус: Member
<"чистая" ссылка>
> Либо мне попадались статические VxD, которые нельзя грузить
> из win32-приложений, либо вообще нихрена не понимаю Ж(((

вполне может быть что попадались статические
vmm32 уж точно статическая ;-)))
попробуй точно динамическую, например VXDMON или из этой же серии
и загружать я бы посоветовал не так как ты делаешь
> CreateFile(addr VxDName,0,0,0,0,FILE_FLAG_DELETE_ON_CLOSE,0)
а вот так:
CreateFile(addr VxDName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0)

с vmm32 (и не только) из win32-application работать надо по-другому - вызывать kernel32.1(dword VxdCall, parameters...) где VxdCall в младшем слове содержит номер ф-ии VXD сервиса а в старшем слове номер VXD по микрософт-утвержденному списку
это будут вызываться ф-ии именно доступные для вызова из win32 ring3 code
например:
--------------------------- test.asm ------------------------
.386

extrn VxDCall :near
extrn ExitProcess :near

code32 segment use32 para private 'code'
assume cs:code32
assume ds:data32
entry_point:
db 0cch ; стартуем
push 1000h ; задержка в ?секундах
push dword 0002a0009h ; 2a - VWIN32.VXD, 9 - sleep
call VxDCall
db 0cch ; сюда трапится после sleep-а
exit:
push dword 0
call ExitProcess
code32 ends

data32 segment use32 para private 'data'
string db 'some data here',0
data32 ends

end entry_point
------------------------------------------------------------------
еще раз напомню - VxDCall импортируется по ординалу == 1

так можно работать с уже загруженными VXD хоть статическими хоть динамическими лишь бы у них был WIN32 RING3 service декларирован
[Win32] vxd call-ы: А еще немного, плиз !... 25.02.02 03:24  
Автор: Chingachguk <Chingachguk> Статус: Member
Отредактировано 25.02.02 04:26  Количество правок: 1
<"чистая" ссылка>
> .386
> extrn VxDCall :near
> ;...
> entry_point:
> db 0cch ; стартуем
> push 1000h ; задержка в ?секундах
> push dword 0002a0009h ; 2a - VWIN32.VXD,
> 9 - sleep
> call VxDCall
> db 0cch ; сюда трапится после sleep-а
> exit:
>;...
> еще раз напомню - VxDCall импортируется по ординалу == 1
>
> так можно работать с уже загруженными VXD хоть статическими
> хоть динамическими лишь бы у них был WIN32 RING3 service
> декларирован

Скажи, плиз, что есть это VxDCall ?
Я правильно понял, что это что-то вроде апи кернела, через который я зову VxD ?

В отладчике я видал, как кернел зовет какой-то сервис VMM:

push ecx
push eax
push 002A0010h
call Kerenel32!Ord_0001 ->

-> mov eax,[esp+4]
pop dword ptr [esp]
call far cs:[BFFC9734] - >

-> int 30h

Вопросы:
- Я правильно понимаю, что Этот Kernel32!Ord_0001 и есть VxDCall из твоего примера ?;
- Могу я звать VxD так, как делает это kernel32 - через int 30h ?
- И где мне описать этот VxDCall, раз в инклюде кернела моем его нет ?
- А как параметры передавать-то(для VxD) ? Класть в стек тоже особым способом ?

Спасибо.

ps Я немного поэкспереметировал с этим ORD_0001 и твоим кодом:

.data
ORD_0001 dd 0BFF713D4h ; Эту адресу я узнал в отладчике
;...
db 0cch ; стартуем
push 1000h ; задержка в ?секундах
push 0002a0009h ; 2a - VWIN32.VXD, 9 - sleep
call dword ptr ORD_0001 ; VxDCall
db 0cch ; сюда трапится после sleep-а

Вроде работает, но с традиционным сообщением, причем IP исключения = на следующей за последним int 3 командой. Но это же не выход - адрес этого ORD так объявлять ...
[Win32] vxd call-ы: А еще немного, плиз !... 25.02.02 21:46  
Автор: z0 <z0> Статус: Member
<"чистая" ссылка>
> Скажи, плиз, что есть это VxDCall ?
> Я правильно понял, что это что-то вроде апи кернела, через
> который я зову VxD ?

все не просто а очень просто. смотри:
1) все толковое в системе делается в VxD-шках
2) win32 прога имеет право общаться только с DLL-ками - своими и системными
3) как же тогда она работает?
4) значит системным DLL как-то можно общаться с VxD
5) чтоб юзер туда не лазил это просто НЕ ДОКУМЕНТИРОВАЛИ и не дали экспорта по имени

>
> В отладчике я видал, как кернел зовет какой-то сервис VMM:
>
> push ecx
> push eax
> push 002A0010h
> call Kerenel32!Ord_0001 ->
>
> -> mov eax,[esp+4]
> pop dword ptr [esp]
> call far cs:[BFFC9734] - >
>
> -> int 30h
>
> Вопросы:
> - Я правильно понимаю, что Этот Kernel32!Ord_0001 и есть
> VxDCall из твоего примера ?;

конечно

> - Могу я звать VxD так, как делает это kernel32 - через
> int 30h ?

только для конкретного билда
вызов-то происходит типа ARPL-exception из V86 mode
т.е. идет КОНКРЕТНАЯ привязка кодов запроса и адресов в памяти VMM (int 30 обрабатывается в основном этой VxD)
вызывай через KERNEL32.ORD_1 - это работает ВЕЗДЕ

> - И где мне описать этот VxDCall, раз в инклюде кернела
> моем его нет ?

не по имени а по ординалу
пообщайся со своим линкером он тебе объяснит
у меня на ваткоме так:

ASM> extrn myVxDCallFuckingThing :near
LNK> include myVxDCallFuckingThing kernel32.1

> - А как параметры передавать-то(для 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 и твоим
> кодом:
>
> .data
> ORD_0001 dd 0BFF713D4h ; Эту адресу я узнал в отладчике
> ;...
> db 0cch ; стартуем
> push 1000h ; задержка в ?секундах
> push 0002a0009h ; 2a - VWIN32.VXD, 9 - sleep
> call dword ptr ORD_0001 ; VxDCall
> db 0cch ; сюда трапится после sleep-а
>
> Вроде работает, но с традиционным сообщением, причем IP
> исключения = на следующей за последним int 3 командой. Но
> это же не выход - адрес этого ORD так объявлять ...

скажи мне чем и какими версиями ты собираешь - я тебе подскажу конкретней
[Win32] vxd call-ы: А еще немного, плиз !... 26.02.02 02:52  
Автор: 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

Спасибо еще раз !!!
[Win32] vxd call-ы: А еще немного, плиз !... 26.02.02 08:43  
Автор: z0 <z0> Статус: Member
Отредактировано 26.02.02 08:49  Количество правок: 1
<"чистая" ссылка>
кидаю тебе конкретный кусок доки из ДДК который тебе нужен
там есть все 2f и куча VxD-VxD function & messages

а здесь я вот что скажу:
вся беда в том что Win32 VxD services очень убоги по составу
вся круть в нормальных VxD-VxD сервисах
но как их вызвать из обычной проги? принцип такой - пишем малипусенький VxD который сами грузим и открываем с ним DeviceIoControl-канал
ему даем VxD service запрос - он уже вызывает любую нужную VxD и нам отдает результаты
такая прога может РЕАЛЬНО ПОЧТИ ВСЕ
могу показать такой фокус на асме конечно

ЗЫ: для НТ это все тоже так но пишется не VxD а SYS
[Win32] vxd call-ы: Большое спасибо !!! 26.02.02 15:06  
Автор: Chingachguk <Chingachguk> Статус: Member
<"чистая" ссылка>
> кидаю тебе конкретный кусок доки из ДДК который тебе нужен
> там есть все 2f и куча VxD-VxD function & messages

Да, спасибо ! Правда, дошло не все - ящик маловат оказался, ж...
Если нетрудно, кинь в этот - chingachguk_new@mail.ru - я его специально под это дело завел :)

> а здесь я вот что скажу:
> вся беда в том что Win32 VxD services очень убоги по
> составу
> вся круть в нормальных VxD-VxD сервисах
> но как их вызвать из обычной проги? принцип такой - пишем
> малипусенький VxD который сами грузим и открываем с ним
> DeviceIoControl-канал
> ему даем VxD service запрос - он уже вызывает любую нужную
> VxD и нам отдает результаты
> такая прога может РЕАЛЬНО ПОЧТИ ВСЕ
> могу показать такой фокус на асме конечно

Да, кинь тоже на мыло фокус. Хотя я, наверное, сам смогу, но не повредит в любом случае !!!

Я понял, нужна такая прокладка... Ага, и там делаем эти int 20h и типа этого... Спасибо !

> ЗЫ: для НТ это все тоже так но пишется не VxD а SYS

А насколько тяжело будет из исходника для VxD заделать этот SYS, если что ?
[Win32] vxd call-ы: Большое спасибо !!! 26.02.02 16:00  
Автор: z0 <z0> Статус: Member
<"чистая" ссылка>
> А насколько тяжело будет из исходника для VxD заделать этот
> SYS, если что ?

это уже глобально
здесь надо применить метод двойной прокладки:
1) ДЛЛ со всеми хитрозадыми ф-иями в экспортах
2) в ее ините - GetVersionEx
3) в зависимости от результата - загрузка или VxD или SYS
4) а интерфейсная часть на DeviceIoControl одна
5) соответсвенно в драйверах под нее подстаиваться

так делается много чего - например драйвера для хаспа и т.д.
[Win32] vxd call-ы: Большое спасибо !!! 26.02.02 16:17  
Автор: Chingachguk <Chingachguk> Статус: Member
<"чистая" ссылка>
> > А насколько тяжело будет из исходника для VxD заделать
> этот
> > SYS, если что ?
>
> это уже глобально
> здесь надо применить метод двойной прокладки:
> 1) ДЛЛ со всеми хитрозадыми ф-иями в экспортах
> 2) в ее ините - GetVersionEx
> 3) в зависимости от результата - загрузка или VxD или SYS
> 4) а интерфейсная часть на DeviceIoControl одна
> 5) соответсвенно в драйверах под нее подстаиваться
>
> так делается много чего - например драйвера для хаспа и
> т.д.

Да, мне пока рановато это делать... Но как-нить дойду и до этого !

Большое спсибо за все разъяснения.
В других местах ограничились общими рекомендациями.

ps А шли мне на chingachguk_new@mail, ибо в первом ящике 304кила всего.
[win32] ищи в msdn вот это:vwin32_dioc_dos_ioctl 22.02.02 12:18  
Автор: Zef <Alloo Zef> Статус: Elderman
<"чистая" ссылка>
я делал так:
typedef struct _DIOC_REGISTERS {
DWORD reg_EBX;
DWORD reg_EDX;
DWORD reg_ECX;
DWORD reg_EAX;
DWORD reg_EDI;
DWORD reg_ESI;
DWORD reg_Flags;
} DIOC_REGISTERS, *PDIOC_REGISTERS;
typedef struct _DISKIO
{
DWORD dwStartSector; // starting logical sector number
WORD wSectors; // number of sectors
DWORD dwBuffer; // address of read/write buffer
} DISKIO, * PDISKIO;
BOOL ReadLogicalSectors (HANDLE hDev, BYTE bDrive, DWORD dwStartSector,
WORD wSectors, LPBYTE lpSectBuff)
{
BOOL fResult;
DWORD cb;
DIOC_REGISTERS reg = {0};
DISKIO dio = {0};
dio.dwStartSector = dwStartSector;
dio.wSectors = wSectors;
dio.dwBuffer = (DWORD)lpSectBuff;
reg.reg_EAX = 0x7305; //DOS Abs_Disk_Read
reg.reg_EBX = (DWORD)&dio;
reg.reg_ECX = -1; // use DISKIO struct
reg.reg_ESI = 0;//Read (for write - 1)
reg.reg_EDI = bDrive - 1;
fResult = DeviceIoControl(hDev, VWIN32_DIOC_DOS_IOCTL,
®, sizeof(reg),
®, sizeof(reg), &cb, 0);
// Determine if the DeviceIoControl call and the read succeeded.
fResult = fResult && !(reg.reg_Flags & CARRY_FLAG);
return fResult;
}
хендл получал вышеописанным способом. Винт оно читает, CD - нет
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach