none
ACPI サービス用 PEP の使用 RRS feed

  • 質問

  • PEPは、指定または任意の ACPI ランタイム メソッドをオーバーライドすることができます。

    ACPI サービス用 PEP の使用

    また、サンプルプロジェクトも下記サイトにあります。

    Windows-driver-samples/pofx/PEP/

    PEPを使って、SSDTファームウェアテーブルをオーバーライドすることができると宣言しています。

    でも、このプロジェクトをテストすると、パソコンがクラッシュしてしまいます。

    このサンプルを勉強して、ACPIテーブルに一つの割り込みデバイスを追加したいです。

    (あるいは、一つのSSDTテーブルをオーバーライドしたいです)。

    誰か、このプロジェクトをテストした経験がありませんか?

    また、どうやって、このプロジェクトをテストできますか?

    よろしくお願いします。

    2019年8月21日 0:30

すべての返信

  • > でも、このプロジェクトをテストすると、パソコンがクラッシュしてしまいます。

    クラッシュ時の Bug Check Code はなに?

    ところで、このサンプルはカーネル モード ドライバなので、動かすには事前にテスト署名モードの設定をする必要がありますが、それはやってるんですか?
    ------------------------------------------
    Visual Studio 2015 でのテスト署名方法
    https://blogs.msdn.microsoft.com/jpwdkblog/2017/08/22/visual-studio-2015-でのテスト署名方法/
    ------------------------------------------
    2019年8月21日 2:38
  • テスト署名モードにしています。

    また、ブートの時に致命的なエラーになったため、デバッガーがエラー情報を取れませんでした。

    以上

    2019年8月22日 23:11
  • > また、ブートの時に致命的なエラーになったため、
    > デバッガーがエラー情報を取れませんでした。

    カーネル モードでデバッガを接続していれば、ブート時にエラーが発生した時点でデバッガにブレークインします。
    デバッガにブレークインしないのであれば、デバッガの接続自体に問題があるということです。
    2019年8月23日 1:22
  • いいえ、Windbgは正常に動いています。ブート以外の時、すべての情報を取っています。

    また、今回のエラーはあまりひどくて、クラッシュしたら、システム回復によりしかパソコンが立ち上がれません。

    その時はEthernet通信が成り立っていません。

    それは別に、PEPの使い方を知りたいです。

    以上

    2019年8月23日 6:51
  • 手元にある Window 10 x86 の VMWare 仮想マシン上にインストールしてみましたが、ちゃんと動いています。 

    3: kd> lmDvm sampleacpipep
    Browse full module list
    start    end        module name
    a0f60000 a0f6f000   sampleacpipep   (private pdb symbols)  C:\ProgramData\dbg\sym\sampleacpipep.pdb\B1C636C3A3284AF78320BC9AFB8953031\sampleacpipep.pdb
        Loaded symbol image file: sampleacpipep.sys
        Image path: sampleacpipep.sys
        Image name: sampleacpipep.sys
        Browse all global symbols  functions  data
        Timestamp:        Fri Aug 23 00:14:49 2019 (5D5F9269)
        CheckSum:         00016406
        ImageSize:        0000F000
        Translations:     0000.04b0 0000.04e4 0409.04b0 0409.04e4
        Information from resource tables:
    Unable to enumerate user-mode unloaded modules, Win32 error 0n30
    
    3: kd> !drvobj \driver\sampleacpipep f
    Driver object (bdf06030) is for:
     \Driver\sampleacpipep
    Driver Extension List: (id , addr)
    (862bcd8a a7c74a58)  
    Device Object list:
    8abdd708  8f1a8600  
    DriverEntry:   a0f63610 sampleacpipep!FxDriverEntry
    DriverStartIo: 00000000 
    DriverUnload:  a0f63710 sampleacpipep!FxStubDriverUnload
    AddDevice:     862809de Wdf01000!FxDriver::AddDevice
    Dispatch routines:
    [00] IRP_MJ_CREATE                      862618a0 Wdf01000!FxDevice::DispatchWithLock
    [01] IRP_MJ_CREATE_NAMED_PIPE           862618a0 Wdf01000!FxDevice::DispatchWithLock
    [02] IRP_MJ_CLOSE                       862618a0 Wdf01000!FxDevice::DispatchWithLock
    [03] IRP_MJ_READ                        862618a0 Wdf01000!FxDevice::DispatchWithLock
    [04] IRP_MJ_WRITE                       862618a0 Wdf01000!FxDevice::DispatchWithLock
    [05] IRP_MJ_QUERY_INFORMATION           862618a0 Wdf01000!FxDevice::DispatchWithLock
    [06] IRP_MJ_SET_INFORMATION             862618a0 Wdf01000!FxDevice::DispatchWithLock
    [07] IRP_MJ_QUERY_EA                    862618a0 Wdf01000!FxDevice::DispatchWithLock
    [08] IRP_MJ_SET_EA                      862618a0 Wdf01000!FxDevice::DispatchWithLock
    [09] IRP_MJ_FLUSH_BUFFERS               862618a0 Wdf01000!FxDevice::DispatchWithLock
    [0a] IRP_MJ_QUERY_VOLUME_INFORMATION    862618a0 Wdf01000!FxDevice::DispatchWithLock
    [0b] IRP_MJ_SET_VOLUME_INFORMATION      862618a0 Wdf01000!FxDevice::DispatchWithLock
    [0c] IRP_MJ_DIRECTORY_CONTROL           862618a0 Wdf01000!FxDevice::DispatchWithLock
    [0d] IRP_MJ_FILE_SYSTEM_CONTROL         862618a0 Wdf01000!FxDevice::DispatchWithLock
    [0e] IRP_MJ_DEVICE_CONTROL              862618a0 Wdf01000!FxDevice::DispatchWithLock
    [0f] IRP_MJ_INTERNAL_DEVICE_CONTROL     862618a0 Wdf01000!FxDevice::DispatchWithLock
    [10] IRP_MJ_SHUTDOWN                    862618a0 Wdf01000!FxDevice::DispatchWithLock
    [11] IRP_MJ_LOCK_CONTROL                862618a0 Wdf01000!FxDevice::DispatchWithLock
    [12] IRP_MJ_CLEANUP                     862618a0 Wdf01000!FxDevice::DispatchWithLock
    [13] IRP_MJ_CREATE_MAILSLOT             862618a0 Wdf01000!FxDevice::DispatchWithLock
    [14] IRP_MJ_QUERY_SECURITY              862618a0 Wdf01000!FxDevice::DispatchWithLock
    [15] IRP_MJ_SET_SECURITY                862618a0 Wdf01000!FxDevice::DispatchWithLock
    [16] IRP_MJ_POWER                       862618a0 Wdf01000!FxDevice::DispatchWithLock
    [17] IRP_MJ_SYSTEM_CONTROL              862618a0 Wdf01000!FxDevice::DispatchWithLock
    [18] IRP_MJ_DEVICE_CHANGE               862618a0 Wdf01000!FxDevice::DispatchWithLock
    [19] IRP_MJ_QUERY_QUOTA                 862618a0 Wdf01000!FxDevice::DispatchWithLock
    [1a] IRP_MJ_SET_QUOTA                   862618a0 Wdf01000!FxDevice::DispatchWithLock
    [1b] IRP_MJ_PNP                         862618a0 Wdf01000!FxDevice::DispatchWithLock
    
    3: kd> !devstack 8abdd708
      !DevObj   !DrvObj            !DevExt   ObjectName
    > 8abdd708  \Driver\sampleacpipepcaf67580  
      c29a7960  \Driver\PnpManager 00000000  0000008c
    !DevNode 8f32dbc8 :
      DeviceInst is "ROOT\UNKNOWN\0000"
      ServiceName is "sampleacpipep"
    
    3: kd> !devstack 8f1a8600
      !DevObj   !DrvObj            !DevExt   ObjectName
    > 8f1a8600  \Driver\sampleacpipepc29c61a0  0000008d

    2019年8月23日 7:51
  • ありがとうございます。

    インストールができて、大変うれしく思います。

    自分の所にはできなかったため、

    1、インストール方法を教えてください。

    2、VMWare 仮想マシンではなく、普通のパソコンでもインストールできましょうか?

    3、インストールし、再起動したら、デバイスマネージャーにあるデバイスリストに何か変化がありましたか?

    お願いします。

    2019年8月23日 8:44
  • > 1、インストール方法を教えてください。
    > 2、VMWare 仮想マシンではなく、普通のパソコンでもインストールできましょうか?
    > 3、インストールし、再起動したら、デバイスマネージャーにあるデバイスリストに何か変化がありましたか?

    1. Device Manager から。
    2. できない理由が思い浮かばない。
    3. 再起動時の動作は確認していない。
    Install 後 Device Manager の "システム デバイス" ノードに、"Sample Platform Extension 01" というデバイスが追加されるはず。
    (確認しなかったけど、inf ファイルを見る限りそうなるはず。)

    以上
    2019年8月26日 5:49
  • お馬鹿  様

    お世話になっております。

    おっしゃった通り、Install後はDevice Managerの「システムデバイス」ノードに”Sample Platform Extension 01"というデバイスが追加されています。

    問題になるのは、再起動時に、Targetパソコンは「自動修復」となります。開発用パソコンのWindbgは、「Wait to reconnect...」状態です。原因が分かりません。

    以上

    2019年8月27日 9:05
  • Ooooceanさん、こんにちは。フォーラムオペレーターのHarukaです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    この問題は、WindowsハードウェアWDKおよびドライバー開発フォーラムに関連しているようです。

    英語とはなりますが、このWindows Hardware WDK and Driver Developmentフォーラムに投稿いただくこともご検討ください。

    どうぞよろしくお願いいたします。


    MSDN/ TechNet Community Support Haruka

    ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、
    ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2019年8月28日 8:03
    モデレータ
  • "pofx\PEP\acpi" フォルダにある "sampleacpipep.inx" を以下のように変更してリビルド。
    --------------------------------------------
    ...
    ;StartType      = %SERVICE_BOOT_START%
    StartType      = %SERVICE_SYSTEM_START%
    ...

    SERVICE_BOOT_START = 0
    SERVICE_SYSTEM_START = 1
    SERVICE_AUTO_START = 2
    SERVICE_DEMAND_START  = 3
    ...
    --------------------------------------------

    リビルドで作成したドライバ パッケージでインストールすれば、とりあえず再起動できるようになる。
    (再起動後のカーネル デバッグ接続も、問題無くできた。)

    • 編集済み お馬鹿 2019年8月28日 8:52
    2019年8月28日 8:51
  • お馬鹿

    御示教をありがとうございます。

    変更した後、確かにブートしてもシステムが崩れませんでした。

    但し、インストール後、ドライバを有効/無効に変更、Restart、再インストールする度に、変更を有効するために、パソコンの再起動を要求します。再起動しても、Windbg上で、DriverEntryに設定したBreakpointが引っかかってくれません。なので、普通のデバッグのやり方では、デバッグできなさそう……

    如何すればこのプロジェクトがデバッグできるようになれましょうか?

    実は、私はPEPを通じて、一つの割り込みデバイスをACPIテーブルに追加したかったです。

    TestSigningモードで、ASLコンパイルを利用して、この事を実現しました。やり方は下記ブログの通りです。

    Microsoft ASL Compiler (asl.exe) を使ってみる

    そのdslコードは以下のようです。

    Scope (\_SB_)
        {
    
            Device (TMR1)
            {
                Name (_HID, "HPET000B")
                Name (_CID, "ACPI\SofTimer")
                Name (_UID, 0x1)
                Method (_STA)
                {
                    Return(0xf)
                }
                Method (_CRS, 0x0, NotSerialized) {
                    Name (RBUF, ResourceTemplate () {
                        Interrupt(ResourceConsumer, Level, ActiveHigh, Shared) { 0xB }
                    })
                    Return(RBUF)
                }
            }
    
        }

    この方法は、TestSigning ONの時にしか有効になれません。

    通常の時(Testsigning OFF)にも追加したデバイスが動けるようにするため、PEPsの方法を検討しています。

    PEPsでこのようなデバイスを追加できましょうか?

    おアドバイスをください。

    よろしくお願いいたします。

    2019年8月29日 23:24
  • > 但し、インストール後、ドライバを有効/無効に変更、
    > Restart、再インストールする度に、変更を有効するために、
    > パソコンの再起動を要求します。
    > 再起動しても、Windbg上で、
    > DriverEntryに設定したBreakpointが引っかかってくれません。

    なにを言ってるのか、まったくわからない。
    私のテスト環境では、DriverEntry() と PepEvtDeviceAdd() に DbgBreakPoint() を仕込んだドライバをインストールしたが、インストール時および再起動後にちゃんとデバッガにブレークインしてくる。

    > この方法は、TestSigning ONの時にしか有効になれません。

    そのサイトで提示されている方法では、GPIO サンプル ドライバを使用してるのでは?
    だとしたら、テスト署名モードでしか動かないのはあたりまえ。
    Windows 上で動作するすべてのドライバは MS による署名が必須で、署名の無いドライバは動かない。
    開発段階のドライバに、いちいち MS からの署名なんか取得してらんないから、テスト署名モードがある。

    以上

    • 編集済み お馬鹿 2019年8月30日 0:45
    2019年8月30日 0:44
  • お馬鹿  様

    大変お世話になっております。

    御示教を頂き、誠にありがとうございます。

    私のテスト環境では、DriverEntry() と PepEvtDeviceAdd() に DbgBreakPoint() を仕込ん

    DbgBreakPoint()を入れることですね!

    ありがとうございます。ブレークインできました!助かりました。

    そのサイトで提示されている方法では、GPIO サンプル ドライバを使用してるのでは?

    GPIOに限ってはありません。

    これは、Testsigning OFFの時、ACPIテーブルがBIOSファームからロードされる事が原因です。

    署名の事とASLを用いてオーバーライドする事は承知しております。とりあえず、置いていきます。

    これから、PEPsを実験してみます。

    以上

    2019年8月30日 5:41
  • お馬鹿  様

    大変お世話になっております。

    実験について、報告いたします。

    結論として、期待したデバイスの追加はできませんでした。

    原因:PepAcpiNotifyを登録しましたが、多分新規ハードがメインボードに実装されていないから、この関数をシステム側が呼ぶ出してくれませんでした。そして、新規リソースを追加できません。

    夢を叶えませんでしたが、ご示教を頂きまして、確認ができて、また、デバッグの方法を勉強した事を心から感謝します。

    今後、チャンスがあれば、引き続き、よろしくお願い。

    以上

    2019年8月30日 7:39