int __stdcall NetpwPathCanonicalize(LPWSTR PathName, LPWSTR Outbuf, DWORD OutbufLen, LPWSTR Prefix, LPDWORD PathType, DWORD Flags)
{
bool v7;
int result;
v7 = !Prefix || !*Prefix;
Prefix = (LPWSTR)*PathType;
if
( *PathType || (result = NetpwPathType(PathName, (int)&Prefix, 0), !result) )
{
if
( v7 || (result = NetpwPathType(Prefix, (int)&Flags, 0), !result) )
{
if
( OutbufLen != 0 )
{
*Outbuf = 0;
result = CanonPathName(Prefix, PathName, Outbuf, OutbufLen, 0);
//
核心函数,主要处理在这里,问题也出在这里
if
( !result )
result = NetpwPathType(Outbuf, (int)PathType, 0);
}
else
{
result = 2123;
}
}
}
return
result;
}
int __stdcall CanonPathName(LPWSTR PathPrefix, LPWSTR PathName, LPWSTR Buffer, DWORD BufferSize, LPDWORD RetSize)
{
size_t preLen;
size_t pathLen;
wchar_t pathBuffer[MAX_PATH*2 + 1];
if
( PathPrefix && *PathPrefix )
{
preLen = wcslen(PathPrefix);
if
( preLen != 0)
{
if
( preLen > 520 )
//520
= sizeof(pathBuffer) - 1
return
0x7Bu;
//
ERROR_INVALID_NAME
wcscpy(pathBuffer, PathPrefix);
if
( pathBuffer[preLen-1] !=
'\\'
&& pathBuffer[preLen-1] !=
'/'
)
//
判断前缀是否以
'\'或'
/'结尾
{
wcscat(pathBuffer, L
"\\"
);
++preLen;
}
if
( PathName[0] ==
'\\'
|| PathName[0] ==
'/'
)
++pathLen;
}
}
else
{
pathBuffer[0] = 0;
}
pathLen = wcslen(PathName);
if
(pathLen + preLen > sizeof(pathBuffer) - 1)
return
0x7Bu;
//
ERROR_INVALID_NAME
wcscat(pathBuffer, PathName);
if
( pathBuffer )
{
do
//
该循环把路径中的
'/'
转换成'\'
{
if
( *pathBuffer ==
'/'
)
*pathBuffer =
'\\'
;
++pathBuffer;
}
while
( *pathBuffer );
}
if
( !sub_71C4A2CA() && !ConPathMacros(pathBuffer) )
//ConPathMacros
中存在缓冲区溢出漏洞!!!
return
0x7Bu;
pathLen = 2 * wcslen(&pathBuffer) + 2;
if
( pathLen > BufferSize )
{
if
( RetSize )
*RetSize = pathLen;
result = 0x84Bu;
}
else
{
wcscpy(Buffer, &pathBuffer);
result = 0;
}
return
result;
}