DPC 사용 방법

2307 단어 구동

DPC 사용 방법


DPC는 DeferredProcedureCall입니다. 말 그대로 일정 시간 후에 특정한 절차나 함수를 호출합니다.
만약 일정 시간 간격을 두고 자신이 쓴 함수를 실행하고 싶다면, 우리는 DPC를 사용할 수 있고, 물론 IoTimer도 사용할 수 있으며, 이후에 나는 IoTimer에 관한 것을 쓸 것이다.지금 먼저 DPC의 사용 절차를 말하고 코드 프레임을 아래에 붙인다. 코드는 Win7x86 및 Win7x64에서 시험에 통과했습니다.
단계: 1.Timer 객체 초기화 2.DPC 객체 초기화: 호출을 지연시킬 함수가 어떤 함수인지 설명합니다.3. 초기화 간격: 얼마나 간격으로 함수를 실행합니까?4. Timer 설정: 객체와 DPC를 연결합니다.
참고 드라이버를 마지막으로 마운트 해제할 때는 반드시 대상 Timer를 지워야 합니다
다른 드라이버를 통해 Timer 객체를 제거하여 DPC를 제거하는 방법을 설명하겠습니다.
#pragma once
#include 


VOID DeferredProcedureCall(
    _In_     struct _KDPC *Dpc,
    _In_opt_ PVOID        DeferredContext,
    _In_opt_ PVOID        SystemArgument1,
    _In_opt_ PVOID        SystemArgument2
);

VOID DriverUnload(PDRIVER_OBJECT DriverObject);

.c 파일
#include "DPC.h"

KTIMER   Timer;
KDPC     DPC;
LARGE_INTEGER DueTime;

NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegisterPath)
{
    NTSTATUS Status = STATUS_UNSUCCESSFUL;
    DriverObject->DriverUnload = DriverUnload;

    KeInitializeTimer(&Timer);
    KeInitializeDpc(&DPC, (PKDEFERRED_ROUTINE)DeferredProcedureCall, NULL);

    //   DueTime   ,       1601/01/01   DPC       ,   100ns
    //   DueTime   ,            ,   100ns
    DueTime = RtlConvertLongToLargeInteger(-10 * 1000000);
    KeSetTimer(&Timer, DueTime, &DPC);
    return STATUS_SUCCESS;
}

VOID DeferredProcedureCall(
    _In_     struct _KDPC *Dpc,
    _In_opt_ PVOID        DeferredContext,
    _In_opt_ PVOID        SystemArgument1,
    _In_opt_ PVOID        SystemArgument2
)
{
    DbgPrint("DelayProcedureCall\r
"
); KeSetTimer(&Timer, DueTime, &DPC); } VOID DriverUnload(PDRIVER_OBJECT DriverObject) { KeCancelTimer(&Timer); DbgPrint("ByeDriver\r
"
); }

좋은 웹페이지 즐겨찾기