2011-06-02 109 views
1

我在除Windows CIFS客户端之外还安装了Microsoft NFS客户端的Win2K8R2系统上运行。Win32 WNet API和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领域填充作为doc但在行为上无修改建议。

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

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

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

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

回答

0

你在建造x86还是x64?它看起来像WNet * API在WOW64下的x86进程中不能正常工作。你可以在不写代码的情况下看到它 - 如果你已经挂载了一个NFS共享,“C:\ windows \ system32 \ net use”会显示出来,其中“C:\ windows \ syswow64 \ net use”不会。文件系统访问看起来好像是32位进程,但没有任何API可以工作。

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

调用WNetGetResourceInformation两次,一次使用“NFS Network”的lpProvider,一次使用“Microsoft Windows Network”一直运行并立即返回。