首页
社区
课程
招聘
[旧帖] [讨论]驱动调试KdPrint显示问题 0.00雪花
发表于: 2012-8-17 10:45 1794

[旧帖] [讨论]驱动调试KdPrint显示问题 0.00雪花

2012-8-17 10:45
1794
extern “C” {  #include <ntddk.h>  }
VOID HelloDDKUnload (IN PDRIVER_OBJECT pDriverObject);
NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp);

extern "C" NTSTATUS DriverEntry (
                        IN PDRIVER_OBJECT pDriverObject,
                        IN PUNICODE_STRING pRegistryPath        )
{
        NTSTATUS status = STATUS_SUCCESS;
        KdPrint(("Enter DriverEntry\n"));
        KdPrint(("RegistryPath: %wZ\n", pRegistryPath));

        pDriverObject->DriverUnload = HelloDDKUnload;
        pDriverObject->MajorFunction[IRP_MJ_CREATE] = HelloDDKDispatchRoutine;
        pDriverObject->MajorFunction[IRP_MJ_CLOSE] = HelloDDKDispatchRoutine;
        pDriverObject->MajorFunction[IRP_MJ_WRITE] = HelloDDKDispatchRoutine;
        pDriverObject->MajorFunction[IRP_MJ_READ] = HelloDDKDispatchRoutine;

        KdPrint(("Leave DriverEntry\n"));
       
        return status;
}
VOID HelloDDKUnload (IN PDRIVER_OBJECT pDriverObject)
{
        KdPrint(("Enter DriverUnload\n"));
        KdPrint(("Leave DriverUnload\n"));
}

NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp)
{
        NTSTATUS status = STATUS_SUCCESS;
        KdPrint(("Enter HelloDDKDispatchRoutine\n"));
        KdPrint(("Leave HelloDDKDispatchRoutine\n"));
        return status;
}

为什么我调试的时候HelloDDKDispatchRoutine中不能显示出KdPrint中的信息呢

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 67
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
因为你没有调用
2012-8-17 13:18
0
雪    币: 38
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
pDriverObject->MajorFunction[IRP_MJ_CREATE] = HelloDDKDispatchRoutine;
  pDriverObject->MajorFunction[IRP_MJ_CLOSE] = HelloDDKDispatchRoutine;
  pDriverObject->MajorFunction[IRP_MJ_WRITE] = HelloDDKDispatchRoutine;
  pDriverObject->MajorFunction[IRP_MJ_READ] = HelloDDKDispatchRoutine;

这些不是入口吗,我如驱动加载工具加载的时候不就调用了吗,如果不是请问怎么调用?能否告诉我呀,3QQQQQQ
2012-8-17 15:24
0
雪    币: 67
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
[QUOTE=追风新人;1095554]pDriverObject->MajorFunction[IRP_MJ_CREATE] = HelloDDKDispatchRoutine;
  pDriverObject->MajorFunction[IRP_MJ_CLOSE] = HelloDDKDispatchRoutine;
  pDr...[/QUOTE]
驱动各个例程的调用不像C语言的main一样,它不是顺序调用的。MajorFunction是注册的回调函数,用到的时候才去调
2012-8-17 16:41
0
雪    币: 343
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
[QUOTE=追风新人;1095554]pDriverObject->MajorFunction[IRP_MJ_CREATE] = HelloDDKDispatchRoutine;
  pDriverObject->MajorFunction[IRP_MJ_CLOSE] = HelloDDKDispatchRoutine;
  pDr...[/QUOTE]

这段代码是设置驱动回调,当对应的事件如CloseHandle发生就会调用pDriverObject->MajorFunction[IRP_MJ_CLOSE]中设置的IRP_MJ_CLOSE回调。
2012-8-17 17:33
0
雪    币: 38
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
[QUOTE=yarpee;1095593]这段代码是设置驱动回调,当对应的事件如CloseHandle发生就会调用pDriverObject->MajorFunction[IRP_MJ_CLOSE]中设置的IRP_MJ_CLOSE回调。[/QUOTE]

您的意思是在应用程序中调用HelloDDKDispatchRoutine函数才会显示信息的吗?
2012-8-17 19:13
0
雪    币: 38
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我的主要目的是执行HelloDDKDispatchRoutine中的内容,有什么办法做到呀
2012-8-17 19:15
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
8
首先你没有创建DEVICE_OBJECT ,你永远访问不到HelloDDKDispatchRoutine

假设你创建了DEVICE_OBJECT,你可以通过CreateFile,ReadFile,WriteFile来访问
2012-8-17 20:13
0
雪    币: 38
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
NTSTATUS CreateDevice(PDRIVER_OBJECT pDriverObject)
{   
        //设备名称
        UNICODE_STRING devName;
       
        RtlInitUnicodeString(&devName,L"\\Device\\BaoHu");//命名为保护
       
        //接受创建的设备
    PDEVICE_OBJECT pDevObj;
       
    //创建设备
    NTSTATUS status=IoCreateDevice(pDriverObject,//驱动程序对象
                                           sizeof(DEVICE_EXTENSION),//指定驱动程序为设备扩展对象而定义的结构体大小
                                           &devName,//创建设备的名字
                                           FILE_DEVICE_UNKNOWN,//设备类型 未知设备
                                           0,
                                           true,//设备是否是独占
                                           &pDevObj//符号链接
                                           );
        if(!NT_SUCCESS(status))//判断申请内存是否成功
        {
                if (status==STATUS_INSUFFICIENT_RESOURCES)
                {
                       
                        KdPrint(("资源不足"));
                }
                if(status==STATUS_OBJECT_NAME_EXISTS)
                {
                        KdPrint(("指定对象名存在"));
                }
                if (status==STATUS_OBJECT_NAME_COLLISION)
                {
                        KdPrint(("对象名称有冲突"));
                }
                KdPrint(("设备创建失败"));
                return status;
        }
                KdPrint(("设备创建成功的名字********\n"),pDriverObject);
        KdPrint(("设备创建成功********\n"));
        DuiKangQingLing();
    PDEVICE_EXTENSION pDevExt;
       
        //符号链接名称
        UNICODE_STRING symlinkName;
    RtlInitUnicodeString(&symlinkName,L"\\??\\BaoHuSys");//保护SYS
   
        //代表是一个IO设备
        pDevObj->Flags|=DO_BUFFERED_IO;//do_buffered
       
        //得到设备扩展
        pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
       
        //设置扩展设备的设备对象
        pDevExt->pDevice = pDevObj;
       
        //设置扩展设备的设备名称
    pDevExt->ustrDeviceName = devName;
        pDevExt->ustrSymLinkName=symlinkName;
   
        //创建符号链接
    status=IoCreateSymbolicLink(&symlinkName,&devName);
        if (!NT_SUCCESS(status))
        {
                //创建失败 删除设备
                IoDeleteDevice( pDevObj );
                return status;
        }
       
       
        return STATUS_SUCCESS;
}

是这个吗请问
2012-8-17 22:22
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
pDriverObject->MajorFunction[IRP_MJ_CREATE] = HelloDDKDispatchRoutine;
  pDriverObject->MajorFunction[IRP_MJ_CLOSE] = HelloDDKDispatchRoutine;
  pDriverObject->MajorFunction[IRP_MJ_WRITE] = HelloDDKDispatchRoutine;
  pDriverObject->MajorFunction[IRP_MJ_READ] = HelloDDKDispatchRoutine;

既然叫"DriverObject",你可以理解为这个函数是写给这个DriverObject用的,所以你得先搞一个Diriver—Object出来,然后对他进行比如打开,读写操作,系统就会生成那几个IRP,然后根据不同IRP,调用相应的函数,也就是你的HelloDDKDispatchRoutine,就会执行进去了
2012-8-18 17:45
0
雪    币: 38
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
int main(int argc, char* argv[])
{
        //add
        //CreateFile 打开设备 获取hDevice
        HANDLE hDevice =
                CreateFile("\\\\.\\My_DriverLinkName", //\\??\\My_DriverLinkName
                GENERIC_READ | GENERIC_WRITE,
                0,                // share mode none
                NULL,        // no security
                OPEN_EXISTING,
                FILE_ATTRIBUTE_NORMAL,
                NULL );                // no template

}

首先多谢大家的回答,这个问题我是这样解决的,不知道对不对,如上在EXE程序中
2012-8-19 13:56
0
游客
登录 | 注册 方可回帖
返回
//