2011-06-02 55 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」一直運行並立即返回。