Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2003.07.28;
Скачать: [xml.tar.bz2];

Вниз

Dispatch_Level   Найти похожие ветки 

 
kravchuk   (2003-05-15 15:42) [0]

Добрый день, мне необходимо вызвать процедуру ( PoRegisterDeviceForIdleDetection), в ее описании написано " must be running at IRQL < DISPATCH_LEVEL", что это значит, и как это осуществить на делфи? Насколько я понял это какой то уровень на котором работают драйвера.
Спасибо
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/kmarch/hh/kmarch/portn_14he.asp


 
Ihor Osov'yak   (2003-05-15 16:33) [1]

Из делфи - никак. Мало того, из user mode также никак..


 
kravchuk   (2003-05-15 16:57) [2]

Неужели не существует никакой возможности написать драйвер режима ядра на делфи? :-\


 
Morfein   (2003-05-15 17:06) [3]

Какой догадливый... а чем тебе C++ для разработки не годится? Вместе с отладчиком NuMega SoftIce поставляется чудный комплект для разработки драйверов... с неплохим хелпом.


 
Игорь Шевченко   (2003-05-15 17:11) [4]

kravchuk © (15.05.03 16:57)

И никогда не будет существовать :)


 
kravchuk   (2003-05-15 17:34) [5]

>Morfein © (15.05.03 17:06)
Не нравиться только тем, что я очень плохо C++ и некогда разбираться :(

Может есть какие-то готовые шаблоны или типа того, куда можно приколбасить свою функциональность? Например как WinDriver http://www.vardaan.com/windriver.htm тока подешевле (т.е. на шару :)


 
Ihor Osov'yak   (2003-05-15 17:42) [6]

2 kravchuk ©

А ты DDK юзай и с без плюсов... Вполне хватает..
Скажу по секрету, с ddk удовольствия более чем достаточно, это я на предложение об разборке с библиотекой от нумеги и тд и тп.. Хотя софтайса - вещь неземенимая..


 
kravchuk   (2003-05-15 17:50) [7]

>Ihor Osov"yak © (15.05.03 17:42)
у меня немного другое направление работы, и не хочу потратить месяц для вызова одной ф-ии (PoRegisterDeviceForIdleDetection), тем более нет 100% что это решит мою проблему. хотел как обычно быстро ( при работе с делфи) взять и з аденек нашлепать.

Если у кого возникнет идея как это сделать, чтобы не вникать в подробности функционирования кернел- драйверов буду премного благодарен :)


 
Morfein   (2003-05-15 18:46) [8]

Пожалста... как тут недавно в какой-то ветке упоминал Digitman, существует "официальная" дыра, позволяющая попадать с кольца 3 на нулевое кольцо... http://www.wasm.ru тут можно почитать по-подробнее... Плюсы: твори что хочешь; минусы: только Win32 и текст весь ассемблерный...


 
Ihor Osov'yak   (2003-05-15 19:23) [9]

2 Morfein © (15.05.03 18:46)
Не дыра, а шлюз..
А как функции апи ядра из вин32 вызывать подробно в Шрейбера описано.. Но что это тебе даст - не пойму.. Посмотри на параметры этой функции повнимательней - что ты ей передавать будешь...

.. Может по человечески скажешь, что ты сделать хочешь..


 
NightAngel   (2003-05-15 23:53) [10]

> Morfein © (15.05.03 18:46)
Пожалста... как тут недавно в какой-то ветке упоминал Digitman, существует "официальная" дыра, позволяющая попадать с кольца 3 на нулевое кольцо...


Только не на Win2k.

> kravchuk © (15.05.03 15:42)
Если у кого возникнет идея как это сделать, чтобы не вникать в подробности функционирования кернел- драйверов буду премного благодарен :)

Без написания драйвера никак.


 
Ihor Osov'yak   (2003-05-16 00:41) [11]

> Только не на Win2k.

Int 2Eh для интел-платформ? Но если быть точным - то так можно только для NativeAPI режима ядра.. То есть спич о том, чтобы инициализировать выполнение любого кода в нулевом кольце, находясь на 3 кольце вести нельзя.. (понятно, штатный режим взаимодействия с драйверами не рассматриваем)...


 
Digitman   (2003-05-16 08:19) [12]


> Morfein


"Дыра" Маздайная не в том, что позволяет через шлюзы "нырять" в Ring0 (это доступно не только в Маздайной линейке - в любой ОС c Win32-платформой), а в том, что позволяет прямой доступ к GDT, LDT, IDT.
"Настрогал" ты в GDT/IDT нужные дескрипторы - и ходи туда-сюда, из одного кольца в другое, сколько душе будет угодно)


 
Digitman   (2003-05-16 08:24) [13]

program Ring0demo;

uses
Windows,
PM in "PM.pas";

var
idtr: TSegmentInfo;
old_gate, new_gate: TIDTEntry;
VerInfo: DWord;
IsNTplatform: Boolean;
MajorVersion, MinorVersion: Byte;
BuildNo: Word;
VerInfoStr: String;

этот пример давно уже "гуляет" в сети, наглядно демонстрируя "дырявость" маздайной линейки ОС :


//обработчик прерывания - процедура шлюза - выполняется с PL0
//маленький видеоэффект, демонстрирующий прямую работу с портами
procedure VideoMemScrolling;
asm
push eax
push ebx
push ecx
push edx
push esi

mov edx, $3D4
mov al, $C
out dx,al
mov edx, $3D5
in al, dx
mov bh, al
mov edx, $3D4
mov al, $D
out dx,al
mov edx, $3D5
in al, dx
mov bl, al
mov esi, ebx

sub ebx,ebx
mov ecx, 3000

@demo:
mov edx, $3D4
mov al, $C
out dx,al
mov edx, $3D5
mov al, bh
out dx,al
mov edx, $3D4
mov al, $D
out dx,al
mov edx, $3D5
mov al, bl
out dx,al
inc ebx
push ecx
mov ecx, $10000
@@1:
loop @@1
pop ecx
loop @demo

mov ebx, esi
mov edx, $3D4
mov al, $C
out dx,al
mov edx, $3D5
mov al, bh
out dx,al
mov edx, $3D4
mov al, $D
out dx,al
mov edx, $3D5
mov al, bl
out dx,al

pop esi
pop edx
pop ecx
pop ebx
pop eax
iretd
end;

function IntToStr(Value: Integer): String;
var
Remainder: Integer;
begin
Result := "";
repeat
Remainder := Value mod 10;
Value := Value div 10;
Result := char(Remainder + 48) + Result;
until Value = 0;
end;


begin
//чтение информации о версии ОС
VerInfo := GetVersion;
IsNTplatform := VerInfo < $80000000;
VerInfo := VerInfo and $7FFFFFFF;
MajorVersion := LoByte(LoWord(VerInfo));
MinorVersion := HiByte(LoWord(VerInfo));
BuildNo := HiWord(VerInfo);
VerInfoStr := "OS platform : ";
if IsNTplatform then
VerInfoStr := VerInfoStr + "NT"
else begin
VerInfoStr := VerInfoStr + "Win32";
if MajorVersion < 4 then
VerInfoStr := VerInfoStr + "s (with Win 3.x)"
else begin
VerInfoStr := VerInfoStr + "s (Win9x)";
BuildNo := 0;
end;
end;
VerInfoStr := VerInfoStr + #10"MajorVersion : " + IntToStr(MajorVersion);
VerInfoStr := VerInfoStr + #10"MinorVersion : " + IntToStr(MinorVersion);
VerInfoStr := VerInfoStr + #10"BuildNumber : " + IntToStr(BuildNo);
if IsNTplatform then
VerInfoStr := VerInfoStr + #10#10"Для работы приложения требуется ОС Win9x !"
else
VerInfoStr := VerInfoStr + #10#10"Нажмите ОК для старта демо...";
MessageBox(0, PChar(VerInfoStr), "Ring0 demo", MB_OK);
if IsNTplatform or (MajorVersion < 4) then
Exit;

// с ОС - порядок, начинаем подготовку к переходу на PL0
asm
//--------сохраним регистры ---------------------------
push ebx
push esi
push edi
//--------готовим новый дескриптор шлюза -----------------
mov eax, offset VideoMemScrolling
mov [new_gate.OffsetLo], ax
shr eax,16
mov [new_gate.OffsetHi], ax
mov [new_gate.Selector], $28
mov [new_gate.Params], 0
mov [new_gate.Access], $EE
//--------читаем инф-цию о сегменте IDT---------------------
sidt idtr
mov ebx, [idtr.Base]
add ebx, 8 * 9 // 9-е прерывание взято "от фонаря"
//--------сохраняем старый вектор прерывания ---------------
mov edi, offset old_gate
mov esi, ebx
cld
movsd
movsd
//--------устанавливаем новый вектор прерывания ---------------
mov edi, ebx
mov esi, offset new_gate
movsd
movsd
//--------входим в шлюз, в котором на PL0 будет выполнена --------
//--------процедура-обработчик VideoMemScrolling -----------------
int 9
//--------вышли из шлюза - мы снова на PL3 -----------------
mov edi,ebx
mov esi, offset old_gate
cld
movsd
movsd
//--------восстановим регистры -------------------------
pop edi
pop esi
pop ebx
end;
end.


 
Digitman   (2003-05-16 08:25) [14]

unit PM;

interface

uses Windows;

const
// mask of TI-bit in selector
TI_GDT = 0;
TI_LDT = 4;
SYSDESC_ACCESS_TYPE_MASK = $0F;

type
TSysTableKind = (tkGDT, tkLDT, tkIDT);
TSysSegDescType = ( stUnused,
stTSS,
stLDT,
stTSS_BUSY,
stGATE_16,
stTASKGATE,
stINTRPT_16,
stEXCEPT_16,
stWRONG_TYPE,
stTSS_32,
stRESERVED1,
TSS_32_BUSY,
stGATE_32,
stRESERVED2,
stINTRPT_32,
stTRAP_32
);

TBaseLo = packed record
LoWord: Word;
LoByteHiWord: byte;
end;
PBaseLo = ^TBaseLo;

TSegmentDescriptor = packed record
LimitLo: Word;
BaseLo: TBaseLo;
ARPL: byte;
LimitHi: byte;
BaseHi: byte;
end;
PSegmentDescriptor = ^TSegmentDescriptor;

TLDTEntry = TSegmentDescriptor;
TGDTEntry = TSegmentDescriptor;
PLDTEntry = PSegmentDescriptor;
PGDTEntry = PSegmentDescriptor;

TIDTEntry = packed record
OffsetLo: Word;
Selector: Word;
Params: Byte;
Access: Byte;
OffsetHi: Word;
end;
PIDTEntry = ^TIDTEntry;

TSegmentInfo = packed record
Limit: Word;
Base: DWord;
end;
PSegmentInfo = ^TSegmentInfo;

function GetSegmentInfo(Selector: Word): PSegmentInfo;
function GetSegmentDesc(Selector: Word): PSegmentDescriptor;
function GetInterruptDesc(const InterruptNumber: Byte): PIDTEntry;
function GetSysTableCapacity(const SysTable: TSysTableKind): Integer;

implementation

var
GDTInfo, LDTInfo, IDTInfo: TSegmentInfo;
LDTSelector: Word;

procedure ReadWin9xSysTableInfo;
asm
sgdt [GDTInfo]
sidt [IDTInfo]
sldt eax
mov [LDTSelector], ax
and ax, $FFF8
add eax, [GDTInfo.Base]
mov dl, [eax + TGDTEntry.BaseLo.LoByteHiWord]
mov dh, [eax + TGDTEntry.BaseHi]
shl edx, 16
mov dx, [eax + TGDTEntry.BaseLo.LoWord]
mov [LDTInfo.Base], edx
mov dx, [eax + TGDTEntry.LimitLo]
mov [LDTInfo.Limit], dx
end;

function GetSegmentInfo(Selector: Word): PSegmentInfo;
var
DescAddr: DWord;
begin
Result := nil;
DescAddr := Selector and $FFF8;
case Selector and TI_LDT of
TI_GDT:
if DescAddr < GDTInfo.Limit then begin
DescAddr := DescAddr + GDTInfo.Base;
New(Result);
with Result^, PGDTEntry(DescAddr)^ do begin
Limit := LimitLo;
Base := (BaseHi shl 8 + BaseLo.LoByteHiWord) shl 16 + BaseLo.LoWord;
end;
end;
TI_LDT:
if DescAddr < LDTInfo.Limit then begin
DescAddr := DescAddr + LDTInfo.Base;
New(Result);
with Result^, PLDTEntry(DescAddr)^ do begin
Limit := LimitLo;
Base := (BaseHi shl 8 + BaseLo.LoByteHiWord) shl 16 + BaseLo.LoWord;
end;
end;
end;
end;

function GetSegmentDesc(Selector: Word): PSegmentDescriptor;
begin
Result := nil;
case Selector and TI_LDT of
TI_GDT:
begin
New(Result);
CopyMemory(Result, PGDTEntry((Selector and $FFF8) + GDTInfo.Base), SizeOf(TGDTEntry));
end;
TI_LDT:
begin
New(Result);
CopyMemory(Result, PLDTEntry((Selector and $FFF8) + LDTInfo.Base), SizeOf(TLDTEntry));
end;
end;
end;

function GetInterruptDesc(const InterruptNumber: Byte): PIDTEntry;
begin
Result := nil;
if InterruptNumber <= (IDTInfo.Limit + 1) shr 3 then begin
New(Result);
CopyMemory(Result, PIDTEntry(InterruptNumber shl 3 + IDTInfo.Base), SizeOf(TIDTEntry));
end;
end;

function GetSysTableCapacity(const SysTable: TSysTableKind): Integer;
begin
case SysTable of
tkGDT: Result := (GDTInfo.Limit + 1) shr 3;
tkLDT: Result := (LDTInfo.Limit + 1) shr 3;
tkIDT: Result := (IDTInfo.Limit + 1) shr 3;
else
Result := 0;
end;
end;

initialization

end.


 
kravchuk   (2003-05-16 12:05) [15]

>Ihor Osov"yak © (15.05.03 19:23)
у меня есть девайс ATI 9000 видеокарта, у которой глючила работа с виндовым power manager, после двух часов работы в режиме видеозахвата, power manager говорил что пора карте идти в low-power mode. и захват переставал работать. Основная сложность в том что комп где стояла карта управляется RAdmin, и доступа к клавиатуре нет, т.е. отключить ACPI нет возможности.
Я хотел уведомить с помощью ф-ии PoRegisterDeviceForIdleDetection, что девайс отключать не надо.
Решилось все переустановкой более новых wdm драйверов.


 
Ihor Osov'yak   (2003-05-16 23:01) [16]

2 kravchuk © (16.05.03 12:05)

Вот видишь, как просто решилось..

А вообще-то в этой ситуации простенький драйвер-фильтр наверное помог-бы.. Написание его не так уж сложно (по сравнению с традиционными драйверами), да и стандартный си от паскаля почти не отличается :-)..


 
kravchuk   (2003-05-19 11:27) [17]

Большое всем спасибо :)



Страницы: 1 вся ветка

Форум: "Система";
Текущий архив: 2003.07.28;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.006 c
1-91745
explorer
2003-07-15 07:46
2003.07.28
Обработка нажатия кнопки


3-91662
Sensor
2003-07-05 18:23
2003.07.28
Запихнуть две таблицы в одну DBGrid


14-91847
vidiv
2003-07-11 07:43
2003.07.28
Как убить процесс через некоторе время.....


14-91824
Soft
2003-07-10 14:44
2003.07.28
Как на С, не C++ полуить место, занимаемое структурой?


14-91867
sagchat
2003-07-11 15:20
2003.07.28
модем перестал набирать в тоновом режиме





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский