SERVICES.EXE は 状態コード 128 で突然終了しました

Windows NT 系のサービスは サービスの管理にService.exe を使用するのですが サービスの管理コンポーネントである SCESRV.DLL が ESENT.DLL と深くかかわっているようです.

拡張カーネル v16d~g2を入れると、一部の環境でこの症状が出るので調べてみたところ、 Windows Update が自動になっていると、Windows の起動後 ネットワーク経由で Windows Update のチェックを行うとクラッシュすることが分かりました.



どうやってデバッグしたかというと、VC++を 起動して、 Service.exe にアタッチしたところ、以下の関数が esent.dll にないと例外処理が走って動いてるサービスが全部強制終了してしまうという訳でした.(こりゃひどい仕組みだ)

JetGetDatabaseInfo@20
JetResetSessionContext@4
JetSetSessionContext@8
JetMove@16
JetRetrieveColumn@32
JetGetTableColumnInfo@24
JetCloseTable@8
JetAddColumn@28
JetEndSession@8
JetOpenDatabase@20
JetAttachDatabase@12
JetBeginSession@16
JetUpdate@20
JetSetColumn@28
JetPrepareUpdate@12
JetDetachDatabase@8
JetCreateDatabase@20
JetTerm@4
JetCloseDatabase@12
JetSetIndexRange@12
JetIndexRecordCount@16
JetDelete@8
JetOpenTable@28
JetCommitTransaction@8
JetRollback@8
JetBeginTransaction@4
JetSetCurrentIndex@12
JetCreateTableColumnIndex@12
JetDeleteTable@12
JetSeek@12
JetMakeKey@20
JetSetSystemParameter@20
JetInit@4
JetTerm2@8

というわけで、修正版の v16h をリリースしました

Windows 2000 Kernel32 改造計画【BM】

ちなみに、XP版のesent.dll には

JetGetChecksum(@12)
JetGetObjidFromName(@20)

がないようだ

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です