-
Здравствуйте ! В описании процедуры RtlCopyUnicodeString MSDN указывает следующее: Requirements IRQL: >= DISPATCH_LEVEL
Поясните, пожалуйста, что имеется ввиду ? Неужели надо понимать буквально ? (т.е. при IRQL < DISPATCH_LEVEL, с ней нельзя работать)
-
Вообщето можно и вот так: RtlCopyMemory(Dest, Source->Buffer, Source->Length*sizeof(WCHAR));
Dest[Source->Length / sizeof(WCHAR)] = L'\0'; Но есть у меня тут кусочек драйвера, который тоже нормально работает: BOOLEAN GetProcessInfo(ProcessData *pProcessData)
if(!pProcessData)
return FALSE;
status = PsLookupProcessByProcessId(pProcessData->ulProcessID, (PEPROCESS *)&pEProcess);
if(!NT_SUCCESS(status))
if(!pEProcess)
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) else
pProcessData->usWindowTitle.MaximumLength = min(pEProcess->Peb->ProcessParameters->WindowTitle.Length + sizeof(WCHAR), PROCESSDATA_MAX_LENGTH - sizeof(WCHAR));
pProcessData->usWindowTitle.Buffer = (PWSTR)ExAllocateFromNPagedLookasideList(&g_GetProcessLookasideList);
RtlZeroMemory(pProcessData->usWindowTitle.Buffer, pProcessData->usWindowTitle.MaximumLength);
RtlCopyUnicodeString(&pProcessData->usWindowTitle, &pEProcess->Peb->ProcessParameters->WindowTitle);
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))
}
return TRUE;
}
-
> [1] Rouse_ © (26.09.08 11:41) > Вообщето можно и вот так: Да, конечно можно, только вот еще хочется понять почему они так написали.
>Но есть у меня тут кусочек драйвера:
Очеь интересный для меня "кусочек". Спасибо :)
> который тоже нормально работает
Т.е. ты хочешь сказать, что функция GetProcessInfo у тебя вызывается в том числе и при IRQL < DISPATCH_LEVEL, и нормально отрабатывает ? Тогда полагаем, что в MSDN опечатка ?
-
> В описании процедуры RtlCopyUnicodeString MSDN указывает > следующее: > Requirements > IRQL: >= DISPATCH_LEVEL
ну если во время RtlCopyMemory произойдет обращение к памяти, которая в данный момент не отображена на физическую, то вылезет красивое синее сообщение IRQL IS NOT LESS OR EQUAL.
Driver Verifier - наше все.
-
> Тогда полагаем, что в MSDN опечатка ?
Скорее всего, т.к. RtlCopyUnicodeString работает исключительно через RtlCopyMemory и я не вижу никаких предпосылок для повышения IRQL...
-
> [3] Игорь Шевченко © (26.09.08 12:56) > Driver Verifier - наше все.
Мы с ним еще не успели познакомиться :) Но, раз Вы его рекомендуете уже не в первый раз, то процесс знакомства придется срочно ускорить :)
> [4] Rouse_ © (26.09.08 13:06) >> Тогда полагаем, что в MSDN опечатка ?
> Скорее всего, т.к. RtlCopyUnicodeString работает исключительно через RtlCopyMemory > и я не вижу никаких предпосылок для повышения IRQL...
Просто я уже всего стала боятся. Вдруг там что-то типа безопасного копирования с какими-нибудь спин-блокировками ?
-
> Вдруг там что-то типа безопасного копирования с какими-нибудь > спин-блокировками ?
Нет, обычная инициализация приемного буффера и RtlCopyMemory
-
> Мы с ним еще не успели познакомиться :) > Но, раз Вы его рекомендуете уже не в первый раз, > то процесс знакомства придется срочно ускорить :)
Знакомься. Количество вопросов сократится, а количество синих сообщений возрастет. Driver Verifier нужен для того, чтобы получать синие сообщения.
-
> [7] Игорь Шевченко © (26.09.08 15:10) > Знакомься. Количество вопросов сократится, а количество синих сообщений возрастет. > Driver Verifier нужен для того, чтобы получать синие сообщения.
У меня такой вопрос: а чем BSOD вреден для компьютера(в смысле железа) и для системы ? Ведь, когда она бедненькая падает только из-за того, что я, например, на автомате вызвала что-нибудь типа Move, у меня сердце кровью обливается. Так ее жалко :)
-
Ты понимаешь что такое BSOD?
-
> [9] slow!alfamoon!com (26.09.08 16:36) > Ты понимаешь что такое BSOD?
Судя по вопросу - нет. И вообще он у меня не синий а черный. Даже нормальный BSOD и тот получить не могу :)
-
> а чем BSOD вреден для компьютера(в смысле железа)
ничем
> и для системы ?
перезапускать надо, а так не вреден.
Вопрос из серии "Чем вредно для программы сообщение: Программа выполнила недопустимую операцию и будет закрыта" ? Да ничем не вредно, это информация.
-
BSOD это остановка работы системы при возникновении нештатной ситуации.
-
> У меня такой вопрос: а чем BSOD вреден для компьютера(в > смысле железа) и для системы ?
0_о ты что на живой машине эксперементируешь? Фига-се... Срочно покупать виртуалку :) Мне например решение от http://www.parallels.com нравиться. Да и стоит копейки 45 чтоли долларов... А по поводу вредно-не вредно, в принципе как Игорь сказал, вредно быть не должно (я тоже так думал). Воть... так-то оно так, но у меня на момент экспериментов сгорел ровно 1 комп и 4 USB разветвителя (я собственно гдето год назад жаловался на форуме как раз) :) Мошт комп был дохлый, мошт разветвители кривые, то что руки были кривые, это-то понятно, но мне больше эксперементировать не охота на чистом железе - тестирование только под ВМ :)
-
Цвет экрана и шрифта при бсоде настраивается. Вроде на сисинтерналсах утиль видел.
-
> [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 разветвителя Ну нельзя же так людей пугать :)
-
> Riply © (26.09.08 11:11) > > Здравствуйте ! > В описании процедуры RtlCopyUnicodeString MSDN указывает > следующее: > Requirements > IRQL: >= DISPATCH_LEVEL
Если у MS куча багов в ОС, то почему вы считаете что не может быть багов в документации. Все таки скачайте книгу Солдатова "Программирование драйверов Windows" http://www.cyberinfo.ru/index.php?newsid=671
-
-
> [16] Городской Шаман (26.09.08 19:37) > Если у MS куча багов в ОС, то почему вы считаете что не может быть багов в документации.
Я так не считаю. Разумеется есть. "Не ошибается только тот, кто ничего не делает" (с) (К сожалению, не помню чья) Но если меня спросят: "Где вероятнее встретить ошибку ? У Солдатова(ничего против него не имею, просто как пример) или в MSDN ?", то я думаю, ответ - очевиден :)
P.S. "Солдатова" скачала. Спасибо.
-
|