Конференция "WinAPI" » IoCreateSymbolicLink. Требования к параметрам.
 
  • Riply © (20.11.08 07:07) [0]
    Здравствуйте !
    Все дело происходит в 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.
    Просто весь мой опыт говорит, что если сталкиваешся с чудесами - ищи ошибку в программе :)
  • Сергей М. © (20.11.08 09:21) [1]
    Что-то нигде не видно установки значений полей uDeviceName.Length, uDeviceName.MaximumLength
  • Riply © (20.11.08 09:32) [2]
    > [1] Сергей М. ©   (20.11.08 09:21)
    > Что-то нигде не видно установки значений полей uDeviceName.Length, uDeviceName.MaximumLength

    Потрясающе !
    Дело в том, что приведенный код "переработан в читабельный" вид.
    В настоящем же uDeviceName инициализировалась при помощи собственнолапной ф-ии Us_InitFromMemBlock ,
    которая MaximumLength устанавливала равным размеру pMemBuffer.
    Спасибо :)

    P.S.
    Я всегда говорила, что на ДМ самые сильные телепаты ! :)
  • Сергей М. © (20.11.08 09:42) [3]

    > на ДМ самые сильные телепаты


    Годы изнурительно-изощреннных тренировок не проходят бесследно)
 
Конференция "WinAPI" » IoCreateSymbolicLink. Требования к параметрам.
Есть новые Нет новых   [134435   +33][b:0][p:0.001]