首页
社区
课程
招聘
各位大虾,编写驱动的问题
发表于: 2007-4-10 21:09 7041

各位大虾,编写驱动的问题

2007-4-10 21:09
7041
刚才编译了一下kmdkit里的那个beeper的例子
一时兴起改了一下代码,
结果扬声器响个不停。电脑也死机了
这倒是小事,麻烦的是当我想再次编译beeper那个例子,用kmdkit提供的加载程序加载生成的
beeper.sys时,提示说不能注册驱动。
为了找到错误号,用VC依样画葫芦写了个加载程序
-----------------------------------------------------------------------------------
#include "stdafx.h"
#include <windows.h>
#include <iostream.h>

int main(int argc, char* argv[])
{
        SC_HANDLE schSCManager;
    TCHAR szPath[MAX_PATH];
        TCHAR* szPath2;
        cout<<"请输入驱动路径"<<endl;
        cin>>szPath;
        SC_HANDLE schService;
        schSCManager = OpenSCManager(
    NULL,  
    NULL,                     
    SC_MANAGER_ALL_ACCESS);  
        if (NULL == schSCManager) {
                cout<<"打开OpenSCManager错误"<<endl;
        }else{
                cout<<"打开OpenSCManager成功"<<endl;
        }
    if( !GetFullPathName( szPath, sizeof(szPath),szPath,&szPath2) )
    {
        cout<<"打开驱动文件错误"<<GetLastError()<<endl;
        return FALSE;
    }else{
                cout<<"打开驱动文件"<<szPath<<endl;
        }

    schService = CreateService(
        schSCManager,              // SCManager database
        TEXT("Sample_Srv"),        // name of service
        "hello",                   // service name to display
        SERVICE_ALL_ACCESS,        // desired access
        SERVICE_WIN32_OWN_PROCESS, // service type
        SERVICE_DEMAND_START,      // start type
        SERVICE_ERROR_NORMAL,      // error control type
        szPath,                    // path to service's binary
        NULL,                      // no load ordering group
        NULL,                      // no tag identifier
        NULL,                      // no dependencies
        NULL,                      // LocalSystem account
        NULL);                     // no password

    if (schService == NULL)
    {
        cout<<"注册驱动错误"<<endl<<GetLastError()<<endl;
                cout<<ERROR_SERVICE_EXISTS<<endl;
        return FALSE;
    }
    else
    {
                StartService(schService,0,NULL);
                DeleteService(schService);
                CloseServiceHandle(schService);
        return TRUE;
    }
        CloseServiceHandle(schSCManager);
        return 0;
}
----------------------------------------------------------------------------------
错误号是找到了1073,查查MSDN对应的是ERROR_SERVICE_EXISTS
怎么办呢。
是服务没有卸载的缘故吗
各位大虾帮帮忙啊

ok,问题解决了一半,还是要靠自己来!!!
换了一台机子,用控制台下的程序,显示能够加载,但是不发出声音。
又写了一个win32的
--------------------------------------------------------------------------------
#include "stdafx.h"

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
        // TODO: Place code here.
        HANDLE hSCManager,hService;
        char addr[264];
        char* s;
        hSCManager=OpenSCManager(NULL,NULL,SC_MANAGER_CREATE_SERVICE);
        if(hSCManager==NULL){
                MessageBox(NULL,"open scm error","error",0);
        }else{
                GetFullPathName("beeper.sys",sizeof(addr),addr,&s);
                MessageBox(NULL,addr,"path",0);
                hService=CreateService(hSCManager,"beeper","Nice Melody Beeper",
                                SERVICE_START + DELETE, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START,
                                SERVICE_ERROR_IGNORE,addr, NULL, NULL, NULL, NULL, NULL);
                if(hService==NULL){
                        MessageBox(NULL,"CreateService error","error",0);
                }else{
                        if(StartService(hService,0,NULL)){
                                MessageBox(NULL,"StartService error","error",0);
                        }
                        DeleteService(hService);
                        CloseServiceHandle(hService);
                }
        }
        return 0;
}

-----------------------------------------------------------------------------------
都差不多,都是把人家原来的汇编例子改在VC里做,但是这个加载驱动后,beeper.sys能够正常运行,是扬声器发声,唉,暂时就到这里吧,其他的事慢慢思考。
另外SCM似乎有个数据库,所以不能加载相同的例子。

楼下的那位仁兄,不是你说的问题。只怪我随便乱打字,不说了

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

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
2
打开文件貌似用CreatFile吧?
2007-4-11 09:57
0
雪    币: 293
活跃值: (110)
能力值: ( LV9,RANK:410 )
在线值:
发帖
回帖
粉丝
3
一般运行一个驱动程序分为几个步骤
1,注册驱动
2,启动驱动服务
3,停止驱动服务
4,注销驱动

如果运行驱动过程中发生死机或意外重启 那么已经注册的驱动就没有被注销 这样开机后还是以刚才的服务名称注册的话就会出现已经注册的错误. 这个错误可以忽略 直接进行第二步启动驱动服务,正常的话就可以停止跟注销驱动了!不用重写程序 更不必换机
2007-4-12 09:04
0
雪    币: 135
活跃值: (226)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
4
楼上说的对,你关驱动时没有停止服务(ControlService,SERVICE_CONTROL_STOP),所以这个服务还存在,下在再CreateService时就ERROR_SERVICE_EXISTS错误了
我写的一段动态加载sys的代码,你可以看看

int loadsys(char*p)
{
        char syspath[MAX_PATH];
        char srvname[MAX_PATH];
        p=getword(p,syspath);
        p=getword(p,srvname);
        if(!*syspath)return 0;
        if(!*srvname)return 0;

        char path[MAX_PATH];
        GetCurrentDirectory(MAX_PATH,path);
        strcat(path,syspath);

        msgoutf("try load %s...\r\n",path);

        SC_HANDLE hSCManager;
        SC_HANDLE hService;

        hSCManager=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
        if(!hSCManager)return msgoutf("can't OpenSCManager[err=%d]\r\n",GetLastError());

        hService=CreateService(
                hSCManager,
                srvname,
                "helper sys load by injector",
                SERVICE_ALL_ACCESS,
                SERVICE_KERNEL_DRIVER,
                SERVICE_DEMAND_START,
                SERVICE_ERROR_NORMAL,
                path,
                NULL,NULL,NULL,NULL,NULL);

        if(!hService)return msgoutf("can't CreateService[err=%d]\r\n",GetLastError());

        ret=StartService(hService,0,NULL);
        if(!ret)msgoutf("can't StartService[err=%d]\r\n",GetLastError());

        CloseServiceHandle(hSCManager);
        CloseServiceHandle(hService);

        return 1;
}

int unloadsys(char*p)
{
        char srvname[MAX_PATH];
        p=getword(p,srvname);
        if(!*srvname)return 0;

        msgoutf("try stop service %s...\r\n",srvname);

        SC_HANDLE hSCManager;
        SC_HANDLE hService;

        hSCManager=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
        if(!hSCManager)return msgoutf("can't OpenSCManager[err=%d]\r\n",GetLastError());

        hService=OpenService(hSCManager,srvname,SERVICE_ALL_ACCESS);
        if(!hService)return msgoutf("can't OpenService[err=%d]\r\n",GetLastError());

        SERVICE_STATUS ss;
        ret=ControlService(hService,SERVICE_CONTROL_STOP,&ss);
        if(!ret)msgoutf("can't stop service, !ControlService[err=%d]\r\n",GetLastError());

        ret=DeleteService(hService);
        if(!ret)msgoutf(msg,"can't DeleteService[err=%d]\r\n",GetLastError());

        CloseServiceHandle(hService);
        CloseServiceHandle(hSCManager);
        return 1;
}
2007-4-12 13:49
0
雪    币: 231
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qdk
5
太妙了,直接启动服务然后注销掉它。本来我还想搜注册表然后删除一番,结果什么也没找到。
谢谢二位了。
这里能人真是多啊
2007-4-12 14:52
0
游客
登录 | 注册 方可回帖
返回
//