1

我在 Win2K8R2 系统上运行,该系统除了安装了 Windows CIFS 客户端外,还安装了 Microsoft 的 NFS 客户端。

给定一个 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 路径样式 hostname:/export/file 但这失败并出现错误 67“找不到网络名称”。

我发现以下示例将 WNetAddConnection2() 与 NFS 一起使用,但此代码对我来说也失败,错误 50“不支持请求”。我可以使用“net use”命令或 Microsoft 提供的特定于 NFS 的 mount.exe 工具成功挂载导出。

最后,WNetOpenEnum/WNetEnumResource 不会为我返回任何 NFS 提供程序信息,甚至不会显示我通过“net use”或 mount.exe 映射的任何连接的驱动器。

我的一般问题是,有没有人通过 NFS 提供程序使用 WNet API 获得了更好的成功?具体来说,我可以使用某种机制来确定远程路径的提供者吗?

4

1 回答 1

0

Are you building as x86 or x64? It looks like the WNet* API's don't work correctly for NFS shares from an x86 process under WOW64. You can see this without writing code - if you have an NFS share mounted, "C:\windows\system32\net use" will show it, where "C:\windows\syswow64\net use" will not. Filesystem access seems OK the 32-bit process, but none of the APIs work.

Even built as x64, using a NULL lpProvider is inconsistent for me. Half the time it doesn't work, the other half it waits about 5 seconds before returning.

Calling WNetGetResourceInformation twice, once with a lpProvider of "NFS Network" and once with "Microsoft Windows Network" works consistently and returns instantly.

于 2012-12-05T09:50:57.520 回答