-
-
[原创]自己动手实现dbgprint
-
发表于:
2016-6-25 11:28
6903
-
内核编程刚刚入门,打算自己写点东西,正好书上提到dbgprint,就自己写一个吧,哪错了希望各位大神指出来批评~~~,好直接进入正题。
首先必须要导出一个供其他内核模块用的函数
__declspec(dllexport) NTSTATUS myDbgPrint(CHAR *data);
[CODE]typedef struct _DBGDATA
{
TIME_FIELDS time;
CHAR data[MAX_DATA_LENGTH];
}DBGDATA,*PDBGDATA;
typedef struct _DBGDATALIST
{
LIST_ENTRY ListEntry;
DBGDATA listData;
}DBGDATALIST, *PDBGDATALIST;
__declspec(dllexport) NTSTATUS myDbgPrint(CHAR *data)
{
//获取互斥锁
KeWaitForSingleObject(&ListMutex, Executive, KernelMode, FALSE, NULL);
//为队列分配内存
PDBGDATALIST temp = ExAllocatePool(PagedPool, sizeof(DBGDATALIST));
if (temp == NULL)
{
KeReleaseMutex(&ListMutex, FALSE);
return STATUS_UNSUCCESSFUL;
}
RtlCopyMemory(&temp->listData.data, data, MAX_DATA_LENGTH);
LARGE_INTEGER snow, now;
KeQuerySystemTime(&snow);
//转换为当地时间
ExSystemTimeToLocalTime(&snow, &now);
//转换为人们可以理解的时间格式
RtlTimeToTimeFields(&now, &temp->listData.time);
//如果需要唤醒工作者线程则唤醒
if (needWakeUp);
{
KeSetEvent(&WorkThreadEvent, 0, FALSE);
}
//将调试信息挂入队列
InsertTailList(&dbgPrintHead, &temp->ListEntry);
//释放互斥锁
KeReleaseMutex(&ListMutex, FALSE);
}
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课