Udostępnij za pośrednictwem


Funkcja PathIsDirectory może zostać zablokowana w przypadku wywołania za pomocą nazwy serwera UNC z ukośnikiem odwrotnym

Ten artykuł pomaga rozwiązać problem polegający na tym, że PathIsDirectory funkcja może zostać zablokowana, gdy jest wywoływana przez aplikacje używające nazwy serwera UNC, która ma końcowy ukośnik odwrotny.

Oryginalna wersja produktu: Windows SDK dla systemu Windows 10
Oryginalny numer KB: 4525162

Symptomy

Aplikacje wywołujące PathIsDirectory funkcję mogą blokować wywołanie wątku wywołującego przez maksymalnie dwie minuty, używając nazwy serwera Universal Naming Convention (UNC), która ma końcowy ukośnik odwrotny, na przykład: \\servername\.

Przyczyna

Aplikacja blokująca wątek PathIsDirectory wywołujący w wywołaniu może mieć stos wywołań podobny do następującego:

0:000> kn
# Child-SP RetAddr Call Site
00 0000006f3b59f108 00007ffc94f48ba3 ntdll! ZwWaitForSingleObject+0x14
01 00000006f3b59f110 00007ffc8eebb303 KERNELBASE! WaitForSingleObjectEx+0x93
02 (funkcja śródliniowa) ---------------- WINHTTP! HTTP_USER_REQUEST::_HandleSyncPending+0x2d
03 00000006f3b59f1b0 00007ffc8eec9a85 WINHTTP! HTTP_USER_REQUEST::SendRequest+0x3f3
04 00000006f3b59f2b0 00007ffc8afff4fe WINHTTP! WinHttpSendRequest+0x585
05 00000006f3b59f410 00007ffc8b000135 davclnt! DavDoesServerDoDav+0x4ba
06 0000006f3b59f4f0 00007ffc8affc2fa davclnt! DavShouldStartWebclientService+0x2f9
07 00000006f3b59f570 00007ffc70b8e851 davclnt! NPGetResourceInformation+0x23a
08 00000006f3b59f610 00007ffc70b8c7d5 MPR! CGetResourceInformation::TestProvider+0x21
09 00000006f3b59f650 00007ffc70b8c9fd MPR! CRoutedOperation::GetResult+0x135
0a 00000006f3b59f6d0 00007ffc70b8ca69 MPR! CMprOperation::P erform+0x4d
0b 00000006f3b59f710 00007ffc70b8e9bf MPR! CRoutedOperation::P erform+0x29
0c 00000006f3b59f740 00007ffc956ed27c MPR! WNetGetResourceInformationW+0x4f
0d 0000006f 226f292e3b59f7d0 00007ff7SHLWAPI! PathIsDirectoryW+0x60fc

Dzieje się tak, gdy funkcja jest wywoływana w WNetGetResourceInformation celu uzyskania informacji o określonym serwerze. W tym stosie wywołań biblioteka DLL dostawcy sieci Web DAV (DAVCLNT.DLL) blokuje wątek wywołujący podczas oczekiwania na określony serwer, aby odpowiedział na żądanie HTTP. Przekroczenie limitu czasu tej operacji może potrwać do dwóch minut. Wątek wywołujący zostanie zablokowany, dopóki serwer nie odpowie na żądanie HTTP lub dopóki żądanie nie zostanie upłynął limit czasu.

Rozwiązanie

Aplikacje mogą uniknąć tego scenariusza, jeśli usuniesz końcowy ukośnik odwrotny w nazwie UNC przed wywołaniem pathIsDirectory , jak pokazano poniżej: \\servername.

Alternatywnie, aby uniknąć opóźnienia żądania HTTP, które jest wykonywane przez dostawcę sieci Web DAV, wyłącz usługę WebClient lub skonfiguruj usługę do automatycznego uruchamiania.