Конференция "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.
 
Конференция "WinAPI" » RtlCopyUnicodeString и IRQL
Есть новые Нет новых   [134435   +33][b:0][p:0.003]