1

私はこのコードをテストしています:

int handler(void* data)
{
    KTIMER *Timer = (KTIMER *)data;
    DbgPrint("*** timer1.sys: Inside handler ...\n");
    DbgPrint("handler: Address of data: %p\n", data);
    if (STATUS_SUCCESS == KeWaitForSingleObject(Timer,
                                        Executive, KernelMode , 
                                        TRUE, NULL)){
            DbgPrint("Status_Succes for KeWaitForSingleObject");
    } 
    DbgPrint("Done waiting!!! ...\n");
    KeCancelTimer(Timer);
    return 1;
}

void start_timer()
{
    KTIMER Timer;
    LARGE_INTEGER lTimeOut;
    PKTHREAD *delayedWorkerThread;
    void* data;

    DbgPrint("*** timer1.SYS: ==>start_timer\n");

    KeInitializeTimer(&Timer);
    lTimeOut.QuadPart = 3000;           //Delay
    lTimeOut.QuadPart *= 10000;         // 100ns * 10000 = 1ms
    lTimeOut.QuadPart *= -1;            // exactly waiting time
    KeSetTimer(&Timer, lTimeOut, NULL);


    /*
    if (STATUS_SUCCESS == KeWaitForSingleObject(&Timer,
                                        Executive, KernelMode , 
                                        TRUE, NULL)){
            DbgPrint("Status_Succes for KeWaitForSingleObject");
    } 
    DbgPrint("Call Handler ...\n");
    KeCancelTimer(&Timer);
    */

    data = &Timer;
    DbgPrint("start_timer: Address of Timer: &Timer: %p\n", &Timer);
    DbgPrint("Start_timer: Address of Timer: data: %p\n", data);
    delayedWorkerThread = thread_create(handler, data, "Delayed Worker Thread"); // This function will create a thread using PsCreateSystemThread and will return PTHREAD object
    DbgPrint("timer1.sys: start_timer<==\n");
}

このドライバーをロードすると、m / cが(IRQL_NOT_LESS_OR_EQUAL_TO)でクラッシュしKeWaitForSingleObjectます。つまり、無効なアドレスにアクセスしようとしています。ただし、タイマーアドレスはハンドラーとstart_timerで同じです。KeWaitForSingleObjectがなければ、問題ありません。誰かが助けてくれるなら、私は何が悪いのかわかりません!

//////////////////////////////編集1////////////////// ////////////

すなわちKeWaitForSingleObjectなし

int handler(void* data)
{
    KTIMER *Timer = (KTIMER *)data;
    DbgPrint("*** timer1.sys: Inside handler ...\n");
    DbgPrint("handler: Address of data: %p\n", data);    // Same address
    DbgPrint("handler: Address of Timer: %p\n", TImer);  // Same address

    DbgPrint("Done waiting!!! ...\n");
    KeCancelTimer(Timer);
    return 1;
}

後でクラッシュします..ドライバを正常にインストールし、正常にアンロードします...その後、突然ブルースクリーンになります!Windowsドライバープログラミングは子供の遊びではありません!:(

両方の関数でまだ同じアドレス..ところで、スレッドなしで記述した場合は正常に機能します...(start_timer()のコードのコメント解除)しかし、スレッドを使用して実行する必要があります...やりたいのは、start_timer( )複数回異なる遅延があり、それに応じてハンドラーを呼び出す必要があります。これにより、他の実行がブロックされないため、スレッドが作成されます。

4

0 に答える 0