Форум: "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.62 MB
Время: 0.005 c