阅读:1860回复:0
WDM中定时器怎么用
WDM中KTimedCallback类有个函数可以周期调用另外一个函数,最好可以直接调用应用程序的函数,但不知道行不行。
我现在是让那个被调用函数不断与应用程序通信,但结果总不对,好像被调用函数没法被调用,也没法与应用程序周期通信。主要程序如下: NTSTATUS RegSampleDevice::READ_BOOLEAN_Handler(KIrp I) { NTSTATUS status; KRegistryKey Params(&SampleRegistryPath, L"Parameters"); if ( !NT_SUCCESS(Params.LastError()) ) { I.Information() = 0; return STATUS_UNSUCCESSFUL; } ULONG m_RegBoolean = FALSE; status = Params.QueryValue(L"RegBoolean", &m_RegBoolean); if (!(NT_SUCCESS(status))) { I.Information() = 0; return STATUS_UNSUCCESSFUL; } if (I.IoctlOutputBufferSize() >= sizeof(ULONG)) { m_C=I; m_Tcb.SetPeriodic( (LONG) -30000000,(LONG)6, LinkTo(TimerCallback), this ) ; // 3000 msec /* *(ULONG*)I.UserBuffer()=m_RegBoolean; //③METHOD_NEITHER方式 //将m_RegBoolean值拷贝到应用程序的读内存,因在定义READ_ BOOLEAN命令时,其访问 //方式为METHOD_NEITHER方式,所以应用程序的读内存为I.UserBuffer(),见第5章中 //的5.1.3解释;前面又加*(ULONG*),是因为I.UserBuffer() 其定义类型为PVOID&,见 //第3章中的3.2 KIrp解释 I.Information() = sizeof(ULONG); */ return STATUS_SUCCESS; } else { I.Information() = 0; return STATUS_BUFFER_TOO_SMALL; } } VOID RegSampleDevice::TimerCallback(PVOID arg1, PVOID arg2) { KIrp I=KIrp::Allocate(1); I.SetNextStackLocation(); I=m_C; NTSTATUS status=STATUS_SUCCESS; ULONG m_RegBoolean=4; *(ULONG*)I.UserBuffer()=m_RegBoolean; //③METHOD_NEITHER方式 //将m_RegBoolean值拷贝到应用程序的读内存,因在定义READ_ BOOLEAN命令时,其访问 //方式为METHOD_NEITHER方式,所以应用程序的读内存为I.UserBuffer(),见第5章中 //的5.1.3解释;前面又加*(ULONG*),是因为I.UserBuffer() 其定义类型为PVOID&,见 //第3章中的3.2 KIrp解释 I.Information() = sizeof(ULONG); I.PnpComplete(this, status); KIrp::Deallocate(I); } |
|