私はこのコードをテストしています:
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( )複数回異なる遅延があり、それに応じてハンドラーを呼び出す必要があります。これにより、他の実行がブロックされないため、スレッドが作成されます。