Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

RtlCopyUnicodeString и IRQL


Страницы:   1 2 3

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;
}


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо