![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
IoCreateSymbolicLink. Требования к параметрам.
Riply © (2008-11-20 07:07:00)Здравствуйте !
Все дело происходит в DriverEntry, примерно по такой схеме:
function DriverEntry(const pDriverObject: PDRIVER_OBJECT; const pRegistryPath: PUNICODE_STRING): NTSTATUS; stdcall;
var
uDeviceName: UNICODE_STRING;
pMemBuffer: PVOID;
begin
pMemBuffer := ExAllocatePoolWithTag(PagedPool, $400, TempMemTag);
if pMemBuffer <> nil then
try
//........... Много всего происходит
// Собираем имя:
RtlMoveMemory(pMemBuffer, PREFIX_DEVICE_U.Buffer, PREFIX_DEVICE_U.Length);
RtlMoveMemory(IncPtr(pMemBuffer, PREFIX_DEVICE_U.Length), MySuperPuperName.Buffer, MySuperPuperName.Length);
uDeviceName.Buffer := pMemBuffer;
//...........
Result := IoCreateDevice(..., @uDeviceName, ...);
{$IFDEF SH_DRV_DEBUG}DrvLog_WriteMessU('IoCreateDevice', @uDeviceName, Result, 0, 0);{$ENDIF}
if NT_SUCCESS(Result) then
begin
Result := IoCreateSymbolicLink(@FunctDevSymLink, @uDeviceName);
{$IFDEF SH_DRV_DEBUG}DrvLog_WriteMessU('IoCreateSymbolicLink', @FunctDevSymLink, Result, 0, 0);{$ENDIF}
end;
//...........
Все нормально работает.
Попробуем изменить размер запрашиваемой памяти для pMemBuffer с $400 на $10000,
(все остальное оставим без изменений)
Теперь IoCreateSymbolicLink возвращает нам STATUS_INVALID_PARAMETER (IoCreateDevice отрабатывает нормально).
В Help`е я не нашла никаких ограничений на тип и "местоположение"
памяти для параметров IoCreateSymbolicLink.
Поясните мне пожалуйста почему так происходит и, вообще, возможно ли такое влияние ?
P.S.
Просто весь мой опыт говорит, что если сталкиваешся с чудесами - ищи ошибку в программе :)
Сергей М. (2008-11-20 09:42:00) [1]
> на ДМ самые сильные телепаты
Годы изнурительно-изощреннных тренировок не проходят бесследно)
Riply (2008-11-20 09:32:00) [2]> [1] Сергей М. © (20.11.08 09:21)
> Что-то нигде не видно установки значений полей uDeviceName.Length, uDeviceName.MaximumLength
Потрясающе !
Дело в том, что приведенный код "переработан в читабельный" вид.
В настоящем же uDeviceName инициализировалась при помощи собственнолапной ф-ии Us_InitFromMemBlock ,
которая MaximumLength устанавливала равным размеру pMemBuffer.
Спасибо :)
P.S.
Я всегда говорила, что на ДМ самые сильные телепаты ! :)
Сергей М. (2008-11-20 09:21:00) [3]Что-то нигде не видно установки значений полей uDeviceName.Length, uDeviceName.MaximumLength