📄 wnet.c
字号:
return WN_NO_NETWORK;
}
/**************************************************************************
* WNetGetConnectionA [MPR.@]
*
* RETURNS
* - WN_BAD_LOCALNAME lpLocalName makes no sense
* - WN_NOT_CONNECTED drive is a local drive
* - WN_MORE_DATA buffer isn't big enough
* - WN_SUCCESS success (net path in buffer)
*
* FIXME: need to test return values under different errors
*/
DWORD WINAPI WNetGetConnectionA( LPCSTR lpLocalName,
LPSTR lpRemoteName, LPDWORD lpBufferSize )
{
DWORD ret;
if (!lpLocalName)
ret = WN_BAD_POINTER;
else if (!lpBufferSize)
ret = WN_BAD_POINTER;
else if (!lpRemoteName && *lpBufferSize)
ret = WN_BAD_POINTER;
else
{
int len = MultiByteToWideChar(CP_ACP, 0, lpLocalName, -1, NULL, 0);
if (len)
{
PWSTR wideLocalName = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
if (wideLocalName)
{
WCHAR wideRemoteStatic[MAX_PATH];
DWORD wideRemoteSize = sizeof(wideRemoteStatic) / sizeof(WCHAR);
MultiByteToWideChar(CP_ACP, 0, lpLocalName, -1, wideLocalName, len);
/* try once without memory allocation */
ret = WNetGetConnectionW(wideLocalName, wideRemoteStatic,
&wideRemoteSize);
if (ret == WN_SUCCESS)
{
int len = WideCharToMultiByte(CP_ACP, 0, wideRemoteStatic,
-1, NULL, 0, NULL, NULL);
if (len <= *lpBufferSize)
{
WideCharToMultiByte(CP_ACP, 0, wideRemoteStatic, -1,
lpRemoteName, *lpBufferSize, NULL, NULL);
ret = WN_SUCCESS;
}
else
{
*lpBufferSize = len;
ret = WN_MORE_DATA;
}
}
else if (ret == WN_MORE_DATA)
{
PWSTR wideRemote = HeapAlloc(GetProcessHeap(), 0,
wideRemoteSize * sizeof(WCHAR));
if (wideRemote)
{
ret = WNetGetConnectionW(wideLocalName, wideRemote,
&wideRemoteSize);
if (ret == WN_SUCCESS)
{
if (len <= *lpBufferSize)
{
WideCharToMultiByte(CP_ACP, 0, wideRemoteStatic,
-1, lpRemoteName, *lpBufferSize, NULL, NULL);
ret = WN_SUCCESS;
}
else
{
*lpBufferSize = len;
ret = WN_MORE_DATA;
}
}
HeapFree(GetProcessHeap(), 0, wideRemote);
}
else
ret = WN_OUT_OF_MEMORY;
}
HeapFree(GetProcessHeap(), 0, wideLocalName);
}
else
ret = WN_OUT_OF_MEMORY;
}
else
ret = WN_BAD_LOCALNAME;
}
if (ret)
SetLastError(ret);
TRACE("Returning %d\n", ret);
return ret;
}
/**************************************************************************
* WNetGetConnectionW [MPR.@]
*
* FIXME: need to test return values under different errors
*/
DWORD WINAPI WNetGetConnectionW( LPCWSTR lpLocalName,
LPWSTR lpRemoteName, LPDWORD lpBufferSize )
{
DWORD ret;
TRACE("(%s, %p, %p)\n", debugstr_w(lpLocalName), lpRemoteName,
lpBufferSize);
if (!lpLocalName)
ret = WN_BAD_POINTER;
else if (!lpBufferSize)
ret = WN_BAD_POINTER;
else if (!lpRemoteName && *lpBufferSize)
ret = WN_BAD_POINTER;
else if (!lpLocalName[0])
ret = WN_BAD_LOCALNAME;
else
{
if (lpLocalName[1] == ':')
{
switch(GetDriveTypeW(lpLocalName))
{
case DRIVE_REMOTE:
{
static const WCHAR unc[] = { 'u','n','c','\\' };
WCHAR rremote[MAX_PATH], *remote = rremote;
if (!QueryDosDeviceW( lpLocalName, remote, MAX_PATH )) remote[0] = 0;
else if (!strncmpW(remote, unc, 4))
{
remote += 2;
remote[0] = '\\';
}
else if (remote[0] != '\\' || remote[1] != '\\')
FIXME("Don't know how to convert %s to an unc\n", debugstr_w(remote));
if (strlenW(remote) + 1 > *lpBufferSize)
{
*lpBufferSize = strlenW(remote) + 1;
ret = WN_MORE_DATA;
}
else
{
strcpyW( lpRemoteName, remote );
*lpBufferSize = strlenW(lpRemoteName) + 1;
ret = WN_SUCCESS;
}
break;
}
case DRIVE_REMOVABLE:
case DRIVE_FIXED:
case DRIVE_CDROM:
TRACE("file is local\n");
ret = WN_NOT_CONNECTED;
break;
default:
ret = WN_BAD_LOCALNAME;
}
}
else
ret = WN_BAD_LOCALNAME;
}
if (ret)
SetLastError(ret);
TRACE("Returning %d\n", ret);
return ret;
}
/**************************************************************************
* WNetSetConnectionA [MPR.@]
*/
DWORD WINAPI WNetSetConnectionA( LPCSTR lpName, DWORD dwProperty,
LPVOID pvValue )
{
FIXME( "(%s, %08X, %p): stub\n", debugstr_a(lpName), dwProperty, pvValue );
SetLastError(WN_NO_NETWORK);
return WN_NO_NETWORK;
}
/**************************************************************************
* WNetSetConnectionW [MPR.@]
*/
DWORD WINAPI WNetSetConnectionW( LPCWSTR lpName, DWORD dwProperty,
LPVOID pvValue )
{
FIXME( "(%s, %08X, %p): stub\n", debugstr_w(lpName), dwProperty, pvValue );
SetLastError(WN_NO_NETWORK);
return WN_NO_NETWORK;
}
/*****************************************************************
* WNetGetUniversalNameA [MPR.@]
*/
DWORD WINAPI WNetGetUniversalNameA ( LPCSTR lpLocalPath, DWORD dwInfoLevel,
LPVOID lpBuffer, LPDWORD lpBufferSize )
{
DWORD err, size;
FIXME( "(%s, 0x%08X, %p, %p): stub\n",
debugstr_a(lpLocalPath), dwInfoLevel, lpBuffer, lpBufferSize);
switch (dwInfoLevel)
{
case UNIVERSAL_NAME_INFO_LEVEL:
{
LPUNIVERSAL_NAME_INFOA info = (LPUNIVERSAL_NAME_INFOA)lpBuffer;
size = sizeof(*info) + lstrlenA(lpLocalPath) + 1;
if (*lpBufferSize < size)
{
err = WN_MORE_DATA;
break;
}
info->lpUniversalName = (char *)info + sizeof(*info);
lstrcpyA(info->lpUniversalName, lpLocalPath);
*lpBufferSize = size;
err = WN_NO_ERROR;
break;
}
case REMOTE_NAME_INFO_LEVEL:
err = WN_NO_NETWORK;
break;
default:
err = WN_BAD_VALUE;
break;
}
SetLastError(err);
return err;
}
/*****************************************************************
* WNetGetUniversalNameW [MPR.@]
*/
DWORD WINAPI WNetGetUniversalNameW ( LPCWSTR lpLocalPath, DWORD dwInfoLevel,
LPVOID lpBuffer, LPDWORD lpBufferSize )
{
DWORD err, size;
FIXME( "(%s, 0x%08X, %p, %p): stub\n",
debugstr_w(lpLocalPath), dwInfoLevel, lpBuffer, lpBufferSize);
switch (dwInfoLevel)
{
case UNIVERSAL_NAME_INFO_LEVEL:
{
LPUNIVERSAL_NAME_INFOW info = (LPUNIVERSAL_NAME_INFOW)lpBuffer;
size = sizeof(*info) + (lstrlenW(lpLocalPath) + 1) * sizeof(WCHAR);
if (*lpBufferSize < size)
{
err = WN_MORE_DATA;
break;
}
info->lpUniversalName = (LPWSTR)((char *)info + sizeof(*info));
lstrcpyW(info->lpUniversalName, lpLocalPath);
*lpBufferSize = size;
err = WN_NO_ERROR;
break;
}
case REMOTE_NAME_INFO_LEVEL:
err = WN_NO_NETWORK;
break;
default:
err = WN_BAD_VALUE;
break;
}
SetLastError(err);
return err;
}
/*
* Other Functions
*/
/**************************************************************************
* WNetGetUserA [MPR.@]
*
* FIXME: we should not return ourselves, but the owner of the drive lpName
*/
DWORD WINAPI WNetGetUserA( LPCSTR lpName, LPSTR lpUserID, LPDWORD lpBufferSize )
{
if (GetUserNameA( lpUserID, lpBufferSize )) return WN_SUCCESS;
return GetLastError();
}
/*****************************************************************
* WNetGetUserW [MPR.@]
*
* FIXME: we should not return ourselves, but the owner of the drive lpName
*/
DWORD WINAPI WNetGetUserW( LPCWSTR lpName, LPWSTR lpUserID, LPDWORD lpBufferSize )
{
if (GetUserNameW( lpUserID, lpBufferSize )) return WN_SUCCESS;
return GetLastError();
}
/*********************************************************************
* WNetConnectionDialog [MPR.@]
*/
DWORD WINAPI WNetConnectionDialog( HWND hwnd, DWORD dwType )
{
FIXME( "(%p, %08X): stub\n", hwnd, dwType );
SetLastError(WN_NO_NETWORK);
return WN_NO_NETWORK;
}
/*********************************************************************
* WNetConnectionDialog1A [MPR.@]
*/
DWORD WINAPI WNetConnectionDialog1A( LPCONNECTDLGSTRUCTA lpConnDlgStruct )
{
FIXME( "(%p): stub\n", lpConnDlgStruct );
SetLastError(WN_NO_NETWORK);
return WN_NO_NETWORK;
}
/*********************************************************************
* WNetConnectionDialog1W [MPR.@]
*/
DWORD WINAPI WNetConnectionDialog1W( LPCONNECTDLGSTRUCTW lpConnDlgStruct )
{
FIXME( "(%p): stub\n", lpConnDlgStruct );
SetLastError(WN_NO_NETWORK);
return WN_NO_NETWORK;
}
/*********************************************************************
* WNetDisconnectDialog [MPR.@]
*/
DWORD WINAPI WNetDisconnectDialog( HWND hwnd, DWORD dwType )
{
FIXME( "(%p, %08X): stub\n", hwnd, dwType );
SetLastError(WN_NO_NETWORK);
return WN_NO_NETWORK;
}
/*********************************************************************
* WNetDisconnectDialog1A [MPR.@]
*/
DWORD WINAPI WNetDisconnectDialog1A( LPDISCDLGSTRUCTA lpConnDlgStruct )
{
FIXME( "(%p): stub\n", lpConnDlgStruct );
SetLastError(WN_NO_NETWORK);
return WN_NO_NETWORK;
}
/*********************************************************************
* WNetDisconnectDialog1W [MPR.@]
*/
DWORD WINAPI WNetDisconnectDialog1W( LPDISCDLGSTRUCTW lpConnDlgStruct )
{
FIXME( "(%p): stub\n", lpConnDlgStruct );
SetLastError(WN_NO_NETWORK);
return WN_NO_NETWORK;
}
/*****************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -