首页
社区
课程
招聘
[求助]求助:驱动一加载就立即自动Unload了,帮忙看看:
2009-3-28 10:13 5612

[求助]求助:驱动一加载就立即自动Unload了,帮忙看看:

2009-3-28 10:13
5612
//驱动文件xx.c
#include <wdm.h>
#include <ntddk.h>

NTSTATUS DriverDispatch(IN PDEVICE_OBJECT DeviceObject,        IN PIRP Irp)
{
        Irp->IoStatus.Status = STATUS_SUCCESS;
        IoCompleteRequest (Irp,IO_NO_INCREMENT);
        return Irp->IoStatus.Status;
}

void DriverUnload(IN PDRIVER_OBJECT DriverObject)
{
        DbgPrint("DriverUnload!\n");
}

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
        DbgPrint("DriverEntry!\n");

        DriverObject->MajorFunction[IRP_MJ_CREATE] =
                DriverObject->MajorFunction[IRP_MJ_CLOSE] = DriverDispatch;
        DriverObject->DriverUnload = DriverUnload;

        return STATUS_SUCCESS;
}

//加载测试代码:
BOOL CSvcCtl::Install(const char *svrname, const char *path)
{
                BOOL ret=FALSE;
  HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);

  if(hSCManager)
  {
      HANDLE hService = CreateService(hSCManager, svrname,
                                svrname,
                                SERVICE_START | DELETE | SERVICE_STOP,
                                SERVICE_KERNEL_DRIVER,
                                SERVICE_DEMAND_START,
                                SERVICE_ERROR_NORMAL,
                                path,
                                NULL, NULL, NULL, NULL, NULL);
                        if (hService) {
                                ret = TRUE;
                                CloseServiceHandle(hService);
                        }
                        else if (GetLastError() == ERROR_SERVICE_EXISTS) {
                                ret = TRUE;
                        }
                        CloseServiceHandle(hSCManager);
        }
        return ret;
}

BOOL CSvcCtl::Start(const char *svrname)
{
        BOOL ret=FALSE;
  HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);

  if(hSCManager)
  {
                HANDLE hService = OpenService(hSCManager, svrname,
                        SERVICE_START | DELETE | SERVICE_STOP);       
                if (hService) {
                        ret = StartService(hService, 0, NULL);
                        if (!ret && GetLastError() == ERROR_SERVICE_ALREADY_RUNNING) {
                                ret = TRUE;
                        }
                        CloseServiceHandle(hService);
                }
       
                CloseServiceHandle(hSCManager);
        }
        return ret;
}

//调用:
CSvcCtl::Install("xem", "E:\\xem.sys");
CSvcCtl::Start("xem");
//xem是随便起的名字,也换过其它,但无效。
//返回失败。错误代码1058:无法启动服务,原因可能是已被禁用或与其相关联的设备没有启动。
//而且在dbgview看到一加载就立刻Unload了,请教这代码哪里有问题?

[培训]科锐软件逆向50期预科班报名即将截止,速来!!! 50期正式班报名火爆招生中!!!

收藏
免费 0
打赏
分享
最新回复 (5)
雪    币: 26
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
aliwy 2009-3-28 10:25
2
0
CreateService的第四个参数设置成 SERVICE_ALL_ACCESS 看看,
再加个“停止”、“删除”服务。
雪    币: 356
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
vical 2009-3-28 10:40
3
0
有的,如下:

BOOL CSvcCtl::Stop(const char *svrname)
{
        BOOL ret=FALSE;
    SERVICE_STATUS ss;
    HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
       
    if(hSCManager)
    {
                HANDLE hService = OpenService(hSCManager, svrname,
                        SERVICE_START | DELETE | SERVICE_STOP);       
                if (hService) {
                        ret = ControlService(hService, SERVICE_CONTROL_STOP, &ss);
                        CloseServiceHandle(hService);
                }
               
                CloseServiceHandle(hSCManager);
        }
        return ret;
}

BOOL CSvcCtl::Uninstall(const char *svrname)
{
        BOOL ret=FALSE;
    HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
       
    if(hSCManager)
    {
                HANDLE hService = OpenService(hSCManager, svrname,
                        SERVICE_START | DELETE | SERVICE_STOP);       
                if (hService) {
                        ret = DeleteService(hService);
                       
                        CloseServiceHandle(hService);
                }
                CloseServiceHandle(hSCManager);
        }
        return ret;
}
雪    币: 356
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
vical 2009-3-28 10:46
4
0
改成SERVICE_ALL_ACCESS 也不行,效果一样。无论是只改CreateService,或者把OpenService里的标志改了都一样。还是1058

哦,对了,我的sources文件是:
TARGETNAME=xem
TARGETTYPE=DRIVER
DRIVERTYPE=WDM
TARGETPATH=OBJ

INCLUDES=$(BASEDIR)\inc\ddk\wxp; \
        $(BASEDIR)\inc\ddk\wdm\wxp; \
       
TARGETLIBS=$(BASEDIR)\lib\wxp\i386\wdm.lib \
        $(BASEDIR)\lib\wxp\i386\ntoskrnl.lib \

SOURCES=kkkk.c \

但我复制的是objchk下的,即是check版本的xem.sys到E盘下的,这是否有问题呢?
另外有把连接到wxp下的LIB,改成连接到w2k下再编译驱动,效果也是一样的。
不好意思,第一次写驱动,小问题拖死了。
雪    币: 356
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
vical 2009-3-28 11:18
5
0
已经知道了,是sources里面的问题,把DRIVERTYPE=WDM
一句去掉再编译就可以了,但为什么这样却未清楚,谢谢你的回答!
雪    币: 608
活跃值: (91)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
Second 1 2009-5-26 07:32
6
0
虽然不知道为什么,但是WDM驱动需要包含的头文件和nt的是不同的
游客
登录 | 注册 方可回帖
返回