safediscやsecuromを使っているゲームが動かない!

  • 投稿日:
  • by
  • カテゴリ:

ここの前身の掲示板で最後に書いていた記事を、備忘録として残しておきます...。

先日のWindows7のアップデート「MS15-097」によりsecdrv.sysのサービスが止まってしまい、そのためにSafeDiscやSecuROMを使うゲームが動作しなくなりました。(;´д`)

とりあえず、Windows7/8.1ではsecdrv.sysが削除されていないので、以下のコマンドを管理権限で実行しておけば、ひとまず動作します。

sc config secdrv start= demand

ただ、脆弱性があって無効になっている可能性が高いので、ゲームが終わったら、以下のコマンドで終了しておくことがおすすめです。

sc stop secdrv
sc config secdrv start= disabled

スクリプトを公開してくれている人がいたので、ちょっと改造して作ってみました。
以下のテキストをコピペして、拡張子vbsで保存して使ってみてください。

' secdrv.sys ドライバーのサービスの有効化・無効化を切り替える
' 参考:http://blog.goo.ne.jp/mexe/e/3aaf7da83c97ea1f5e02b668db36e1aa

' 2015年9月のWindows Update「MS15-097」によって、secdrv.sys ドライバーのサービスが無効化され、
' SafeDiscやSecuROM等を使用するゲームが動作しなくなった。
' 詳細は、マイクロソフト社のサイトを参照のこと
' https://support.microsoft.com/ja-jp/kb/3086255
' ※secdrvが起動することによりセキュリティホールが発生する恐れがあるため注意を要する。

' ---
' このスクリプト自身を管理者権限で改めて呼び出す。
If WScript.Arguments.Count = 0 Then
CreateObject("Shell.Application").ShellExecute "wscript.exe", """" & WScript.ScriptFullName & """ a", "", "runas"
WScript.Quit
End If

'===以後、各コマンドを管理者権限で実行する===

'objectの定義
Set O = CreateObject("WScript.Shell")

' secdrv.sysが動作しているかsc queryで調査
set objExec = o.exec("sc query ""secdrv""")

'sc queryの実行結果の標準出力を終わりまで1行ずつ確認する
Do until objExec.StdOut.AtEndOfStream
'1行読み込み
strLine = objExec.StdOut.ReadLine
'STATEの文字があるか?
if instr(strLine,"STATE") <> 0 then
'出力行の無駄な空白を除去
strtemp = replace(strLine," ","")
'デリミタ「:」で分割
strdim = split(strLine,":")
'後半部分の先頭の空白を除去したうえで、1個目の数字を取得(1=停止,4=起動中)
scstatus = cint(left(trim(strdim(1)),1))
'secdrvは停止中か?
if scstatus = 1 then
'secdrvを開始する
O.Run "sc config secdrv start= demand",0 , True
msgbox "secdrv.sysを起動準備が完了しました。" & vbcrlf & "ゲームが終わったら終了してください。" & vbcrlf & "※ゲームが始まるまでsecdrv.sysは起動しません。"
end if
if scstatus = 4 then
O.Run "sc stop secdrv", , True
O.Run "sc config secdrv start= disabled",0 , True
msgbox "secdrv.sysを終了しました。" & vbcrlf & "SafeDiscやSecuROMを使用するゲームが起動できなくなりました。"
end if
end if
Loop