Проблема с Win32 WNet API и NFS путями

Я работаю в системе Win2K8R2, в которой установлен клиент Microsoft NFS в дополнение к клиенту Windows CIFS.

Учитывая UNC-путь (который клиент NFS поддерживает с предостережениями), я должен быть в состоянии сказать, будут ли операции на пути обрабатываться клиентом CIFS или NFS. WNetGetResourceInformation(), по-видимому, обеспечивает это, но я не смог заставить его работать, когда UNC-путь ведет к NFS-серверу.

Образец кода:

int GetResourceInformation(TCHAR* path, void* buffer, DWORD* size)
{
    TCHAR* p = NULL;
    NETRESOURCE nr;
    memset(&nr, 0, sizeof(nr));

    nr.lpRemoteName = path;

    DWORD dwRetVal = WNetGetResourceInformation(&nr, buffer, size, &p);

    if(dwRetVal == NO_ERROR)
    {
        NETRESOURCE* tmp = (NETRESOURCE*)buffer;
        wprintf(L"%s provider=%s system=%s\n", path, tmp->lpProvider, (p == NULL) ? L"<null>" : p);
    }
    else
    {
        wprintf(L"WNetGetResourceInformation failed for %s with error: %u\n", path, dwRetVal);
    }

    return dwRetVal;
}

Я также попытался заполнить поля NETRESOURCE lpProvider и / или dwType, как предложено в документе, но без изменений в поведении.

Если я передаю функции путь CIFS UNC, то это успешно. Если я передаю ему путь NFS UNC, он завершается с ошибкой 487 "Попытка доступа к неверному адресу". Я также попытался передать имя хоста в стиле пути NFS:/export/file, но это не удалось с ошибкой 67 "Сетевое имя не найдено".

Я нашел следующий пример использования WNetAddConnection2() с NFS, но этот код также не работает для меня с ошибкой 50 "Запрос не поддерживается". Я могу успешно смонтировать экспорт, используя команду "net use" или специальный инструмент NFS mount.exe, предоставленный Microsoft.

Наконец, WNetOpenEnum/WNetEnumResource не возвращает мне никакой информации о провайдере NFS и даже не показывает подключенные диски, которые я подключил через "net use" или mount.exe.

Мой общий вопрос: кто-нибудь добился большего успеха, используя API-интерфейсы WNet с провайдером NFS? В частности, есть ли какой-то механизм, который я могу использовать для определения поставщика для удаленного пути?

1 ответ

Вы строите как x86 или x64? Похоже, что API WNet * не работают правильно для общих ресурсов NFS из процесса x86 под WOW64. Вы можете увидеть это без написания кода - если у вас смонтирован общий ресурс NFS, "C:\windows\system32\net use" покажет это, а "C:\windows\syswow64\net use" - нет. Доступ к файловой системе кажется нормальным 32-битным процессом, но ни один из API не работает.

Даже построенный как x64, использование NULL lpProvider для меня несовместимо. Половина времени не работает, другая половина ждет около 5 секунд, прежде чем вернуться.

Вызов WNetGetResourceInformation дважды, один раз с lpProvider "NFS Network" и один раз с "Microsoft Windows Network", работает последовательно и мгновенно возвращается.

Другие вопросы по тегам