shuizhiling
驱动牛犊
驱动牛犊
  • 注册日期2008-01-03
  • 最后登录2008-03-07
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1860回复:0

WDM中定时器怎么用

楼主#
更多 发布于:2008-01-03 20:02
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);
}


游客

返回顶部