![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
RtlCopyUnicodeString и IRQL
Riply © (2008-09-26 11:11:00)Здравствуйте !
В описании процедуры RtlCopyUnicodeString MSDN указывает следующее:
Requirements
IRQL: >= DISPATCH_LEVEL
Поясните, пожалуйста, что имеется ввиду ?
Неужели надо понимать буквально ?
(т.е. при IRQL < DISPATCH_LEVEL, с ней нельзя работать)
Игорь Шевченко (2008-09-26 15:10:00) [41]
> Мы с ним еще не успели познакомиться :)
> Но, раз Вы его рекомендуете уже не в первый раз,
> то процесс знакомства придется срочно ускорить :)
Знакомься. Количество вопросов сократится, а количество синих сообщений возрастет. Driver Verifier нужен для того, чтобы получать синие сообщения.
Rouse_ (2008-09-26 13:32:00) [42]
> Вдруг там что-то типа безопасного копирования с какими-нибудь
> спин-блокировками ?
Нет, обычная инициализация приемного буффера и RtlCopyMemory
Riply (2008-09-26 13:17:00) [43]> [3] Игорь Шевченко © (26.09.08 12:56)
> Driver Verifier - наше все.
Мы с ним еще не успели познакомиться :)
Но, раз Вы его рекомендуете уже не в первый раз,
то процесс знакомства придется срочно ускорить :)
> [4] Rouse_ © (26.09.08 13:06)
>> Тогда полагаем, что в MSDN опечатка ?
> Скорее всего, т.к. RtlCopyUnicodeString работает исключительно через RtlCopyMemory
> и я не вижу никаких предпосылок для повышения IRQL...
Просто я уже всего стала боятся.
Вдруг там что-то типа безопасного копирования с какими-нибудь спин-блокировками ?
Rouse_ (2008-09-26 13:06:00) [44]
> Тогда полагаем, что в MSDN опечатка ?
Скорее всего, т.к. RtlCopyUnicodeString работает исключительно через RtlCopyMemory и я не вижу никаких предпосылок для повышения IRQL...
Игорь Шевченко (2008-09-26 12:56:00) [45]
> В описании процедуры RtlCopyUnicodeString MSDN указывает
> следующее:
> Requirements
> IRQL: >= DISPATCH_LEVEL
ну если во время RtlCopyMemory произойдет обращение к памяти, которая в данный момент не отображена на физическую, то вылезет красивое синее сообщение IRQL IS NOT LESS OR EQUAL.
Driver Verifier - наше все.
Riply (2008-09-26 12:18:00) [46]> [1] Rouse_ © (26.09.08 11:41)
> Вообщето можно и вот так:
Да, конечно можно, только вот еще хочется понять почему они так написали.
>Но есть у меня тут кусочек драйвера:
Очеь интересный для меня "кусочек". Спасибо :)
> который тоже нормально работает
Т.е. ты хочешь сказать, что функция GetProcessInfo у тебя вызывается
в том числе и при IRQL < DISPATCH_LEVEL, и нормально отрабатывает ?
Тогда полагаем, что в MSDN опечатка ?
Rouse_ (2008-09-26 11:41:00) [47]Вообщето можно и вот так:
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;
}