在 DISPATCH_LEVEL (DPC) 無法直接調用文件 I/O 函數(需 PASSIVE_LEVEL),否則導致 IRQL_NOT_LESS_OR_EQUAL 藍屏。
KTIMER 與 KDPC。IO_WORKITEM 並 IoQueueWorkItem 入隊。ZwCreateFile/ZwWriteFile 寫入日誌。// 系統線程啟動
VOID ThreadStart(PVOID ctx) {
KeInitializeTimer(&Timer);
KeInitializeDpc(&Dpc, CustomDpc, myInfo);
KeSetTimer(&Timer, DueTime, &Dpc);
KeWaitForSingleObject(&Timer, Executive, KernelMode, FALSE, NULL);
}
// DPC 例程(DISPATCH_LEVEL)
VOID CustomDpc(KDPC*, PVOID ctx, PVOID, PVOID) {
pIoWorkItem = IoAllocateWorkItem(DeviceObject);
if (pIoWorkItem)
IoQueueWorkItem(pIoWorkItem, TestFile, DelayedWorkQueue, ctx);
KeSetTimer(&Timer, DueTime, &Dpc); // 重新定時
}
// WorkItem 例程(PASSIVE_LEVEL)
VOID TestFile(PDEVICE_OBJECT, PVOID ctx) {
// 獲取時間、打開文件、寫入、關閉
ZwCreateFile(...);
ZwWriteFile(...);
ZwClose(hFile);
}
VOID Unload(PDRIVER_OBJECT drv) {
KeCancelTimer(&Timer);
IoFreeWorkItem(pIoWorkItem);
IoDeleteDevice(drv->DeviceObject);
}