Win32 WNet API和NFS路径出现问题

时间:2011-06-02 20:09:15

标签: winapi nfs cifs wnet

我在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用于在NFS上使用WNetAddConnection2(),但是这个代码也失败了,错误50“请求不受支持”。我可以使用“net use”命令或Microsoft提供的NFS特定的mount.exe工具成功安装导出。

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

我的一般问题是,是否有人使用WNet API与NFS提供商取得了更好的成功?具体来说,是否有一些机制可以用来确定远程路径的提供者?

1 个答案:

答案 0 :(得分:0)

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

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

两次调用WNetGetResourceInformation,一次使用“NFS网络”的lpProvider,一次使用“Microsoft Windows Network”,一直工作并立即返回。