none
x64 での__readmsr apiについて。(ドライバレベルプログラム) RRS feed

  • 質問

  • はじめまして、 もしスレ違いでしたら、ご指摘下さい。

    現在Windows7のドライバとして下記の様な関数を作成いたしました。 

    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    //    関数名:AccessReadMSR

    //    MSRReadを行う「rdmsr」の発行。

    //    ドライバ内は、デフォルトでRing0??

    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    NTSTATUS    AccessReadMSR(

                    ULONG   IoctlCode,       // IoControlCode

                    void    *lpInBuffer,     // 上位アプリからの入力データバッファ

                                             // rdmsrの読み出しを行うレジスタ値

                    ULONG   nInBufferSize,    // 上位アプリからの入力データの大きさ

                    void    *lpOutBuffer,     // 上位アプリへの出力データバッファ

                                             // rdmsrからの出力値

                    ULONG   nOutBufferSize,  // 上位アプリへの出力データの大きさ

                    ULONG_PTR* lpBytesReturned) // 転送完了バイト数を格納する

    {

        ULONGLONG data = 0;

        try{

            data = __readmsr(*(ULONG*)lpInBuffer); // MSR ReadAPI

            memcpy((PULONG)lpOutBuffer,&data,8);

            *lpBytesReturned = 8;

            return STATUS_SUCCESS;

        } except (EXCEPTION_EXECUTE_HANDLER) {

           *lpBytesReturned = 0;      // x64ではこちらに飛ぶ?。

           return STATUS_UNSUCCESSFUL;

        }

    }

    ///////////////////////////////////////////////////////////////////////////////////

    同じコードをx86(32Bit)で作成した物は、MSRの値を取得出来ていた様だったので

    そのままx64でビルドしてみたのですが、STATUS_UNSUCCESSFULが返ってきます。

    (例外が発生??)

    __readmsrは、x86/x64対応の様でしたが、x64では何らかの前処理(オマジナイ?)

    が必要なのでしょうか?

    利用DDK(WDK):7600.16385.1

    上位アプリ、DLLはVS(VC++) 2008 Sp1を利用。

    実行OSは、Windows7 Pro (x86(32Bitドライバ時)/x64(64Bitドライバ時))

     

    もし、なにか解決策などをご存知でしたら、大変お忙しいかと思いますが、

    ご教授いただけませんでしょうか??

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

    2012年3月7日 3:18

回答

すべての返信