La función PathIsDirectory puede bloquearse cuando se llama mediante un nombre de servidor UNC con una barra diagonal inversa final

Este artículo le ayuda a resolver el problema en el que la función puede bloquearse cuando las aplicaciones que usan un nombre de servidor UNC que tiene una barra diagonal inversa final lo PathIsDirectory llaman.

Versión del producto original:   Windows SDK para Windows 10
Número KB original:   4525162

Síntomas

Las aplicaciones que llaman a la función pueden bloquear el subproceso de llamada hasta dos minutos cuando realicen la llamada mediante un nombre de servidor de convención de nomenclatura universal (UNC) que tenga una barra diagonal inversa final, por PathIsDirectory ejemplo: \\servername\ .

Causa

Una aplicación que bloquea un subproceso de llamada en una llamada puede tener una pila de llamadas PathIsDirectory similar a la siguiente:

0:000> kn
# Sitio de llamada de RetAddr de Child-SP
0000006f 3b59f108 00007ffc 94f48ba3 ntdll! ZwWaitForSingleObject+0x14
01 0000006f 3b59f110 00007ffc 8eebb303 KERNELBASE! WaitForSingleObjectEx+0x93
02 (función en línea) ---------------- WINHTTP! HTTP_USER_REQUEST::_HandleSyncPending+0x2d
03 0000006f 3b59f1b0 00007ffc 8eec9a85 WINHTTP! HTTP_USER_REQUEST::SendRequest+0x3f3
04 0000006f 3b59f2b0 00007ffc 8afff4fe WINHTTP! WinHttpSendRequest+0x585
05 0000006f 3b59f410 00007ffc 8b000135 davclnt! DavDoesServerDoDav+0x4ba
06 0000006f 3b59f4f0 00007ffc 8affc2fa davclnt! DavShouldStartWebclientService+0x2f9
07 0000006f 3b59f570 00007ffc 70b8e851 davclnt! NPGetResourceInformation+0x23a
08 0000006f 3b59f610 00007ffc 70b8c7d5 MPR! CGetResourceInformation::TestProvider+0x21
09 0000006f 3b59f650 00007ffc 70b8c9fd MPR! CRoutedOperation::GetResult+0x135
0a 0000006f 3b59f6d0 00007ffc 70b8ca69 MPR! CMprOperation::P erform+0x4d
0b 0000006f 3b59f710 00007ffc 70b8e9bf MPR! CRoutedOperation::P erform+0x29
0c 0000006f 3b59f740 00007ffc 956ed27c MPR! WNetGetResourceInformationW+0x4f
0d 0000006f 3b59f7d0 00007ff7 226f292e SHLWAPI! PathIsDirectoryW+0x60fc

Esto ocurre cuando se llama WNetGetResourceInformation a la función para obtener información sobre el servidor especificado. En esta pila de llamadas, la DLL del proveedor de red WEB DAV (DAVCLNT.DLL) bloquea el subproceso de llamada mientras espera a que el servidor especificado responda a una solicitud HTTP. Esta operación puede tardar hasta dos minutos en tiempo de espera. El subproceso de llamada se bloqueará hasta que el servidor responda a la solicitud HTTP o hasta que la solicitud se alome.

Solución

Las aplicaciones pueden evitar este escenario si quita la barra diagonal inversa final en el nombre UNC antes de llamar a PathIsDirectory, como esta: \\servername .

Como alternativa, para evitar el retraso en la solicitud HTTP que realiza el proveedor de red web DAV, deshabilite el servicio WebClient o configure el servicio para que se inicie automáticamente.