public
class
PathConverter
{
[DllImport(
"mpr.dll"
)]
[
return
: MarshalAs(UnmanagedType.U4)]
static
extern
int
WNetGetUniversalName(
string
lpLocalPath,
[MarshalAs(UnmanagedType.U4)]
int
dwInfoLevel,
IntPtr lpBuffer,
[MarshalAs(UnmanagedType.U4)]
ref
int
lpBufferSize);
const
int
UNIVERSAL_NAME_INFO_LEVEL = 0x00000001;
const
int
REMOTE_NAME_INFO_LEVEL = 0x00000002;
const
int
ERROR_MORE_DATA = 234;
const
int
NOERROR = 0;
public
string
GetUniversalName(
string
localPath)
{
string
retVal =
null
;
IntPtr buffer = IntPtr.Zero;
try
{
int
size = 0;
int
apiRetVal = WNetGetUniversalName(localPath, UNIVERSAL_NAME_INFO_LEVEL, (IntPtr)IntPtr.Size,
ref
size);
if
(apiRetVal != ERROR_MORE_DATA)
throw
new
Win32Exception(apiRetVal);
buffer = Marshal.AllocCoTaskMem(size);
apiRetVal = WNetGetUniversalName(localPath, UNIVERSAL_NAME_INFO_LEVEL, buffer,
ref
size);
if
(apiRetVal != NOERROR)
throw
new
Win32Exception(apiRetVal);
retVal = Marshal.PtrToStringAnsi(
new
IntPtr(buffer.ToInt64() + IntPtr.Size));
}
finally
{
Marshal.FreeCoTaskMem(buffer);
}
return
retVal;
}
}