Форум: "Система";
Текущий архив: 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