Здравствуйте !
Все дело происходит в 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, ...);
DrvLog_WriteMessU('IoCreateDevice', @uDeviceName, Result, 0, 0);
if NT_SUCCESS(Result) then
begin
Result := IoCreateSymbolicLink(@FunctDevSymLink, @uDeviceName);
DrvLog_WriteMessU('IoCreateSymbolicLink', @FunctDevSymLink, Result, 0, 0);
end;
Все нормально работает.
Попробуем изменить размер запрашиваемой памяти для pMemBuffer с $400 на $10000,
(все остальное оставим без изменений)
Теперь IoCreateSymbolicLink возвращает нам STATUS_INVALID_PARAMETER (IoCreateDevice отрабатывает нормально).
В Help`е я не нашла никаких ограничений на тип и "местоположение"
памяти для параметров IoCreateSymbolicLink.
Поясните мне пожалуйста почему так происходит и, вообще, возможно ли такое влияние ?
P.S.
Просто весь мой опыт говорит, что если сталкиваешся с чудесами - ищи ошибку в программе :)