Dakujem! Toto viedlo na podozrenie na deadlock, kedze mam dva thready s lockmi, kde obidva cakaju KeWaitForSingleObject - neviem parametre volani, takze je to iba tip.
Příkaz
!locks pracuje pouze s objekty typu Executive Resource (ERESOURCE), což jsou poměrně těžkotonážní RW zámky, které krom toho, že si pamatují, kdo je aktuálně vlastní (je zamkl), tak jsou uloženy v rámci jednoho spojového seznamu (obousměrny s hlavou), takže je možné je všechny projít a vypsat jejich stav (což !locks dělá). A můžete si případně nakreslit graf, ve kterém uvidíte deadlock jako kružnici.
Naneštěstí tyhle objekty nejsou zdaleka jediným typem synchronizačních primitiv. Často se používají notifikační/synchronizační eventy, semafory, mutexy a další, u kterých se nedozvíte, kdo je drží (taková informace v jejich případě nedává smysl). V některých případech u vlákna alespoň vidíte, na jaký objekt čeká (kolem řádku IRP:), ale ne vždy. Což v zásadě znamená, že může dojít k deadlocku, který z výpisu paměti v podstatě nedokážete jednoznačně detekovat.
u parametre urcite nesedia, takze neviem, na co sa caka. Tipujem x86-64 call convention, kde sa az parametre od 5 predavaju na stacku a tie tu vidim. (!dv neukazuje nic)
Ano, je tam Windowsí fastcall, jak píšete. KeWaitForSingleObject má 5 parametrů, ale nemyslím, že by jejich znalost vám k něčemu byla (viz výše). Bohužel, v NDIS internals se neorientuji.
Takze device skoncil v "Unknown state", aj ked neviem, preco sa po deletion znova snazil startovat. Je divne, ze devicy nie su busy a aj tak to skoncio takto.
Položka
state v !devnode ukazuje "delete pending close", což znamená, že zařízení se maže. Zbytek udává posledních 20 stavů, ve kterých se zařízení nacházelo.
Upřímně, také jsem ještě neviděl zařízení, které by bylo "busy". Celkem dost mechanismů implementovaných jádrem ohledně zařízení se dnes již moc nepoužívá.
Například, pomocí API jádra je možné požadavky (IRP), které zařízení nemůže inhed obsloužit, ukládat do fronty v rámci jeho objektu. Obvykle si ale autoři ovladačů takovou frontu implementují sami, protože od ní požadují chování, jímž ta implementovaná jádrem nedsiponuje. A takových mechanismů je víc.