注册 | 登录 | 设为首页 | 加入收藏
您当前的位置:飞翔学院-IT中国 → 编程开发Delphi → 文章内容

用DELPHI 安装SYS驱动

作者:佚名 来源:本站整理 发布时间:2008-11-3 9:23:47

问题是这样的,用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;
}

如果驱动没有正常卸载,你可以用我的KmdKit4D里面的KmdManager把那个驱动停掉然后正常卸载,无需重新系统的。


  • 打印文档
  • 推荐好友
  • 返回顶部
  • 增大字体
  • 减少字体
关于本站 | 工作机会 | 合作网站 | 广告服务 | 市场合作| 联系我们 | 抽奖活动
版权所有: 武汉威俊科技有限公司 Copyright 2005-2007 www.ITCNW.COM All rights reserved