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

Вниз

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, у висты наверное тоже.



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

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

Наверх





Память: 0.63 MB
Время: 0.006 c
15-1254741346
megamuz
2009-10-05 15:15
2009.12.06
Проследить за процессом


11-1208529256
CutPaste
2008-04-18 18:34
2009.12.06
Обработка строк в буфере обмена


2-1256053889
Delphi2020
2009-10-20 19:51
2009.12.06
технология ADO и RecordCount


2-1255613270
pest
2009-10-15 17:27
2009.12.06
7-bit ASCII в заголовке pop письма


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





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский