首页
社区
课程
招聘
[求助]用DELPHI和C安装SYS驱动,同样的代码为什么DELPHI的有问题而C的没问题?
发表于: 2008-9-1 20:02 7078

[求助]用DELPHI和C安装SYS驱动,同样的代码为什么DELPHI的有问题而C的没问题?

2008-9-1 20:02
7078
用DELPHI和C安装SYS驱动,同样的代码为什么DELPHI的有问题而C的没问题?

问题是这样的,用DELPHI安装SYS驱动,第一次成功,正常卸载驱动后,可以再安装SYS驱动。
安装完驱动后,如果未卸载驱动(如程序非正常关闭等),再安装时会提示安装出错(这时可以看到系统里已装有该驱动,所以出错),但是重新启动系统后仍然无法再安装驱动!!!这很奇怪!!不管怎么重启电脑都无效,重新安装系统后可以再安装,不过只要有一次安装完驱动后未卸载就只能再重新安装系统后才能再使用。这是怎么回事啊?
我试了用DELPHI里自带的CreateService和OpenService不行,用动态加载DLL的方式也不行。

同样的代码在C里面一点问题都没,可以正常使用,即使有问题重启系统就可以正常使用了。。真是太奇怪了!有什么办法能解决么?

DELPHI的代码:
function load_driver(): boolean;
var
  temp: dword;
begin
{
temp := LoadLibrary('advapi32.dll');
  if temp <> 0 then
  begin
    @CreateService1 := GetProcAddress(temp, 'CreateServiceA');
    @OpenService1 := GetProcAddress(temp, 'OpenServiceA');

  end;
}

  IOCTL_GET_PHYS_ADDRESS := CTL_CODE(FILE_DEVICE_UNKNOWN,
    $800, METHOD_BUFFERED,
    FILE_READ_ACCESS + FILE_WRITE_ACCESS);
  hSCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  if hSCManager <> 0 then
  begin
    GetFullPathName(PChar('VirtToPhys.sys'), SizeOf(acModulePath), acModulePath, lpTemp);
{    hService := CreateService1(hSCManager, 'VirtToPhys', 'VirtToPhys',
      SERVICE_START + SERVICE_STOP + _DELETE, SERVICE_KERNEL_DRIVER,
      SERVICE_DEMAND_START, SERVICE_ERROR_IGNORE, acModulePath,
      nil, nil, nil, nil, nil);
}
   hService := CreateService(hSCManager, 'VirtToPhys', 'VirtToPhys',
      SERVICE_START + SERVICE_STOP + _DELETE, SERVICE_KERNEL_DRIVER,
      SERVICE_DEMAND_START, SERVICE_ERROR_IGNORE, acModulePath,
      nil, nil, nil, nil, nil);

   if hService = 0 then
    begin
{
   OpenService1(hSCManager,'VirtToPhys',SERVICE_START + SERVICE_STOP + _DELETE);
}
   OpenService(hSCManager,'VirtToPhys',SERVICE_START + SERVICE_STOP + _DELETE);  //注:这句一点效果都没有。
    end;
    if hService <> 0 then
    begin
      {驱动程序的DriverEntry过程将被调用}
      if StartService(hService, 0, lpTemp) = true then
      begin
        {驱动程序将接收IRP_MJ_CREATE I/O请求包(IRP)}
        hDevice := CreateFile('\\.\slVirtToPhys', GENERIC_READ + GENERIC_WRITE,
          0, nil, OPEN_EXISTING, 0, 0);
        if hDevice = INVALID_HANDLE_VALUE then
        begin
          unload_driver();
          ShowMessage('打开设备出错');
          Exit;
        end;
      end
      else begin
        unload_driver();
        ShowMessage('运行驱动出错');
        Exit;
      end;
    end
    else begin
      unload_driver();
      ShowMessage('创建驱动出错');
      Exit;
    end;
  end;
end;
function unload_driver(): boolean;
begin
  try
    if hSCManager <> 0 then
    begin
      if hService <> 0 then
      begin
        if hDevice <> 0 then CloseHandle(hDevice);
        ControlService(hService, SERVICE_CONTROL_STOP, _ss);
        DeleteService(hService);
        CloseServiceHandle(hService);
      end;
      CloseServiceHandle(hSCManager);
    end;
  except
  end;
end;

C的代码:

#include <windows.h>
#include <stdio.h>

int main(int argc,char **argv)
{
  printf("Load Driver\n载入驱动\n");
  HANDLE scm=OpenSCManager(NULL,NULL,SC_MANAGER_CREATE_SERVICE);
  
  if(scm)
  {
    printf("Create Service\n创建服务\n");
    printf("argv[1]=%s,argv[2]%s\n",argv[1],argv[2]);

    HANDLE svc=CreateService(scm,argv[1],argv[2],SERVICE_START | DELETE | SERVICE_STOP,SERVICE_KERNEL_DRIVER,
                             SERVICE_DEMAND_START,SERVICE_ERROR_IGNORE,argv[3],NULL,NULL,NULL,NULL,NULL);

    if(!svc){
    svc=OpenService(scm,argv[1],SERVICE_START | DELETE | SERVICE_STOP);
    printf("Create Service\n创建服务1\n");

        }

    if(svc)
    {
      printf("Starting service\n运行驱动\n");

      StartService(svc,0,NULL);
   
          printf("Press Enter to stop and delete service \n按回车停止并卸载驱动!\n");
      getchar();

      DeleteService(svc);
      CloseServiceHandle(svc);
    } else printf("error: unable to create/open service\n错误:创建或打开服务(可能是驱动文件未找到)\n");

    CloseServiceHandle(scm);
  } else printf("error: unable to open manager\n");
  
  return 0;
}

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

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 1004
活跃值: (75)
能力值: ( LV9,RANK:570 )
在线值:
发帖
回帖
粉丝
2
如果驱动没有正常卸载,你可以用我的KmdKit4D里面的KmdManager把那个驱动停掉然后正常卸载,无需重新系统的。
2008-9-2 09:49
0
雪    币: 163
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢咯,搞定了

你的那几篇DLEPHI的驱动教程太精彩了,高人
2008-9-2 12:55
0
游客
登录 | 注册 方可回帖
返回
//