La funzione PathIsDirectory può essere bloccata quando viene chiamata usando un nome di server UNC con una barra rovesciata finale
Questo articolo consente di risolvere il problema in cui la PathIsDirectory
funzione può essere bloccata quando viene chiamata da applicazioni che usano un nome di server UNC con una barra rovesciata finale.
Versione originale del prodotto: Windows SDK per Windows 10
Numero KB originale: 4525162
Sintomi
Le applicazioni che chiamano la PathIsDirectory
funzione possono bloccare il thread chiamante per un massimo di due minuti quando effettuano la chiamata usando un nome di server UNC (Universal Naming Convention) con una barra rovesciata finale, ad esempio: \\servername\
.
Causa
Un'applicazione che blocca un thread chiamante in una PathIsDirectory
chiamata può avere uno stack di chiamate simile al seguente:
0:000> kn
# Sito di chiamata RetAddr child-SP
00 0000006f3b59f108 00007ffc
94f48ba3 ntdll! ZwWaitForSingleObject+0x14
01 0000006f3b59f110 00007ffc
8eebb303 KERNELBASE! WaitForSingleObjectEx+0x93
02 (funzione inline) ---------------- WINHTTP! HTTP_USER_REQUEST::_HandleSyncPending+0x2d
03 0000006f3b59f1b0 00007ffc
8eec9a85 WINHTTP! HTTP_USER_REQUEST::SendRequest+0x3f3
04 0000006f3b59f2b0 00007ffc
8afff4fe WINHTTP! WinHttpSendRequest+0x585
05 0000006f3b59f410 00007ffc
8b000135 davclnt! DavDoesServerDoDav+0x4ba
06 0000006f3b59f4f0 00007ffc
8affc2fa davclnt! DavShouldStartWebclientService+0x2f9
07 0000006f3b59f570 00007ffc
70b8e851 davclnt! NPGetResourceInformation+0x23a
08 0000006f3b59f610 00007ffc
70b8c7d5 MPR! CGetResourceInformation::TestProvider+0x21
09 0000006f3b59f650 00007ffc
70b8c9fd MPR! CRoutedOperation::GetResult+0x135
0a 0000006f3b59f6d0 00007ffc
70b8ca69 MPR! CMprOperation::P erform+0x4d
0b 0000006f3b59f710 00007ffc
70b8e9bf MPR! CRoutedOperation::P erform+0x29
0c 0000006f3b59f740 00007ffc
956ed27c MPR! WNetGetResourceInformationW+0x4f
0d 0000006f3b59f7d0 00007ff7
226f292e SHLWAPI! PathIsDirectoryW+0x60fc
Ciò si verifica quando viene chiamata la WNetGetResourceInformation
funzione per ottenere informazioni sul server specificato. In questo stack di chiamate, la DLL del provider di rete DAV Web (DAVCLNT.DLL) blocca il thread chiamante mentre attende che il server specificato risponda a una richiesta HTTP. Il timeout di questa operazione può richiedere fino a due minuti. Il thread chiamante verrà bloccato fino a quando il server non risponde alla richiesta HTTP o fino al timeout della richiesta.
Risoluzione
Le applicazioni possono evitare questo scenario se si rimuove la barra rovesciata finale nel nome UNC prima della chiamata a PathIsDirectory , come segue: \\servername
.
In alternativa, per evitare il ritardo nella richiesta HTTP effettuata dal provider di rete DAV Web, disabilitare il servizio WebClient o configurare il servizio per l'avvio automatico.