Win32 WNet API 和 NFS 路径的问题

Posted

技术标签:

【中文标题】Win32 WNet API 和 NFS 路径的问题【英文标题】:Problem with Win32 WNet APIs and NFS paths 【发布时间】:2011-06-02 20:09:15 【问题描述】:

我在 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;

我还尝试按照doc 中的建议填写 NETRESOURCE lpProvider 和/或 dwType 字段,但行为没有改变。

如果我向函数传递 CIFS UNC 路径,它会成功。如果我将 NFS UNC 路径传递给它,它会失败并显示错误 487“尝试访问无效地址。”。我还尝试传递本机 NFS 路径样式 hostname:/export/file 但这失败并出现错误 67“找不到网络名称。”

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

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

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

【问题讨论】:

【参考方案1】:

您是在构建 x86 还是 x64?对于来自 WOW64 下的 x86 进程的 NFS 共享,WNet* API 似乎无法正常工作。您无需编写代码即可看到这一点 - 如果您安装了 NFS 共享,“C:\windows\system32\net use”将显示它,而“C:\windows\syswow64\net use”则不会。文件系统访问在 32 位进程中似乎没问题,但所有 API 都不起作用。

即使构建为 x64,使用 NULL lpProvider 对我来说也是不一致的。一半时间它不起作用,另一半时间它等待大约 5 秒才返回。

调用 WNetGetResourceInformation 两次,一次使用“NFS 网络”的 lpProvider,一次使用“Microsoft Windows 网络”可以始终如一地工作并立即返回。

【讨论】:

以上是关于Win32 WNet API 和 NFS 路径的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何确定特定 win32 api 调用所需的 windows 库?

win32 API 搜索路径失败

如何从 Win32 API 中的总线关系中获取设备实例路径

WIN32 API里的CreateFile函数如何使用绝对路径

<Win32 API> 获取系统文件夹路径

<Win32 API> 获取系统文件夹路径