Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.12.06;
Скачать: CL | DM;

Вниз

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

 
Riply ©   (2008-09-26 11:11) [0]

Здравствуйте !
В описании процедуры RtlCopyUnicodeString MSDN указывает следующее:
Requirements
IRQL: >= DISPATCH_LEVEL


Поясните, пожалуйста, что имеется ввиду ?
Неужели надо понимать буквально ?
(т.е. при IRQL < DISPATCH_LEVEL, с ней нельзя работать)


 
Rouse_ ©   (2008-09-26 11:41) [1]

Вообщето можно и вот так:
RtlCopyMemory(Dest, Source->Buffer, Source->Length*sizeof(WCHAR));
Dest[Source->Length / sizeof(WCHAR)] = L"\0";


Но есть у меня тут кусочек драйвера, который тоже нормально работает:

BOOLEAN GetProcessInfo(ProcessData *pProcessData)
{
EPROCESS *pEProcess = NULL;
NTSTATUS status;
UNICODE_STRING p;

if(KeGetCurrentIrql() > DISPATCH_LEVEL) {
 DBGOUT(("GetProcessInfo: IRQL too high. IRQL: %d", KeGetCurrentIrql()));
 return FALSE;
}

if(!pProcessData)
 return FALSE;

status = PsLookupProcessByProcessId(pProcessData->ulProcessID, (PEPROCESS *)&pEProcess);
if(!NT_SUCCESS(status)) {
 DBGOUT(("GetProcessInfo: PsLookupProcessByProcessId Failed: %08X", status));
 return FALSE;
}

if(!pEProcess) {
 DBGOUT(("GetProcessInfo: pEProcess is null!"));
 return FALSE;
}

pProcessData->ulParentPID = pEProcess->InheritedFromUniqueProcessId;
#if DBG
if(pProcessData->ulParentPID == 0)
 DBGOUT(("PID %d has a Parent PID of 0!", pProcessData->ulProcessID));

if(pProcessData->ulProcessID == 0)
 DBGOUT(("Process has a PID of 0!"));
#endif

RtlZeroMemory(&pProcessData->usProcessName, sizeof(UNICODE_STRING));
RtlZeroMemory(&pProcessData->usWindowTitle, sizeof(UNICODE_STRING));
RtlZeroMemory(&pProcessData->usUsername, sizeof(UNICODE_STRING));

if(!pEProcess->Peb) {
 DBGOUT(("GetProcessInfo: pEProcess->Peb is null!"));
 return FALSE;
} else {
 if(!pEProcess->Peb->ProcessParameters) {
  DBGOUT(("GetProcessInfo: pEPRocess->Peb->ProcessParameters is null!"));
  return FALSE;
 }

 pProcessData->usWindowTitle.MaximumLength = min(pEProcess->Peb->ProcessParameters->WindowTitle.Length + sizeof(WCHAR), PROCESSDATA_MAX_LENGTH - sizeof(WCHAR));
 //pProcessData->usWindowTitle.Buffer = (WCHAR *)ExAllocatePool(PagedPool, pProcessData->usWindowTitle.MaximumLength+  sizeof(WCHAR));
 pProcessData->usWindowTitle.Buffer = (PWSTR)ExAllocateFromNPagedLookasideList(&g_GetProcessLookasideList);
 RtlZeroMemory(pProcessData->usWindowTitle.Buffer, pProcessData->usWindowTitle.MaximumLength);
 RtlCopyUnicodeString(&pProcessData->usWindowTitle, &pEProcess->Peb->ProcessParameters->WindowTitle);

 // We only want the filename of the exe not the full path
 p.Buffer = wcsrchr(pEProcess->Peb->ProcessParameters->ImagePathName.Buffer, "\\") + 1;
 p.MaximumLength = p.Length = wcslen(p.Buffer) * sizeof(WCHAR);
 pProcessData->usProcessName.MaximumLength = min(p.Length + sizeof(WCHAR), PROCESSDATA_MAX_LENGTH - sizeof(WCHAR));
 pProcessData->usProcessName.Buffer = (PWSTR)ExAllocateFromNPagedLookasideList(&g_GetProcessLookasideList);
 RtlZeroMemory(pProcessData->usProcessName.Buffer, pProcessData->usProcessName.MaximumLength);
 RtlCopyUnicodeString(&pProcessData->usProcessName, &p);

 pProcessData->usUsername.MaximumLength = PROCESSDATA_MAX_LENGTH - sizeof(WCHAR);
 pProcessData->usUsername.Length = 0;
 pProcessData->usUsername.Buffer = (PWSTR)ExAllocateFromNPagedLookasideList(&g_GetProcessLookasideList);
 RtlZeroMemory(pProcessData->usUsername.Buffer, pProcessData->usUsername.MaximumLength + sizeof(WCHAR));

 if(!GetUserSIDFromProcess(pEProcess, &pProcessData->usUsername)) {
  DBGOUT(("GetProcessInfo: Unable to get UserSID From Process!"));
  ExFreeToNPagedLookasideList(&g_GetProcessLookasideList, pProcessData->usWindowTitle.Buffer);
  ExFreeToNPagedLookasideList(&g_GetProcessLookasideList, pProcessData->usProcessName.Buffer);
  RtlZeroMemory(&pProcessData->usProcessName, sizeof(UNICODE_STRING));
  RtlZeroMemory(&pProcessData->usWindowTitle, sizeof(UNICODE_STRING));
  RtlZeroMemory(&pProcessData->usUsername, sizeof(UNICODE_STRING));
  return FALSE;
 }
}

//DBGOUT(("GetProcessInfo: ProcName: %S UserName: %S WindowTitle: %S PID: %d", pProcessData->usProcessName.Buffer, pProcessData->usUsername.Buffer, pProcessData->usWindowTitle.Buffer, pProcessData->ulParentPID));
return TRUE;
}


 
Riply ©   (2008-09-26 12:18) [2]

> [1] Rouse_ ©   (26.09.08 11:41)
> Вообщето можно и вот так:
Да, конечно можно, только вот еще хочется понять почему они так написали.

>Но есть у меня тут кусочек драйвера:

Очеь интересный для меня "кусочек". Спасибо :)

> который тоже нормально работает

Т.е. ты хочешь сказать, что функция GetProcessInfo у тебя вызывается
в том числе и при IRQL < DISPATCH_LEVEL, и нормально отрабатывает ?
Тогда полагаем, что в MSDN опечатка ?


 
Игорь Шевченко ©   (2008-09-26 12:56) [3]


> В описании процедуры RtlCopyUnicodeString MSDN указывает
> следующее:
> Requirements
> IRQL: >= DISPATCH_LEVEL


ну если во время RtlCopyMemory произойдет обращение к памяти, которая в данный момент не отображена на физическую, то вылезет красивое синее сообщение IRQL IS NOT LESS OR EQUAL.

Driver Verifier - наше все.


 
Rouse_ ©   (2008-09-26 13:06) [4]


> Тогда полагаем, что в MSDN опечатка ?

Скорее всего, т.к. RtlCopyUnicodeString работает исключительно через RtlCopyMemory и я не вижу никаких предпосылок для повышения IRQL...


 
Riply ©   (2008-09-26 13:17) [5]

> [3] Игорь Шевченко ©   (26.09.08 12:56)
> Driver Verifier - наше все.

Мы с ним еще не успели познакомиться :)
Но, раз Вы его рекомендуете уже не в первый раз,
то процесс знакомства придется срочно ускорить :)

> [4] Rouse_ ©   (26.09.08 13:06)
>> Тогда полагаем, что в MSDN опечатка ?

> Скорее всего, т.к. RtlCopyUnicodeString работает исключительно через RtlCopyMemory
> и я не вижу никаких предпосылок для повышения IRQL...

Просто я уже всего стала боятся.
Вдруг там что-то типа безопасного копирования с какими-нибудь спин-блокировками ?


 
Rouse_ ©   (2008-09-26 13:32) [6]


> Вдруг там что-то типа безопасного копирования с какими-нибудь
> спин-блокировками ?

Нет, обычная инициализация приемного буффера и RtlCopyMemory


 
Игорь Шевченко ©   (2008-09-26 15:10) [7]


> Мы с ним еще не успели познакомиться :)
> Но, раз Вы его рекомендуете уже не в первый раз,
> то процесс знакомства придется срочно ускорить :)


Знакомься. Количество вопросов сократится, а количество синих сообщений возрастет. Driver Verifier нужен для того, чтобы получать синие сообщения.


 
Riply ©   (2008-09-26 16:20) [8]

> [7] Игорь Шевченко ©   (26.09.08 15:10)
> Знакомься. Количество вопросов сократится, а количество синих сообщений возрастет.
> Driver Verifier нужен для того, чтобы получать синие сообщения.

У меня такой вопрос: а чем BSOD вреден для компьютера(в смысле железа) и для системы ?
Ведь, когда она бедненькая падает только из-за того,
что я, например, на автомате вызвала что-нибудь типа Move,
у меня сердце кровью обливается. Так ее жалко :)


 
slow!alfamoon!com   (2008-09-26 16:36) [9]

Ты понимаешь что такое BSOD?


 
Riply ©   (2008-09-26 16:45) [10]

> [9] slow!alfamoon!com   (26.09.08 16:36)
> Ты понимаешь что такое BSOD?

Судя по вопросу - нет. И вообще он у меня не синий а черный.
Даже нормальный BSOD и тот получить не могу :)


 
Игорь Шевченко ©   (2008-09-26 17:24) [11]


> а чем BSOD вреден для компьютера(в смысле железа)


ничем


> и для системы ?


перезапускать надо, а так не вреден.

Вопрос из серии "Чем вредно для программы сообщение: Программа выполнила недопустимую операцию и будет закрыта" ? Да ничем не вредно, это информация.


 
slow!alfamoon!com   (2008-09-26 17:35) [12]

BSOD это остановка работы системы при возникновении нештатной ситуации.


 
Rouse_ ©   (2008-09-26 17:36) [13]


> У меня такой вопрос: а чем BSOD вреден для компьютера(в
> смысле железа) и для системы ?

0_о ты что на живой машине эксперементируешь? Фига-се...
Срочно покупать виртуалку :) Мне например решение от http://www.parallels.com нравиться. Да и стоит копейки 45 чтоли долларов...
А по поводу вредно-не вредно, в принципе как Игорь сказал, вредно быть не должно (я тоже так думал).

Воть...
так-то оно так, но у меня на момент экспериментов сгорел ровно 1 комп и 4 USB разветвителя (я собственно гдето год назад жаловался на форуме как раз) :)
Мошт комп был дохлый, мошт разветвители кривые, то что руки были кривые,  это-то понятно, но мне больше эксперементировать не охота на чистом железе - тестирование только под ВМ :)


 
slow!alfamoon!com   (2008-09-26 17:36) [14]

Цвет экрана и шрифта при бсоде настраивается. Вроде на сисинтерналсах утиль видел.


 
Riply ©   (2008-09-26 18:57) [15]

> [11] Игорь Шевченко ©   (26.09.08 17:24)
> Вопрос из серии "Чем вредно для программы сообщение:
> Программа выполнила недопустимую операцию и будет закрыта" ?
> Да ничем не вредно, это информация.

Это просто здорово !

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

>  [12] slow!alfamoon!com   (26.09.08 17:35)
> BSOD это остановка работы системы при возникновении нештатной ситуации.

Об этом я догадывалась :)

> [13] Rouse_ ©   (26.09.08 17:36)
> Срочно покупать виртуалку :)
> Мне например решение от http://www.parallels.com нравиться.

Спасибо. Подумаю.
> но у меня на момент экспериментов сгорел ровно 1 комп и 4 USB разветвителя
Ну нельзя же так людей пугать :)


 
Городской Шаман   (2008-09-26 19:37) [16]


> Riply ©   (26.09.08 11:11)
>
> Здравствуйте !
> В описании процедуры RtlCopyUnicodeString MSDN указывает
> следующее:
> Requirements
> IRQL: >= DISPATCH_LEVEL


Если у MS куча багов в ОС, то почему вы считаете что не может быть багов в документации.

Все таки скачайте книгу Солдатова "Программирование драйверов Windows"
http://www.cyberinfo.ru/index.php?newsid=671


 
Rouse_ ©   (2008-09-26 19:42) [17]


> Все таки скачайте книгу Солдатова "Программирование драйверов
> Windows"
> http://www.cyberinfo.ru/index.php?newsid=671

Эммм... у меня по крайней мере на сейте всплывающих окон с порнухой нет :)
http://rouse.drkb.ru/books.php#soldatov


 
Riply ©   (2008-09-26 20:11) [18]

> [16] Городской Шаман   (26.09.08 19:37)
> Если у MS куча багов в ОС, то почему вы считаете что не может быть багов в документации.

Я так не считаю. Разумеется есть.
"Не ошибается только тот, кто ничего не делает" (с) (К сожалению, не помню чья)
Но если меня спросят: "Где вероятнее встретить ошибку ?
У Солдатова(ничего против него не имею, просто как пример) или в MSDN ?",
то я думаю, ответ - очевиден :)

P.S.
"Солдатова" скачала. Спасибо.


 
Городской Шаман   (2008-09-26 21:54) [19]


> Rouse_ ©   (26.09.08 19:42) [17]
>
> Эммм... у меня по крайней мере на сейте всплывающих окон
> с порнухой нет :)
> http://rouse.drkb.ru/books.php#soldatov


У меня тоже нет, так как FireFox.


 
Городской Шаман   (2008-09-26 21:56) [20]


> Riply ©   (26.09.08 20:11) [18]
>
> > [16] Городской Шаман   (26.09.08 19:37)
> > Если у MS куча багов в ОС, то почему вы считаете что не
> может быть багов в документации.
>
> Я так не считаю. Разумеется есть.
> "Не ошибается только тот, кто ничего не делает" (с) (К сожалению,
>  не помню чья)
> Но если меня спросят: "Где вероятнее встретить ошибку ?


MSDN писали индусы, а солдатов каждую свою строчку проверил на своём опыте.

Хотя, если сравнивать Фленова и MSDN, то вы правы.


 
Игорь Шевченко ©   (2008-09-26 23:42) [21]

Городской Шаман   (26.09.08 21:56) [20]


> MSDN писали индусы, а солдатов каждую свою строчку проверил
> на своём опыте.


Строчку "Hello, world" ? Так ее многие проверяли на своем опыте. Не доверяю я книгам русских авторов - это либо переводчики либо последователи Фленова и Архангельского.

Для написания драйверов за глаза хватает документации DDK, никаких Солдатовых и Шрайберов не требуется. Опять же, хорошие и проверенные массой народу драйверы с исходниками и картинками есть у Руссиновича.


 
Игорь Шевченко ©   (2008-09-26 23:45) [22]


> Если у MS куча багов в ОС, то почему вы считаете что не
> может быть багов в документации.


Да потому что ее читают на несколько порядков больше народу и шлют свои фидбэки. Там на каждой странице есть ссылка: Send feedback to Microsoft - как думаешь, зачем придумана ?
И в том числе по этим фидбэкам в документацию вносятся исправления.


 
Городской Шаман   (2008-09-27 02:42) [23]


> Игорь Шевченко ©   (26.09.08 23:42) [21]
>
> Для написания драйверов за глаза хватает документации DDK,
>  никаких Солдатовых и Шрайберов не требуется


Хватает. Но когда нужно быстро разобраться в отличиях написания программ между пользовательским режимом и ядром и быстро написать рабочий драйвер (который будет работать в реальной системе) то проще воспользоваться готовыми шаблонами решений того же Солдатова.

Ну а потом можно уже подбирать свой стиль, внимательно читая DDK.

Это раньше люди годами занимались изучение чего-то сложного, а сейчас "встал и сделал" и "это должно было быть сделано вчера"...


 
Игорь Шевченко ©   (2008-09-27 14:37) [24]

Городской Шаман   (27.09.08 02:42) [23]


> проще воспользоваться готовыми шаблонами решений того же
> Солдатова.


Даже не смешно. Готовых решений там не видно днем с огнем.


 
Городской Шаман   (2008-09-27 21:23) [25]


> Игорь Шевченко ©   (27.09.08 14:37) [24]
>
> Даже не смешно. Готовых решений там не видно днем с огнем.


Там не готовые шаблоны драйверов, а готовые шаблоны различных решений для тех кто привык к работе в пользовательском режиме. Тоесть приводятся адекватные решения в режиме ядра того что человек привык делать в пользовательском режиме. Так что особо переучиваться даже не нужно будет, ну и пару тонкостей запомнить.

Плохо что в режиме ядра нельзя ООП заюзать, свой менеджер памяти писать придётся, а это долго :(


 
Игорь Шевченко ©   (2008-09-27 21:42) [26]

Городской Шаман   (27.09.08 21:23) [25]


> Там не готовые шаблоны драйверов, а готовые шаблоны различных
> решений для тех кто привык к работе в пользовательском режиме.
>  Тоесть приводятся адекватные решения в режиме ядра того
> что человек привык делать в пользовательском режиме. Так
> что особо переучиваться даже не нужно будет


В печке место такой книжке.


 
Городской Шаман   (2008-09-28 06:37) [27]


> Игорь Шевченко ©   (27.09.08 21:42) [26]
>
> >  Тоесть приводятся адекватные решения в режиме ядра того
> > что человек привык делать в пользовательском режиме. Так
> > что особо переучиваться даже не нужно будет
>
> В печке место такой книжке.


Видел я драйвера написанные только по DDK причем студентами. У Dlink все драйвера такие. Если установить девайсину от Dlink на компьютер, то как минимум раз в день синий экран гарантирован.

А в книжках автор делится опытом, как все таки правильно применять эти 1024 функции в режиме ядра чтобы не было потом горько и обидно пользователю этих драйверов.

Это тоже самое что Delphi учить по help-у, не прочитав ни одной книжки перед этим. Я так делал. Просмотрел свои программы, которые я писал в самом начале, понял что я похожее повторил в них все антипаттерны. Но они работают, хоть и с глюками.

Так что книга полезна тем что автор делится секретами когда использовать различные паттены, а когда точно нельзя использовать определенные паттерны.


 
Игорь Шевченко ©   (2008-09-28 11:08) [28]

Городской Шаман   (28.09.08 06:37) [27]


> Если установить девайсину от Dlink на компьютер, то как
> минимум раз в день синий экран гарантирован.


Оно конечно смешно, но именно у меня стояли девайсины от DLink - а именно сетевые платы. Работали как часы, с момента установки.

Ты руки не пробовал выпрямить ?


> Это тоже самое что Delphi учить по help-у, не прочитав ни
> одной книжки перед этим.


Конечно тоже смешно, но я прошел именно такой путь - изучал Delphi не прочитав ни одной книжки - по одной простой причине - их, книжек, еще не успели написать, ну и напечатать тоже. Ты как думаешь вообще - авторы, которые эти книжки писали, тоже ждали, пока на них первокнига не снизойдет ?


 
Городской Шаман   (2008-09-28 15:44) [29]


> Игорь Шевченко ©   (28.09.08 11:08) [28]
>
> Городской Шаман   (28.09.08 06:37) [27]
>
> > Если установить девайсину от Dlink на компьютер, то как
> > минимум раз в день синий экран гарантирован.
>
> Оно конечно смешно, но именно у меня стояли девайсины от
> DLink - а именно сетевые платы. Работали как часы, с момента
> установки.
>
> Ты руки не пробовал выпрямить ?


Значит вам повезло с моделью. У Dlink встречается нормальное оборудование типа DWL-2100AP, но такое бывает в процентах 20 случаев.


> Игорь Шевченко ©   (28.09.08 11:08) [28]
>
> > Это тоже самое что Delphi учить по help-у, не прочитав
> ни
> > одной книжки перед этим.
>
>
> Конечно тоже смешно, но я прошел именно такой путь - изучал
> Delphi не прочитав ни одной книжки - по одной простой причине
> - их, книжек, еще не успели написать, ну и напечатать тоже.
>  Ты как думаешь вообще - авторы, которые эти книжки писали,
>  тоже ждали, пока на них первокнига не снизойдет ?


Нет не думаю. Но думаю, что если WDM модель была создана в 98, NT в 96 и IFS модель драйвера тоже где-то в 96, то авторы этих книг имели намного больше времени, чем я, чтобы изучить тонкости работы драйверов в системе Windows. Ну а так как мне именно сейчас понадобилось разобраться в разработке драйверов, то я лучше часть граблей обойду и воспользуюсь опытом этих авторов.

Так как драйвера (резидентные обработчики прерываний) я разрабатывал только под DOS, то ввиду несколько отличающейся модели драйвера в Windows (которому более подходит название плагин ядра) мне проще основы изучить по книге.

А по документации учится не сложно, но часто можно допустить такие ошибки которые мастеру бы и голову не пришли. Вот лично моё решение, когда я учился разработке БД и SQL на живом и до сих пор работающем проекте.

Данные одной системной утилиты извлекались и сохранялись в базу Access. SQL на нужном уровне я изучил по документации Delphi примерам и документации Access, коннект к базе создавался через ODBC (подсмотрел в реестре).
Но была проблемка - данные не всегда после сохранения оказывались в базе. Как вы думаете в чем?


 
Городской Шаман   (2008-09-28 15:53) [30]

А по документации учится не сложно, но часто можно допустить такие ошибки, которые мастеру бы и голову не пришли. Вот лично моё решение, когда я учился разработке БД и SQL на живом и до сих пор работающем проекте.

Данные одной системной утилиты извлекались и сохранялись в базу Access. SQL на нужном уровне я изучил по документации Delphi примерам и документации Access, коннект к базе создавался через ODBC (подсмотрел в реестре).

Но была проблемка - данные не всегда после сохранения оказывались в базе.

Как вы думаете, в чем?

Оказалось проблема в транзакциях!!! Точнее, в комите, я привык работать с ФС-базами (в институте), там необходимости в комите не было (это сейчас знаю что это, а тогда не знал и инет был фиговый).

Как я ее решил – Положил на форму таймер, который выполнял раз в секунду вот этот код:

procedure TNTDForm.TimerNtdTimer(Sender: TObject);
begin
 TimerNtd.Enabled:=False;
 CsGraphMainForm.SDDatabase1.StartTransaction;
 CsGraphMainForm.SDDatabase1.Commit;
 TimerNtd.Enabled:=True;
end;


И проблема чудесным образом разрешилась, просто тогда я считал по аналогии с файл-серверными, что комит нужен для сброса буфера базы на диск.

А данная программа используется и работает по сей день.

Вот для того чтобы избежать таких “чудесных” самопальных решений (хоть и рабочих) – нужны книги, даже того же Фленова.


 
Игорь Шевченко ©   (2008-09-29 02:00) [31]

Нет, Софт, книги Фленова не нужны, потому что они вредны. Они учат шаблонам. А овладение шаблонами еще не знание и уж тем более, не повод для наездов на MS.


 
Германн ©   (2008-09-29 02:11) [32]


> Вот для того чтобы избежать таких “чудесных” самопальных
> решений (хоть и рабочих) – нужны книги, даже того же Фленова.
>
> <Цитата>
>
> Игорь Шевченко ©   (29.09.08 02:00) [31]
>
> Нет, Софт, книги Фленова не нужны, потому что они вредны.
>  Они учат шаблонам. А овладение шаблонами еще не знание
> и уж тем более, не повод для наездов на MS.
>

И в добавок. Они учат шаблонам содержащим ошибки. А ученик выучивший эти шаблоны об этих ошибках и не знает ничего.


 
Riply ©   (2008-10-06 06:41) [33]

> [1] Rouse_ ©   (26.09.08 11:41)
> Но есть у меня тут кусочек драйвера, который тоже нормально работает:

Появилось чуть свободного времени - решила посмотреть твой "кусочек драйвера".
Разумеется, сразу появилась проблемма. Ну как же без них то :)
Как у тебя определяется структура _EPROCESS ?
Я посмотрела ее в двух источниках, пользующхся моим наибольшим доверием (ReactOS и линуксоиды).
У них определения разные, причем разница - критична.
Неприятности начинаются еще с _KPROCESS:
У ReactOS она заканчивается такими полями:
UCHAR ThreadSeed; /* 066 */
UCHAR DisableBoost; /* 067 */
} KPROCESS;

а у линуксоидов добавлено еще четыре поля:
UCHAR PowerState;
BOOLEAN DisableQuantum;
UCHAR IdealNode;
UCHAR Spare;
} KPROCESS, *PKPROCESS;

Как результат _EPROCESS у них начинает различаться уже с первых полей,
а дальше - хуже. С новыми полями разница в смещении только растет.
(например у поля UniqueProcessId это уже $84 против $94 )
Приведу кусочек от линуксоидов (он мне больше нравиться :) )
typedef struct _EPROCESS {
   KPROCESS                        Pcb; // +0x000
   EX_PUSH_LOCK                    ProcessLock; // +0x06c
   LARGE_INTEGER                   CreateTime; // +0x070
   LARGE_INTEGER                   ExitTime; // +0x078
   EX_RUNDOWN_REF                  RundownProtect; // +0x080
   ULONG                           UniqueProcessId; // +0x084
   LIST_ENTRY                      ActiveProcessLinks; // +0x088
   ULONG                           QuotaUsage[3]; // +0x090
   ULONG                           QuotaPeak[3]; // +0x09c
   ULONG                           CommitCharge; // +0x0a8
   ULONG                           PeakVirtualSize; // +0x0ac
   ULONG                           VirtualSize; // +0x0b0
   LIST_ENTRY                      SessionProcessLinks; // +0x0b4
   PVOID                           DebugPort; // +0x0bc
   PVOID                           ExceptionPort; // +0x0c0
   PHANDLE_TABLE                   ObjectTable; // +0x0c4
   EX_FAST_REF                     Token; // +0x0c8
   ULONG                           WorkingSetPage; // +0x0cc
   KGUARDED_MUTEX                  AddressCreationLock; // +0x0d0
   ULONG                           HyperSpaceLock; // +0x0f0
   PETHREAD                        ForkInProgress; // +0x0f4
   ULONG                           HardwareTrigger; // +0x0f8
   PMM_AVL_TABLE                   PhysicalVadRoot; // +0x0fc
   PVOID                           CloneRoot; // +0x100
   ULONG                           NumberOfPrivatePages; // +0x104
   ULONG                           NumberOfLockedPages; // +0x108
   PVOID                           Win32Process; // +0x10c
   PEJOB                           Job; // +0x110
   PVOID                           SectionObject; // +0x114
   PVOID                           SectionBaseAddress; // +0x118
   PEPROCESS_QUOTA_BLOCK           QuotaBlock; // +0x11c
   PPAGEFAULT_HISTORY              WorkingSetWatch; // +0x120
   PVOID                           Win32WindowStation; // +0x124
   ULONG                           InheritedFromUniqueProcessId; // +0x128
   PVOID                           LdtInformation; // +0x12c
   PVOID                           VadFreeHint; // +0x130
   PVOID                           VdmObjects; // +0x134
   PVOID                           DeviceMap; // +0x138
   PVOID                           Spare0[3]; // +0x13c
   union {
       HARDWARE_PTE                PageDirectoryPte; // +0x148
       UINT64                      Filler; // +0x148
   };
   PVOID                           Session; // +0x150
   UCHAR                           ImageFileName[16]; // +0x154
   LIST_ENTRY                      JobLinks; // +0x164
   PVOID                           LockedPagesList; // +0x16c
   LIST_ENTRY                      ThreadListHead; // +0x170
   PVOID                           SecurityPort; // +0x178
   PVOID                           PaeTop; // +0x17c
   ULONG                           ActiveThreads; // +0x180
   ULONG                           GrantedAccess; // +0x184
   ULONG                           DefaultHardErrorProcessing; // +0x188
   SHORT                           LastThreadExitStatus; // +0x18c
   PPEB                            Peb; // +0x190
   EX_FAST_REF                     PrefetchTrace; // +0x194
   LARGE_INTEGER                   ReadOperationCount; // +0x198
   LARGE_INTEGER                   WriteOperationCount; // +0x1a0
   LARGE_INTEGER                   OtherOperationCount; // +0x1a8
   LARGE_INTEGER                   ReadTransferCount; // +0x1b0
   LARGE_INTEGER                   WriteTransferCount; // +0x1b8
   LARGE_INTEGER                   OtherTransferCount; // +0x1c0
   ULONG                           CommitChargeLimit; // +0x1c8
   ULONG                           CommitChargePeak; // +0x1cc
   PVOID                           AweInfo; // +0x1d0

Собираюсь взять их данные за основу.
У тебя такие же смещения или нет ?
Если нет, до дай мне, пожалуйста, твой вариант - буду брать среднее-арифметические смещения :)


 
Riply ©   (2008-10-06 09:08) [34]

> [33] Riply ©   (06.10.08 06:41)

Уфф...
При помощи моей кошки, чертовой бабушки и калькулятора,
вроде удалось все привести к "правильному" виду. :)
Но проверка, все-равно, не помешает.
"Меня терзают смутные сомнения", что это безобразие может быть разным, даже в разных сервис паках.


 
Игорь Шевченко ©   (2008-10-06 10:05) [35]

для рассмотрения структур EPROCESS, KPROCESS и прочих рекомендую скачать и установить Debugging Tools for Windows (с www.microsoft.com), скачать отладочные символы (насколько я знаю, именно скачать, а не настроить сервер символов) и в windbg в режиме локальной отладки ядра сказать dt nt!_EPROCESS


 
Riply ©   (2008-10-06 11:04) [36]

> [35] Игорь Шевченко ©   (06.10.08 10:05)
> для рассмотрения структур EPROCESS, KPROCESS и прочих рекомендую скачать и установить Debugging Tools for Windows

Спасибо.

P.S.
Т.е. все что мы с вместе кошкой делали (возились с EPROCESS) можно отправить "коту под хвост" ? :)


 
slow!alfamoon!com   (2008-10-06 11:29) [37]

Riply
тут дело в том, что полностью доверять реактосу - нельзя. У них в некоторых случаях встречаются несоответствия с win (что вполне понятно). У тебя DDK нет, что ли?


 
Riply ©   (2008-10-06 11:36) [38]

> [37] slow!alfamoon!com   (06.10.08 11:29)
> У тебя DDK нет, что ли?

Есть..., вроде..., но... наверное, какой-то не очень правильный.
Например, струкруры EPROCESS я в нем не нашла.


 
Rouse_ ©   (2008-10-06 12:07) [39]


> Если нет, до дай мне, пожалуйста, твой вариант

typedef struct _EPROCESS {
   KPROCESS Pcb;
   NTSTATUS ExitStatus;
   KEVENT LockEvent;
   ULONG LockCount;
   LARGE_INTEGER CreateTime;
   LARGE_INTEGER ExitTime;
   PKTHREAD LockOwner;

   HANDLE UniqueProcessId;

   LIST_ENTRY ActiveProcessLinks;

   //
   // Quota Fields
   //

   SIZE_T QuotaPeakPoolUsage[2];
   SIZE_T QuotaPoolUsage[2];

   SIZE_T PagefileUsage;
   SIZE_T CommitCharge;
   SIZE_T PeakPagefileUsage;

   //
   // VmCounters
   //

   SIZE_T PeakVirtualSize;
   SIZE_T VirtualSize;

   MMSUPPORT Vm;
   LIST_ENTRY SessionProcessLinks;

   PVOID DebugPort;
   PVOID ExceptionPort;
   PHANDLE_TABLE ObjectTable;

   //
   // Security
   //

   PACCESS_TOKEN Token;         // This field must never be null

   //

   FAST_MUTEX WorkingSetLock;
   PFN_NUMBER WorkingSetPage;
   BOOLEAN ProcessOutswapEnabled;
   BOOLEAN ProcessOutswapped;
   UCHAR AddressSpaceInitialized;
   BOOLEAN AddressSpaceDeleted;
   FAST_MUTEX AddressCreationLock;
   KSPIN_LOCK HyperSpaceLock;
   struct _ETHREAD *ForkInProgress;
   USHORT VmOperation;
   UCHAR ForkWasSuccessful;
   UCHAR MmAgressiveWsTrimMask;
   PKEVENT VmOperationEvent;
   PVOID PaeTop;
   ULONG LastFaultCount;
   ULONG ModifiedPageCount;
   PVOID VadRoot;
   PVOID VadHint;
   PVOID CloneRoot;
   PFN_NUMBER NumberOfPrivatePages;
   PFN_NUMBER NumberOfLockedPages;
   USHORT NextPageColor;
   BOOLEAN ExitProcessCalled;

   //
   // Used by Debug Subsystem
   //

   BOOLEAN CreateProcessReported;
   HANDLE SectionHandle;

   //
   // Peb
   //

   PPEB Peb;
   PVOID SectionBaseAddress;

   PEPROCESS_QUOTA_BLOCK QuotaBlock;
   NTSTATUS LastThreadExitStatus;
   PPAGEFAULT_HISTORY WorkingSetWatch;
   HANDLE Win32WindowStation;
   HANDLE InheritedFromUniqueProcessId;
   ACCESS_MASK GrantedAccess;
   ULONG DefaultHardErrorProcessing;
   PVOID LdtInformation;
   PVOID VadFreeHint;
   PVOID VdmObjects;
   PVOID DeviceMap;

   //
   // Id of the Hydra session in which this process is running
   //

   ULONG SessionId;

   LIST_ENTRY PhysicalVadList;
   union {
       HARDWARE_PTE PageDirectoryPte;
       ULONGLONG Filler;
   };
   ULONG PaePageDirectoryPage;
   UCHAR ImageFileName[ 16 ];
   ULONG VmTrimFaultValue;
   BOOLEAN SetTimerResolution;
   UCHAR PriorityClass;
   union {
       struct {
           UCHAR SubSystemMinorVersion;
           UCHAR SubSystemMajorVersion;
       };
       USHORT SubSystemVersion;
   };
   PVOID Win32Process;
   struct _EJOB *Job;
   ULONG JobStatus;
   LIST_ENTRY JobLinks;
   PVOID LockedPagesList;

   //
   // Used by rdr/security for authentication
   //

   PVOID SecurityPort ;              
   PWOW64_PROCESS Wow64Process;

   LARGE_INTEGER ReadOperationCount;
   LARGE_INTEGER WriteOperationCount;
   LARGE_INTEGER OtherOperationCount;
   LARGE_INTEGER ReadTransferCount;
   LARGE_INTEGER WriteTransferCount;
   LARGE_INTEGER OtherTransferCount;

   SIZE_T CommitChargeLimit;
   SIZE_T CommitChargePeak;

   LIST_ENTRY ThreadListHead;

   PRTL_BITMAP VadPhysicalPagesBitMap;
   ULONG_PTR VadPhysicalPages;
   KSPIN_LOCK AweLock;
} EPROCESS;

#define PS_JOB_STATUS_NOT_REALLY_ACTIVE      0x00000001
#define PS_JOB_STATUS_ACCOUNTING_FOLDED      0x00000002
#define PS_JOB_STATUS_NEW_PROCESS_REPORTED   0x00000004
#define PS_JOB_STATUS_EXIT_PROCESS_REPORTED  0x00000008
#define PS_JOB_STATUS_REPORT_COMMIT_CHANGES  0x00000010
#define PS_JOB_STATUS_LAST_REPORT_MEMORY     0x00000020

typedef EPROCESS *PEPROCESS;


 
Игорь Шевченко ©   (2008-10-06 12:14) [40]

лучше windbg все равно ничего нету. оно (windbg) показывает типы для конкретной системы (точнее для той, для которой у него есть символы). Структура факт меняется, у win2003 она отличается от XP, у висты наверное тоже.


 
Rouse_ ©   (2008-10-06 12:30) [41]


> Структура факт меняется, у win2003 она отличается от XP,
>  у висты наверное тоже.

Да кстати... Приведенная мной структура актуальна для W2k


 
slow!alfamoon!com   (2008-10-06 18:39) [42]

Ой. WinDBG надо, разумеется. В ДДК может не оказаться кое чего. + WRK заимей


 
Riply ©   (2008-10-06 19:05) [43]

> [40] Игорь Шевченко ©   (06.10.08 12:14)
> лучше windbg все равно ничего нету. оно (windbg) показывает типы для конкретной системы
> (точнее для той, для которой у него есть символы). Структура факт меняется, у win2003 она отличается от XP, у висты наверное тоже.

В этом я уже убедилась, правда, пока, заочно :)

> [41] Rouse_ ©   (06.10.08 12:30)
> Да кстати... Приведенная мной структура актуальна для W2k

В смысле "актуальна и для W2k" или "актуальна только для W2k" ?
P.S.
Понимаю, что второе, но чем черт не шутит :)

P.P.S.
Саш, а почему в твоем "кусочке драйвера" нет вызова ObDereferenceObject ?  

> [42] slow!alfamoon!com   (06.10.08 18:39)
> Ой. WinDBG надо, разумеется. В ДДК может не оказаться кое чего. + WRK заимей

К сожалению, мне не так просто "заиметь". Интернета у меня такая, однако :(


 
Игорь Шевченко ©   (2008-10-06 19:46) [44]


> К сожалению, мне не так просто "заиметь". Интернета у меня
> такая, однако :(


ну один раз можно и 300 метров выкачать. Оно все равно полезней, чем на форум трафик тратить :)


 
Rouse_ ©   (2008-10-07 10:31) [45]


> актуальна только для W2k

Начиная с...


> а почему в твоем "кусочке драйвера" нет вызова ObDereferenceObject?  

Он вызывается в GetUserSIDFromProcess


 
slow!alfamoon!com   (2008-10-07 11:39) [46]

wrk не сильно большой (метров 30). Но полезный


 
Riply ©   (2008-10-26 14:57) [47]

> [1] Rouse_ ©   (26.09.08 11:41)
> Но есть у меня тут кусочек драйвера, который тоже нормально работает:

Неа, это не "кусочек драйвера", а сплошные загадки :)
Давай начнем с азов:
Как я понимаю, структура pEProcess->Peb->ProcessParameters содержит
указатели, валидные только в рамках "подопытного" процесса. Это так ?
Если да, то каким образом, мы так спокойно гуляем по этим указателям, чего-то там читаем
(например, pEProcess->Peb->ProcessParameters->ImagePathName.Buffer) и при этом не получаем BSOD ?



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

Текущий архив: 2009.12.06;
Скачать: CL | DM;

Наверх




Память: 0.66 MB
Время: 0.016 c
11-1208955774
andreil
2008-04-23 17:02
2009.12.06
Как указать цвет пикселя 8-битному изображению?


15-1255017902
TUser
2009-10-08 20:05
2009.12.06
Сакральный смысл понятия дурак :)


9-1183815378
Dib@zol
2007-07-07 17:36
2009.12.06
По часовой стрелке


15-1254493923
ocean
2009-10-02 18:32
2009.12.06
Хочу наладонник с навигацией GPS покруче.


3-1230212249
Lera
2008-12-25 16:37
2009.12.06
Запрос и множество