Конференция "WinAPI" » RtlCopyUnicodeString и IRQL
 
  • Riply © (26.09.08 11:11) [0]
    Здравствуйте !
    В описании процедуры RtlCopyUnicodeString MSDN указывает следующее:
    Requirements
    IRQL: >= DISPATCH_LEVEL


    Поясните, пожалуйста, что имеется ввиду ?
    Неужели надо понимать буквально ?
    (т.е. при IRQL < DISPATCH_LEVEL, с ней нельзя работать)
  • Rouse_ © (26.09.08 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 © (26.09.08 12:18) [2]
    > [1] Rouse_ ©   (26.09.08 11:41)
    > Вообщето можно и вот так:
    Да, конечно можно, только вот еще хочется понять почему они так написали.

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

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

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

    Т.е. ты хочешь сказать, что функция GetProcessInfo у тебя вызывается
    в том числе и при IRQL < DISPATCH_LEVEL, и нормально отрабатывает ?
    Тогда полагаем, что в MSDN опечатка ?
  • Игорь Шевченко © (26.09.08 12:56) [3]

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


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

    Driver Verifier - наше все.
  • Rouse_ © (26.09.08 13:06) [4]

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

    Скорее всего, т.к. RtlCopyUnicodeString работает исключительно через RtlCopyMemory и я не вижу никаких предпосылок для повышения IRQL...
  • Riply © (26.09.08 13:17) [5]
    > [3] Игорь Шевченко ©   (26.09.08 12:56)
    > Driver Verifier - наше все.

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

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

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

    Просто я уже всего стала боятся.
    Вдруг там что-то типа безопасного копирования с какими-нибудь спин-блокировками ?
  • Rouse_ © (26.09.08 13:32) [6]

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

    Нет, обычная инициализация приемного буффера и RtlCopyMemory
  • Игорь Шевченко © (26.09.08 15:10) [7]

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


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

    У меня такой вопрос: а чем BSOD вреден для компьютера(в смысле железа) и для системы ?
    Ведь, когда она бедненькая падает только из-за того,
    что я, например, на автомате вызвала что-нибудь типа Move,
    у меня сердце кровью обливается. Так ее жалко :)
  • slow!alfamoon!com (26.09.08 16:36) [9]
    Ты понимаешь что такое BSOD?
  • Riply © (26.09.08 16:45) [10]
    > [9] slow!alfamoon!com   (26.09.08 16:36)
    > Ты понимаешь что такое BSOD?

    Судя по вопросу - нет. И вообще он у меня не синий а черный.
    Даже нормальный BSOD и тот получить не могу :)
  • Игорь Шевченко © (26.09.08 17:24) [11]

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


    ничем


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


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

    Вопрос из серии "Чем вредно для программы сообщение: Программа выполнила недопустимую операцию и будет закрыта" ? Да ничем не вредно, это информация.
  • slow!alfamoon!com (26.09.08 17:35) [12]
    BSOD это остановка работы системы при возникновении нештатной ситуации.
  • Rouse_ © (26.09.08 17:36) [13]

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

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

    Воть...
    так-то оно так, но у меня на момент экспериментов сгорел ровно 1 комп и 4 USB разветвителя (я собственно гдето год назад жаловался на форуме как раз) :)
    Мошт комп был дохлый, мошт разветвители кривые, то что руки были кривые,  это-то понятно, но мне больше эксперементировать не охота на чистом железе - тестирование только под ВМ :)
  • slow!alfamoon!com (26.09.08 17:36) [14]
    Цвет экрана и шрифта при бсоде настраивается. Вроде на сисинтерналсах утиль видел.
  • Riply © (26.09.08 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 разветвителя
    Ну нельзя же так людей пугать :)
  • Городской Шаман (26.09.08 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_ © (26.09.08 19:42) [17]

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

    Эммм... у меня по крайней мере на сейте всплывающих окон с порнухой нет :)
    http://rouse.drkb.ru/books.php#soldatov
  • Riply © (26.09.08 20:11) [18]
    > [16] Городской Шаман   (26.09.08 19:37)
    > Если у MS куча багов в ОС, то почему вы считаете что не может быть багов в документации.

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

    P.S.
    "Солдатова" скачала. Спасибо.
  • Городской Шаман (26.09.08 21:54) [19]

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


    У меня тоже нет, так как FireFox.
  • Городской Шаман (26.09.08 21:56) [20]

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


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

    Хотя, если сравнивать Фленова и MSDN, то вы правы.
  • Игорь Шевченко © (26.09.08 23:42) [21]
    Городской Шаман   (26.09.08 21:56) [20]


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


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

    Для написания драйверов за глаза хватает документации DDK, никаких Солдатовых и Шрайберов не требуется. Опять же, хорошие и проверенные массой народу драйверы с исходниками и картинками есть у Руссиновича.
  • Игорь Шевченко © (26.09.08 23:45) [22]

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


    Да потому что ее читают на несколько порядков больше народу и шлют свои фидбэки. Там на каждой странице есть ссылка: Send feedback to Microsoft - как думаешь, зачем придумана ?
    И в том числе по этим фидбэкам в документацию вносятся исправления.
  • Городской Шаман (27.09.08 02:42) [23]

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


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

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

    Это раньше люди годами занимались изучение чего-то сложного, а сейчас "встал и сделал" и "это должно было быть сделано вчера"...
  • Игорь Шевченко © (27.09.08 14:37) [24]
    Городской Шаман   (27.09.08 02:42) [23]


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


    Даже не смешно. Готовых решений там не видно днем с огнем.
  • Городской Шаман (27.09.08 21:23) [25]

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


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

    Плохо что в режиме ядра нельзя ООП заюзать, свой менеджер памяти писать придётся, а это долго :(
  • Игорь Шевченко © (27.09.08 21:42) [26]
    Городской Шаман   (27.09.08 21:23) [25]


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


    В печке место такой книжке.
  • Городской Шаман (28.09.08 06:37) [27]

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


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

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

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

    Так что книга полезна тем что автор делится секретами когда использовать различные паттены, а когда точно нельзя использовать определенные паттерны.
  • Игорь Шевченко © (28.09.08 11:08) [28]
    Городской Шаман   (28.09.08 06:37) [27]


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


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

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


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


    Конечно тоже смешно, но я прошел именно такой путь - изучал Delphi не прочитав ни одной книжки - по одной простой причине - их, книжек, еще не успели написать, ну и напечатать тоже. Ты как думаешь вообще - авторы, которые эти книжки писали, тоже ждали, пока на них первокнига не снизойдет ?
  • Городской Шаман (28.09.08 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 (подсмотрел в реестре).
    Но была проблемка - данные не всегда после сохранения оказывались в базе. Как вы думаете в чем?
  • Городской Шаман (28.09.08 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;



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

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

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

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

    И в добавок. Они учат шаблонам содержащим ошибки. А ученик выучивший эти шаблоны об этих ошибках и не знает ничего.
  • Riply © (06.10.08 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 © (06.10.08 09:08) [34]
    > [33] Riply ©   (06.10.08 06:41)

    Уфф...
    При помощи моей кошки, чертовой бабушки и калькулятора,
    вроде удалось все привести к "правильному" виду. :)
    Но проверка, все-равно, не помешает.
    "Меня терзают смутные сомнения", что это безобразие может быть разным, даже в разных сервис паках.
  • Игорь Шевченко © (06.10.08 10:05) [35]
    для рассмотрения структур EPROCESS, KPROCESS и прочих рекомендую скачать и установить Debugging Tools for Windows (с www.microsoft.com), скачать отладочные символы (насколько я знаю, именно скачать, а не настроить сервер символов) и в windbg в режиме локальной отладки ядра сказать dt nt!_EPROCESS
  • Riply © (06.10.08 11:04) [36]
    > [35] Игорь Шевченко ©   (06.10.08 10:05)
    > для рассмотрения структур EPROCESS, KPROCESS и прочих рекомендую скачать и установить Debugging Tools for Windows

    Спасибо.

    P.S.
    Т.е. все что мы с вместе кошкой делали (возились с EPROCESS) можно отправить "коту под хвост" ? :)
  • slow!alfamoon!com (06.10.08 11:29) [37]
    Riply
    тут дело в том, что полностью доверять реактосу - нельзя. У них в некоторых случаях встречаются несоответствия с win (что вполне понятно). У тебя DDK нет, что ли?
  • Riply © (06.10.08 11:36) [38]
    > [37] slow!alfamoon!com   (06.10.08 11:29)
    > У тебя DDK нет, что ли?

    Есть..., вроде..., но... наверное, какой-то не очень правильный.
    Например, струкруры EPROCESS я в нем не нашла.
  • Rouse_ © (06.10.08 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;

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

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

    Да кстати... Приведенная мной структура актуальна для W2k
  • slow!alfamoon!com (06.10.08 18:39) [42]
    Ой. WinDBG надо, разумеется. В ДДК может не оказаться кое чего. + WRK заимей
  • Riply © (06.10.08 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 заимей

    К сожалению, мне не так просто "заиметь". Интернета у меня такая, однако :(
  • Игорь Шевченко © (06.10.08 19:46) [44]

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


    ну один раз можно и 300 метров выкачать. Оно все равно полезней, чем на форум трафик тратить :)
  • Rouse_ © (07.10.08 10:31) [45]

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

    Начиная с...


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

    Он вызывается в GetUserSIDFromProcess
  • slow!alfamoon!com (07.10.08 11:39) [46]
    wrk не сильно большой (метров 30). Но полезный
  • Riply © (26.10.08 14:57) [47]
    > [1] Rouse_ ©   (26.09.08 11:41)
    > Но есть у меня тут кусочек драйвера, который тоже нормально работает:

    Неа, это не "кусочек драйвера", а сплошные загадки :)
    Давай начнем с азов:
    Как я понимаю, структура pEProcess->Peb->ProcessParameters содержит
    указатели, валидные только в рамках "подопытного" процесса. Это так ?
    Если да, то каким образом, мы так спокойно гуляем по этим указателям, чего-то там читаем
    (например, pEProcess->Peb->ProcessParameters->ImagePathName.Buffer) и при этом не получаем BSOD ?
 
Конференция "WinAPI" » RtlCopyUnicodeString и IRQL
Есть новые Нет новых   [134435   +33][b:0][p:0.008]