Partilhar via


A função PathIsDirectory pode ser bloqueada quando chamada usando um nome de servidor UNC com um backslash à direita

Este artigo ajuda você a resolve o problema em que a PathIsDirectory função pode ser bloqueada quando é chamada por aplicativos que usam um nome de servidor UNC que tem um backslash à direita.

Versão original do produto: SDK do Windows para Windows 10
Número de KB original: 4525162

Sintomas

Os aplicativos que chamam a PathIsDirectory função podem bloquear o thread de chamada por até dois minutos quando fazem a chamada usando um nome de servidor UNC (Convenção Universal de Nomenclatura) que tem um backslash à direita, por exemplo: \\servername\.

Motivo

Um aplicativo que está bloqueando um thread de chamada em uma PathIsDirectory chamada pode ter uma pilha de chamadas que se assemelha ao seguinte:

0:000> kn
# Site de Chamada RetAddr filho-SP
00 0000006f3b59f108 00007ffc94f48ba3 ntdll! ZwWaitForSingleObject+0x14
01 000006f3b59f110 00007ffc8eebb303 KERNELBASE! WaitForSingleObjectEx+0x93
02 (Função embutida) ---------------- WINHTTP! HTTP_USER_REQUEST::_HandleSyncPending+0x2d
03 000006f3b59f1b0 00007ffc8eec9a85 WINHTTP! HTTP_USER_REQUEST::SendRequest+0x3f3
04 000006f3b59f2b0 00007ffc8afff4fe WINHTTP! WinHttpSendRequest+0x585
05 000006f3b59f410 00007ffc8b000135 davclnt! DavDoesServerDoDav+0x4ba
06 000006f3b59f4f0 00007ffc8affc2fa davclnt! DavShouldStartWebclientService+0x2f9
07 000006f3b59f570 00007ffc70b8e851 davclnt! NPGetResourceInformation+0x23a
08 000006f3b59f610 00007ffc70b8c7d5 MPR! CGetResourceInformation::TestProvider+0x21
09 000006f3b59f650 00007ffc70b8c9fd MPR! CRoutedOperation::GetResult+0x135
0a 000006f3b59f6d0 00007ffc70b8ca69 MPR! CMprOperation::P erform+0x4d
0b 000006f3b59f710 00007ffc70b8e9bf MPR! CRoutedOperation::P erform+0x29
0c 0000006f3b59f740 00007ffc956ed27c MPR! WNetGetResourceInformationW+0x4f
0d 000006f3b59f7d0 00007ff7226f292e SHLWAPI! PathIsDirectoryW+0x60fc

Isso ocorre quando a WNetGetResourceInformation função é chamada para obter informações sobre o servidor especificado. Nesta pilha de chamadas, a DLL do provedor de rede Web DAV (DAVCLNT.DLL) bloqueia o thread de chamada enquanto aguarda que o servidor especificado responda a uma solicitação HTTP. Essa operação pode levar até dois minutos para o tempo limite. O thread de chamada será bloqueado até que o servidor responda à solicitação HTTP ou até o tempo limite da solicitação.

Resolução

Os aplicativos podem evitar esse cenário se você remover o backslash à direita no nome UNC antes que PathIsDirectory seja chamado, como este: \\servername.

Como alternativa, para evitar o atraso na solicitação HTTP feita pelo provedor de rede Web DAV, desabilite o serviço WebClient ou configure o serviço para iniciar automaticamente.