Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Это под мд98. А в 2000 есть аналогичный способ прыгнуть в r0? 14.02.02 06:37
Автор: Zef <Alloo Zef> Статус: Elderman
|
bool CallRing0(PVOID pvRing0FuncAddr, WORD wPortAddr, PDWORD pdwPortVal, BYTE bSize)
{
struct GDT_DESCRIPTOR *pGDTDescriptor;
struct GDTR gdtr;
WORD CallgateAddr[3];
WORD wGDTIndex = 1;
_asm Sgdt [gdtr]
// пропускаем "пустые" дескрипторы
pGDTDescriptor = (struct GDT_DESCRIPTOR *)(gdtr.dwGDTBase + 8);
// ищем свободный GDT дескриптор
for (wGDTIndex = 1; wGDTIndex < (gdtr.wGDTLimit >> 3); wGDTIndex++)
{
if (pGDTDescriptor->Type == 0 &&
pGDTDescriptor->System == 0 &&
pGDTDescriptor->DPL == 0 &&
pGDTDescriptor->Present == 0)
{
// Нашли! Теперь преобразуем его в шлюз вызова
struct CALLGATE_DESCRIPTOR *pCallgate;
pCallgate = (struct CALLGATE_DESCRIPTOR *) pGDTDescriptor;
pCallgate->Offset_0_15 = LOWORD(pvRing0FuncAddr);
pCallgate->Selector = 0x28;
pCallgate->ParamCount = 0;
pCallgate->Unused = 0;
pCallgate->Type = 0xc;
pCallgate->System = 0;
pCallgate->DPL = 3;
pCallgate->Present = 1;
pCallgate->Offset_16_31 = HIWORD(pvRing0FuncAddr);
// Вычисляем адрес вызова шлюза
CallgateAddr[0] = 0x0;
CallgateAddr[1] = 0x0;
CallgateAddr[2] = (wGDTIndex << 3) | 3;
// вызываем RING 0.
_asm Mov DX, [wPortAddr]
_asm Mov EBX, [pdwPortVal]
_asm Mov CL, [bSize]
_asm Call FWORD PTR [CallgateAddr]
// ну и далее убираем за собой
memset(pGDTDescriptor, 0, 8
return true;
}
// если не нашли, переходим к след.
pGDTDescriptor++;
}
// нет свободных!
return false;
}
|
|
Это под мд98. А в 2000 есть аналогичный способ прыгнуть в r0? 14.02.02 14:31
Автор: z0 <z0> Статус: Member
|
> pCallgate->Selector = 0x28;
вот тут надо быть очень осторожным
я даже так делал - искал несколько дыр в GDT и делал свои дескрипторы (вернее алиасы) для CS и SS с PL=0
> _asm Call FWORD PTR [CallgateAddr]
не забудь что для SS PL должен совпадать с PL CS
здесь есть такие решения:
1) все пройти на IF=0
2) дать свой SS но помнить что при аппаратном прерывании на PL=0 SS не перегружается автоматически
3) работать с SS_0 текущего TSS (для виндов он единственный вроде)
с моей практической точки зрения 2 и 3 варианты дают редкие/странные глюки под виндой
> // нет свободных!
а вот эту интереснейшая ситуация - сам видел многократно - разные версии чикаги дают разный начальный и по-разному меняют размер GDT более того возможны ситуации когда в системе не одна GDT и кстати ситуация теоретически разрешима бекапом каких-то позиций в GDT (например СВОИХ!!! CS/SS)
по-поводу NT/2000 - этот номер не пройдет по защите страниц и вообще никакой (проверено) такой номер не пройдет кроме очень билд-зависимых срывов стека (например при вызове int 2e)
я делал так: патчил NTLDR
но тебе же надо в прогу
|
| |
[Win32] Задача наша такая: 15.02.02 04:30
Автор: Zef <Alloo Zef> Статус: Elderman
|
собственно, мне нужно организовать низкоуровневый доступ к диску не перезагружая систему и не требуя прав админа
|
| | |
[Win32] Экстренный вопрос: 15.02.02 06:02
Автор: Zef <Alloo Zef> Статус: Elderman
|
нужно сотворить нечто подобное
прямо из 32разр. кода (не создавая и не загружая 16 dll)
les di, lpCallStruct ; Real mode call structure
int 31h ; Call DPMI
Вопрос: пойдет ли оттуда int и как сделать так, чтобы lpCallStruct загрузился в база:смещение виде?
можно, конечно базу грузить прямо в ES, а смещение в di, но как их получить из 32-разр. адреса?
|
| | | |
[Win32] Экстренный вопрос: 15.02.02 10:39
Автор: Chingachguk <Chingachguk> Статус: Member Отредактировано 15.02.02 10:51 Количество правок: 2
|
> нужно сотворить нечто подобное > прямо из 32разр. кода (не создавая и не загружая 16 dll) > les di, lpCallStruct ; Real mode call structure > int 31h ; Call DPMI > Вопрос: пойдет ли оттуда int и как сделать так, чтобы > lpCallStruct загрузился в база:смещение виде? > можно, конечно базу грузить прямо в ES, а смещение в di, но > как их получить из 32-разр. адреса?
У сервиса int 31h есть ф-ция - получить линейный адрес по селектору и наоборот(назад немного сложнее).
В досе CallStruc я в селектор кидал то, что DPMI засовывало в DS при переключении(lim=64K и т.д.), offset = обычный оффсет:
mov bl,16h ; Call int 16h
mov byte ptr CallDPMIS.RegEAX+1,0 ; reg ah=0h
lahf
and ah,0feh
mov bh,ah
mov cx,0
mov di,offset CallDPMIS
and edi,0ffffh
push ds
pop es
mov ax,0300h
int 31h
jnc @CallV86
Я думаю, из 32 надо кидать в DI обычный оффсет, селектор и так в порядке, DPMI(а точнее, винда) сама разберется. Ж)
ЗЫ А исчо есть апи такая - вызвать прерывание реального режима, так на дискетку "царапины" для защиты записывают. Я про int 25h/26h на 99.666% уверен, что можно.
|
| | | | |
[Win32] Так, уже теплее, но: 15.02.02 10:48
Автор: Zef <Alloo Zef> Статус: Elderman
|
А как int 31h из 32-разрядной проги вызвать? При любой попытке я получаю "синяк" или вылетаю в WinIce (если он загружен)
|
| | | | | |
[Win32] Так, уже теплее, но: 15.02.02 12:43
Автор: z0 <z0> Статус: Member
|
> А как int 31h из 32-разрядной проги вызвать? При любой > попытке я получаю "синяк" или вылетаю в WinIce (если он > загружен)
это смотря какая прога
если win32 - не выйдет
если dos32 (екстендеры всякие включая самодельные) - сколько угодно и из-под любой винды (у win3.x были некоторые (небольшие) проблемы с DPMI)
сделай две проги и организуй обмен
|
| | | | | | |
[Win32] Войдет и выйдет, но: 15.02.02 13:03
Автор: Zef <Alloo Zef> Статус: Elderman
|
|
| | | | | | | |
[Win32] Че-то не понял, почему мою месягу обрезало? 18.02.02 05:15
Автор: Zef <Alloo Zef> Статус: Elderman
|
Я хотел сказать, что есть такая бяка - VWIN32_DIOC_DOS_INT25/26 в DeviceIoControl, но вот проблема: для ее работы нужен хендёл устройства, но в 95 его можно получить тока для файла, а что делать, если нужен диск?
|
| | | | | | | | |
[Win32] Все у Гейтса через Ж: 18.02.02 05:38
Автор: Zef <Alloo Zef> Статус: Elderman
|
Оказывется, чтобы получить хендл для доступа к дискам под 95 надо сделать так:
hDevice = CreateFile("\\\\.\\vwin32",...
|
| | | | | | | | | |
[Win32] Опять не то! Помогите, загибаюсь!!! 18.02.02 14:26
Автор: Zef <Alloo Zef> Статус: Elderman
|
Короче, нужно читать на прямую с сидюка под МД95/98, а еще лучше сделать аналог НТёвой IOCTL_CDROM_RAW_READ, чтобы все сидело в одном .ехе-файле и ни каких драйверов или 16бит дллок не писать!
|
| | | | | | | | | | |
[Win32] Опять не то! Помогите, загибаюсь!!! 18.02.02 17:11
Автор: z0 <z0> Статус: Member
|
> Короче, нужно читать на прямую с сидюка под МД95/98, а еще > лучше сделать аналог НТёвой IOCTL_CDROM_RAW_READ, чтобы все > сидело в одном .ехе-файле и ни каких драйверов или 16бит > дллок не писать!
ну и пиши
чем тебе помочь-то конкретно?
может тебе доку по MSCDEX кинуть?
|
| | | | | | | | | | | |
[Win32] Доку бы хорошо, а еще: кто из корифеев знает? 19.02.02 04:12
Автор: Zef <Alloo Zef> Статус: Elderman Отредактировано 19.02.02 04:14 Количество правок: 1
|
а то вчера весь Инет прогуглил, а вразумительной доки по Int 2F не нашел. А вообще проблема в том, что все известные мне способы обращения к CD в 95-й кривы: либо пиши 16бит дллку, к-рая будет работать через Int 2F, а к ней еще один файл - 32/16 thunk и через него из 32бит - проги обращайся (стандартный путь, предлагаемый МД), либо делай "незаконный" прыжок в Ring0 и оттуда...
Но но для прыжка может не найтись свободного дескриптора (см выше).
А вот, как чтобы одним файлом, и всегда срабатывало?
Есть правда мысль: скопировать Таблицу Дескрипторов на новое место, затем добавить к ней Дескриптор Шлюза, а потом подменить указатель на системную таблицу своим. Только как? И сработает ли? Кто из корифеев подскажет?
|
| | | | | |
[Win32] Так, уже теплее, но: 15.02.02 10:52
Автор: Chingachguk <Chingachguk> Статус: Member Отредактировано 15.02.02 10:54 Количество правок: 1
|
> А как int 31h из 32-разрядной проги вызвать? При любой > попытке я получаю "синяк" или вылетаю в WinIce (если он > загружен)
ЗЫ А исчо есть апи такая - вызвать прерывание реального режима, так на дискетку "царапины" для защиты записывают. Я про int 25h/26h на 99.666%
уверен. Так парень один делал в конторе по защите данных. Из си плюса-плюса.
|
|
На то и 2000, чтобы не прыгали в r0 14.02.02 10:51
Автор: ukv Статус: Незарегистрированный пользователь
|
В правильно написанной многопользовательской операционке gdt не то что на запись, но и на чтение не должна быть доступна (за исключением штатной загрузки селекторов аппаратным образом). Если нет дырок в софте, уже работающем под r0, то шансов нет.
|
| |
На то и 2000, чтобы не прыгали в r0 14.02.02 16:55
Автор: Sandy <Alexander Stepanov> Статус: Elderman Отредактировано 14.02.02 16:56 Количество правок: 1
|
> В правильно написанной многопользовательской операционке > gdt не то что на запись, но и на чтение не должна быть > доступна (за исключением штатной загрузки селекторов > аппаратным образом). Если нет дырок в софте, уже работающем > под r0, то шансов нет.
Не совсем понятно в части "gdt не то что на запись, но и на чтение не должна быть доступна". Недоступна кому? Если пользовательским аппликациям - то это так и есть. А если самому ядру - каким образом готовить дескрипторы для переключения контекста при передаче кванта процессорного времени создаваемому процессу? Здесь как ни крути, а планировщик ДОЛЖЕН иметь возможность и читать и писать в GDT.
|
|
|